
Шаманство с датчиком

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.
В последней строке надо передать две решётки, для завершения пакета.
В итоге формат остаётся таким:
#MAC\n
#mac1#value1\n
#macN#valueN\n
##
Пишем программу на 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
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]
Вот так выглядит отправка данных с двух датчиков. Если дать датчику название, начинающееся на T, то сервер сам определит, что это датчик температуры.
Теперь нам нужно добавить датчик в cron. Набираем:
crontab -e
и добавляем туда вот такую строчку:*/10 * * * * sudo python /home/pi/narod.py
Ждём пока скрипт запустится.
Теперь идём сюда narodmon.ru/ip и смотрим передались ли данные. Если всё в порядке, то нажимаем на главной странице в меню кнопку «Добавить устройство» и указываем MAC. Теперь мы можем всё настроить по вкусу (название, тип, местоположение и т.д.). Сделать датчик публичным можно через сутки после начала передачи показаний.
На этом всё. Желаю Вам удачи в подключение датчиков. Делайте это чаще, ведь так удобно из дома заранее посмотреть температуру в том месте, куда ты собираешься.
До новых встреч :)