Пытаясь подключить свой датчик температуры DS18B20 к своей умной теплице, я обнаружил, что в интернете нет полной инструкции по подключению этого датчика посредством языка программирования Python. Использую его, так как работаю с платформой Raspberry Pi. Я решил эту проблему устранить. Оказывается работать с TCP не так сложно, но нужно понимать, что и для чего мы делаем. Двухчасовой танец с бубном меня явно выбесил. Так что здесь, помимо самой программной части, я хочу рассказать весь алгоритм от начала до конца. Думаю, что другие датчики работают похоже, поэтому большая статьи будет для всех одинакова. Надеюсь, что если вы захотите подключить свой датчик, Вам уже бубен не понадобится:) И так, давайте приступим, прошу Вас под Хаброкат.
Шаманство с датчиком
Для на нужно подключить сам датчик. Я буду работать с датчиком температуры DS18B20. Статей на эту тему полно, не будем их дублировать. Про подключение можно почитать здесь. Затем нам нужно получить данные с датчика. Мы сделаем так же, как указано в статье выше. Там есть замечательный пример на Python, фанатом которого я являюсь.
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
Не забываем заменить данные на свой датчик.
Как мы можем заметить, значение температуры принимает переменная temperature (кто бы мог подумать), что и понадобится нам дальше.
Колдуем с мониторингом
Ну во первых нужно зарегистрироваться narodmon.ru, тем, кто ещё это не сделал. API сервиса предлагает нам передавать данные по протоколу TCP. Так и поступим. Нас просят передать текст следующего формата:
#MAC[#NAME][#LAT][#LNG][#ELE]n
#mac1#value1[#time1][#name1]n
...
#macN#valueN[#timeN][#nameN]n
##
Но по факту нам нужно передать всего три параметра: MAC устройства, имя датчика и его значение. Остальное не обязательно, и не очень нам нужно.
В первой строке нам нужно передать решётку, MAC и символ перевода строки n.
Во второй и последующих строках мы опять передаём решётку, имя датчика, опять решётка и показания датчика. Завершаем это символом перевода строки n.
В последней строке надо передать две решётки, для завершения пакета.
В итоге формат остаётся таким:
#MACn
#mac1#value1n
#macN#valueNn
##
Пишем программу на Python
Программу мы будем писать на Python 2. Алгоритм будет такой. Получаем данные с датчика и записываем в переменную temperature. Затем мы формируем пакет и отправляем его на сервер Народного Мониторинга. Запускать скрипт будем каждые 10 минут (минимальный разрешённый интервал отправки показаний 5 минут) через cron.
Отправка происходит так (пример приведённый на сайте мониторинга):
#!/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))
Подключаемся мы к серверу narodmon.ru:8283
В итоге у нас получается вот такой скрипт:
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import socket
import os
# 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#{}#{}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]
Вот так выглядит отправка данных с двух датчиков. Если дать датчику название, начинающееся на T, то сервер сам определит, что это датчик температуры.
Теперь нам нужно добавить датчик в cron. Набираем: crontab -e
и добавляем туда вот такую строчку:
*/10 * * * * sudo python /home/pi/narod.py
Ждём пока скрипт запустится.
Теперь идём сюда narodmon.ru/ip и смотрим передались ли данные. Если всё в порядке, то нажимаем на главной странице в меню кнопку «Добавить устройство» и указываем MAC. Теперь мы можем всё настроить по вкусу (название, тип, местоположение и т.д.). Сделать датчик публичным можно через сутки после начала передачи показаний.
На этом всё. Желаю Вам удачи в подключение датчиков. Делайте это чаще, ведь так удобно из дома заранее посмотреть температуру в том месте, куда ты собираешься.
До новых встреч :)
Автор: nikitos_2002