Hallo,
ist es möglich, die URL für das Modul HTTPMOD dynamisch zu generieren, indem z.B. das aktuelle Datum in der URL übergeben wird?
Ich brauche tagesaktuell eine solche Abfrage:
define SolarCurrentString1 HTTPMOD http://192.168.178.105/solar_api/v1/GetArchiveData.cgi?Scope=System&StartDate=13.7.2022&EndDate=13.7.2022&&Channel=Current_DC_String_1
Wobei hinter startdate und Enddate immer das tagesaktuelle Datum gesetzt werden soll. Wie kann ich das umsetzen? Vielen Dank!
Das Zauberwort ist replacement (https://wiki.fhem.de/wiki/HTTPMOD#Further_replacements_of_URL.2C_header_or_post_data) mit replacment Mode expression. In etwa so (ungetestet):
define SolarCurrentString1 HTTPMOD http://192.168.178.105/solar_api/v1/GetArchiveData.cgi?Scope=System&StartDate=%%TODAY%%&EndDate=%%TODAY%%&&Channel=Current_DC_String_1
attr SolarCurrentString1 replacement01Mode expression
attr SolarCurrentString1 replacement01Regex %%TODAY%%
attr SolarCurrentString1 replacement01Value POSIX::strftime("%d.%m.%Y", localtime(time));;
attr SolarCurrentString1 devStateStyle style="text-align:right"
attr SolarCurrentString1 event-min-interval 180
attr SolarCurrentString1 icon solar_icon
attr SolarCurrentString1 webCmd reread
attr SolarCurrentString1 reading1Name CurrentString1
attr SolarCurrentString1 reading1Regex (00" : )(?!(?s:.*)(00" : ))(.*)
attr SolarCurrentString1 room Hauswirtschaftsraum
Da du noch einen weiteren Thread bezgl RegEx aufgemacht (https://forum.fhem.de/index.php/topic,128377.0.html) hast, frage ich mich, welches Datenformat diese SolarAPI zurück liefert. Unter Umständen gibt es noch andere Lösungsoptionen (bereits bestehende HTTPMOD-Tenplates, andere SolarModule, JsonMod etc).
Btw, bitte benutze code-tags - der # Button über dem Texteingabeffeld.
Danke yersinia, ich bin parallel auf eine ähnliche Lösung wie du gekommen, hier mal mein Code:
define SolarCurrentString1 HTTPMOD http://192.168.178.105/solar_api/v1/GetArchiveData.cgi?Scope=System&StartDate=%%date%%&EndDate=%%date%%&&Channel=Current_DC_String_1
attr SolarCurrentString1 replacement01Mode expression
attr SolarCurrentString1 replacement01Regex %%date%%
attr SolarCurrentString1 replacement01Value {$mday.'.'.$month.'.'.$year}
weder deine noch meine Lösung funktionieren zur Zeit, ich frage mich warum, wenn ich die Expression {$mday.'.'.$month.'.'.$year} in Fhemweb teste dann wird der richtige String zrückgeliefert. Frage: müsste ich das Replacement irgendwo in dem Device in FHEM sehen? Ich sehe da nur die "Rohfassung", also mit Variable, aber wo sehe ich was tatsächlich ersetzt wurde? Das würde das Testing erheblich vereinfachen wenn man das Ergebnis irgendwo sehen könnte.
So sieht das bei mir aus (siehe Anhang)
Die Daten stammen von einem Fronius Wechselrichter, das was ich auslesen möchte kann aber das derzeitige 98_Fronius.pm1 Modul (noch) nicht, daher versuche ich mir hier eine Lösung zu "basteln" :-) Der Output ist JSON wie es aussieht, so könnte man das sicher noch eleganter machen, aber ich will erstmal sehen ob das grundsätzlich so funktioniert.
Ja, hab ich gesehen - auch deine Frage in dem Thread dort. Man könnte dies schon fast als doppel/tripple post ansehen...
Hast du mal getestet, was
{$mday.'.'.$month.'.'.$year}
zurückliefert?
Bekommst du ein Ergebnis wenn du die API so aufrufst?
http://192.168.178.105/solar_api/v1/GetArchiveData.cgi?Scope=System&StartDate=13.07.2022&EndDate=13.07.2022&&Channel=Current_DC_String_1
Wenn du da nichts bekommst, könnte es an der führenden 0 liegen, was auch
POSIX::strftime("%d.%m.%Y", localtime(time));;
generiert.
Ohne führende 0 müsste mit
POSIX::strftime("%-d.%-m.%Y", localtime(time));;
funktionieren.
Wenn auch dies nicht funktioniert, musst du das verbose level des httpmod device erhöhen und die Fehlermeldungen und den generierten Link posten. Ansonsten wird es schwer mittels "geht bei mir nicht" eine Fehleranalyse zu unterstützen.
Du kannst aber auch hoffen, dass dir jemand im Fronius Thread hilft, in dem du es ja auch schon angefragt hast (https://forum.fhem.de/index.php/topic,113850.msg1227768.html#msg1227768). ;)
Hallo yersinia,
{$mday.'.'.$month.'.'.$year} liefert bei mir das Datum ohne führende 0 im Monat (13.07.2022) zurück, sollte also passen, die Fronius API akzeptiert erfreulicherweise sogar beide Schreibweisen. Den Loglevel werde ich mal hochsetzen und schauen was ich dort sehe. Ich habe derzeit auch noch das Problem dass ich die "alten" Readings nicht wegbekomme aus meinen vorherigen Rgex-Versuchen, kann ich das Device irgendwie komplett "resetten"?
Zum Thema mehrere Posts: da das ja teilweise sehr grundlegende Dinge zu URL-Generierung (hier), Regex (anderer Thread) etc. sind und nur zweitrangig mal mit dem Fronius zusammenhängen hatte ich den Eindruck dass man das auch für spätere ähnliche Probleme vielleicht trennen sollte, kann man natürlich anders sehen...
Leider sind wiki und commandref zum Thema replacementMode expression etwas unklar, einen Schuss ins Freie wäre noch
attr SolarCurrentString1 replacement01Value { return POSIX::strftime("%d.%m.%Y", localtime(time));; }
Edit: wenn du die Daten bekommst, kannst du auch bestimmte Json Werte mit get01JSON (https://wiki.fhem.de/wiki/HTTPMOD#Parsing_JSON) extrahieren.
Du kannst doch auch einfach ein modify vom HTTPMOD machen, also so was wie
my $StartDate=13.7.2022
my $EndDate=14.7.2022
modify -silent SolarCurrentString1 HTTPMOD http://192.168.178.105/solar_api/v1/GetArchiveData.cgi?Scope=System&StartDate=$StartDate&EndDate=$EndDate&&Channel=Current_DC_String_1
Aber das modify muss dann von extern, z.B. über ein at angestossen werden.
Ich denke ich habe den Fehler gefunden, hinter dem Define von HTTPMOD fehlt noch ein Updateintervall, z.B. 60 für 60 Sekunden, kann es sein dass das Gane sonst nur einmal ausgeführt wird? Damit funktioniert yersinias erste Lösung, mein Regex funktioniert leider (noch) nicht, aber damit gibt es schonmal einen funktionierenden Ansatz, auf dem ich weiter aufbauen kann.
Die JSON-Funktionalität schau ich mir definitiv noch an, danke für den Tipp!
Die Lösung mit modify ist, wenn ich die DOku richtig verstehe, die "alte" Variante und braucht eben erwähnten at, weswegen ich ihn nicht ganz so elegant finde, wäre aber auf jeden Fall auch ein Ansatz, also auch Danke für diesen Tipp!
Zitat von: Jackie am 13 Juli 2022, 09:20:04
hinter dem Define von HTTPMOD fehlt noch ein Updateintervall, z.B. 60 für 60 Sekunden, kann es sein dass das Gane sonst nur einmal ausgeführt wird?
Nein. Wenn Du kein Intervall angibst, der default-Wert von 300 Sekunden benutzt. Hättest Du Dir einmal die "Mühe" gemacht, ins FHEM-Log zu schauen, hättest Du das dort sogar nachlesen können.
Zitat von: Jackie am 13 Juli 2022, 08:07:27
Der Output ist JSON wie es aussieht, so könnte man das sicher noch eleganter machen
Mit "eleganter" hat das nichts zu tun - aber wenn Du schon JSON als Ausgangsdaten hast, warum benutzt Du dann nicht JsonMod für die Verarbeitung, sondern brichst Dir die Finger an HTTPMOD? Man muss doch nicht jeden Scheiss mit HTTPMOD versuchen zu lösen.
Das ganze Geraffel mit dem modify etc. würde ich mir ersparen. Ein Cronjob, der auf Betriebssystemebene die Daten regelmäßig abholt und in eine Datei schreibt und in FHEM dann diese Datei als Input verwenden. Das funktioniert stabil, und zuverlässig und ist vor allem logisch nachvollziehbar.
Zitat von: betateilchen am 13 Juli 2022, 09:30:22Mit "eleganter" hat das nichts zu tun - aber wenn Du schon JSON als Ausgangsdaten hast, warum benutzt Du dann nicht JsonMod für die Verarbeitung, sondern brichst Dir die Finger an HTTPMOD? Man muss doch nicht jeden Scheiss mit HTTPMOD versuchen zu lösen.
Wenn der TE schon mit Wiki, commandref und Forum es kaum schafft, HTTPMOD zu definieren, dann wird JsonMod bei der Datenlage (https://forum.fhem.de/index.php/topic,113850.msg1227768.html#msg1227768) mMn schwierig. JsonMod erlaubt imho keine URL-Manipulation zur Laufzeit, er müsste gezielt den Pfad raussuchen und (wahrscheinlich) auch noch eine Funktion implementieren, die ihm die Sekunden seit Mitternacht gerundet auf 300s zurückliefert (jdfs ist das mein Verständnis der Werte aus der Quelle (https://forum.fhem.de/index.php/topic,113850.msg1227768.html#msg1227768)). Geht alles, aber bei dem derzeitigen Wissensstand des TEs ... herausfordernd. Für alle.
Zitat von: betateilchen am 13 Juli 2022, 09:30:22Ein Cronjob, der auf Betriebssystemebene die Daten regelmäßig abholt und in eine Datei schreibt und in FHEM dann diese Datei als Input verwenden. Das funktioniert stabil, und zuverlässig und ist vor allem logisch nachvollziehbar.
;D