Русский
Русский
English
Статистика
Реклама

Выгружаем данные из метеорологической стации Oregon Scientific WMR500

Однажды мы решили, что нам на сайте нужна своя актуальная погода за окном. А значит нужна какая-то метеорологическая станция с подключением в Интернет. Недорого. Ибо брать что-то типа Davis Vantage Pro2 Plus за овер 100 тысяч рублей, да еще и держать отдельный компьютер для подключения к ней (как это сделали в mail.ru) не хотелось как с точки зрения бюджета, так и с точки зрения сложности.




Выбор пал на недорогую, достаточно свежую метео-станцию Oregon Scientific WMR500. Обзор её я делать не буду, можете самостоятельно поискать в Интернете. Достаточно того, что она умеет измерять температуру, влажность, давление, скорость и направление ветра. В теории она умеет еще качество воздуха и уровень УФ-излучения, но мы не нашли в продаже соответствующих дополнительных датчиков. Ценой за бюджетность была схема её работы. Данные она сама отдает в облако по Wi-Fi. Доступ к данным есть в мобильном приложении, а так же с web, но несколько странный. Об этом, собственно, и пойдет речь.

Для получения доступа к web-части необходим аккаунт, который создается в мобильном приложении. Собственно и настройка станции в части того, какой Wi-Fi ей использовать для подключения происходит только в приложении при первичном подключении к временной точке доступа самой станции. Тут все делается по инструкции и ничего сложного нет. В итоге, в приложении мы получаем добавленное устройство, id которого нам понадобится далее.



Web-интерфейс находится по адресу http://web-wmr500.idtlive.com/



Зайдя в него, можно смотреть графики средней красивости по кнопке Show, а так же экспортировать данные в формате XLS за выбранный период (кнопка Export). Сразу скажу, что показ влажности на график работает, а вот экспорт нет, потому что данные влажности экспортируются вместе с данными температуры. Такая вот странная ситуация. Посматривая в запросы можно увидеть, что для графиков есть некий api, отдающий данные в json, что уже хорошо. Можно грабить корованы!



Для примера грабим набор данных по темпрературе за сутки. Запрос пойдет на web-wmr500.idtlive.com/index/api.show/index.html, с параметрами (тут PHP массив параметров для примера):

$request = ['type'=> 'temperature','unit'=> 'C','id'=> 'id-вашего-устройства','channel'=> 'номер-канала-блока-датчиков','start'=> "'2020-07-20T00:00:00Z'",'end'=> "'2020-07-21T00:00:00Z'",];


Даты обязательно в одинарных кавычках и в формате ISO 8601 без TimeZone. Номер канала (channel) 1, 2 или 3, в зависимости от того, на каком канале подключен блок датчиков. Данные запроса по типам отличаются собственно типом запрашиваемых данных (type) и единицами измерения (unit).
Все доступные типы и единицы измерения:

temperature  C или Fhumidity  %rain  mm/h или inch/hwind  m/s, knots, kph, mphpressure  mbar,hPa,mmHg,inHg

Одно плохо, через api.show можно получить данные только указанных параметров, к примеру нельзя узнать направление ветра, или точку росы, да там много всего статистического. А хотелось бы. И тут нам поможет EXPORT.

Делаем первый запрос на адрес web-wmr500.idtlive.com/index/api.export/index.html с теми же параметрами. В ответ сервер где-то в дебрях генерирует статический XLS файл и отдает ссылку на него. Скачать его можно после этого в любой момент (я видел на сервере чужие файлы за 2018 год, папка открыта для индексирования). В файлах уже существенно больше информации, вернее она там вся доступная.



Но тут тоже есть свои плюсы и свои минусы. Плюс вы можете получить данные за нужный период. Минус в web-часть эти данные попадают с 15-ти минутным интервалом. Для хранения погоды у себя в БД это даже хорошо, можно загрузить сразу все данные с момента запуска станции и все такое. А вот если вы хотите чаще, или быстрее получать актуальную информацию, то придется провести более продвинутые изыскания.

Я психанул и решил перехватить трафик приложения, оно получает данные практически мгновенно. Вернее оно получает данные напрямую от станции, которая отдает последние данные, полученные от блока датчиков. А блок датчиков она опрашивает раз в 15 секунд.

Оказалось, что приложение по протоколу MQTT идет куда-то в инстанс амазона (адрес 35.161.38.128 получен путем перехвата трафика, кхе-кхе), подписывается на топик со случайным topic-id, шлет в топик станции (она сама по wi-fi и подкючена только по MQTT только туда, web-часть судя по всему тоже периодически из брокера MQTT эти же даные и получает) с её id команду типа родная, дай-ка мне свой статус, ответь в topic-id. И если для получения данных с web-части я использовал php + curl (вы можете использовать то, что вам больше по душе), то тут нужна асинхронщина в рамках одного соединения. Быстро и на коленке я придумал только использовать node.js. Понадобится модуль mqtt.
В моем случае это просто консольный скрипт, который через exec я дергаю в php.

#!/usr/bin/nodevar mqtt = require('mqtt');/* вместо some@mailhost.com используйте свой адрес почты, на который зарегистрирован аккаунт в приложении */var client = mqtt.connect( {  host : '35.161.38.128',  port : 1883,  cliendId : 'Android_some@mailhost.com'});/* придумайте свой id, его приложение генерирует каждый запрос новых, но это не важно */var some_uniq_topic = 'F456F3A5-F36D-2FE5-AAE4-B71FE528FF01';/* тут id вашей станции */var station_id= '2e846e12-7cd1-5563-9dbd-fc5728db457d';client.on('connect', function() {  client.subscribe('enno/out/json/'+some_uniq_topic ,    function(err) {      if (!err) {      client.publish('enno/out/json/'+station_id,'{"command":"getChannel1Status","id":"'+some_uniq_topic+'"}');      } else {        console.log('connect error');      }   })})client.on('message', function(topic, message) {  console.log(message.toString())  client.end()})


Как парсить данные из web-части (JSON), экспорта (Excel) или из MQTT (JSON) я рассказывать не буду, тут уж как хотите, так и обрабатывайте.

Вот собственно и все. Если кому-то вдруг поможет, то буду только рад.
Источник: habr.com
К списку статей
Опубликовано: 21.07.2020 12:10:27
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Реверс-инжиниринг

Умный дом

Oregon wmr500 экспорт данные

Категории

Последние комментарии

© 2006-2021, personeltest.ru