Разобраться с сервисом narodmon.ru меня сподвигла статья Погода с сервиса NarodMon в HomeKit с помощью Node-Red. Раньше я периодически заходил на этот сайт посмотреть реальную температуру с датчика в своем городе.
Почему бы не добавить свой датчик и не отправлять данные на этот сервис? - подумал я, и приступил к реализации.
Что понадобится сделать?
- Собрать устройство.
- Прошить.
- Настроить подключение сенсора.
- Настроить связь межу ESP8266 и сервисом NarodMon.ru.
Собираем устройство
Итак, нам понадобятся:
- ESP8266 nodeMCU - куда же без нее (подойдет и любая другая плата на базе ESP8266).
- Обычный датчик температуры DS18B20 в металлической колбе, но подойдет и любой другой (важно, чтобы был уличный).
- Блок питания 5в.
Схема подключения проста до безобразия, датчик имеет три пина для подключения. Подключаем:
DS18B20ESP8266 nodeMCUКрасный3.3ЧерныйGNDЖелтыйRX
WiFi-IoT
Встроенную в прошивку функцию транслирования данных на narodmon.ru имеет прошивка WiFi-IoT, с неё и начнем. Заходим на сайт, и конфигурируем прошивку таким образом:
Можете даже не утруждать себя делать предыдущий шаг и просто взять готовую скомпилированную прошивку, я за вас сделал эту работу, туда же положил и прошивальщик.
Качаем архив, распаковываем, подключаем ESP8266 к компьютеру при помощи кабеля USB - microUSB, запускаем FlashESP8266.exe, указываем COM порт и наш файл прошивки. Жмем кнопку Flash и ждем окончания процесса.
Перезагружаем наше устройство, сканируем открытую сеть Wi-Fi и подключаемся к ней. Далее необходимо открыть в браузере адрес: 192.168.4.1, попадаем на страницу нашей прошивки WiFi-IoT.
Сразу же переходим на вкладку Main и настраиваем Wi-FI подключение со своим роутером. Указываем:
- AP name: SSID вашего роутера.
- AP pass: пароль.
Нажимаем кнопку "Set" и ждем, пока устройство перезагрузится.
В настройках роутера смотрим, какой адрес выдал нам DHCP сервер, и открываем его.
Приступим к настройке датчика. Для этого открываем вкладку Hardware, и ставим галочку на против "Enable DS18B20", при этом GPIO оставляем 3. Нажимаем на кнопку "Set". Я же подключил к своей ESP еще и второй датчик DHT22, поэтому включил и его. После этих действий возвращаемся на вкладку Main, а оттуда переходим на вкладку 1-ware.
Датчик DHT22 - расположен в квартире.
Датчик DS18B20 - на улице.
Приступим к настройке постинга нашей температуры на сервис narodmon.ru. Для этого открываем вкладку Servers и ставим галочку напротив "Enable NarodMon.ru send", время так и оставляем 5 минут. Ниже видим ID нашего устройства, он нам понадобится для добавления датчика на самом сайте NarodMon, поэтому копируем его в буфер обмена.
Открываем сайт Народного мониторинга NarodMon.ru, и сразу видим наш датчик, пока еще без данных. Логинимся на сайте и добавляем его на свой аккаунт, здесь все максимально просто и интуитивно понятно. При этом, в поле MAC необходимо вставить содержимое нашего буфера обмена, а точнее - ID из скриншота выше.
Хочу вас поздравить - датчик привязан и уже отправляет данные на сайт. Посмотреть, как выглядит мой датчик, можно по ссылке.
Добавляем датчик по MQTT
Для добавления датчика по MQTT, необходимо прослушать топик в таком виде: admin/#
Получив топик, мы с легкостью сможем добавить его в любую альтернативную систему домашний автоматизации, будь то HomeBridge, HomeAssistant, MajorDoMo...
Приведу пример конфига для добавления в HomeBridge:
{ "accessory": "mqttthing", "type": "temperatureSensor", "name": "Температура Двор", "url": "mqtt://127.0.0.1", "username": "admin", "password": "admin", "topics": { "getCurrentTemperature": "admin/ESP002A6F83/dsw1" }, "history": true }
Также могу привести пример и для Home Assistant:
- platform: mqtt name: "Dvor_Temperature" state_topic: "admin/ESP002A6F83/dsw1" unit_of_measurement: '°C'
ESP Easy
А как же быть с любимой мною ESP Easy? - сразу задался я вопросом и пошел гуглить. А все оказывается намного проще - необходимо просто добавить скрип в Rules, который будет оправлять данные с ESP на Народный мониторинг. Итак, обо все по порядку.
Как заливать прошивку и как добавлять устройства в ESP Easy, я рассказывать не буду, можно открыть одну из моих предыдущих статей на данную тему, там это уже много раз описано.
Сразу начну с того, что у нас есть ESP, к ней подключены датчики, и мы хотим отправлять данные на NarodMon.ru. Чтобы было понятнее, приведу скрин с девайсами.
Первое, что необходимо сделать, это добавить вкладку Rules, если у вас до сих пор ее нет. Открываем Tools -> Advanced, и ставим галочку напротив Rules. После чего у нас появилась новая вкладка, вот и кликаем по ней. Далее я приведу скрипт, который будет постить сообщения на Народный мониторинг, раз в 300 сек (каждые 5 минут).
On System#Boot do //When the ESP boots, do timerSet,1,10 //Set Timer 1 for the next event in 10 seconds endon On Rules#Timer=1 do //When Timer1 expires, do SendToHTTP narodmon.ru,80,/get?ID=BATYUSHINXXXXXXX&T1=[dht22#Temperature]&H1=[dht22#Humidity] timerSet,1,300 //Resets the Timer 1 for another 360 seconds endon
Разберем этот скрипт, а точнее нас интересует только строка, которая начинается: SendToHTTP. Нам необходимо подставить свои данные, а именно:
- ID=BATYUSHINXXXXXXX - Придумываем свой ID, важно, чтобы он был уникальным;
- T1 - Название датчика, я взял сокращенно T1 - температура, датчик первый.
Далее в квадратных скобках:
- dht22 - имя девайса, смотрите скриншот выше;
- Temperature - значение Values, смотрим там же на скришоте;
- & - знак, после которого можно по аналогии добавить следующий датчик.
После того, как скрипт написан, нажимаем кнопку Submit. Перезагружаем наше устройство (можно через Web интерфейс).
Как и в предыдущем способе с прошивкой WiFi-IoT, заходим на сайт NarodMon.ru и видим наш датчик. Повторяться не стану и единственное, на что хочу обратить внимание - это то, что MAC адрес для сопряжения это и есть наш ID (в моем случае это "BATYUSHINXXXXXXX").
LifeHack #1
Собираем все датчики на одну ESP, откуда транслируем на Народный мониторинг. В итоге получаем вот такую портянку устройств со всеми датчиками, но зато одним устройством.
Реализовать это можно двумя способами:
- Способ 1. В ESP Easy есть такой девайс, как "Generic - MQTT Import", он собирает MQTT топики.
- Способ 2. Я описывал в статье, как можно заставить ESP Easy обмениваться данными по протоколу UDP.
LifeHack #2
Собрав похожую портянку как в предыдущем варианте, туда же можно включить не только датчики, но и состояния реле. Все это удобно отображается на графике. Теперь можно отслеживать, когда был включен свет или когда было движение.
Кстати, дополнение к лайфаку - графики можно объединять и выводить сразу несколько.
Вот, например, график моего датчика температуры и датчика, расположенного в моем городе километра 3 от меня.
LifeHack #3
Уличный датчик спустя сутки его работы можно открыть для публичного использования. На сайте Народного мониторинга, открываем Профиль -> Мои датчики, и меняем доступ на публичный.
Мой датчик доступен по адресу.
LifeHack #4 или погода в Телеграме
Как пройти авторизацию - смотрите скриншот, специально вышел и вошел, чтобы показать вам (Код "319913" придет вам на почту).
Забираем данные с чужих датчиков и отправляем себе в Дом
Ну а что делать, если вам не хочется заморачиваться с DIY, или на карте датчик расположен неподалеку от вас и вы хотите получать данные с него и оправлять себе в Apple HomeKit? И на этот вопрос у меня есть ответ. Реализовать это можно двумя способами.
Способ 1. При помощи плагина HomeBridge Http Webhooks
Нам необходимо:
Установленная система HomeBridge.Установить плагин "Homebridge Http Webhooks", через Web-UI или по SSH;npm install -g homebridge-http-webhooks
- Добавить в конфиг платформу:
{ "platform": "HttpWebHooks", "webhook_port": "51111", "cache_directory": "/home/pi/.homebridge/.node-persist/storage", "sensors": [ { "id": "temp", "name": "Температура", "type": "temperature" }, { "id": "hum", "name": "Влажность", "type": "humidity" } ] }
После чего перезагружаем бридж и видим два датчика с нулевыми показаниями.
- Далее нам необходимо Зарегистрироваться на сайте Narodmon.ru, если вы этого еще не сделали, и получить ключ.
Дальше нам необходимо получить еще один ключ на сайте http://www.md5.cz/.
Открываем сайт, нажимаем на кнопку "hash darling. hash!" и сохраняем полученный ключ.
В моем случае - это "d41d8cd98f00b204e9800998ecf8427e"
- Теперь нам необходимо создать скрипт, который будет забирать данные с Narodmon.ru и передавать их в Apple HomeKit.
Создадим папку и поместим в нее файл нашего будущего скрипта.
mkdir /home/pi/.homebridge/script nano /home/pi/.homebridge/script/narodmon.sh
В открывшемся редакторе вставляем содержимое, предварительно подставив свои данные. А именно, нас интересует:
hbip='ip адрес устройства, на котором установлен homebridge'
hbport='порт, который был указан в конфиге'
apikey='API ключ, тот, который мы получали на сайте narodmon.ru'
uuid='Key, полученный на сайте md5.cz'
Как получить temid и humid я покажу ниже.
#!/bin/bash hbip='127.0.0.1' hbport='51111' apikey='rXp10txXXXXXXX' uuid='d41d8cd98f00b204e9800998ecf8427e' tempid='1750' humid='1750' temp=$(curl -s --data "cmd=sensorsOnDevice&api_key=$apikey&uuid=$uuid&id=$tempid&lang=en" https://narodmon.ru/api | python -m json.tool | grep -A 2 u00b0 | grep value | awk '') hum=$(curl -s --data "cmd=sensorsOnDevice&api_key=$apikey&uuid=$uuid&id=$humid&lang=en" https://narodmon.ru/api | python -m json.tool | grep -A 2 % | grep value | awk '') echo $temp echo $hum curl -X GET "http://$hbip:$hbport/?accessoryId=temp&value=$temp" curl -X GET "http://$hbip:$hbport/?accessoryId=hum&value=$hum"
Дополняем наш скрипт последней недостающей информацией, сохраняем нажатием "Ctrl O" "Y" и выходим "Ctrl X".
Еще один небольшой ЛайфХак. Датчики можно использовать разные и при желании можно добавить несколько однотипных, дополнив скрип и конфиг.
Даем права и можно запускать наш скрипт, для этого:
chmod x /home/pi/.homebridge/bashscript/narodmon.sh /home/pi/.homebridge/script/narodmon.sh
- Остался единственный шаг - это добавить данный скрипт в cron для того, чтобы он запускался циклически каждые 10 минут. Для этого:
crontab -e
*/10 * * * * /home/pi/.homebridge/script/narodmon.sh
Способ 2. Для любителей MQTT
Если вы, как и я, не очень любите устанавливать дополнительные плагины, без которых можно и так обойтись, значит этот вариант для вас. Также этот вариант подойдет любому, кто пользуется передачей данных по MQTT.
Ниже приведу скрипт, который забирает данные с NarodMon и отдает их по MQTT в виде топиков narodmon/temp и narodmon/hum.
#!/bin/bash apikey='rXp10txXXXXXXX' uuid='d41d8cd98f00b204e9800998ecf8427e' tempid='1091' humid='1091' temp=$(curl -s --data "cmd=sensorsOnDevice&api_key=$apikey&uuid=$uuid&id=$tempid&lang=en" https://narodmon.ru/api | python -m json.tool | grep -A 2 u00b0 | grep value | awk '') hum=$(curl -s --data "cmd=sensorsOnDevice&api_key=$apikey&uuid=$uuid&id=$humid&lang=en" https://narodmon.ru/api | python -m json.tool | grep -A 2 % | grep value | awk '') mqtthost='127.0.0.1' mqttport='1883' mqttuser='admin' mqttpass='admin' mqtttopic='narodmon' mosquitto_pub -h $mqtthost -p $mqttport -u $mqttuser -P $mqttpass -t $mqtttopic/temp -m $temp mosquitto_pub -h $mqtthost -p $mqttport -u $mqttuser -P $mqttpass -t $mqtttopic/hum -m $hum
Тут также необходимо поправить все под себя, а также поправить настройки MQTT брокера.
Добавление Атмосферного давления в Apple HomeKit
Дальше я решил считать данные Атмосферного давления и передать их в Apple HomeKit. Поправляем наш скрип, тем самым, добавив в него считывания данных и еще одну переменную.
#!/bin/bash apikey='rXp10txXXXXXXX' uuid='d41d8cd98f00b204e9800998ecf8427e' tempid='1091' humid='1091' pressid='1750' temp=$(curl -s --data "cmd=sensorsOnDevice&api_key=$apikey&uuid=$uuid&id=$tempid&lang=en" https://narodmon.ru/api | python -m json.tool | grep -A 2 u00b0 | grep value | awk '') hum=$(curl -s --data "cmd=sensorsOnDevice&api_key=$apikey&uuid=$uuid&id=$humid&lang=en" https://narodmon.ru/api | python -m json.tool | grep -A 2 % | grep value | awk '') press=$(curl -s --data "cmd=sensorsOnDevice&api_key=$apikey&uuid=$uuid&id=$pressid&lang=en" https://narodmon.ru/api | python -m json.tool | grep -A 2 mmHg | grep value | awk '') mqtthost='127.0.0.1' mqttport='1883' mqttuser='admin' mqttpass='admin' mqtttopic='narodmon' mosquitto_pub -h $mqtthost -p $mqttport -u $mqttuser -P $mqttpass -t $mqtttopic/temp -m $temp mosquitto_pub -h $mqtthost -p $mqttport -u $mqttuser -P $mqttpass -t $mqtttopic/hum -m $hum mosquitto_pub -h $mqtthost -p $mqttport -u $mqttuser -P $mqttpass -t $mqtttopic/press -m $press
Сохраняем скрипт, запускаем и видим, что теперь у нас передаются уже три топика.
narodmon/tempnarodmon/humnarodmon/press
Так как давления в Apple HomeKit нет, его можно вывести как Освещенность. Приведу пример конфига для HomeBridge.
{ "accessory": "mqttthing", "type": "lightSensor", "name": "Давление", "url": "mqtt://127.0.0.1", "username": "admin", "password": "admin", "topics": { "getCurrentAmbientLightLevel": "narodmon/press" } }
На этом, думаю, стоит заканчивать, вроде бы описал все, что хотел! До скорой встречи, увидимся в следующей статье.
Напоследок приведу скриншот - первый сенсор это мой, который мы собирали на базе nodeMCU и DS18B20. Второй - это я забираю данные с narodmon и передаю по MQTT. Давление также удаленное.
Глянул карту в моем регионе в радиусе 50 км нет датчиков. Вдохновился :-)
Пиши чем закончиться=)
Выпил пивка, успокоился.
Благодарю) Заделал свой датчик) Щас придумаю корпус и сделаю публичным)
поделись фотками и скринами в блоге.
Да маловато фоток для блога) вот когда еще пару датчиков навешаю, тогда выложу)
А как же Esphome? :( Может можно что нибудь придумать?
Вот с esphome не подскажу :( возможно кто-то разберётся, не думаю что сложно
а я обошёлся без внешних скриптов.
PS: не забудьте на narodmon.ru переключить режим приёма данных в POST.
/config/configuration.yaml
rest_command:
narodmon:
url: "http://narodmon.ru/post"
method: post
content_type: "application/x-www-form-urlencoded"
payload: 'ID=DCA632B74830&DCA632B7483001={{ states("sensor.0x00158d0004aae920_pressure") }}&DCA632B7483002={{ states("sensor.0x00158d0004aae920_temperature") }}&DCA632B7483003={{ states("sensor.0x00158d0004aae920_humidity") }}'
/config/automations.yaml
- id: '1600640676277'
alias: Narodmon
description: ''
trigger:
- platform: time_pattern
minutes: '/5'
condition: []
action:
- service: rest_command.narodmon
data: {}
mode: single
Подскажите пожалуйста а на народный мониторинг можно отправлять не посредством GET а по TCP ?