Главная > Умный дом > Domoticz + скрипт на Python 3, публикация на Народный мониторинг

Domoticz + скрипт на Python 3, публикация на Народный мониторинг


17 августа 2019. Разместил: dimon
Все изображения кликабельны


Захотелось мне вывести данные с датчиков 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 модули и версии, модуль requestsPython модули и версии, модуль requests


Если пакет не найден, то устанавливаем:
sudo pip install requests


Переходим в папку со скриптами:

cd domoticz/
cd scripts/
cd python/


создаем файл:

> dz2nm-socket.py


даем права на исполнение:

chmod +x dz2nm-socket.py


Права на исполнения в Linux для Питон скриптаПрава на исполнения в 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-адрес, что и в нашем скрипте:

Добавить датчик по mac на народный мониторинг


Датчики возможно добавить только после того как наш сервер отдаст хоть какие-то значения Народному мониторингу. Когда данный туда будут переданы мы увидим такую форму на сайте и сможем отредактировать описание, название, уровень моря, адрес и другие параметры:

Народный мониторинг, добавление датчиковНародный мониторинг, добавление датчиков


Теперь осталось добавить наш скрипт в планировщик Raspberry Pi, чтобы она автоматически раз в 15 минут слада данные из Домотокз на Народный мониторинг:

crontab -e

*/15 * * * * python3 /home/pi/domoticz/scripts/python/dz2nm-socket.py


Потом ждем 24 часа и делаем наши датчики публичными, чтобы их могли видеть другие пользователи Народного мониторинга:

Публикация датчиков Народного мониторингаПубликация датчиков Народного мониторинга

Вернуться назад