{"id":512,"date":"2020-12-26T20:31:36","date_gmt":"2020-12-26T20:31:36","guid":{"rendered":"https:\/\/work.claudiotereso.com\/?p=512"},"modified":"2020-12-28T16:30:23","modified_gmt":"2020-12-28T16:30:23","slug":"shelly-to-r","status":"publish","type":"post","link":"https:\/\/work.claudiotereso.com\/en\/shelly-to-r\/","title":{"rendered":"Experi\u00eancias em IoT: Da Shelly ao R"},"content":{"rendered":"<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 15pt; padding-bottom: 0; line-height: 1.64; font-weight: bold; color: #000000; font-size: 14pt; margin-left: -0.25pt; text-indent: -0.5pt;\"><span style=\"background-color: #ffffff;\">Os dispositivos <\/span><span style=\"background-color: #ffffff;\">para casas inteligentes da <\/span><span style=\"background-color: #ffffff;\"><em>Shelly<\/em><\/span> <span style=\"background-color: #ffffff;\">podem ser consultados de m\u00faltiplas maneiras<\/span><span style=\"background-color: #ffffff;\">, <\/span><span style=\"background-color: #ffffff;\">inclusive<\/span><span style=\"background-color: #ffffff;\"> atrav\u00e9s de uma API web que pode ser <\/span><span style=\"background-color: #ffffff;\">acedida<\/span><span style=\"background-color: #ffffff;\"> na Internet com qualquer sistema que efectue liga\u00e7\u00f5es HTTP\u00a0 com o m\u00e9todo<\/span><span style=\"background-color: #ffffff;\">\u00a0<\/span><span style=\"background-color: #ffffff;\">POST, como por exemplo a linguagem R.<\/span><\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">Decidi experimentar alguns dos dispositivos da <em>Shelly<\/em><sup>1<\/sup>, mais por piada do que propriamente por necessidade. Apareceram-me c\u00e1 em casa em plena pausa Natal\/Fim de ano. Como quando acabar a pausa tenho o trabalho final de Computa\u00e7\u00e3o Estat\u00edstica em R para fazer, decidi que era uma boa oportunidade para praticar.<\/p>\n<p style=\"text-align: justify; margin-top: 12pt; padding-top: 0; margin-bottom: 6pt; padding-bottom: 0; line-height: 1.63; font-weight: bold; color: #000000; font-size: 14pt; text-indent: 7.95pt;\">Instala\u00e7\u00e3o dos dispositivos<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">Para os primeiros testes mandei vir uma tomada inteligente<sup>2<\/sup> e um monitorizador ambiental de Temperatura e humidade<sup>3<\/sup>, 22.30\u20ac e 23.35\u20ac respectivamente na mauser<sup>4<\/sup>. A instala\u00e7\u00e3o \u00e9 bastante simples e est\u00e1 descrita nos manuais<sup>5,6<\/sup> que acompanham os produtos. O processo resume-se a instalar a aplica\u00e7\u00e3o <em>Shelly Cloud<\/em> num telem\u00f3vel <em>android<\/em> ou <em>iphone<\/em> e, depois de criar uma conta, detectar os dispositivos. Todo processo \u00e9 autom\u00e1tico e, se tudo correr bem, n\u00e3o precisa de grande interven\u00e7\u00e3o.<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">Para podermos aceder aos dispositivos fora de casa, atrav\u00e9s do site <em>Shelly Cloud<\/em>, temos de aceitar a op\u00e7\u00e3o \u201c<em>connect to cloud<\/em>\u201d sem a qual o dispositivo s\u00f3 pode ser acedido quando estamos conectados \u00e0 mesma rede <em>wi-fi<\/em> que ele.<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">Ap\u00f3s a instala\u00e7\u00e3o abrimos <a href=\"https:\/\/my.shelly.cloud\/\" target=\"_blank\" rel=\"noopener\">https:\/\/my.shelly.cloud\/<\/a> no <em>browser<\/em> do computador para podermos configurar a API que nos vai permitir ler o estado dos dispositivos no R. Se tudo estiver bem configurado j\u00e1 vemos os dispositivos no <em>site<\/em> (Figura 1).<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 8pt; padding-bottom: 0; line-height: 1.3; color: #000000; font-size: 10pt;\"><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/p>\n<p style=\"text-align: center; margin-top: 0pt; padding-top: 0; margin-bottom: 8pt; padding-bottom: 0; line-height: 1.3; color: #000000; font-size: 10pt;\"><img loading=\"lazy\" decoding=\"async\" width=\"264\" height=\"279\" class=\"wp-image-513 size-full\" src=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image1-264w279h.png\" \/><\/p>\n<p style=\"text-align: center; margin-top: 0pt; padding-top: 0; margin-bottom: 10pt; padding-bottom: 0; line-height: 1.2; font-style: italic; color: #44546a; font-size: 9pt; text-indent: 7.95pt;\">Figura 1<a id=\"_Ref59814332\"><\/a>: My Shelly Cloud com os dispositivos configurdas e fotografia da sala<a id=\"_Ref59814326\"><\/a><\/p>\n<p style=\"text-align: justify; margin-top: 12pt; padding-top: 0; margin-bottom: 6pt; padding-bottom: 0; line-height: 1.63; font-weight: bold; color: #000000; font-size: 14pt; text-indent: 7.95pt;\">Dados para acesso \u00e0 API<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">A API n\u00e3o precisa de ser activada nem configurada. A partir do momento que aceitamos que o nosso dispositivo se conecte \u00e0 <em>shelly cloud<\/em> o sistema fica funcional, s\u00f3 precisamos de o usar.<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">Para aceder aos dados precisamos de 3 pe\u00e7as de informa\u00e7\u00e3o:<\/p>\n<div class=\"ul\" style=\"margin: 0;\">\n<div class=\"li\" style=\"margin: 0;\">\n<div style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt 35.15pt;\"><span style=\"display: inline-block; position: relative; text-indent: -18pt;\"><span style=\"position: absolute; top: -0.34em; left: 0; font-size: 2em;\">\u2022<\/span>\u00a0<\/span>O servidor a consultar<\/div>\n<\/div>\n<div class=\"li\" style=\"margin: 0;\">\n<div style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt 35.15pt;\"><span style=\"display: inline-block; position: relative; text-indent: -18pt;\"><span style=\"position: absolute; top: -0.34em; left: 0; font-size: 2em;\">\u2022<\/span>\u00a0<\/span>O c\u00f3digo de autoriza\u00e7\u00e3o para aceder aos dispositivos da nossa conta<\/div>\n<\/div>\n<div class=\"li\" style=\"margin: 0;\">\n<div style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt 35.15pt;\"><span style=\"display: inline-block; position: relative; text-indent: -18pt;\"><span style=\"position: absolute; top: -0.34em; left: 0; font-size: 2em;\">\u2022<\/span>\u00a0<\/span>O <em>id<\/em> do dispositivo<\/div>\n<\/div>\n<\/div>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\">Os dois primeiros s\u00e3o consultados no <em>user settings <\/em>(Figura 2).<\/p>\n<p>\u00a0<\/p>\n<p style=\"text-align: center; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.63; color: #000000; font-size: 10pt; text-indent: 7.95pt;\"><img loading=\"lazy\" decoding=\"async\" width=\"403\" height=\"227\" class=\"wp-image-514 size-full\" src=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image2-403w227h.png\" srcset=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image2-403w227h.png 403w, https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image2-403w227h-300x169.png 300w\" sizes=\"auto, (max-width: 403px) 100vw, 403px\" \/><\/p>\n<p style=\"text-align: center; margin-top: 0pt; padding-top: 0; margin-bottom: 10pt; padding-bottom: 0; line-height: 1.2; font-style: italic; color: #44546a; font-size: 9pt; text-indent: 7.95pt;\">Figura 2<a id=\"_Ref59815802\"><\/a>: P\u00e1gina principal do MY Shelly Cloud<\/p>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\">Dentro do <em>User Settings<\/em>, na op\u00e7\u00e3o <em>Security \\ Autorization Cloud Key<\/em> temos um bot\u00e3o <em>Get Key<\/em> que d\u00e1 acesso \u00e0 informa\u00e7\u00e3o que precisamos:<\/p>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\"><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/p>\n<p style=\"text-align: center; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.63; color: #000000; font-size: 10pt; text-indent: 7.95pt;\"><img loading=\"lazy\" decoding=\"async\" width=\"481\" height=\"259\" class=\"wp-image-515 size-full\" src=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image3-481w259h.png\" srcset=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image3-481w259h.png 481w, https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image3-481w259h-300x162.png 300w\" sizes=\"auto, (max-width: 481px) 100vw, 481px\" \/><\/p>\n<p style=\"text-align: center; margin-top: 0pt; padding-top: 0; margin-bottom: 10pt; padding-bottom: 0; line-height: 1.2; font-style: italic; color: #44546a; font-size: 9pt; text-indent: 7.95pt;\">Figura 3<a id=\"_Ref59817325\"><\/a>: Obter servidor e c\u00f3digo de acesso para API<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">O <em>id<\/em> do dispositivo \u00e9 obtido na p\u00e1gina de configura\u00e7\u00e3o respectiva, que se acede clicando no \u00edcone do dispositivo apresentado na p\u00e1gina da sala (Figura 1).<\/p>\n<p style=\"padding-top: 0px; padding-bottom: 0px; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt; text-align: center;\">A partir da p\u00e1gina do dispositivo, clicamos em <em>Settings<\/em> e no fim da p\u00e1gina abrimos o separador <em>Device Information<\/em> (Figura 4). O <em>Device ID<\/em> aparece em hexadecimal e em decimal. Queremos o valor hexadecimal.<\/p>\n<p style=\"text-align: center; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.63; color: #000000; font-size: 10pt; text-indent: 7.95pt;\"><img loading=\"lazy\" decoding=\"async\" width=\"457\" height=\"603\" class=\"wp-image-516 size-full\" src=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image4-457w603h.png\" srcset=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image4-457w603h.png 457w, https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image4-457w603h-227x300.png 227w\" sizes=\"auto, (max-width: 457px) 100vw, 457px\" \/><\/p>\n<p style=\"text-align: center; margin-top: 0pt; padding-top: 0; margin-bottom: 10pt; padding-bottom: 0; line-height: 1.2; font-style: italic; color: #44546a; font-size: 9pt; text-indent: 7.95pt;\">Figura 4<a id=\"_Ref59817395\"><\/a>:Configura\u00e7\u00e3o do dispositivo<\/p>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.63; color: #000000; font-size: 10pt; text-indent: 7.95pt;\"><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">Resumindo os dados necess\u00e1rios para a consulta:<\/p>\n<table class=\" aligncenter\" style=\"width: 58.3498%;\">\n<tbody>\n<tr>\n<td style=\"width: 10.1401%; vertical-align: top;\">\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\"><strong>Link<\/strong><\/p>\n<\/td>\n<td style=\"width: 48.8165%; vertical-align: top;\">\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\">https:\/\/[servidor indicado na conta]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 10.1401%; vertical-align: top;\">\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\"><strong>Auth_key<\/strong><\/p>\n<\/td>\n<td style=\"width: 48.8165%; vertical-align: top;\">\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\">[chave de autentica\u00e7\u00e3o da conta]<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 10.1401%; vertical-align: top;\">\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\"><strong>Id<\/strong><\/p>\n<\/td>\n<td style=\"width: 48.8165%; vertical-align: top;\">\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\">[id do dispositivo]<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"margin-top: 0pt; padding-top: 0px; margin-bottom: 10pt; padding-bottom: 0px; line-height: 1.2; font-style: italic; color: #44546a; font-size: 9pt; text-indent: 7.95pt; text-align: center;\">Tabela 1: Dados para consulta<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\"><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/p>\n<p style=\"text-align: justify; margin-top: 12pt; padding-top: 0; margin-bottom: 6pt; padding-bottom: 0; line-height: 1.63; font-weight: bold; color: #000000; font-size: 14pt; text-indent: 7.95pt;\">Aceder \u00e0 API<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">Para aceder \u00e0 API al\u00e9m dos dados que j\u00e1 temos precisamos de indicar qual a opera\u00e7\u00e3o a realizar. Podemos ler informa\u00e7\u00e3o, mas tamb\u00e9m podemos alterar a configura\u00e7\u00e3o dos dispositivos. No nosso caso, s\u00f3 queremos ler o estado e nesse caso usamos o comando <em>device\/status<\/em>. Para uma lista de todas as op\u00e7\u00f5es dispon\u00edveis podem ler a documenta\u00e7\u00e3o dispon\u00edvel<sup>7,8<\/sup> no <em>site<\/em> da <em>Shelly<\/em> onde podemos consultar, entre outras informa\u00e7\u00f5es, a informa\u00e7\u00e3o que a API no fornece:<\/p>\n<p style=\"margin-top: 6pt; padding-top: 0px; margin-bottom: 0pt; padding-bottom: 0px; line-height: 1.63; color: #000000; font-size: 10pt; text-indent: 7.95pt;\"><img loading=\"lazy\" decoding=\"async\" width=\"643\" height=\"282\" class=\"wp-image-517 size-full aligncenter\" src=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image5-643w282h.png\" srcset=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image5-643w282h.png 643w, https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image5-643w282h-300x132.png 300w\" sizes=\"auto, (max-width: 643px) 100vw, 643px\" \/><\/p>\n<p style=\"text-align: center; margin-top: 0pt; padding-top: 0; margin-bottom: 10pt; padding-bottom: 0; line-height: 1.2; font-style: italic; color: #44546a; font-size: 9pt; text-indent: 7.95pt;\">Figura 5: Atributos devolvidos pela API<\/p>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\">Para o nosso caso, interessa-nos o consumo actual (<em>power<\/em>), o <em>total<\/em> (di\u00e1rio) e a hora da consulta (<em>timestamp<\/em>).<\/p>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\">Neste momento, temos tudo o que precisamos. O que queremos obter e como l\u00e1 chegar. Podemos agora ler o estado do dispositivo em R, mas antes vamos experimentar a configura\u00e7\u00e3o usando uma ferramenta mais visual onde ser\u00e1 mais f\u00e1cil detectar poss\u00edveis erros. Usamos o <em>site<\/em> <a href=\"https:\/\/reqbin.com\/\" target=\"_blank\" rel=\"noopener\">https:\/\/reqbin.com\/<\/a>. Introduzimos os dados que temos, n\u00e3o esquecendo que o m\u00e9todo a usar \u00e9 o POST, e verificamos os resultados:<\/p>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\"><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/p>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.63; color: #000000; font-size: 10pt; text-indent: 7.95pt;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-528 size-full\" src=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/shelly2reqbin.png\" alt=\"\" width=\"1791\" height=\"302\" srcset=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/shelly2reqbin.png 1791w, https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/shelly2reqbin-300x51.png 300w, https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/shelly2reqbin-1024x173.png 1024w, https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/shelly2reqbin-768x130.png 768w, https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/shelly2reqbin-1536x259.png 1536w\" sizes=\"auto, (max-width: 1791px) 100vw, 1791px\" \/><\/p>\n<p style=\"text-align: center; margin-top: 0pt; padding-top: 0; margin-bottom: 10pt; padding-bottom: 0; line-height: 1.2; font-style: italic; color: #44546a; font-size: 9pt; text-indent: 7.95pt;\">Figura 6: Chamada \u00e0 API do Shelly no site Reqbin<\/p>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\">Ap\u00f3s um pedido efectuado com sucesso podemos consultar o resultado para confirmar que obtemos os dados indicados na documenta\u00e7\u00e3o:<\/p>\n<p style=\"text-align: center; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.63; color: #000000; font-size: 10pt; text-indent: 7.95pt;\"><img loading=\"lazy\" decoding=\"async\" width=\"459\" height=\"349\" class=\"wp-image-519 size-full\" src=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image7-459w349h.png\" srcset=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image7-459w349h.png 459w, https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image7-459w349h-300x228.png 300w\" sizes=\"auto, (max-width: 459px) 100vw, 459px\" \/><\/p>\n<p style=\"text-align: center; margin-top: 0pt; padding-top: 0; margin-bottom: 10pt; padding-bottom: 0; line-height: 1.2; font-style: italic; color: #44546a; font-size: 9pt; text-indent: 7.95pt;\">Figura 7: Dados obtidos conforme Reqbin<\/p>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\">Confirma-se que obtemos o <em>power<\/em>, o <em>timestamp<\/em> e o <em>total<\/em>. Para garantir que estamos a ver a informa\u00e7\u00e3o certa , \u00e9 uma boa ideia confirmar os valores obtidos pela API com os valores que o portal indica para o dispositivo, n\u00e3o esquecendo, que como diz a API, o total \u00e9 em <em>Watts<\/em>\/minuto e o site est\u00e1 em <em>KWatts<\/em>\/hora.<\/p>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\">Tamb\u00e9m podemos ver que existe um campo <em>_updated<\/em> que n\u00e3o est\u00e1 documentado e que tamb\u00e9m tem a data de leitura dos dados.<\/p>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\">Tudo confirmado e a funcionar, avancemos para o R.<\/p>\n<p style=\"margin-top: 12pt; padding-top: 0px; margin-bottom: 6pt; padding-bottom: 0px; line-height: 1.63; font-weight: bold; color: #000000; font-size: 14pt; text-indent: 7.95pt; text-align: left;\">Da Shelly para o R<\/p>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\">A magia para colocar o R a ler o dispositivo est\u00e1 na biblioteca <em>httr<\/em><sup>9<\/sup> e na sua fun\u00e7\u00e3o POST. J\u00e1 vimos o que precisamos fazer, agora s\u00f3 precisamos traduzir para R, e dificilmente poderia ser mais simples:<\/p>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin-right: -0.85pt;\"><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">library(httr)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\"># Carregar vari\u00e1veis<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">shellyurl &lt;- &#8220;https:\/\/shelly-21-eu.shelly.cloud\/device\/status&#8221;<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">shellybody &lt;- list(auth_key=&#8221;NGE4ZDB1*****C43AD1E18C876&#8243;,id=&#8221;9****8&#8243;)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\"># Executar Pedido<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">shelly &lt;- POST(shellyurl,body = shellybody,encode = &#8220;multipart&#8221;)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\"># Consultar dados obtidos<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">content(shelly)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0px; margin-bottom: 10pt; padding-bottom: 0px; line-height: 1.2; font-style: italic; color: #44546a; font-size: 9pt; text-indent: 7.95pt; text-align: center;\">Listagem 1:Post \u00e0 API do Shelly<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">O c\u00f3digo \u00e9 simples e n\u00e3o me parece que seja necess\u00e1ria qualquer explica\u00e7\u00e3o adicional, mas o mesmo n\u00e3o se pode dizer dos dados obtidos. O que obtemos com o <em>content(shelly)<\/em> \u00e9, como seria de esperar e como vimos anteriormente, um sem fim de informa\u00e7\u00e3o. No entanto n\u00f3s sabemos o que queremos e s\u00f3 precisamos de procurar por esses campos no resultado:<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\"><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">$data$device_status$`_updated`<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">[1] &#8220;2020-12-25 20:43:59&#8221;<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">$data$device_status$meters[[1]]$power<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">[1] 82.74<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">$data$device_status$meters[[1]]$total<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">[1] 11163<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 8pt; padding-bottom: 0; line-height: 1.3; color: #000000; font-size: 10pt;\"><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">Para obtermos os valores individualmente, s\u00f3 precisamos de concatenar as duas partes, por exemplo, para obter o consumo actual, consultamos:<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\"><em>content(shelly)$data$device_status$meters[[1]]$power<\/em><\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">Esta informa\u00e7\u00e3o j\u00e1 \u00e9 suficiente para fazer um pequeno programa: vamos ler durante uma hora, minuto a minutos os dados do nosso <em>PlugS<\/em>:<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 8pt; padding-bottom: 0; line-height: 1.3; color: #000000; font-size: 10pt;\"><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">library(httr)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\"># Carregar vari\u00e1veis<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">shellyurl &lt;- &#8220;https:\/\/shelly-21-eu.shelly.cloud\/device\/status&#8221;<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">shellybody &lt;- list(auth_key=&#8221;NGE4ZDB1*****C43AD1E18C876&#8243;,id=&#8221;9****8&#8243;)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\"># Executar Pedido<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">shelly &lt;- POST(shellyurl,body = shellybody,encode = &#8220;multipart&#8221;)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\"># Consultar dados obtidos<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">content(shelly)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">#inicializa\u00e7\u00e3o de vectores a conter as leituras<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">datahora &lt;- c()<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">consumos &lt;- c()<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">total &lt;- c()<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">while (length(datahora) &lt; 60)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">{<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">\u2003\u2003# faz pedido \u00e0 API<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">\u2003\u2003shelly &lt;- POST(shellyurl,body = shellybody,encode = &#8220;multipart&#8221;)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">\u2003\u2003# guarda dados lidos para vector<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">\u2003\u2003datahora &lt;- c(datahora,content(shelly)$data$device_status$`_updated`)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">\u2003\u2003consumos &lt;- c(consumos,content(shelly)$data$device_status$meters[[1]]$power )<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">\u2003\u2003total &lt;- c(total,content(shelly)$data$device_status$meters[[1]]$total )<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">\u2003\u2003# pausa 1 minuto<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">\u2003\u2003Sys.sleep(60)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">}<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\"><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\"># visualizar resultados<br \/>par(mfrow=c(1,2))<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">plot(total,xaxt=&#8221;n&#8221;,xlab=&#8221;hora&#8221;)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">axis(1, at=1:60,labels=datahora)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">plot(consumos,xaxt=&#8221;n&#8221;,xlab=&#8221;hora&#8221;)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">axis(1, at=1:60,labels=datahora)<\/p>\n<p style=\"text-align: center; margin-top: 0pt; padding-top: 0; margin-bottom: 10pt; padding-bottom: 0; line-height: 1.2; font-style: italic; color: #44546a; font-size: 9pt; text-indent: 7.95pt;\">Listagem 2: Ler uma hora de consumos<\/p>\n<p style=\"text-align: center; margin-top: 0pt; padding-top: 0; margin-bottom: 8pt; padding-bottom: 0; line-height: 1.3; color: #000000; font-size: 10pt;\"><img loading=\"lazy\" decoding=\"async\" width=\"479\" height=\"239\" class=\"wp-image-520 size-full\" src=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image8-479w239h.png\" srcset=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image8-479w239h.png 479w, https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image8-479w239h-300x150.png 300w\" sizes=\"auto, (max-width: 479px) 100vw, 479px\" \/><\/p>\n<p style=\"text-align: center; margin-top: 0pt; padding-top: 0; margin-bottom: 10pt; padding-bottom: 0; line-height: 1.2; font-style: italic; color: #44546a; font-size: 9pt; text-indent: 7.95pt;\">Gr\u00e1fico 1: Resultados de 1 hora de consumos<\/p>\n<p style=\"text-align: justify; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.63; color: #000000; font-size: 10pt; text-indent: 7.95pt;\"><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">Ler dados de outro tipo de dispositivo passa por um processo id\u00eantico. \u00c9 s\u00f3 obter o <em>id<\/em> do dispositivo e consultar a documenta\u00e7\u00e3o para perceber o que a API disponibiliza. Por exemplo, o c\u00f3digo seguinte l\u00ea a temperatura e humidade do sensor respectivo:<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\"><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">library(httr)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\"># Carregar vari\u00e1veis<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">shellyurl &lt;- &#8220;https:\/\/shelly-21-eu.shelly.cloud\/device\/status&#8221;<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">shellybody &lt;- list(auth_key=&#8221;NGE4ZDB1*****C43AD1E18C876&#8243;,id=&#8221;A****3&#8243;)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\"># Executar Pedido<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">shelly &lt;- POST(shellyurl,body = shellybody,encode = &#8220;multipart&#8221;)<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\"># Consultar informa\u00e7\u00e3o<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">content(shelly)$data$device_status$`_updated`<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">content(shelly)$data$device_status$tmp$tC<\/p>\n<p style=\"margin-top: 0pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.2; color: #4472c4; font-size: 10pt;\">content(shelly)$data$device_status$hum$value<\/p>\n<p style=\"text-align: center; margin-top: 0pt; padding-top: 0; margin-bottom: 10pt; padding-bottom: 0; line-height: 1.2; font-style: italic; color: #44546a; font-size: 9pt; text-indent: 7.95pt;\">Listagem 3: C\u00f3digo para ler temperatura e humidade<\/p>\n<p style=\"text-align: justify; margin-top: 12pt; padding-top: 0; margin-bottom: 6pt; padding-bottom: 0; line-height: 1.63; font-weight: bold; color: #000000; font-size: 14pt; text-indent: 7.95pt;\">R e mais al\u00e9m<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">Esta abordagem de ligar \u00e0 API a partir do R serve para testes e para situa\u00e7\u00f5es pontuais mas para projectos reais o ideal \u00e9 carregar os dados para uma base de dados \u00e0 qual vamos aceder com o R.<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">Esse carregamento pode ser efectuado por uma aplica\u00e7\u00e3o criada em qualquer linguagem moderna ou at\u00e9 em servi\u00e7os que dispensam conhecimentos de programa\u00e7\u00e3o, como por exemplo o <em>Logic Apps<\/em><sup>10<\/sup><em>,<\/em> um dos in\u00fameros servi\u00e7os do <em>Azure<\/em><sup>11<\/sup>. Na Figura 8 est\u00e1 o fluxograma constru\u00eddo para ler a temperatura e humidade do sensor e enviar essa informa\u00e7\u00e3o por e-mail. O programa \u00e9 executado com a periocidade indicada na tarefa <em>Recurrence<\/em>.<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">Supostamente, \u00e9 ainda poss\u00edvel ignorar a <em>shelly cloud<\/em> e colocar os dispositivos a enviarem informa\u00e7\u00e3o directamente para um servi\u00e7o <em>web<\/em> que configuremos para receber a informa\u00e7\u00e3o. E digo supostamente, porque ainda n\u00e3o testei essa potencialidade.<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">Como vemos, temos v\u00e1rias alternativas de aceder \u00e0 informa\u00e7\u00e3o dos dispositivos, s\u00f3 precisamos de ver a melhor para as nossas necessidades e limita\u00e7\u00f5es.<\/p>\n<p style=\"text-align: center; margin-top: 6pt; padding-top: 0; margin-bottom: 0pt; padding-bottom: 0; line-height: 1.63; color: #000000; font-size: 10pt; text-indent: 7.95pt;\"><img loading=\"lazy\" decoding=\"async\" width=\"317\" height=\"340\" class=\"wp-image-521 size-full\" src=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image9-317w340h.png\" srcset=\"https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image9-317w340h.png 317w, https:\/\/work.claudiotereso.com\/wp-content\/uploads\/2020\/12\/image9-317w340h-280x300.png 280w\" sizes=\"auto, (max-width: 317px) 100vw, 317px\" \/><\/p>\n<p style=\"text-align: center; margin-top: 0pt; padding-top: 0; margin-bottom: 10pt; padding-bottom: 0; line-height: 1.2; font-style: italic; color: #44546a; font-size: 9pt; text-indent: 7.95pt;\">Figura 8<a id=\"_Ref59901469\"><\/a>: Logic Apps para ler Shelly API<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\"><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/p>\n<p style=\"text-align: justify; margin-top: 12pt; padding-top: 0; margin-bottom: 6pt; padding-bottom: 0; line-height: 1.63; font-weight: bold; color: #000000; font-size: 14pt; text-indent: 7.95pt;\">Conclus\u00e3o<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\">A API da <em>Shelly<\/em> \u00e9 de f\u00e1cil configura\u00e7\u00e3o e com acesso completo a toda a informa\u00e7\u00e3o e configura\u00e7\u00e3o dos dispositivos. Por outro lado, a biblioteca <em>httr<\/em> \u00e9 de simples utiliza\u00e7\u00e3o. Deu algum trabalho a encontrar e encaixar todas as pe\u00e7as, mas ap\u00f3s esse esfor\u00e7o inicial o processo \u00e9 simples.<\/p>\n<p style=\"text-align: justify; padding-top: 0; padding-bottom: 0; line-height: 2; color: #000000; font-size: 14pt; margin: 6pt -0.85pt 0pt -0.85pt;\"><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/p>\n<pre><span style=\"font-size: 14pt;\">1.<\/span><span style=\"font-size: 14pt;\">\u2003\u2003Home | Shelly Cloud. <br \/><\/span><span style=\"font-size: 14pt;\">https:\/\/shelly.cloud\/.<\/span><br \/><br \/><span style=\"font-size: 14pt;\">2.<\/span><span style=\"font-size: 14pt;\">\u2003\u2003Shelly Plug S | Shelly Cloud. <br \/>https:\/\/shelly.cloud\/products\/shelly-plug-s-smart-home-automation-device\/.<\/span><br \/><br \/><span style=\"font-size: 14pt;\">3.<\/span><span style=\"font-size: 14pt;\">\u2003\u2003Shelly H&amp;T | Shelly Cloud. <br \/>https:\/\/shelly.cloud\/products\/shelly-humidity-temperature-smart-home-automation-sensor\/.<\/span><br \/><br \/><span style=\"font-size: 14pt;\">4.<\/span><span style=\"font-size: 14pt;\">\u2003\u2003Robert Mauser Lda. <br \/>https:\/\/mauser.pt\/.<\/span><br \/><br \/><span style=\"font-size: 14pt;\">5.<\/span><span style=\"font-size: 14pt;\">\u2003\u2003Shelly PLUGS user guide. <br \/>https:\/\/shelly.cloud\/documents\/user_guide\/shelly_plug_s.pdf.<\/span><br \/><br \/><span style=\"font-size: 14pt;\">6.<\/span><span style=\"font-size: 14pt;\">\u2003\u2003Shelly Humidity and Temperature Sensor H&amp;T user guide. <br \/>https:\/\/shelly.cloud\/documents\/user_guide\/shelly_ht.pdf.<\/span><br \/><br \/><span style=\"font-size: 14pt;\">7.<\/span><span style=\"font-size: 14pt;\">\u2003\u2003Shelly cloud API access. <br \/>https:\/\/shelly.cloud\/documents\/developers\/shelly_cloud_api_access.pdf.<\/span><br \/><br \/><span style=\"font-size: 14pt;\">8.<\/span><span style=\"font-size: 14pt;\">\u2003\u2003Shelly Family Overview \u2013 API Reference. <br \/>https:\/\/shelly-api-docs.shelly.cloud\/.<\/span><br \/><br \/><span style=\"font-size: 14pt;\">9.<\/span><span style=\"font-size: 14pt;\">\u2003\u2003httr package | R Documentation. <br \/>https:\/\/www.rdocumentation.org\/packages\/httr\/versions\/1.4.2.<\/span><br \/><br \/><span style=\"font-size: 14pt;\">10.<\/span><span style=\"font-size: 14pt;\">\u2003\u2003Servi\u00e7o de Aplica\u00e7\u00f5es L\u00f3gicas | Microsoft Azure. <br \/>https:\/\/azure.microsoft.com\/pt-pt\/services\/logic-apps\/.<\/span><br \/><br \/><span style=\"font-size: 14pt;\">11.<\/span><span style=\"font-size: 14pt;\">\u2003\u2003Servi\u00e7os de Computa\u00e7\u00e3o na Cloud | Microsoft Azure. <br \/>https:\/\/azure.microsoft.com\/pt-pt\/.<\/span><br \/><br \/><span style=\"display: inline-block; height: 1em;\"><span style=\"display: none;\">.<\/span><\/span><\/pre>\n\n\n\n<!--themify_builder_content-->\n<div id=\"themify_builder_content-512\" data-postid=\"512\" class=\"themify_builder_content themify_builder_content-512 themify_builder tf_clear\">\n    <\/div>\n<!--\/themify_builder_content-->\n","protected":false},"excerpt":{"rendered":"<p>Os dispositivos para casas inteligentes da Shelly podem ser consultados de m\u00faltiplas maneiras, inclusive atrav\u00e9s de uma API web que pode ser acedida na Internet com qualquer sistema que aceda a pedidos POST, como por exemplo a linguagem R.<\/p>","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[36,14,37],"tags":[39,38,40],"class_list":["post-512","post","type-post","status-publish","format-standard","hentry","category-iot","category-programming","category-r","tag-iot","tag-r","tag-shelly","has-post-title","has-post-date","has-post-category","has-post-tag","has-post-comment","has-post-author",""],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/work.claudiotereso.com\/en\/wp-json\/wp\/v2\/posts\/512","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/work.claudiotereso.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/work.claudiotereso.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/work.claudiotereso.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/work.claudiotereso.com\/en\/wp-json\/wp\/v2\/comments?post=512"}],"version-history":[{"count":22,"href":"https:\/\/work.claudiotereso.com\/en\/wp-json\/wp\/v2\/posts\/512\/revisions"}],"predecessor-version":[{"id":555,"href":"https:\/\/work.claudiotereso.com\/en\/wp-json\/wp\/v2\/posts\/512\/revisions\/555"}],"wp:attachment":[{"href":"https:\/\/work.claudiotereso.com\/en\/wp-json\/wp\/v2\/media?parent=512"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/work.claudiotereso.com\/en\/wp-json\/wp\/v2\/categories?post=512"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/work.claudiotereso.com\/en\/wp-json\/wp\/v2\/tags?post=512"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}