{"id":496,"date":"2018-10-28T18:55:37","date_gmt":"2018-10-28T21:55:37","guid":{"rendered":"https:\/\/gabrieloliveira.eti.br\/blog\/?p=496"},"modified":"2022-06-28T10:40:34","modified_gmt":"2022-06-28T13:40:34","slug":"integrando-a-luz-inteligente-com-o-homekit","status":"publish","type":"post","link":"https:\/\/gabrieloliveira.eti.br\/blog\/integrando-a-luz-inteligente-com-o-homekit\/","title":{"rendered":"Smart Home &#8211; Integrando a luz inteligente com o HomeKit"},"content":{"rendered":"\n<p>Este post \u00e9 a parte 2 sobre o sistema de luzes de ambiente inteligente. Voc\u00ea pode encontrar a parte 1 <a href=\"https:\/\/gabrieloliveira.eti.br\/blog\/luz-de-ambiente-inteligente-parte-1\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"aqui (abre numa nova aba)\">aqui<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">HomeKit &#8211; uma possibilidade?<\/h3>\n\n\n\n<p>Enquanto fazia a pesquisa para instalar minha luz de ambiente inteligente, me deparei com <a rel=\"noreferrer noopener\" aria-label=\"este post (abre numa nova aba)\" href=\"https:\/\/forum.securifi.com\/index.php?topic=4242.0\" target=\"_blank\">este post<\/a> no f\u00f3rum oficial do meu roteador (<em>Securifi Almond+ 2015<\/em>) falando sobre a exist\u00eancia de um sistema chamado <a rel=\"noreferrer noopener\" aria-label=\"Homebridge (abre numa nova aba)\" href=\"https:\/\/github.com\/nfarina\/homebridge\" target=\"_blank\">Homebridge<\/a>, que chamou imediatamente minha aten\u00e7\u00e3o. Se trata de um servidor baseado em NodeJS que simula a API do HomeKit, expondo qualquer tipo de dispositivo que possa ser acessado a partir de um servidor. Como eu disse no <a rel=\"noreferrer noopener\" aria-label=\"primeiro (abre numa nova aba)\" href=\"https:\/\/gabrieloliveira.eti.br\/blog\/luz-de-ambiente-inteligente-parte-1\/\" target=\"_blank\">primeiro<\/a> post, o Almond+ exp\u00f5e uma API de <em>websockets<\/em> que permite controlar os dispositivos conectados \u00e0 ele. O Homebridge pode implementar os <em>websockets<\/em> e fazer as chamadas \u00e0 API do Almond facilmente, efetivamente tornando qualquer dispositivo que o Almond v\u00ea integrado ao HomeKit. Eu &#8220;apenas&#8221; teria que instalar o homebridge em algum lugar e codificar, do zero, um plugin em uma linguagem que eu n\u00e3o conhecia t\u00e3o bem assim (<em>Javascript<\/em>\/<em>NodeJS<\/em>). <\/p>\n\n\n\n<!--more-->\n\n\n\n<h3 class=\"wp-block-heading\">Alguns detalhes t\u00e9cnicos<\/h3>\n\n\n\n<p>Como o Homebridge precisaria estar rodando 100% do tempo para ser efetivo, n\u00e3o poderia ficar rodando no meu computador. Pensei em alguma forma de instal\u00e1-lo no pr\u00f3prio Almond, mas o pobre coitado n\u00e3o tem espa\u00e7o nem poder de fogo para segurar o Homebridge. Com a ascens\u00e3o <a rel=\"noreferrer noopener\" aria-label=\"do meu NAS (abre numa nova aba)\" href=\"https:\/\/gabrieloliveira.eti.br\/blog\/servidor-de-arquivos-empresarial-em-casa\/\" target=\"_blank\">do meu NAS<\/a>, no entanto, tudo ficou mais f\u00e1cil. Era s\u00f3 criar uma Jail (se o homebridge suportar FreeBSD) ou uma VM Linux (caso n\u00e3o suporte) e tudo estaria resolvido.<\/p>\n\n\n\n<p>Agora, a parte da codifica\u00e7\u00e3o. Como &#8220;nada se cria, tudo se copia&#8221;, comecei a ler o c\u00f3digo de alguns outros <em>plugins<\/em> do Homebridge com um prop\u00f3sito parecido com o meu, como o <em>plugin<\/em> para o <a rel=\"noreferrer noopener\" aria-label=\"Samsung SmartThings (abre numa nova aba)\" href=\"https:\/\/github.com\/pdlove\/homebridge-smartthings\" target=\"_blank\">Samsung SmartThings<\/a> e para o <a rel=\"noreferrer noopener\" aria-label=\" (abre numa nova aba)\" href=\"https:\/\/github.com\/rudders\/homebridge-platform-wemo\" target=\"_blank\">Belkin Wemo<\/a>. Enquanto fazia meu dever de casa, um anjo comentou em um <a rel=\"noreferrer noopener\" aria-label=\"outro post (abre numa nova aba)\" href=\"https:\/\/forum.securifi.com\/index.php?topic=5295.0\" target=\"_blank\">outro <em>post<\/em><\/a> (o famoso &#8220;<em>up<\/em>&#8220;) do f\u00f3rum da Securifi de algu\u00e9m que j\u00e1 havia feito o trabalho sujo por mim! Dando uma olhada no <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/thomaspurchas\/homebridge-almond\" target=\"_blank\">reposit\u00f3rio<\/a> dele, vi que havia inclusive alguns  <span class='tooltipsall tooltip_post_id_custom_6d452baac64464a06ee9376bc2a3980c classtoolTipsCustomShortCode' style='border-bottom:2px dotted #888;'> <br><em>forks<\/em><\/span><script type=\"text\/javascript\">jQuery(\"document\").ready(function(){ toolTips('.tooltip_post_id_custom_6d452baac64464a06ee9376bc2a3980c','C\u00f3pias do reposit\u00f3rio feitas por outras pessoas para desenvolver outras funcionalidades sem atrapalhar o projeto principal'); });<\/script>  mais atualizados do que o do <em>post<\/em>.<\/p>\n\n\n\n<p>Com o c\u00f3digo em m\u00e3os, \u00e9 hora de por a m\u00e3o na massa.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Instala\u00e7\u00e3o do Homebridge e dos plugins<\/h3>\n\n\n\n<p>O primeiro passo \u00e9 criar uma Jail e instalar o Homebridge nela, algo relativamente f\u00e1cil de se fazer devido ao <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/homebridge\/homebridge\/wiki\/FreeNAS-11-Installation-using-a-Jail\" target=\"_blank\">passo a passo j\u00e1 disponibilizado<\/a> pela equipe do Homebridge. \u00c9 apenas criar uma Jail, lembrando de dar a ela um IP est\u00e1tico, marcar o in\u00edcio com o <em>boot<\/em> do NAS e lig\u00e1-la. <\/p>\n\n\n\n<p>O pr\u00f3ximo passo \u00e9 instalar os pacotes necess\u00e1rios. Para isso, iremos acessar o FreeNAS via <span class='tooltipsall tooltip_post_id_custom_3b45b8e71e7cd3dded0eddcc5b734773 classtoolTipsCustomShortCode' style='border-bottom:2px dotted #888;'><em><em>ssh<\/em><\/em><\/span><script type=\"text\/javascript\">jQuery(\"document\").ready(function(){ toolTips('.tooltip_post_id_custom_3b45b8e71e7cd3dded0eddcc5b734773','do ingl\u00eas \\<em\\>Secure Shell\\<\\\/em\\>, que entre outras utilidades permite o acesso remoto \u00e0 servidores'); });<\/script>, e verificaremos o n\u00famero da <em>Jail<\/em>. Com esse n\u00famero em nossa posse, fica bem f\u00e1cil acess\u00e1-la (lembre-se de alterar &#8220;freenas&#8221; para o IP do seu):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gabriel@Gabriel-PC:~$ ssh freenas\ngabriel@freenas's password:\nfreenas% jls\n   JID  IP Address   Hostname              Path\n     2               homebridge            \/mnt\/storage\/iocage\/jails\/homebridge\/root\n\nfreenas% sudo jexec 2 csh\nPassword:\nroot@homebridge:\/ #<\/code><\/pre>\n\n\n\n<p>Dentro da <em>Jail<\/em>, podemos atualizar o ambiente e instalar as depend\u00eancias do Homebridge:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pkg update &amp;&amp; pkg upgrade\npkg install -y node npm dbus avahi-libdns gcc\nsysrc dbus_enable=\"YES\"\nsysrc avahi_daemon_enable=\"YES\"\nln -s \/usr\/local\/include\/avahi-compat-libdns_sd\/dns_sd.h \/usr\/include\/dns_sd.h\nservice dbus start\nservice avahi-daemon start<\/code><\/pre>\n\n\n\n<p>Com o <span class='tooltipsall tooltip_post_id_custom_2cd0b74c6d96d90ac5c20bc66379fa92 classtoolTipsCustomShortCode' style='border-bottom:2px dotted #888;'>NPM<\/span><script type=\"text\/javascript\">jQuery(\"document\").ready(function(){ toolTips('.tooltip_post_id_custom_2cd0b74c6d96d90ac5c20bc66379fa92','Gerenciador de pacotes JavaScript e Node\\.js'); });<\/script>, fica bem f\u00e1cil instalar o homebridge e o plugin para o Almond:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install -g --unsafe-perm homebridge\nmkdir ~\/.homebridge\ncp \/usr\/local\/lib\/node_modules\/homebridge\/config-sample.json ~\/.homebridge\/config.json\nnpm install -g homebridge-almond\n<\/code><\/pre>\n\n\n\n<p>Com isso, j\u00e1 temos tudo instalado, mas nada configurado. Para tal, vamos ter que abrir o <em>ee<\/em> ou (a minha prefer\u00eancia) o &#8220;temido&#8221; <em>vi<\/em>. Para isso, abra o arquivo de configura\u00e7\u00f5es que copiamos no passo anterior:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vi ~\/.homebridge\/config.json\nOU\nee ~\/.homebridge\/config.json<\/code><\/pre>\n\n\n\n<p>Nesse arquivo, j\u00e1 haver\u00e3o alguns acess\u00f3rios pr\u00e9-configurados, al\u00e9m da configura\u00e7\u00e3o padr\u00e3o do Homebridge. De in\u00edcio, devemos confirmar na linha 4 se o endere\u00e7o MAC ali j\u00e1 \u00e9 o endere\u00e7o MAC da Jail. No meu caso, j\u00e1 estava correto.<\/p>\n\n\n\n<p>O pr\u00f3ximo passo \u00e9 apagar tudo que est\u00e1 abaixo da linha 11 (&#8220;<em>description<\/em>&#8220;). S\u00e3o linhas de exemplo, mas n\u00f3s j\u00e1 temos a configura\u00e7\u00e3o do nosso Almond na <a rel=\"noreferrer noopener\" href=\"https:\/\/www.npmjs.com\/package\/homebridge-almond\" target=\"_blank\">p\u00e1gina do projeto<\/a>, ent\u00e3o \u00e9 s\u00f3 ajustar e colar abaixo da linha 10:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>   \"platforms\": &#091;\n       {\n           \"platform\": \"Almond\",\n           \"name\": \"Almond Platform\",\n           \"host\":\"&lt;IP DO ALMOND>\",\n           \"port\": \"7681\",\n           \"username\": \"root\",\n           \"password\": \"&lt;SENHA DO ALMOND>\"\n       }\n   ]<\/code><\/pre>\n\n\n\n<p>Com isso feito, n\u00e3o devemos ter problema nenhum ao iniciar o Homebridge:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@homebridge:\/ # homebridge<\/code><\/pre>\n\n\n\n<p>Se tudo der certo, um c\u00f3digo QR aparecer\u00e1, que dever\u00e1 ser lido no aplicativo Casa do iPhone, clicando no \u00edcone de <strong>+<\/strong> no canto superior esquerdo. Ao adicionar o Homebridge como um acess\u00f3rio, os dispositivos devem aparecer no aplicativo Casa, efetivamente tornando-os compat\u00edveis com o Homekit e a Siri!<\/p>\n\n\n\n<p>Agora que verificamos que tudo est\u00e1 funcionando, vamos configur\u00e1-lo para iniciar junto da <em>Jail<\/em>, e deix\u00e1-lo em plano de fundo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install -g pm2\npm2 startup rcd\nsysrc pm2_enable=\"YES\"\npm2 start homebridge -- -D\npm2 save<\/code><\/pre>\n\n\n\n<p>Com isso, podemos fechar nossa sess\u00e3o <em>ssh<\/em> sem derrubar o Homebridge, e agora n\u00f3s temos um servidor que faz a ponte entre o Almond (<a rel=\"noreferrer noopener\" href=\"https:\/\/www.npmjs.com\/search?q=homebridge-\" target=\"_blank\">e diversos outros dispositivos<\/a>) e o Homekit!<\/p>\n\n\n\n<p>Aproveitei a oportunidade e instalei tamb\u00e9m um <a rel=\"noreferrer noopener\" href=\"https:\/\/www.npmjs.com\/package\/homebridge-plex-sensors\" target=\"_blank\">plugin de integra\u00e7\u00e3o com o Plex<\/a> que simula um sensor de movimento quando o Plex come\u00e7a a tocar algo. Com isso, eu posso fazer algumas automa\u00e7\u00f5es bem legais, como &#8220;Quando come\u00e7ar um filme, desligar as luzes&#8221;. Muito bom!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Mas nem tudo s\u00e3o flores&#8230;<\/h3>\n\n\n\n<p>Como o Almond foi um projeto do <a rel=\"noreferrer noopener\" href=\"https:\/\/www.kickstarter.com\/\" target=\"_blank\">Kickstarter<\/a>, eu estava ciente que ele possivelmente n\u00e3o seria o produto com o maior suporte do mundo (a \u00faltima atualiza\u00e7\u00e3o dele foi em Mar\u00e7o, por exemplo). Isso me traz alguns medos, principalmente no quesito seguran\u00e7a, mas outra consequ\u00eancia disso \u00e9 a comunidade relativamente pequena. Por causa disso, o plugin do Almond s\u00f3 suporta interruptores de luz bin\u00e1rios (ligado\/desligado), al\u00e9m de n\u00e3o ser muito responsivo. Funciona, mas as vezes o Homekit acusa um estado diferente (ligado quando n\u00e3o est\u00e1, por exemplo) e ele demora para sincronizar novamente. \u00c9 de se esperar, quando n\u00e3o temos suporte (n)ativo, mas de qualquer forma, estou bem feliz com o resultado. Posso ligar as luzes com a minha voz e programar rotinas para lig\u00e1-las quando chegar em casa, por exemplo.<\/p>\n\n\n\n<p>Eu at\u00e9 pretendia fazer um <em>fork<\/em> do projeto e tentar melhorar a estabilidade, mas com esse problema das atualiza\u00e7\u00f5es, muito provavelmente seria um trabalho em v\u00e3o, j\u00e1 que o Almond atualmente \u00e9 uma bomba rel\u00f3gio esperando alguma vulnerabilidade aparecer para ser desligado.<\/p>\n\n\n\n<p>Outro passo futuro \u00e9 arrumar mais uma l\u00e2mpada e fazer a integra\u00e7\u00e3o entre elas. O meu ventilador tem duas entradas para l\u00e2mpadas, ent\u00e3o gostaria de poder control\u00e1-las separadamente e tamb\u00e9m ao mesmo tempo, em um \u00fanico interruptor virtual. Isso me dar\u00e1 mais ilumina\u00e7\u00e3o quando precisar, mas tamb\u00e9m me permitir\u00e1 controlar o n\u00edvel de ilumina\u00e7\u00e3o (via o app do Almond) de &#8220;duas l\u00e2mpadas no m\u00e1ximo&#8221; at\u00e9 &#8220;uma l\u00e2mpada s\u00f3, com 1% de intensidade&#8221;. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este post \u00e9 a parte 2 sobre o sistema de luzes de ambiente inteligente. Voc\u00ea pode encontrar a parte 1 aqui. HomeKit &#8211; uma possibilidade? Enquanto fazia a pesquisa para instalar minha luz de ambiente inteligente, me deparei com este post no f\u00f3rum oficial do meu roteador (Securifi Almond+ 2015) falando sobre a exist\u00eancia de &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/gabrieloliveira.eti.br\/blog\/integrando-a-luz-inteligente-com-o-homekit\/\" class=\"more-link\">Continue lendo<span class=\"screen-reader-text\"> &#8220;Smart Home &#8211; Integrando a luz inteligente com o HomeKit&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[23,13,12,11],"class_list":["post-496","post","type-post","status-publish","format-standard","hentry","category-smart-home","tag-homebridge","tag-lights","tag-smart","tag-smart-home"],"_links":{"self":[{"href":"https:\/\/gabrieloliveira.eti.br\/blog\/wp-json\/wp\/v2\/posts\/496","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gabrieloliveira.eti.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gabrieloliveira.eti.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gabrieloliveira.eti.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gabrieloliveira.eti.br\/blog\/wp-json\/wp\/v2\/comments?post=496"}],"version-history":[{"count":9,"href":"https:\/\/gabrieloliveira.eti.br\/blog\/wp-json\/wp\/v2\/posts\/496\/revisions"}],"predecessor-version":[{"id":577,"href":"https:\/\/gabrieloliveira.eti.br\/blog\/wp-json\/wp\/v2\/posts\/496\/revisions\/577"}],"wp:attachment":[{"href":"https:\/\/gabrieloliveira.eti.br\/blog\/wp-json\/wp\/v2\/media?parent=496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gabrieloliveira.eti.br\/blog\/wp-json\/wp\/v2\/categories?post=496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gabrieloliveira.eti.br\/blog\/wp-json\/wp\/v2\/tags?post=496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}