Neue Version von HTTPMOD mit neuen Features zum Testen

Begonnen von StefanStrobel, 05 Dezember 2015, 08:31:32

Vorheriges Thema - Nächstes Thema

fireball

Hi, meine readingsproxys gehen auf das httpmod.
Die readingsproxys, die ich einrichten möchte, stehen für eine jalousie. Der httpmod übernimmt die Kommunikation zum jalousiehub.
Eine setURL, um eine jalousie anzusprechen sieht so aus
PATCH /data/v2/domain/Shutter/$$VALUE1$$/RequestAction
Ich würde jetzt gern $$VALUE1$$ mit dem gleichen reading aus dem aufrufende readingsproxy dynamisch setzen...
Wahrscheinlich über ein replacement readings... Wobei das dann ungefähr so aussehen würde readingsval("readingsproxy", "devicenummer", "0")

Vg René

Prof. Dr. Peter Henning

Aber _never_ mit $$name$$. Sinnvollerweise %%name%%

LG

pah

StefanStrobel

Zitat von: fireball am 29 Januar 2024, 16:40:03Ich finde aktuell nur die Möglichkeit einen Wert zu übergeben, $val, aber es gibt doch bestimmt mit den replacements etc. auch die Möglichkeit mehrere Werte zu ersetzen?!

siehe post #1284. Mit der neuen Version zum Testen sollte das einfacher gehen:
ZitatMit dem Attribut (get|set)[0-9]*(-[0-9]+)?ValueSeparator kann man ein Trennzeichen für set-Optionen definieren und dann in einem set mehrere Parameter übergeben, die dann mit $val1, $val2 etc. referenziert werden können.

Gruss
  Stefan

fireball

Vielen Dank für deine Mühe Stefan, ich werde das am Wochenende gleich mal ausprobieren.
VG René

fireball

Zitat von: StefanStrobel am 02 Februar 2024, 17:57:08siehe post #1284. Mit der neuen Version zum Testen sollte das einfacher gehen:

Hi Stefan, ich habe das mal ausprobiert, soweit funktioniert das ganz gut, anbei bei mal ein Log:
2024.02.04 18:57:00 5: WiserHub: set called with LiftTo 1,50
2024.02.04 18:57:00 5: WiserHub: set found option LiftTo in attribute set01Name
2024.02.04 18:57:00 4: WiserHub: set will now set LiftTo -> 1,50
2024.02.04 18:57:00 5: WiserHub: AddToQueue adds type set01 to URL http://192.168.178.112/data/v2/domain/Shutter/$val1/RequestAction, data {"Action":"LiftTo", "Percentage":$val2}, header Secret: %%WiserHub_Secret%%, retry 0, initial queue len: 0
2024.02.04 18:57:00 5: WiserHub: HandleSendQueue called from AddToSendQueue, qlen = 1
2024.02.04 18:57:00 5: WiserHub: HandleSendQueue - call with HTTP METHOD: PATCH
2024.02.04 18:57:00 5: WiserHub: Replace called for type set01, regex (?^:%%WiserHub_Secret%%), mode key, value WiserHub_Secret input: Secret: %%WiserHub_Secret%%
2024.02.04 18:57:00 5: WiserHub: ReadKeyValue tries to read value for WiserHub_Secret from file
2024.02.04 18:57:00 5: WiserHub: Replace: key WiserHub_Secret value is xxxxxxxxx
2024.02.04 18:57:00 5: WiserHub: Replace: match for type set01, regex (?^:%%WiserHub_Secret%%), mode key, value WiserHub_Secret, input: Secret: %%WiserHub_Secret%%, result is Secret: xxxxxxxxx
2024.02.04 18:57:00 5: WiserHub: Replace called for type set01, regex (?^:%%WiserHub_Secret%%), mode key, value WiserHub_Secret input: {"Action":"LiftTo", "Percentage":$val2}
2024.02.04 18:57:00 5: WiserHub: ReadKeyValue tries to read value for WiserHub_Secret from file
2024.02.04 18:57:00 5: WiserHub: Replace called for type set01, regex (?^:%%WiserHub_Secret%%), mode key, value WiserHub_Secret input: http://192.168.178.112/data/v2/domain/Shutter/$val1/RequestAction
2024.02.04 18:57:00 5: WiserHub: ReadKeyValue tries to read value for WiserHub_Secret from file
2024.02.04 18:57:00 5: WiserHub: found , as separator for multiple values (Context set01, 01)
2024.02.04 18:57:00 4: WiserHub: HandleSendQueue sends set01 with timeout 2 to http://192.168.178.112/data/v2/domain/Shutter/1/RequestAction,
data: {"Action":"LiftTo", "Percentage":50},
header: Secret:
2024.02.04 18:57:00 5: WiserHub: ReadCallback called from __ANON__
2024.02.04 18:57:00 4: WiserHub: Read callback: request type was set01 retry 0,
header: HTTP/1.1 200 OK
Content-Length: 2
Content-Type: application/json
Keep-Alive: timeout=5, max=5, body length 2
2024.02.04 18:57:00 5: WiserHub: Read callback: body
{}

Was mir aber aufgefallen ist, im FHEMWEB wird der Seperator unter Attributes nicht angezeigt, im list Device isser aber drin oder wenn man Attribut anklickt und bearbeiten möchte, dann isser auch da.

VG René


DocCyber

Hallo zusammen.

ich würde gern einen Wert ändern und den geänderten Wert sofort danach mit ReadingsVal() abrufen können.
Dazu habe ich das entsprechende Reading, sowie ein passendes get und set (mit FollowGet) Kommando definiert.

Um das zu testen, gebe ich in der Kommandozeile ein:
{fhem("set goe current 12");; my $ret = ReadingsVal("goe", "current", "0");; return $ret;;}Für dieses Beispiel würde ich 12 als Rückgabewert erwarten, aber ich erhalte stets den alten, zuvor gesetzten Wert.



define goe HTTPMOD http://192.168.xxx.yy/status?filter=alw,amp,car,err,eto,nrg 600

attr goe get03Name current
attr goe get03URL http://192.168.178.33/status?filter=amp

attr goe reading03Name current
attr goe reading03JSON amp

attr goe set02Name current
attr goe set02FollowGet current
attr goe set02URL http://192.168.178.33/mqtt?payload=amp=$val

attr goe event-on-change-reading car,alw,amp,err,tmp,nrg_.*,eto,dws,wst,current
attr goe event-on-update-reading alw,car,amp,dws,nrg,current
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-3 mit HM-CFG-LAN und jede Menge HM Komponenten.

Prof. Dr. Peter Henning

Das wundert mich nicht. Schließlich muss zuerst der Wert im goe gesetzt werden, alleine das dauert seine Zeit. Und dann wurde der geänderte Wert noch lange nicht gelesen, dazu muss erst noch das mit set02FollowGet definierte "get current" ausgeführt werden.

Entweder in die Perl-Zeile eine Wartezeit einbauen, oder besser: Auf den geänderten Wert des Readings current triggern.

LG

pah

DocCyber

Zitat von: Prof. Dr. Peter Henning am 12 März 2024, 15:40:37Entweder in die Perl-Zeile eine Wartezeit einbauen, oder besser: Auf den geänderten Wert des Readings current triggern.

Wartezeit habe ich schon versucht; möglicherweise ist 1 Sekunde zu kurz - obwohl das ja eigentlich schon eine Riesenzeitspanne darstellen sollte.

Triggern macht m.E. in einem laufenden Perlscript nicht viel Sinn - der Code läuft ja weiter.
Behandle die Menschen so, als wären sie, was sie sein sollten. Dadurch hilfst du ihnen zu werden, was sie sein können. (Goethe)


RPi-3 mit HM-CFG-LAN und jede Menge HM Komponenten.

cwagner

#1313
Das Pollenflugbeispiel aus dem Wiki (hier) hatte ich seit langem im Einsatz. Nach dem Wechsel auf PI-OS (Debian) Bookworm wird das Device nicht (mehr) aktualisiert - kopiere ich es als RAW 1:1 auf einen Server mit PI-OS "Bullseye" funktioniert alles.

Auch die Variante Pollenflug von PA Henning habe ich vergeblich unter Bookworm versucht, zu installieren - auch hier wird anscheinend die Seite nicht aufgerufen und damit gibt es auch keine Ergebnisse nach dem Parsen.

Die Angaben mit verbose=5 helfen mir nicht:
2024.03.20 20:33:49 4: Pollenflug: GetUpdate called (update)
2024.03.20 20:33:49 4: Pollenflug: UpdateTimer called from GetUpdate with cmd next sets timer to call update function in 60.0 sec at 20:34:49.512, interval 60
2024.03.20 20:33:49 5: Pollenflug: AddToQueue adds type update to URL https://www.donnerwetter.de/pollenflug/osterholz-scharmbeck/DE22218.html, no data, header User-Agent: Mozilla/5.0 (Windows NT 6.0), retry 0, initial queue len: 0
2024.03.20 20:33:49 5: Pollenflug: HandleSendQueue called from AddToSendQueue, qlen = 1
2024.03.20 20:33:49 5: Pollenflug: no separator for multiple values (Context update, unknown)
2024.03.20 20:33:49 4: Pollenflug: HandleSendQueue sends update with timeout 2 to https://www.donnerwetter.de/pollenflug/osterholz-scharmbeck/DE22218.html, No Data,
header: User-Agent: Mozilla/5.0 (Windows NT 6.0)
2024.03.20 20:33:49 5: Pollenflug: ReadCallback called from __ANON__
2024.03.20 20:33:49 5: Pollenflug: Read callback Error LogLvl set to 3, regex
2024.03.20 20:33:49 3: Pollenflug: Read callback: Error: DNS: short DNS answer
2024.03.20 20:33:49 4: Pollenflug: Read callback: request type was update retry 0, no headers, no body
2024.03.20 20:33:49 5: Pollenflug: Read callback: body empty
2024.03.20 20:33:49 4: Pollenflug: BodyDecode is not decoding the response body (charset not found, bodyDecode defaults to none)
2024.03.20 20:33:49 5: Pollenflug: GetCookies is looking for Cookies
2024.03.20 20:33:49 5: Pollenflug: ExtractSid called, context reading, num unknown
2024.03.20 20:33:49 4: Pollenflug: no header to look for redirects
2024.03.20 20:33:49 5: Pollenflug: Read callback sets LAST_REQUEST to update
2024.03.20 20:33:49 5: Pollenflug: CheckAuth decided no authentication required
2024.03.20 20:34:00 5: Pollenflug: attr Pollenflug verbose

Das Intervall ist nur aus Testgründen auf die in diesem Fall unsinnigen 60 Sekunden festgelegt.

Hat jemand ähnliche Erfahrungen oder gar einen hilfreichen Vorschlag?

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

StefanStrobel

Hallo Christian,

du kannst Die Zeile mit use Data::Dumper einfach auskommentieren.
Die Funktion war nur fürs Debugging nötig. Ich entferne sie in der nächsten Version.

Gruß
    Stefan

Prof. Dr. Peter Henning

Zitat von: DocCyber am 12 März 2024, 18:20:29Triggern macht m.E. in einem laufenden Perlscript nicht viel Sinn - der Code läuft ja weiter.

Nicht doch. Die Abarbeitung sollte immer asynchron sein, also erst bei erfolgtem Update weiterlaufen.

Und "eine Sekunde" ist in einem Prozess, der eine asynchrone Aktion über ein Netzwerk beinhaltet, eben keine gar so große Zeitspanne.

LG

pah

cwagner

#1316
[gelöst]
Zitat von: StefanStrobel am 21 März 2024, 08:00:29..
du kannst Die Zeile mit use Data::Dumper einfach auskommentieren.
Die Funktion war nur fürs Debugging nötig. Ich entferne sie in der nächsten Version.
...

Vielen Dank, Stefan, dass Du Dich meines Problems angenommen hast. Habe die Zeile auskommentiert, neu geladen, doch leider, wird immer noch nicht aktualisiert, auch in einem weiteren Device (mit PAHennings Ansatz)

2024.03.21 11:16:38 4: PM: GetUpdate called (update)
2024.03.21 11:16:38 4: PM: UpdateTimer called from GetUpdate with cmd next sets timer to call update function in 60.0 sec at 11:17:38.922, interval 60
2024.03.21 11:16:38 5: PM: AddToQueue adds type update to URL https://www.wetteronline.de/pollen?gid=10734&lat=49.42&locationname=Heidelberg&lon=8.70, no data, no headers, retry 0, initial queue len: 0
2024.03.21 11:16:38 5: PM: HandleSendQueue called from AddToSendQueue, qlen = 1
2024.03.21 11:16:38 5: PM: no separator for multiple values (Context update, unknown)
2024.03.21 11:16:38 4: PM: HandleSendQueue sends update with timeout 2 to https://www.wetteronline.de/pollen?gid=10734&lat=49.42&locationname=Heidelberg&lon=8.70, No Data, No Header
2024.03.21 11:16:38 5: PM: ReadCallback called from __ANON__
2024.03.21 11:16:38 5: PM: Read callback Error LogLvl set to 3, regex
2024.03.21 11:16:38 3: PM: Read callback: Error: DNS: short DNS answer
2024.03.21 11:16:38 4: PM: Read callback: request type was update retry 0, no headers, no body
2024.03.21 11:16:38 5: PM: Read callback: body empty
2024.03.21 11:16:38 4: PM: BodyDecode is not decoding the response body (charset not found, bodyDecode defaults to none)
2024.03.21 11:16:38 5: PM: GetCookies is looking for Cookies
2024.03.21 11:16:38 5: PM: ExtractSid called, context reading, num unknown
2024.03.21 11:16:38 4: PM: no header to look for redirects
2024.03.21 11:16:38 5: PM: Read callback sets LAST_REQUEST to update
2024.03.21 11:16:38 5: PM: CheckAuth decided no authentication required
2024.03.21 11:17:05 4: Pollenflug: GetUpdate called (update)
2024.03.21 11:17:05 4: Pollenflug: UpdateTimer called from GetUpdate with cmd next sets timer to call update function in 60.0 sec at 11:18:05.511, interval 60
2024.03.21 11:17:05 5: Pollenflug: AddToQueue adds type update to URL http://www.donnerwetter.de/pollenflug/berlin/DE14356.html, no data, header User-Agent: Mozilla/5.0 (Windows NT 6.0), retry 0, initial queue len: 0
2024.03.21 11:17:05 5: Pollenflug: HandleSendQueue called from AddToSendQueue, qlen = 1
2024.03.21 11:17:05 5: Pollenflug: no separator for multiple values (Context update, unknown)
2024.03.21 11:17:05 4: Pollenflug: HandleSendQueue sends update with timeout 2 to http://www.donnerwetter.de/pollenflug/berlin/DE14356.html, No Data,
header: User-Agent: Mozilla/5.0 (Windows NT 6.0)
2024.03.21 11:17:05 5: Pollenflug: ReadCallback called from __ANON__
2024.03.21 11:17:05 5: Pollenflug: Read callback Error LogLvl set to 3, regex
2024.03.21 11:17:05 3: Pollenflug: Read callback: Error: DNS: short DNS answer
2024.03.21 11:17:05 4: Pollenflug: Read callback: request type was update retry 0, no headers, no body
2024.03.21 11:17:05 5: Pollenflug: Read callback: body empty
2024.03.21 11:17:05 4: Pollenflug: BodyDecode is decoding the response body as utf8 but charset header is not found
2024.03.21 11:17:05 5: Pollenflug: GetCookies is looking for Cookies
2024.03.21 11:17:05 5: Pollenflug: ExtractSid called, context reading, num unknown
2024.03.21 11:17:05 4: Pollenflug: no header to look for redirects
2024.03.21 11:17:05 5: Pollenflug: Read callback sets LAST_REQUEST to update
2024.03.21 11:17:05 5: Pollenflug: CheckAuth decided no authentication required

Edit: Das Problem hatte nichts mit den Updates zu tun, sondern lag an einem bei Systemumzug mitgeschleiften fehlerhaften DNS-Eintrag im Device Global

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

fireball

Zitat von: StefanStrobel am 02 Februar 2024, 17:57:08
Zitat von: fireball am 29 Januar 2024, 16:40:03Ich finde aktuell nur die Möglichkeit einen Wert zu übergeben, $val, aber es gibt doch bestimmt mit den replacements etc. auch die Möglichkeit mehrere Werte zu ersetzen?!

siehe post #1284. Mit der neuen Version zum Testen sollte das einfacher gehen:
ZitatMit dem Attribut (get|set)[0-9]*(-[0-9]+)?ValueSeparator kann man ein Trennzeichen für set-Optionen definieren und dann in einem set mehrere Parameter übergeben, die dann mit $val1, $val2 etc. referenziert werden können.

Hi Stefan, ist die Änderung jetzt schon im offziellen Modul drin?
VG+Danke
René

Gruss
  Stefan

Prof. Dr. Peter Henning

Eine Bitte an alle: Nicht immer den bequemen Button "Zitieren" verwenden, das müllt das ganze Forum zu. Der Button "Antworten" ist OBEN.

LG

pah