Entrada
No processo de escolha de soluções para uma casa inteligente, tento ignorar soluções in a box que exigem comunicação com nuvens externas ou têm seus próprios aplicativos, especialmente soluções sem a capacidade de conectar-se diretamente ao dispositivo. Todas as métricas disponíveis são reduzidas a uma interface - zabbix, onde um sistema de alerta de partes interessadas é organizado. Os botões de controle são implementados em uma interface da web localizada localmente.
Artigos anteriores:
parte um (temperatura de 1 fio, altos, medidor de água ...)
parte dois (rede, gidrolock, sensores de pressão ...)
Tarefas resolvidas neste artigo
- Proteção escalável e flexível contra vazamentos de água com alerta zabbix
- Outros dispositivos a 433mhz: campainha, porta aberta, etc.
- Empurramos 1 fio no MQTT
Sistema de proteção contra vazamentos
Exigências do sistema:
- muitos sensores espalhados pela casa (no meu caso - 6 peças em locais diferentes)
- sem fios nos sensores
- desligamento rápido após a detecção de vazamentos
- todas as informações de status atuais no zabbix. Existe um alerta
Composição do sistema
- PI de framboesa
- Sintonizador USB RTL2832U
- Sensores de vazamento 433mhz
- Rede + guindaste gidrolock (consulte o artigo anterior) para desligar o tronco
Sobre ferro
Em um artigo anterior, descrevi a solução de desligar o suprimento de água usando redes. Eu tenho um sensor com fio para esta solução. Isso é conveniente se todos os pontos onde houver vazamento estiverem aproximadamente no mesmo local. No meu caso, a rede é instalada diretamente na entrada da rodovia e controla o guindaste eletro-mecânico de gidrolock (veja o artigo anterior). A dispersão de redes + gidrolock + sensor com fio em todos os pontos é cara e complicada. Além disso, não tenho mais a oportunidade de arrastar novos fios pela casa. Ocupar tomadas e respirar guindastes elétricos é uma solução mais ou menos. A solução esperada - usamos a sobreposição da estrada comum com base nos sinais dos sensores de rádio espalhados pelos locais.
Pelo que foi encontrado na Internet - um monte de sensores de rádio diferentes de sistemas prontos. Alguns podem ser comprados separadamente, não comprei controladores para sensores, para não produzir elementos adicionais no circuito.
Como posso capturar 433mhz? Acontece - um sintonizador de TV em um chipset específico. E agora ele vale um centavo (eu assumi o Avito por 300r) assim:

Encomendei uma antena separada para ele em 12dbi, porque a atual não cobria toda a casa.
Desde que tentei minimizar os componentes de controle do circuito, havia um desejo de apertar o sintonizador no meu roteador doméstico com o Openwrt, que até agora era o núcleo da solução doméstica inteligente para 1wire, modbus, sensores / protocolos wifi, mas, infelizmente, esgotei alguns de seus recursos ( o espaço na unidade flash embutida para o software necessário termina, o processador carrega com alguma coisa - já haverá problemas com a rede e ainda temos 4k para procurar on-line :), + já existem muitas coisas penduradas no USB, o que afeta a estabilidade da coleta de dados). Decidiu-se transferir gradualmente a funcionalidade da casa inteligente para um dispositivo externo - rarpberry pi (uma das primeiras versões estava disponível).
Sobre o software
Depois de tocar com um sintonizador de TV afiado em um computador desktop com janelas (depois de tentar capturar rádios de outras pessoas e negociações de aeronaves), comecei a ver se os próprios sensores viram o "apito". Sim, vê perfeitamente:

Configuração de framboesa
Eu escolhi raspbian nativo. Eu escrevi a última imagem na unidade flash USB em mac / linux:
sudo dd if=2019-07-10-raspbian-buster-lite.img of=/dev/disk2 bs=1048576 conv=sync
Inicialize, configure a rede e o ssh.
Em seguida - coloque os pacotes de framboesa rtl-sdr, rtl_433:
sudo apt-get install cmake build-essential python-pip libusb-1.0-0-dev libusb-1.0 python-numpy git git clone https://github.com/merbanan/rtl_433.git cd rtl_433/ mkdir build cd build cmake .. make make install
O rtl_433 possui protocolos internos que descriptografam dados de diferentes dispositivos operando na faixa de 433mhz.
Começamos rtl_433
rtl_433 -f 433.9e6
Abaixamos os sensores na água e obtemos o valor:
time : 2019-09-17 15:04:39 model : Smoke detector GS 558 id : 16919 unit : 1 learn : 0 Raw Code : c842e1
Detector de fumaça? Ok, vamos colocar a música "Smoke on the water" no alerta desses sensores ... :)
Mas, falando sério - temos o ID de cada sensor, de acordo com o qual no futuro entenderemos exatamente onde temos um vazamento (e, em qualquer caso, seremos desligados).
Sobre sensores de vazamento



Depois de configurar a parte do software, notei que os sensores com aliexpress (foto à esquerda) enviam um único sinal quando a água entra nos contatos. Mais um sinal se a água parar de fechar os contatos. Isso não me serve de forma alguma (comportamento esperado: envie constantemente um sinal de alarme quando o sensor detectar água, pois um único sinal pode ser perdido). Um comportamento semelhante é observado se você fechar os contatos com um fio. Mas o que é estranho - o alarme ocorre a cada 2-3 segundos, se você fechar os contatos com as mãos (pele). Aqui ainda tenho duas suposições: ou os chineses estragaram as medições de resistência, ou os sensores têm algum outro modo de operação em que se comportam de maneira diferente (por exemplo, emparelhados com um controlador) ou existem outras frequências (até que eu encontrei )
A propósito, escreva nos comentários, talvez alguém tenha trabalhado com esses sensores. De alguma forma eles podem ser "ensinados" a enviar um sinal sobre um vazamento constantemente?Coloquei esses sensores de lado, no arsenal havia outro da rubetek (foto à direita) e comprei na Leroy: GAL SHW-1005 (foto do meio).
O comportamento do sensor de rubetek parecia completamente imprevisível (a reação imprevisível “vê água / não vê”).
Mas o sensor da Leroy em movimento mostrou exatamente o que eu precisava: há água - eu spam no ar, não há água - estou calada. Seu único ponto negativo é um raio de ação menor que outros sensores. Mas o problema foi resolvido com a compra de uma antena mais sensível para o receptor.
MQTT
Como enviar a saída rtl_433 para o zabbix? Alimentar o agente? Enviar para zabbix_sender, analisando o processo? Talvez através do syslog?
Aqui você precisa se lembrar que meu zabbix está em algum lugar nas nuvens. E certamente não é necessário bloquear a água com a ajuda de seus gatilhos. O chão da casa inundará até que ele tome uma decisão (se houver alguma disponível).
A boa notícia é que o rtl_433 pode enviar informações no MQTT. Fora da caixa. Ao mesmo tempo, os dados são enviados ao broker no formato json.
Então você precisa:
- Coloque um corretor local de mosquitos (faça-o na framboesa).
- Mesclar as informações no broker com o tópico desejado, para que posteriormente possam ser analisadas.
- Conecte-se ao broker localmente na framboesa e envie comandos para compensação
- Conecte-se ao broker a partir do local em que o redirecionamento para o zabbix ocorrerá (o servidor zabbix no meu caso também é um cliente MQTT)
Mosquito de instalação-configuração MQTT:
apt-get install mosquitto mosquitto-clients systemctl enable mosquitto systemctl start mosquitto
Enviamos informações ao corretor indicando o ID do dispositivo:
rtl_433 -f 433.88e6 -F mqtt://127.0.0.1,events=/433/[id]
No cliente mqtt, obteremos algo como o seguinte:
mosquitto_sub -h 127.0.0.1 -t '#' ( ) /433/16919 {"time":"2019-09-18 11:55:29","model":"Smoke detector GS 558","id":16919,"unit":1,"learn":0,"code":"c842e1"}
Script para conectar-se ao broker e enviar o comando para netping
Esboço um cliente de script MQTT simples que permite executar o script associado ao tópico quando o tópico especificado na configuração aparece. Assim, quando um determinado sensor é acionado e as informações sobre ele aparecem no ar (por exemplo, / 433/16919), você pode executar alguma ação (no caso de compensação, envie uma solicitação de enrolamento para fechar o guindaste, consulte o artigo anterior). Um link para o script está no final do artigo.
Redirecionamento no zabbix
Eu usei a solução mqtt-zabbix pronta. Em seu nível, entendemos em qual item enviar o valor (por ID).
Em keys.cfg, especifique:
/433/16919,mqtt.ventilation.waterleak::hostname
onde hostname é o nome do host com o tipo de tramp de item no Zabbix.
Importante !!! O nome do host nas configurações deve corresponder ao nome a ser enviado no script, o tipo de item (elemento de dados) deve ser adequado para os dados que estão sendo enviados (por exemplo, para json - text), caso contrário, você detectará erros no formulário:
2019-09-18 14:29:48,749 Got response from Zabbix: {u'info': u'processed: 0; failed: 1; total: 1; seconds spent: 0.000055', u'response': u'success'}
Além disso, é difícil obter mais depuração (e por que falhou) do zabbix.
Configuramos /etc/mqtt-zabbix/mqtt-zabbix.cfg (especifique o intermediário ip mqtt e o endereço do servidor zabbix).
O que mais se conectar ao 433?
Sim, qualquer coisa! :)Sensores de estação meteorológica
Enquanto mexia em sensores de vazamento sem fio, captei acidentalmente o sinal de um sensor externo de uma estação meteorológica. Parecia assim:
time : 2019-09-19 10:48:54 Protocol : 56 model : TFA pool temperature sensor Id : 182 Channel : 3 Temperature: 19.3 C Modulation: ASK Freq : 433.9 MHz RSSI : -0.1 dB SNR : 35.0 dB Noise : -35.2 dB time : 2019-09-20 10:57:29 Protocol : 12 brand : OS model : THN132N House Code: 4 Channel : 3 Battery : OK Celsius : 20.00 C Modulation: ASK Freq : 432.9 MHz RSSI : -0.2 dB SNR : 31.5 dB Noise : -31.7 dB
Assim, o bônus foi a capacidade de monitorar a temperatura dos pontos no ar com exibição no zabbix. Apenas em alguns quartos, não consigo esticar o cabo.
Campainha
Muitas chamadas de rádio funcionam na mesma faixa de frequência ~ 433mhz. Assim, podemos interceptar o pressionamento do botão de chamada (nem sequer é necessário ter a chamada em si, apenas o botão é suficiente). Porque Por exemplo, para configurar notificações adicionais via SMS / para telegrama / qualquer que seja ou exibir a imagem da câmera no monitor.
Eu comprei uma ligação: Evology QA-688-E RU.
Para que o botão rtl_433 veja o botão de chamada, é necessário ativar os protocolos de "teste", por exemplo, executando com a opção "G" ou especificando um protocolo adicional específico, ao mesmo tempo adicionaremos a saída de informações sobre o protocolo e a frequência:
rtl_433 -f 433.9e6 -G -M protocol -M level -F mqtt://127.0.0.1,events=/433/[id] &
Entre no MQTT:
{"time":"2019-09-30 10:57:00","protocol":72,"model":"RF-tech","id":0,"battery":"LOW","temperature_C":0,"button":0,"mod":"ASK","freq":433.84822,"rssi":-3.5981,"snr":33.77488,"noise":-37.373}
Aqui você pode ver id = 0. Ao mesmo tempo, eu tinha vários dispositivos identificados como RF-tech. Todos eles tinham um ID igual a 0. Como resultado, todos os dispositivos no zabbix são exibidos como um item. É possível distinguir exatamente qual dispositivo funcionou, apenas por frequência.
Colocamos a frequência em um item dependente separado: mqtt.outside.doorbell.freq com pré-processamento JSON em $ .freq (o zabbix pode fazer isso a partir da 4ª versão).
Neste item, faça um gatilho com a expressão:
{HOME_PI:mqtt.outside.doorbell.freq.last()}>433.8 and {HOME_PI:mqtt.outside.doorbell.freq.last()}<433.81 and {HOME_PI:mqtt.outside.doorbell.freq.nodata(30)}=0
I.e. se de repente um valor aparecer no item geral mqtt.outside.doorbell.freq (nodata) e a frequência estiver no intervalo especificado entre 433,8 e 433,81, podemos concluir que eles estão nos chamando (e, por exemplo, para duplicar uma chamada para o SMS).
Sensores de porta / janela
Eu tenho um sensor de penetração da rubetek. Envia o seguinte:
{"time":"2019-09-30 14:11:28","protocol":86,"model":"Smoke detector GS 558","id":12262,"unit":16,"learn":0,"code":"e5fcd0","mod":"ASK","freq":433.85021,"rssi":-3.99241,"snr":33.38058,"noise":-37.373} : {"time":"2019-09-30 14:11:28","protocol":68,"model":"Kerui Security","id":46074,"cmd":7,"state":"close","mod":"ASK","freq":433.85021,"rssi":-3.99241,"snr":33.38058,"noise":-37.373} : {"time":"2019-09-30 14:11:21","protocol":68,"model":"Kerui Security","id":46074,"cmd":14,"state":"open","mod":"ASK","freq":433.85005,"rssi":-11.0148,"snr":25.1088,"noise":-36.1236}
Assim que o último sensor de rádio foi adicionado ao zabbix, eu queria refazer tudo no MQTT. Catalogação conveniente, você pode determinar o tópico ah, o posicionamento e os tipos de dispositivos. Você recebe a transmissão geral de todos os eventos.
1 fio para MQTT
Quero que tudo esteja no MQTT, pelo menos para o mesmo tipo de implementação. Eu quero obter um "éter" geral de eventos e uma abordagem geral em reação a esses eventos. Obviamente, o zabbix resolve o problema de reação e deixo alertas. Mas quero tornar a administração mais alegre, próxima do sistema e do "éter".
Existem soluções prontas para a retransmissão de estados de sensores de uma rede de 1 fio para o MQTT, mas elas não me agradaram. As soluções prontas no nó carregam várias dependências por trás deles ou consumiram todo o processador de framboesa. Algumas das soluções das 10 principais na pesquisa do Google são abandonadas pelos autores, outras são suportadas apenas por sensores de temperatura. Há também uma classe de gateways que coletam informações através da interface gpio. Tudo isso não me agradou.
Eu tenho um sistema de pseudo-arquivo montado com dispositivos 1wire em / mnt / 1wire, é aí que eu quero obter todas as informações necessárias. Para fazer isso, basta fazer uma linha simples no bash, enviando dados através do mosquitto_pub para cada um dos sensores. No entanto, existem questões sobre o lançamento desses scripts (sobre a coroa, para entrar em algum tipo de daemon?), Apresentação normal de dados (obtenção do mesmo json), adição de um novo sensor, etc. Quanto mais o pensamento se desenvolvia, mais muletas nasceram. Acabou sendo mais fácil escrever um gateway para outros owfs no mqtt para esta tarefa.
Existe um arquivo de configuração no qual precisamos inserir o ID dos sensores e esses arquivos do fuse.OWFS que queremos publicar no mqtt.
A saída no mqtt é o seguinte json:
/1wire/28.0425260a0000 {"type": "DS18B20", "temperature": "30"} /1wire/28.bf16270a0000 {"type": "DS18B20", "temperature": "7.9375"} /1wire/26.da2f71010000 {"temperature": "25.2812", "IAD": "1", "CA": "0", "VAD": "0.91", "VDD": "4.59", "type": "DS2438"} /1wire/28.48b3010b0000 {"type": "DS18B20", "temperature": "40.5625"} /1wire/1d.6a9306000000 {"type": "DS2423", "counter.B": "9", "counter.A": "9219"} /1wire/28.61cc260a0000 {"type": "DS18B20", "temperature": "12.5"}
Adicionar à execução automática, defina o intervalo de pesquisa. O problema está resolvido.
Referências
github.com/merbanan/rtl_433 - uma ferramenta para decodificar protocolos de rádio
github.com/kylegordon/mqtt-zabbix - MQTT no Zabbix
github.com/unlo/1wire2mqtt - 1wire no MQTT, cliente MQTT que permite executar scripts quando o tópico aparece