Сделать стартовойДобавить в закладки  
Главная страничка Главная страничка
В номере:

Выходит с 17 июля 2008 г. цена договорная

Опрос

Windows Mobile
Symbian
Android
iPhone
Linux
другая
не знаю
у меня обычный телефон



Календарь
«    Август 2019    »
ПнВтСрЧтПтСбВс
 1234
567891011
12131415161718
19202122232425
262728293031 

Архив новостей
Август 2019 (2)
Июль 2019 (2)
Май 2019 (2)
Март 2019 (1)
Январь 2019 (1)
Декабрь 2018 (1)

Информация
Domoticz + скрипт на Python 3, публикация на Народный мониторинг
Умный дом
автор: dimon, опубликовано: 17 августа 2019

Все изображения кликабельны


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

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 часа и делаем наши датчики публичными, чтобы их могли видеть другие пользователи Народного мониторинга:

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

 
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Чтобы Вам были доступны все функции Вам необходимо либо зарегистрироваться, либо зайти на сайт под своим именем.

Другие новости по теме:

  • Добавление RF 433МГц датчиков дыма/газа/протечки к Domoticz
  • Domoticz. Включаем гирлянду по датчику Xiaomi Flower Monitor
  • Domoticz и UPS APC
  • Domoticz. Уведомление о низком уровне батарее датчиков
  • Domoticz. Ежедневное уведомление на e-mail с показаниями всех датчиков Xiao ...


  • Комментарии:

    Оставить комментарий



     
    Информация
     
    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


    Поиск по сайту:


    Облако тегов
    Android, Arduino, backup, CentOS, cmd, css, div, DLE, DLE хаки, domoticz, dzvents, Linux, log, LUA, Monster, ogf3, RDP, Template, VBS, w2k8, windows, WSH, бумага, бумажный самолетик, верстка, иструкция, Карты, кино, Навигация, оригами, программа, рецензия, рецепт, скрипт, уведомления, фигуры, шаблон, Яндекс, яндекс-карты

    Показать все теги
    Реклама
    раскрутка сайта бесплатно
    Главная страница | Регистрация | Добавить новость | Новое на сайте | Статистика | Поддержка | Правила ресурса Copyright © 2005-2018 by dimon - all right reserved!
    Тираж:           экземпляров.   Дизайн, верстка by dimon