Netatmo in Loxone einbinden
obsolet - wird nicht mehr gewartet, es gibt ein Loxberry Plugin für Netatmo: https://wiki.loxberry.de/plugins/netatmo_weather/start?s%5B%5D=netatmo
wichtiger hinweis Da das Problem immer wieder mal vorkommt
Wenn sich Werte in der Anzeige nicht ändern oder folgender Fehler (in der Konsole des Programms, nicht am Miniserver) gemeldet wird:
org.json.JSONException: JSONObject["dashboard_data"] not found
dann ist sehr wahrscheinlich die Batterie eines Netatmo Moduls leer oder keine Funkverbindung zum Modul, es sind dann keine Dashboard Daten verfügbar.
Doku von Netatmo:
dashboard_data
Last data measured per device (NB: this field is not returned when the device is unreachable)
Version 2.0
Wichtiger Hinweis
Gegenüber der Version 1.0.x hat sich die Konfiguration geändert - es kann nun eingestellt werden, dass KEIN Netatmo Zertifikat verwendet wird. Details siehe im Artikel.
Change Log
Downlods für schnell entschlossene
Eclipse Java Projekt Netatmo4Loxone.zip
Beispiel Confíg für Minserver Netatmo Demo.Loxone
Diskussion und Fragen bitte im Forum.
Anleitung
Hier eine Anleitung, wie man seine Netatmo Daten relativ einfach in Loxone bekommt. Das ganze baut auf den Ideen von https://github.com/lost-carrier/netatmo-api auf (hat aber mittlerweile nichts mehr damit zu tun) und ist eine auf Java 8 basierende Lösung. Es werden beliebig viele Basisstationen mit zusätzlichen Außenmodulen, weiteren Innenmodulen sowie Wind- und Regenmodule unterstützt.
Unterstützung für das Thermostat einzubauen sollte nicht allzu schwierig sein. Troubleshooting Tipps zur Inbetriebnahme gibt es auch im loxforum.
Und so sieht das ganze dann in der mitgelieferten Loxone Demo App aus
Bilder: Netatmo4Loxone
Miniserver Beispiel Config Datei für obige Auswertung
Hier kann die Miniserver Beispiel Config Datei für obige Ausgaben heruntergeladen werden.
Angepasst werden müssen die Modulnamen in der Befehlserkennung, in der folgenden Tabelle in Spitzen Klammern <....> aufgeführt
Unterstützung mehrerer Stationen
Hat man mehr als eine Basisstation im Einsatz, z.B. eine am Hauptwohnsitz, eine im Wochenendhaus, so kann man in der Konfiguration (siehe weiter unten) einstellen, dass nicht nur die Modulnamen sonder auch die Stationsnamen für die Werte Übermittlung verwendet werden. In der folgenden Tabelle werden immer nur der <Modulname> angeführt, hat man Unterstützung für mehrere Stationen aktiviert, so wird immer <Stationsname>.<Modulname> übermittelt.
Übermittelte Werte
In der folgenden Tabelle sind alle Werte dokumentiert, die je nach Modul übertragen werden. Der Modulname ist mit den jeweils eigenen Werten zu ersetzten.
Alle Zeiten und das Datum werden vom Programm in Lokalzeit mit Basis 1.1.2009 umgerechnet (Zeitbasis für Miniserver statt wie üblich 1.1.1970 - es soll ja nicht zu einfach sein ). Wenn der Miniserver und der Rechner auf dem das Programm läuft, die selbe Zeitzone eingestellt haben, dann werden die Zeitangaben der Messung korrekt dargestellt.
Befehlserkennung | Beispielswert | Basis-modul | Außen-modul | Innen-modul | Wind-modul | Regen-modul | Anzeige Einheit | Erklärung | Anmerkung |
---|---|---|---|---|---|---|---|---|---|
<Modulname>.CO2=\v | 1026 | x | x | <v> ppm | CO2 | ||||
<Modulname>.Humidity=\v | 41 | x | x | x | <v> % | Luftfeuchtigkeit | |||
<Modulname>.Noise=\v | 42 | x | <v> db | Lärm | |||||
<Modulname>.Pressure=\v | 1022 | x | <v> mbar | Luftdruck | |||||
<Modulname>.Temperature=\v | 21.6. | x | x | x | <v.1> °C | Temperatur | |||
<Modulname>.battery_percent=\v | 74 | x | x | x | x | <v> % | Batterieladung | ||
<Modulname>.battery_vp=\v | 3 | x | x | x | x | <v> | Batteriestatus: 0=very low, 1=low, 2=medium, 3=high, 4=full | ||
<Modulname>.date_max_temp=\v | 219240152 | x | x | x | <v.u> | Datum & Uhrzeit Maximaltemperatur, Sekunden seit 2009.01.01 | nicht benutzt in MS Demo Config | ||
<Modulname>.date_max_temp_tod=\v | 43352 | x | x | x | <v.t> | Uhrzeit der Maximaltemperatur, Sekunden seit 00:00:00 | |||
<Modulname>.date_max_temp_tod_nmbr=\v | 8.12 | x | x | x | <v.2> | Uhrzeit der Maximaltemperatur als Zahl *) | |||
<Modulname>.date_min_temp=\v | 219230176 | x | x | x | <v.u> | Datum & Uhrzeit Minimaltemperatur, Sekunden seit 2009.01.01 | nicht benutz in MS Demo Config | ||
<Modulname>.date_min_temp_tod=\v | 33376 | x | x | x | <v.t> | Uhrzeit der Minimaltemperatur, Sekunden seit 00:00:00 | |||
<Modulname>.date_min_temp_tod_nmbr=\v | 11.18 | x | x | x | <v.2> | Uhrzeit der Minimaltemperatur als Zahl *) | |||
<Modulname>.last_message=\v | 219265551 | x | x | x | x | <v.u> | Datum & Uhrzeit letzte Nachricht, Sekunden seit 2009.01.01 | nicht benutz in MS Demo Config | |
<Modulname>.last_message_tod=\v | 68751 | x | x | x | x | <v.t> | Uhrzeit letzte Nachricht, Sekunden seit 00:00:00 | nicht benutz in MS Demo Config | |
<Modulname>.last_message_tod_nmbr=\v | 9.45 | x | x | x | x | <v.2> | Uhrzeit letzte Nachricht als Zahl *) | nicht benutz in MS Demo Config | |
<Modulname>.last_seen=\v | 219265538 | x | x | x | x | <v.u> | Datum & Uhrzeit wann sich das Modul zuletzt gemeldet hat | nicht benutz in MS Demo Config | |
<Modulname>.last_seen_tod=\v | 68738 | x | x | x | x | <v.t> | Uhrzeit wann sich das Modul zuletzt gemeldet hat | nicht benutz in MS Demo Config | |
<Modulname>.last_seen_tod_nmbr=\v | 9.45 | x | x | x | x | <v.2> | Uhrzeit wann sich das Modul zuletzt gemeldet hat als Zahl *) | nicht benutz in MS Demo Config | |
<Modulname>.max_temp=\v | 21.0 | x | x | x | <v.1> °C | Tages-Maximaltemperatur | |||
<Modulname>.min_temp=\v | 19.0 | x | x | x | <v.1> °C | Tages-Minimaltemperatur | |||
<Modulname>.pressure_trend=\v | 2 | x | <v> | Luftdruck Trend: 0=fallend, 1=gleichbleibend, 2=steigend | |||||
<Modulname>.rf_status=\v | 2 | x | x | x | x | <v> | Stärke Funksignal: 0=very low, 1=low, 2=medium, 3=high, 4=full | ||
<Modulname>.temp_trend=\v | 1 | x | x | x | <v> | Temperatur Trend: 0=fallend, 1=gleichbleibend, 2=steigend | |||
<Modulname>.time_utc=\v | 219265541 | x | x | x | x | x | <v.u> | Datum & Uhrzeit der letzten Messung - Lokalzeit NICHT UTC! | nicht benutz in MS Demo Config |
<Modulname>.time_utc_tod=\v | 68741 | x | x | x | x | x | <v.t> | Uhrzeit der letzten Messung | |
<Modulname>.time_utc_tod_nmbr=\v | 13.07 | x | x | x | x | x | <v.2> | Uhrzeit der letzten Messung als Zahl *) | |
<Modulname>.wifi_status=\v | 2 | x | <v> für Status | WIFI Signalqualität: 0=very bad, 1=bad, 2=medium, 3=good | |||||
<Modulname>.data_up_to_date=\v | 1 | x | x | x | x | x | <v.x> für Status | Aktualität der Daten: 0=nicht aktuell (älter als 15 Minuten), 1=aktuell | |
<Modulname>.Rain=\v | 0.0 | x | <v> mm | aktuelle Regenmenge in mm | |||||
<Modulname>.sum_rain_1=\v | 1.0 | x | <v> mm | Regenmenge der letzten Stunde | |||||
<Modulname>.sum_rain_24=\v | 3.4 | x | <v> mm | Regenmenge der letzten 24 Stunden | |||||
<Modulname>.GustAngle=\v | 95 | x | <v> ° | Himmelsrichtung in Grad aus der die Böe kam | Zur Umrechnung in Himmelsrichtung siehe Statusbaustein in Demo | ||||
<Modulname>.GustStrength=\v | 12 | x | <v> km/h | Stärke der Böe | |||||
<Modulname>.WindAngle=\v | 106 | x | <v> ° | Himmelsrichtung in Grad aus der der Wind kommt | Zur Umrechnung in Himmelsrichtung siehe Statusbaustein in Demo | ||||
<Modulname>.WindStrength=\v | 5 | x | Windstärke | ||||||
<Modulname>.date_max_wind_str=\v | 221310738 | x | <v.u> | Datum und Uhrzeit der Tages-Windspitze | |||||
<Modulname>.date_max_wind_str_tod=\v | 40338 | x | <v.t> | Uhrzeit der Tages-Windspitze | |||||
<Modulname>.date_max_wind_str_tod_nmbr=\v | 11.12 | x | <v.2> | Uhrzeit der Tages-Windspitze als Zahl *) | |||||
<Modulname>.max_wind_angle=\v | 111 | x | <v> ° | Himmelsrichtung der Tages-Windspitze | Zur Umrechnung in Himmelsrichtung siehe Statusbaustein in Demo | ||||
<Modulname>.max_wind_str=\v | 17 | x | <v> km/h | Stärke der Tages-Windspitze |
*) Statusbaustein stellt Zeit falsch dar, deshalb wird eine Zahl verwendet
Schritt für Schritt Anleitung
Hier eine Anleitung, wie man das ganze schnell zum Laufen bekommt, für ev. Probleme siehe auch das loxforum.
Netatmo Developer Account anlegen und Netatmo App erstellen
Zuerst muss man sich bei https://dev.netatmo.com registrieren und dort eine App erstellen.
Einen neuen Account bei https://dev.netatmo.com anlegen, nicht die bestehenden Administrator Account Daten von https://my.netatmo.com für die Netatmo Wetterstation verwenden (also einen andere E-Mail Adresse verwenden). Warum ein neuer Account und nicht die bestehenden Account Daten verwenden? Dies hat zumindest die zwei folgenden Gründe:
es muss das Passwort für diesen neuen Developer Account in dem Programm, das wir bauen, gespeichert werden
bei mir hat schlicht und einfach der Zugriff auf den Admin Account - trotz richtiger Account Daten im Programm - nicht funktioniert, erst eine komplett neuer Account hat funktioniert
Eine neue App unter https://dev.netatmo.com/dev/createapp anlegen, z.B. mit dem Namen Miniserver.MeinName - der Name darf noch nicht existieren (Achtung: Fehlermeldungen sind kaum zu erkennen!)
Vom Admin Account (der mit der Wetterstation) eine Einladung an den soeben neu erstellten Developer Account schicken (Station-Gäste > Per E-Mail teilen) und die Einladung annehmen. Nun hat der Developer Account und damit die App zugriff auf die Wetterstation.
(Wenn jemand weiß wie man im Nachhinein, also nach der Einladung, noch Apps hinzufügen kann, die auch funktionieren, wäre ich dankbar für einen Tipp)
JAVA und Eclipse installieren
Von http://www.oracle.com/technetwork/java/javase/downloads/index.html die aktuelle Java JDK 8 Version herunterladen und installieren (JDK - also Java Development Kit, nicht JRE - das ist nur die Runtime)
Als IDE wird Eclipse verwendet, deshalb von https://eclipse.org/downloads/ die Eclipse IDE for Java Developers herunterladen und in einen eigenen Ordner mit Namen eclipse extrahieren.
eclipse.exe starten, den vorgeschlagenen Workspace akzeptieren und dann, wenn das Eclipse Fenster erscheint, auf das Icon Workbench (rechts oben) klicken. Später importieren wir dann das Netatmo Projekt in Eclipse.
Eclipse Projekt importieren, anpassen und laufen lassen
Projekt Importieren
Die Datei Netatmo4Loxone.zip herunterladen
Die Datei in Eclipse importieren, dazu wie folgt vorgehen:
File > Import... > General > Existing Projects into Workspace > Next >
Select archive file auswählen mit Browse die heruntergeladene zip Datei suchen und auswählen
es wird das Project angezeigt und ausgewählt, Finish klicken
das Projekt wird nach ein paar Sekunden links im Package Explorer angezeigt
Projekt anpassen und laufen lassen
Die Datei Configuration.properties muss angepasst werden, hier sind die Miniserver Adresse und Port (für UDP Datenkommuikation) sowie die Netatmo Developer Account-Daten und App-Daten einzutragen. Außerdem können noch weitere Dinge wie mehr Stationen Support und Debug Ausgaben eingestellt werden.
die Datei öffnen, sie ist im src Verzeichnis
die Miniserver Adressdaten und Netatmo Zugangsdaten mit deneigenen Werte ersetzen - den Rest bei bedarf anpassen
die Änderungen nochmals kontrollieren und speichern
Die Einstellungen für die Zertifikatsdatei anpassen NICHT mehr erforderlich ab V 2.0 wenn keine Zertifikate verwendet werden!
Menü Run > Run Configurations... und dort den Tab Arguments öffnen
hier muss der Pfad zu den Zertifikaten eingetragen werden, die je nach System unterschiedlich sind. In das Feld VM Arguments ist einzutragen:
Für Windows: -Djavax.net.ssl.trustStore="C:///Program Files/Java/jre1.8.0_65/lib/security/cacerts"
Für OS X: -Djavax.net.ssl.trustStore=/System/Library/Frameworks/JavaVM.framework/Home/lib/security/cacertsdie Änderungen speichern (Apply) und das Configuration Fenster schließen
Nun über das Menü Run > Run as > Java Application das Programm starten (der Projektname, also Netatmo4Loxone, muss selektiert sein)
wenn alles gut geht, dann wird im Console Fenster der Output des Programms angezeigt, es werden die Namen der Wetterstation sowie die vorhandene Module und die Werte ausgegeben.
wenn nicht alles gut geht, dann werden die aufgetretenen Fehler angezeigt und man muss rausfinden, was nicht passt.
UDP Daten in Loxone empfangen und anzeigen
Jetzt fehlt nur mehr der letzte Schritt, die Daten in Loxone emmpfangen und anzeigen. Die Daten werden über UDP an die konfigurierte Loxon Adresse gesendet. Wie man UDP Daten empfängt und auswertet, ist hier http://www.loxone.com/dede/service/dokumentation/loxone-config/peripherie/kommunikation-udp.html beschrieben. Oder die Anleitung hier UDP Eingang definieren verwenden.
Die Daten haben prinzipiell folgenden Aufbau:
Modulname.wertname=xxx
bzw.
Sationsname.Modulname.wertname=xxx
wenn Unterstützung für mehrere Stationen konfiguriert wurde
Bei mir sieht das z.B. so aus (ohne Multi-Station Support)
Esszimmer.CO2=831 Esszimmer.Humidity=39 Esszimmer.Noise=61 Esszimmer.Pressure=1021 Esszimmer.Temperature=21.0 Esszimmer.date_max_temp=220963619 Esszimmer.date_max_temp_tod=38819 Esszimmer.date_max_temp_tod_nmbr=10.46 Esszimmer.date_min_temp=220958481 Esszimmer.date_min_temp_tod=33681 Esszimmer.date_min_temp_tod_nmbr=9.21 Esszimmer.max_temp=21.6 Esszimmer.min_temp=18.6 Esszimmer.pressure_trend=1 Esszimmer.temp_trend=0 Esszimmer.time_utc=220968150 Esszimmer.time_utc_tod=43350 Esszimmer.time_utc_tod_nmbr=12.02 Esszimmer.wifi_status=3 Esszimmer.data_up_to_date=1
Außen.Humidity=85 Außen.Temperature=-1.1 Außen.battery_percent=74 Außen.battery_vp=3 Außen.date_max_temp=220932758 Außen.date_max_temp_tod=7958 Außen.date_max_temp_tod_nmbr=2.12 Außen.date_min_temp=220968102 Außen.date_min_temp_tod=43302 Außen.date_min_temp_tod_nmbr=12.01 Außen.last_message=220968160 Außen.last_message_tod=43360 Außen.last_message_tod_nmbr=12.02 Außen.last_seen=220968154 Außen.last_seen_tod=43354 Außen.last_seen_tod_nmbr=12.02 Außen.max_temp=2.1 Außen.min_temp=-1.1 Außen.rf_status=2 Außen.temp_trend=1 Außen.time_utc=220968102 Außen.time_utc_tod=43302 Außen.time_utc_tod_nmbr=12.01 Außen.data_up_to_date=1
Schlafzimmer.CO2=812 Schlafzimmer.Humidity=40 Schlafzimmer.Temperature=20.0 Schlafzimmer.battery_percent=68 Schlafzimmer.battery_vp=3 Schlafzimmer.date_max_temp=220925537 Schlafzimmer.date_max_temp_tod=737 Schlafzimmer.date_max_temp_tod_nmbr=0.12 Schlafzimmer.date_min_temp=220958446 Schlafzimmer.date_min_temp_tod=33646 Schlafzimmer.date_min_temp_tod_nmbr=9.2 Schlafzimmer.last_message=220968160 Schlafzimmer.last_message_tod=43360 Schlafzimmer.last_message_tod_nmbr=12.02 Schlafzimmer.last_seen=220968135 Schlafzimmer.last_seen_tod=43335 Schlafzimmer.last_seen_tod_nmbr=12.02 Schlafzimmer.max_temp=20.5 Schlafzimmer.min_temp=17.7 Schlafzimmer.rf_status=4 Schlafzimmer.temp_trend=1 Schlafzimmer.time_utc=220968135 Schlafzimmer.time_utc_tod=43335 Schlafzimmer.time_utc_tod_nmbr=12.02 Schlafzimmer.data_up_to_date=1
Kinderzimmer.CO2=880 Kinderzimmer.Humidity=39 Kinderzimmer.Temperature=20.2 Kinderzimmer.battery_percent=76 Kinderzimmer.battery_vp=3 Kinderzimmer.date_max_temp=220926113 Kinderzimmer.date_max_temp_tod=1313 Kinderzimmer.date_max_temp_tod_nmbr=0.21 Kinderzimmer.date_min_temp=220952410 Kinderzimmer.date_min_temp_tod=27610 Kinderzimmer.date_min_temp_tod_nmbr=7.4 Kinderzimmer.last_message=220968160 Kinderzimmer.last_message_tod=43360 Kinderzimmer.last_message_tod_nmbr=12.02 Kinderzimmer.last_seen=220968147 Kinderzimmer.last_seen_tod=43347 Kinderzimmer.last_seen_tod_nmbr=12.02 Kinderzimmer.max_temp=20.8 Kinderzimmer.min_temp=18.8 Kinderzimmer.rf_status=3 Kinderzimmer.temp_trend=1 Kinderzimmer.time_utc=220968147 Kinderzimmer.time_utc_tod=43347 Kinderzimmer.time_utc_tod_nmbr=12.02 Kinderzimmer.data_up_to_date=1
Regenmesser.Rain=0.0 Regenmesser.battery_percent=100 Regenmesser.battery_vp=4 Regenmesser.last_message=221332153 Regenmesser.last_message_tod=61753 Regenmesser.last_message_tod_nmbr=17.09 Regenmesser.last_seen=221332147 Regenmesser.last_seen_tod=61747 Regenmesser.last_seen_tod_nmbr=17.09 Regenmesser.rf_status=0 Regenmesser.sum_rain_1=0.0 Regenmesser.sum_rain_24=0.0 Regenmesser.time_utc=221332134 Regenmesser.time_utc_tod=61734 Regenmesser.time_utc_tod_nmbr=17.08 Regenmesser.data_up_to_date=1
Windmesser.GustAngle=95 Windmesser.GustStrength=12 Windmesser.WindAngle=106 Windmesser.WindStrength=5 Windmesser.battery_percent=100 Windmesser.battery_vp=4 Windmesser.date_max_wind_str=221310738 Windmesser.date_max_wind_str_tod=40338 Windmesser.date_max_wind_str_tod_nmbr=11.12 Windmesser.last_message=221331929 Windmesser.last_message_tod=61529 Windmesser.last_message_tod_nmbr=17.05 Windmesser.last_seen=221331929 Windmesser.last_seen_tod=61529 Windmesser.last_seen_tod_nmbr=17.05 Windmesser.max_wind_angle=111 Windmesser.max_wind_str=17 Windmesser.rf_status=0 Windmesser.time_utc=221331929 Windmesser.time_utc_tod=61529 Windmesser.time_utc_tod_nmbr=17.05 Windmesser.data_up_to_date=1
Java Programm Standalone laufen lassen
Funktioniert alles, so möchte man das Java Programm natürlich auch ohne Eclipse laufen lassen. Auch das geht ganz einfach über den Export als Runnable JAR file
File > Export... > Java > Runnable JAR file > Next >
als Launch configuration Netatmo4Loxone verwenden
mit den Standardeinstellungen exportieren, als Dateiname z.B. netatmo.jar verwenden
Eine Command Shell dort öffnen, wohin man die netatmo.jar Datei exportiert hat
Das Programm mit dem folgendem Befehl aufrufen:
für OS X: java -Djavax.net.ssl.trustStore=/System/Library/Frameworks/JavaVM.framework/Home/lib/security/cacerts -jar netatmo.jar
für Windows: java -Djavax.net.ssl.trustStore="C:///Program Files/Java/jre1.8.0_6 5/lib/security/cacerts" -jar netatmo.jar
Next Steps
Das ganze läuft bei mir und wohl auch bei einigen anderen seit einiger Zeit stabil, folgendes steht noch auf meiner Liste
Besser dokumentieren und das ganze in einem Source Code Repository ablegen.
Dem Miniserver die Möglichkeit bieten, den Status abzufragen, um sicherstellen zu können, dass die Werte aktuell sind (lebt das Programm noch?)
Version erstellen, die kein Zertifikat braucht (schon mal getestet, muss ich mal sauber machen...)
Thema Rain Gauge - Werte kleiner 1mm/h werden derzeit als 0mm/h angezeigt (aus 0,8mm/h in der Netatmo-App wird in Loxone 0mm/h). Ein Netatmo API Problem? Eher vermute ich ein abschneiden der Daten beim Umwandeln / Übertragen nach Loxone ...
Folgende Punkte wurden bereits erledigt
Erledigt - Besseres Fehlerhandling im Programm selbst - die ganzen Klassen gehören in Wirklichkeit Refaktorisiert, da es (hoffentlich) nur Beispiele sind und nicht wirklich sauber programmiert ist.
Erledigt - Logger statt syso und syserr verwenden.
Erledigt - Weitere Daten von den Modulen an den MS senden, vor allem Batteriezustand und auch Funksignalstärke.
Erledigt - NaN Werte gar nicht übertragen.
Erledigt - Zeit Wert so übertragen, das er nutzbar ist.
Erledigt - Mehrere Stationen unterstützen, derzeit wird nur eine (die erste) unterstützt.
Erledigt - Regen, Wind und Thermostat Daten einbinden
Erledigt - Das ganze mal auf einem Raspberry Pi ausprobieren, müsste da auch problemlos laufen - hat ein User aus dem Forum schon gemacht und läuft bei mir seit Monaten problemlos