Entrada
Por algum tempo, usei vários relés Sonoff padrão que controlam a luz através do Google Home Mini. Mas no final, eu queria mais. A funcionalidade padrão não é suficiente, decidi gradualmente tornar o sistema algo mais flexível. Eu escolhi o ioBroker.
No começo, como sempre, procurei, escolhi, verifiquei peças de funcionalidade. Quando, separadamente, as necessidades básicas funcionavam, ele começou a montar. E, é claro, tive problemas.
As principais dificuldades:
- O que exatamente escolher? Afinal, existem muitas maneiras de implementar nosso plano. E mesmo na solução escolhida, existem muitas opções ...
- Não há instruções prontas sobre como montar exatamente o conjunto de soluções que escolhi e precisamente em minhas configurações.
O que eu escolhi, por que, quais dificuldades encontrei e como resolvê-las, e isso será discutido.
Olhando para o futuro, descreverei como o ioBroker foi lançado no docker em um laptop antigo e jogou o Zigbee nele para interagir diretamente com os sensores da Xiaomi, sem um gateway. Não dou instruções padrão, apenas meus "inchaços".
Como ainda não é produtivo, é bem possível mudar alguma coisa. Por isso, serei grato pelos conselhos e correções :)
Lista de desejos e o trem dos meus pensamentos
Havia bobinas Sonoff (instaladas no eWeLink), algum tipo de cabo de extensão (Tuya SmartLife), gateway Xiaomi com vários sensores (Mi Home), coluna Google Home Mini.
O eWeLink e o SmartLife normalmente captavam a Página inicial do Google, ouviam comandos de voz como "Acenda as luzes sobre a mesa". O Mi Home não foi iniciado (existem poucos dispositivos Xiaomi suportados no Google Home).
Coloquei ioBroker, peguei o Xiaomi Gateway, em princípio, tudo funcionou. Está tudo lindo, eu verifiquei os scripts, eles estão escritos (eu escolhi o Node-Red), decidi fazer tudo sobre isso.
No entanto, não sou um administrador profissional, posso descobrir como prepará-lo, mas não sei em que sutilezas, como bibliotecas e componentes, são inseridos (e não quero me aprofundar). Portanto, me incomodou um pouco que o ioBroker precisasse nodejs, algumas npm com as quais eu não tinha negócios antes. Existem dificuldades com as versões (como o yum padrão do repositório coloca nodejs muito antigos, etc.).
Bem, isto é Comecei tudo, mas o medo permaneceu em meu coração que, embora funcione, não entendo como. E se, por exemplo, algo quebrar durante uma atualização, não sei como corrigi-lo. Mas, além do ioBroker, eu também queria empilhar outros sistemas no laptop.
Vou colocar, por exemplo, uma atualização sobre algo que parece funcionar. E depois de algum tempo, verifica-se que funciona mal. Teremos que reverter o backup há um mês. Além disso, o backup não é apenas deste sistema, mas de todos os outros, porque eu não entendo até onde de onde sistema estão os arquivos executáveis, onde estão os arquivos de configuração, onde estão os próprios dados ...
Isso me incomodou muito, então decidi usar o Docker. O código no contêiner. Dados separadamente, o diretório é montado no host. Fácil de fazer backup.
Existe uma nova versão? Sim, mesmo em outra máquina virtual, é fácil verificar como a nova versão do contêiner com dados desse diretório funcionará. Sistemas diferentes não interferem entre si. É fácil reverter os binários de algum sistema. Novamente, é fácil transferir para outra coisa (o ioBroker no contêiner funciona tanto na Synology quanto na placa única). Beleza!
Haverá mais requisitos (para disponibilizar via Internet, mas não disponíveis publicamente para segurança), eles serão afetados ainda mais ao escolher as configurações.
Instalação
O sistema operacional host não é crítico, baixei o CentOS (da memória antiga, lembrei-me de que, para todas as tarefas de rede, funcionava de maneira estável e sem erros). A versão atual era o Cent OS 8.
Coloque isso. Fiz configurações básicas como nome do host, fail2ban (apenas um hábito, embora o host esteja apenas na LAN). Coloque o Docker. Eu não vou insistir nisso.
Instruções de exemplo .
É hora de lançar o ioBroker. Mas qual rede escolher? Host ou Macvlan?
Primeiro, a Macvlan queria que cada contêiner obtivesse seu endereço IP do roteador. Mas então ele decidiu abandonar esse empreendimento:
- Com o Host, é claro, você precisa indicar explicitamente quais portas encaminhar, verifique se elas não se cruzam com outros contêineres. Mas
- O iptables precisará ser configurado dentro de cada contêiner. Incluindo após cada reinicialização com outros parâmetros, atualização / substituição. E no modo Host, é um ponto único de gerenciamento de segurança.
- Ainda pretendo disponibilizá-lo não apenas a partir de WiFi doméstico. E, nesse caso, é mais conveniente tornar um host acessível a partir do exterior (e mapear a porta nele) do que configurá-lo para vários.
Atualmente verificado o ZeroTier One. Instalado apenas no host. O acesso ao endereço IP deste host (não local, mas emitido pelo ZeroTier) e à porta 8082 do telefone móvel via GPRS quando o cliente ZeroTier estiver em execução abre perfeitamente a interface vis).Tão padrão
docker run -d --name ioBroker -p 8081:8081 -p 8082:8082 -v /opt/iobroker/:/opt/iobroker/ --device=/dev/ttyACM0 --env-file /opt/ioBroker_env.list --restart=always buanet/iobroker:latest
Opa Algo deu errado.
docker logs ioBroker
mostra que na última etapa não há conexão com recursos externos. Não consigo obter um nome de razorzvolit.
docker exec -it ioBroker bash
mostra que o ping sobre IP passa bem, mas não pelo nome.
Google, encontro vários links sobre como o docker substitui incorretamente o servidor DNS, eu regra /etc/docker/daemon.json, eu entendo o dnsmasq - nada ajuda.
Um pensamento surge, de repente algo é bloqueado no nível da rede. Mas não há telnet ou ondulação no contêiner, não consigo verificar. A instalação também não é fácil - a instalação do yum não funciona. Obviamente, você pode especificar manualmente os hosts necessários em / etc / hosts, mas isso consome muito tempo; é melhor verificar outras versões.
Por exemplo, paro estupidamente o firewalld no host, na esperança de que tudo seja aberto. Mas não.
Lembro que a disponibilidade da porta ainda pode ser verificada com o wget. E ele está no recipiente! E não pode baixar nada nem por IP. Mesmo a interface da web do roteador doméstico não pode se conectar. Bem, isso significa que o problema definitivamente não está no DNS, mas no iptables.
Como resultado, tudo funcionou após a adição da interface do docker à zona confiável:
sudo firewall-cmd --permanent --zone=trusted --change-interface=docker0 sudo firewall-cmd --reload
Isso é até interessante, eu negligenciei em algum lugar nas instruções?
Ou eu não usaria o CentOS 8, mas algo mais, não haveria problema (em outro sistema operacional, ele não faz firewall por padrão)?
Ou é tão óbvio para todos que eles não escrevem nas instruções que sou burra há muito tempo?
Zigbee
Portanto, meu ioBroker está no contêiner e possui apenas algumas portas publicadas. Agora, este é o admin 8081 e vis 8082, o mqtt 1883 será adicionado e, possivelmente, algo para apoiar o Tuya (eu vi um driver desse tipo, mas ainda não o descobri).
Infelizmente, para interagir com os dispositivos Xiaomi através de seu gateway, são necessários multicasts, e com isso nesta configuração de complexidade. Por isso, decidi jogar em um contêiner USB. Também uma operação normal.
Na linha de comando, você já viu
--device=/dev/ttyACM0
para isso. O dispositivo no contêiner apareceu. No ioBroker, ativei o driver padrão "Zigbee para Xiaomi e outros dispositivos", mas não funcionou.
O Google sugere que, para acessar a porta serial, você precisa adicionar o usuário ao grupo de discagem. Entro no contêiner, adiciono iobroker a este grupo - não ajuda.
Vejo as dicas de que você precisa para instalar o pacote serialport através do npm.
Não posso, sem direitos. Google mais.
O Bluefox, por si só, diz a alguém que isso precisa ser feito no diretório /opt/iobroker/node_modules/iobroker.javascript/ - eu não tenho um e ainda não tenho direitos de instalação (ou seja, a instalação inicia e, em seguida, falhas).
Finalmente, me ocorre que eu preciso especificar explicitamente na linha de comando em qual diretório colocar.
npm install -g serialport --production --save --prefix "/opt/iobroker"
Está instalado, mas não ajuda.
Estou começando a suspeitar que você ainda precisa lidar com direitos de acesso. Verificação (de dentro do contêiner, é claro):
test -w /dev/ttyACM0 && echo success || echo failure
Êxito I.e. Ainda assim, a janela de encaixe jogou o dispositivo corretamente.
sudo -H -u iobroker test -w /dev/ttyACM0 && echo success || echo failure
Pateta! Falha
o bash dentro do contêiner é executado sob a raiz, mas do usuário iobroker não há acesso à porta. Apesar de pré-adicioná-lo ao grupo de discagem.
ls -l /dev/ttyACM0
fornece
crw-rw----. 1 root 18 166, 0 Nov 3 18:14 /dev/ttyACM0
Ha! O que é 18 em vez do nome do grupo?
Tudo está correto no host principal:
crw-rw----. 1 root dialout 166, 0 Nov 3 15:15 /dev/ttyACM0
crw-rw----. 1 root dialout 166, 0 Nov 3 15:15 /dev/ttyACM0
Acontece que no host principal na
dialout:x:18
/ etc / group
dialout:x:18
e na
dialout:x:20
do contêiner
dialout:x:20
Embora eu tenha adicionado um usuário ao grupo com esse nome, não faz sentido, o número não é o mesmo. Então, criei outro grupo com o identificador 18 e adicionei o usuário a ele já:
groupadd -g 18 serial usermod -a -G serial iobroker
Eu reiniciei tudo para maior certeza. E nisso meu confronto terminou :)
Ele calmamente desatou todos os sensores do gateway Xiaomi, vinculou-o ao ioBroker.
Eu os vejo como objetos no próprio ioBroker:

As leituras Vis são lidas:

Quando os contatos no sensor de vazamento são fechados, os dados são recebidos. E a imagem está mudando:

E em Node-Red, o sinal chega. Consequentemente, embora o email ou outra coisa esteja sendo enviada, um arquivo de voz ou MP3 é enviado para a coluna GH Mini:

A propósito, ao ver os objetos, uma surpresa me esperava:

Virei o Xiaomi Cube para outro lado. As últimas alterações são mostradas em verde.
Flip90 mudou - isso é compreensível. Este sinal é capturado para controle. Mas, ao que parece, ainda há flip90_from e flip90_to - com que lado ele se virou.
Acontece que, em teoria, você pode obter ainda mais sinais de controle do cubo. Por exemplo, se você desenhar setas nas bordas (como se estivesse em círculo), poderá rastrear não apenas a “curva 90”, mas também em qual direção (de você ou de si mesmo, esquerda ou direita).
Para flip180, também funciona. E para outros gestos, há informações adicionais semelhantes (parte superior no giro de 180 °, parte superior no slide, parte superior na torneira)
Não que isso fosse desesperadamente necessário. Mas no Mi Home padrão não havia informações sobre os rostos. Parece que com a conexão anterior via Xiaomi Gateway, eu também não a vi, eu não sabia que cada rosto tem um número. Anteriormente, eu sabia apenas sobre a ação adicional de queda livre (queda livre), que foi, mas eles foram expulsos do Mi Home (aparentemente, eles foram retirados com muita frequência).
Final
Tudo que eu preciso está trabalhando. Então você pode trazer beleza, escrever scripts, conectar o Tuya, lançar um contêiner com o Blynk para outros projetos ...
E, talvez, refazer algo com base nos seus comentários :)