Wetterdaten für Wetter.com

Begonnen von Frank S., 31 März 2014, 17:43:14

Vorheriges Thema - Nächstes Thema

Frank S.

Moin.

Seit einiger Zeit nutze ich eine Homematic Wetterstation "HM-WDS100-C6-O" zur Wetteraufzeichnung. Da ich auch am privaten Wetternetzwerk von wetter.com teilnehme, habe ich nach eine Lösung zur Übertragung der Daten mittels FHEM gesucht. Bisher gab es keine Lösung, so dass ich hier selber aktiv geworden bin. Nach Rücksprache mit dem Support von wetter.com habe ich die API erhalten, wie die Daten zu übertragen sind.

http://support.wetter.com/attachments/token/titkme05m63xv8e/?name=2013-06-01+-+WeatherReport-API.de.pdf

Um die Daten zu übertragen habe ich in 99_MyUtils.pm eine Funktion erstellt.

sub
myWetterCom($$$$$$)
{
        my ($hu,$te,$dp,$ws,$pa,$wd) = @_;
        my $id = "4711";
my $pwd = "passwort";
my $sid = "fhem";
my $dtutc = strftime "%Y%m%d%H%M", gmtime;
        my $dt         = strftime "%Y%m%d%H%M", localtime;

my $urlString = "http://interface.wetterarchiv.de/weather/";
my $dataString = "id=$id&pwd=$pwd&sid=$sid&dtutc=$dtutc&dt=$dt&hu=$hu&te=$te&dp=$dp&ws=$ws&pa=$pa&wd=$wd";

my $sendString = $urlString."?".$dataString;

GetFileFromURL($sendString);
}


In diesem Beispiel werden die Luftfeuchtigkeit, die Temperatur, der Taupunkt, die Windgeschwindigkeit, die Regenmenge der letzten Stunde und die Windrichtung übertragen.

Die "id" und "pwd" ist die ID und das Passwort der Wetterstation im privaten Netzwerk. Die "SID" ist die Geräte-Kennung im Netzwerk. Diese ist von Wetter.com für Daten aus FHEM-Projekten mit "fhem" vorgegeben und sollte nicht verändert werden.

Nun werden die Daten mittels define jede halbe Stunde übertagen.

define define WetterComSenden at +*00:30 {\
       my $menge_log = myDiff("3600", "FileLog_Wetterstation", "10:::");;\
        fhem("set Regenmenge_Stunde_log $menge_log");; \
        my $ws = (ReadingsVal("Wetterstation", "windSpeed", 0) / 3.6);;\
           $ws = int(100 * $ws + 0.5) / 100;;\
        my $hu = ReadingsVal("Wetterstation", "humidity", 0);;\
        my $te = ReadingsVal("Wetterstation", "temperature", 0);;\
        my $dp = ReadingsVal("Wetterstation", "dewpoint", 0);;\
        my $wd = ReadingsVal("Wetterstation", "windDirection", 0);;\
        myWetterCom($hu,$te,$dp,$ws,$menge_log,$wd);;\
}


Schöne Grüße
Frank S.

Edit: Berechnung der UTC nach Vorschlag von Betateilchen geändert.

sweetie-pie

Super Sache. Das wollte ich auch schon immer machen, bin aber bisher nicht dazu gekommen.
Jetzt hat mich der Support von Wetter.com auf deinen Post aufmerksam gemacht.  Auch toller Service.

Manche Dinge erledigen sich halt von allein, man muss es nur lange genug vor sich herschieben...  ;)

Als kleinen Hinweis würde ich darüber nachdenken evtl. dies http://www.fhemwiki.de/wiki/Blocking_Call noch zu integrieren.
Es verhindert ein Hängen von fhem, falls die Antwort von Wetter.com auf sich warten lässt....

Gruß
Holger




Michael

Moin

@Frank S
Super was du da gemacht hast.  :)
Werde es gleich versuchen Umzusetzen.

Bringe es bitte ins Wiki damit es nicht verloren geht.
Wäre schade drum.
Gruß, Michael

FHEM 6.0 auf RPi 3
CUL V3 868 Mhz | JeeLink LaCrosse & PCA301 | CCU3
BMP085(180) | 14x TX29DTH-IT | 5x PCA 301 | SMA Peripheries | MobileAlerts MA-10(100,120PRO,200,251,410,650,660,800) | HM IP

Frank S.

Moin.

Danke für die Blumen. Ihr meint sicher dieses Wiki: http://www.fhemwiki.de/wiki/Hauptseite

Ich werde es die Tage dort einfügen.

Jetz fehlt noch ein Luftdruckmesser. Mit dem "HM-WDS100-C6-O" geht es leider nicht.

Schöne GRüße
Frank

betateilchen

Hast Du was dagegen, wenn ich Deine Idee bei Gelegenheit in ein echtes Modul umsetze?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Frank S.

Moin.

Da habe ich nichts gegen.

Schöne Grüße
Frank

betateilchen

#6
Hinweis:


my $dtutc = strftime "%Y%m%d%H%M", localtime(time+$offset);


Vorausgesetzt, Du bist in Deutschland zu Hause, dann stimmt die Berechnung nicht. Den offset von 3600 musst Du nicht addieren, sondern abiziehen, um auf utc zu kommen. Und jetzt ist Sommerzeit, da ist der Offset sogar -7200

Vorschlag:


my $dtutc = strftime "%Y%m%d%H%M", gmtime;

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

Frank S.

Moin.

Danke für den Hinweis mit der Berechnung der UTC. Ich habe den Vorschlag gleich übernommen.

Schöne Grüße
Frank

betateilchen

Hallo Frank,

schau mal, was meinst Du zu dieser Idee?

(http://up.picr.de/17940005jh.jpg)


  • Das Define besteht nur aus stationId + Passwort (im Screenshot nicht zu sehen)
  • In den Attributen wird für jeden (laut API) möglichen Wetterparameter ein Eintrag nach dem Muster <device>:<reading>[:offset] festgelegt.
  • Aus den definierten Attributen wird der "data" String zusammengebaut, der dann für die Übertragung an die url mit den "Grunddaten" angehängt wird.

Als nächstes muss ich die eigentliche Übertragung einbauen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#9
Hier schonmal die Doku :)

(http://up.picr.de/17940731la.jpg)

Und im Anhang das Modul 55_weco.pm zum Testen. Ich werde noch ein paar Tests machen, vermutlich wird das Modul heute noch eingecheckt und morgen per Update verteilt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

*grmpf* blöder Fehler bei den Attributen - nun beseitigt :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Frank S.

Guten Morgen.

Danke für die schnelle Umsetzung. Schaut gut aus. Ich werde es bei Gelegenheit  testen.

Schöne Grüße
Frank S.

Frank S.

Moin.

Ich habe gerade das Modul über Update eingefügt.

Dann wie folgt im Progamm eingefügt:

define WetterComSenden_Mod weco stat_id pwd
attr WetterComSenden_Mod wecote temp:Wetterstation:temperature
attr WetterComSenden_Mod wecohu humidity:Wetterstation:humidity
attr WetterComSenden_Mod wecodp dewpoint:Wetterstation:dewpoint:273.15


Nur bekomme ich nun die Fehlermeldung:

"Cannot load module weco Please define WetterComSenden_Mod first Please define WetterComSenden_Mod first Please define WetterComSenden_Mod first"

Habe ich dort etwas falsch gemacht, oder ist das Modul noch nicht aktiv?

Schöne Grüße
Frank

betateilchen

#13
1. Du hast die Attribute falsch gesetzt. (Deine Definition dürfte für eine 98_openweathermap Definition sein)

2. Warum das Modul nicht geladen werden kann, solltest Du im Logfile nachschauen. Hattest Du Dein fhem nach dem Update neugestartet?

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

Frank S.

Moin.

Zu Punkt 1: Stimmt. Daher habe ich die übernommen. Muss ich dann noch anpassen.

Zu Punkt 2: Ich habe den Server nach dem Update neu gestartet. Im Logfile erhalte ich folgende Fehlermeldung:

2014.04.13 11:51:08 1: reload: Error:Modul 55_weco deactivated:
Type of arg 1 to each must be hash or array (not private variable) at /var/InternerSpeicher/fhem/FHEM/55_weco.pm line 96, near "$a)

Schöne Grüße
Frank