Herunterladen von Daten von der Wetterstation Oregon Scientific WMR500

Einmal haben wir beschlossen, dass die Site ihr eigenes tatsächliches Wetter außerhalb des Fensters benötigt. Dies bedeutet, dass Sie eine Art Wetterstation mit Internetverbindung benötigen. Preiswert. Dass man so etwas wie Davis Vantage Pro2 Plus für über 100.000 Rubel genommen und sogar einen separaten Computer für die Verbindung (wie in mail.ru ) behalten wollte, wollte dies nicht, sowohl in Bezug auf das Budget als auch in Bezug auf die Komplexität.







Die Wahl fiel auf eine preiswerte, ziemlich frische Wetterstation Oregon Scientific WMR500. Ich werde es nicht überprüfen, Sie können das Internet selbst durchsuchen. Es reicht aus, dass sie Temperatur, Luftfeuchtigkeit, Druck, Windgeschwindigkeit und -richtung messen kann. Theoretisch kennt es auch die Luftqualität und die UV-Strahlung, aber wir haben die entsprechenden zusätzlichen Sensoren nicht im Angebot gefunden. Der Preis für das Budget war die Art und Weise, wie es funktionierte. Sie selbst sendet Daten über WLAN in die Cloud. Der Datenzugriff ist sowohl in der mobilen Anwendung als auch im Internet verfügbar, jedoch etwas seltsam. Dies wird in der Tat diskutiert.



Für den Zugriff auf das Webpart benötigen Sie ein Konto, das in der mobilen Anwendung erstellt wird. Tatsächlich erfolgt die Konfiguration der Station in Bezug auf das für die Verbindung zu verwendende Wi-Fi nur in der Anwendung während der anfänglichen Verbindung zum temporären Zugriffspunkt der Station selbst. Hier wird alles nach den Anweisungen gemacht und es gibt nichts Kompliziertes. Als Ergebnis erhalten wir in der Anwendung das hinzugefügte Gerät, dessen ID wir weiter benötigen werden.







Die Weboberfläche befindet sich unter http://web-wmr500.idtlive.com/







Nach der Eingabe können Sie Diagramme von durchschnittlicher Schönheit anzeigen, indem Sie auf die Schaltfläche „Anzeigen“ klicken und Daten im XLS-Format für den ausgewählten Zeitraum exportieren (Schaltfläche „Exportieren“). Ich muss sofort sagen, dass die Anzeige der Luftfeuchtigkeit in der Grafik funktioniert, der Export jedoch nicht, da Feuchtigkeitsdaten zusammen mit Temperaturdaten exportiert werden. Das ist die seltsame Situation. Wenn Sie sich die Anforderungen ansehen, sehen Sie, dass es eine bestimmte API für Diagramme gibt, die Daten an json zurückgibt, was bereits gut ist. Sie können Kühe ausrauben!







Zum Beispiel "rauben" wir einen Datensatz über die Temperatur pro Tag. Die Anfrage wird mit Parametern an web-wmr500.idtlive.com/index/api.show/index.html gesendet (hier ist ein PHP-Array von Parametern für ein Beispiel):



$request = [
	'type'		=> 'temperature',
	'unit'		=> '°C',
	'id'		=> 'id--',
	'channel'	=> '---',
	'start'		=> "'2020-07-20T00:00:00Z'",
	'end'		=> "'2020-07-21T00:00:00Z'",
];


Daten sind in einfachen Anführungszeichen und im ISO 8601-Format ohne TimeZone erforderlich. Die Kanalnummer (Kanal) - 1, 2 oder 3, je nachdem an welchen Kanal die Sensoreinheit angeschlossen ist. Anforderungsdaten nach Typen unterscheiden sich im tatsächlichen Typ der angeforderten Daten (Typ) und Maßeinheiten (Einheit).



Alle verfügbaren Typen und Einheiten:



temperature – °C  °F
humidity – %
rain – mm/h  inch/h
wind – m/s, knots, kph, mph
pressure – mbar,hPa,mmHg,inHg


Eine Sache ist schlecht, über api.show können Sie nur Daten für die angegebenen Parameter abrufen, zum Beispiel können Sie die Windrichtung oder den Taupunkt nicht herausfinden, aber es gibt viele statistische Informationen. Ich würde gern. Und hier hilft uns EXPORT.



Wir stellen die erste Anfrage an die Adresse web-wmr500.idtlive.com/index/api.export/index.html mit denselben Parametern. Als Antwort generiert der Server irgendwo in der Wildnis eine statische XLS-Datei und gibt einen Link dazu. Sie können es danach jederzeit herunterladen (ich habe die Dateien anderer Personen für 2018 auf dem Server gesehen, der Ordner ist für die Indizierung geöffnet). Es gibt bereits viel mehr Informationen in den Dateien, oder besser gesagt, alles ist dort verfügbar.







Das hat aber auch Vor- und Nachteile. Plus - Sie können Daten für den erforderlichen Zeitraum abrufen. Minus - Diese Daten werden im Abstand von 15 Minuten an das Webpart gesendet. Es ist sogar gut, um das Wetter in Ihrer Datenbank zu speichern. Sie können alle Daten auf einmal laden, sobald die Station gestartet wurde und so weiter. Wenn Sie jedoch häufiger oder schneller aktuelle Informationen erhalten möchten, müssen Sie weiterführende Untersuchungen durchführen.



Ich bin "ausgeflippt" und habe beschlossen, den Datenverkehr der Anwendung abzufangen. Sie empfängt Daten fast sofort. Vielmehr empfängt es Daten "direkt" von der Station, die die neuesten von der Sensoreinheit empfangenen Daten liefert. Die Sensoreinheit wird alle 15 Sekunden abgefragt.



Es stellte sich heraus, dass die Anwendung über das MQTT-Protokoll irgendwo in der Amazon-Instanz abgelegt wird (die Adresse 35.161.38.128 wurde durch Abfangen von Datenverkehr erhalten, Husten-Husten), ein Thema mit einer zufälligen Themen-ID abonniert und an das Thema der Station sendet (sie selbst über WLAN und es ist nur dort nur über MQTT verbunden, der Webpart empfängt anscheinend auch regelmäßig die gleichen Daten vom MQTT-Broker) mit seiner ID einen Befehl wie "Lieber, gib mir deinen Status, antworte in Topic-ID". Und wenn ich PHP + Curl verwendet habe, um Daten vom Webpart abzurufen (Sie können alles verwenden, was Sie möchten), ist Asynchronität innerhalb einer Verbindung erforderlich. Schnell und auf den Knien dachte ich nur daran, node.js zu verwenden. Sie benötigen das mqtt-Modul.



In meinem Fall ist dies nur ein Konsolenskript, das ich durch exec in PHP "ziehe".



#!/usr/bin/node

var mqtt  = require('mqtt');
var md5   = require('md5');

String.prototype.insert = function (index, string) {
  if (index > 0)
   return this.substring(0, index) + string + this.substring(index, this.length);
  else
    return string + this;
};

var host       = 'mqtt.idtlive.com';
var your_mail  = 'your_account_mail@somehost.com'; // see in app, registered account
var clientId   = 'Android_' + your_mail;
var deviceId   = 'your-device-id'; // see in app connected device section, something like F9987D92-E180-64DE-A202-D43AAD0D5784
var channelId  = 1; // channel beetwen station & external sensors block

var timeInMs   = Date.now();
var uniqTopic  = md5(timeInMs).toUpperCase().insert(8,'-').insert(13,'-').insert(18,'-').insert(23,'-');

var client = mqtt.connect( {
  host : host,
  port : 1883,
  cliendId : clientId
});

client.on('connect', function() {
  client.subscribe('enno/out/json/'+uniqTopic,
    function(err) {
      if (!err) {
        client.publish('enno/out/json/'+deviceId, '{"command":"getChannel'+channelId+'Status","id":"'+uniqTopic+'"}');
      } else {
        console.log('connect error');
      }
    })
});

client.on('message', function(topic, message) {
  console.log(message.toString())
  client.end()
});


Ich werde Ihnen nicht sagen, wie Sie Daten aus dem Webpart (JSON), dem Export (Excel) oder aus MQTT (JSON) analysieren sollen. Hier können Sie damit umgehen, wie Sie möchten.



Das ist alles. Wenn plötzlich jemand hilft, bin ich nur froh.



PS> Update, der Skriptcode wird gekämmt, die Generierung eines zufälligen MQTT-Themas wurde hinzugefügt, um die Arbeit sowohl aus der Anwendung heraus zu simulieren, als auch hier veröffentlicht



All Articles