Domoticz. Данные о погоде с сайта narodmon.ru


Получаем погодные данные с датчиков пользователей сайта народного мониторинга narodmon.ru.

Для работы нам потребуется Python.

Установим необходимые пакеты:

sudo apt-get install python2.7
sudo apt-get install python-pip
sudo apt-get install python-dev libgmp-dev
sudo apt-get install git

Для того чтобы использовать API narodmon.ru необходимо получить API ключ.

Регистрируемся на сайте narodmon.ru.

Войдите на сайт под своим логином. Перейдите в "Софт" - "Мои приложения для narodmon.ru":

Создайте API ключ, кликнув на "Новый ключ" и введя произвольное название ( например - domoticz):

Запишите значение поля "Ключ API".

Выберите на карте интересующую вас погодную станцию:

Создайте файл narodmon.py в произвольной папке и дайте права на исполнение командой:

sudo chmod +x /home/pi/domoticz/scripts/python/narodmon.py

Добавьте в файл следующий код, изменив параметры следуя комментариям:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import urllib2
import uuid
import json
import hashlib

api_key = 'Gm********z'  #Введите ваш API ключ, полученный ранее
id = 1089 #Введите ID выбранной погодной станции

app_id = str(uuid.getnode())
md5_app_id = hashlib.md5(app_id).hexdigest()

data = {
'cmd': 'sensorsOnDevice',
'id': id,
'uuid': md5_app_id,
'api_key': api_key,
'lang': 'ru'
}

request = urllib2.Request('http://narodmon.ru/api', json.dumps(data))
response = urllib2.urlopen(request)
result = json.loads(response.read())
print json.dumps(result, indent=4, sort_keys=True)

Скрипт посылает запрос на сервер narodmon. Ответ получаем в формате:

ОТВЕТ сервера:
id ID устройства в проекте;
owner имя владельца устройства в проекте;
name название устройства или его размещение (если нет названия) или его MAC (для владелеца);
location местонахождение устройства, населенный пункт или область;
distance расстояние в км от текущего местонахождения пользователя;
liked количество положительных отзывов пользователей;
uptime % времени непрерывной работы за последние 30 дней;
sensors массив датчиков подключенных к указанному устр-ву;
sensors[id] целочисленный код датчика в проекте;
sensors[pub] = 1, если датчик публичный и = 0, если датчик приватный;
sensors[type] код типа датчика из справочника sensorType;
sensors[name] название датчика или его ID (если нет названия);
sensors[value] последнее показание датчика;
sensors[unit] единица измерения;
sensors[time] время последнего показания датчика в UnixTime;
sensors[changed] время последнего изменения показаний датчика в UnixTime;
sensors[trend] коэффициент линейного роста показаний датчика за последний час, рассчитанный по МНК.

Запустите скрипт на исполнение командой (из папки со скриптом, иначе укажите полный путь до файла):

./narodmon.py

Если все сделано верно получим следующий результат:

В данном случае увидим, что сервер передает массив датчиков sensors, включающий в себя 4 датчика (температура, влажность, давление, освещение).

Идентифицируйте нужные датчики по полю 'unit' в массиве sensors.

В данном случае 0-ой элемент массива содержит информацию о температуре, 1-ый - влажность, 2-ой - давление, 3-ий - освещение.

В качестве примера добавим в Domoticz датчик температуры (для остальных датчиков действия аналогичные).

Создадим виртуальный датчик температуры в Domoticz (подробнее тут):

Обновление информации датчика температуры через json происходит в формате:

/json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=TEMP
  • IDX = id of your device (This number can be found in the devices tab in the column "IDX")
  • TEMP = Temperature

IDX - номер созданного датчика ( в данном случае 60)

TEMP - значение температуры

Отредактируй скрипт:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import urllib2
import urllib
import uuid
import json
import hashlib

api_key = 'Gm********z'
id = 1089

app_id = str(uuid.getnode())
md5_app_id = hashlib.md5(app_id).hexdigest()

data = {
'cmd': 'sensorsOnDevice',
'id': id,
'uuid': md5_app_id,
'api_key': api_key,
'lang': 'ru'
}

request = urllib2.Request('http://narodmon.ru/api', json.dumps(data))
response = urllib2.urlopen(request)
result = json.loads(response.read())

val = result['sensors'][0]['value'];

url = 'http://USER:PASSWORD@192.***.*.**:8080/json.htm?type=command&param=udevice&idx=60&nvalue=0&svalue=%s' % val

request = urllib.urlopen(url);

Измените API ключ, ID станции, логин и пароль Domoticz, IDx датчика температуры.

Обратите внимание что в скрипт добавилась строка import urllib.

В завершении создайте в Domoticz сценарий, который вызывает скрипт narodmon.py каждые 5 минут:

function timedifference(timestamp)
y, m, d, H, M, S = timestamp:match("(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)")
difference = os.difftime(os.time(), os.time{year=y, month=m, day=d, hour=H, min=M, sec=S})
return difference
end

commandArray = {}
s = otherdevices_lastupdate['Температура_NM']
if(timedifference(s) > 300) then
os.execute ("/home/pi/domoticz/scripts/python/narodmon.py")
end
return commandArray

Скрипты на Python 3 от Леонида

Для конкретного датчика:

#!/usr/bin/env python3.5
# -*- coding: utf-8 -*-
import urllib.request, urllib.error, urllib.parse
import json
import hashlib
import uuid

api_key = ‘ffddccFFDDCCddd’ #Ваш ключ API
id = 1234 #Номер желаемого датчика
app_id = str(uuid.getnode())
md5_app_id = hashlib.md5(app_id.encode(‘utf-8’)).hexdigest()
data = {
‘cmd’: ‘sensorsOnDevice’,
‘id’: id,
‘uuid’: md5_app_id,
‘api_key’: api_key,
‘lang’: ‘ru’
}

try:
request = urllib.request.Request(‘http://narodmon.ru/api’, json.dumps(data).encode(«utf-8»))
response = urllib.request.urlopen(request)
buf = response.read()
result = json.loads(buf.decode(‘utf-8’))
print((json.dumps(result, indent=4, sort_keys=True)))

except urllib.error.URLError as e:
print(‘HTTP error:’, e)

except (ValueError, TypeError) as e:
print(‘JSON error:’, e)

Для ближайших датчиков:

#!/usr/bin/env python3.5
# -*- coding: utf-8 -*-
import urllib.request, urllib.error, urllib.parse
import json
import hashlib
import uuid

# ключ API для разработчика, получаемый в Мои данные \ Мои ключи API после регистрации в проекте.
# заменить на свой!
api_key = ‘Z2pXAuaB8rbzR’

# генерация уникального ID приложения
app_id = str(uuid.getnode())
md5_app_id = hashlib.md5(app_id.encode(‘utf-8’)).hexdigest()

# формирование тела JSON
data = {
‘cmd’: ‘sensorsNearby’,
‘uuid’: md5_app_id,
‘api_key’: api_key,
‘radius’: 11,
‘lat’: 55.75,
‘lng’: 37.62,
‘lang’: ‘ru’
}

# обработчик исключений
try:
# запрос
request = urllib.request.Request(‘http://narodmon.ru/api’, json.dumps(data).encode(«utf-8»))
response = urllib.request.urlopen(request)

# работа с JSON
buf = response.read()
result = json.loads(buf.decode(‘utf-8’))
#result = json.loads(response.read())

# вывод всего массива