httpmod.template: bugs, Fragen, Anregungen

Begonnen von Beta-User, 21 Februar 2019, 12:04:17

Vorheriges Thema - Nächstes Thema

yersinia

Zitat von: Intruder1956 am 03 Dezember 2020, 12:36:31Hallo
kann es sein, das das Template für clever-tanken nicht mehr funktioniert, wegen Änderungen ?

Bekomme keine Preise angezeigt.
Das mit dem Template wäre zu prüfen -> @amenomade?

Darüber hinaus, hast du mal im BenzinpreisMonitor-Thread die letzten Beiträge durchgeschaut?
Möglicherweise findest du da schon Hinweise, welche Einstellungen (zB RegExe zu ändern wären).
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | 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

amenomade

#151
Zitat von: yersinia am 03 Dezember 2020, 11:36:48
Ich habe versucht, das nachzustellen mit dem Beispiel - und mir ist nicht ganz klar, wie ich als Endandwender hier par: sinnvoll ersetzen kann bzw soll? Ja, ich muss das in der DEF manuell im link ändern.

Die Parameter muss dann der User in einem Anfragefenster eingeben. Siehe Bild. Man kann die sogar besser dokumentieren.

Zitat von: yersinia am 03 Dezember 2020, 11:36:48

Zumal, wenn ich ein Device via
define TEST HTTPMOD none 0
erstelle und dann das Template aponet_pharmacy_emergency_service_germany auswähle, passiert nicht viel - zumindest die DEF wird nicht ersetzt. Ein List direkt nach der Erstellung:

:-[  Diese Version mit den Parametern habe ich noch nicht eingecheckt ;)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

yersinia

lol. und ich dachte schon, ich mach was falsch - aber, in der Tat, hätte ich mal ins SVN schauen können. ::)
Aber das Bild bzw par: ist ja mal cool mit dem Anwendungsfenster. Kann ich par: auch mit einem Wert vorbelegen in der Abrage? Also analog zu
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
Weil, dann könnte ich für die Templates den User fragen, welche Attribute er ersetzen möchte (zB PLZ) und welche Vorschlagswerte er behalten will (zB Schlauchlänge). Ungefähr so:
par:ZIPCODE;ZIP Code / Postleitzahl; {AttrVal("DEVICE","replacement01Value","12345" )}
par:LOADINGPOINTS;number of loading points / Lieferstellen; {AttrVal("DEVICE","replacement03Value","1" )}
par:HOSELENGTH;hose length / Schlauchlaenge (40m, 60m, 80m, 100m); {AttrVal("DEVICE","replacement04Value","40m" )}
par:TRUCKTYPE;truck type / mit/ohne Anhaenger; {AttrVal("DEVICE","replacement05Value","pr-truck-type=short_vehicle" )}
attr DEVICE replacement01Value ZIPCODE
attr DEVICE replacement02Value FUELAMOUNT
attr DEVICE replacement03VALUE LOADINGPOINTS
attr DEVICE replacement04Value HOSELENGTH
attr DEVICE replacement05Value TRUCKTYPE

Dann hätte der Endanwender noch die Möglichkeit, dies nach der initialen Templatenutzung noch anzupassen, zB die Liefermenge, vlt auch über ein Reading aus einem anderen (Füllstands-)Device.

Da könnte man bei clever-tanken auch die Tankstellen-ID analog zu abfragen.

Was denkst du?
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | 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

Beta-User

#153
ad "Vorbelegen": Jein...

"Echte" Abfragen kann man nur machen, wenn der Wert "undef" ist; ergo könnte man lediglich rausfinden, ob schon was gesetzt war (AttrVal("DEVICE","replacement04Value",undef )) und das dann verwenden und die (neuerliche) Abfrage in dem Fall verhindern, dass es eine Wiederholung ist.

Eine Auswahl im Sinne von "einen Wert von" geht auch, ist aber eher umständlich (RADIO_). Wer ein Beispiel sucht, wird ggf. bei zwave.template fündig; das erfordert dann aber auch eine andere Art der internen Steuerung mit "option".

Meine bisherige Erfahrung mit dem Thema war, dass die user eher irritiert waren, wenn mal eine Rückfrage aus den attrTemplate kommt. Generell würde es aber helfen, wenn das häufiger der Fall wäre, dann würden mehr User das als feature begreifen und nicht als Fehler, und auch mehr erfahrene User wissen, wo die tiefere Ursache für das Verhalten ist...
(@mqtt2.template kommt es meistens daher, dass die readingList nicht das enthält, was das betreffende template braucht, um die Parameter aufzulösen; besonders beliebt: Tasmota ohne LWT-Topic...)

Und man sollte dem User recht genau mitteilen, wie das im Detail auszusehen hat, ZIP-Code mag noch selbsterklärend sein, aber wie gebe ich den Radius an ("10" für 10 km?)?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

yersinia

Zitat von: Beta-User am 04 Dezember 2020, 10:47:50"Echte" Abfragen kann man nur machen, wenn der Wert "undef" ist; ergo könnte man lediglich rausfinden, ob schon was gesetzt war (AttrVal("DEVICE","replacement04Value",undef )) und das dann verwenden und die (neuerliche) Abfrage in dem Fall verhindern, dass es eine Wiederholung ist.
Verstanden, das wäre etwas schade, da der Endbenutzer dann auch, sagen wir bedingt optionale, Werte einfügen müsste. Wäre kein Drama, kann aber bei dem hier gewählten Beispiel umständlich sein. Und vor allem, wie beschreibt man das kurz und knapp?
par:ZIPCODE;German ZIP Code / deutsche Postleitzahl [12345, 87654, ...]; {AttrVal("DEVICE","replacement01Value",undef )}
par:LOADINGPOINTS;number of loading points / Lieferstellen [1, 2, 3, ...]; {AttrVal("DEVICE","replacement03Value",undef )}
par:HOSELENGTH;hose length / Schlauchlaenge [40m, 60m or 80m]; {AttrVal("DEVICE","replacement04Value",undef )}
par:TRUCKTYPE;truck type / mit/ohne Anhaenger [pr-truck-type=short_vehicle or pr-truck-type=]; {AttrVal("DEVICE","replacement05Value",undef )}
attr DEVICE replacement01Value ZIPCODE
attr DEVICE replacement02Value FUELAMOUNT
attr DEVICE replacement03Value LOADINGPOINTS
attr DEVICE replacement04Value HOSELENGTH
attr DEVICE replacement05Value TRUCKTYPE


Zitat von: Beta-User am 04 Dezember 2020, 10:47:50Meine bisherige Erfahrung mit dem Thema war, dass die user eher irritiert waren, wenn mal eine Rückfrage aus den attrTemplate kommt. Generell würde es aber helfen, wenn das häufiger der Fall wäre, dann würden mehr User das als feature begreifen und nicht als Fehler, und auch mehr erfahrene User wissen, wo die tiefere Ursache für das Verhalten ist...
Und man sollte dem User recht genau mitteilen, wie das im Detail auszusehen hat, ZIP-Code mag noch selbsterklärend sein, aber wie gebe ich den Radius an ("10" für 10 km?)?
Ähnlich verhält es sich mit "hier ein Grundgerüst, die eins bis zehn parameter (Attribute, DEF usw) musst du selbst adaptieren" - ist für den Einen ein Kinderspiel, für den anderen ein Buch mit sieben Siegeln.
Aber genügt dafür in der par bzw. template Beschreibung ein Text? Meine Erfahrung zeigt, dass nur wenige Anwender lesen und noch weniger auch Verstehen, was da dann ggf. steht (das berühmte Leseverständnis aus der Schulzeit ::)). (mal davon abgesehen, dass die Doku nicht immer aktuell sein muss) Da ist einfach mal jmd fragen einfacher und vor allem bequemer.
Von daher tendiere ich in dem obigen Beispiel eher zu einer frag-ob-der-vorbelegte-Wert-für-dein-Anwendungsfall-passt-Funktion.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | 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

Beta-User

Die Beschreibung finde ich von der Richtung her ok, und wenn man dann einen Link (in desc:) hat, über den man zu funktionalen Beispielen kommt, ist "eigentlich" jede Frage beantwortbar (dass die User das aus mir nicht bekannten Gründen bisher nicht zu schätzen wissen, ist eine andere Baustelle, aber da können wir ja gemeinsam dran arbeiten).

"Bedingt optional" ist ein Problem; mit einem Parameter geht es, wenn man "stufenweise" verfährt, aber dafür ist das framework heute eigentlich nicht ausgelegt. Falls jemanden Details interessieren: Das war ein "spezielles" Problem bei den Sprachsteuerungs-attrTemplate-addons, und TomLee und ich haben "ewig" rumprobiert, bis das halbwegs flüssig für alle Fälle gelaufen ist... (Müßte den Link dazu suchen, für seine Geduld müsste man ihn fast heilig sprechen ::) ).

Zitat von: yersinia am 04 Dezember 2020, 12:24:05
Von daher tendiere ich in dem obigen Beispiel eher zu einer frag-ob-der-vorbelegte-Wert-für-dein-Anwendungsfall-passt-Funktion.
Du kannst das gerne bei Rudi anfragen; nach meinem Verständnis wäre das aber ein ziemlicher Eingriff in den Code von AttrTemplate.pm, und ich bin ehrlich nach wie vor froh, dass wir den Baukasten auf dem Niveau haben, wie er derzeit ist, und ich bin mir auch nicht sicher, bis zu welchem Punkt man den Usern verstehendes Lesen abnehmen sollte. Manche Erwartungshaltung ist wirklich unbeschreiblich :o .
Was Vorbelegung bzw. Vorschläge für defaults angeht, könnte man (ungetestet) ggf. mit <b>Vorschlag</b> arbeiten, also
[<b>40m</b>, 60m or 80m]
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

yersinia

Valide und seh' ich ähnlich.
Die Frage ist ob sich der Aufwand überhaupt lohnt, ob der Mehrwert gegeben ist. Bevor man sich die Mühe macht, das halbwegs elegant lösen zu wollen, kann man das auch -wie in den fuel-templates- auch so lassen. Dann muss der Endanwender die drei bis fünf Attribute selber auf seine Bedürfnisse anpassen. Weiterführende Infos sind ja auch verlinkt. Aber da wären wir wieder beim Leseverständnis. Im Endeffekt wird dann doch wieder ein Thread aufgemacht. Irgendwann ist man selbst auch mal ein taubes Nüßchen, irgendwo, irgendwann...

Dazu muss ich noch sagen, dass der Link in der Beschreibung etwas unscheinbar ist (ich nutze den Style dark), vlt. sollte man weg vom Source: Forum zum for further infomation and documentation visit this FHEM forum thread oder so.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | 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

Beta-User

Zitat von: yersinia am 04 Dezember 2020, 13:38:52
Valide und seh' ich ähnlich.
Die Frage ist ob sich der Aufwand überhaupt lohnt, ob der Mehrwert gegeben ist. Bevor man sich die Mühe macht, das halbwegs elegant lösen zu wollen, kann man das auch -wie in den fuel-templates- auch so lassen. Dann muss der Endanwender die drei bis fünf Attribute selber auf seine Bedürfnisse anpassen. Weiterführende Infos sind ja auch verlinkt. Aber da wären wir wieder beim Leseverständnis.
Na ja, meine Erwartungshaltung wäre, dass der User nach der Konfiguration via attrTemplate dann ein "nutzbares" Device hat. Also lieber eine Rückfrage als ein fehlendes Attribut (optional ist was anderes). Man kann übrigens in den userAttr-Angaben auch gleich Werte vorgeben (mit einem Doppelpunkt). Dann hat man direkt ein passendes drop-down (oder widget, ganz nach Gusto). Sollte man eher sparsam einsetzen, ist aber möglich ;) . (die 10-er Schritte mit fixem Ende bei ASC finde ich persönlich eher nicht hilfreich, v.a., wenn das dann vorhandene Werte überschreibt; das steht hier an dieser Stelle aber nur zur Verdeutlichung der gefühlten Grenzen für die Methode an sich!)

ZitatIm Endeffekt wird dann doch wieder ein Thread aufgemacht. Irgendwann ist man selbst auch mal ein taubes Nüßchen, irgendwo, irgendwann...
Das Problem ist doch nicht, dass man nicht (als User/Forennutzer/Entwickler/Mensch...) irgendwie auch eine Menge Fehler machen darf. Dann bekommt man eben einen mehr oder weniger freundlichen Hinweis, und gut ist; in der Regel hängt das "mehr oder weniger" nach meiner Beobachtung v.a. auch davon ab, wie groß der Anteil des "au weia" ist... (Und wie hartnäckig jemand dann in die falsche Richtung rennt).

ZitatDazu muss ich noch sagen, dass der Link in der Beschreibung etwas unscheinbar ist (ich nutze den Style dark), vlt. sollte man weg vom Source: Forum zum for further infomation and documentation visit this FHEM forum thread oder so.
Na ja, room for improvement gibt es wohl immer, und wie was rauskommt, kann man auch nicht immer überblicken; ich für meinen Teil habe da oft auch "auf Verdacht" gearbeitet, einfach, damit die Dinge überhaupt irgendwo dokumentiert waren, und manches ist entstanden, als es noch nicht "neuere Methoden" gab. Wenn da jemand konkrete Verbesserungsvorschläge für das hat, was noch unter meiner svn-Verantwortung ist: feel free, ich nehme nicht für mich in Anspruch, da übermäßig gut gearbeitet zu haben ::) .
Nach heutigen Maßstäben würde ich auch manches anders machen, und bei anderem wird halt jetzt nachgezogen, was ggf. verbesserungswürdig ist; alles kein Beinbruch, oder?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

yersinia

Dropdown für Attribute. *facepalm* Da hätte man (sprich: ich) auch früher drauf kommen können. Nicht, das man das schon des öfteren Benutzt hat. Dann kann man die Parameter wirklich auf -in diesem Beispiel- die wirklich individuellen Attributwerte PLZ und Liefermenge abfragen. Danke für den Denkanstoß. :)

Zitat von: Beta-User am 04 Dezember 2020, 14:01:16Na ja, room for improvement gibt es wohl immer, und wie was rauskommt, kann man auch nicht immer überblicken; ich für meinen Teil habe da oft auch "auf Verdacht" gearbeitet, einfach, damit die Dinge überhaupt irgendwo dokumentiert waren, und manches ist entstanden, als es noch nicht "neuere Methoden" gab. Wenn da jemand konkrete Verbesserungsvorschläge für das hat, was noch unter meiner svn-Verantwortung ist: feel free, ich nehme nicht für mich in Anspruch, da übermäßig gut gearbeitet zu haben ::) .
Nach heutigen Maßstäben würde ich auch manches anders machen, und bei anderem wird halt jetzt nachgezogen, was ggf. verbesserungswürdig ist; alles kein Beinbruch, oder?
Seh ich genauso. Was man gestern getan hat würde man heute eventuell anders gestalten. Außerdem: um zu kritisieren, muss man erstmal was in der Hand haben. Von daher von meiner Seite keine Kritik sondern die Frage nach einem gemeinsamen Verbesserungsversuch und Diskussion. Das hier viele Menschen eigentlich was recht Großes geschaffen haben, steht außer Frage. Zumindest für mich.

So, b2t. Anbei ein neuer Vorschlag für die heizoel Abfragen.
easyoil:
#Contributed by subseven & yersinia, see https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754
name:fuel_oil_check
filter:TYPE=HTTPMOD
desc: checks fuel oil prices via easyoil.com<br />Define a HTTPMOD device like<br>define heizoelpreis HTTPMOD https://www.esyoil.com/preisausgabe.php?pr-unloading-points=%%ENTLADESTELLEN%%&pr-product=8&pr-payment-type=2&%%ANHAENGER%%&pr-hose-length=%%SCHLAUCHLAENGE%%&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit= 3600<br />Maintain Attributes for ZIP (PLZ), order volume (Bestellmenge) and unloading points (Entladestellen), hose length (Schlauchlaenge) and truck trailer accessibility (mit Anhaenger moeglich) before senseful values can be retrieved.<br />Further information and documentation can be found in <a href="https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754">this FHEM forum thread</a>
order:FUEL03
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:INTERVAL;Actual interval for updating, defaults to hourly (3600s); {InternalVal("DEVICE","Interval",3600)}
par:ZIPCODE;German ZIP Code / deutsche Postleitzahl; {AttrVal("DEVICE","replacement01Value",undef)}
par:ORDERVOLUME;fuel order volume in litre / Bestellmenge in Liter; {AttrVal("DEVICE","replacement02Value",undef)}
defmod DEVICE HTTPMOD https://www.esyoil.com/preisausgabe.php?pr-unloading-points=%%ENTLADESTELLEN%%&pr-product=8&pr-payment-type=2&%%ANHAENGER%%&pr-hose-length=%%SCHLAUCHLAENGE%%&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit= INTERVAL
attr DEVICE userattr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value replacement03Mode:reading,internal,text,expression,key replacement03Regex replacement03Value:1,2,3,4,5,6,7,8,9,10 replacement04Mode:reading,internal,text,expression,key replacement04Regex replacement04Value:40m,60m,80m replacement05Mode:reading,internal,text,expression,key replacement05Regex replacement05Value:pr-truck-type=,pr-truck-type=short_vehicle
attr DEVICE enableControlSet 1
attr DEVICE reading010Name Heizoelpreis
attr DEVICE reading010OExpr $val =~ s/,/\./;; $val;;
attr DEVICE reading010Regex ([\d\,]+)[\s]+€
attr DEVICE replacement01Mode text
attr DEVICE replacement01Regex %%PLZ%%
attr DEVICE replacement01Value ZIPCODE
attr DEVICE replacement02Mode text
attr DEVICE replacement02Regex %%MENGE%%
attr DEVICE replacement02Value ORDERVOLUME
attr DEVICE replacement03Mode text
attr DEVICE replacement03Regex %%ENTLADESTELLEN%%
attr DEVICE replacement03Value 1
attr DEVICE replacement04Mode text
attr DEVICE replacement04Regex %%SCHLAUCHLAENGE%%
attr DEVICE replacement04Value 40m
attr DEVICE replacement05Mode text
attr DEVICE replacement05Regex %%ANHAENGER%%
attr DEVICE replacement05Value pr-truck-type=
attr DEVICE room WHICHROOM
attr DEVICE stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $lastCheck = FmtDateTime(InternalVal($name,".LastUpdate",0));;\
my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";;\
my $link = "https://www.esyoil.com/preisausgabe.php?";;\
$link .= "pr-unloading-points=".AttrVal($name,"replacement03Value","");;\
$link .= "&pr-product=8&pr-payment-type=2";;\
$link .= "&".AttrVal($name,"replacement05Value","");;\
$link .= "&pr-hose-length=".AttrVal($name,"replacement04Value","");;\
$link .= "&pr-app=1&pr-zip=".AttrVal($name,"replacement01Value","");;\
$link .= "&pr-amount=".AttrVal($name,"replacement02Value","");;\
$link .= "&submit=";;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;)</div>";;\
return $ret;;\
}
attr DEVICE webCmd reread
attr DEVICE timeout 10
attr DEVICE model fuel_oil_check
setreading DEVICE attrTemplateVersion 20201204


heizoel24:
#Contributed by yersinia, see https://forum.fhem.de/index.php/topic,107189.msg1055334.html#msg1055334
name:fuel_oil_check_heizoel24
filter:TYPE=HTTPMOD
desc: checks fuel oil prices via heizoel24.de<br />Define a HTTPMOD device like<br />https://www.heizoel24.de/heizoelpreise-direkt/%%PLZ%%/%%MENGE%%/%%ENTLADESTELLEN%% 3600<br />Maintain Attributes for ZIP (PLZ), order volume (Bestellmenge) and unloading points (Entladestellen) before senseful values can be retrieved.<br />Further information and documentation can be found in <a href="https://forum.fhem.de/index.php/topic,107189.msg1055334.html#msg1055334">this FHEM forum thread</a>
order:FUEL04
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:INTERVAL;Actual interval for updating, defaults to hourly (3600s); {InternalVal("DEVICE","Interval",3600)}
par:ZIPCODE;German ZIP Code / deutsche Postleitzahl; {AttrVal("DEVICE","replacement01Value",undef)}
par:ORDERVOLUME;fuel order volume in litre / Bestellmenge in Liter; {AttrVal("DEVICE","replacement02Value",undef)}
defmod DEVICE HTTPMOD https://www.heizoel24.de/heizoelpreise-direkt/%%PLZ%%/%%MENGE%%/%%ENTLADESTELLEN%% 3600
attr DEVICE userattr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value replacement03Mode:reading,internal,text,expression,key replacement03Regex replacement03Value:1,2,3,4,5,6,7,8,9,10
attr DEVICE enableControlSet 1
attr DEVICE reading010Name Heizoelpreis
attr DEVICE reading010OExpr $val =~ s/,/\./;; $val;;
attr DEVICE reading010Regex <span class="unitprice">([\d\,]+)[\s]+<span
attr DEVICE replacement01Mode text
attr DEVICE replacement01Regex %%PLZ%%
attr DEVICE replacement01Value ZIPCODE
attr DEVICE replacement02Mode text
attr DEVICE replacement02Regex %%MENGE%%
attr DEVICE replacement02Value ORDERVOLUME
attr DEVICE replacement03Mode text
attr DEVICE replacement03Regex %%ENTLADESTELLEN%%
attr DEVICE replacement03Value 1
attr DEVICE room WHICHROOM
attr DEVICE stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $lastCheck = FmtDateTime(InternalVal($name,".LastUpdate",0));;\
my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";;\
my $link = "https://www.heizoel24.de/heizoelpreise-direkt";;\
$link .= "/".AttrVal($name,"replacement01Value","");;\
$link .= "/".AttrVal($name,"replacement02Value","");;\
$link .= "/".AttrVal($name,"replacement03Value","");;\
$ret .= "&nbsp;;<a href=\"".$link."\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;;\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;)</div>";;\
return $ret;;\
}
attr DEVICE timeout 10
attr DEVICE webCmd reread
attr DEVICE model fuel_oil_check_heizoel24
setreading DEVICE attrTemplateVersion 20201204


Und, für amenomade zum einfacheren kopieren, der HM-fw-check nochmal:
#Contributed by Pfriemler, mcp & yersinia, see https://forum.fhem.de/index.php/topic,78501.msg1104534.html#msg1104534
name:hm_fw_check_v2
filter:TYPE=HTTPMOD
desc: check for homematic firmware updates; based on new link provided by Pfriemler (switch from eq-3.de to update.homematic.com) and includes HmIP adaption provided by mcp<br />Define an HTTPMOD device like <br>define DEVICE HTTPMOD https://update.homematic.com/firmware/api/firmware/search/DEVICE 86400<br />Further information and documentation can be found in <a href="https://forum.fhem.de/index.php/topic,78501.msg1106499.html#msg1106499">this FHEM forum thread</a>
order:TECHZ04
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:INTERVAL;Actual interval for updating, defaults to one day (86400s); {InternalVal("DEVICE","Interval",86400)}
defmod DEVICE HTTPMOD https://update.homematic.com/firmware/api/firmware/search/\DEVICE INTERVAL
attr DEVICE userattr reading01AutoNumLen reading01Name reading01RegOpt reading01Regex reading02AutoNumLen reading02Name reading02RegOpt reading02Regex readingMaxAge readingMaxAgeReplacementMode:text,reading,internal,expression,delete showNewFWOnly:yes,no
attr DEVICE do_not_notify 1
attr DEVICE enableControlSet 1
attr DEVICE icon hm_ccu
attr DEVICE reading01AutoNumLen 3
attr DEVICE reading01Name hmfw-type
attr DEVICE reading01RegOpt g
attr DEVICE reading01Regex (?i)"type":"((?:\w+[-]*){1,})
attr DEVICE reading02AutoNumLen 3
attr DEVICE reading02Name hmfw-version
attr DEVICE reading02RegOpt g
attr DEVICE reading02Regex (?si)"version":"(\d+[.]\d+[.]\d+)
attr DEVICE readingMaxAge 10
attr DEVICE readingMaxAgeReplacementMode delete
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE showNewFWOnly yes
attr DEVICE stateFormat {   my $ret ="";;\
my $lastCheck = FmtDateTime(InternalVal($name,".LastUpdate",0));;\
my $nextCheck = FmtDateTime(InternalVal($name,".TRIGGERTIME",0));;\
my $cellstyle = "padding:3pt;;border-bottom:1px dotted lightgray;;";;\
    $ret .= '<div style="text-align:left;;">';;\
    $ret .= '<div>last <a title="eq3-downloads" href="http://www.eq-3.de/service/downloads.html" rel="noopener noreferrer" target="_blank">homematic</a>-fw-check => '.$lastCheck;;\
    $ret .= '</div>';;\
    my $check = ReadingsVal($name,"newFwForDevices","error => no or wrong data from eq3-server!");;\
    if($check eq "no fw-updates needed!") {\
      $ret .= '<div style="color:limegreen;;font-weight:bold;;">';;\
      $ret .= $check;;\
      $ret .= '</div>';;\
    } elsif($check eq "error => no or wrong data from eq3-server!") {\
      $ret .= '<div style="color:red;;font-weight:bold;;">';;\
      $ret .= $check;;\
      $ret .= '</div>';;\
    } else {\
$ret .= '<div style="display:table;;width:100%;;">';;\
$ret .= '<div style="display:table-row;;">';;\
      $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:50%;;font-weight:bold;;">device</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:40%;;font-weight:bold;;">model</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:5%;;font-weight:bold;;">current</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:5%;;font-weight:bold;;">new</div>';;\
$ret .= '</div>';; #header\
      my @devices = split(',',$check);;\
      foreach my $devStr (@devices) {\
my ($dev,$idx) = $devStr =~ m/([^\s]+)\s[(](\d+)[)]/;;\
my $md = ReadingsVal($name,("hmfw-type-".$idx),"?");;\
my $ofw = InternalVal($dev,"firmware",AttrVal($dev,"firmware","0.0"));;\
my $nfw = ReadingsVal($name,("hmfw-version-".$idx),"none");;\
        my $fw_link = "https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=".$md;;\
$ret .= '<div style="display:table-row;;">';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:50%;;">';;\
        $ret .= '<a href="/fhem?detail='.$dev.'" target="_blank">';;\
$ret .= AttrVal($dev,"alias",$dev);;\
        $ret .= '</a></div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:30%;;font-weight:bold;;color:lightgrey;;">';;\
        $ret .= $md;;\
        $ret .= '</div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:10%;;font-weight:bold;;color:lightgrey;;">';;\
        $ret .= $ofw;;\
        $ret .= '</div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:10%;;font-weight:bold;;color:red;;">';;\
        $ret .= '<a title="download firmware file" href="'.$fw_link.'" rel="noopener noreferrer" target="_blank" style="color:red;;">';;\
        $ret .= $nfw;;\
        $ret .= '</a></div>';;\
        $ret .= '</div>';; #row\
      }\
  $ret .= '</div>';; #table\
    }\
$ret .= "<br \/><div style=\"text-align:left;;\">(next check: ".$nextCheck.")</div>";;\
    $ret .= '</div>';;\
  return $ret;;\
}
attr DEVICE userReadings newFwForDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  my $newfwonly = AttrVal($name,"showNewFWOnly","yes");;\
  if (ReadingsVal($name,"UNMATCHED_READINGS","?") eq "") {\
    my @eq3FwList = map { \
sprintf(uc(ReadingsVal($name,"hmfw-type-".$_,"?")).":".ReadingsVal($name,"hmfw-version-".$_,"?").":".$_);;\
} ReadingsVal($name,"MATCHED_READINGS","?")=~ m/hmfw-version-(\d\d\d)/g;;\
\
foreach my $dev (devspec2array("TYPE=CUL_HM|HMCCUDEV:FILTER=DEF=(......|..............):FILTER=subType!=virtual")) {\
my $md = uc(InternalVal($dev,"ccutype",AttrVal($dev,"model","?")));;\
my $v = InternalVal($dev,"firmware",AttrVal($dev,"firmware","0.0"));;\
        my ($h,$l) = split('\.',$v);;\
        foreach my $newFW (grep m/^${md}:/i,@eq3FwList) {\
my ($fwmd, $fwv, $idx) = $newFW =~ m/([^:]+):(\d+[.]\d+[.]\d+):(\d+)$/;;\
my ($fwh, $fwl) = split('\.',$fwv);;\
if(($newfwonly eq "no") || (($fwh > $h) || (($fwh == $h) && ($fwl > $l)))) {\
  $ret .= "," if($ret ne "");;\
  $ret .= $dev." (".$idx.")";;\
        }\
      }\
    }\
  } else {\
    $ret = "error => no or wrong data from eq3-server!";;\
  }\
  return ($ret eq "")?"no fw-updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model hm_fw_check_v2
setreading DEVICE attrTemplateVersion 20201202
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | 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

Beta-User

Zitat von: yersinia am 04 Dezember 2020, 15:04:03
Dropdown für Attribute. *facepalm* Da hätte man (sprich: ich) auch früher drauf kommen können.
nevermind...

Das Problem kommt mir bekannt vor, man sieht halt irgendwann den Wald nicht mehr vor lauter Bäumen, und die jeweils "beste" Methode zur Lösung eines bestimmten Problems drängt sich auch nicht immer auf. Von daher ist es manchmal eben ein längerer Weg, bis dann mal was wirklich "fertig" ist :) .

Zitat
Außerdem: um zu kritisieren, muss man erstmal was in der Hand haben. Von daher von meiner Seite keine Kritik sondern die Frage nach einem gemeinsamen Verbesserungsversuch und Diskussion. Das hier viele Menschen eigentlich was recht Großes geschaffen haben, steht außer Frage. Zumindest für mich.
Klar, und um "gute Kritik" zu formulieren oder Verbesserungsmöglichkeiten aufzuzeigen, muss man auch - bis zu einem gewissen Maß - verstanden haben, über was man eigentlich redet...

Von daher hoffe ich, dass meine Hinweise betr. die Funktionalität etc. als konstruktitive Begleitung angekommen sind, denn ich bin wirklich ausgesprochen froh, dass sich jetzt mit amenomade jemand um attrTemplate@HTTPMOD kümmert, der von der Funktionsweise des Moduls wirklich was versteht und euch bei der Weiterentwicklung dann auch passende und kritische Rückfragen stellen kann (ich war da oft aufgeschmissen) und hier auch wieder mehr Bewegung drin ist.

Das Teilen von best practice hilft m.E. nämlich am Ende wirklich allen :) .
(Da fällt mir ein: ich sollte mal ein paar meiner Test-HTTPMODs in meinem Hauptsystem löschen, dann habe ich auch weniger Einträge im Log... ::) )
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

amenomade

Danke für die interessante Diskussion.

Ich habe eingecheckt (mit Korrektur in stateFormat von heizung24 - zu viele Semikola)

@Intruder1956: ich gucke noch clever-tanken. War das single oder multi?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

@Intruder1956: bei mir funktionieren noch beide Templates.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Intruder1956

Hallo,
es ist Single und SuperE10 wird nicht angezeigt.

Danke und gute Nacht
Zotac CI547 32GB RAM 500GB SSD,ESXI 6.5, VM-Fhem5.8, VM-ioBroker, Cul 868Mhz;Cul 433Mhz = Busware, LGW, HM-MOD-RPI-PCB, Uniroll, IT YCR-100 TMT2100,ITR-1500, LD382 mit Wifilight, ESA 2000 + SENSOR WZ SET,FS20 TFK, HM-Sec-SC, HM-CC-RT-DN,PCA301,

amenomade

Zitat von: Intruder1956 am 05 Dezember 2020, 00:20:27
Hallo,
es ist Single und SuperE10 wird nicht angezeigt.

Danke und gute Nacht
Hast Du auf der Webseite geguckt, ob E10 tatsächlich angeboten bzw. dargestellt wird?

http://www.clever-tanken.de/tankstelle_details/deineStationNummer
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Intruder1956

guten morge, jau hab ich  :)
http://www.clever-tanken.de/tankstelle_details/28587

hier mal ein List, falls du danach fragst

Internals:
   .LASTSEND  1607154474.72053
   .LastUpdate 1607154473.64234
   .TRIGGERTIME 1607156273.64234
   .getList   
   .setList   interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
   .updateRequestHash 1
   BUSY       0
   DEF        http://www.clever-tanken.de/tankstelle_details/28587 1800
   FUUID      5fc362f5-f33f-4aae-6c23-46838f42dc5d4ce3
   Interval   1800
   MainURL    http://www.clever-tanken.de/tankstelle_details/28587
   ModuleVersion 4.0.12 - 24.10.2020
   NAME       TankeJoachimstr
   NOTIFYDEV  global
   NR         733
   NTFY_ORDER 50-TankeJoachimstr
   STATE      E5: 1.309 € / E10: SuperE10 € / D: 1.139 €
   TYPE       HTTPMOD
   value     
   .attraggr:
   .attrminint:
   .readingParseList:
     01
     02
     03
   CompiledRegexes:
   HTTPCookieHash:
     csrftoken;:
       Name       csrftoken
       Options    expires=Sat, 04-Dec-2021 07:47:55 GMT; Max-Age=31449600; Path=/
       Path       
       Value      KiuaSfZmoLdMrouO5uDnYfMTQiWiaoE0Heo9gfrZWRwGQ2k9pSRaYUn6LVap73oP
   Helper:
     DBLOG:
       Diesel:
         DBLogging:
           TIME       1607154482.72248
           VALUE      1.139
       SuperE5:
         DBLogging:
           TIME       1607154482.72248
           VALUE      1.309
   HttpUtils:
     NAME       
     addr       https://www.clever-tanken.de:443
     auth       0
     buf       
     code       200
     compress   1
     conn       
     data       
     displayurl https://www.clever-tanken.de/tankstelle_details/28587
     header     Cookie: csrftoken=KiuaSfZmoLdMrouO5uDnYfMTQiWiaoE0Heo9gfrZWRwGQ2k9pSRaYUn6LVap73oP
     host       www.clever-tanken.de
     httpheader HTTP/1.1 200 OK
Date: Sat, 05 Dec 2020 07:47:54 GMT
Server: Apache/2.4.18 (Ubuntu)
Vary: Cookie,Accept-Encoding
Content-Encoding: gzip
Content-Length: 32718
Content-Type: text/html; charset=utf-8
Set-Cookie: csrftoken=KiuaSfZmoLdMrouO5uDnYfMTQiWiaoE0Heo9gfrZWRwGQ2k9pSRaYUn6LVap73oP; expires=Sat, 04-Dec-2021 07:47:55 GMT; Max-Age=31449600; Path=/
Connection: close
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    443
     hu_portSfx
     ignoreredirects 1
     loglevel   4
     path       /tankstelle_details/28587
     protocol   https
     redirects  0
     timeout    10
     url        https://www.clever-tanken.de/tankstelle_details/28587
     sslargs:
   QUEUE:
   READINGS:
     2020-12-05 08:48:02   Diesel          1.139
     2020-12-05 08:48:02   SuperE5         1.309
     2020-12-03 10:58:16   attrTemplateVersion 20201129
   REQUEST:
     context    reading
     data       
     header     
     ignoreredirects 0
     num        0
     priority   1
     retryCount 0
     type       update
     url        https://www.clever-tanken.de/tankstelle_details/28587
   defptr:
     readingBase:
       Diesel     reading
       SuperE5    reading
     readingNum:
       Diesel     01
       SuperE5    03
     readingOutdated:
     requestReadings:
       update:
         Diesel     reading 01
         SuperE5    reading 03
Attributes:
   enableControlSet 1
   model      clever_tanken_single_station
   reading01Name Diesel
   reading01Regex <div class=\"price-type-name\">Diesel</div>[\S\s\r\n]*?<span id=\"current-price-\d+\">(\d.\d{2}</span>[\S\s\r\n]*?<sup id=\"suffix-price-\d\">[\d]+)</sup>
   reading02Name SuperE10
   reading02Regex <div class=\"price-type-name\">Super E10</div>[\S\s\r\n]*?<span id=\"current-price-\d+\">(\d.\d{2}</span>[\S\s\r\n]*?<sup id=\"suffix-price-\d\">[\d]+)</sup>
   reading03Name SuperE5
   reading03Regex <div class=\"price-type-name\">Super E5</div>[\S\s\r\n]*?<span id="current-price-\d+">(\d.\d{2}</span>[\S\s\r\n]*?<sup id=\"suffix-price-\d\">[\d]+)</sup>
   readingOExpr $val =~ s/<[\d\D]+>//;;$val
   room       HTTPMOD
   stateFormat E5: SuperE5 € / E10: SuperE10 € / D: Diesel €
   timeout    10
   userattr   reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex readingOExpr
   verbose    2


Gruß Intruder
Zotac CI547 32GB RAM 500GB SSD,ESXI 6.5, VM-Fhem5.8, VM-ioBroker, Cul 868Mhz;Cul 433Mhz = Busware, LGW, HM-MOD-RPI-PCB, Uniroll, IT YCR-100 TMT2100,ITR-1500, LD382 mit Wifilight, ESA 2000 + SENSOR WZ SET,FS20 TFK, HM-Sec-SC, HM-CC-RT-DN,PCA301,