WP Plugin für NetAtmo #3 – Endlich Messwerte

Von | 2015-11-05

Mit der Liste der einzelnen Geräte und deren verschiedenen Messkategorien kann man schön langsam daran denken, sich die Messwerte zu holen. Kurzes Studium der Developer Doku, insbesondere der getmeasure findet man heraus, dass alle 5min gemessen wird und alle 10min diese Werte an den NetAtmo Server gesendet werden. Weiters ist die Anzahl der Messwerte, die auf einmal über die SDK übermittelt werden auf 1024 beschränkt. Daraus ergibt sich für mein Setup (Basisstation, Außenmodul, Innenmodul und Regensensor) eine Anzahl von 11 Messwerte alle 5min. Das sind 132 Datensätze pro Stunde, 3168 pro Tag. Das könnte problematisch werden… Aber alles der Reihe nach!

Zuerst brauchen wir erstmal eine Tabelle, wo wir die Daten speichern werden:

CREATE TABLE $table_name (
id int NOT NULL AUTO_INCREMENT,
time_stamp timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL,
module_id varchar(55) NOT NULL COMMENT 'ID of the sensor module',
value_category varchar(55) NOT NULL,
value FLOAT NULL,
UNIQUE KEY id (id),
INDEX idx_time_stamp (time_stamp, module_id, value_category, value) USING BTREE
)

Tabelle hätten wir also. Aber wie bekommt man zyklisch die Daten vom NetAtmo Server in die lokale Datenbank? Einen cron job bieten die wenigsten LowCost Provider an. Zum Glück hat WordPress selbst eine Antwort darauf: wp_cron

Funktioniert ähnlich wie der (mehr oder weniger bekannte) cron: Man setzt den Zyklus fest und beim nächsten Aufruf der Seite (egal von Bot oder Mensch) wird dann dieser Task ausgeführt, in einem extra Fenster, damit der Benutzer nicht unnötig warten muss. Eigentlich eh das, was ich brauche. Nur halt nicht synchron. Je nach Traffic der Seite kann es schon zu einem Versatz zwischen geplanten Ausführzeitpunkt und dem tatsächlichen kommen – logisch. Aber das schöne dabei ist, man braucht nur seine eigene Seite aufzurufen und danach nochmal refreshen, dann kann man sicher sein, dass die aktuellen Daten geladen wurden.

Nun aber zum eigentlichen Synchronisieren der Daten

Aufgrund der oben genannten Gründe kann man einfach nicht genau sagen, welche Module, von wann bis wann schon geladen wurden.

Szenario 1: Frische Installation

Wie bekommt man den 1. Datensatz (also den ältesten)? Das kann nämlich auch durchaus für jedes Modul anders sein. NetAtmo bietet zwar ein Feld „setup_date“ an, jedoch ist das leider (Stand 18.02.2016) noch immer leer. Eher durch Zufall habe ich herausgefunden, dass wenn man keine Startzeit und keine Endzeit angibt, dass dann die allerersten Messwerte genommen werden. Eine sehr gute Idee (machen eigentlich die Verwendung von „setup_date“ überflüssig…

Wenn der Installationszeitpunkt länger als 1 Tag zurück liegt, der fällt automatisch in

Szenario 2: Daten vorhanden

Es gibt Messwerte (ggf für jedes Modul und jeden Messwerttyp) mit unterschiedlichem Start-Endbereich. Daher einfach das neueste Datum eines Messwerts pro Modul und Messwerttyp nehmen und das als Startdatum verwenden. Das so lange wiederholen, bis weniger als 1024 Messwerte retour kommen, denn dann erst haben wir das Ende erreicht.

Um die Last am Server, die Skriptlaufzeit und ggf auch ein temporäres Sperren der Applikation durch NetAtmo zu verhindern, wird der nächste Synch erst nach 5min (mittels wp_cron) eingeplant.

In meinem Setup werden ca. 3168 Messwerte pro Tag gespeichert (11 Messwerttypen alle 5min) d.h. man hat schwache 100000 Messwerte im Monat. Das sollte man beachten, hinsichtlich Datenbankspeicherplatz. (~1.15 mio pro Jahr)