Índice:

Monitoramento DIY House com RaspberryPi e Cloud4Rpi: 5 etapas
Monitoramento DIY House com RaspberryPi e Cloud4Rpi: 5 etapas

Vídeo: Monitoramento DIY House com RaspberryPi e Cloud4Rpi: 5 etapas

Vídeo: Monitoramento DIY House com RaspberryPi e Cloud4Rpi: 5 etapas
Vídeo: Как Убежать от Полицейской Собаки-Ищейки 2024, Novembro
Anonim
Monitoramento DIY House com RaspberryPi e Cloud4Rpi
Monitoramento DIY House com RaspberryPi e Cloud4Rpi

Num fim de semana de inverno, fui à minha casa de campo e descobri que fazia muito frio lá. Algo havia acontecido com eletricidade e o disjuntor RCD o desligou, e o aquecimento também. Tive a sorte de chegar lá, senão em vários dias tudo teria congelado, o que é muito ruim para os canos e os radiadores.

Eu tinha vários Raspberry Pi e um sensor térmico, então pensei - por que não faço um dispositivo de monitoramento simples? As instruções abaixo pressupõem que você tenha um Raspberry Pi com Raspbian e uma conexão de rede configurada. No meu caso, é Raspberry Pi B + com Raspbian (2018–06–27-raspbian-stretch-lite).

Etapa 1: Monitoramento de temperatura

Monitoramento de temperatura
Monitoramento de temperatura
Monitoramento de temperatura
Monitoramento de temperatura

Como conectar um sensor de temperatura DS18B20? Pesquise no Google como fazer isso e você verá muitas fotos como esta:

No meu caso eu tinha fios Preto, Amarelo e Vermelho. O preto é aterrado, vai para o pino de aterramento, o vermelho é energia - vai para o pino de 3,3 V, e o amarelo é para dados - deve ir para o pino GPIO4, com resistor de 4,7 kOm conectado entre os dados e a energia. Nota, você pode conectar vários sensores em paralelo (são digitais e têm endereços diferentes), você precisa de apenas um resistor. Depois de conectar seu sensor, você deve habilitar 1Wire no raspi-config:

sudo raspi-config

Vá para 5 opções de interface, habilite P7 1-Wire e reinicie.

Então você pode testar se consegue ver o sensor:

sudo modprobe w1-gpiosudo modprobe w1-thermls / sys / bus / w1 / devices /

Você deve ver algo assim:

pi @ vcontrol: ~ $ ls / sys / bus / w1 / devices / 28–00044eae2dff w1_bus_master1

28–00044eae2dff é nosso sensor de temperatura.

O hardware está pronto. Agora preciso configurar a parte de monitoramento. Preciso de algo que me mostre os dados e me avise se o dispositivo for desconectado por um tempo ou se não houver energia ou se a temperatura estiver baixa. Obviamente, este não pode ser o próprio raspberry pi, deve haver algum servidor ou serviço na internet que monitore meu dispositivo.

Posso criar um servidor simples, conseguir uma hospedagem e configurar tudo, mas honestamente, não quero. Felizmente, alguém já pensou sobre isso e criou cloud4rpi.io - um painel de controle em nuvem para o seu dispositivo.

Etapa 2: Configurando Cloud4Rpi.io

Configurando Cloud4Rpi.io
Configurando Cloud4Rpi.io

Cloud4Rpi fornece um serviço que permite que seu dispositivo envie e receba dados usando os protocolos MQTT ou HTTP. Eles têm uma biblioteca cliente para Python, então usarei Python.

Os exemplos de Python que vêm com o serviço Cloud4Rpi já contêm código para o sensor de temperatura DS18B20.

Então eu fui para https://cloud4rpi.io, criei uma conta e adicionei um novo dispositivo lá. A página do dispositivo possui um token - uma string que identifica o dispositivo e que deve ser especificada no programa que envia os dados.

Para começar, é sempre uma boa ideia atualizar um gerenciador de pacotes e atualizar os pacotes (nota: pode levar horas se você não atualizar por um tempo):

sudo apt-get update && sudo apt-get upgrade

Em seguida, instale git, Python e seu gerenciador de pacotes Pip:

sudo apt-get install git python python-pip

Em seguida, instale a biblioteca cloud4rpi Python:

sudo pip install cloud4rpi

Finalmente, estou pronto para escrever meu programa de controle. Começo com o exemplo disponível em

git clone https://github.com/cloud4rpi/cloud4rpi-raspberrypi… cloud4rpicd cloud4rpi

O arquivo de programa principal é control.py - preciso modificá-lo de acordo com minhas necessidades. Primeiro, edite o programa e cole um token:

sudo nano control.py

Encontre uma linha DEVICE_TOKEN = '…'] e especifique um token de dispositivo lá. Depois disso, posso simplesmente executar o programa: ele funciona e relata uma temperatura na variável RoomTemp:

sudo python control.py

Ele funciona e relata uma temperatura na variável RoomTemp.

Observe que ele descobre todos os sensores ds18b20 onewire

ds_sensors = ds18b20. DS18B20.find_all ()

e usa o primeiro sensor encontrado:

RoomTemp ': {' type ':' numeric ',' bind ': ds_sensors [0] if ds_sensors else None}

Ok, isso foi fácil, porque o programa de amostra tem tudo o que é necessário para funcionar com o sensor ds18b20 no Raspberry Pi. Agora preciso encontrar uma maneira de relatar o status de energia.

Etapa 3: Monitoramento de UPS

Monitoramento UPS
Monitoramento UPS

A próxima coisa que desejo monitorar é o status do no-break, portanto, se houver queda de energia, saberei antes que tudo seja desconectado.

Tenho um UPS APC com controle USB, então pesquisei rapidamente no Google e descobri que preciso do apcupsd. https://www.anites.com/2013/09/monitoring-ups.html… Tentei várias vezes instalá-lo através do apt-get e não estava funcionando para mim por vários motivos. Vou mostrar como instalá-lo a partir das fontes.

wget https://sourceforge.net/projects/apcupsd/files/ap…tar xvf apcupsd-3.14.14.tar.gz cd apcupsd-3.14.14./configure --enable-usb sudo make sudo make install

Em seguida, edito o apcupsd.conf para me conectar ao meu no-break via usb.

sudo nano /etc/apcupsd/apcupsd.conf# #UPSCABLE smart UPSCABLE usb # #UPSTYPE apcsmart #DEVICE / dev / ttyS0 UPSTYPE USB DEVICE

Agora posso conectar o cabo USB do UPS ao RaspberryPi e testar se o UPS foi encontrado.

sudo apctest

Não deve apresentar mensagens de erro.

Agora, sevice apcupsd deve ser iniciado:

sudo systemctl start apcupsd

Para ativar o status do UPS, posso usar um comando de status:

sudo /etc/init.d/apcupsd status

E a saída seria algo assim:

APC: 001, 035, 0855DATE: 2018-10-14 16:55:30 +0300 HOSTNAME: vcontrol VERSÃO: 3.14.14 (31 de maio de 2016) debian UPSNAME: vcontrol CABO: Cabo USB DRIVER: USB UPS Driver UPSMODE: Stand Alone STARTTIME: 2018-10-14 16:54:28 +0300 MODELO: Back-UPS XS 650CI STATUS: ONLINE LINEV: 238,0 Volts LOADPCT: 0,0 por cento BCHARGE: 100,0 por cento TIMELEFT: 293,3 minutos MBATTCHG: 5 por cento MINTIMEL: 3 minutos MAXTIME: 0 Segundos SENTIDO: Médio LOTRANS: 140,0 Volts HITRANS: 300,0 Volts ALARMDEL: 30 Segundos BATTV: 14,2 Volts LASTXFER: Nenhuma transferência desde a ativação NUMXFERS: 0 TONBATT: 0 Segundos CUMONBATT: 0 Segundos XOFFBATT: N / A STATFLATTFLAG: 0x0NOTE14: 2014-06-10 NOMINV: 230 Volts NOMBATTV: 12,0 Volts NOMPOWER: 390 Watts FIRMWARE: 892. R3. I USB FW: R3 END APC: 2018-10-14 16:55:38 +0300

Preciso de um status - que é a linha “STATUS:”.

A biblioteca Cloud4rpi contém um módulo ‘rpy.py’ que retorna os parâmetros do sistema Raspberry Pi, como nome do host ou temperatura da cpu. Uma vez que todos esses parâmetros são resultados da execução de alguns comandos e da saída de análise, ele também contém uma função útil ‘parse_output’ que faz exatamente o que eu preciso. Veja como obter o status do meu UPS:

def ups_status (): resultado = rpi.parse_output (r'STATUS / s +: / s + (S +) ', [' /etc/init.d/apcupsd ',' status ']) se resultado: retornar resultado else: retornar 'DESCONHECIDO'

Para enviar esse status para cloud4rpi, preciso declarar uma variável UPSStatus e vinculá-la à minha função ups_status: Agora posso executar meu programa:

variáveis = {'RoomTemp': {'type': 'numeric', 'bind': ds_sensors [0]}, 'UPSStatus': {'type': 'string', 'bind': ups_status}}

E posso ver imediatamente minha variável na página do dispositivo cloud4rpi.

Etapa 4: Preparação para a "produção"

Preparando-se para a “produção”
Preparando-se para a “produção”

Tudo está funcionando e agora preciso preparar meu dispositivo para o modo autônomo.

Para começar, vou ajustar os intervalos de tempo. O intervalo de sondagem define com que freqüência o programa verifica a temperatura e o status do UPS - defina-o para um segundo.

Os resultados são enviados para a nuvem a cada 5 minutos e as informações de diagnóstico - a cada hora.

# ConstantsDATA_SENDING_INTERVAL = 300 # seg DIAG_SENDING_INTERVAL = 3600 # seg POLL_INTERVAL = 1 # seg

Quando o status do UPS muda - não quero que meu dispositivo espere 5 minutos e envio os dados imediatamente. Então, eu modifiquei um pouco o loop principal e ele se parece com isto:

data_timer = 0diag_timer = 0 prevUPS = 'ONLINE' enquanto True: newUPS = ups_status () if (data_timer <= 0) ou (newUPS! = prevUPS): device.publish_data () data_timer = DATA_SENDING_INTERVAL prevUPS = newUPS se diag_timer <= 0: device.publish_diag () diag_timer = DIAG_SENDING_INTERVAL hibernar (POLL_INTERVAL) diag_timer - = POLL_INTERVAL data_timer - = POLL_INTERVAL

Teste: execute o script:

sudo python control.py

E posso ver o status do UPS na página do meu dispositivo.

Se eu desligar o UPS, o status muda em alguns segundos, então tudo está funcionando. Agora eu preciso iniciar o apcupsd e meu control.py na inicialização do sistema. O serviço Apcupsd é antigo e para iniciá-lo no raspbian moderno, devo modificar o arquivo /etc/init.d/apcupsd, adicionando estas linhas em algum lugar no topo:

### BEGIN INIT INFO # Fornece: apcupsd # Required-Start: $ all # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: # Breve descrição: APC UPS daemon… ### END INIT INFO #

Em seguida, ative o serviço:

sudo systemctl enable apcupsd

Em seguida, inicie o serviço:

sudo systemctl start apcupsd

Agora o apcupsd será iniciado na inicialização do sistema.

Para instalar control.py como um serviço, usei o script service_install.sh fornecido:

sudo bash service_install.sh ~ / cloud4rpi / control.py

Agora o serviço foi iniciado e deve sobreviver a uma reinicialização.

Etapa 5: Configurando um Painel de Controle

Configurando um Painel de Controle
Configurando um Painel de Controle

Cloud4rpi me permite configurar um painel de controle para meu dispositivo. Você pode adicionar “widgets” e vinculá-los a variáveis de dispositivo.

Meu dispositivo fornece duas variáveis somente leitura - RoomTemp e UPSStatus:

variáveis = {'RoomTemp': {'type': 'numeric', 'bind': ds_sensors [0]}, 'UPSStatus': {'type': 'string', 'bind': ups_status}}

Eu adicionei 3 widgets - Número para RoomTemp, Texto para UPSStatus e um Gráfico para RoomTemp.

Posso configurar alertas, então recebo um e-mail quando a temperatura está fora da faixa especificada, o UPS ficou off-line ou o próprio dispositivo não envia dados quando deveria. Agora posso ter certeza de que minha casa de campo está ok e posso ser notificado quando algo está errado, posso ligar para meus vizinhos e pedir que verifiquem o que está acontecendo. Aqui está o código real do control.py.

Recomendado: