URL für HTTPMOD dynamisch generieren

Begonnen von Jackie, 13 Juli 2022, 06:26:39

Vorheriges Thema - Nächstes Thema

Jackie

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!
Raspi 3 mit FHEM, LWZ 304 Trend, Fronius Symo 10.0-3-M, Conbee II Stick, Optokoppler (USB, FTDI), diverse Ikea Tradfri Komponenten,...

yersinia

Das Zauberwort ist replacement 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 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.
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Jackie

#2
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.
Raspi 3 mit FHEM, LWZ 304 Trend, Fronius Symo 10.0-3-M, Conbee II Stick, Optokoppler (USB, FTDI), diverse Ikea Tradfri Komponenten,...

yersinia

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. ;)
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Jackie

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...
Raspi 3 mit FHEM, LWZ 304 Trend, Fronius Symo 10.0-3-M, Conbee II Stick, Optokoppler (USB, FTDI), diverse Ikea Tradfri Komponenten,...

yersinia

#5
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 extrahieren.
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Jamo

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.
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

Jackie

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!
Raspi 3 mit FHEM, LWZ 304 Trend, Fronius Symo 10.0-3-M, Conbee II Stick, Optokoppler (USB, FTDI), diverse Ikea Tradfri Komponenten,...

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

yersinia

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 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). 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
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl