Все изображения кликабельны
Захотелось мне вывести данные с датчиков Domoticz на Народный мониторинг, но на сайте в справке
API передачи показаний почему-то есть скрипт только на python2. Как оказалось Python 3 отличается от Python 2 очень даже. Потребовался целый вечер и полбутылки виски чтобы разобраться и сваять скрипт, который будет брать данные с датчика Домотикз и класть их на Народный мониторинг (
narodmon.ru)
С первого взгляда все кажется элементарно, скрипт есть в справке Народного монитора. Но в реальности все оказывается не так уж и радужно. Скрипт написан на Python 2, а у нас на малинке с Domoticz давно уже Python обновился до версии 3.
Сначала проверим что же у нас на самом деле есть:
pi@raspberrypi:~ $ python --version
Python 2.7.9
pi@raspberrypi:~ $ python3 --version
Python 3.4.2
pi@raspberrypi:~ $
Проверяем также наличие модуля
requests в Python
pi@raspberrypi:~ $ pip show requests
---
Name: requests
Version: 2.4.3
Location: /usr/lib/python2.7/dist-packages
Requires:
pi@raspberrypi:~ $
Python модули и версии, модуль requestsЕсли пакет не найден, то устанавливаем:
sudo pip install requests
Переходим в папку со скриптами:
cd domoticz/
cd scripts/
cd python/
создаем файл:
> dz2nm-socket.py
даем права на исполнение:
chmod +x dz2nm-socket.py
Права на исполнения в Linux для Питон скриптаТеперь нам нужно понять что может выдать наш датчик.
В моем случае это совмещенный датчик тепературы и влажности Xiaomi. Датчик размещен на улице, скрыл от прямых солнечных лучей и имееет idx в Domoticz 66. Проверим что же мы можем получит с этого датчика через запрос json, для этого в адресной строке браузера вводим адрес -
https://admin:password@ip_dz/json.htm?type=devices&rid=66, где
admin - логин пользователя Dz
password - пароль пользователя Dz
ip_dz - ip устройства где крутится наш сервер Dz
В результате мы должны получить примерно такой ответ:
{
"ActTime" : 1565979237,
"AstrTwilightEnd" : "00:00",
"AstrTwilightStart" : "00:00",
"CivTwilightEnd" : "21:42",
"CivTwilightStart" : "04:25",
"DayLength" : "15:36",
"NautTwilightEnd" : "22:56",
"NautTwilightStart" : "03:10",
"ServerTime" : "2019-08-16 21:13:57",
"SunAtSouth" : "13:03",
"Sunrise" : "05:15",
"Sunset" : "20:51",
"app_version" : "4.11074",
"result" : [
{
"AddjMulti" : 1.0,
"AddjMulti2" : 1.0,
"AddjValue" : 0.0,
"AddjValue2" : 0.0,
"BatteryLevel" : 255,
"CustomImage" : 0,
"Data" : "15.8 C, 67 %",
"Description" : "",
"DewPoint" : "9.68",
"Favorite" : 1,
"HardwareID" : 2,
"HardwareName" : "lumi-gateway-v3_miio",
"HardwareType" : "Xiaomi Gateway",
"HardwareTypeVal" : 95,
"HaveTimeout" : false,
"Humidity" : 67,
"HumidityStatus" : "Wet",
"ID" : "0ВВВ",
"LastUpdate" : "2019-08-16 20:54:45",
"Name" : "T&H Улица",
"Notifications" : "false",
"PlanID" : "6",
"PlanIDs" : [ 6 ],
"Protected" : false,
"ShowNotifications" : true,
"SignalLevel" : "-",
"SubType" : "LaCrosse TX3",
"Temp" : 15.800000000000001,
"Timers" : "false",
"Type" : "Temp + Humidity",
"TypeImg" : "temperature",
"Unit" : 2,
"Used" : 1,
"XOffset" : "861",
"YOffset" : "11",
"idx" : "66",
"trend" : 0
}
],
"status" : "OK",
"title" : "Devices"
}
В данном случае нас интересуют поля
Temp и
Humidity, которые мы и будем передавать в Народный мониторинг.
Открываем, созданный ранее файл dz2nm-socket.py, и пишем в него код:
# Скрипт с помощью модуля Питона request и запроса json запрашивает
# данные избранного датчика у Domoticz и отправляет часть из них на
# сервис Народный мониторинг (narodmon.ru)
# Автор tudimon.com
# подключаем модули
import requests
import socket
import urllib3
# отключим предупреждения
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
ip = '127.0.0.1' # ip-адрес Domoticz
port = '433' # порт
user = 'dz_user' # пользователь Dz
password = 'dz_user_password' # пароль пользователя
idx = 66 #номер датчика в Domoticz, который будем опрашивать
# Строка запроса если нужна авторизация
#get_url = 'http://'+user+':'+password+'@'+ip+':'+port+'/json.htm?type=devices&rid={}'.format(idx)
# Строка запроса если не нужна авторизация
# в случае если скрипт выполняется на том же устройстве что и Dz и в
# Настройки - Настройки - Система
# Локальные сети (без имени/пароля) указан ip адрес localhost
get_url = 'https://'+ip+'/json.htm?type=devices&rid={}'.format(idx)
# для теста выведем строку подключения в консоль Pi
#print ('================================')
#print (get_url)
#print ('================================')
# ================= запрос данных от Domoticz =====================
# запрос данных избранного датчика
get_data = requests.get(get_url, verify=False).json()
# ключ verify=False пришлось добавить потому что у меня Dz работает только на 433 порту
# а SSL сертификат самоподписанный, соответственно request ругался на ошибку сертификата
# ответ придет в виде JSON, где необходимо выбрать интересующее поле,
# например температура, влажность и уровень заряда батарейки
humidity = get_data['result'][0]['Humidity']
temperature = get_data['result'][0]['Temp']
batt_level = get_data['result'][0]['BatteryLevel']
#Выведем данные в консоль pi
#print ("Влажность " + str(humidity))
#print ("Температура " + str(temperature))
#print ("Заряд батарейки " + str(batt_level))
# после окончания тестирования строки закомментированы
# ============== передача данных в сервис narodmon ==================
# MAC адрес устройства. Заменить на свой!
DEVICE_MAC = 'ffffffffff' # MAC WiFi dz Raspberry Pi
# идентификатор устройства, для простоты добавляется 01 (02) к mac устройства
SENSOR_ID_1 = 'dz_t'
SENSOR_ID_2 = 'dz_h'
# значения датчиков, тип float/integer
sensor_value_1 = temperature
sensor_value_2 = humidity
# создание сокета
sock = socket.socket()
# обработчик исключений
try:
# подключаемся к сокету
sock.connect(('narodmon.ru', 8283))
# формируем строку для сокета при единичном значении датчика
#s_sock = ("#{}\n#{}#{}\n##".format(DEVICE_MAC, SENSOR_ID_1, sensor_value_1))
#формируем строку для сокета при множественные значение датчиков
s_sock = ("#{}\n#{}#{}\n#{}#{}\n##".format(DEVICE_MAC, SENSOR_ID_1, sensor_value_1, SENSOR_ID_2, sensor_value_2))
# Пишем строку с консоль для контроля
#print('======================================')
#print(s_sock)
#print('======================================')
# после окончания тестирования строки закомментированы
# Пишем в сокет
sock.send(s_sock.encode('utf8'))
# читаем ответ
data = sock.recv(1024)
sock.close()
# print (data)
except socket.error as e:
print('ERROR! Exception {}'.format(e))
Теперь идем на Народный мониторинг и в разделе
Профиль - Мои датчики - Добавить добавляем наш датчик. Необходимо указать тот же MAC-адрес, что и в нашем скрипте:
Датчики возможно добавить только после того как наш сервер отдаст хоть какие-то значения Народному мониторингу. Когда данный туда будут переданы мы увидим такую форму на сайте и сможем отредактировать описание, название, уровень моря, адрес и другие параметры:
Народный мониторинг, добавление датчиковТеперь осталось добавить наш скрипт в планировщик Raspberry Pi, чтобы она автоматически раз в 15 минут слада данные из Домотокз на Народный мониторинг:
crontab -e
*/15 * * * * python3 /home/pi/domoticz/scripts/python/dz2nm-socket.py
Потом ждем 24 часа и делаем наши датчики публичными, чтобы их могли видеть другие пользователи Народного мониторинга:
Публикация датчиков Народного мониторинга