98_openweathermap

Begonnen von betateilchen, 26 Juli 2013, 13:09:09

Vorheriges Thema - Nächstes Thema

betateilchen

Hallo Forumgemeinde,

nach dem in diesem Thread ja schon einige Diskussionspunkte (u.a. curl für Fritzbox *g*) aufkamen, konnte ich es einfach nicht sein lassen, die gesamte Funktionalität in ein Modul zu kapseln, das von systemaufrufen unabhängig sein sollte.

Hier kommt die erste Version - zum Testen und zum Rückmelden.

Was kann dieses Modul?

Wetterdaten an einen vom User vorher bei www.openweathermap.org (im Folgenden: owo) registrierten Account senden.
Die Nutzung der owo-API zum Lesen von Daten ist derzeit noch nicht unterstützt, das ist für einen späteren Zeitpunkt aber bereits geplant.

Wie nutzt man dieses Modul?

define meinWetter openweather

Damit wird ein device "meinWetter" angelegt:

(http://up.picr.de/15300433bt.png)

Die Steuerung des device erfolgt über diverse Attribute:

Für die Definition der Station selbst sind folgende Attribute vorhanden:


owoApiKey   = <apiKey> # wird derzeit noch nicht benutzt
owoDebug    = <0|1> # solange dieses Attribut nicht mit 0 definiert ist, werden keine Daten tatsächlich an owo übertragen. Wichtig während der Einrichtung des device!
owoInterval = <numerischer Wert> # Abstand zwischen den Übertragungen in Sekunden. Default: 1800
owoStation  = <Name der Station> # kann frei gewählt werden, unter diesem Namen wird die Station bei owo geführt
owoUser     = <username:password> # Benutzerdaten für den Zugriff auf owo


Die GEO-Daten der Station (latitude, longitude und altitude) werden aus der globalen FHEM-Definition (global) übernommen und von meinem Modul automatisch verwendet!

Für die Definition der zu übertragenden Wetterdaten stehen 10 Werte zur Verfügung, was in den allermeisten Fällen ausreichen sollte. Diese Attribute heißen
owoSrc0 owoSrc1 ... owoSrc9

In diesen Attributen werden immer drei Parameter, getrennt durch einen Doppelpunkt, angegeben.


allgemeine Syntax: attr <device> owoSrcN <owoParam>:<sensorName>:<readingName>

Beispiel: attr meinWetter owoSrc0 temp:sensor_Balkon:temperature


Im Beispiel wird ein Attribut owoSrc0 angelegt, das dem Modul mitteilt, es soll aus dem fhem-device "sensor_Balkon" das Reading "temperature" lesen und diesen Wert als temp an owo schicken. Die Parameternamen bei owo sind dort in der API Beschreibung festgelegt. Es können bis zu 10 dieser vorgegebenen Parameter auf diese Weise definiert werden.

Die Parameter für die GEO-Daten (lat, lon, alt) müssen nicht explizit angegeben werden!

Eine komplette Definition sieht also so aus:

(http://up.picr.de/15300568tl.png)


Die gesamte Verarbeitung wird auch im Logfile protokolliert:


2013.07.26 13:03:54 3: openweather owo started: SendData
2013.07.26 13:03:54 3: openweather owo reading: owoSrc0 temp sensor 27.1
2013.07.26 13:03:54 3: openweather owo debug:   name=Leimen&lat=49.35&long=8.68&alt=100&temp=27.1


Während der Einrichtung kann so kontrolliert werden, welche Sensoren gelesen werden und welcher generierte Datenstring das Modul an owo schickt.
Der Eintrag "debug:" wird durch "sending:" ersetzt, sobald das Attribut owoDebug auf 0 gesetzt wird und die tatsächliche Übertragung gestartet wird.


Diskussion und Rückmeldung bitte hier im Thread.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Hier kommt die nächste Version...

Änderungen zur letzten Version:

Das Modul benötigt das Perl Modul JSON

feht dieses Modul auf Eurer fhem-Hardware, muss es mit cpan install JSON nachinstalliert werden. Das Modul sollte auf allen Plattformen zur Verfügung stehen.

Die Attribute owoSrcXX haben jetzt einen zweistelligen Zähler

der von 00 - 19 geht. Damit lassen sich maximal 20 Parameter (+die 3 GEO-Parameter + Stationsname) an openweather übertragen. DIe owo-Api unterstützt derzeit 18 Parameter, die gesendet werden können:


# OpenWeatherMap API parameters
# -----------------------------
# wind_dir - wind direction, grad
# wind_speed - wind speed, mps
# temp - temperature, grad C
# humidity - relative humidity, %
# pressure - atmosphere pressure
# wind_gust - speed of wind gust, mps
# rain_1h - rain in recent hour, mm
# rain_24h - rain in recent 24 hours, mm
# rain_today - rain today, mm
# snow - snow in recent 24 hours, mm
# lum - illumination, W/M²
# radiation - radiation
# dewpoint - dewpoint
# uv - UV index
#
# name - station name
# lat - latitude
# long - longitude
# alt - altitude, m


Die letzten 4 Parameter brauchen nicht defiiniert zu werden, diese werden automatisch mit übertragen. Somit sind 14 frei definierbare Parameter vorgesehen, und die maximale Anzahl von 20 definierbaren Parametern ist mehr als ausreichend, selbst wenn die owo-Api irgenwann erweitert wird.


Es können nun auch Wetterdaten über die owo-API abgerufen werden

Hierfür gibt es 3 Möglichketen:


get <devName> stationByName <cityName>

   Beispiel: get owo stationByName Heidelberg,DE


get <devName> stationById <cityId>

   Beispiel: get owo stationById 2907911


get <devName> stationByGeo [<lat> <lon>]

   Beispiel: get owo stationByGeo 49.40 8.69



Weitere Infos zur Suche nach Stationen finden sich hier: http://openweathermap.org/API

Alle drei obigen Aufrufe liefern folgende Readings:


   Readings:
     2013-07-27 11:42:51   clouds          8
     2013-07-27 11:42:51   humidity        69
     2013-07-27 11:42:51   lastRx          Sat Jul 27 11:40:27 2013
     2013-07-27 11:42:51   pressureAbs     1006
     2013-07-27 11:42:51   rawData        
     2013-07-27 11:42:51   stationId       2907911
     2013-07-27 11:42:51   stationLat      49.4000
     2013-07-27 11:42:51   stationLon      8.6900
     2013-07-27 11:42:51   stationName     Heidelberg
     2013-07-27 11:42:51   tempMax         31.7
     2013-07-27 11:42:51   tempMin         30.0
     2013-07-27 11:42:51   temperature     30.8
     2013-07-27 11:42:51   windDir         187.5
     2013-07-27 11:42:51   windSpeed       2.31


Die Beschreibung der einzelnen Werte findet sich hier: http://bugs.openweathermap.org/projects/api/wiki/Weather_Data

Anmerkungen:

Das Reading "lastRx" beinhaltet die letzte Aktualisierung der Daten in der Station, nicht den Abruf in fhem.

Das Reading rawData ist per default leer. Sobald man ein Attribut attr <devName> owoRaw 1 setzt, wird in diesem Fall die komplette Antwort vom Openweathermap Server im JSON Format gespeichert. Falls irgendjemand die Rohdaten selbst weiterverarbeiten möchte, kann er das gerne damit tun.

Die Positionsangaben bei stationByGeo sind optional. Werden keine Positionsdaten verwendet, werden die globalen fhem-Attribute latitude und longitude verwendet, in der Regel also der dort festgelegte eigene Standort.

Bei stationById kann das gesuchte Land mit einem Komma hinter den Städtenamen angehängt werden, falls es den Städtenamen in mehreren Ländern gibt. (siehe obiges Beispiel "Heidelberg,DE")

Die API-URL von openweather ist im Attribut owoGetUrl gespeichert. Da sich diese Adresse regelmäßig ändert, kann somit eine Anpassung auch vom Anwender durchgeführt werden, falls das Modul selbst noch nicht aktualisiert ist.

Die Daten werden NICHT automatisch aktualisiert. Vor jeder Auswertung der Readings muss also ein "get ..." abgesetzt werden. Das hat den Hintergrund, mehrere unterschiedliche Stationen abrufen und auswerten zu können.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Hat eigentlich schon jemand von den sieben Downloadern das Modul getestet und kann mir bitte eine Rückmeldung geben?

Bei der finalen Version wird alles anders :) Sie wird drei Aufgaben unterstützen

1. Senden eigener Wetterdaten an openweathermap
2. Definition einer Wetterstation von owo, deren Daten dann in den Readings regelmäßig aktualisiert werden
3. Nutzung der owo-API zum Abruf einer beliebigen Station aus dem owo-Bestand ohne Aktualisierung

Alle drei Anwendungsfälle sind unabhängig voneinander nutzbar, aber auch in beliebiger Kombination und natürlich auch alle gleichzeitig.

Programmiertechnisch ist die Version schon fertig,  ich muss mich aber erst noch mit der zugehörigen Doku beschäftigen.


Ausblick auf weitere (vielleicht irgendwann) geplante Funktionen:

- Abruf von Vorhersagedaten
- optisch hübsche Darstellung (Nutzung von owo-Icons in weblink o.ä.) Dazu muss ich mich aber erst näher mit dem Thema weblink beschäftigen.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Das Modul ist fertig, die komplette Doku für commandref erstellt, das Ganze ist bei SVN eingecheckt und wird ab morgen per update verteilt.

Achtung: neuer Modulname = 98_openweathermap.pm um der zugrundeliegenden Internetplattform gerecht zu werden.

Viel Spaß damit!

Und falls Fragen und/oder Probleme auftreten, bitte hier im Thread fragen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Aktuelle Änderungen/Erweiterungen:

- "set <name> send" hinzugefügt: startet für Testzwecke einen sofortigen Sende/Abruf-Zyklus, unabhängig vom definierten Intervall.

- Attribute owoSendUrl hinzugefügt

beides ist dokumentiert in commandref.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thomas Kregelin

@betateilchen

Bin vor kurzem auf openweathermap.org und dann auf dein FHEM Modul gestoßen.

Vielen Dank für deine Arbeit!

In den nächsten Tagen sollte ich eine HM-WDS-OC3 Wetterstation und einen neuen CUL bekommen - dann werde ich das Modul gleich testen.

Kennst du die HM-WDS-OC3? Welche Wetterstation benutzt du?




betateilchen

Zitat von: Thomas Kregelin schrieb am Mi, 31 Juli 2013 22:48Welche Wetterstation benutzt du?

"Wetterstation" im kompletten Sinne, eher nicht, sondern mehrere einzelne Sensoren:

Für Temperatur und Luftfeuchte: HM-WDS10-TH-O

Für Luftdruck: BMP180 direkt am RaspberryPi, auf dem FHEM läuft.

Zum Feststellen, ob es regnet (ohne Mengenmessung): HM-Sen-RD-O
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

buchner51

Hallo,
Suche eine Wetterstation mit drei Sonnensensoren für Rolladensteuerung.

Für Eib Knx gibt es solche aber zum höchst Preis .
Hat hier jemand Erfahrung?

Danke.
Raspberry pi 3+
KNX mit TUL, FHEM mit SMARTVISU 2.9

betateilchen

das ist aber hier der völlig falsche Thread für Deine Frage.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thomas Kregelin

Ich habe die Wetterstation in Betrieb genommen; die Sensoren geben plausible Werte aus.

Leider habe ich es noch nicht geschafft, Werte an openweatermap zu schicken.

Ich bin nach Anleitung in der command ref vorgegangen. Zum Testen lasse ich zunächst nur die Temperatur senden.

Meine config:

define owo openweathermap
attr owo owoDebug 1
attr owo owoGetUrl http://api.openweathermap.org/data/2.5/weather
attr owo owoInterval 600
attr owo owoSendUrl http://openweathermap.org/data/post
attr owo owoSrc00 temp:OC3:temperature
attr owo owoStation StuSta
attr owo owoUser ***:***

Das log zeigt mir:

2013.08.07 22:38:27 3: openweather owo started: SendData
2013.08.07 22:38:27 3: openweather owo reading: owoSrc00 temp OC3 23.4
2013.08.07 22:38:27 3: openweather owo debug:   name=StuSta&lat=48.1831&long=11.6114&alt=?&temp=23.4&APPID=

Wenn ich mystats in meinem owo Onlineprofil anwähle erscheinen keine Werte.

Testweise habe ich per Terminal folgenden Befehl probiert:

curl -d 'temp=20&lat=49.11&long=24.11&alt=200' --user 'username:****' http://openweathermap.org/data/post

Wenn ich den Befehl mit meinen Profildaten entsprechend angepasse - wird der Temperaturwert korrekt gesendet und online angezeigt.

Was könnte ich machen um den Fehler zu finden?

betateilchen

Zitat von: Thomas Kregelin schrieb am Mi, 07 August 2013 22:49Ich bin nach Anleitung in der command ref vorgegangen.

Nein, bist Du nicht.

Zitat von: Thomas Kregelin schrieb am Mi, 07 August 2013 22:49Was könnte ich machen um den Fehler zu finden?

Nochmal lesen, was in der commandref steht.

(http://up.picr.de/15430193aw.jpg)

Und Du solltest Deine altitude noch als globales Attribut pflegen, die Höhe fehlt nämlich noch in Deinem Sendestring.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thomas Kregelin

Nachdem ich meinen Post abgesendet hatte, habe ich den Fehler mit dem Debug auch gesehen.

Tja - zu kurz gelesen.

Leider funktioniert es immer noch nicht. Habe auch ein attr global altitude festgelegt - leider kein Unterschied.

Mein log:

2013.08.07 22:56:46 3: openweather owo started: SendData
2013.08.07 22:56:46 3: openweather owo reading: owoSrc00 temp OC3 23.4
2013.08.07 22:56:47 3: openweather owo sending: name=StuSta&lat=48.1831&long=11.6114&alt=515&temp=23.4&APPID=

betateilchen

Zitat von: Thomas Kregelin schrieb am Mi, 07 August 2013 23:05leider kein Unterschied.

vorher:

2013.08.07 22:38:27 3: openweather owo debug: name=StuSta&lat=48.1831&long=11.6114&alt=?&temp=23.4&APPID=

nachher:

2013.08.07 22:56:47 3: openweather owo sending: name=StuSta&lat=48.1831&long=11.6114&alt=515&temp=23.4&APPID=

Anstatt "debug" steht da jetzt "sending". Das Modul versucht also definitiv, die Daten an owo zu schicken. Wenn dann noch etwas schiefgeht, funktioniert die Verbindung an sich nicht. Überprüfe nochmal Deinen user und das password.

Welche Readings werden Dir jetzt angezeigt? Es sollten mindestens zwei Readings mit my_ am Anfang vorhanden sein: my_temp und my_lastSent
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thomas Kregelin

Meine Readings:

my_lastSent Wed Aug 7 23:36:41 2013 2013-08-07 23:36:41
my_temp 23 2013-08-07 23:36:41
state active 2013-08-07 23:36:41

In meinem onlineprofil werden keine aktualisierten Daten angezeigt. Es stehen immernoch die Daten dort, die ich mit dem curl Befehl aus dem Terminal abgeschickt hatte.

Wahrscheinlich liegt es dann daran, dass fhem die Daten nicht vernünftig übertragen kann. Ich kann beispielsweise schon keine fhem updates abrufen - er gibt mir ständig:

Can't get release.pm from http://fhem.de

Vielleicht liegt es an irgendwelchen Firewall Einstellungen (Studentenwohnheim).

Werde weiter nach dem Fehler suchen.

Danke für die Hilfe.

betateilchen

Zitat von: Thomas Kregelin schrieb am Mi, 07 August 2013 23:53Vielleicht liegt es an irgendwelchen Firewall Einstellungen (Studentenwohnheim).

das sagst Du erst jetzt?

Da ist mit Sicherheit ein Proxy-Server dazwischen, dann kann das nicht funktionieren.
Dieses Problem habe ich z.B. auch aus unserem Firmennetzwerk.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!