Trabalhando com o monitoramento popular do Python com o Raspberry Pi

Tentando conectar meu sensor de temperatura DS18B20 à minha estufa inteligente , descobri que a Internet não possui instruções completas para conectar esse sensor através da linguagem de programação Python. Eu o uso desde que trabalho com a plataforma Raspberry Pi. Eu decidi resolver esse problema. Acontece que trabalhar com o TCP não é tão difícil, mas você precisa entender o que estamos fazendo e por quê. Uma dança de duas horas com um pandeiro claramente me irritou. Então aqui, além da parte do software, quero contar todo o algoritmo do começo ao fim. Eu acho que outros sensores funcionam da mesma forma, então um artigo grande será o mesmo para todos. Espero que, se você quiser conectar seu sensor, não precise de um pandeiro :) E então, vamos começar, peço o Habrokat.

Xamanismo com um sensor


Para nós, precisamos conectar o próprio sensor. Vou trabalhar com o sensor de temperatura DS18B20. Artigos completos sobre este tópico, não os duplicaremos. Você pode ler sobre a conexão aqui . Então precisamos obter dados do sensor. Faremos o mesmo como indicado no artigo acima. Há um ótimo exemplo de Python do qual sou fã.

import os tfile=open("/sys/bus/w1/devices/28-000000d7970b/w1_slave") ttext=tfile.read() tfile.close() temp=ttext.split("\n")[1].split(" ")[9] temperature=float(temp[2:])/1000 print temperature 

Não se esqueça de substituir os dados pelo seu sensor.

Como podemos ver, a temperatura assume a variável de temperatura (quem teria pensado), da qual precisaremos ainda mais.

Conjurar com monitoramento


Bem, primeiro você precisa registrar o narodmon.ru , aqueles que ainda não o fizeram. A API de serviço nos oferece transmitir dados através de TCP. Então vamos lá. Somos solicitados a transmitir o texto no seguinte formato:

 #MAC[#NAME][#LAT][#LNG][#ELE]\n #mac1#value1[#time1][#name1]\n ... #macN#valueN[#timeN][#nameN]\n ## 

Mas, na verdade, precisamos passar apenas três parâmetros: o MAC do dispositivo, o nome do sensor e seu valor. O resto não é necessário, e nós realmente não precisamos disso.

Na primeira linha, precisamos passar o retículo, o MAC e o caractere de avanço de linha \ n.
Na segunda linha e nas linhas subseqüentes, transferimos novamente a grade, o nome do sensor, novamente a grade e as leituras do sensor. Terminamos isso com o caractere de avanço de linha \ n.
Na última linha, você precisa passar duas grades para concluir o pacote.

Como resultado, o formato permanece o seguinte:

 #MAC\n #mac1#value1\n #macN#valueN\n ## 

Escrevendo um programa Python


Vamos escrever o programa em Python 2. O algoritmo será assim. Recebemos dados do sensor e os escrevemos na variável de temperatura. Em seguida, formamos o pacote e o enviamos ao People Monitoring Server. Executaremos o script a cada 10 minutos (o intervalo mínimo permitido para o envio de leituras é de 5 minutos) via cron.

O envio ocorre da seguinte maneira (exemplo no site de monitoramento):

Enviar código de script
 #!/usr/bin/env python2 # -*- coding: utf-8 -*- # by Roman Vishnevsky aka.x0x01 @ gmail.com import socket # MAC  .   ! DEVICE_MAC = '0123456789012' #  ,    01 (02)  mac  SENSOR_ID_1 = DEVICE_MAC + '01' SENSOR_ID_2 = DEVICE_MAC + '02' #  ,  float/integer sensor_value_1 = 20 sensor_value_2 = -20.25 #   sock = socket.socket() #   try: #    sock.connect(('narodmon.ru', 8283)) #       sock.send("#{}\n#{}#{}\n##".format(DEVICE_MAC, SENSOR_ID_1, sensor_value_1)) #       # sock.send("#{}\n#{}#{}\n#{}#{}\n##".format(DEVICE_MAC, SENSOR_ID_1, sensor_value_1, SENSOR_ID_2, sensor_value_2)) #   data = sock.recv(1024) sock.close() print data except socket.error, e: print('ERROR! Exception {}'.format(e)) 


Estamos conectados ao servidor narodmon.ru:8283

Como resultado, obtemos o seguinte script:

Código do script finalizado
 #!/usr/bin/env python2 # -*- coding: utf-8 -*- import socket import os import fnmatch # MAC  .   ! DEVICE_MAC = 'FF:FF:FF:FF:FF:FF' #  SENSOR_ID_1 = 'T1' SENSOR_ID_2 = 'T2' #   temperature = [] IDs = [] for filename in os.listdir("/sys/bus/w1/devices"): if fnmatch.fnmatch(filename, '28-031652ddbdff'): with open("/sys/bus/w1/devices/" + filename + "/w1_slave") as fileobj: lines = fileobj.readlines() if lines[0].find("YES"): pok = lines[1].find('=') temperature.append(float(lines[1][pok+1:pok+7])/1000) IDs.append(filename) else: logger.error("Error reading sensor with ID: %s" % (filename)) temperature2 = [] for filename in os.listdir("/sys/bus/w1/devices"): if fnmatch.fnmatch(filename, '28-011563e8d2ff'): with open("/sys/bus/w1/devices/" + filename + "/w1_slave") as fileobj: lines = fileobj.readlines() if lines[0].find("YES"): pok = lines[1].find('=') temperature2.append(float(lines[1][pok+1:pok+7])/1000) IDs.append(filename) else: logger.error("Error reading sensor with ID: %s" % (filename)) sock = socket.socket() # try: sock.connect(('narodmon.ru', 8283)) # ,        sock.send("#{}\n#{}#{}\n#{}#{}\n##".format(DEVICE_MAC, SENSOR_ID_1, str(temperature)[1:-1], SENSOR_ID_2, str(temperature2)[1:-1])) #  data=sock.recv(1024) sock.close() print data except socket.error, e: print('ERROR! Exception {}'.format(e)) print str(temperature)[1:-1] print str(temperature2)[1:-1] 


É assim que é o envio de dados de dois sensores. Se você der um nome ao sensor começando com T, o próprio servidor determinará que é um sensor de temperatura.

Agora precisamos adicionar o sensor ao cron. crontab -e : crontab -e e adicionamos a seguinte linha:

 */10 * * * * sudo python /home/pi/narod.py 

Estamos aguardando a execução do script.

Agora vamos aqui narodmon.ru/ip e ver se os dados foram transmitidos. Se tudo estiver em ordem, clique no botão "Adicionar dispositivo" na página principal do menu e especifique o MAC. Agora podemos personalizar tudo a gosto (nome, tipo, localização etc.). Você pode tornar o sensor público um dia após o início da transmissão do testemunho.

Isso é tudo. Desejo-lhe boa sorte na conexão de sensores. Faça isso com mais frequência, porque é muito conveniente em casa ver a temperatura com antecedência no local para onde está indo.

Vejo você de novo :)

Source: https://habr.com/ru/post/pt401313/


All Articles