FHEM Forum

FHEM => Sonstiges => Thema gestartet von: Beta-User am 21 Februar 2019, 12:04:17

Titel: httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 21 Februar 2019, 12:04:17
Hallo zusammen,

Bitte nutzt möglichst diesen Thread, wenn ihr Fragen zur Nutzung von httpmod.template habt oder neue templates vorschlagen wollt.

Allgemeine Fragen die Nutzung des features attrTemplate an sich (also nicht speziell auf httpmod bezogen) gehören bitte nicht hierher.

Super wäre, wenn bei Vorschlägen für neue templates für HTTPMOD entsprechend auch die Hinweise in diesem Thread beachtet werden könnten (https://forum.fhem.de/index.php/topic,94495.msg872201.html#msg872201) (da gibt es auch einen link zum entsprechenden Thread für MQTT2_DEVICE). Besonders schön wäre es, wenn jeweils die Quelle in der desc mit angegeben werden könnte, damit man als user ggf. den passenden Thread findet. Das erleichtert es ggf., den HTTPMOD dann leichter an die individuellen Wünsche anzupassen.

Sinnvoll ist es, zuerst die Hinweise zu einzelnen httpmod.templates zu lesen. Diese erhält man mit set <device> attrTemplate ?
Wer einfach mal schauen will, was es so gibt, kann einfach irgendein HTTPMOD-Device definieren und dann mal schauen, was es so gibt, ohne erst den Quelltext nach den jeweiligen URL's durchsuchen zu müssen. Beispiel:
define myAttrTemplateViewer HTTPMOD www.spiegel.de 0
set myAttrTemplateViewer attrTemplate ?

Viel Spaß mit dem neuen Feature!

Beta-User
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 26 Februar 2019, 07:49:57
Servus!

Zitat von: Beta-User am 26 Februar 2019, 07:44:32
Da ich mich aber a) mit regex auch nicht leicht tue und b) nicht im schönen Österreich wohne:

Regex kann ich (ein bisschen ;-) ).
Zeit habe ich aber wenig, bin viel dienstlich unterwegs, oft auch ohne Internet.
Werde sehen, dass ich den Regex noch verbessere!
Gibt es auch eine Wunschliste?
Ich hätte gerne ein Template für Bergfex (https://www.bergfex.at/sommer/innsbruck/wetter/),
da das in meiner Region das genaueste Wetter ist... Im Moment komme ich nicht selber dazu, da die Seite doch recht viele Werte ausgibt!
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 26 Februar 2019, 08:23:00
Servus zurück!

bergfex wäre natürlich super, da hätte ich sogar ein "gewisses" Eigeninteresse dran.
(Aber diese Webseitenausleserei im Quältext, da bin ich noch nicht richtig drin :( . Meinen ersten HTTPMOD habe ich angelegt beim Zusammensuchen des ersten template-Vorschlags für StefanStrobel, um ihn von der Sinnhaftigkeit der Unterstützung von attrTemplate zu überzeugen, ansonsten reichen eigentlich ja meistens sehr einfache Einzeiler...)

Ansonsten ist mir auch klar, dass du auch andere Baustellen hast, dann machen wir es ggf. halt iterativ mit dem ORF-Wetter, ist ja nicht schlimm, die derzeitige und die vorige Version funktionieren (ggf. nach Anpassung) ja.

@all: Hat da jemand eine Art Grundlage für bergfex.at?
Muß ja nicht gleich super-duper sein, ein Anfang mit ein paar Basiswerten wäre halt gut...

Wenn mich da jemand aufschlauen will, wie man am besten ganz allgemein mit Seiten wie bergfex.at umgeht, wäre das auch nett.

Generell: Wenn jemand anderes, der mehr Ahnung vom Webseiten-Auslesen hat, die Pflege der httpmod-Templates (ggf. mit) übernehmen möchte, wäre das für mich auch ok.
Kurz zum Hintergrund: Ich hatte vor wenigen Monaten die modulseitige Unterstützung für attrTemplate bei StefanStrobel angefragt. Bei den MQTT2-templates war schon zu sehen, dass es auch und eigentlich gerade für HTTPMOD einen großen Bedarf geben müßte, eine Art zentraler Beispielsammlung zu haben. Ich hatte mal vor längerer Zeit einen lust- und erfolglosen Versuch für meinen Brother-Drucker unternommen, dabei ist mir aufgefallen, dass man beim Suchen von passenden HTTPMOD-Beispielen für häufige Fragestellungen endlos im Forum und Wiki suchen konnte und am Ende oft nicht wußte, was jetzt warum gut ist bzw. wie auf die eigenen Bedürfnisse vollends anzupassen (jedenfalls, wenn man so ein noob in dem Thema ist wie meinereiner).

Nachdem attrTemplate für HTTPMOD jetzt "etabliert" ist (was schneller gegangen zu sein scheint, als ich das vorher vermutet hätte), wäre m.E. jetzt der nächste Schritt, dass das jemand übernimmt, der da bei den regex-Geschichten und der Funktionalität von HTTPMOD im allgemeinen besser durchblickt.
Wir könnten auch gerne ein Duo daraus machen, vor allem, wenn jemand Interessiertes Bedarf bei der Unterstützung zu den "speziellen" Anforderungen der "template-Sprache" sehen sollte (ist m.E. nicht wirklich speziell).

Gruß, Beta-User
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: DeeSPe am 26 Februar 2019, 10:33:44
https://www.bergfex.at/sommer/innsbruck/wetter/

Regex Ort:
forecast-current">\n\n.+?<h2>\n\s+(.*?)\n.+?</
Regex Höhe:
h2-sub">\n.+?(\d{1,4})\sm
Regex Temperatur:
temperature">\n.+<span.class="value">(.*?)</
Regex Niederschlag:
Niederschlag:\s(.*?)%
Regex letze Aktualisierung:
important">Heute,\s(.*?)</
Regex Wetterzustand:
\d\d:\d\d</span>\n.+-\s(.*?)\n
Regex Text Wetter heute:
h2>\n.+Heute,\s.*?\n</h2>\n\n<div\sclass="txt_markup"><p>(.*?)</
Regex Text Wetter morgen:
h2>\n.+Morgen,\s.*?\n</h2>\n\n<div\sclass="txt_markup"><p>(.*?)</
Regex Text Wetter übermorgen:
h2>\n.+Übermorgen,\s.*?\n</h2>\n\n<div\sclass="txt_markup"><p>(.*?)</

Regexe für die Prognose (https://www.bergfex.at/sommer/innsbruck/wetter/prognose/)

Icon:
"forecast-day-0"\n.*\n.*\n\n.*\n.*"icon"><img\ssrc="(.*?)"
Tmax:
"forecast-day-0"\n.*\n.*\n\n.*\n.*\n\n.*\n.*?"tmax">(.*?)°C</
Tmin:
"forecast-day-0"\n.*\n.*\n\n.*\n.*\n\n.*\n.*\n.*?"tmin">(.*?)°C</
nschnee:
"forecast-day-0"\n.*\n.*\n\n.*\n.*\n\n.*\n.*\n.*\n.*?"nschnee.">\n(.*?)</
rrr:
"forecast-day-0"\n.*\n.*\n\n.*\n.*\n\n.*\n.*\n.*\n.*\n.*\n.*\n\n.*\n.*?"rrr.*?">\n(.*)</
rrp:
"forecast-day-0"\n.*\n.*\n\n.*\n.*\n\n.*\n.*\n.*\n.*\n.*\n.*\n\n.*\n.*\n.*\n\n.*?"rrp.*">\n(.*?)%</
sgrenze:
"forecast-day-0"\n.*\n.*\n\n.*\n.*\n\n.*\n.*\n.*\n.*\n.*\n.*\n\n.*\n.*\n.*\n\n.*\n.*\n.*\n.*?class="group\ssgrenze">\n(.*?)m</
Sonnendauer:
"forecast-day-0"\n.*\n.*\n\n.*\n.*\n\n.*\n.*\n.*\n.*\n.*\n.*\n\n.*\n.*\n.*\n\n.*\n.*\n.*\n.*\n.*\n.*\n.*?"sonne.*">\n(.*?)h?</
Gewitterwahrscheinlichkeit:
"forecast-day-0"\n.*\n.*\n\n.*\n.*\n\n.*\n.*\n.*\n.*\n.*\n.*\n\n.*\n.*\n.*\n\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*?Gewitterwahrscheinlichkeit:\s\d{1,3}%">\n(.*?)</
Wind:
"forecast-day-0"\n.*\n.*\n\n.*\n.*\n\n.*\n.*\n.*\n.*\n.*\n.*\n\n.*\n.*\n.*\n\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*?"ff\s\s"\s>\n(.*?)</


Die 0 (Null) bei "forecast-day-0" kann beliebig von 0-8 ausgetauscht werden um die Vorhersage für die kommenden 8 Tage zu erhalten.

Was wird noch benötigt?

Gruß
Dan
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 26 Februar 2019, 10:39:04
Zitat von: DeeSPe am 26 Februar 2019, 10:33:44

Was wird noch benötigt?

Wenn Du schon so fragst, dann:  ;)


Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: DeeSPe am 26 Februar 2019, 10:46:22
Zitat von: JoeALLb am 26 Februar 2019, 10:39:04
Wenn Du schon so fragst, dann:  ;)



  • 7 Tages Vorherschau (minMax Temp zur Heizungssteuerung/Pufferaufladung, Sonnenscheindauer, gemeldete Regenmenge)
  • Text Wetter Heute
  • Text Wetter morgen
  • Name der Icons

Hab die Wettertexte für heute, morgen und übermorgen ergänzt.
Die anderen Sachen gucke ich mir an.

Gruß
Dan

EDIT: Meinst Du die 9-Tage Wettervorhersage? 7 Tage finde ich nicht.
Die richtige Prognose steht leider auf einer eigenen Webseite (https://www.bergfex.at/sommer/innsbruck/wetter/prognose/).
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 26 Februar 2019, 10:55:36
Zitat von: DeeSPe am 26 Februar 2019, 10:46:22
EDIT: Meinst Du die 9-Tage Wettervorhersage? 7 Tage finde ich nicht.

Korrekt, wobei ich in der Visu und für die Heizungsoptimierung nur 7 Tage nutze....

Zitat von: DeeSPe am 26 Februar 2019, 10:46:22
Die richtige Prognose steht leider auf einer eigenen Webseite (https://www.bergfex.at/sommer/innsbruck/wetter/prognose/).
Puh, noch gar nicht aufgefallen (da ich am Handy deren App nutze)... Aber der Text scheint der selbe zu sein...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: DeeSPe am 26 Februar 2019, 11:01:39
Habe noch Ort und Höhe (https://forum.fhem.de/index.php/topic,97694.msg911704.html#msg911704) ergänzt.

Wenn Du wirklich die Prognosedaten brauchst, dann geht das (denke ich) nur über ein eigenes HTTPMOD Device auf die URL https://www.bergfex.at/sommer/innsbruck/wetter/prognose/ mit dementsprechenden eigenen Regexen.

Gruß
Dan
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 26 Februar 2019, 11:10:23
Wow...

Dann schaue ich bei Gelegenheit mal, wie ich das in template-Form gegossen bekomme :) .

Zitat von: DeeSPe am 26 Februar 2019, 11:01:39
Wenn Du wirklich die Prognosedaten brauchst, dann geht das (denke ich) nur über ein eigenes HTTPMOD Device auf die URL https://www.bergfex.at/sommer/innsbruck/wetter/prognose/ (https://www.bergfex.at/sommer/innsbruck/wetter/prognose/) mit dementsprechenden eigenen Regexen.
Hmm, irgendwo hatte ich mal einen HTTPMOD gesehen, der mehrere URL-Angaben jeweils für einen eigenen Reading-Bereich enthalten hatte. Allerdings war das einer, der aktiv aufgerufen wurde.
Leider habe ich grade keinen link, aber an sich würde ich wetten, dass man das in einen HTTPMOD packen kann.

(Wenn das so ist: Wieder ein Beispiel dafür, wei mächtig das Tool ist und wie wenig verbreitet das Wissen, wie "die Macht" genutzt werden kann...)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 26 Februar 2019, 11:17:29
Zitat von: Beta-User am 26 Februar 2019, 11:10:23
Hmm, irgendwo hatte ich mal einen HTTPMOD gesehen, der mehrere URL-Angaben jeweils für einen eigenen Reading-Bereich enthalten hatte. Allerdings war das einer, der aktiv aufgerufen wurde.
Leider habe ich grade keinen link, aber an sich würde ich wetten, dass man das in einen HTTPMOD packen kann.
Ja, das geht... das könnt ich eventuell beisteuern... aktiv und nciht aktiv, ist nur ein Attribut das dies unterscheidet.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: DeeSPe am 26 Februar 2019, 11:20:19
Zitat von: JoeALLb am 26 Februar 2019, 11:17:29
Ja, das geht... das könnt ich eventuell beisteuern... aktiv und nciht aktiv, ist nur ein Attribut das dies unterscheidet.

Wenn das geht wäre es ja der Burner!
Ich kenne mich mit HTTPMOD eigentlich überhaupt nicht aus, ich mag nur Regex und damit Werte "herausfischen".

Gruß
Dan
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 26 Februar 2019, 11:23:44
Zitat von: Beta-User am 26 Februar 2019, 11:10:23
Dann schaue ich bei Gelegenheit mal, wie ich das in template-Form gegossen bekomme :) .

Schick mir, wenn Du das hast, dann versuche ich den Rest zu ergänzen!
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 26 Februar 2019, 11:30:12
Jungs, das gefällt mir, wie das vorangeht, wenn man die jeweiligen Kenntnisse zusammenwirft :) !

Zitat von: JoeALLb am 26 Februar 2019, 11:17:29
Ja, das geht... das könnt ich eventuell beisteuern... aktiv und nciht aktiv, ist nur ein Attribut das dies unterscheidet.
Das wäre klasse.

Bei der Gelegenheit:
Vielleicht mag dann auch jemand mit hp-Druckern unter diesem Gesichtspunkt einen Blick auf die hp-templates werfen?
Da ist es ähnlich, dass die diversen Infos (v.a. der Status und die Tonerwerte) aus unterscheidlichen Pfaden stammen und jeweils als eigener HTTPMOD abgebildet sind, aber eigentlich _ein_ HTTPMOD die bessere Lösung wäre.
(Ich habe nur keine hp's, sonst würde ich mich da "ausnahmsweise" selbst kümmern... Die sind auch erst mal so reingekommen, wie ich das "irgendwo" gefunden hatte ;D .)

Der template-Entwurf für bergfex.at kann etwas dauern, mal schauen.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 26 Februar 2019, 11:51:53
Anbei ein Beispiel, wie es mit 2 URLs funktioniert!
Wenn get01Poll=1, dann wird dies automatisch mit aktualisiert.
Wenn get01Poll =0, muss man ein "get wetter_bergfex 9-TagesPrognose" direkt abrufen. Man ist also ziemlich flexibel!
Der Regex "get01Regex" Muss natürlich noch aufgebohrt werden und ist hier nur beispielhaft verwendet.

defmod wetter_bergfex HTTPMOD https://www.bergfex.at/sommer/innsbruck/wetter/ 1800
attr wetter_bergfex userattr get01-1Name get01-2Name get01Name get01Regex get01URL
attr wetter_bergfex get01-1Name LetzteAktualisierung
attr wetter_bergfex get01-2Name Schneefallgrenze
attr wetter_bergfex get01Name 9-TagesPrognose
attr wetter_bergfex get01Poll 1
attr wetter_bergfex get01Regex Vorhersage von [^>]*>(.*?)</\p{Any}*?group sgrenze[^\d]*(.*?)m
attr wetter_bergfex get01URL https://www.bergfex.at/sommer/innsbruck/wetter/prognose/
attr wetter_bergfex group Temperatur-Außen
attr wetter_bergfex reading01Name lesteAktualisierung
attr wetter_bergfex reading01Regex important">Heute,\s(.*?)</
attr wetter_bergfex room Wetter
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 26 Februar 2019, 12:14:33
Hmmm, wenn ihr grade dabei seid, dann mal ein untetesteter erster template-Wurf:

name:A_02n_bergfex_at_weather
filter:TYPE=HTTPMOD
desc: Get austrian weather from bergfex.at.<br>Define a HTTPMOD device like <br>defmod wetter_bergfex HTTPMOD https://www.bergfex.at/sommer/innsbruck/wetter/ 1800 <br>Change city to your needs <br><a href="https://forum.fhem.de/index.php/topic,97694.msg911761.html#msg911761">Source: Forum</a>
par:URL_LONG;Name of the respective weather station as written in the last part of the URL;{ InternalVal("DEVICE","url","") =~ m,(https://www.bergfex.at/sommer/[^/]+[/]wetter/), ? $1 : undef }
attr DEVICE userattr get01-1Name get01-2Name get01Name get01Regex get01URL
attr DEVICE get01-1Name LetzteAktualisierung
attr DEVICE get01-2Name Schneefallgrenze
attr DEVICE get01Name 9-TagesPrognose
attr DEVICE get01Poll 1
attr DEVICE get01Regex Vorhersage von [^>]*>(.*?)</\p{Any}*?group sgrenze[^\d]*(.*?)m
attr DEVICE get01URL URL_LONGprognose/
attr DEVICE group Temperatur-Außen
attr DEVICE reading01Name letzteAktualisierung
attr DEVICE reading01Regex important">Heute,\s(.*?)</
attr DEVICE model A_02n_bergfex_at_weather
Da die diversen Abfragen - jedenfalls, soweit ich das verstanden habe - in der richtigen Reihenfolge kommen müssen, muß der Rest ggf. noch warten, bis ich das austesten kann - wen nicht jemand doch schneller ist ;) .
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: DeeSPe am 26 Februar 2019, 15:40:43
Habe noch die Prognose Regexe hinzugefügt (https://forum.fhem.de/index.php/topic,97694.msg911704.html#msg911704).
Kann leider nicht testen ob das wirklich in einem HTTPMOD Device funktioniert, da ich hier mit meinem FHEM-Testsystem keinen dauerhaften Internetzugang habe.

Gruß
Dan
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 27 Februar 2019, 09:34:44
So,

jetzt habe ich mal mit dieser Option rumgespielt, unterschiedliche URL's anzugeben (bei der eher einfachen Seite vom ORF), auch um ein besseres "Gefühl" für das zu bekommen, wei HTTPMOD überhaupt tickt. Leider bekomme ich immer noch keine Sonnendaten usw., sondern nur die erweiterten Wetterdaten.

List meines letzten Versuchs:
defmod wORF_neu HTTPMOD https://wetter.orf.at/steiermark/ 1800
attr wORF_neu userattr get01Name get01Poll:0,1 get01URL get02Name get02Poll:0,1 get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex reading02-1Name reading02-2Name reading02-3Name reading02-4Name reading02-5Name reading02-6Name reading02-7Name reading02-8Name reading02Regex
attr wORF_neu enableControlSet 1
attr wORF_neu get01Name Graz-Universität
attr wORF_neu get01Poll 1
attr wORF_neu get01URL https://wetter.orf.at/steiermark/grazuniversitaet/
attr wORF_neu get02Name Sonnendaten
attr wORF_neu get02Poll 1
attr wORF_neu get02URL https://wetter.orf.at/steiermark/
attr wORF_neu model A_02m_ORF_weather
attr wORF_neu reading01Regex (?s)Temperatur.*?.*?>.*?(?<temperature>[\d,]+)&thinsp.*?Taupunkt.*?.*?>.*?(?<taupunkt>[\d,]+)&thinsp.*?Wind.*?>\n\s*(?<wind>[^<]+)\s<abbr.*?Windspitzen.*?>\n\s*(?<windspitzen>[^<]+)\s<abbr.*?Luftdruck.*?>\n\s*(?<luftdruck>[^<]+)\s<abbr.*?Luftfeuchtigkeit.*?>\n\s*(?<humidity>[^<]+)\s<abbr.*?Sonnenschein.*?>\n\s*(?<sonne>[^<]+)\s<abbr.*?Niederschlag.*?>\n\s*(?<rain>[^<\n]+).*?</p.*?(?<messwerte>Messwerte[^<\n]+)
attr wORF_neu reading02-1Name sunRise
attr wORF_neu reading02-2Name sunSet
attr wORF_neu reading02-3Name moonPhase
attr wORF_neu reading02-4Name moonRise
attr wORF_neu reading02-5Name moonSet
attr wORF_neu reading02-6Name dayLength
attr wORF_neu reading02-7Name dawn
attr wORF_neu reading02-8Name dusk
attr wORF_neu reading02Regex Sonnenaufgang um <\/span>(.*)<s[\w\W]*Sonnenuntergang um <\/span>(.*)<s[\w\W]*Mondphase: (.*)\.[\w\W]*Mondaufgang um <\/span>(.*)<s[\w\W]*Monduntergang um <\/span>(.*)<s[\w\W]*Tagesl&auml;;;;nge: <\/span>(.*)&[\w\W]*Morgen<\/span>: <\/span>(.*)&[\w\W]*Abend:<\/span><\/span>(.*)&
attr wORF_neu room Wetter
attr wORF_neu stateFormat weather bei temperature°C

setstate wORF_neu weather bei 9,7°C
setstate wORF_neu 2019-02-27 09:22:50 humidity 42
setstate wORF_neu 2019-02-27 09:22:50 luftdruck 1027,5
setstate wORF_neu 2019-02-27 09:22:50 messwerte Messwerte von 9.00 Uhr
setstate wORF_neu 2019-02-27 09:22:50 rain 0,0
setstate wORF_neu 2019-02-27 09:22:50 sonne 60
setstate wORF_neu 2019-02-27 09:22:50 taupunkt 3,0
setstate wORF_neu 2019-02-27 09:22:50 temperature 9,7
setstate wORF_neu 2019-02-27 09:22:50 wind West, 3
setstate wORF_neu 2019-02-27 09:22:50 windspitzen Südwest, 8

Mit get ... Graz-Universität bekomme ich sauber die grazuniversität-Daten rein, aber get ... Sonnendaten klappt nicht. Hängt bestimmt nur an irgend einer Kleinigkeit, vielleicht sieht die jemand und mag mir den Trick verraten?

Anbei auch noch ein list von einer leicht angepassten Version des Ausgangscodes. Da klappt das mit den Sonnendaten:
defmod weatherORF HTTPMOD https://wetter.orf.at/steiermark/ 1800
attr weatherORF userattr reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex reading02-1Name reading02-2Name reading02-3Name reading02-4Name reading02-5Name reading02-6Name reading02-7Name reading02-8Name reading02Regex
attr weatherORF enableControlSet 1
attr weatherORF reading01-1Name temperature
attr weatherORF reading01-2Name weather
attr weatherORF reading01-3Name wind
attr weatherORF reading01-4Name windDir
attr weatherORF reading01-5Name precipitation
attr weatherORF reading01Regex Graz<\/h3>[\s\S]*temperature\">([&minus;;]*\d*,?\d?)[\s\S]*screen\">, ([\s\S]*)\.<\/span>[\s\S]*wind\">(\d*,?\d?)[\s\S]*screen\">,.([\s\S]*)\.[\s\S]*precipitation\">(\d*,?\d+)[\s\S]*sta-\d+
attr weatherORF reading02-1Name sunRise
attr weatherORF reading02-2Name sunSet
attr weatherORF reading02-3Name moonPhase
attr weatherORF reading02-4Name moonRise
attr weatherORF reading02-5Name moonSet
attr weatherORF reading02-6Name dayLength
attr weatherORF reading02-7Name dawn
attr weatherORF reading02-8Name dusk
attr weatherORF reading02Regex Sonnenaufgang um <\/span>(.*)<s[\w\W]*Sonnenuntergang um <\/span>(.*)<s[\w\W]*Mondphase: (.*)\.[\w\W]*Mondaufgang um <\/span>(.*)<s[\w\W]*Monduntergang um <\/span>(.*)<s[\w\W]*Tagesl&auml;;nge: <\/span>(.*)&[\w\W]*Morgen<\/span>: <\/span>(.*)&[\w\W]*Abend:<\/span><\/span>(.*)&
attr weatherORF room Wetter
attr weatherORF stateFormat weather bei temperature°C

setstate weatherORF heiter bei 8,7°C
setstate weatherORF 2019-02-27 09:19:40 dawn 06:12
setstate weatherORF 2019-02-27 09:19:40 dayLength 10:57
setstate weatherORF 2019-02-27 09:19:40 dusk 18:11
setstate weatherORF 2019-02-27 09:19:40 moonPhase Abnehmender Mond
setstate weatherORF 2019-02-27 09:19:40 moonRise 01:55
setstate weatherORF 2019-02-27 09:19:40 moonSet 11:13
setstate weatherORF 2019-02-27 09:19:40 precipitation 0,0
setstate weatherORF 2019-02-27 09:19:40 sunRise 06:43
setstate weatherORF 2019-02-27 09:19:40 sunSet 17:40
setstate weatherORF 2019-02-27 09:19:40 temperature 8,7
setstate weatherORF 2019-02-27 09:19:40 weather heiter
setstate weatherORF 2019-02-27 09:19:40 wind 3
setstate weatherORF 2019-02-27 09:19:40 windDir Süd
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 27 Februar 2019, 09:55:07
Zitat von: Beta-User am 27 Februar 2019, 09:34:44
Leider bekomme ich immer noch keine Sonnendaten usw., sondern nur die erweiterten Wetterdaten.

Mal sehen:

Verbose 5 liefert folgende Fehlermeldung

5: wORF_neu: ExtractReading Sonnendaten with regex /Sonnenaufgang um <\/span>(.*)<s[\w\W]*Sonnenuntergang um <\/span>(.*)<s[\w\W]*Mondphase: (.*)\.[\w\W]*Mondaufgang um <\/span>(.*)<s[\w\W]*Monduntergang um <\/span>(.*)<s[\w\W]*Tagesl&auml;;nge: <\/span>(.*)&[\w\W]*Morgen<\/span>: <\/span>(.*)&[\w\W]*Abend:<\/span><\/span>(.*)&/...
5: wORF_neu: ExtractReading Sonnendaten did not match
3: wORF_neu: Read response to get02 didn't match any Reading
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 27 Februar 2019, 10:12:21
Anbei ein angepasstes Device.

Ich habe:
1) readings02-1Name auf get02-1Name umbenannt
2) den Regexp get02Regex  angepasst. Habe diesen "etwas" flexibler im Matching gemacht...

hier das Ergebnis':

defmod wORF_neu HTTPMOD none 0
attr wORF_neu userattr get01Name get01Poll:0,1 get01URL get02-1Name get02-2Name get02-3Name get02-4Name get02-5Name get02-6Name get02-7Name get02-8Name get02Name get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
attr wORF_neu enableControlSet 1
attr wORF_neu get01Name Graz-Universität
attr wORF_neu get01Poll 1
attr wORF_neu get01URL https://wetter.orf.at/steiermark/grazuniversitaet/
attr wORF_neu get02-1Name sunRise
attr wORF_neu get02-2Name sunSet
attr wORF_neu get02-3Name moonPhase
attr wORF_neu get02-4Name moonRise
attr wORF_neu get02-5Name moonSet
attr wORF_neu get02-6Name dayLength
attr wORF_neu get02-7Name dawn
attr wORF_neu get02-8Name dusk
attr wORF_neu get02Name Sonnendaten
attr wORF_neu get02Poll 1
attr wORF_neu get02Regex Sonnenaufgang um <\/span>(.*)<s[\w\W]*Sonnenuntergang um <\/span>(.*)<s\p{Any}*?Mondphase:\s?([^\.]+)[\w\W]*Mondaufgang um\s?<\/span>(\d\d:\d\d)<s[\w\W]*Monduntergang um <\/span>(\d\d:\d\d)<s[\w\W]*Tagesl[^>]+>(\d\d:\d\d)&[\w\W]*Morgen<\/span>: <\/span>(\d\d:\d\d)&[\w\W]*Abend:<\/span><\/span>(\d\d:\d\d)
attr wORF_neu get02URL https://wetter.orf.at/steiermark/
attr wORF_neu model A_02m_ORF_weather
attr wORF_neu reading01Regex (?s)Temperatur.*?.*?>.*?(?<temperature>[\d,]+)&thinsp.*?Taupunkt.*?.*?>.*?(?<taupunkt>[\d,]+)&thinsp.*?Wind.*?>\n\s*(?<wind>[^<]+)\s<abbr.*?Windspitzen.*?>\n\s*(?<windspitzen>[^<]+)\s<abbr.*?Luftdruck.*?>\n\s*(?<luftdruck>[^<]+)\s<abbr.*?Luftfeuchtigkeit.*?>\n\s*(?<humidity>[^<]+)\s<abbr.*?Sonnenschein.*?>\n\s*(?<sonne>[^<]+)\s<abbr.*?Niederschlag.*?>\n\s*(?<rain>[^<\n]+).*?</p.*?(?<messwerte>Messwerte[^<\n]+)
attr wORF_neu room Wetter
attr wORF_neu showBody 1
attr wORF_neu stateFormat weather bei temperature°C
attr wORF_neu verbose 5

setstate wORF_neu weather bei 9,7°C
setstate wORF_neu 2019-02-27 10:10:12 dawn 06:12
setstate wORF_neu 2019-02-27 10:10:12 dayLength 10:57
setstate wORF_neu 2019-02-27 10:10:12 dusk 18:11
setstate wORF_neu 2019-02-27 09:45:12 humidity 42
setstate wORF_neu 2019-02-27 09:45:12 luftdruck 1027,5
setstate wORF_neu 2019-02-27 09:45:12 messwerte Messwerte von 9.00 Uhr
setstate wORF_neu 2019-02-27 10:10:12 moonPhase Abnehmender Mond
setstate wORF_neu 2019-02-27 10:10:12 moonRise 01:55
setstate wORF_neu 2019-02-27 10:10:12 moonSet 11:13
setstate wORF_neu 2019-02-27 09:45:12 rain 0,0
setstate wORF_neu 2019-02-27 09:45:12 sonne 60
setstate wORF_neu 2019-02-27 10:10:12 sunRise 06:43
setstate wORF_neu 2019-02-27 10:10:12 sunSet 17:40
setstate wORF_neu 2019-02-27 09:45:12 taupunkt 3,0
setstate wORF_neu 2019-02-27 09:45:12 temperature 9,7
setstate wORF_neu 2019-02-27 09:45:12 wind West, 3
setstate wORF_neu 2019-02-27 09:45:12 windspitzen Südwest, 8

Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: frank am 27 Februar 2019, 10:32:17
ich würde bei verwendung mehrerer gets auch die url aus dem define löschen, bzw durch "none" ersetzen.
dann zu jedem getXX dann natürlich auch entsprechende getXXname/regex kombinationen.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 27 Februar 2019, 10:40:35
Zitat von: frank am 27 Februar 2019, 10:32:17
ich würde bei verwendung mehrerer gets auch die url aus dem define löschen, bzw durch "none" ersetzen.
dann zu jedem getXX dann natürlich auch entsprechende getXXname/regex kombinationen.

Stimme ich zu, habs aus dem übernommen Beispiel oben entfernt/angepasst.
Dann fehlt jedoch lediglich die Option "get xxx all", ansonsten muss man immer jede URL einzeln abrufen, wenn man ohne fixe Intervalle arbeiten möchte.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 27 Februar 2019, 10:47:36
Danke, kaum macht der Profi das...

Habe jetzt auch nochmal die beiden Ausgangs-Regexe verglichen. Eigentlich war ich der Ansicht gewesen, die hätte ich einfach vom einen ins andere kopiert, aber da scheint irgendwas schief gegangen zu sein >:( .

Und dass die Rückmeldungen dann getxx-xName heißen sollten, wenn man das so mit den getURL's löst, findet sich bestimmt auch irgendwo in der Doku ::) . Ist zwar jetzt immer alles noch etwas neblig, aber es wird besser :) .
Dann mache ich die Tage mal noch ein schönes Update für den ORF, und dann ist bergfex hoffentlich auch nicht mehr die ganz große Herausforderung mit der Vorarbeit hier.

@frank:
Danke für den Hinweis. Muß mal überlegen, wie ich das jetzt insgesamt in das template einfließen lasse.
Vorläufige Idee: Der User startet mit einem "vollen Pfad" (hier also https://wetter.orf.at/steiermark/grazuniversitaet/), würde dann durch das template nach dem Städtenamen gefragt (hier: Graz-Universität, das ist aber hier im Prinzip auch willkürlich), das template würde dann daraus die beiden URL's generieren und dann ein defmod auf das Device selbst absetzen mit "none".
(Das könnte man eventuell noch so erweitern, dass bei einer vorhandenen get01URL diese verwendet wird, da müßte ich mich aber auch erst eindenken; das ist aber jetzt alles Kosmetik...)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: frank am 27 Februar 2019, 10:51:43
wenn im define ein interval steh, wird jedes get, welches mit getXXPoll=1 "aktiviert" ist, auch automatisch ausgelöst.

ebenso sollten beide/alle gets manuell über set reread nacheinander aufgerufen werden.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 28 Februar 2019, 08:03:32
So, eben habe ich dann mal die aktualisierte Fassung des ORF-templates hochgeladen.

Ein paar Dinge wären nett:
- Zum einen wäre eine Rückmeldung hilfreich, wie ihr die "Nutzerführung" findet bzw. ob/welches Verbesserungspotential ihr da seht (ich würde das als eine Art Basistemplate für ähnlich gelagerte Fälle sehen)
- im Ausgangscode von drhirn war noch der Infotext drin, also sowas wie "Stürmisches Scheißwetter bei x°C". Eigentlich fand ich das schöner, vielleicht mag das noch jemand reinbasteln, sonst bleiben im STATE jetzt halt die objektiven Angaben drin, die derzeit verfügbar sind.
- die hp-Drucker würde ich ggf. entsprechend auf die mehrfache URL-Fassung anpassen und das Statustemplate in die beiden (?) anderen integrieren. Aber ohne Hardware... (Wenigstens ein list wäre hilfreich, dann kann ich das ggf. versuchen zu "vertemplaten".

Dann kommt irgendwann auch bergfex dran (bin grade aber noch an ein paar anderen Dingen dran, kann dauern). Übrigens scheinen sich der ORF und Bergfex zumindest die Basisdaten aus derselben Quelle zu holen; die Pfade kommen mir da so bekannt vor...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 28 Februar 2019, 08:17:34
Puh, steht nicht so direkt in der seite.

Aber das hier findet etwas und wird im Webbrowser "verborgen",
es funktioniert jedoch für Wien, Steiermark und Innsbruck:

Beobachtung:\s?(.*?)\.?<

Der Status war dann daraus und der Temperatur zusammengesetzt.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: DeeSPe am 28 Februar 2019, 11:06:45
Hier mal eine Definition eines fertigen HTTPMOD Device für die Wetterdaten von bergfex.at (noch ohne Prognose).
Das war gar nicht so einfach... ::)
11 Readings sind schon umgesetzt.
defmod Innsbruck HTTPMOD https://www.bergfex.at/sommer/innsbruck/wetter/ 3600
attr Innsbruck userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex reading06Name reading06Regex reading07-1Name reading07-1OExpr reading07-2Name reading07-2OExpr reading07-3Name reading07-3OExpr reading07-4Name reading07-4OExpr reading07-5Name reading07-5OExpr reading07Regex reading08Name reading08Regex reading09Name reading09Regex
attr Innsbruck enableControlSet 1
attr Innsbruck reading01Name location
attr Innsbruck reading01Regex "forecast-current">\n\n.+<h2>\n.+?(\w+)\n.+</h2
attr Innsbruck reading02Name height
attr Innsbruck reading02Regex "h2-sub">\n.+?(\d{1,4}).m
attr Innsbruck reading03Name temperature
attr Innsbruck reading03Regex "temperature".*?\n.+<span.class="value">(.*?)</
attr Innsbruck reading04Name chance_of_raining
attr Innsbruck reading04Regex Niederschlag:.(\d{1,3})%
attr Innsbruck reading05Name last_update
attr Innsbruck reading05Regex "important">Heute,.(.*?)</
attr Innsbruck reading06Name condition
attr Innsbruck reading06Regex \d\d:\d\d</span>\n.+-.(.*?)\n
attr Innsbruck reading07-1Name text_today
attr Innsbruck reading07-1OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr Innsbruck reading07-2Name text_tomorrow
attr Innsbruck reading07-2OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr Innsbruck reading07-3Name text_day_after_tomorrow
attr Innsbruck reading07-3OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr Innsbruck reading07-4Name text_in_3_days
attr Innsbruck reading07-4OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr Innsbruck reading07-5Name text_in_4_days
attr Innsbruck reading07-5OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr Innsbruck reading07Regex (?s)<div.class="txt_markup">(.*?)</div>.*<div.class="txt_markup">(.*?)</div>.*<div.class="txt_markup">(.*?)</div>.*<div.class="txt_markup">(.*?)</div>.*<div.class="txt_markup">(.*?)</div>
attr Innsbruck stateFormat condition bei temperature°C und chance_of_raining% Regenwahrscheinlichkeit


Gruß
Dan
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: DeeSPe am 28 Februar 2019, 11:48:46
Bin dabei auch die Prognose einzubauen.

Gruß
Dan
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: DeeSPe am 28 Februar 2019, 16:07:54
So, jetzt Wetter und Prognose von bergfex.at mit entsprechenden "Gettern".

Viel Spaß beim "vertemplaten":
defmod Innsbruck HTTPMOD none 3600
attr Innsbruck userattr get01-10Name get01-10OExpr get01-11Name get01-11OExpr get01-1Name get01-2Name get01-3Name get01-4Name get01-5Name get01-6Name get01-7Name get01-7OExpr get01-8Name get01-8OExpr get01-9Name get01-9OExpr get01Name get01Poll:0,1 get01Regex get01URL get02-10Name get02-11Name get02-12Name get02-13Name get02-14Name get02-15Name get02-16Name get02-16OExpr get02-17Name get02-17OExpr get02-18Name get02-19Name get02-19OExpr get02-1Name get02-20Name get02-21Name get02-22Name get02-23Name get02-24Name get02-25Name get02-26Name get02-26OExpr get02-27Name get02-27OExpr get02-28Name get02-29Name get02-2Name get02-30Name get02-31Name get02-32Name get02-33Name get02-34Name get02-35Name get02-36Name get02-36OExpr get02-37Name get02-37OExpr get02-38Name get02-39Name get02-3Name get02-40Name get02-41Name get02-42Name get02-43Name get02-44Name get02-45Name get02-46Name get02-46OExpr get02-47Name get02-47OExpr get02-48Name get02-49Name get02-4Name get02-50Name get02-51Name get02-52Name get02-53Name get02-54Name get02-55Name get02-56Name get02-56OExpr get02-57Name get02-57OExpr get02-58Name get02-59Name get02-5Name get02-60Name get02-61Name get02-62Name get02-63Name get02-64Name get02-65Name get02-66Name get02-66OExpr get02-67Name get02-67OExpr get02-68Name get02-69Name get02-6Name get02-70Name get02-71Name get02-72Name get02-73Name get02-74Name get02-75Name get02-76Name get02-76OExpr get02-77Name get02-77OExpr get02-78Name get02-79Name get02-7Name get02-7OExpr get02-80Name get02-81Name get02-82Name get02-83Name get02-84Name get02-85Name get02-86Name get02-86OExpr get02-87Name get02-87OExpr get02-88Name get02-89Name get02-8Name get02-90Name get02-9Name get02-9OExpr get02Name get02Poll:0,1 get02Regex get02URL reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex reading06Name reading06Regex reading07-1Name reading07-1OExpr reading07-2Name reading07-2OExpr reading07-3Name reading07-3OExpr reading07-4Name reading07-4OExpr reading07-5Name reading07-5OExpr reading07Regex reading08Name reading08Regex reading09Name reading09Regex
attr Innsbruck devStateIcon {"<img src='https:".ReadingsVal($name,"fc1_icon","")."' alt='".ReadingsVal($name,"condition","")."' />"}
attr Innsbruck enableControlSet 1
attr Innsbruck event-on-change-reading .+
attr Innsbruck get01-10Name text_in_3_days
attr Innsbruck get01-10OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr Innsbruck get01-11Name text_in_4_days
attr Innsbruck get01-11OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr Innsbruck get01-1Name location
attr Innsbruck get01-2Name height
attr Innsbruck get01-3Name last_update
attr Innsbruck get01-4Name condition
attr Innsbruck get01-5Name chance_of_raining
attr Innsbruck get01-6Name temperature
attr Innsbruck get01-7Name text_today
attr Innsbruck get01-7OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr Innsbruck get01-8Name text_tomorrow
attr Innsbruck get01-8OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr Innsbruck get01-9Name text_day_after_tomorrow
attr Innsbruck get01-9OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr Innsbruck get01Name Wetter
attr Innsbruck get01Poll 1
attr Innsbruck get01Regex "forecast-current">\n\n.+<h2>\n.+?(\w+)\n.+</.*?\n\n.*?"h2-sub">\n\s+(.*?)m\n.*\n\n\n\t\n.*?\n.*\n.*?>Heute,\s(.*?)</.*?\n.*?-\s(\w+)\n.*?\n.*?\n\s+Niederschlag:\s(\d{1,3})%\n.*?\n.*\n\t\n.*?"temperature">\n.*?"value">(.*?)</(?s).*<div.class="txt_markup">(.*?)</div>.*<div.class="txt_markup">(.*?)</div>.*<div.class="txt_markup">(.*?)</div>.*<div.class="txt_markup">(.*?)</div>.*<div.class="txt_markup">(.*?)</
attr Innsbruck get01URL https://www.bergfex.at/sommer/innsbruck/wetter/
attr Innsbruck get02-10Name fc1_wind
attr Innsbruck get02-11Name fc2_icon
attr Innsbruck get02-12Name fc2_tmax
attr Innsbruck get02-13Name fc2_tmin
attr Innsbruck get02-14Name fc2_snow
attr Innsbruck get02-15Name fc2_rrr
attr Innsbruck get02-16Name fc2_rrp
attr Innsbruck get02-17Name fc2_snow_fall_limit
attr Innsbruck get02-17OExpr $val =~ s/\.//g;; $val;;
attr Innsbruck get02-18Name fc2_sun_period
attr Innsbruck get02-19Name fc2_thunderstorms
attr Innsbruck get02-1Name fc1_icon
attr Innsbruck get02-20Name fc2_wind
attr Innsbruck get02-21Name fc3_icon
attr Innsbruck get02-22Name fc3_tmax
attr Innsbruck get02-23Name fc3_tmin
attr Innsbruck get02-24Name fc3_snow
attr Innsbruck get02-25Name fc3_rrr
attr Innsbruck get02-26Name fc3_rrp
attr Innsbruck get02-27Name fc3_snow_fall_limit
attr Innsbruck get02-27OExpr $val =~ s/\.//g;; $val;;
attr Innsbruck get02-28Name fc3_sun_period
attr Innsbruck get02-29Name fc3_thunderstorms
attr Innsbruck get02-2Name fc1_tmax
attr Innsbruck get02-30Name fc3_wind
attr Innsbruck get02-31Name fc4_icon
attr Innsbruck get02-32Name fc4_tmax
attr Innsbruck get02-33Name fc4_tmin
attr Innsbruck get02-34Name fc4_snow
attr Innsbruck get02-35Name fc4_rrr
attr Innsbruck get02-36Name fc4_rrp
attr Innsbruck get02-37Name fc4_snow_fall_limit
attr Innsbruck get02-37OExpr $val =~ s/\.//g;; $val;;
attr Innsbruck get02-38Name fc4_sun_period
attr Innsbruck get02-39Name fc4_thunderstorms
attr Innsbruck get02-3Name fc1_tmin
attr Innsbruck get02-40Name fc4_wind
attr Innsbruck get02-41Name fc5_icon
attr Innsbruck get02-42Name fc5_tmax
attr Innsbruck get02-43Name fc5_tmin
attr Innsbruck get02-44Name fc5_snow
attr Innsbruck get02-45Name fc5_rrr
attr Innsbruck get02-46Name fc5_rrp
attr Innsbruck get02-47Name fc5_snow_fall_limit
attr Innsbruck get02-47OExpr $val =~ s/\.//g;; $val;;
attr Innsbruck get02-48Name fc5_sun_period
attr Innsbruck get02-49Name fc5_thunderstorms
attr Innsbruck get02-4Name fc1_snow
attr Innsbruck get02-50Name fc5_wind
attr Innsbruck get02-51Name fc6_icon
attr Innsbruck get02-52Name fc6_tmax
attr Innsbruck get02-53Name fc6_tmin
attr Innsbruck get02-54Name fc6_snow
attr Innsbruck get02-55Name fc6_rrr
attr Innsbruck get02-56Name fc6_rrp
attr Innsbruck get02-56OExpr $val =~ s/,/./g;; $val;;
attr Innsbruck get02-57Name fc6_snow_fall_limit
attr Innsbruck get02-57OExpr $val =~ s/\.//g;; $val;;
attr Innsbruck get02-58Name fc6_sun_period
attr Innsbruck get02-59Name fc6_thunderstorms
attr Innsbruck get02-5Name fc1_rrr
attr Innsbruck get02-60Name fc6_wind
attr Innsbruck get02-61Name fc7_icon
attr Innsbruck get02-62Name fc7_tmax
attr Innsbruck get02-63Name fc7_tmin
attr Innsbruck get02-64Name fc7_snow
attr Innsbruck get02-65Name fc7_rrr
attr Innsbruck get02-66Name fc7_rrp
attr Innsbruck get02-66OExpr $val =~ s/,/./g;; $val;;
attr Innsbruck get02-67Name fc7_snow_fall_limit
attr Innsbruck get02-67OExpr $val =~ s/\.//g;; $val;;
attr Innsbruck get02-68Name fc7_sun_period
attr Innsbruck get02-69Name fc7_thunderstorms
attr Innsbruck get02-6Name fc1_rrp
attr Innsbruck get02-70Name fc7_wind
attr Innsbruck get02-71Name fc8_icon
attr Innsbruck get02-72Name fc8_tmax
attr Innsbruck get02-73Name fc8_tmin
attr Innsbruck get02-74Name fc8_snow
attr Innsbruck get02-75Name fc8_rrr
attr Innsbruck get02-76Name fc8_rrp
attr Innsbruck get02-77Name fc8_snow_fall_limit
attr Innsbruck get02-77OExpr $val =~ s/\.//g;; $val;;
attr Innsbruck get02-78Name fc8_sun_period
attr Innsbruck get02-79Name fc8_thunderstorms
attr Innsbruck get02-7Name fc1_snow_fall_limit
attr Innsbruck get02-7OExpr $val =~ s/\.//g;; $val;;
attr Innsbruck get02-80Name fc8_wind
attr Innsbruck get02-81Name fc9_icon
attr Innsbruck get02-82Name fc9_tmax
attr Innsbruck get02-83Name fc9_tmin
attr Innsbruck get02-84Name fc9_snow
attr Innsbruck get02-85Name fc9_rrr
attr Innsbruck get02-86Name fc9_rrp
attr Innsbruck get02-87Name fc9_snow_fall_limit
attr Innsbruck get02-87OExpr $val =~ s/\.//g;; $val;;
attr Innsbruck get02-88Name fc9_sun_period
attr Innsbruck get02-89Name fc9_thunderstorms
attr Innsbruck get02-8Name fc1_sun_period
attr Innsbruck get02-90Name fc9_wind
attr Innsbruck get02-9Name fc1_thunderstorms
attr Innsbruck get02Name Prognose
attr Innsbruck get02Poll 1
attr Innsbruck get02Regex "forecast-day-0"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.+">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-1"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-2"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-3"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-4"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-5"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-6"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-7"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-8"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</
attr Innsbruck get02URL https://www.bergfex.at/sommer/innsbruck/wetter/prognose/
attr Innsbruck stateFormat condition bei temperature°C und chance_of_raining% Regenwahrscheinlichkeit


Weiß nicht ob das mit dem devStateIcon so gewünscht ist, wenn nicht einfach das Attribut weglassen.
Falls noch was fehlt sagt mir bitte Bescheid.

Gruß
Dan
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 28 Februar 2019, 16:58:33
 :o :) ;D 8)
*grins über beide Backen*
Ihr seid mir ja welche...

Noch ungetestet, aber mit einem gewissen Optimismus:
#Austrian (and other) weather info from bergfex.at or other bergfex sites, Forum: https://forum.fhem.de/index.php/topic,97694.msg912879.html#msg912879
name:A_02n_bergfex_weather
filter:TYPE=HTTPMOD
desc: Get austrian weather.<br>Define a HTTPMOD device like <br>defmod bergfexInnsbruck HTTPMOD none 3600 <br>You will be asked to provide a BERGFEXURL like https://www.bergfex.at/sommer/innsbruck/wetter/ and a CITYNAME like innsbruck<br><a href="https://forum.fhem.de/index.php/topic,97694.msg912879.html#msg912879">Source: FHEM Forum</a>
par:BERGFEXURL;Complete weather-URL. Example: https://www.bergfex.at/sommer/innsbruck/wetter/;{ AttrVal("DEVICE","get01URL","") =~ m,(https://www.bergfex..*/sommer/[^/]+[/]wetter/).*, ? $1 : undef }
par:CITYNAME;Name of the respective weather station as written in the middle part of the URL. Examples: innsbruck;{ AttrVal("DEVICE","get01URL","") =~ m,https://www.bergfex..*/sommer/([^/]+)[/]wetter/.*, ? $1 : undef }
attr DEVICE userattr get01-10Name get01-10OExpr get01-11Name get01-11OExpr get01-1Name get01-2Name get01-3Name get01-4Name get01-5Name get01-6Name get01-7Name get01-7OExpr get01-8Name get01-8OExpr get01-9Name get01-9OExpr get01Name get01Poll:0,1 get01Regex get01URL get02-10Name get02-11Name get02-12Name get02-13Name get02-14Name get02-15Name get02-16Name get02-16OExpr get02-17Name get02-17OExpr get02-18Name get02-19Name get02-19OExpr get02-1Name get02-20Name get02-21Name get02-22Name get02-23Name get02-24Name get02-25Name get02-26Name get02-26OExpr get02-27Name get02-27OExpr get02-28Name get02-29Name get02-2Name get02-30Name get02-31Name get02-32Name get02-33Name get02-34Name get02-35Name get02-36Name get02-36OExpr get02-37Name get02-37OExpr get02-38Name get02-39Name get02-3Name get02-40Name get02-41Name get02-42Name get02-43Name get02-44Name get02-45Name get02-46Name get02-46OExpr get02-47Name get02-47OExpr get02-48Name get02-49Name get02-4Name get02-50Name get02-51Name get02-52Name get02-53Name get02-54Name get02-55Name get02-56Name get02-56OExpr get02-57Name get02-57OExpr get02-58Name get02-59Name get02-5Name get02-60Name get02-61Name get02-62Name get02-63Name get02-64Name get02-65Name get02-66Name get02-66OExpr get02-67Name get02-67OExpr get02-68Name get02-69Name get02-6Name get02-70Name get02-71Name get02-72Name get02-73Name get02-74Name get02-75Name get02-76Name get02-76OExpr get02-77Name get02-77OExpr get02-78Name get02-79Name get02-7Name get02-7OExpr get02-80Name get02-81Name get02-82Name get02-83Name get02-84Name get02-85Name get02-86Name get02-86OExpr get02-87Name get02-87OExpr get02-88Name get02-89Name get02-8Name get02-90Name get02-9Name get02-9OExpr get02Name get02Poll:0,1 get02Regex get02URL reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex reading06Name reading06Regex reading07-1Name reading07-1OExpr reading07-2Name reading07-2OExpr reading07-3Name reading07-3OExpr reading07-4Name reading07-4OExpr reading07-5Name reading07-5OExpr reading07Regex reading08Name reading08Regex reading09Name reading09Regex
attr DEVICE devStateIcon {"<img src='https:".ReadingsVal($name,"fc1_icon","")."' alt='".ReadingsVal($name,"condition","")."' />"}
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .+
attr DEVICE get01-10Name text_in_3_days
attr DEVICE get01-10OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr DEVICE get01-11Name text_in_4_days
attr DEVICE get01-11OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr DEVICE get01-1Name location
attr DEVICE get01-2Name height
attr DEVICE get01-3Name last_update
attr DEVICE get01-4Name condition
attr DEVICE get01-5Name chance_of_raining
attr DEVICE get01-6Name temperature
attr DEVICE get01-7Name text_today
attr DEVICE get01-7OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr DEVICE get01-8Name text_tomorrow
attr DEVICE get01-8OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr DEVICE get01-9Name text_day_after_tomorrow
attr DEVICE get01-9OExpr $val =~ s/\n/ /g;; $val =~ s/<\/p><p>//g;; $val =~ s/<\/?p>//g;; $val;;
attr DEVICE get01Name Wetter
attr DEVICE get01Poll 1
attr DEVICE get01Regex "forecast-current">\n\n.+<h2>\n.+?(\w+)\n.+</.*?\n\n.*?"h2-sub">\n\s+(.*?)m\n.*\n\n\n\t\n.*?\n.*\n.*?>Heute,\s(.*?)</.*?\n.*?-\s(\w+)\n.*?\n.*?\n\s+Niederschlag:\s(\d{1,3})%\n.*?\n.*\n\t\n.*?"temperature">\n.*?"value">(.*?)</(?s).*<div.class="txt_markup">(.*?)</div>.*<div.class="txt_markup">(.*?)</div>.*<div.class="txt_markup">(.*?)</div>.*<div.class="txt_markup">(.*?)</div>.*<div.class="txt_markup">(.*?)</
attr DEVICE get01URL BERGFEXURL
attr DEVICE get02-10Name fc1_wind
attr DEVICE get02-11Name fc2_icon
attr DEVICE get02-12Name fc2_tmax
attr DEVICE get02-13Name fc2_tmin
attr DEVICE get02-14Name fc2_snow
attr DEVICE get02-15Name fc2_rrr
attr DEVICE get02-16Name fc2_rrp
attr DEVICE get02-17Name fc2_snow_fall_limit
attr DEVICE get02-17OExpr $val =~ s/\.//g;; $val;;
attr DEVICE get02-18Name fc2_sun_period
attr DEVICE get02-19Name fc2_thunderstorms
attr DEVICE get02-1Name fc1_icon
attr DEVICE get02-20Name fc2_wind
attr DEVICE get02-21Name fc3_icon
attr DEVICE get02-22Name fc3_tmax
attr DEVICE get02-23Name fc3_tmin
attr DEVICE get02-24Name fc3_snow
attr DEVICE get02-25Name fc3_rrr
attr DEVICE get02-26Name fc3_rrp
attr DEVICE get02-27Name fc3_snow_fall_limit
attr DEVICE get02-27OExpr $val =~ s/\.//g;; $val;;
attr DEVICE get02-28Name fc3_sun_period
attr DEVICE get02-29Name fc3_thunderstorms
attr DEVICE get02-2Name fc1_tmax
attr DEVICE get02-30Name fc3_wind
attr DEVICE get02-31Name fc4_icon
attr DEVICE get02-32Name fc4_tmax
attr DEVICE get02-33Name fc4_tmin
attr DEVICE get02-34Name fc4_snow
attr DEVICE get02-35Name fc4_rrr
attr DEVICE get02-36Name fc4_rrp
attr DEVICE get02-37Name fc4_snow_fall_limit
attr DEVICE get02-37OExpr $val =~ s/\.//g;; $val;;
attr DEVICE get02-38Name fc4_sun_period
attr DEVICE get02-39Name fc4_thunderstorms
attr DEVICE get02-3Name fc1_tmin
attr DEVICE get02-40Name fc4_wind
attr DEVICE get02-41Name fc5_icon
attr DEVICE get02-42Name fc5_tmax
attr DEVICE get02-43Name fc5_tmin
attr DEVICE get02-44Name fc5_snow
attr DEVICE get02-45Name fc5_rrr
attr DEVICE get02-46Name fc5_rrp
attr DEVICE get02-47Name fc5_snow_fall_limit
attr DEVICE get02-47OExpr $val =~ s/\.//g;; $val;;
attr DEVICE get02-48Name fc5_sun_period
attr DEVICE get02-49Name fc5_thunderstorms
attr DEVICE get02-4Name fc1_snow
attr DEVICE get02-50Name fc5_wind
attr DEVICE get02-51Name fc6_icon
attr DEVICE get02-52Name fc6_tmax
attr DEVICE get02-53Name fc6_tmin
attr DEVICE get02-54Name fc6_snow
attr DEVICE get02-55Name fc6_rrr
attr DEVICE get02-56Name fc6_rrp
attr DEVICE get02-56OExpr $val =~ s/,/./g;; $val;;
attr DEVICE get02-57Name fc6_snow_fall_limit
attr DEVICE get02-57OExpr $val =~ s/\.//g;; $val;;
attr DEVICE get02-58Name fc6_sun_period
attr DEVICE get02-59Name fc6_thunderstorms
attr DEVICE get02-5Name fc1_rrr
attr DEVICE get02-60Name fc6_wind
attr DEVICE get02-61Name fc7_icon
attr DEVICE get02-62Name fc7_tmax
attr DEVICE get02-63Name fc7_tmin
attr DEVICE get02-64Name fc7_snow
attr DEVICE get02-65Name fc7_rrr
attr DEVICE get02-66Name fc7_rrp
attr DEVICE get02-66OExpr $val =~ s/,/./g;; $val;;
attr DEVICE get02-67Name fc7_snow_fall_limit
attr DEVICE get02-67OExpr $val =~ s/\.//g;; $val;;
attr DEVICE get02-68Name fc7_sun_period
attr DEVICE get02-69Name fc7_thunderstorms
attr DEVICE get02-6Name fc1_rrp
attr DEVICE get02-70Name fc7_wind
attr DEVICE get02-71Name fc8_icon
attr DEVICE get02-72Name fc8_tmax
attr DEVICE get02-73Name fc8_tmin
attr DEVICE get02-74Name fc8_snow
attr DEVICE get02-75Name fc8_rrr
attr DEVICE get02-76Name fc8_rrp
attr DEVICE get02-77Name fc8_snow_fall_limit
attr DEVICE get02-77OExpr $val =~ s/\.//g;; $val;;
attr DEVICE get02-78Name fc8_sun_period
attr DEVICE get02-79Name fc8_thunderstorms
attr DEVICE get02-7Name fc1_snow_fall_limit
attr DEVICE get02-7OExpr $val =~ s/\.//g;; $val;;
attr DEVICE get02-80Name fc8_wind
attr DEVICE get02-81Name fc9_icon
attr DEVICE get02-82Name fc9_tmax
attr DEVICE get02-83Name fc9_tmin
attr DEVICE get02-84Name fc9_snow
attr DEVICE get02-85Name fc9_rrr
attr DEVICE get02-86Name fc9_rrp
attr DEVICE get02-87Name fc9_snow_fall_limit
attr DEVICE get02-87OExpr $val =~ s/\.//g;; $val;;
attr DEVICE get02-88Name fc9_sun_period
attr DEVICE get02-89Name fc9_thunderstorms
attr DEVICE get02-8Name fc1_sun_period
attr DEVICE get02-90Name fc9_wind
attr DEVICE get02-9Name fc1_thunderstorms
attr DEVICE get02Name Prognose
attr DEVICE get02Poll 1
attr DEVICE get02Regex "forecast-day-0"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.+">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-1"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-2"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-3"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-4"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-5"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-6"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-7"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</.*?\n.*?\n.*\n\n\n\n.*?"forecast-day-8"\n.*\n.*\n\n.*\n.*?src="(.*?)".*\n\n.*\n.*?"tmax">(.*?)°C.*\n.*?"tmin">(.*?)°C.*\n.*?"nschnee.">\n(.*?)</.*?\n.*\n\n.*\n.*?"rrr.+">\n(.*?)l?.*\n\n.*?"rrp.*">\n(.*?)%.*\n.*\n.*?sgrenze">\n(.*?)m.*\n.*\n.*?"sonne.*?">\n(.*?)h.*\n.*\n.*\n.*?"Gew.*?:.*?\n(.*?)%?</.*\n.*\n.*\n.*?"ff.*?".*?\n(.*?)</
attr DEVICE get02URL BERGFEXURLprognose/
attr DEVICE stateFormat condition bei temperature°C und chance_of_raining% Regenwahrscheinlichkeit
attr DEVICE model A_02n_bergfex_weather


Sollte auch für andere Bergfex-Länder funktionieren, wird bei Gelegenheit getestet und dann eingecheckt. Ich finde devStateIcons grundsätzlich nett, besonders, wenn sie kombiniert sind...

Bin mal gespannt, wann der erste wissen will, wieviel Schnee rund um das verrückte Kangaroo liegt (und sonstwo) bzw. wie er das auf dem einfachsten Weg rausbekommt 8) .

See you ;D
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 01 März 2019, 10:48:14
Grummel, irgendwas paßt da noch nicht.
Das template scheint eigentlich zu funktionieren, die URL's werden sauber aufgebaut, soweit ich das erkennen kann. Aber dann läuft auf meinem Testsystem nach Absetzen der gets endlos die Uhr. Das letzte was im Log steht, ist die Anwendung der regex für die Ermittlng der Readinginhalte (aus der vermutlich ersten URL).
Muß ich mir noch genauer ansehen, evtl. wieder ein Kopier-Problem oä., wenn ich nicht klarkomme, gibts auch log-Auszüge (die habe ich grade nicht bei der Hand).
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: mrfloppy am 29 April 2019, 11:30:12
Hallo
Ich würde mir ein Template für den Österreichischen Spritpreisrechner der E-control wünschen.
Vielleicht kann da ja wer was zusammen basteln.

LG Thomas
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: SirUli am 04 Mai 2019, 11:54:11
Hi Beta-User,

Clever-Tanken hat ein Update der Website (https://forum.fhem.de/index.php/topic,99939.15.html) gemacht, daher ist folgender Patch notwendig:

--- httpmod-orig.template       2019-05-04 11:45:58.050623533 +0200
+++ httpmod.template    2019-05-04 11:48:58.940098540 +0200
@@ -24,11 +24,11 @@
attr DEVICE userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex readingOExpr
attr DEVICE enableControlSet 1
attr DEVICE reading01Name Diesel
-attr DEVICE reading01Regex SpritsortenController[^0-9]+([0-9,]+)[^0-9]+Diesel
+attr DEVICE reading01Regex "price-type-name">Diesel</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr DEVICE reading02Name SuperE10
-attr DEVICE reading02Regex SpritsortenController[^0-9]+([0-9,]+)[^0-9]+Super E10
+attr DEVICE reading02Regex "price-type-name">Super E10</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr DEVICE reading03Name SuperE5
-attr DEVICE reading03Regex SpritsortenController[^0-9]+([0-9,]+)[^0-9]+Super E5
+attr DEVICE reading03Regex "price-type-name">Super E5</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr DEVICE readingOExpr $val =~ tr/,/./;;$val
attr DEVICE stateFormat E5: SuperE5 € / E10: SuperE10 € / D: Diesel €
attr DEVICE timeout 10


Vielen Dank im Voraus!

Cheers,
Uli

Edit: Sehe da grad noch einen Copy&Paste Fehler:

--- httpmod-orig.template       2019-05-04 11:57:08.837329308 +0200
+++ httpmod.template    2019-05-04 11:59:49.444661159 +0200
@@ -115,7 +115,7 @@
#Geschwindigkeitsüberwachung, Forum: https://forum.fhem.de/index.php/topic,90014.msg824805.html#msg824805
name:A_03a_blitzer
filter:TYPE=HTTPMOD
-desc: Get austrian weather.<br>Define a HTTPMOD device like <br>defmod DEVICE HTTPMOD https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=52.xxxxxx,8.xxxxxx,53.xxxxxx,9.xxxxxx 0 <br>Change city to your needs <br><a href="https://forum.fhem.de/index.php/topic,90014.msg824805.html#msg824805">Source: Forum</a>
+desc: Get speed cameras.<br>Define a HTTPMOD device like <br>defmod DEVICE HTTPMOD https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=52.xxxxxx,8.xxxxxx,53.xxxxxx,9.xxxxxx 0 <br>Change city to your needs <br><a href="https://forum.fhem.de/index.php/topic,90014.msg824805.html#msg824805">Source: Forum</a>
attr DEVICE userattr getData getHeader1 getHeader2 getURL reading01DeleteIfUnmatched reading01JSON reading01Name reading01Regex reading02Name reading02RegOpt reading02Regex reading03JSON reading03Name readingEncode requestHeader1 requestHeader2 setParseResponse:0,1
attr DEVICE enableControlSet 1
attr DEVICE extractAllJSON 1
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 04 Mai 2019, 12:05:49
Zitat von: SirUli am 04 Mai 2019, 11:54:11
Clever-Tanken hat ein Update der Website (https://forum.fhem.de/index.php/topic,99939.15.html) gemacht, daher ist folgender Patch notwendig:
Vielen Dank zurück!
Hab's eben eingecheckt :) .


Zitat von: mrfloppy am 29 April 2019, 11:30:12
Hallo
Ich würde mir ein Template für den Österreichischen Spritpreisrechner der E-control wünschen.
Vielleicht kann da ja wer was zusammen basteln.
Etwas Vorarbeit wäre schon gut.
Meine eigenen Regex-Kenntnisse sind leider nicht so gut, als dass ich da "einfach so" was erfinden könnte.



Zu bergfex und dem ORF-Wetter noch eine Anmerkung:

das klemmt beides irgendwie, ich weiß nur leider nicht, warum. Ich wollte erst ORF fixen. Da geht nur eine der beiden Abfragen, die andere liefert einfach nichts, bergfex scheint sogar das ganze System zu blockieren (auf dem Testsystem, kann sein, dass da das dns-Attribut bei global helfen könnte, aber Inet-Zugang ist eigentlich da?).
Wie gesagt, ich bin nicht der regex-Experte und habe leider im Moment nach wie vor keine Idee, an was es eigentlich hängt.

Schubsen wäre nett... ::)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: SirUli am 04 Mai 2019, 13:38:54
Zitat von: Beta-User am 04 Mai 2019, 12:05:49Hab's eben eingecheckt :)

Merci und ich lege gleich nochmal nach. Basierend auf Artikeln in meinem Blog, hier noch für die HP Printer ne Erweiterung (https://wolf-u.li/5961/tintenstand-der-druckerpatronen-des-hp-8620-in-fhem-ueberwachen/) und der Brother Scanner (https://wolf-u.li/6005/darstellung-der-statistiken-des-brother-ads-1700w-in-fhem/) mit dazu als Template. Ich habe den letzteren mal unter B_02a rein sortiert, das kannst du natürlich machen wie deine Idee dazu ist ;) Dazu habe ich noch die aktuelle Notfallapotheke (https://forum.fhem.de/index.php/topic,87234.0.html) und für Pihole (https://wolf-u.li/5987/einbindung-der-pihole-statistiken-in-fhem/) die statistiken ;)

--- httpmod-orig.template       2019-05-04 12:00:32.502030867 +0200
+++ httpmod.template    2019-05-04 13:33:50.035551364 +0200
@@ -145,6 +145,57 @@
attr DEVICE set01NoArg 1
attr DEVICE model A_02c_homebridge_videodoorbell

+# Pihole Statistics, Website: https://wolf-u.li/5987/einbindung-der-pihole-statistiken-in-fhem/
+name:A_02e_pihole_statistics
+filter:TYPE=HTTPMOD
+desc: Get Statistics from your pihole instance.<br />Define a HTTPMOD device like <br />define DEVICE HTTPMOD http://192.168.133.7/admin/api.php 300<br />Change IP to your needs<br /><a href="https://wolf-u.li/5987/einbindung-der-pihole-statistiken-in-fhem/">Source: Website</a>
+attr DEVICE userattr getURL
+attr DEVICE extractAllJSON 1
+attr DEVICE getURL http://dns/admin/api.php
+attr DEVICE stateFormat DNS Anfragen: dns_queries_today<br>Geblockte Seiten: ads_blocked_today (ads_blocked_today_formatted %)
+attr DEVICE userReadings ads_blocked_today_formatted {round(ReadingsNum($name,"ads_percentage_today",0),0)}
+
+# Pharmacy Emergency Service Germany, Forum: https://forum.fhem.de/index.php?topic=87234.0
+name:A_02f_pharmacy_emergency_service_germany
+filter:TYPE=HTTPMOD
+desc: Gets the current emergency service of a pharmacy closeby your postal code<br />Define a HTTPMOD device like <br />define DEVICE HTTPMOD http://apothekenfinder.mobi/interface/json.php?device=web&source=not&search=1337 0<br />Change the postalcode (1337 in this example) to yours<br /><a href="https://forum.fhem.de/index.php/topic,87234.0.html>Source: Forum</a><br />Hint: The emergency service changes every day at 09:00 CET, thus create a AT like this to update the DEVICE timely:<br />defmod UPDATE_EMERGENCY_SERVICE at *09:15:00 set EMERGENCY_HTTPMOD_DEVICE reread
+attr DEVICE userattr get01Encode get01JSON get01Name get02ExtractAllJSON:0,1 getURL reading01Encode reading01JSON reading01Name reading02JSON reading02Name reading03JSON reading03Name reading04JSON reading04Name reading05JSON reading05Name reading06JSON reading06Name reading07JSON reading07Name reading07OExpr reading08JSON reading08Name reading08OExpr reading09JSON reading09Name reading10JSON reading10Name reading11JSON reading11Name readingEncode requestHeader requestHeader1 requestHeader2 requestHeader3 requestHeader4 requestHeader5 requestHeader6 requestHeader7
+attr DEVICE reading01Encode UTF-8
+attr DEVICE reading01JSON result_01_name
+attr DEVICE reading01Name Name
+attr DEVICE reading02JSON result_01_street
+attr DEVICE reading02Name Strasse
+attr DEVICE reading03JSON result_01_plz
+attr DEVICE reading03Name Plz
+attr DEVICE reading04JSON result_01_place
+attr DEVICE reading04Name Ort
+attr DEVICE reading05JSON result_01_number
+attr DEVICE reading05Name Telefon
+attr DEVICE reading06JSON result_01_fax
+attr DEVICE reading06Name Telefax
+attr DEVICE reading07JSON result_01_start
+attr DEVICE reading07Name Beginn
+attr DEVICE reading07OExpr strftime "%a %e.%m.%Y %H:%M", localtime($val)
+attr DEVICE reading08JSON result_01_end
+attr DEVICE reading08Name Ende
+attr DEVICE reading08OExpr strftime "%a %e.%m.%Y %H:%M", localtime($val)
+attr DEVICE reading09JSON result_01_lng
+attr DEVICE reading09Name Laengengrad
+attr DEVICE reading10JSON result_01_lat
+attr DEVICE reading10Name Breitengrad
+attr DEVICE reading11JSON result_01_distance
+attr DEVICE reading11Name Entfernung
+attr DEVICE readingEncode UTF-8
+attr DEVICE requestHeader2 Accept-Encoding: gzip, deflate
+attr DEVICE requestHeader3 Accept-Language: de-DE,de;;q=0.9,en-US;;q=0.8,en;;q=0.7,fr;;q=0.6
+attr DEVICE requestHeader4 User-Agent: Lynx/2.8.8dev.3 libwww-FM/2.14 SSL-MM/1.4.1
+attr DEVICE requestHeader5 Referer: http://apothekenfinder.mobi/
+attr DEVICE requestHeader6 X-Requested-With: XMLHttpRequest
+attr DEVICE requestHeader7 Connection: keep-alive
+attr DEVICE showBody 0
+attr DEVICE stateFormat Name, Telefon, Strasse in Plz Ort
+attr DEVICE timeout 60
+
#################################
#HP Printers
#
@@ -173,8 +224,8 @@
# Printer cartridge states
name:B_01a_hp_printer_cartridge_status
filter:TYPE=HTTPMOD
-desc: Get cartridge states of your hp printer.<br>Define a HTTPMOD device like <br>defmod DEVICE HTTPMOD http://192.168.5.43/DevMgmt/ProductConfigDyn.xml 3600 <br>Change IP to your needs <br><a href="https://forum.fhem.de/index.php/topic,90601.msg874683.html#msg874683">Source: Forum</a>
-attr DEVICE userattr reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict reading03Name reading03XPath-Strict reading04Name reading04XPath-Strict
+desc: Get cartridge states of your HP printer.<br>Define a HTTPMOD device like <br>defmod DEVICE HTTPMOD http://192.168.5.43/DevMgmt/ConsumableConfigDyn.xml 3600 <br>Change IP to your needs <br><a href="https://forum.fhem.de/index.php/t$
+attr DEVICE userattr reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict reading03Name reading03XPath-Strict reading04Name reading04XPath-Strict reading05Name reading05XPath-Strict reading06Name reading06XPath-Strict$
attr DEVICE httpVersion 1.1
attr DEVICE reading01Name Cyan
attr DEVICE reading01XPath-Strict //ccdyn:ConsumableInfo[2]/dd:ConsumablePercentageLevelRemaining/text()
@@ -184,32 +235,62 @@
attr DEVICE reading03XPath-Strict //ccdyn:ConsumableInfo[4]/dd:ConsumablePercentageLevelRemaining/text()
attr DEVICE reading04Name Black
attr DEVICE reading04XPath-Strict //ccdyn:ConsumableInfo[1]/dd:ConsumablePercentageLevelRemaining/text()
+attr DEVICE reading05Name CyanCatridgeModel
+attr DEVICE reading05XPath-Strict //ccdyn:ConsumableInfo[3]/dd:ConsumableSelectibilityNumber/text()
+attr DEVICE reading06Name MagentaCatridgeModel
+attr DEVICE reading06XPath-Strict //ccdyn:ConsumableInfo[2]/dd:ConsumableSelectibilityNumber/text()
+attr DEVICE reading07Name YellowCatridgeModel
+attr DEVICE reading07XPath-Strict //ccdyn:ConsumableInfo[4]/dd:ConsumableSelectibilityNumber/text()
+attr DEVICE reading08Name BlackCatridgeModel
+attr DEVICE reading08XPath-Strict //ccdyn:ConsumableInfo[5]/dd:ConsumableSelectibilityNumber/text()
attr DEVICE stateFormat C: Cyan% M: Magenta% Y: Yellow% B: Black%
attr DEVICE model B_01a_hp_printer_cartridge_status

# Printer statistics
name:B_01a_hp_printer_statistics
filter:TYPE=HTTPMOD
-desc: Get cartridge states of your hp printer.<br>Define a HTTPMOD device like <br>defmod DEVICE HTTPMOD http://192.168.5.43/DevMgmt/ProductUsageDyn.xml 3600<br>Change IP to your needs <br><a href="https://forum.fhem.de/index.php/topic,90601.msg874683.html#msg874683">Source: Forum</a>
-attr DEVICE userattr reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict reading03Name reading03XPath-Strict reading04Name reading04XPath-Strict reading05Name reading05XPath-Strict reading06Name reading06XPath-Strict reading07Name reading07XPath-Strict reading08Name reading08XPath-Strict
+desc: Gets various statistics from your HP printer.<br>Define a HTTPMOD device like <br>defmod DEVICE HTTPMOD http://192.168.5.43/DevMgmt/ProductUsageDyn.xml 3600<br>Change IP to your needs <br><a href="https://forum.fhem.de/index.php/topic,90601.msg874683.html#msg874683">Source: Forum</a>
+attr DEVICE userattr reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict reading03Name reading03XPath-Strict reading04Name reading04XPath-Strict reading05Name reading05XPath-Strict reading06Name reading06XPath-Strict reading07Name reading07XPath-Strict reading08Name reading08XPath-Strict reading09Name reading09XPath-Strict reading10Name reading10XPath-Strict reading11Name reading11XPath-Strict reading20Name reading20XPath-Strict reading30Name reading30XPath-Strict reading40Name reading40XPath-Strict reading41Name reading41XPath-Strict reading50Name reading50XPath-Strict reading51Name reading51XPath-Strict
attr DEVICE httpVersion 1.1
-attr DEVICE reading01Name Pages_Total
+attr DEVICE reading01Name Printer_Pages_Total
attr DEVICE reading01XPath-Strict //pudyn:PrinterSubunit/dd:TotalImpressions/text()
-attr DEVICE reading02Name Pages_Monochrome
+attr DEVICE reading02Name Printer_Pages_Monochrome
attr DEVICE reading02XPath-Strict //pudyn:PrinterSubunit/dd:MonochromeImpressions/text()
-attr DEVICE reading03Name Pages_Color
+attr DEVICE reading03Name Printer_Pages_Color
attr DEVICE reading03XPath-Strict //pudyn:PrinterSubunit/dd:ColorImpressions/text()
-attr DEVICE reading04Name Pages_Duplex
+attr DEVICE reading04Name Printer_Pages_Duplex
attr DEVICE reading04XPath-Strict //pudyn:PrinterSubunit/dd:DuplexSheets/text()
-attr DEVICE reading05Name Jam_Events
+attr DEVICE reading05Name Printer_Jam_Events
attr DEVICE reading05XPath-Strict //pudyn:PrinterSubunit/dd:JamEvents/text()
-attr DEVICE reading06Name Mispick_Events
+attr DEVICE reading06Name Printer_Mispick_Events
attr DEVICE reading06XPath-Strict //pudyn:PrinterSubunit/dd:MispickEvents/text()
-attr DEVICE reading07Name ADF_Image_Scans
-attr DEVICE reading07XPath-Strict //pudyn:ScannerEngineSubunit/dd:AdfImages/text()
-attr DEVICE reading08Name Flatbed_Image_Scans
-attr DEVICE reading08XPath-Strict //pudyn:ScannerEngineSubunit/dd:FlatbedImages/text()
-attr DEVICE stateFormat Total: Pages_Total Monochrome: Pages_Monochrome Color: Pages_Color
+attr DEVICE reading10Name Scanner_Scans_Total
+attr DEVICE reading10XPath-Strict //pudyn:ScannerEngineSubunit/dd:ScanImages/text()
+attr DEVICE reading11Name Scanner_Scans_ADF_Image
+attr DEVICE reading11XPath-Strict //pudyn:ScannerEngineSubunit/dd:AdfImages/text()
+attr DEVICE reading12Name Scanner_Scans_Flatbed_Image
+attr DEVICE reading12XPath-Strict //pudyn:ScannerEngineSubunit/dd:FlatbedImages/text()
+attr DEVICE reading13Name Scanner_Jam_Events
+attr DEVICE reading13XPath-Strict //pudyn:ScannerEngineSubunit/dd:JamEvents/text()
+attr DEVICE reading14Name Scanner_Mispick_Events
+attr DEVICE reading14XPath-Strict //pudyn:ScannerEngineSubunit/dd:MispickEvents/text()
+attr DEVICE reading20Name InkMagentaPagesRemaining
+attr DEVICE reading20XPath-Strict //pudyn:Consumable[dd:MarkerColor='Magenta']/dd:EstimatedPagesRemaining/text()
+attr DEVICE reading21Name InkMagentaPercentRemaining
+attr DEVICE reading21XPath-Strict //pudyn:Consumable[dd:MarkerColor='Magenta']/dd:ConsumableRawPercentageLevelRemaining/text()
+attr DEVICE reading30Name InkCyanPagesRemaining
+attr DEVICE reading30XPath-Strict //pudyn:Consumable[dd:MarkerColor='Cyan']/dd:EstimatedPagesRemaining/text()
+attr DEVICE reading31Name InkCyanPercentRemaining
+attr DEVICE reading31XPath-Strict //pudyn:Consumable[dd:MarkerColor='Cyan']/dd:ConsumableRawPercentageLevelRemaining/text()
+attr DEVICE reading40Name InkYellowPagesRemaining
+attr DEVICE reading40XPath-Strict //pudyn:Consumable[dd:MarkerColor='Yellow']/dd:EstimatedPagesRemaining/text()
+attr DEVICE reading41Name InkYellowPercentRemaining
+attr DEVICE reading41XPath-Strict //pudyn:Consumable[dd:MarkerColor='Yellow']/dd:ConsumableRawPercentageLevelRemaining/text()
+attr DEVICE reading50Name InkBlackPagesRemaining
+attr DEVICE reading50XPath-Strict //pudyn:Consumable[dd:MarkerColor='Black']/dd:EstimatedPagesRemaining/text()
+attr DEVICE reading51Name InkBlackPercentRemaining
+attr DEVICE reading51XPath-Strict //pudyn:Consumable[dd:MarkerColor='Black']/dd:ConsumableRawPercentageLevelRemaining/text()
+attr DEVICE stateFormat Total: Printer_Pages_Total Monochrome: Printer_Pages_Monochrome Color: Printer_Pages_Color
attr DEVICE model B_01a_hp_printer_statistics

# Printer status
@@ -270,6 +351,42 @@
attr DEVICE reading05Regex <th>1<\/th><td>(.*?)<
attr DEVICE model B_01c_brother_printer_cartridge_status

+#################################
+#Brother Scanners
+
+# Brother ADS Scanners
+name:B_02a_brother_scanner_ads_status
+filter:TYPE=HTTPMOD
+desc: Get status of your Brother scanner.<br>Define a HTTPMOD device like <br>defmod DEVICE HTTPMOD http://192.168.133.7/ft/gen_maintenance 3600<br>Change IP to your needs <br><a href="https://wolf-u.li/6005/darstellung-der-statistiken-des-brother-ads-1700w-in-fhem/">Source: Website</a>.<br />Tested to work with ADS-1700W, possibly others.
+attr DEVICE userattr reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict reading03Name reading03XPath-Strict reading04Name reading04XPath-Strict reading05Name reading05XPath-Strict reading06Name reading06XPath-Strict reading07Name reading07XPath-Strict reading08Name reading08XPath reading08XPath-Strict reading09Name reading09XPath-Strict reading10Name reading10XPath-Strict reading11Name reading11XPath-Strict reading12Name reading12XPath-Strict
+attr DEVICE httpVersion 1.1
+attr DEVICE reading01Name Model
+attr DEVICE reading01XPath-Strict //Model_name/text()
+attr DEVICE reading02Name Serial_Number
+attr DEVICE reading02XPath-Strict //Serial_Number/text()
+attr DEVICE reading03Name Firmware_Version
+attr DEVICE reading03XPath-Strict //MainVersion/text()
+attr DEVICE reading04Name PickupRollerPagesThreshold
+attr DEVICE reading04XPath-Strict //RemainingPick/text()
+attr DEVICE reading05Name PickupRollerPagesUsed
+attr DEVICE reading05XPath-Strict //RemainingPick_current/text()
+attr DEVICE reading06Name ScheduledMaintenancePagesThreshold
+attr DEVICE reading06XPath-Strict //RemainingScheduled/text()
+attr DEVICE reading07Name ScheduledMaintenancePagesUsed
+attr DEVICE reading07XPath-Strict //RemainingScheduled_current/text()
+attr DEVICE reading08XPath SeparationPadPagesThreshold
+attr DEVICE reading08XPath-Strict //RemainingPad_Threshold/text()
+attr DEVICE reading09Name SeparationPadPagesUsed
+attr DEVICE reading09XPath-Strict //RemainingSeparation_Pad/text()
+attr DEVICE reading10Name ScannedPagesTotal
+attr DEVICE reading10XPath-Strict //ScanPage/text()
+attr DEVICE reading11Name RollerReplacements
+attr DEVICE reading11XPath-Strict //RollerReplace/text()
+attr DEVICE reading12Name PaperJams
+attr DEVICE reading12XPath-Strict //PaperJams/text()
+attr DEVICE stateFormat Pages: ScannedPagesTotal Modell: Model SN: Serial_Number
+
+#################################
#RESOL Solaranlage, Forum: https://forum.fhem.de/index.php/topic,86678.0.html
name:C_01a_resol_solar
filter:TYPE=HTTPMOD
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 04 Mai 2019, 13:53:45
Thx!
Ist ebenfalls bereits eingecheckt :) .
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Otto123 am 09 November 2019, 14:37:02
Hi,

wie an andere Stelle (https://forum.fhem.de/index.php/topic,94494.msg991380.html#msg991380) angekündigt, ich habe (ohne wirkliche Kennung) ein HTTMOD Device für die Konfiguration des Shell PlugS gebaut. Das ist noch nicht komplett, aber da ist so ziemlich alles drin was die API  (https://shelly-api-docs.shelly.cloud/#shelly-family-overview)bietet.

Ich habe das wirklich Schritt für Schritt zu Fuß gemacht, ob das in dem Modul in Wirklichkeit viel einfacher geht, hat sich mir noch nicht erschlossen.  :-[
defmod shellyplug_s_h HTTPMOD none 0
attr shellyplug_s_h userattr get01Name get01URL get02Name get02URL get03Name get03URL set01IMap set01Name set01TextArg:0,1 set01URL set02Name set02TextArg:0,1 set02URL set03Name set03TextArg:0,1 set03URL set04Name set04TextArg:0,1 set04URL set05Name set05TextArg:0,1 set05URL set06Name set06TextArg:0,1 set06URL set07Name set07TextArg:0,1 set07URL set10Name set10TextArg:0,1 set10URL set11Name set11TextArg:0,1 set11URL set12Name set12TextArg:0,1 set12URL set15Name set15TextArg:0,1 set15URL set16Name set16URL set17Name set18URL
attr shellyplug_s_h eventMap /switch on:on/switch off:off/switch toggle:toggle
attr shellyplug_s_h extractAllJSON 1
attr shellyplug_s_h get01Name settings
attr shellyplug_s_h get01URL http://shellyplug-s-040E41/settings
attr shellyplug_s_h get02Name status
attr shellyplug_s_h get02URL http://shellyplug-s-040E41/status
attr shellyplug_s_h get03Name settings_relay_0
attr shellyplug_s_h get03URL http://shellyplug-s-040E41/settings/relay/0
attr shellyplug_s_h room HTTPMOD_Device
attr shellyplug_s_h set01Name mqtt_max_qos
attr shellyplug_s_h set01URL http://shellyplug-s-040E41/settings/?mqtt_max_qos=$val
attr shellyplug_s_h set02Name mqtt_retain
attr shellyplug_s_h set02TextArg 1
attr shellyplug_s_h set02URL http://shellyplug-s-040E41/settings/?mqtt_retain=$val
attr shellyplug_s_h set03Name mqtt_update_period
attr shellyplug_s_h set03URL http://shellyplug-s-040E41/settings/?mqtt_update_period=$val
attr shellyplug_s_h set04Name settings_relay_0_default_state
attr shellyplug_s_h set04TextArg 1
attr shellyplug_s_h set04URL http://shellyplug-s-040E41/settings/relay/0/?default_state=$val
attr shellyplug_s_h set05Name settings_relay_0_btn_type
attr shellyplug_s_h set05TextArg 1
attr shellyplug_s_h set05URL http://shellyplug-s-040E41/settings/relay/0/?btn_type=$val
attr shellyplug_s_h set06Name settings_relay_0_auto_on
attr shellyplug_s_h set06URL http://shellyplug-s-040E41/settings/relay/0/?auto_on=$val
attr shellyplug_s_h set07Name settings_relay_0_auto_off
attr shellyplug_s_h set07URL http://shellyplug-s-040E41/settings/relay/0/?auto_off=$val
attr shellyplug_s_h set10Name led_status_disable
attr shellyplug_s_h set10TextArg 1
attr shellyplug_s_h set10URL http://shellyplug-s-040E41/settings/?max_power=$val
attr shellyplug_s_h set11Name led_status_disable
attr shellyplug_s_h set11TextArg 1
attr shellyplug_s_h set11URL http://shellyplug-s-040E41/settings/?led_status_disable=$val
attr shellyplug_s_h set12Name led_power_disable
attr shellyplug_s_h set12TextArg 1
attr shellyplug_s_h set12URL http://shellyplug-s-040E41/settings/?led_power_disable=$val
attr shellyplug_s_h set15Name switch
attr shellyplug_s_h set15TextArg 1
attr shellyplug_s_h set15URL http://shellyplug-s-040E41/relay/0/?turn=$val
attr shellyplug_s_h set16Name timeron
attr shellyplug_s_h set16URL http://shellyplug-s-040E41/relay/0/?timer=$val&turn=on
attr shellyplug_s_h set17Name timeroff
attr shellyplug_s_h set18URL http://shellyplug-s-040E41/relay/0/?timer=$val&turn=off

Am meisten hat mich geärgert, das ich es nicht gerafft habe ob man die URL zum Gerät ein einer Stelle setzen kann und alle set denn relativ angeben kann. Aber in der Doku steht das auch nur absolut.

Ich weiß noch nicht ob es ein Weg wäre, im Falle Shelly, das MQTT Device und das HTTMOD Device "zu kombinieren" um z.B. on-for-timer usw. einfach mit dem HTTPMOD umzusetzen.
Zum normalen Betrieb taugt das HTTPMOD Device für Shelly meiner Meinung nach nicht. Zum Konfigurieren und ein paar Funktionen (Timer) aber schon

Nach dem Urlaub schau ich mir dann mal die Template Geschichte noch weiter an, versprochen. :)
Ich muss an einem von beiden Beispielen lernen, wie man aus seiner Raw Def ein Template strickt :)

Gruß Otto
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 11 November 2019, 13:54:39
...Danke mal vorab...

Was die Fragen zu HTTPMOD angeht, solltest du die ggf. separat im "Neue Version.."-Thread stellen, ich bin wie gesagt - eigentlich gar nicht der HTTPMOD-Experte, sondern versuche nur, das template-Thema einigermaßen sinnvoll z kuratieren... Dafür reicht in der Regel eine RAW-Definition von einem funktionierenden Device; um festzustellen, ob sich da was optimieren läßt, reichen meine Kenntnisse der HTTPMOD-Spezifika leider in der Regel nicht (deswegen frage ich ja bei jeder halbwegs sinnvollen Gelegenheit, ob nicht jemand Interesse hat, der weiß, was da möglich ist...).

MMn. macht eine Kombination zwischen MQTT- und HTTPMOD-Welt nicht den großen Sinn, evtl. kann man in MQTT2_DEVICE "etwas Perl" verbauen, um ein paar HTTP-Posts zu setzen. Insgesamt weiß ich nicht recht, inwieweit es sinnvoll ist, z.B. für die Konfiguration einen HTTPMOD zu verwenden statt das direkt in dem Web-Interface (auf das man ohne weiteres vom MQTT2_DEVICE kommt, oder?) einzugeben. Ist ja in der Regel eine Einmalaktion.

Von RAW nach template ist "eigentlich" einfach. Insbesondere "par:" ist in der Regel "einfach nur etwas regex", der Rest ist entweder selbsterklärend oder eine Übungsfrage (was löst man am besten wie?), bei der die Antwort teilweise sehr stark davon abhängt, was das jeweilige Device "kann".
Um entsprechende Fragen zu erörtern, kannst du gerne auch einen separaten Thread aufmachen (vermutlich sinnvollerweise im MQTT-Bereich).
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 11 November 2019, 14:57:44
Hallo,

ich nutze HTTPMOD auch um mir FW-aktualisierungen anzeigen zu lassen - und zwar bisher von ESPEasy (https://github.com/letscontrolit/ESPEasy/releases) und dnscrypt-proxy (https://github.com/DNSCrypt/dnscrypt-proxy):

ESPEasy Firmware-Check:
defmod ESPEasy_version HTTPMOD https://github.com/letscontrolit/ESPEasy/releases 86400
attr ESPEasy_version userattr reading01Name reading01Regex
attr ESPEasy_version reading01Name esp_version
attr ESPEasy_version reading01Regex Release (mega-[\d]{8})
attr ESPEasy_version stateFormat {"<p align=\"left\">".ReadingsTimestamp($name,'esp_version','')."<br />Online: <a href=\"https://github.com/letscontrolit/ESPEasy/releases\"\
title=\"ChangeLog\" rel=\"noopener noreferrer\" target=\"_blank\"><b>".ReadingsVal($name,'esp_version','none')."</b></a><br />\
ESP01: <b>".InternalVal('ESP01-Reading1','ESP_BUILD_GIT','-')."</b><br />\
ESP02: <b>".InternalVal('ESP02-Reading1','ESP_BUILD_GIT','-')."</b><br />\
ESP03: <b>".InternalVal('ESP03-Reading1','ESP_BUILD_GIT','-')."</b>\
</p>"}
attr ESPEasy_version timeout 5

Hierbei muss nur bei ESP01: <b>".InternalVal('ESP01-Reading1','ESP_BUILD_GIT','-')."</b> das entsprechende ESP Device ESP01-Reading1 durch ein echtes ESP Device ersetzt werden.

dnscrypt-proxy:
defmod dnscrypt_proxy_version HTTPMOD https://api.github.com/repos/jedisct1/dnscrypt-proxy/releases/latest 86400
attr dnscrypt_proxy_version userattr reading01Name
attr dnscrypt_proxy_version extractAllJSON 1
attr dnscrypt_proxy_version extractAllJSONFilter tag_name
attr dnscrypt_proxy_version stateFormat {"<p align=\"left\">".ReadingsTimestamp($name,'tag_name','')."<br />Online: <a href=\"https://github.com/DNSCrypt/dnscrypt-proxy/blob/master/ChangeLog\"\
title=\"ChangeLog\" rel=\"noopener noreferrer\" target=\"_blank\"><b>".ReadingsVal($name,'tag_name','')."</b></a><br />\
installed: <b>".ReadingsVal($name,'installed_version','')."</b></p>"}
attr dnscrypt_proxy_version userReadings installed_version {ReadingsVal($name,"value","2.0.31");;}

allerdings muss hier die installierte Version manuell angepasst werden (userReading installed_version).

Vielleicht kann man sowas auch in ein Template einbauen. Oder jmd. kann es gebrauchen. Oder verbessern. :)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 11 November 2019, 16:59:10
Vorab mal Danke für den Vorschlag bzw. die Vorschläge.

Zu ESPEasy:
Die Liste in dem stateFormat könnte man vermutlich ähnlich (und automatisiert) zusammenbauen wie bei dem homematic-template (CUL_HM_firmware_update_downloader), allerdings müßte das hier einfacher gehen.
Magst du dich daran mal versuchen, ist mMn. eine gute Perl-Übung  ;) ?
(Sonst finden sich evtl. auch andere ESPEasy-Nutzer, die das interessant finden...?)

Bei dem anderen verstehe ich den Umweg über das userReading im Moment nicht. Warum geht das nicht direkt via "value" (das muß man dann ggf. halt setzen mit setreading (+reload für die Anzeige), ist aber (ohne praktische Erfahrung damit zu haben dem Bauchgefühl nach) besser, als im Attribut rumzueditieren; die Bedienungsanleitung kann man ja z.B. in den comment nehmen).
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 12 November 2019, 10:58:32
Zitat von: Beta-User am 11 November 2019, 16:59:10Die Liste in dem stateFormat könnte man vermutlich ähnlich (und automatisiert) zusammenbauen wie bei dem homematic-template (CUL_HM_firmware_update_downloader), allerdings müßte das hier einfacher gehen.
Magst du dich daran mal versuchen, ist mMn. eine gute Perl-Übung  ;) ?
(Sonst finden sich evtl. auch andere ESPEasy-Nutzer, die das interessant finden...?)
Da bin ich mir gar nicht so sicher, ob sich das sinnvoll umsetzen lässt. Es kann pro ESPEasy ja m devices geben, aber ich habe nur eine ESPEasy Version. (In meinem Fall: 3 ESPs und 8 ESP Devices) perl ist darüberhinaus auch nicht meine Haussprache. ;) Für mich funktioniert es erstmal, vielleicht überkommt es mich und ich pass' das irgendwann an.

Zitat von: Beta-User am 11 November 2019, 16:59:10Bei dem anderen verstehe ich den Umweg über das userReading im Moment nicht. Warum geht das nicht direkt via "value" (das muß man dann ggf. halt setzen mit setreading (+reload für die Anzeige), ist aber (ohne praktische Erfahrung damit zu haben dem Bauchgefühl nach) besser, als im Attribut rumzueditieren; die Bedienungsanleitung kann man ja z.B. in den comment nehmen).
Für mich war das ein gangbarer Weg mit dem UserReadings; ich meine, direkt den Text "2.0.31" einzugeben ging nicht. Oder ich war zu ungeduldig. Im Prinzip missbrauche ich die Funktion ReadingsVal hier.
Hinzu kommt, dass ich zum einen nicht weiss wie ich die Version des dnscrypt-proxys aus FHEM heraus aufrufe - und ich mir noch nicht einmal sicher bin, ob ich das will.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 12 November 2019, 11:22:00
@Beta-User

Hallo,

dies ist ein Vorschlag für die Prüfung auf mögliche Tasmota-Updates (optisch angelehnt an die Homematic-Variante).


defmod DEVICE HTTPMOD https://github.com/arendst/Tasmota/releases/latest 86400
attr DEVICE userattr reading01JSON reading01Name reading01OExpr reading01Regex reading02Name reading02OExpr reading02Regex reading03Name reading03OExpr reading03Regex
attr DEVICE alignTime 10:00
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 1
attr DEVICE reading01Name latestVersion
attr DEVICE reading01Regex <h2>Changelog</h2>[\w\W]*?<p>Version (\d*.\d*.\d*)\s\d*</p>
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})(.{2})(.{2})$/ ;; "$3.$2.$1"
attr DEVICE reading02Regex <h2>Changelog</h2>[\w\W]*?<p>Version \d*.\d*.\d*\s(\d*)</p>
attr DEVICE room Tasmota
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat {   my $ret ="";;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\
    $ret .= '<div style="text-align:left">';;\
    $ret .= 'last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'">tasmota</a>-check => '.$lastCheck;;\
    $ret .= '<br><br><pre>';;\
    $ret .= "| device                           | current |   new   |  released  |<br>";;\
    $ret .= "---------------------------------------------------------------------<br>";;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
    if($check eq "no updates needed!") {\
      $ret .= '| <b style="color:green">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '| <b style="color:red">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } else {\
      my @devices = split(',',$check);;\
      foreach my $devStr (@devices) {\
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
        $ret .= sprintf("%-32s",$dev);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<b style="color:lightgray">';;\
        $ret .= sprintf("%7s",$old);;\
        $ret .= '</b> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:red">';;\
        $ret .= sprintf("%7s",$new);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:black">';;\
        $ret .= sprintf("%-10s",$date);;\
        $ret .= '</b></a>';;\
        $ret .= " |<br>";;\
      }\
    }\
    $ret .= '</pre></div>';;\
  return $ret;;\
}
attr DEVICE timestamp-on-change-reading .*
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_DEVICE:FILTER=INFO1_Version=.*\\(.*sonoff\\)")) {\
      my $version = ReadingsVal($dev,"INFO1_Version","unknown");;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if($version ne $VERSION) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 12 November 2019, 12:41:30
@OdfFhem: Wow, das ging schnell!

Hier dann das ganze mit der vorgesehenen "Einbettung" in die template-file:

name:tasmota_firmware_updates
filter:TYPE=HTTPMOD
desc: Check Tasmota homepage for available new firmware files<br>Define a HTTPMOD device like <br>define tasmotaupdates HTTPMOD https://github.com/arendst/Tasmota/releases/latest 86400<a href="https://forum.fhem.de/index.php/topic,97694.msg992308.html#msg992308">Source: Forum</a>.
order:X_01e
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
attr DEVICE userattr reading01JSON reading01Name reading01OExpr reading01Regex reading02Name reading02OExpr reading02Regex reading03Name reading03OExpr reading03Regex
attr DEVICE alignTime 10:00
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 1
attr DEVICE reading01Name latestVersion
attr DEVICE reading01Regex <h2>Changelog</h2>[\w\W]*?<p>Version (\d*.\d*.\d*)\s\d*</p>
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})(.{2})(.{2})$/ ;; "$3.$2.$1"
attr DEVICE reading02Regex <h2>Changelog</h2>[\w\W]*?<p>Version \d*.\d*.\d*\s(\d*)</p>
attr DEVICE room Tasmota
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat {   my $ret ="";;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\
    $ret .= '<div style="text-align:left">';;\
    $ret .= 'last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'">tasmota</a>-check => '.$lastCheck;;\
    $ret .= '<br><br><pre>';;\
    $ret .= "| device                           | current |   new   |  released  |<br>";;\
    $ret .= "---------------------------------------------------------------------<br>";;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
    if($check eq "no updates needed!") {\
      $ret .= '| <b style="color:green">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '| <b style="color:red">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } else {\
      my @devices = split(',',$check);;\
      foreach my $devStr (@devices) {\
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
        $ret .= sprintf("%-32s",$dev);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<b style="color:lightgray">';;\
        $ret .= sprintf("%7s",$old);;\
        $ret .= '</b> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:red">';;\
        $ret .= sprintf("%7s",$new);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:black">';;\
        $ret .= sprintf("%-10s",$date);;\
        $ret .= '</b></a>';;\
        $ret .= " |<br>";;\
      }\
    }\
    $ret .= '</pre></div>';;\
  return $ret;;\
}
attr DEVICE timestamp-on-change-reading .*
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_DEVICE:FILTER=INFO1_Version=.*\\(.*sonoff\\)")) {\
      my $version = ReadingsVal($dev,"INFO1_Version","unknown");;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if($version ne $VERSION) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE enableControlSet 1
attr DEVICE model tasmota_firmware_updates

Wäre nett, wenn's vorab nochmal jemand gegentesten könnte, ich habe derzeit keine Tasmota-ESP's im Einsatz... Ansonsten geht das voraussichtlich für morgen ins svn.

Hier noch das andere, mMn. müßte das mit einem userattr genauso funktionieren, aber ich bekomme leider mit meinem Testsystem weder mit yersinias noch mit der template-Version irgendwelche Readings, daher aktualisiert sich das in STATE gar nicht...

name:dnscrypt-proxy_updates
filter:TYPE=HTTPMOD
desc: Show updates for <a href="https://dnscrypt.info/">DNSCRYPT.</a><br>Define a HTTPMOD device like <br>defmod dnscrypt_proxy_version HTTPMOD https://api.github.com/repos/jedisct1/dnscrypt-proxy/releases/latest 86400<br><a href="https://forum.fhem.de/index.php/topic,97694.msg992002.html#msg992002">Source: Forum</a>
order:X_01x
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
attr DEVICE userattr reading01Name myInstalledVersion
attr DEVICE extractAllJSON 1
attr DEVICE extractAllJSONFilter tag_name
attr DEVICE stateFormat {"<p align=\"left\">".ReadingsTimestamp($name,'tag_name','')."<br />Online: <a href=\"https://github.com/DNSCrypt/dnscrypt-proxy/blob/master/ChangeLog\"\
title=\"ChangeLog\" rel=\"noopener noreferrer\" target=\"_blank\"><b>".ReadingsVal($name,'tag_name','')."</b></a><br />\
installed: <b>".AttrVal($name,'myInstalledVersion','')."</b></p>"}
attr DEVICE myInstalledVersion 2.0.31
attr DEVICE room WHICHROOM
attr DEVICE enableControlSet 1
attr DEVICE model dnscrypt-proxy_updates
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 12 November 2019, 13:31:35
@Beta-User / tasmota_firmware_updates

Noch einige, kleine Anmerkungen ...


Beim userattr haben leider ein paar Altlasten überlebt; sollte besser so aussehen:

attr DEVICE userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex


Am Ende hast Du ein zweites attr DEVICE enableControlSet 1 eingeschleust - eine von beiden Stellen sollte wegfallen.

Gleiches gilt für den room; da sollte wohl besser meine "Vorgabe" wegfallen.

Fraglich ist außerdem, ob man via Template eine alignTime vorgeben will/soll ... dann prüfen alle zum gleichen Zeitpunkt ... würde ich im Zweifel eher wegfallen lassen, weil dann die nächste Prüfzeit vom ersten Prüfzeitpunkt abhängt ...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 12 November 2019, 13:51:58
Thx für die Rückmeldung,

dass ich da was doppelt reingebaut hat, war wir irgendwie entgangen...

Das mit alignTime kann wirklich raus, zumal man das ja bei Bedarf auch manuell anschubsen kann.

Damit werde ich wohl das hier einchecken:

name:tasmota_firmware_updates
filter:TYPE=HTTPMOD
desc: Check Tasmota homepage for available new firmware files<br>Define a HTTPMOD device like <br>define tasmotaupdates HTTPMOD https://github.com/arendst/Tasmota/releases/latest 86400<a href="https://forum.fhem.de/index.php/topic,97694.msg992308.html#msg992308">Source: Forum</a>.
order:X_01e
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
attr DEVICE userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 1
attr DEVICE reading01Name latestVersion
attr DEVICE reading01Regex <h2>Changelog</h2>[\w\W]*?<p>Version (\d*.\d*.\d*)\s\d*</p>
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})(.{2})(.{2})$/ ;; "$3.$2.$1"
attr DEVICE reading02Regex <h2>Changelog</h2>[\w\W]*?<p>Version \d*.\d*.\d*\s(\d*)</p>
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat {   my $ret ="";;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\
    $ret .= '<div style="text-align:left">';;\
    $ret .= 'last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'">tasmota</a>-check => '.$lastCheck;;\
    $ret .= '<br><br><pre>';;\
    $ret .= "| device                           | current |   new   |  released  |<br>";;\
    $ret .= "---------------------------------------------------------------------<br>";;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
    if($check eq "no updates needed!") {\
      $ret .= '| <b style="color:green">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '| <b style="color:red">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } else {\
      my @devices = split(',',$check);;\
      foreach my $devStr (@devices) {\
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
        $ret .= sprintf("%-32s",$dev);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<b style="color:lightgray">';;\
        $ret .= sprintf("%7s",$old);;\
        $ret .= '</b> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:red">';;\
        $ret .= sprintf("%7s",$new);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:black">';;\
        $ret .= sprintf("%-10s",$date);;\
        $ret .= '</b></a>';;\
        $ret .= " |<br>";;\
      }\
    }\
    $ret .= '</pre></div>';;\
  return $ret;;\
}
attr DEVICE timestamp-on-change-reading .*
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_DEVICE:FILTER=INFO1_Version=.*\\(.*sonoff\\)")) {\
      my $version = ReadingsVal($dev,"INFO1_Version","unknown");;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if($version ne $VERSION) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model tasmota_firmware_updates


Macht vermutlich Sinn, das dann auch noch irgendwo im Wiki zu verlinken, allerdings bin ich unschlüssig, wo (MQTT#Tasmota, ESP8266, Praxisbeispiele?)... (Btw.: Ein Screenshot von dem HTTPMOD "in Aktion" für's/im Wiki wäre hilfreich.).

@yersinia:
Evtl. ist es auf dieser Basis jetzt deutlich einfacher, den Transfer auch für ESPEasy hinzubekommen? (Ich habe aber zugegebenermaßen den Einwand nicht so ganz verstanden, dass die Zahlen/Versionen nicht passen müssen. Das obige template sollte (wenn es ist wie bei HM) immer nur jeweils die Microcontroller anzeigen, die nicht die aktuelle firmware haben und den Rest/die aktuellen gar nicht.)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 12 November 2019, 13:58:31
@Beta-User / tasmota_firmware_updates

Ich habe Deine Template-Fassung mal getestet und daraus ergibt sich noch eine wichtige Anpassung ...

Die Zeile

foreach my $dev (devspec2array("TYPE=MQTT[2]?_DEVICE:FILTER=INFO1_Version=.*\\(.*sonoff\\)")) {\

muss durch folgende Zeile ersetzt werden

foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=INFO1_Version=.*\\(.*sonoff\\)")) {\


Ansonsten wird DEVICE durch den Gerätenamen ersetzt ... und das soll ja nicht passieren.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 12 November 2019, 14:07:42
Thx, macht doch immer wieder Sinn, das mit Echtdevices zu testen ::) ...

Sowas fällt eher nicht auf, wenn man nur Trockenübungen macht; ohne kommt da halt einfach kein bzw irgendein Ergebnis, das man nicht sinnvoll gg. den Ausgangsstand vergleichen kann.

Damit sollte es dann also so passen:

name:tasmota_firmware_updates
filter:TYPE=HTTPMOD
desc: Check Tasmota homepage for available new firmware files<br>Define a HTTPMOD device like <br>define tasmotaupdates HTTPMOD https://github.com/arendst/Tasmota/releases/latest 86400<a href="https://forum.fhem.de/index.php/topic,97694.msg992308.html#msg992308">Source: Forum</a>.
order:X_01e
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
attr DEVICE userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 1
attr DEVICE reading01Name latestVersion
attr DEVICE reading01Regex <h2>Changelog</h2>[\w\W]*?<p>Version (\d*.\d*.\d*)\s\d*</p>
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})(.{2})(.{2})$/ ;; "$3.$2.$1"
attr DEVICE reading02Regex <h2>Changelog</h2>[\w\W]*?<p>Version \d*.\d*.\d*\s(\d*)</p>
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat {   my $ret ="";;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\
    $ret .= '<div style="text-align:left">';;\
    $ret .= 'last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'">tasmota</a>-check => '.$lastCheck;;\
    $ret .= '<br><br><pre>';;\
    $ret .= "| device                           | current |   new   |  released  |<br>";;\
    $ret .= "---------------------------------------------------------------------<br>";;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
    if($check eq "no updates needed!") {\
      $ret .= '| <b style="color:green">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '| <b style="color:red">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } else {\
      my @devices = split(',',$check);;\
      foreach my $devStr (@devices) {\
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
        $ret .= sprintf("%-32s",$dev);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<b style="color:lightgray">';;\
        $ret .= sprintf("%7s",$old);;\
        $ret .= '</b> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:red">';;\
        $ret .= sprintf("%7s",$new);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:black">';;\
        $ret .= sprintf("%-10s",$date);;\
        $ret .= '</b></a>';;\
        $ret .= " |<br>";;\
      }\
    }\
    $ret .= '</pre></div>';;\
  return $ret;;\
}
attr DEVICE timestamp-on-change-reading .*
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=INFO1_Version=.*\\(.*sonoff\\)")) {\
      my $version = ReadingsVal($dev,"INFO1_Version","unknown");;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if($version ne $VERSION) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model tasmota_firmware_updates

(Wer jetzt TASMOTA_DEVICE nutzt, muß das halt entsprechend anpassen bzw. zu MQTT2_DEVICE wechseln :P ).
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 12 November 2019, 17:31:42
Bezgl dnscrypt-proxy läuft das bei mir sehr gut. HTTPMOD filtert den tag_name automatisch aus dem JSON und generiert daraus ein Reading.
defmod dnscrypt_proxy_version HTTPMOD https://api.github.com/repos/jedisct1/dnscrypt-proxy/releases/latest 86400
attr dnscrypt_proxy_version userattr myInstalledVersion
attr dnscrypt_proxy_version extractAllJSON 1
attr dnscrypt_proxy_version extractAllJSONFilter tag_name
attr dnscrypt_proxy_version myInstalledVersion 2.0.31
attr dnscrypt_proxy_version stateFormat {"<p align=\"left\">".ReadingsTimestamp($name,'tag_name','')."<br />Online: <a href=\"https://github.com/DNSCrypt/dnscrypt-proxy/blob/master/ChangeLog\"\
title=\"ChangeLog\" rel=\"noopener noreferrer\" target=\"_blank\"><b>".ReadingsVal($name,'tag_name','')."</b></a><br />\
my installed Version: <b>".AttrVal($name,'myInstalledVersion','')."</b></p>"}
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 12 November 2019, 18:49:12
So, ich hab mal bei OdfFHEM abgeschrieben - jetzt sieht der ESPEasy FW Check analog zum Tasmota bzw Homemativ FW Check aus:
defmod ESPEasy_fw_check HTTPMOD https://github.com/letscontrolit/ESPEasy/releases 86400
attr ESPEasy_fw_check userattr reading01Name reading01Regex
attr ESPEasy_fw_check enableControlSet 1
attr ESPEasy_fw_check event-on-change-reading .*
attr ESPEasy_fw_check event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr ESPEasy_fw_check handleRedirects 1
attr ESPEasy_fw_check reading01Name latestVersion
attr ESPEasy_fw_check reading01Regex Release mega-([\d]{8})
attr ESPEasy_fw_check showError 1
attr ESPEasy_fw_check showMatched 1
attr ESPEasy_fw_check stateFormat {   my $ret ="";;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\
    $ret .= '<div style="text-align:left;;">';;\
    $ret .= 'last <a href="https://github.com/letscontrolit/ESPEasy" title="ESPEasy" rel="noopener noreferrer" target="_blank">ESPEasy</a> version check => '.$lastCheck;;\
    $ret .= '<br /><br /><pre>';;\
    $ret .= "| device                                       | current  |   new    | <br />";;\
    $ret .= "---------------------------------------------------------------------- <br />";;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
    if($check eq "no updates needed!") {\
      $ret .= '| <b style="color:green">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '| <b style="color:red">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } else {\
      my @devices = split(',',$check);;\
      foreach my $devStr (@devices) {\
        my ($dev,$old,$new) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\)]+)\)$/;;\
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
        $ret .= sprintf("%-44s",$dev);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<b style="color:lightgray;;">';;\
$ret .= '<a href="https://github.com/letscontrolit/ESPEasy/releases/tag/mega-'.$old.'" title="ESPEasy Release mega-'.$old.'" rel="noopener noreferrer" target="_blank">';;\
        $ret .= sprintf("%7s",$old);;\
        $ret .= '</a></b> | ';;\
        $ret .= '<a href="https://github.com/letscontrolit/ESPEasy/releases/tag/mega-'.$new.'" title="ESPEasy Release mega-'.$new.'" rel="noopener noreferrer" target="_blank">';;\
        $ret .= '<b style="color:red;;">';;\
        $ret .= sprintf("%7s",$new);;\
        $ret .= '</b></a> |<br />';;\
      }\
    }\
    $ret .= '</pre></div>';;\
  return $ret;;\
}
attr ESPEasy_fw_check timestamp-on-change-reading .*
attr ESPEasy_fw_check userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    foreach my $dev (devspec2array("TYPE=ESPEasy:FILTER=HOST!=bridge")) {\
      my $version = InternalVal($dev,"ESP_BUILD_GIT","unknown");;\
      $version =~ m/([\d]{8})/;;\
      $version = $1;;\
      if($version ne $VERSION) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr ESPEasy_fw_check webCmd reread


Danke an OdfFHEM und Beta-User :D
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 13 November 2019, 08:21:06
 :)
Danke für die Rückmeldung. Das ganze ist jetzt via update verfügbar, nochmaliges kurzes Gegenchecken wäre nett...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 13 November 2019, 09:08:20
Cool, Danke @Beta-User!

Eine Anmerkung habe ich noch: ich benutze anstelle von myInstalledVersion das userattr pihole_version - weil mein dnscrypt-proxy auf dem pihole raspi läuft. Sinnhafterweise wäre aber myInstalledVersion besser; das ist mir beim kopieren allerdings unterlaufen. Korrigierte Version oben, betrifft aber auch nur:
attr dnscrypt_proxy_version userattr myInstalledVersion
attr dnscrypt_proxy_version myInstalledVersion 2.0.31
attr dnscrypt_proxy_version stateFormat {"<p align=\"left\">".ReadingsTimestamp($name,'tag_name','')."<br />Online: <a href=\"https://github.com/DNSCrypt/dnscrypt-proxy/blob/master/ChangeLog\"\
title=\"ChangeLog\" rel=\"noopener noreferrer\" target=\"_blank\"><b>".ReadingsVal($name,'tag_name','')."</b></a><br />\
my installed Version: <b>".AttrVal($name,'myInstalledVersion','')."</b></p>"}
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 13 November 2019, 10:59:43
 ;D ... und ich hatte angenommen, du wolltest mir mit dem list noch was (an Verbesserungsmöglichkeiten) mitteilen ;D .

Korrigiere ich bei Gelegenheit, ist ja vermutlich eh' so, dass viele die pihole-Variante nutzen  (das template wäre fast so benannt worden...)

Bei der Gelegenheit vielleicht noch zwei generelle Anmerkungen:
- v.a., wenn es schon template-Code gibt, ist es für mich einfacher, wenn hier (kompletter) korrigierter template-Code zurückkommt (muß kein diff sein, so wie im Betrag von OdfFhem von 11:22 gestern ist völlig ausreichend, wenn der "Kopf" schon steht, gerne dann auch mit dem)
- manchmal ist vollständiger RAW-Code hilfreich. Damit kann man ein Device auch in einem Testsystem anlegen (und sehen!), ohne dass dort z.B. ESPEasy oder Tasmota-Geräte vorhanden sein müßten (ist hier nicht notwendig, das HM-Dingens kenne ich aus eigender Anschauung).
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 02 Dezember 2019, 07:46:30
@Beta-User

Immer wieder schön: kaum hat man was in ein Template gegossen bzw. giessen lassen, schon wird die Tasmota-Benamungstheorie geändert. Jetzt haben die Releases scheinbar keine Datumsverklauslierung mehr als Name, sondern echte Namen. Das neueste Release v7.1.1 heißt nun nicht mehr nach dem bekannten Schema "20191201", sondern "Betty". Dadurch klappt die automatische Auswertung nicht mehr und es müssen ein paar Änderungen vorgenommen werden.



defmod DEVICE HTTPMOD https://github.com/arendst/Tasmota/tags 604800
attr DEVICE handleRedirects 0
attr DEVICE reading01Name latestVersion
attr DEVICE reading01Regex commit-title">[\w\W]*?<a href=".*">[\w\W]*?v(\d*.\d*.\d*)[\w\W]*?</a>
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})$/ ;; "$3.$2.$1"
attr DEVICE reading02Regex relative-time[\w\W]*?datetime="(\d*-\d*-\d*)T\d*:\d*:\d*Z"


Mal schauen, wie lange diese Theorie anwendbar ist ...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 02 Dezember 2019, 09:37:49
Ja ja, so ist das mit den updates...

Vielleicht eine Anmerkung für die Allgemeinheit: Es mag nicht jedermanns Sache sein, im svn zu wühlen, aber in der Regel gibt es bzgl. Änderungen, die nicht nur kosmetischer Natur sind, auch einen kurzen Kommentar. Diese kann man über die Änderungshistorie des einzelnen Files, z.B. https://svn.fhem.de/trac/log/trunk/fhem/FHEM/lib/AttrTemplate/httpmod.template aufrufen.

Daher werde ich in das General_Info dann mal einen link reinbasteln, über den das schnell zu erreichen ist:
name:General_Info
filter:TYPE=HTTPMOD
desc: Forum <a href="https://forum.fhem.de/index.php/topic,97694.0.html">link</a> for suggestions or bug reports on httpmod-template.<br>For changes and updates on this file, see <a href="https://svn.fhem.de/trac/log/trunk/fhem/FHEM/lib/AttrTemplate/httpmod.template">svn changelog</a>. In most cases, major changes will be mentionned there.
order:00000000


Wäre nett, wenn ihr Rückmeldung geben könntet, ob das ein gangbarer Weg ist, um wenigstens für etwas (schnell für alle auf demselben Weg zu findende) Transparenz zu sorgen...?

Was das Tasmota-Thema angeht, finde ich den Vorschlag gut, das Intervall für den defmod zu übernehmen. Als Trockenübung müßte das hier funktionieren:

#Contributed by OdfFHEM, see https://forum.fhem.de/index.php/topic,97694.msg992348.html#msg992348
name:tasmota_firmware_updates
filter:TYPE=HTTPMOD
desc: Check Tasmota homepage for available new firmware files<br>Define a HTTPMOD device like <br>define tasmotaupdates HTTPMOD https://github.com/arendst/Tasmota/tags 86400<a href="https://forum.fhem.de/index.php/topic,97694.msg992308.html#msg992308">Source: Forum</a>.
order:X_01e
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:INTERVAL;Actual interval for updating, defaults to one day; {InternalVal("DEVICE","DEF",undef)=~ m,\s([\d]+)\s?, ? $1 : 86400}
defmod DEVICE HTTPMOD https://github.com/arendst/Tasmota/tags INTERVAL
attr DEVICE userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 0
attr DEVICE reading01Name latestVersion
attr DEVICE reading01Regex commit-title">[\w\W]*?<a href=".*">[\w\W]*?v(\d*.\d*.\d*)[\w\W]*?</a>
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})$/ ;; "$3.$2.$1"
attr DEVICE reading02Regex relative-time[\w\W]*?datetime="(\d*-\d*-\d*)T\d*:\d*:\d*Z"
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat {   my $ret ="";;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\
    $ret .= '<div style="text-align:left">';;\
    $ret .= 'last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'">tasmota</a>-check => '.$lastCheck;;\
    $ret .= '<br><br><pre>';;\
    $ret .= "| device                           | current |   new   |  released  |<br>";;\
    $ret .= "---------------------------------------------------------------------<br>";;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
    if($check eq "no updates needed!") {\
      $ret .= '| <b style="color:green">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '| <b style="color:red">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } else {\
      my @devices = split(',',$check);;\
      foreach my $devStr (@devices) {\
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
        $ret .= sprintf("%-32s",$dev);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<b style="color:lightgray">';;\
        $ret .= sprintf("%7s",$old);;\
        $ret .= '</b> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:red">';;\
        $ret .= sprintf("%7s",$new);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:black">';;\
        $ret .= sprintf("%-10s",$date);;\
        $ret .= '</b></a>';;\
        $ret .= " |<br>";;\
      }\
    }\
    $ret .= '</pre></div>';;\
  return $ret;;\
}
attr DEVICE timestamp-on-change-reading .*
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=INFO1_Version=.*\\(.*sonoff\\)")) {\
      my $version = ReadingsVal($dev,"INFO1_Version","unknown");;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if($version ne $VERSION) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model tasmota_firmware_updates

Wäre nett, wenn jemand Rückmeldung geben könnte, ob das paßt, dann übernehme ich das auch für den CUL_HM-defmod.

Danke auf alle Fälle für den Update, @OdfFhem!

Gruß, Beta-User
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 02 Dezember 2019, 11:01:21
@Beta-User

Test hat funktioniert - alles im grünen Bereich.

Übrigens gibt es auch InternalVal("DEVICE","Interval",86400), aber mir persönlich gefallen reguläre Ausdrücke auch besser ;)

Fraglich ist aus meiner Sicht noch, ob man nicht auch hier standardmäßig auf wöchentliches Prüfen reduziert. Nur, wer ganz nah am Puls der Zeit sein will, wird wahrscheinlich die tägliche, stündliche, ... Prüfung brauchen.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 02 Dezember 2019, 11:15:17
Thx für's Gegenchecken.

Werde das dann ohne regex ( ;D ::) ) machen, mit einer Woche als Intervall und in die CUL_HM-Geschichte ebenfalls einbauen. Wäre fast die Frage, ob man das nicht zwangsweise auf "lange" (oder "0" ?) stellt, dann man kann ja (denke ich doch), immer noch ein reread manuell auslösen, wenn einen das "jetzt" interessiert (z.B., weil man grade Zeit und Lust für Updates hat; "0" ist nur nicht so toll, wenn man das auch als Statusanzeige irgendwo einbauen will)...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 03 Dezember 2019, 10:18:50
@Beta-User

Es war zu befürchten: Der Wechsel der Hauptversion hat noch mehr Änderungen mit sich gebracht. Heute habe ich mal ein Gerät auf die neueste Version gebracht und schon stellte ich fest, dass die über MQTT transportierte Versionierung nun nicht mehr das Wort "sonoff" enthält, sondern schlicht "tasmota". Das macht die Match-Regel unbrauchbar und bedarf eines allgemeiner gehaltenen RegEx.

Da in letzter Zeit schon öfter der Wunsch geäußert wurde, alle und nicht nur die updatefähigen Geräte im Blick zu halten, habe ich noch ein neues user-Attribut updatableDevicesMode ergänzt - Benamung in Anlehnung an das relevante userReading updatableDevices. Über dieses Attribut kann die Aufbereitung einfach umgeschaltet werden, so dass keine Quell-Code-Änderung mehr notwendig ist; ein reread bleibt einem jedoch nicht erspart. Wäre natürlich schön, bei evtl. vorhandenem Gerät den schon vorhandenen Wert für updatableDevicesMode beizubehalten. Als weitere Folge wird bei nicht updatefähige Geräten die neue Version im stateFormat nicht rot, sondern schwarz eingefärbt.


+ par:UPDATABLEDEVICESMODE;Actual mode for updatableDevices, defaults to onlyUpdatable; {AttrVal("DEVICE","updatableDevicesMode","onlyUpdatable")}

- attr DEVICE userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex
+ attr DEVICE userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex updatableDevicesMode:onlyUpdatable,all

- $ret .= '<b style="color:red">';;\
+ $ret .= '<b style="color:'.(($new eq $old)?'black':'red').'">';;\

+ < attr DEVICE updatableDevicesMode UPDATABLEDEVICESMODE

- foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=INFO1_Version=.*\\(.*sonoff\\)")) {\
- my $version = ReadingsVal($dev,"INFO1_Version","unknown");;\
+ foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=INFO1_Version!=")) {\
+ my $version = ReadingsVal($dev,"INFO1_Version","0.0.0");;\

- if($version ne $VERSION) {\
+ if ((AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all") || ($version ne $VERSION)) {\


Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 03 Dezember 2019, 10:50:05
Thx, hab's eingearbeitet, mal schauen, ob ich das (zusammen mit einigem anderem) in den update-Zyklus für morgen bekomme.

M.E. kann man hier ein paar Klammern sparen, oder?
+ if ( AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION ) {\
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 03 Dezember 2019, 11:18:12
@Beta-User

Auch der überarbeitete Vorschlag führt zum Ziel ... meine Klammerung ist einfach nur Gewohnheit.



Ich habe übrigens auch noch einen Template-Vorschlag für Updates zu zigbee2mqtt ... interessant?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 03 Dezember 2019, 11:28:17
Zitat von: OdfFhem am 03 Dezember 2019, 11:18:12
Ich habe übrigens auch noch einen Template-Vorschlag für Updates zu zigbee2mqtt ... interessant?
Klar.

Ist das HTTPMOD oder MQTT2_DEVICE? (Im 2. Fall bitte im entsprechenden Thread)...

ZitatAuch der überarbeitete Vorschlag führt zum Ziel ... meine Klammerung ist einfach nur Gewohnheit.
...diese Angewohnheit, lieber zu viele Klammern zu machen, hatte ich auch mal, als ich noch mit DOIF rumexperimentiert hatte ;D . In der Regel ist es aber ohne unnötige Klammern besser lesbar, daher mache ich die lieber weg...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 03 Dezember 2019, 12:05:37
@Beta-User

Ist HTTPMOD; hierbei geht es um die serverseitig laufende Software.

In einem weiteren Schritt müsste man auch noch Firmware-Versionen für einen Stick prüfen. Dies gestaltet sich aber schwierig, da es mittlerweile einen zu bunten Strauß von Versionen gibt ... daher erstmal schieben. Die serverseitig laufende Software kooperiert zum Glück meist auch mit "älteren" Stick-Firmware-Versionen.


#Contributed by OdfFHEM, see ????????????????????????
?????????? name:zigbee2mqtt_updates
filter:TYPE=HTTPMOD
?????????? desc: Check zigbee2mqtt homepage for new versions<br>Define a HTTPMOD device like <br>define zigbee2mqtt_updates HTTPMOD https://github.com/Koenkk/zigbee2mqtt/tags 604800<a href="????????????????????????">Source: Forum</a>.
?????????? order:X_01e
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:INTERVAL;Actual interval for updating, defaults to one day; {InternalVal("DEVICE","Interval",604800)}
par:UPDATABLEDEVICESMODE;Actual mode for updatableDevices, defaults to onlyUpdatable; {AttrVal("DEVICE","updatableDevicesMode","onlyUpdatable")}
defmod DEVICE HTTPMOD https://github.com/Koenkk/zigbee2mqtt/tags INTERVAL
attr DEVICE userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex updatableDevicesMode:onlyUpdatable,all
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 0
attr DEVICE reading01Name latestVersion
attr DEVICE reading01Regex commit-title">[\w\W]*?<a href=".*">[\w\W]*?(\d*\.\d*\.\d*)[\w\W]*?</a>
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})$/ ;; "$3.$2.$1"
attr DEVICE reading02Regex relative-time[\w\W]*?datetime="(\d*-\d*-\d*)T\d*:\d*:\d*Z"
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat {   my $ret ="";;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\
    $ret .= '<div style="text-align:left">';;\
    $ret .= 'last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'">ZigBee</a>-check => '.$lastCheck;;\
    $ret .= '<br><br><pre>';;\
    $ret .= "| device                           | current |   new   |  released  |<br>";;\
    $ret .= "---------------------------------------------------------------------<br>";;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
    if($check eq "no updates needed!") {\
      $ret .= '| <b style="color:green">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '| <b style="color:red">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } else {\
      my @devices = split(',',$check);;\
      foreach my $devStr (@devices) {\
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
        $ret .= sprintf("%-32s",$dev);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<b style="color:lightgray">';;\
        $ret .= sprintf("%7s",$old);;\
        $ret .= '</b> | ';;\
        $ret .= '<a href="https://github.com/Koenkk/zigbee2mqtt/releases/tag/'.$new.'">';;\
        $ret .= '<b style="color:'.(($new eq $old)?'black':'red').'">';;\
        $ret .= sprintf("%7s",$new);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<a href="https://github.com/Koenkk/zigbee2mqtt/releases/tag/'.$new.'">';;\
        $ret .= '<b style="color:black">';;\
        $ret .= sprintf("%-10s",$date);;\
        $ret .= '</b></a>';;\
        $ret .= " |<br>";;\
      }\
    }\
    $ret .= '</pre></div>';;\
  return $ret;;\
}
attr DEVICE updatableDevicesMode UPDATABLEDEVICESMODE
attr DEVICE timestamp-on-change-reading .*
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=permit_join!=")) {\
      my $version = ReadingsVal($dev,"version","0.0.0");;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if (AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
?????????? attr DEVICE model zigbee2mqtt_updates


Es sind übrigens noch ein paar Fragezeichen übriggeblieben ...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 03 Dezember 2019, 12:24:52
Na ja, viele Fragezeichen sind es nicht mehr...

Wenn "wir" das mit der firmware nicht in denselben HTTPMOD bekommen, würde ich vorschlagen, den Namen um "daemon" zu erweitern, das ganze ergäbe dann:
#Contributed by OdfFHEM, see https://forum.fhem.de/index.php/topic,97694.msg998835.html#msg998835
name:zigbee2mqtt_daemon_updates
filter:TYPE=HTTPMOD
desc: Check zigbee2mqtt homepage for new versions of the deamon software.<br>Define a HTTPMOD device like <br>define zigbee2mqtt_updates HTTPMOD https://github.com/Koenkk/zigbee2mqtt/tags 604800<br>
<a href="https://forum.fhem.de/index.php/topic,97694.msg998835.html#msg998835">Source: Forum</a>.
order:X_01f
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:INTERVAL;Actual interval for updating, defaults to one day; {InternalVal("DEVICE","Interval",604800)}
par:UPDATABLEDEVICESMODE;Actual mode for updatableDevices, defaults to onlyUpdatable; {AttrVal("DEVICE","updatableDevicesMode","onlyUpdatable")}
defmod DEVICE HTTPMOD https://github.com/Koenkk/zigbee2mqtt/tags INTERVAL
attr DEVICE userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex updatableDevicesMode:onlyUpdatable,all
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 0
attr DEVICE reading01Name latestVersion
attr DEVICE reading01Regex commit-title">[\w\W]*?<a href=".*">[\w\W]*?(\d*\.\d*\.\d*)[\w\W]*?</a>
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})$/ ;; "$3.$2.$1"
attr DEVICE reading02Regex relative-time[\w\W]*?datetime="(\d*-\d*-\d*)T\d*:\d*:\d*Z"
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat {   my $ret ="";;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\
    $ret .= '<div style="text-align:left">';;\
    $ret .= 'last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'">ZigBee</a>-check => '.$lastCheck;;\
    $ret .= '<br><br><pre>';;\
    $ret .= "| device                           | current |   new   |  released  |<br>";;\
    $ret .= "---------------------------------------------------------------------<br>";;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
    if($check eq "no updates needed!") {\
      $ret .= '| <b style="color:green">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '| <b style="color:red">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } else {\
      my @devices = split(',',$check);;\
      foreach my $devStr (@devices) {\
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
        $ret .= sprintf("%-32s",$dev);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<b style="color:lightgray">';;\
        $ret .= sprintf("%7s",$old);;\
        $ret .= '</b> | ';;\
        $ret .= '<a href="https://github.com/Koenkk/zigbee2mqtt/releases/tag/'.$new.'">';;\
        $ret .= '<b style="color:'.(($new eq $old)?'black':'red').'">';;\
        $ret .= sprintf("%7s",$new);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<a href="https://github.com/Koenkk/zigbee2mqtt/releases/tag/'.$new.'">';;\
        $ret .= '<b style="color:black">';;\
        $ret .= sprintf("%-10s",$date);;\
        $ret .= '</b></a>';;\
        $ret .= " |<br>";;\
      }\
    }\
    $ret .= '</pre></div>';;\
  return $ret;;\
}
attr DEVICE updatableDevicesMode UPDATABLEDEVICESMODE
attr DEVICE timestamp-on-change-reading .*
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=permit_join!=")) {\
      my $version = ReadingsVal($dev,"version","0.0.0");;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if (AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model zigbee2mqtt_daemon_updates


In die mqtt2.template-file würde ich dann zu zigbee2mqtt_bridge noch folgendes anfügen?
attr DEVICE comment To check for new updates of the deamon software, you might want to use a separate HTTPMOD device. See HTTPMOD template zigbee2mqtt_daemon_updates for further details.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 03 Dezember 2019, 13:02:34
@Beta-User

Die Firmware müsste man vermutlich in mehreren HTTPMOD abhandeln, da die Firmware pro verwendetem Chip / pro Einsatzzweck / pro Zigbee-Protokoll-Version zu unterscheiden ist. Bislang schaue ich "automatisch" nach neuer Firmware nur, wenn es neue Server-Software gibt oder ich ein Problem mit der aktuellen Firmware habe ... zum Glück ein eher seltenes Unterfangen.

Einen Namenszusatz zu verwenden finde ich gut und ein bisschen "Werbung" im MQTT-Bereich schadet ja nicht ...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Romoker am 03 Januar 2020, 09:47:53
Mit dem Attribut-Template DWD_weather_warnings wurden die aktuellen DWD-Warnungen zu meinem REGIONCODE als Readings wunderbar angelegt.
Wie bekomme ich es hin, dass die Readings wieder gelöscht werden, wenn die DWD-Warnungen nicht mehr existent sind?
Es gibt ja das Attribut DeleteIfUnmatched. Aber wie wende ich das auf die generierten JSON-Readings an?

Viele Grüße
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 03 Januar 2020, 09:57:43
Würde mal (ungetestet) auf
attr DEVICE readingMaxAge 10
attr DEVICE readingMaxAgeReplacementMode delete
tippen (analog einiger anderer attrTemplate). Das scheint (nach Zeitablauf, hier 10 sec. nach dem Parsen) schlicht alle Readings zu löschen, die es nicht mehr gibt.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Romoker am 03 Januar 2020, 10:39:25
Danke - funktioniert.

Ich schlage vor die zwei Attribute mit in das Template DWD_weather_warnings aufzunehmen.

Viele Grüße
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 05 Januar 2020, 06:34:30
THX, ist ab nachher via update verfügbar.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Panik am 21 Januar 2020, 08:49:44
Hallo Beta-User

ich habe in einem anderen Forumsblock eine Frage gestellt, die wohl besser hier aufgehoben wäre:
https://forum.fhem.de/index.php/topic,107454.msg1015106.html#msg1015106

Da geht es um das HTTPMOD Template DWD_weather_warnings und eine Umformatierung eines Unix-Zeitstempels

Wie kann man denn das readingFormat so universell anwenden, dass es nur auf die
warnings_109187000_0x_end und warnings_109187000_0x_start wirkt, die ja auch mal
in der Anzahl mehr oder weniger oft vorhanden sein können.

Der Wert des dortigen Unix-Zeitstempels sollte so ähnlich formatiert sein: localtime(TIMESTAMP)

Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 21 Januar 2020, 09:51:31
Hi Panik,

ob das besser hier aufgehoben ist, sei mal dahingestellt, was HTTPMOD angeht, bin ich auch eher "Not-Maintainer"... ;D

Vermutlich ist das Thema am besten im allg. HTTPMOD-Thread aufgehoben, sollten wir hier nicht Ansatzpunkte finden. Wenn ich es richtig verstanden habe, soll eigentlich der Readingwert in den zwei Fällen direkt weiterverarbeitet werden (durch 1000 teilen (ggf. int davon) und dann in
FmtDateTime() umgewandelt werden).

Das sieht mir nach einem etwas komplexeren coding für ein (get|reading)[0-9]*OExpr-Attribut aus...

Hilft dir dieses Stichwort schon weiter?

(Evtl. gibt es hier ja jemanden, der damit etwas mehr Erfahrung hat wie meinereiner, der das austesten könnte...?)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Panik am 21 Januar 2020, 15:33:47
Hallo Beta-User,

defmod Wetterwarnungen_rg readingsGroup .*:.*[Ww]arnings.*
attr Wetterwarnungen_rg group Wetter
attr Wetterwarnungen_rg room Wetter
attr Wetterwarnungen_rg timestampStyle style="color: silver"
attr Wetterwarnungen_rg valueFormat {return FmtDateTime($VALUE/1000) if( $READING =~ "end" );;;;return FmtDateTime($VALUE/1000) if( $READING =~ "start" );;;;}


Vom HTTPMOD-Maintainer bekam ich die Empfehlung, es hier zu versuchen
bzw. readingFormat zu verwenden.

mit readingFormat ist leider so ein Konstrukt wie ich es in der RG mit valueFormat umsetzen konnte nicht möglich.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 21 Januar 2020, 16:30:33
Ok, ich gebe mich geschlagen ;D ...

Versuch's mal mit
attr Wetterwarner readingOExpr $val = FmtDateTime($val/1000) if $val =~ m/^[\d]+$/g && $val >10000;;;;$val
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Panik am 22 Januar 2020, 05:38:02
BINGO!

Danke!

Ich wusste doch, da geht was in den Attributen.
An den Trick ">10000" hat ich auch schon gedacht, um die richtigen Werte zu bearbeiten.  ;)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 01 Februar 2020, 14:56:24
Hallo Beta-User,

hier zwei neue Template Vorschläge - bitte mal auf Fehler prüfen und bei gefallen übrnehmen.

neuer homematic fw check (https://forum.fhem.de/index.php/topic,78501.msg1019327.html#msg1019327)
#Contributed by Pfriemler & yersinia, see https://forum.fhem.de/index.php/topic,78501.msg1019327.html#msg1019327
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)<br>Define a HTTPMOD device like <br>define hm_fw_check HTTPMOD https://update.homematic.com/firmware/api/firmware/search/DEVICE 86400<a href="https://forum.fhem.de/index.php/topic,78501.msg1019327.html#msg1019327">Source: Forum</a>
order:X_01a
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 enableControlSet 1
attr DEVICE icon hm_ccu
attr DEVICE reading01AutoNumLen 2
attr DEVICE reading01Name hmfw-type
attr DEVICE reading01RegOpt g
attr DEVICE reading01Regex (?i)"type":"((?:\w+[-]*){1,})
attr DEVICE reading02AutoNumLen 2
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 room WHICHROOM
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE showNewFWOnly yes
attr DEVICE stateFormat {   my $ret ="";;;;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;;;\
    $ret .= '<div style="text-align:left">';;;;\
    $ret .= 'last <a title="eq3-downloads" href="http://www.eq-3.de/service/downloads.html">homematic</a>-fw-check => '.$lastCheck;;;;\
    $ret .= '<br><br><pre>';;;;\
    $ret .= "| device                         | model                   | cur_fw | new_fw |<br>";;;;\
    $ret .= "------------------------------------------------------------------------------<br>";;;;\
    my $check = ReadingsVal($name,"newFwForDevices","error => no or wrong data from eq3-server!");;;;\
    if($check eq "no fw-updates needed!") {\
      $ret .= '| <b style="color:green">';;;;\
      $ret .= sprintf("%-74s",$check);;;;\
      $ret .= '</b> |';;;;\
    } elsif($check eq "error => no or wrong data from eq3-server!") {\
      $ret .= '| <b style="color:red">';;;;\
      $ret .= sprintf("%-74s",$check);;;;\
      $ret .= '</b> |';;;;\
    } else {\
      my @devices = split(',',$check);;;;\
      foreach my $devStr (@devices) {\
        my ($dev,$md,$idx,$ofw,$nfw) = $devStr =~ m/([^\s]+)\s[(]([^\s]+)\s[(](\d+)[)]\sofw_([\d\.]+)\s=>\snfw_([\d\.]+)/;;;;\
        my $fw_link = "https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=".$md;;;;\
        $ret .= '| <a href="/fhem?detail='.$dev.'" target="_blank"><b>';;;;\
        $ret .= sprintf("%-30s",$dev);;;;\
        $ret .= '</b></a> | ';;;;\
        $ret .= '<b'.(($md eq "?")?' title="missing attribute model => set device in teach mode to receive missing data" style="color:yellow;;"':' style="color:lightgray;;"').'>';;;;\
        $ret .= sprintf("%-23s",$md);;;;\
        $ret .= '</b> | ';;;;\
        $ret .= '<b'.(($ofw eq "0.0")?' title="missing attribute firmware => set device in teach mode to receive missing data" style="color:yellow"':' style="color:lightgray;;"').'>';;;;\
        $ret .= sprintf("%6s",$ofw);;;;\
        $ret .= '</b> | ';;;;\
        $ret .= '<a title="download firmware file" href="'.$fw_link.'" target="_blank"><b style="color:red;;">';;;;\
        $ret .= sprintf("%6s",$nfw);;;;\
        $ret .= '</b></a> | ';;;;\
        $ret .= "<br />";;;;\
      }\
    }\
    $ret .= '</pre></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(ReadingsVal($name,"hmfw-type-".$_,"?").":".ReadingsVal($name,"hmfw-version-".$_,"?").":".$_);;;;\
} ReadingsVal($name,"MATCHED_READINGS","?")=~ m/hmfw-version-(\d\d)/g;;;;\
\
foreach my $dev (devspec2array("TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=(virtual|)")) {\
      my $md = AttrVal($dev,"model","?");;;;\
      my $v = 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." (".$md." (".$idx.") ofw_".$v." => nfw_".$fwv.")";;;;\
        }\
      }\
    }\
  } else {\
    $ret = "error => no or wrong data from eq3-server!";;;;\
  }\
  return ($ret eq "")?"no fw-updates needed!":$ret;;;;\
}
attr DEVICE webCmd reread


Heizölpreis-ermittlung via easyoil (https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754):
#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 <a href="https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754">Source: Forum</a>
order:X_02a
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)}
defmod 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= 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 replacement04Mode:reading,internal,text,expression,key replacement04Regex replacement04Value replacement05Mode:reading,internal,text,expression,key replacement05Regex replacement05Value
attr DEVICE enableControlSet 1
attr DEVICE reading010Name Heizoelpreis
attr DEVICE reading010OExpr $val =~ s/,/\./;; $val;;
attr DEVICE reading010Regex <span class="fw_b ">([\d\,]+)
attr DEVICE replacement01Mode text
attr DEVICE replacement01Regex %%PLZ%%
attr DEVICE replacement01Value 40764
attr DEVICE replacement02Mode text
attr DEVICE replacement02Regex %%MENGE%%
attr DEVICE replacement02Value 3000
attr DEVICE replacement03Mode text
attr DEVICE replacement03Regex %%ENTLADESTELLEN%%
attr DEVICE replacement03Value 1
attr DEVICE replacement04Mode text
attr DEVICE replacement04Regex %%SCHLAUCHLAENGE%%
attr DEVICE replacement04Value 40
attr DEVICE replacement05Mode text
attr DEVICE replacement05Regex %%ANHAENGER%%
attr DEVICE replacement05Value pr-truck-type=short_vehicle
attr DEVICE room WHICHROOM
attr DEVICE stateFormat {"<div>".ReadingsTimestamp($name,"Heizoelpreis","-")." \
<b>".ReadingsVal($name,"Heizoelpreis","-")."&euro;;</b>/100l</div>"}
attr DEVICE webCmd reread


Bei der order war ich mir nicht ganz sicher, was ich eintragen soll...-.-
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 03 Februar 2020, 13:05:43
Moin,

hab's erst mal fast so übernommen.

Was das homematic-Thema angeht, bin ich eigentlich geneigt, das andere attrTemplate rauszunehmen, eine (funktionierende...) Quelle sollte reichen, oder?

Order für Heizöl habe ich jetzt so gewählt, dass es nach den Spritpreisen aufgelistet werden sollte...

(du siehst: alles kein Hexenwerk  ;) ...)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 03 Februar 2020, 14:28:31
Bedankt. :D

Zitat von: Beta-User am 03 Februar 2020, 13:05:43Was das homematic-Thema angeht, bin ich eigentlich geneigt, das andere attrTemplate rauszunehmen, eine (funktionierende...) Quelle sollte reichen, oder?
Ja, ich denke auch, da es -anscheinend zurzeit- nicht funktioniert. Oder man markiert die eq-3 Version als deprecated.

Zitat von: Beta-User am 03 Februar 2020, 13:05:43Order für Heizöl habe ich jetzt so gewählt, dass es nach den Spritpreisen aufgelistet werden sollte...
pascht. (auch hier kann es mehrere Lösungen geben, die Anbieter variieren ja....)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 03 Februar 2020, 14:41:03
Zitat von: yersinia am 03 Februar 2020, 14:28:31
Bedankt. :D
(Hoffe, die Aussage hinter der Aussage kam an...?)

Daher noch ein paar weitere Anmerkungen:
Zitat
Ja, ich denke auch, da es -anscheinend zurzeit- nicht funktioniert. Oder man markiert die eq-3 Version als deprecated.
Könnte man. Aber es ist ja kein "funktionales" Device in dem Sinne, dass man da typischerweise Eventhandler usw. andocken würde, es ist nach meinem Verständnis eher ein informatorisches "Hilfsdevice" zur direkten Bedienung durch den User. Von daher kann man die alte Version immer noch wieder aus dem svn holen, wenn man das bräuchte. Sehe aber im Moment keinen Grund anzunehmen, dass die neue Quelle eher versiegen würde als die alte...

Zitatpascht. (auch hier kann es mehrere Lösungen geben, die Anbieter variieren ja....)
Klar. Ist eine reine Geschmacksfrage, und dadurch, dass order "nur" im Hintergrund verarbeitet wird, kann man das insgesamt im Prinzip auch völlig frei nachträglich ändern oder dieselbe order-Anbage sogar mehrfach nehmen. Wichtig ist m.E. nur, dass thematisch ähnliche Templates irgendwie "beeinander" auftauchen, wichtigere optimalerweise vorneweg; aber auch das ist nur eine Frage der Benutzerführung, nicht der Funktionalität...

(Wie gesagt: der Stuhl ist frei ;) ).
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Lazgar am 04 Februar 2020, 08:35:41
Hallo.

Ich habe mir den Tasmota Firmware Check definiert... aber scheinbar fehlt mir da noch irgendwas damit es auch läuft.

Bekomme immer folgende Fehlermeldung:

ZitatError evaluating OU_VPI_TEST stateFormat: Global symbol "$new" requires explicit package name (did you forget to declare "my $new"?) at (eval 105602) line 14.
Global symbol "$old" requires explicit package name (did you forget to declare "my $old"?) at (eval 105602) line 14.

Das Device hab ich einfach über das Template erstellen lassen.
Kann mir wer sagen was ich tun muss damit es läuft?

Danke schon mal im Voraus!

LG Lasgar
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 04 Februar 2020, 09:09:03
@Lazgar

Kämpfst Du gerade damit, v8.1.0-Tasmota_Firmware_Check zu prüfen ...

Noch bin ich unsicher, was Du genau momentan machst ...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 04 Februar 2020, 09:59:46
Hmm, vermutlich kommt die Fehlermeldung aus der Zeile hier (im Zweig "elsif($check eq "error => no or wrong data from server!") {\"):
$ret .= '| <b style="color:'.(($new eq $old)?'black':'red').'">';;\

Da sind wirklich weder $new noch $old initialisiert, oder?
@Lazgar: Würde vorschlagen, einfach in diesem Fall alles rot zu machen, das sollte mit dieser Änderung der Zeile gehen:
$ret .= '| <b style="color:red">';;\
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 04 Februar 2020, 10:20:52
@Beta-User

So steht das aktuell im November drin:

elsif($check eq "error => no or wrong data from server!") {
  $ret .= '| <b style="color:red">';
  $ret .= sprintf("%-65s",$check);
  $ret .= '</b> |';
}

Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 04 Februar 2020, 10:47:17
Hmm, in der aktuellen template-Fassung im svn ist das anders, kann grade nicht nachvollziehen, warum. Update kommt bei Gelegenheit, sorry for inconvenience...

EDIT: update ist im svn
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: omnior am 05 Februar 2020, 18:11:42
Ich versuche gerade mit HTTPMOD eine Abfrage bei fewo-direkt einzurichten und dort eine aufpoppende Infoleiste abzufangen. Hat das jemand schon mal versucht oder mit etwas Ähnlichem eine Erfahrung?

die Definition lautet:
define fewo HTTPMOD https://www.fewo-direkt.de/ferienwohnung-ferienhaus/p1110139

Wenn man den Link dieser Seite im Browser aufruft kommt während des Aufrufs der Popup "Wurde in den letzten 48 Stunden x-mal aufgerufen".
Leider kann ich das auf der in fhem eingelesenen Seite aber nirgends finden um es zu parsen. Ich vermute das funktioniert noch irgendwie anders. Jemand eine Idee wie man da rankommen könnte?
Robert
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: rudolfkoenig am 05 Februar 2020, 18:27:51
Der Browser laedt alle verlinkten Dokumente und fuehrt auch JavaScript aus, HTTPMOD tut das alles nicht.
Lade mal diese Seite per wget oder curl, und analysiere das Ergebnis, das entspricht in etwa dem, was HTTPMOD hat.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: frank am 05 Februar 2020, 18:34:14
versuche in httpmod den header vom browserrequest nachzubauen.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: omnior am 05 Februar 2020, 21:24:14
Also mit:curl 'https://www.fewo-direkt.de/pdp/graphql' -H 'authority: www.fewo-direkt.de' -H 'pragma: no-cache' -H 'cache-control: no-cache' -H 'origin: https://www.fewo-direkt.de' -H 'x-homeaway-site: homeaway_de' -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36' -H 'x-csrf-jwt-pdp: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjU5N2QyZGJmYjg2MmFlZjM2Y2IzMTMxMGNkZDZlMTlkZTE0MTYwOWViYTEzYWQ1MWYzMjU2NTU5MzVlYWE4ZjRjMTZhYmM2YjY1YmVlOWQ3NzM2MDE2Njg0YTc3OGE2OTg1Nzg4M2IzYWI0YTUzZmU0N2IyNWU1YjczN2E5MzRkMmZhNmYwZWUwMDM2ODg0N2RkMTRkYTM5MDJmNTUyNDkzMDk2M2ZjZDVlNDBhNTk1MTVlNTFmZjRlNzAyNjY3ZWQyMzc4ODA2ODUxYTgxYjY0MGI4ZTQ1Y2Q3OGMyNjA4ZjA5Nzc2ODg5Mzk0OWY4NzA4Njk4YTcwOWRjNmNkMGJkOWRiNDIwNzI2NzNlNjI0NTM3YmQ2YTI0YTI0MzAwNSIsImlhdCI6MTU4MDg0MzI0MSwiZXhwIjoxNTgxNDQ4MDQxfQ.9977gmSQ_RyexkYjVesPKkQis4b8vDWKOEPu6zcBH8o' -H 'content-type: application/json' -H 'x-homeaway-displaylocale: de_DE' -H 'dnt: 1' -H 'accept: */*' -H 'sec-fetch-site: same-origin' -H 'sec-fetch-mode: cors' -H 'referer: https://www.fewo-direkt.de/ferienwohnung-ferienhaus/p2064237?r=SEARCH' -H 'accept-encoding: gzip, deflate, br' -H 'accept-language: de,en-US;q=0.9,en;q=0.8,he;q=0.7' -H 'cookie: ha-device-id=7bc2e7b3-b798-4271-980c-f8a8548cce8a; hav=7bc2e7b3-b798-4271-980c-f8a8548cce8a; visid_incap_1042227=mEcdWovaR9a/6vF+knKW2E008VwAAAAAQUIPAAAAAAAbVYJzIPXh0XXGj3t57S8N; nlbi_1042227=ybUWJ4RegXX2w/+Uy55XXgAAAAD5XxH1SiypgY87EybW3yZD; ha-cookie-settings=functional%3A1; ha-gx-prefs=de_DE|EUR; ha-mkt=33cf1a9a-132a-4e22-863a-f79982124c82; incap_ses_473_1042227=aiIYLujH5An93BtZbnCQBuKFPV0AAAAA42PmDFn76blnoUuVtLiK7w==; ef199862-9147-4c8e-9f26-cd9247c918d5SL=1; has=ef199862-9147-4c8e-9f26-cd9247c918d5; eu-site=1; ha-trip-prst=%7B%22arrival%22%3A%22%22%2C%22departure%22%3A%22%22%2C%22numberOfAdults%22%3A0%2C%22numberOfChildren%22%3A0%2C%22petIncluded%22%3Afalse%7D; site=homeaway_de; crumb=Yvv-KzQxxjUNJ1_C8dFQ_7M5eBeNjAQnbIlJ6zC3KjO; ha-mkt=fb7095a5-356e-4c75-9e02-04ea2254da1e' --data-binary $'{"query":"\\n    query UnitMessage(\\n            $unitUuid: String\u0021, \\n            $dateRange: UrgencyDateRange, \\n            $assetVersion: Int\u0021, \\n            $totalPrice: UnitTotalPrice, \\n            $guests: UrgencyGuests\\n        ) {\\n        unitMessage(\\n            unitUuid: $unitUuid, \\n            dateRange: $dateRange, \\n            assetVersion: $assetVersion,\\n            guests: $guests,\\n            totalPrice: $totalPrice\\n        ) {\\n            iconText {\\n                message\\n                icon\\n                messageValueType\\n            }\\n        }\\n    }\\n","variables":{"unitUuid":"5a136a6f-d9f2-4951-8c6b-9ca55cddbf1d","assetVersion":1},"operation":"graphql_get_urgency_message"}' --compressed

bekomme ich als Antwort:
{"data":{"unitMessage":{"iconText":{"message":"Wurde in den letzten 48 Stunden 32-mal angesehen","icon":"VIEWED_HOUSE","messageValueType":"VIEWED"}}}}

und hier steht dann genau das richtige drin :)
Ich weiß nur nicht wie ich diesen riesenlangen Curl Befehl nun in das httpmod reinbekomme
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 06 Februar 2020, 00:50:59
defmod fewo HTTPMOD https://www.fewo-direkt.de/pdp/graphql 0
attr fewo userattr requestData requestData04 requestHeader01 requestHeader02 requestHeader03 requestHeader04 requestHeader05 requestHeader06 requestHeader07 requestHeader08 requestHeader09 requestHeader10 requestHeader11 requestHeader12 requestHeader13
attr fewo enableControlSet 1
attr fewo enableCookies 1
attr fewo requestData {"query":"\n    query UnitMessage(\n            $unitUuid: String!, \n            $dateRange: UrgencyDateRange, \n            $assetVersion: Int!, \n            $totalPrice: UnitTotalPrice, \n            $guests: UrgencyGuests\n        ) {\n        unitMessage(\n            unitUuid: $unitUuid, \n            dateRange: $dateRange, \n            assetVersion: $assetVersion,\n            guests: $guests,\n            totalPrice: $totalPrice\n        ) {\n            iconText {\n                message\n                icon\n                messageValueType\n            }\n        }\n    }\n","variables":{"unitUuid":"5a136a6f-d9f2-4951-8c6b-9ca55cddbf1d","assetVersion":1},"operation":"graphql_get_urgency_message"}
attr fewo requestHeader01 user-agent: Mozilla/5.0 (Macintosh;; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
attr fewo requestHeader02 authority: www.fewo-direkt.de
attr fewo requestHeader03 origin: https://www.fewo-direkt.de
attr fewo requestHeader04 cookie: ha-device-id=7bc2e7b3-b798-4271-980c-f8a8548cce8a;; hav=7bc2e7b3-b798-4271-980c-f8a8548cce8a;; visid_incap_1042227=mEcdWovaR9a/6vF+knKW2E008VwAAAAAQUIPAAAAAAAbVYJzIPXh0XXGj3t57S8N;; nlbi_1042227=ybUWJ4RegXX2w/+Uy55XXgAAAAD5XxH1SiypgY87EybW3yZD;; ha-cookie-settings=functional%3A1;; ha-gx-prefs=de_DE|EUR;; ha-mkt=33cf1a9a-132a-4e22-863a-f79982124c82;; incap_ses_473_1042227=aiIYLujH5An93BtZbnCQBuKFPV0AAAAA42PmDFn76blnoUuVtLiK7w==;; ef199862-9147-4c8e-9f26-cd9247c918d5SL=1;; has=ef199862-9147-4c8e-9f26-cd9247c918d5;; eu-site=1;; ha-trip-prst=%7B%22arrival%22%3A%22%22%2C%22departure%22%3A%22%22%2C%22numberOfAdults%22%3A0%2C%22numberOfChildren%22%3A0%2C%22petIncluded%22%3Afalse%7D;; site=homeaway_de;; crumb=Yvv-KzQxxjUNJ1_C8dFQ_7M5eBeNjAQnbIlJ6zC3KjO;; ha-mkt=fb7095a5-356e-4c75-9e02-04ea2254da1e
attr fewo requestHeader05 x-homeaway-site: homeaway_de
attr fewo requestHeader06 content-type: application/json
attr fewo requestHeader07 x-homeaway-displaylocale: de_DE
attr fewo requestHeader08 dnt: 1
attr fewo requestHeader09 accept: */*
attr fewo requestHeader10 sec-fetch-site: same-origin
attr fewo requestHeader11 sec-fetch-mode: cors
attr fewo requestHeader12 referer: https://www.fewo-direkt.de/ferienwohnung-ferienhaus/p2064237?r=SEARCH
attr fewo requestHeader13 x-csrf-jwt-pdp: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbiI6IjU5N2QyZGJmYjg2MmFlZjM2Y2IzMTMxMGNkZDZlMTlkZTE0MTYwOWViYTEzYWQ1MWYzMjU2NTU5MzVlYWE4ZjRjMTZhYmM2YjY1YmVlOWQ3NzM2MDE2Njg0YTc3OGE2OTg1Nzg4M2IzYWI0YTUzZmU0N2IyNWU1YjczN2E5MzRkMmZhNmYwZWUwMDM2ODg0N2RkMTRkYTM5MDJmNTUyNDkzMDk2M2ZjZDVlNDBhNTk1MTVlNTFmZjRlNzAyNjY3ZWQyMzc4ODA2ODUxYTgxYjY0MGI4ZTQ1Y2Q3OGMyNjA4ZjA5Nzc2ODg5Mzk0OWY4NzA4Njk4YTcwOWRjNmNkMGJkOWRiNDIwNzI2NzNlNjI0NTM3YmQ2YTI0YTI0MzAwNSIsImlhdCI6MTU4MDg0MzI0MSwiZXhwIjoxNTgxNDQ4MDQxfQ.9977gmSQ_RyexkYjVesPKkQis4b8vDWKOEPu6zcBH8o
attr fewo showBody 1


0 in DEF durch gewünschte Frequenz ersetzen, oder manuell mit "set fewo reread" die Abfrage starten
(Allerdings ist es hier ein Thread über httpmod Templates, nicht über HTTPMOD Grundlagen. Wenn weitere Fragen, bitte ein neues Thread z.B. in Anfängerfragen oder Sonstiges Subforum öffnen)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: klausw am 07 Februar 2020, 11:02:12
Hallo,

beim hm_fw_check_v2 gibt es einen Bug:

Die defmod Anweisung sollte so aussehen:
Zitatdefmod DEVICE HTTPMOD https://update.homematic.com/firmware/api/firmware/search/DEVICE INTERVAL

Das "DEVICE" im Link wird aber dummerweise durch den Devicenamen ersetzt und das Ganze funktioniert dann nicht.

Hast Du eine Möglichkeit diesen replace String zu escapen?


Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 07 Februar 2020, 11:06:16
Ja, escapen geht wie üblich mit einem "\" (siehe z.B. manche MQTT2_\DEVICE-Einträge in mqtt2.template)

Und vor allem: Danke für den Hinweis, ich hatte das template vor kurzem kurz angetestet und mich gewundert, warum wieder nichts als updatebar angezeigt wurde, aber bisher keine Muße, dem mal nachzugehen... ::)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 07 Februar 2020, 14:38:58
Zitat von: klausw am 07 Februar 2020, 11:02:12
Hallo,

beim hm_fw_check_v2 gibt es einen Bug:

Die defmod Anweisung sollte so aussehen:
Das "DEVICE" im Link wird aber dummerweise durch den Devicenamen ersetzt und das Ganze funktioniert dann nicht.

Hast Du eine Möglichkeit diesen replace String zu escapen?

omg, das hab ich völlig übersehen. Gut, hab die templates selbst nicht getestet *facepalm*. Anyhow, müsste mit dem escape dann so ausshene, oder?
defmod DEVICE HTTPMOD https://update.homematic.com/firmware/api/firmware/search/\DEVICE INTERVAL

Als template:
#Contributed by Pfriemler & yersinia, see https://forum.fhem.de/index.php/topic,78501.msg1019327.html#msg1019327
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)<br>Define a HTTPMOD device like <br>define hm_fw_check HTTPMOD https://update.homematic.com/firmware/api/firmware/search/DEVICE 86400<br /><a href="https://forum.fhem.de/index.php/topic,78501.msg1019327.html#msg1019327">Source: Forum</a>
order:X_01a
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 enableControlSet 1
attr DEVICE icon hm_ccu
attr DEVICE reading01AutoNumLen 2
attr DEVICE reading01Name hmfw-type
attr DEVICE reading01RegOpt g
attr DEVICE reading01Regex (?i)"type":"((?:\w+[-]*){1,})
attr DEVICE reading02AutoNumLen 2
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 room WHICHROOM
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE showNewFWOnly yes
attr DEVICE stateFormat {   my $ret ="";;;;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;;;\
    $ret .= '<div style="text-align:left">';;;;\
    $ret .= 'last <a title="eq3-downloads" href="http://www.eq-3.de/service/downloads.html">homematic</a>-fw-check => '.$lastCheck;;;;\
    $ret .= '<br><br><pre>';;;;\
    $ret .= "| device                         | model                   | cur_fw | new_fw |<br>";;;;\
    $ret .= "------------------------------------------------------------------------------<br>";;;;\
    my $check = ReadingsVal($name,"newFwForDevices","error => no or wrong data from eq3-server!");;;;\
    if($check eq "no fw-updates needed!") {\
      $ret .= '| <b style="color:green">';;;;\
      $ret .= sprintf("%-74s",$check);;;;\
      $ret .= '</b> |';;;;\
    } elsif($check eq "error => no or wrong data from eq3-server!") {\
      $ret .= '| <b style="color:red">';;;;\
      $ret .= sprintf("%-74s",$check);;;;\
      $ret .= '</b> |';;;;\
    } else {\
      my @devices = split(',',$check);;;;\
      foreach my $devStr (@devices) {\
        my ($dev,$md,$idx,$ofw,$nfw) = $devStr =~ m/([^\s]+)\s[(]([^\s]+)\s[(](\d+)[)]\sofw_([\d\.]+)\s=>\snfw_([\d\.]+)/;;;;\
        my $fw_link = "https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=".$md;;;;\
        $ret .= '| <a href="/fhem?detail='.$dev.'" target="_blank"><b>';;;;\
        $ret .= sprintf("%-30s",$dev);;;;\
        $ret .= '</b></a> | ';;;;\
        $ret .= '<b'.(($md eq "?")?' title="missing attribute model => set device in teach mode to receive missing data" style="color:yellow;;"':' style="color:lightgray;;"').'>';;;;\
        $ret .= sprintf("%-23s",$md);;;;\
        $ret .= '</b> | ';;;;\
        $ret .= '<b'.(($ofw eq "0.0")?' title="missing attribute firmware => set device in teach mode to receive missing data" style="color:yellow"':' style="color:lightgray;;"').'>';;;;\
        $ret .= sprintf("%6s",$ofw);;;;\
        $ret .= '</b> | ';;;;\
        $ret .= '<a title="download firmware file" href="'.$fw_link.'" target="_blank"><b style="color:red;;">';;;;\
        $ret .= sprintf("%6s",$nfw);;;;\
        $ret .= '</b></a> | ';;;;\
        $ret .= "<br />";;;;\
      }\
    }\
    $ret .= '</pre></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(ReadingsVal($name,"hmfw-type-".$_,"?").":".ReadingsVal($name,"hmfw-version-".$_,"?").":".$_);;;;\
} ReadingsVal($name,"MATCHED_READINGS","?")=~ m/hmfw-version-(\d\d)/g;;;;\
\
foreach my $dev (devspec2array("TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=(virtual|)")) {\
      my $md = AttrVal($dev,"model","?");;;;\
      my $v = 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." (".$md." (".$idx.") ofw_".$v." => nfw_".$fwv.")";;;;\
        }\
      }\
    }\
  } else {\
    $ret = "error => no or wrong data from eq3-server!";;;;\
  }\
  return ($ret eq "")?"no fw-updates needed!":$ret;;;;\
}
attr DEVICE webCmd reread
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 07 Februar 2020, 15:11:48
 :) ;) ::)
Danke für's "mundfertige" Vorbereiten. Das müßte so passen und ist seit eben auch so (samt model-Angabe) im svn, das alte ist jetzt komplett raus. Hatte sowieso noch einige weitere Kleinigkeiten in mqtt2.template (vielleicht gibt's ja jemanden, der manche grade für mich sehr undurchsichtige Fragen zum Thema Sprachsteuerung mit beantworten könnte, das verursacht grade "etwas Bewegung"...? Thread wäre hier (https://forum.fhem.de/index.php/topic,108080.0.html)...)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: mähschaf am 21 März 2020, 23:35:55
Hallo liebes Forum & guten Abend,

da nun Tasmota 8.2.0 erschienen ist, habe ich die Chance genutzt, mein httpmod "tasmotaupdates" zu testen. Das hat leider zunächst nicht geklappt. Ich bin kein Programmierer, aber konnte folgendes feststellen:

Das Modul erwartet ein Reading namens "INFO01_Version". Das gibt es bei meinem Tasmota gar nicht, sondern lediglich das Reading "Version".

Internals:
   CID        tasmota001
   DEF        tasmota001
   DEVICETOPIC MQTT2_tasmota001
   FUUID      5e20871f-f33f-2b6d-a9b9-bbe0ae511528f216
   IODev      MQTT2_FHEM_Server
   LASTInputDev MQTT2_FHEM_Server
   MQTT2_FHEM_Server_MSGCNT 2462
   MQTT2_FHEM_Server_TIME 2020-03-21 23:29:00
   MSGCNT     2462
   NAME       MQTT2_tasmota001
   NR         143
   STATE      T: 20.6°C, H: 49.1%rH
   TYPE       MQTT2_DEVICE
   Helper:
     DBLOG:
       absoluteHumidity:
         logdb:
           TIME       1584828840.64922
           VALUE      8.8
       dewpoint:
         logdb:
           TIME       1584829740.72015
           VALUE      9.5
       humidity:
         logdb:
           TIME       1584829740.72015
           VALUE      49.1
       temperature:
         logdb:
           TIME       1584828840.64922
           VALUE      20.6
   READINGS:
     2020-03-21 23:29:00   AM2301_Humidity 49.1
     2020-03-21 23:29:00   AM2301_Temperature 20.6
     2020-01-30 23:10:04   Command         Unknown
     2020-02-23 15:35:22   FallbackTopic   cmnd/tasmota001_fb/
     2020-02-23 15:35:22   GroupTopic      cmnd/tasmotas/
     2020-03-21 23:29:00   Heap            27
     2020-02-23 15:35:22   Hostname        tasmota001
     2020-02-23 15:35:22   IPAddress       192.168.4.246
     2020-03-21 23:29:00   LOGGING         23:29:00 MQT: tele/tasmota001/SENSOR = {"Time":"2020-03-21T23:29:00","AM2301":{"Temperature":20.6,"Humidity":49.1},"TempUnit":"C"}
     2020-03-19 20:17:15   LWT             Online
     2020-03-21 23:29:00   LoadAvg         19
     2020-02-23 15:35:22   Module          Generic
     2020-03-21 23:29:00   MqttCount       16
     2020-01-30 21:05:28   NtpServer1      pool.ntp.org
     2020-03-19 20:17:18   POWER           
     2020-03-21 23:29:00   POWER1          on
     2020-02-23 15:35:22   RestartReason   Software/System restart
     2020-02-07 20:00:44   SaveData        off
     2020-01-25 21:20:50   SetOption26     on
     2020-03-21 23:29:00   Sleep           50
     2020-03-21 23:29:00   SleepMode       Dynamic
     2020-01-25 21:20:49   StateText1      off
     2020-01-25 21:20:49   StateText2      on
     2020-01-25 21:20:50   StateText3      toggle
     2020-01-25 21:20:50   StateText4      hold
     2020-03-21 23:29:00   TempUnit        C
     2020-03-21 23:29:00   Time            2020-03-21T23:29:00
     2020-03-21 23:29:00   Uptime          27T07:53:46
     2020-03-21 23:29:00   UptimeSec       2361226
     2020-02-23 15:35:22   Version         8.1.0(tasmota)
     2020-02-07 20:00:39   WebColor_1      #000000
     2020-02-07 20:00:39   WebColor_10     #000000
     2020-02-07 20:00:39   WebColor_11     #5dbcf1
     2020-02-07 20:00:39   WebColor_12     #118ccd
     2020-02-07 20:00:39   WebColor_13     #e06c6c
     2020-02-07 20:00:39   WebColor_14     #b82727
     2020-02-07 20:00:39   WebColor_15     #bbe4c5
     2020-02-07 20:00:39   WebColor_16     #87c596
     2020-02-07 20:00:39   WebColor_17     #ffffff
     2020-02-07 20:00:39   WebColor_18     #999999
     2020-02-07 20:00:39   WebColor_19     #000000
     2020-02-07 20:00:39   WebColor_2      #ffffff
     2020-02-07 20:00:39   WebColor_3      #f2f2f2
     2020-02-07 20:00:39   WebColor_4      #000000
     2020-02-07 20:00:39   WebColor_5      #ffffff
     2020-02-07 20:00:39   WebColor_6      #000000
     2020-02-07 20:00:39   WebColor_7      #ffffff
     2020-02-07 20:00:39   WebColor_8      #ff0000
     2020-02-07 20:00:39   WebColor_9      #008000
     2020-02-23 15:35:22   WebServerMode   Admin
     2020-03-21 23:29:00   Wifi_AP         1
     2020-03-21 23:29:00   Wifi_BSSId      ...
     2020-03-21 23:29:00   Wifi_Channel    6
     2020-03-21 23:29:00   Wifi_Downtime   0T00:00:06
     2020-03-21 23:29:00   Wifi_LinkCount  1
     2020-03-21 23:29:00   Wifi_RSSI       86
     2020-03-21 23:29:00   Wifi_SSId       ...
     2020-03-21 23:29:00   Wifi_Signal     -57
     2020-03-21 23:29:00   absoluteHumidity 8.8
     2020-03-21 23:29:00   dewpoint        9.5
     2020-03-21 23:29:00   humidity        49.1
     2020-02-24 16:23:09   state           on
     2020-03-19 20:17:36   subscriptions   cmnd/tasmota001/# cmnd/tasmota001_fb/# cmnd/tasmotas/#
     2020-03-21 23:29:00   temperature     20.6
Attributes:
   DbLogExclude .*
   DbLogInclude temperature,humidity,absoluteHumidity,dewpoint,LWT,POWER1
   IODev      MQTT2_FHEM_Server
   event-on-change-reading .*
   readingList tasmota001:tele/tasmota001/LWT:.* LWT
tasmota001:cmnd/tasmota001/POWER:.* POWER
tasmota001:tele/tasmota001/INFO1:.* { json2nameValue($EVENT) }
tasmota001:tele/tasmota001/INFO2:.* { json2nameValue($EVENT) }
tasmota001:tele/tasmota001/INFO3:.* { json2nameValue($EVENT) }
tasmota001:tele/tasmota001/STATE:.* { json2nameValue($EVENT) }
tasmota001:stat/tasmota001/LOGGING:.* LOGGING
tasmota001:stat/tasmota001/RESULT:.* { json2nameValue($EVENT) }
tasmota001:stat/tasmota001/POWER1:.* POWER1
tasmota001:tele/tasmota001/SENSOR:.* { json2nameValue($EVENT) }
   room       Dachboden
   setList    on cmnd/tasmota001/POWER on
off cmnd/tasmota001/POWER off
   stateFormat T: AM2301_Temperature°C, H: AM2301_Humidity%rH
   userReadings temperature { ReadingsVal("MQTT2_tasmota001","AM2301_Temperature",0) }, humidity { ReadingsVal("MQTT2_tasmota001","AM2301_Humidity",0) }
   webCmd     on:off


Mit folgender Anpassung des Attributes "userReadings" hat es dann geklappt.

Internals:
   BUSY       0
   DEF        https://github.com/arendst/Tasmota/tags 86400
   FUUID      5e344ed2-f33f-2b6d-188e-26c80943655ab87a
   Interval   86400
   LASTSEND   1584830280.37596
   MainURL    https://github.com/arendst/Tasmota/tags
   ModuleVersion 3.5.22 - 7.2.2020
   NAME       tasmotaupdates
   NOTIFYDEV  global
   NR         307
   NTFY_ORDER 50-tasmotaupdates
   STATE      <div style="text-align:left">last <a title="versions" href="https://github.com/arendst/Tasmota/tags">tasmota</a>-check => 2020-03-21 23:38:00<br><br><pre>| device                           | current |   new   |  released  |<br>---------------------------------------------------------------------<br>| <a href="/fhem?detail=MQTT2_tasmota001"><b>MQTT2_tasmota001                </b></a> | <b style="color:lightgray">  8.1.0</b> | <a href="https://github.com/arendst/Tasmota/releases/tag/v8.2.0"><b style="color:red">  8.2.0</b></a> | <a href="https://github.com/arendst/Tasmota/releases/tag/v8.2.0"><b style="color:black">21.03.2020</b></a> |<br>| <a href="/fhem?detail=MQTT2_tasmota002"><b>MQTT2_tasmota002                </b></a> | <b style="color:lightgray">  8.1.0</b> | <a href="https://github.com/arendst/Tasmota/releases/tag/v8.2.0"><b style="color:red">  8.2.0</b></a> | <a href="https://github.com/arendst/Tasmota/releases/tag/v8.2.0"><b style="color:black">21.03.2020</b></a> |<br>| <a href="/fhem?detail=MQTT2_tasmota003"><b>MQTT2_tasmota003                </b></a> | <b style="color:lightgray">  8.1.0</b> | <a href="https://github.com/arendst/Tasmota/releases/tag/v8.2.0"><b style="color:red">  8.2.0</b></a> | <a href="https://github.com/arendst/Tasmota/releases/tag/v8.2.0"><b style="color:black">21.03.2020</b></a> |<br></pre></div>
   TRIGGERTIME 1584914443.40141
   TRIGGERTIME_FMT 2020-03-22 23:00:43
   TYPE       HTTPMOD
   addr       https://github.com:443
   auth       0
   code       200
   compress   1
   conn       
   data       
   displayurl https://github.com/arendst/Tasmota/tags
   header     Cookie: _gh_sess=mItUEj3abj1Nefc1oBgkLvaCkdikz%2F2Ly0AGbwOVj0t63OQwFbcq7%2FDIHinB2OJuU0zqnB7any%2Bt4DjY0ZtA61imbjpMGZVIm2aQBj4BZ2rP6jvKmy%2BDlGrals1MS8mCiLbzHbip%2Bq4m9dQDK4rfk74%2B5cgax%2FHbNDq43u%2FAq4KdQae683CGo8kiAZI3%2FLb%2BDmTx3dpS0UgXQAiYEvVaArUJPOPWVHFmkZ6u8%2B%2F4q9s57qq%2FY6MmHEU9StZZiw8NgI0LwHUd9DHU7Vc0C8Ujqw%3D%3D--bvE1CvDnfj4E40mp--sR%2B%2BDwMRm0dxm5U9KEEkUw%3D%3D; _octo=GH1.1.1973285465.1584645435; logged_in=no
   host       github.com
   httpheader HTTP/1.1 200 OK
date: Sat, 21 Mar 2020 22:38:00 GMT
content-type: text/html; charset=utf-8
server: GitHub.com
status: 200 OK
vary: X-PJAX, Accept-Encoding, Accept, X-Requested-With
etag: W/"b9bef292404e8a3a996f1017fd01dea7"
cache-control: max-age=0, private, must-revalidate
strict-transport-security: max-age=31536000; includeSubdomains; preload
x-frame-options: deny
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
expect-ct: max-age=2592000, report-uri="https://api.github.com/_private/browser/errors"
content-security-policy: default-src 'none'; base-uri 'self'; block-all-mixed-content; connect-src 'self' uploads.github.com www.githubstatus.com collector.githubapp.com api.github.com www.google-analytics.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com wss://live.github.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com; frame-ancestors 'none'; frame-src render.githubusercontent.com; img-src 'self' data: github.githubassets.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com; manifest-src 'self'; media-src 'none'; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com
Content-Encoding: gzip
Age: 0
Accept-Ranges: bytes
Connection: close
X-GitHub-Request-Id: C8F2:3F08A:4B1FA16:6BD65B2:5E769748
   httpversion 1.0
   hu_blocking 0
   hu_filecount 12
   hu_port    443
   hu_portSfx
   ignoreredirects 0
   loglevel   4
   path       /arendst/Tasmota/tags
   protocol   https
   redirects  0
   timeout    2
   url        https://github.com/arendst/Tasmota/tags
   value      0
   CompiledRegexes:
   HTTPCookieHash:
     _gh_sess;:
       Name       _gh_sess
       Options    Path=/; HttpOnly; Secure
       Path       
       Value      mItUEj3abj1Nefc1oBgkLvaCkdikz%2F2Ly0AGbwOVj0t63OQwFbcq7%2FDIHinB2OJuU0zqnB7any%2Bt4DjY0ZtA61imbjpMGZVIm2aQBj4BZ2rP6jvKmy%2BDlGrals1MS8mCiLbzHbip%2Bq4m9dQDK4rfk74%2B5cgax%2FHbNDq43u%2FAq4KdQae683CGo8kiAZI3%2FLb%2BDmTx3dpS0UgXQAiYEvVaArUJPOPWVHFmkZ6u8%2B%2F4q9s57qq%2FY6MmHEU9StZZiw8NgI0LwHUd9DHU7Vc0C8Ujqw%3D%3D--bvE1CvDnfj4E40mp--sR%2B%2BDwMRm0dxm5U9KEEkUw%3D%3D
     _octo;:
       Name       _octo
       Options    Path=/; Domain=github.com; Expires=Fri, 19 Mar 2021 19:17:15 GMT; Secure
       Path       
       Value      GH1.1.1973285465.1584645435
     logged_in;:
       Name       logged_in
       Options    Path=/; Domain=github.com; Expires=Fri, 19 Mar 2021 19:17:15 GMT; HttpOnly; Secure
       Path       
       Value      no
   QUEUE:
   READINGS:
     2020-03-08 15:14:27   LAST_ERROR      read from https://github.com:443 timed out
     2020-01-31 16:59:31   LAST_REQUEST    update
     2020-03-21 23:38:00   MATCHED_READINGS latestVersion latestDate
     2020-03-21 20:17:15   latestDate      21.03.2020
     2020-03-21 20:17:15   latestVersion   8.2.0
     2020-03-21 23:38:00   updatableDevices MQTT2_tasmota001 (8.1.0 | 8.2.0 | 21.03.2020),MQTT2_tasmota002 (8.1.0 | 8.2.0 | 21.03.2020),MQTT2_tasmota003 (8.1.0 | 8.2.0 | 21.03.2020)
   REQUEST:
     data       
     header     
     ignoreredirects 0
     retryCount 0
     type       update
     url        https://github.com/arendst/Tasmota/tags
     value      0
   defptr:
     readingBase:
       latestDate reading
       latestVersion reading
     readingNum:
       latestDate 02
       latestVersion 01
     readingOutdated:
     requestReadings:
       update:
         latestDate reading 02
         latestVersion reading 01
   sslargs:
Attributes:
   DbLogExclude .*
   enableControlSet 1
   event-on-change-reading .*
   event-on-update-reading LAST_ERROR,MATCHED_READINGS
   handleRedirects 0
   model      tasmota_firmware_updates
   reading01Name latestVersion
   reading01Regex commit-title">[\w\W]*?<a href=".*">[\w\W]*?v(\d*.\d*.\d*)[\w\W]*?</a>
   reading02Name latestDate
   reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})$/ ;; "$3.$2.$1"
   reading02Regex relative-time[\w\W]*?datetime="(\d*-\d*-\d*)T\d*:\d*:\d*Z"
   room       InputOutput->MQTT2
   showError  1
   showMatched 1
   stateFormat {   my $ret ="";;
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;
    $ret .= '<div style="text-align:left">';;
    $ret .= 'last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'">tasmota</a>-check => '.$lastCheck;;
    $ret .= '<br><br><pre>';;
    $ret .= "| device                           | current |   new   |  released  |<br>";;
    $ret .= "---------------------------------------------------------------------<br>";;
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;
    if($check eq "no updates needed!") {
      $ret .= '| <b style="color:green">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } elsif($check eq "error => no or wrong data from server!") {
      $ret .= '| <b style="color:red">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } else {
      my @devices = split(',',$check);;
      foreach my $devStr (@devices) {
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;
        $ret .= sprintf("%-32s",$dev);;
        $ret .= '</b></a> | ';;
        $ret .= '<b style="color:lightgray">';;
        $ret .= sprintf("%7s",$old);;
        $ret .= '</b> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:red">';;
        $ret .= sprintf("%7s",$new);;
        $ret .= '</b></a> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:black">';;
        $ret .= sprintf("%-10s",$date);;
        $ret .= '</b></a>';;
        $ret .= " |<br>";;
      }
    }
    $ret .= '</pre></div>';;
  return $ret;;
}
   timestamp-on-change-reading .*
   updatableDevicesMode UPDATABLEtasmotaupdatesSMODE
   userReadings updatableDevices:MATCHED_READINGS.* {
  my $ret = "";;
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {
    $ret = "error => no or wrong data from server!";;
  } else {
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;
    my $DATE = ReadingsVal($name,"latestDate","unknown");;
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=")) {
      my $version = ReadingsVal($dev,"Version","0.0.0");;
      $version =~ m/([0-9.]*).*/;;
      $version = $1;;
      if ( AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION ) {
        $ret .= "," if($ret ne "");;
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;
      }
    }
  }
  return ($ret eq "")?"no updates needed!":$ret;;
}
   userattr   reading01Name reading01Regex reading02Name reading02OExpr reading02Regex updatableDevicesMode:onlyUpdatable,all
   webCmd     reread


Nur falls noch jemand aus lauter Corona-Langeweile vor dem gleichen Problem stehen sollte wie meinereiner.

Idee an die netten Verantwortlichen des Modules: Eventuell lässt sich das vor dem Version allgemeingültig über eine RegExp oder sowas wegfiltern?

Gütes Nächtle und bleibt gesund.....
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 22 März 2020, 09:54:55
Hallo zusammen,

Danke erst mal für den Hinweis, dass das mit dem Tasmotaupdate nicht so klappt wie gedacht. Da hatte wohl jemand "complex" eingeschaltet...

Hier mal eine Fassung, die mit beidem klarkommen sollte, habe dann gleich noch die alte Version klickbar gemacht, damit man direkt auf das WEB-IF des ESP's kommt:

defmod tasmotaupdates HTTPMOD https://github.com/arendst/Tasmota/tags 86400
attr tasmotaupdates userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex updatableDevicesMode:onlyUpdatable,all
attr tasmotaupdates enableControlSet 1
attr tasmotaupdates event-on-change-reading .*
attr tasmotaupdates event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr tasmotaupdates handleRedirects 0
attr tasmotaupdates model tasmota_firmware_updates
attr tasmotaupdates reading01Name latestVersion
attr tasmotaupdates reading01Regex commit-title">[\w\W]*?<a href=".*">[\w\W]*?v(\d*.\d*.\d*)[\w\W]*?</a>
attr tasmotaupdates reading02Name latestDate
attr tasmotaupdates reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})$/ ;;;; "$3.$2.$1"
attr tasmotaupdates reading02Regex relative-time[\w\W]*?datetime="(\d*-\d*-\d*)T\d*:\d*:\d*Z"
attr tasmotaupdates room Steuerung->Tasmota
attr tasmotaupdates showError 1
attr tasmotaupdates showMatched 1
attr tasmotaupdates stateFormat {   my $ret ="";;;;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;;;\
    $ret .= '<div style="text-align:left">';;;;\
    $ret .= 'last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'">tasmota</a>-check => '.$lastCheck;;;;\
    $ret .= '<br><br><pre>';;;;\
    $ret .= "| device                           | current |   new   |  released  |<br>";;;;\
    $ret .= "---------------------------------------------------------------------<br>";;;;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;;;\
    if($check eq "no updates needed!") {\
      $ret .= '| <b style="color:green">';;;;\
      $ret .= sprintf("%-65s",$check);;;;\
      $ret .= '</b> |';;;;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '| <b style="color:red">';;;;\
      $ret .= sprintf("%-65s",$check);;;;\
      $ret .= '</b> |';;;;\
    } else {\
      my @devices = split(',',$check);;;;\
      foreach my $devStr (@devices) {\
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;;;\
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;;;\
        $ret .= sprintf("%-32s",$dev);;;;\
        $ret .= '</b></a> | ';;;;\
        $ret .= '<b style="color:lightgray">';;;;\
        $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO1_IPAddress","0.0.0.0")).'" target="_blank">';;;;\
        $ret .= sprintf("%7s",$old);;;;\
        $ret .= '</b></a> | ';;;;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;;;\
        $ret .= '<b style="color:red">';;;;\
        $ret .= sprintf("%7s",$new);;;;\
        $ret .= '</b></a> | ';;;;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;;;\
        $ret .= '<b style="color:black">';;;;\
        $ret .= sprintf("%-10s",$date);;;;\
        $ret .= '</b></a>';;;;\
        $ret .= " |<br>";;;;\
      }\
    }\
    $ret .= '</pre></div>';;;;\
  return $ret;;;;\
}
attr tasmotaupdates timestamp-on-change-reading .*
attr tasmotaupdates updatableDevicesMode onlyUpdatable
attr tasmotaupdates userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;;;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;;;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;;;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;;;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=INFO1_Version!=")) {\
      my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0"));;;;\
      $version =~ m/([0-9.]*).*/;;;;\
      $version = $1;;;;\
      if ( AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION ) {\
        $ret .= "," if($ret ne "");;;;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;;;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;;;\
}
attr tasmotaupdates webCmd reread


Bitte mal testen, wer Präfixes verwendet, dann checke ich das ggf. direkt so ein...

Gruß, Beta-User
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: mähschaf am 22 März 2020, 10:36:22
Funktionuckelt ganz wunderprächtig (also das mit dem reread und der Version, das mit dem Webinterface des ESPs habe ich nicht verstanden/getestet)! Vielen Dank für die schnelle Reaktion und die tolle Arbeit!

Ich wünschte, ich könnte auch so gut Perl programmieren...  :-\

Schönen Sonntag und bleibt gesund...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 22 März 2020, 11:32:30
Beim Klick auf die alte Version solltest du direkt auf dem Web-Interface des ESP landen (einfach mal drüberfahren mit der Maus, dann sollte der link sichtbar sein).
Was ich aber grade nicht weiß, ist ob die IPAddresse jetzt über INFO1 kommt oder woanders her (dann ist der Reading-Name anders...).
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: ComputerZOO am 22 März 2020, 12:28:12
Moin,
wäre es auch möglich den Versionsnamen (jetzt: Elliot) mit in ein Reading aufzunehmen?

Schöne Grüße aus MV, bleibt gesund und schön zu Hause,

MAX.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 22 März 2020, 12:42:10
Zitat von: ComputerZOO am 22 März 2020, 12:28:12
Moin,
wäre es auch möglich den Versionsnamen (jetzt: Elliot) mit in ein Reading aufzunehmen?
"Möglich" schon, aber der steht nicht auf der Seite, die hier direkt als URL angegeben ist => ziemlicher Aufwand => warum arbeitest du dich nicht ein und machst einen funktionierenden Vorschlag ;) ?



Habe eben noch überlegt, ob es Sinn macht, gleich auf die update-Seite des Tamota zu verlinken, also noch ein "/up" hinter die ReadingsVal-Abfrage zu basteln...?

(Update ist übrigens schon im svn, falls jemand die aktelle Fassung via attrTemplate suchen sollte. Da sind auch weniger ";" drin, so viele wie in der alten Version braucht man gar nicht ;D .)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: mähschaf am 22 März 2020, 13:42:04
Das Reading wäre in meinem Fall "IPAddress". Also ohne INFO oder irgendwas.  8)

Im html sieht das Ergebnis so aus (8.1.0 ist kein Link):

<a href="/fhem?detail=MQTT2_tasmota001"><b>MQTT2_tasmota001                </b></a> | <b style="color:lightgray">  8.1.0</b> | <a href="https://github.com/arendst/Tasmota/releases/tag/v8.2.0"><b style="color:red">

Müsste bei $ret .= sprintf("%7s",$old);; nicht ein $ret .= '| <a href=wasauchimmer';; drumherum sein?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 22 März 2020, 16:23:32
Zitat von: mähschaf am 22 März 2020, 13:42:04
Müsste bei $ret .= sprintf("%7s",$old);; nicht ein $ret .= '| <a href=wasauchimmer';; drumherum sein?
Ist doch (RAW):
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;;;\
        $ret .= '<b style="color:red;;">';;;;\
        $ret .= sprintf("%7s",$new);;;;\
        $ret .= '</b></a> | ';;;;\


Weil ich es gerade brauchte und cool fand, eine gaaaanz leicht angepasste Version:
defmod DEVICE HTTPMOD https://github.com/arendst/Tasmota/tags 86400
attr DEVICE userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex updatableDevicesMode:onlyUpdatable,all
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 0
attr DEVICE model tasmota_firmware_updates
attr DEVICE reading01Name latestVersion
attr DEVICE reading01Regex commit-title">[\w\W]*?<a href=".*">[\w\W]*?v(\d*.\d*.\d*)[\w\W]*?</a>
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})$/ ;;;; "$3.$2.$1"
attr DEVICE reading02Regex relative-time[\w\W]*?datetime="(\d*-\d*-\d*)T\d*:\d*:\d*Z"
attr DEVICE room WHICHROOM
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat {   my $ret ="";;;;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;;;\
    $ret .= '<div style="text-align:left;;">';;;;\
    $ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" target="_blank">tasmota</a>-check => '.$lastCheck;;;;\
    $ret .= '<br><br><pre>';;;;\
    $ret .= "| device                           | current |   new   |  released  |<br>";;;;\
    $ret .= "---------------------------------------------------------------------<br>";;;;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;;;\
    if($check eq "no updates needed!") {\
      $ret .= '| <b style="color:green;;">';;;;\
      $ret .= sprintf("%-65s",$check);;;;\
      $ret .= '</b> |';;;;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '| <b style="color:red;;">';;;;\
      $ret .= sprintf("%-65s",$check);;;;\
      $ret .= '</b> |';;;;\
    } else {\
      my @devices = split(',',$check);;;;\
      foreach my $devStr (@devices) {\
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;;;\
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;;;\
        $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;;;\
        $ret .= '</b></a> | ';;;;\
        $ret .= '<b style="color:lightgray;;">';;;;\
        $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO1_IPAddress","0.0.0.0")).'" target="_blank">';;;;\
        $ret .= sprintf("%7s",$old);;;;\
        $ret .= '</a></b> | ';;;;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;;;\
        $ret .= '<b style="color:red;;">';;;;\
        $ret .= sprintf("%7s",$new);;;;\
        $ret .= '</b></a> | ';;;;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;;;\
        $ret .= '<b style="color:black;;">';;;;\
        $ret .= sprintf("%-10s",$date);;;;\
        $ret .= '</b></a>';;;;\
        $ret .= " |<br>";;;;\
      }\
    }\
    $ret .= '</pre></div>';;;;\
  return $ret;;;;\
}
attr DEVICE timestamp-on-change-reading .*
attr DEVICE updatableDevicesMode onlyUpdatable
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;;;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;;;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;;;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;;;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=INFO1_Version!=")) {\
      my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0"));;;;\
      $version =~ m/([0-9.]*).*/;;;;\
      $version = $1;;;;\
      if ( AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION ) {\
        $ret .= "," if($ret ne "");;;;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;;;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;;;\
}
attr DEVICE webCmd reread
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: mähschaf am 22 März 2020, 17:03:28
Stimmt.

Meine Güte, bin ich blöde, ich habe vergessen ein Update zu  machen! Sorry für die Zeitverschwendung!  :-[

Ich meinte allerdings nicht das href um new, sondern das href um old.

Vermutlich braucht es etwas, bis das über das update bei mir ankommt. Im Moment kommt noch die alte Version, mit der Anpassung klappt es aber auch schon so... Danke!
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 22 März 2020, 18:13:39
Via Update  geht es immer erst ab kurz vor 8:00 Uhr, oder man holt es eben aus dem svn (es gibt eine Funktion dafür, siehe z.B. hier: https://forum.fhem.de/index.php/topic,109179.msg1033303.html#msg1033303).

@yersinia: Du hast jetzt noch mehr ";;" verteilt, auch in den "style"-Anweisungen. Für was sind die gut?
Und das mit "/up"? Findest du das nicht gut, oder ist einfach nur nicht klar, wie es gemeint war/ist?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 22 März 2020, 19:43:03
Zitat von: Beta-User am 22 März 2020, 18:13:39@yersinia: Du hast jetzt noch mehr ";;" verteilt, auch in den "style"-Anweisungen. Für was sind die gut?
Eine korrekte style Definition wird mit einem Semikolon abgeschlossen, auch inline (src (https://www.w3schools.com/css/css_howto.asp)). Doppelte Semikolon kommen aus der Raw_Definition

Zitat von: Beta-User am 22 März 2020, 18:13:39Und das mit "/up"? Findest du das nicht gut, oder ist einfach nur nicht klar, wie es gemeint war/ist?
Das was? :o Ach, du meinst dies:
Zitat von: Beta-User am 22 März 2020, 12:42:10Habe eben noch überlegt, ob es Sinn macht, gleich auf die update-Seite des Tamota zu verlinken, also noch ein "/up" hinter die ReadingsVal-Abfrage zu basteln...?
Das habe ich 1. überlesen ::) und 2. find' ichs gut. :D

Dann wäre
$ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO1_IPAddress","0.0.0.0")).'/up" target="_blank">';;;;\
richtiger.

Allerdings was mich noch zum grübeln bringt ist das device array:
TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=INFO1_Version!=
Dadurch fliegen -zumindest bei mir- Tasmota Devices raus, die gerade nicht via MQTT2 online sind. Da solche auch keine Version anzeigen, finde ich die Lösung ok. Allerdings verschwinden dann die Devices aus der Liste und tauchen nur auf wenn diese zufällig online sind bei dem HTTPMOD Device reread.
Schön wäre es, wenn man optional
TYPE=MQTT[2]?_[D]EVICE
hätte und diese Anzeigen könnte. Allerdings ist mir diese Idee nicht ausgereift genug, es gibt sicher auch andee MQTT2 Geräte als nur Tasmota, oder?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 23 März 2020, 11:15:17
Hmm, Danke für den Link, dann bastle ich die ";;" bei den Formatierungen bei Gelegenheit wieder rein...

Das mit der devspec ist "nur" eine Erweiterung der bisherigen, und bereits diese birgt die Gefahr, dass man "zu viel" erwischt, weil es in der Tat viele ganz andere MQTT2_DEVICES geben kann (z.B. zigbee2mqtt oder shelly, mehr Infos ggf. hier: https://fhem.de/stats/statistics.html). Ausweiten macht daher keinen Sinn, man könnte höchstens über die readingList filtern (das machen wir dann, wenn die ersten Klagen kommen, dass der jetzige Stand Mist ist, oder...? ;D ).
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 23 März 2020, 11:37:46
Zitat von: Beta-User am 23 März 2020, 11:15:17Das mit der devspec ist "nur" eine Erweiterung der bisherigen, und bereits diese birgt die Gefahr, dass man "zu viel" erwischt, weil es in der Tat viele ganz andere MQTT2_DEVICES geben kann (z.B. zigbee2mqtt oder shelly, mehr Infos ggf. hier: https://fhem.de/stats/statistics.html). Ausweiten macht daher keinen Sinn, man könnte höchstens über die readingList filtern (das machen wir dann, wenn die ersten Klagen kommen, dass der jetzige Stand Mist ist, oder...? ;D ).
Oder man macht es gleich etwas komplizierter und Steuerbar via userAttr includeMQTTDeviceMode (analog zu updatableDevicesMode):

attr DEVICE userattr includeMQTTDeviceMode:tasmota-only,all reading01Name reading01Regex reading02Name reading02OExpr reading02Regex updatableDevicesMode:onlyUpdatable,all
attr DEVICE includeMQTTDeviceMode tasmota-only
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;;;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;;;\
  } else {\
    my $devspec = "TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=INFO1_Version!=";;;;\
    if(AttrVal($name,"includeMQTTDeviceMode","tasmota-only") eq "all")\
    {\
        $devspec = "TYPE=MQTT[2]?_[D]EVICE";;;;\
    }\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;;;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;;;\
    foreach my $dev (devspec2array($devspec)) {\
      my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0"));;;;\
      $version =~ m/([0-9.]*).*/;;;;\
      $version = $1;;;;\
      if ( AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION ) {\
        $ret .= "," if($ret ne "");;;;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;;;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;;;\
}


Mit dem default
attr DEVICE includeMQTTDeviceMode tasmota-only
wird die devspec
TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=INFO1_Version!=
ausgewählt, mit
attr DEVICE includeMQTTDeviceMode all
sucht man etwas allgemeiner (natürlich dann mit dem Risiko nicht-Tasmota_MQTT Devices zu inkludieren):
TYPE=MQTT[2]?_[D]EVICE

Aber auch das wird Nachfragen geben weils Mist ist. ;)

Ich muss aber auch sagen, dass ich hier eine Gosund S1 v21 mit Tasmota 8.2.0 habe, die recht schweigsam bezgl IP und Version ist. Zumindest finde ich nichts im FHEM Device. Wohlmöglich liegt entweder am MQTT2 Server oder am Gerät selbst, vlt ist es Maulfaul. :(
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 23 März 2020, 12:00:16
...vermutlich ist das zu kompliziert gedacht, m.E. reicht es, wenn man die rausfiltert, die die "richtigen" Abonements haben: list readingList~.*tele[/].*INFO.*
(oder nur INFO1?)
Bringt hier bei mir jedenfalls nur die "Hauptkanäle" bei den mehrkanaligen (was ganz i.O. ist...).

Was das "Maulfaule" Gerät angeht: Entweder du hast nicht die "richtigen" Zweige abboniert, oder das Teil wird schlicht "zu selten" neu gestartet - manches wird nämlich nur beim reboot "offenbart"...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Otto123 am 23 März 2020, 12:09:06
ZitatIch muss aber auch sagen, dass ich hier eine Gosund S1 v21 mit Tasmota 8.2.0 habe, die recht schweigsam bezgl IP und Version ist. Zumindest finde ich nichts im FHEM Device. Wohlmöglich liegt entweder am MQTT2 Server oder am Gerät selbst, vlt ist es Maulfaul. :(
Einfach mal Neustart :)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 23 März 2020, 13:43:44
Zitat von: Beta-User am 23 März 2020, 12:00:16
...vermutlich ist das zu kompliziert gedacht, m.E. reicht es, wenn man die rausfiltert, die die "richtigen" Abonements haben: list readingList~.*tele[/].*INFO.*
Dat läuft unerwartet zufriedenstellend. Zumindest bei mir. :)

Zitat von: Beta-User am 23 März 2020, 12:00:16Was das "Maulfaule" Gerät angeht: Entweder du hast nicht die "richtigen" Zweige abboniert, oder das Teil wird schlicht "zu selten" neu gestartet - manches wird nämlich nur beim reboot "offenbart"...
Tasmota und MQTT2 sind noch Neuland für mich. Mir fehlt einen Ansatz das Ganze zu debuggen. Aber das wird hier OT. Wie oft muss man so ein Tasmota-Device neustarten? oO
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 23 März 2020, 13:50:29
Zitat von: yersinia am 23 März 2020, 13:43:44
Dat läuft unerwartet zufriedenstellend. Zumindest bei mir. :)
Dat war nicht unerwartet, dat war ausnahmsweise getestet und ist auch samt den ";;" bereits im svn... :P
Dat stammt aus meinem Vorschlag für einen dynamischen Tamota-Raum ("extraRooms"), siehe den "Tasmota-template-Strukur"-Thread im MQTT-Bereich ;) .

ZitatTasmota und MQTT2 sind noch Neuland für mich. Mir fehlt einen Ansatz das Ganze zu debuggen. Aber das wird hier OT. Wie oft muss man so ein Tasmota-Device neustarten? oO
Bitte dazu ggf. einen separaten Thread im MQTT-Bereich aufmachen. Für's debuggen einfach den MQTT-Verkehr mithören (rawEvents@MQTT2-SERVER, z.B.). Für Hilfe bitte ggf. ein RAW mit posten sowie ggf. die zugehörigen MQTT-Messages, falls was "verloren gegangen" sein sollte.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: joelinux am 23 März 2020, 15:55:56
Zitat von: yersinia am 23 März 2020, 11:37:46
Mit dem default
attr DEVICE includeMQTTDeviceMode tasmota-only
wird die devspec
TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=INFO1_Version!=

Mit dem vorgeschlagenen Geräte Filter zur Auffindung von Tasmota Geräten wird bei mir eine leere Liste zurückgegeben.

Erst nach Änderung des Filters in
TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=
erhalte ich eine Liste. Insgeamt muß ich 3 Änderungen in tasmotaupdates vornehmen.

In Userreadings

foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=Version!=")) {
      my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"Version","0.0.0"));;


und in stateformat

$ret .= '</b></a> | ';;
        $ret .= '<b style="color:lightgray">';;
$ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"IPAddress","0.0.0.0")).'" target="_blank">';;
$ret .= sprintf("%7s",$old);;

Ich kann mich erinnern, das Tasmota vor Version 7.x irgendwann die Readings mit INFO1_ Präfix angeliefert hatte.
Mit Version 7 (oder auch noch früher) wurde das JSON Format verändert und die INFO1 bis INFO3 Nachrichten landen ohne INFOx_ Präfix in den Readings.

Mit Version 8.2.0 sieht ein Neustart in der Tasmota Web Konsole so aus:


00:00:05 HTP: Web-Server aktiv bei tasmota-hlt333-6760 mit IP-Adresse 192.168.x.xxx
00:00:05 UPP: Multicast (wieder-)verbunden
15:39:22 MQT: Verbindungsversuch...
15:39:22 MQT: verbunden
15:39:22 MQT: tele/tasmota-hlt333/LWT = Online (beibehalten)
15:39:22 MQT: cmnd/tasmota-hlt333/POWER =
15:39:22 MQT: tele/tasmota-hlt333/INFO1 = {"Module":"Hyleton-333","Version":"8.2.0(tasmota)","FallbackTopic":"cmnd/DVES_8D5A68_fb/","GroupTopic":"cmnd/tasmotas/"}
15:39:22 MQT: tele/tasmota-hlt333/INFO2 = {"WebServerMode":"Admin","Hostname":"tasmota-hlt333-6760","IPAddress":"192.168.x.xxx"}
15:39:22 MQT: tele/tasmota-hlt333/INFO3 = {"RestartReason":"Software/System restart"}
15:39:22 MQT: stat/tasmota-hlt333/RESULT = {"POWER1":"on"}
15:39:22 MQT: stat/tasmota-hlt333/POWER1 = on
15:39:22 MQT: stat/tasmota-hlt333/RESULT = {"POWER2":"off"}
15:39:22 MQT: stat/tasmota-hlt333/POWER2 = off
15:39:22 MQT: stat/tasmota-hlt333/RESULT = {"POWER3":"on"}
15:39:22 MQT: stat/tasmota-hlt333/POWER3 = on
15:39:22 MQT: stat/tasmota-hlt333/RESULT = {"POWER4":"off"}
15:39:22 MQT: stat/tasmota-hlt333/POWER4 = off
15:39:23 UPP: Multicast (wieder-)verbunden



Im FHEM Gerät eines Tasmota Gerätes sieht es dann so aus.


define MQTT2_HLT333 MQTT2_DEVICE DVES_8D5A68
attr MQTT2_HLT333 DbLogExclude .*
attr MQTT2_HLT333 IODev MQTT2_FHEM_Server
attr MQTT2_HLT333 alexaName Aroma_Lampe
attr MQTT2_HLT333 comment Admin Info and Channel 1 for MQTT2_HLT333, see also MQTT2_HLT333_CH2, MQTT2_HLT333_CH3, and MQTT2_HLT333_USB
attr MQTT2_HLT333 devStateIcon Online:10px-kreis-gruen Offline:10px-kreis-rot
attr MQTT2_HLT333 event-on-change-reading .*
attr MQTT2_HLT333 genericDeviceType switch
attr MQTT2_HLT333 icon hue_filled_outlet
attr MQTT2_HLT333 jsonMap POWER1:state Dimmer:pct
attr MQTT2_HLT333 model tasmota_3socketUSB_channel_split
attr MQTT2_HLT333 readingList tele/tasmota-hlt333/LWT:.* LWT\
  tele/tasmota-hlt333/INFO.:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  tele/tasmota-hlt333/STATE:.* { json2nameValue($EVENT,'state_',$JSONMAP) }\
  stat/tasmota-hlt333/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  stat/tasmota-hlt333/STATUS:.* { json2nameValue($EVENT,'',$JSONMAP) }\
  stat/tasmota-hlt333/POWER1:.* state\
  stat/tasmota-hlt333/POWER2:.* POWER2\
  stat/tasmota-hlt333/POWER3:.* POWER3\
  stat/tasmota-hlt333/POWER4:.* POWER4\
  cmnd/tasmota-hlt333/POWER:.* POWER\
DVES_8D5A68:stat/tasmota-hlt333/UPGRADE:.* { json2nameValue($EVENT) }
attr MQTT2_HLT333 room Arbeitszimmer
attr MQTT2_HLT333 setList off:noArg cmnd/tasmota-hlt333/POWER1 0\
  on:noArg cmnd/tasmota-hlt333/POWER1 1\
  toggle:noArg cmnd/tasmota-hlt333/POWER1 2\
  x_Reboot:noArg cmnd/tasmota-hlt333/restart 1\
  x_Status:noArg cmnd/tasmota-hlt333/Status\
  x_setOtaUrl:multiple,http://thehackbox.org/tasmota/release/tasmota-DE.bin cmnd/tasmota-hlt333/OtaUrl $EVTPART1\
  x_upgrade:noArg   cmnd/tasmota-hlt333/upgrade 1\
  x_ShowHostname:noArg cmnd/tasmota-hlt333/Backlog setoption53 1;; Status;;\
  x_DisableBlinkLED:noArg cmnd/tasmota-hlt333/Backlog LEDPower 0;; setoption31 1;; Status;;\
  x_SaveData:0,1 cmnd/tasmota-hlt333/savedata $EVTPART1\
  x_Configuration cmnd/tasmota-hlt333/$EVTPART1 $EVTPART2\
  x_RuleButton:noArg cmnd/tasmota-hlt333/rule on button1#state=3 do backlog power1 2;; power2 2;; power3 2;; power4 2 endon on button1#state=2 do backlog power1 1;; power2 1;; power3;; power4 1 endon\
  x_RuleEnable:noArg cmnd/tasmota-hlt333/Backlog setoption1 1;; setoption32 15;; rule1 1\
  x_Location:noArg cmnd/tasmota-hlt333/Backlog Latitude 51.53800;; Longitude 7.256381;; Altitude 0\
x_NTPServer:multiple,fritz.box cmnd/tasmota-hlt333/ntpserver $EVTPART1
attr MQTT2_HLT333 stateFormat LWT\
state\
<a href="http://IPAddress" target="_blank">IPAddress</a>
attr MQTT2_HLT333 userReadings formatedUptime:state_UptimeSec.* { my $m = ReadingsVal($name,"state_UptimeSec",0)/60;;;; return sprintf "0 000 00:%02d", $m if $m < 60;;;; my $h = $m / 60;;;; $m %= 60;;;; return sprintf "0 000 %02d:%02d", $h, $m if $h < 24;;;; my $d = $h / 24;;;; $h %= 24;;;; return sprintf "0 %03d %02d:%02d", $d, $h, $m if $d <365;;;; my $y = $d / 365;;;; $d %= 365;;;; return sprintf "%d %03d %02d:%02d", $y, $d, $h, $m }

setstate MQTT2_HLT333 Online\
on\
<a href="http://192.168.1.206" target="_blank">192.168.x.xxx</a>
setstate MQTT2_HLT333 2020-03-21 19:40:46 FallbackTopic cmnd/DVES_8D5A68_fb/
setstate MQTT2_HLT333 2020-03-21 19:40:46 GroupTopic cmnd/tasmotas/
setstate MQTT2_HLT333 2020-03-21 19:40:46 Hostname tasmota-hlt333-6760
setstate MQTT2_HLT333 2020-03-21 19:40:46 IPAddress 192.168.x.xxx
setstate MQTT2_HLT333 2020-03-22 21:20:02 LWT Online
setstate MQTT2_HLT333 2020-03-21 19:40:46 Module Hyleton-333
setstate MQTT2_HLT333 2020-03-21 19:39:50 OtaUrl http://thehackbox.org/tasmota/release/tasmota-DE.bin
setstate MQTT2_HLT333 2020-03-22 21:20:02 POWER
setstate MQTT2_HLT333 2020-03-21 19:40:46 POWER2 off
setstate MQTT2_HLT333 2020-03-21 19:40:47 POWER3 on
setstate MQTT2_HLT333 2020-03-21 19:40:47 POWER4 off
setstate MQTT2_HLT333 2020-03-21 17:28:05 Restart Restarting
setstate MQTT2_HLT333 2020-03-21 19:40:46 RestartReason Software/System restart
setstate MQTT2_HLT333 2020-03-21 17:28:06 SaveData on
setstate MQTT2_HLT333 2020-03-21 17:28:06 SetOption26 on
setstate MQTT2_HLT333 2020-03-21 17:28:05 StateText1 off
setstate MQTT2_HLT333 2020-03-21 17:28:05 StateText2 on
setstate MQTT2_HLT333 2020-03-21 17:28:05 StateText3 toggle
setstate MQTT2_HLT333 2020-03-21 17:28:05 StateText4 hold
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_ButtonRetain 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_ButtonTopic 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_FriendlyName_1 Alexa-Arbeit-schwarz
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_FriendlyName_2 Arbeit-7
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_FriendlyName_3 Arbeit-8
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_FriendlyName_4 Arbeit-9
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_LedMask FFFF
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_LedState 1
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_Module 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_Power 5
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_PowerOnState 3
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_PowerRetain 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SaveData 1
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SaveState 1
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SensorRetain 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchMode_1 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchMode_2 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchMode_3 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchMode_4 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchMode_5 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchMode_6 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchMode_7 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchRetain 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_SwitchTopic 0
setstate MQTT2_HLT333 2020-03-21 17:28:05 Status_Topic tasmota-hlt333
setstate MQTT2_HLT333 2020-03-21 19:40:30 Upgrade Successful. Restarting
setstate MQTT2_HLT333 2020-03-21 19:40:46 Version 8.2.0(tasmota)
setstate MQTT2_HLT333 2020-03-21 19:40:46 WebServerMode Admin
setstate MQTT2_HLT333 2020-03-21 17:28:03 associatedWith MQTT2_HLT333_CH2,MQTT2_HLT333_CH3,MQTT2_HLT333_USB
setstate MQTT2_HLT333 2020-03-23 15:22:28 formatedUptime 0 001 19:41
setstate MQTT2_HLT333 2020-03-21 19:40:46 state on
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Heap 25
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_LoadAvg 19
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_MqttCount 6
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_POWER2 off
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_POWER3 on
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_POWER4 off
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Sleep 50
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_SleepMode Dynamic
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Time 2020-03-23T15:22:27
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Uptime 1T19:41:50
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_UptimeSec 157310
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_AP 1
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_BSSId F0:B0:14:5C:7B:10
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_Channel 6
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_Downtime 0T00:00:13
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_LinkCount 2
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_/RSSI 70
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_SSId Snoopy
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_Wifi_Signal -65
setstate MQTT2_HLT333 2020-03-23 15:22:28 state_state on
setstate MQTT2_HLT333 2020-03-22 21:20:13 subscriptions cmnd/DVES_8D5A68_fb/# cmnd/tasmota-hlt333/# cmnd/tasmotas/#


Mit freundlichem Gruß

joelinux
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 23 März 2020, 17:36:59
...es wäre nett, wenn ihr bei Kommentaren die jeweils letzte Fassung in der attrTemplate-file in Bezug nehmen könntet, dann muß ich nicht raten, worin jetzt genau die Anregung liegen soll...

Der Vorschlag für den Filter von yersinia war ja schon wieder überholt, und den "Vorteil" von Konstruktionen wie
my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"Version","0.0.0"));;
gegenüber meiner "Verschlimmbesserung"
my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0"));;muß mir erst nochmal jemand näher erklären  :P ...

(Die Ausgangsfassung war: "my $version = ReadingsVal($dev,"INFO1_Version","0.0.0");;;;"... DIE lieferte auch bei mir kein Ergebnis 8) .)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: joelinux am 25 März 2020, 07:45:14
Zitat von: Beta-User am 23 März 2020, 17:36:59
gegenüber meiner "Verschlimmbesserung"
my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0"));;muß mir erst nochmal jemand näher erklären  :P ...

(Die Ausgangsfassung war: "my $version = ReadingsVal($dev,"INFO1_Version","0.0.0");;;;"... DIE lieferte auch bei mir kein Ergebnis 8) .)

Es hat etwas gedauert, aber jetzt dämmert es. Die Verschachtelung von ReadingsVal innerhalb einer ReadingsVal ist die elegante Lösung.
Damit sind sowohl neue Tasmota Versionen als auch ältere Tasmota Versionen erfasst.  8)

[Annahme]
Die Verschachtelung geht davon aus das entweder das Reading "Version" oder das Reading "INFO1_Version" existiert.
Es wird für beide Fälle ein verwertbares Resultat zurück geliefert.
Sollte in ungewöhnlichen Fällen sowohl Version als auch INFO1_Version existieren wird im Resultat INFO1_Version bevorzugt.

Für Kanal 'split' Geräte werden nur die Stamm Geräte in die Liste aufgenommen wenn die vorhandenen mqtt Templates weiterhin die meisten Readings in den Unter Kanälen unterdrückt. Extrem cool  8) 8)
[/Annahme]

Mit freundlichem Gruß

joelinux
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 25 März 2020, 11:29:38
 :) Fast...

Die "Annahmen" sind teils nicht ganz zutreffend, kurz zur Klarstellung, weil wir das ggf. an anderer Stelle wieder brauchen:
- In den Funktionen wie ReadingsVal() steht als drittes Argument immer der "fallback" => "Version" hätte Prio ;) . Steht auch so in der Doku (commandref).
- Bei "INFO._.*" geht es auch nicht um "neu" oder "alt", sondern um "autocreate" "complex" vs. "simple". Kurz war "complex" der default am MQTT2_SERVER gewesen, und man kann das heute noch generieren, wenn man complex aktiviert... (die IP-Adresse kommt über INFO2, da war also noch ein kleiner bug drin, der beim nächsten update raus sein sollte).
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 22 April 2020, 13:15:28
Hallo Beta-User,

ich hab nen kleinen fix (https://forum.fhem.de/index.php/topic,78501.msg1043080.html#msg1043080) für den homematic fw check eingebaut und auf responsive Design umgestellt, sieht aus wie hier (https://forum.fhem.de/index.php/topic,110271.msg1043077.html#msg1043077). Kannst du nochmal cross checken und -wenn du möchtest- einchecken?
#Contributed by Pfriemler & yersinia, see https://forum.fhem.de/index.php/topic,78501.msg1043080.html#msg1043080
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)<br />Define a HTTPMOD device like <br>define hm_fw_check HTTPMOD https://update.homematic.com/firmware/api/firmware/search/DEVICE 86400<br /><a href="https://forum.fhem.de/index.php/topic,78501.msg1043080.html#msg1043080">Source: Forum</a>
order:X_01a
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 2
attr DEVICE reading01Name hmfw-type
attr DEVICE reading01RegOpt g
attr DEVICE reading01Regex (?i)"type":"((?:\w+[-]*){1,})
attr DEVICE reading02AutoNumLen 2
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 room WHICHROOM
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE showNewFWOnly yes
attr DEVICE stateFormat {   my $ret ="";;\
    my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","2000-01-01 00:00:00"))));;\
my $nextCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(InternalVal($name,"TRIGGERTIME_FMT","2000-01-01 00:00:00"))));;\
my $cellstyle = "padding:3pt;;border-bottom:1px dotted lightgray;;";;\
    $ret .= '<div style="text-align:left;;">';;;;\
    $ret .= 'last <a title="eq3-downloads" href="http://www.eq-3.de/service/downloads.html">homematic</a>-fw-check => '.$lastCheck;;\
    $ret .= '<br />';;\
    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 .= '<br /><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:30%;;font-weight:bold;;">model</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:10%;;font-weight:bold;;">current</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:10%;;font-weight:bold;;">new</div>';;\
$ret .= '</div>';; #header\
      my @devices = split(',',$check);;\
      foreach my $devStr (@devices) {\
        #my ($dev,$md,$idx,$ofw,$nfw) = $devStr =~ m/([^\s]+)\s[(]([^\s]+)\s[(](\d+)[)]\sofw_([\d\.]+)\s=>\snfw_([\d\.]+)/;;\
my ($dev,$idx) = $devStr =~ m/([^\s]+)\s[(](\d+)[)]/;;\
my $md = ReadingsVal($name,("hmfw-type-".$idx),"?");;\
my $ofw = AttrVal($dev,"firmware","?");;\
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)/g;;\
\
foreach my $dev (devspec2array("TYPE=CUL_HM:FILTER=DEF=......:FILTER=subType!=(virtual|)")) {\
      my $md = AttrVal($dev,"model","?");;\
      my $v = 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 model homematic_fw_check_v2


Weil ich gerade dabei bin, anbei noch eine Optimierung für das heizoel Device:
#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 /><a href="https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754">Source: Forum</a>
order:order: 100005
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)}
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 replacement04Mode:reading,internal,text,expression,key replacement04Regex replacement04Value replacement05Mode:reading,internal,text,expression,key replacement05Regex replacement05Value
attr DEVICE enableControlSet 1
attr DEVICE group Spritpeise
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 12345
attr DEVICE replacement02Mode text
attr DEVICE replacement02Regex %%MENGE%%
attr DEVICE replacement02Value 3000
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=short_vehicle
attr DEVICE room WHICHROOM
attr DEVICE stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $ret = "<div>".ReadingsTimestamp($name,"Heizoelpreis","-");;\
$ret .= "&nbsp;;<b><a href=\"".InternalVal($name,"displayurl","https://www.esyoil.com")."\" rel=\"noopener noreferrer\" target=\"_blank\">";;\
$ret .= ReadingsVal($name,"Heizoelpreis","-");;\
$ret .= "&euro;;</a></b>/100l";;\
$ret .= "&nbsp;;(".AttrVal($name,"replacement02Value","0")."l = ";;\
$ret .= sprintf("%.2f",$price);;\
$ret .= "&euro;;)</div>";;\
return $ret;;\
}
attr DEVICE webCmd reread
attr DEVICE model fuel_oil_check


Ach, wegen des lockdowns und weil es so schön ist, hier noch eines um die a-culfw (https://github.com/heliflieger/a-culfw) firmware version zu prüfen - wenn es dafür überhaupt Bedarf gibt (mir fehlt eine Order hier, kannst du die ergänzen?):
#Contributed by yersinia, see https://forum.fhem.de/index.php/topic,97694.msg1045829.html#msg1045829
name:aculfw_fw_check
filter:TYPE=HTTPMOD
desc: checks a-culfw firmware updates<br />Define a HTTPMOD device like<br />define aculfw_fw_check HTTPMOD https://github.com/heliflieger/a-culfw/blob/master/CHANGELOG 86400<br /><a href="https://forum.fhem.de/index.php/topic,97694.msg1045829.html#msg1045829">Source: Forum</a>
order:order: XXXXX
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:INTERVAL;Actual interval for updating, defaults to daily (86400s); {InternalVal("DEVICE","Interval",86400)}
defmod DEVICE HTTPMOD https://github.com/heliflieger/a-culfw/blob/master/CHANGELOG INTERVAL
attr DEVICE userattr reading01Name reading01Regex updatableDevicesMode:onlyUpdatable,all
attr DEVICE do_not_notify 1
attr DEVICE enableControlSet 1
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 1
attr DEVICE icon cul_usb
attr DEVICE reading01Name latestVersion
attr DEVICE reading01Regex \#\#\# ([\d]\.[\d]{2}\.[\d]{2})
attr DEVICE room WHICHROOM
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat { my $ret ="";;\
my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","2000-01-01 00:00:00"))));;\
my $nextCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(InternalVal($name,"TRIGGERTIME_FMT","2000-01-01 00:00:00"))));;\
my $cellstyle = "padding:3pt;;border-bottom:1px dotted lightgray;;";;\
$ret .= '<div style="text-align:left;;">';;\
$ret .= 'last <a href="https://github.com/heliflieger/a-culfw" title="aculfw" rel="noopener noreferrer" target="_blank">a-culfw</a> version check => '.$lastCheck;;\
$ret .= '<br />';;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
    if($check eq "no updates needed!") {\
      $ret .= '<div style="color:limegreen;;font-weight:bold;;">';;\
      $ret .= $check;;\
      $ret .= '</div>';;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '<div style="color:limegreen;;font-weight:bold;;">';;\
      $ret .= $check;;\
      $ret .= '</div>';;\
    } else {\
      my @devices = split(',',$check);;\
  $ret .= '<br /><div style="display:table;;width:80%;;">';;\
$ret .= '<div style="display:table-row;;">';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:60%;;font-weight:bold;;">device</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">current</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">new</div>';;\
$ret .= '</div>';; #header\
      foreach my $devStr (@devices) {\
        my ($dev,$old,$new) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\)]+)\)$/;;\
$ret .= '<div style="display:table-row;;">';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:60%;;">';;\
$ret .= '<a href="/fhem?detail='.$dev.'" title="'.$dev.' ('.$old.')">';;\
$ret .= AttrVal($dev,"alias",$dev);;\
$ret .= '</a></div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">';;\
$ret .= '<a href="https://github.com/heliflieger/a-culfw/releases/tag/'.$old.'" title="a-culfw '.$old.'" rel="noopener noreferrer" target="_blank" style="color:lightgray;;">';;\
$ret .= $old;;\
        $ret .= '</a></div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">';;\
        $ret .= '<a href="https://github.com/heliflieger/a-culfw/releases/tag/'.$new.'" title="a-culfw '.$new.'" rel="noopener noreferrer" target="_blank" style="color:red;;">';;\
        $ret .= $new;;\
        $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 updatableDevicesMode onlyUpdatable
attr DEVICE userReadings updatableDevices {\
  my $ret = "";;\
  my $updateall = AttrVal($name,"updatableDevicesMode","");;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    foreach my $dev (devspec2array("TYPE=CUL")) {\
      my $version = InternalVal($dev,"VERSION","unknown");;\
      $version =~ m/([\d]\.[\d]{2}\.[\d]{2})/;;\
      $version = $1;;\
      if(($updateall eq "all") || ($version ne $VERSION)) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE model aculfw_fw_check

Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 22 April 2020, 17:56:43
Ohne crosscheck eingecheckt... wird schon passen :P .
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 23 April 2020, 09:01:22
Zitat von: Beta-User am 22 April 2020, 17:56:43
Ohne crosscheck eingecheckt... wird schon passen :P .
Sicher? https://svn.fhem.de/trac/changeset/21748/trunk (https://svn.fhem.de/trac/changeset/21748/trunk) inkludiert kein httpmod.template...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 23 April 2020, 10:18:35
Ups, da waren die Änderungen in der falschen Datei ::) . Danke für den Hinweis, jetzt sind die neuen Versionen wirklich im svn.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 23 April 2020, 10:36:34
Zitat von: Beta-User am 22 April 2020, 17:56:43wird schon passen :P .
Jo, und das
attr DEVICE DbLogExclude .*
attr DEVICE alignTime 14:04

in allen Templates habe ich mehrfach übersehen - und erst gefunden als es im svn war. *facepalm*
Ich hab das oben korrigiert, sollte mMn nicht allzu große Auswirkungen haben bei den Usern. *pray*
Könntest du, wenne Zeit hast, das noch rausnehmen? *hundeblick* gerne auch per C&P
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 23 April 2020, 10:42:07
 ;D Done!
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Schlimbo am 06 Mai 2020, 23:19:53
Zitat von: SirUli am 04 Mai 2019, 13:38:54
Merci und ich lege gleich nochmal nach. Basierend auf Artikeln in meinem Blog, hier noch für die HP Printer ne Erweiterung (https://wolf-u.li/5961/tintenstand-der-druckerpatronen-des-hp-8620-in-fhem-ueberwachen/) und der Brother Scanner (https://wolf-u.li/6005/darstellung-der-statistiken-des-brother-ads-1700w-in-fhem/) mit dazu als Template. Ich habe den letzteren mal unter B_02a rein sortiert, das kannst du natürlich machen wie deine Idee dazu ist ;) Dazu habe ich noch die aktuelle Notfallapotheke (https://forum.fhem.de/index.php/topic,87234.0.html) und für Pihole (https://wolf-u.li/5987/einbindung-der-pihole-statistiken-in-fhem/) die statistiken ;)

Hallo zusammen,
im Template "hp_printer_cartridge_status" gibt es ein paar Zahlendreher:
die Werte für Magenta (reading02XPath-Strict) und Cyan (reading01XPath-Strict) sind vertauscht und der Wert für Schwarz (reading04XPath-Strict) funktioniert nicht.

Würde mich freuen wenn dies im Template angepasst werden könnte:
--- httpmod-orig.template 2020-05-06 23:02:08.000000000 +0200
+++ httpmod.template 2020-05-06 22:42:20.000000000 +0200
@@ -310,13 +310,13 @@
attr DEVICE userattr reading01Name reading01XPath-Strict reading02Name reading02XPath-Strict reading03Name reading03XPath-Strict reading04Name reading04XPath-Strict reading05Name reading05XPath-Strict reading06Name reading06XPath-Strict$
attr DEVICE httpVersion 1.1
attr DEVICE reading01Name Cyan
-attr DEVICE reading01XPath-Strict //ccdyn:ConsumableInfo[2]/dd:ConsumablePercentageLevelRemaining/text()
+attr DEVICE reading01XPath-Strict //ccdyn:ConsumableInfo[3]/dd:ConsumablePercentageLevelRemaining/text()
attr DEVICE reading02Name Magenta
-attr DEVICE reading02XPath-Strict //ccdyn:ConsumableInfo[3]/dd:ConsumablePercentageLevelRemaining/text()
+attr DEVICE reading02XPath-Strict //ccdyn:ConsumableInfo[2]/dd:ConsumablePercentageLevelRemaining/text()
attr DEVICE reading03Name Yellow
attr DEVICE reading03XPath-Strict //ccdyn:ConsumableInfo[4]/dd:ConsumablePercentageLevelRemaining/text()
attr DEVICE reading04Name Black
-attr DEVICE reading04XPath-Strict //ccdyn:ConsumableInfo[1]/dd:ConsumablePercentageLevelRemaining/text()
+attr DEVICE reading04XPath-Strict //ccdyn:ConsumableInfo[5]/dd:ConsumablePercentageLevelRemaining/text()
attr DEVICE reading05Name CyanCatridgeModel
attr DEVICE reading05XPath-Strict //ccdyn:ConsumableInfo[3]/dd:ConsumableSelectibilityNumber/text()
attr DEVICE reading06Name MagentaCatridgeModel


Gruß Schlimbo
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 07 Mai 2020, 07:22:08
Danke für die Info, neue Fassung kommt nachher per update :) .
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Lazgar am 23 Juli 2020, 11:24:10
Hallo!

Hab da mal eine Frage zu dem ORF_weather Template...
Ist es leicht möglich, bei den Werten den "," durch einen "." zu ersetzen?
Wäre toll für die weitere verarbeitung in fhem.

Bin leider nicht so der RegEx-Profi und bring es selber nicht zustande :(

Danke schon mal im Voraus,

Lazgar
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 23 Juli 2020, 13:26:39
Hmm, das sollte mit einer "Nachbearbeitungs-Regex" jeweils gehen, tippe mal auf readingOExpr
Ungetestet könnte das hier passen:
$val =~ s/([\d]+),([\d]+)/$1.$2/ if $val =~ m{\A[\d]+,[\d]+\z};;$val

(Leider geht dieses attrTemplate aus unerfindlichen Gründen auf meinem Testsystem immer noch nicht, sonst könnte ich das austesten... Klappt das denn bei dir?)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 08 September 2020, 01:13:30
Zitat von: Beta-User am 23 Juli 2020, 13:26:39
Hmm, das sollte mit einer "Nachbearbeitungs-Regex" jeweils gehen, tippe mal auf readingOExpr
Ungetestet könnte das hier passen:
$val =~ s/([\d]+),([\d]+)/$1.$2/ if $val =~ m{\A[\d]+,[\d]+\z};;$val

(Leider geht dieses attrTemplate aus unerfindlichen Gründen auf meinem Testsystem immer noch nicht, sonst könnte ich das austesten... Klappt das denn bei dir?)
Das funktioniert bei mir. Die Regex habe ich ein bischen angepasst, damit auch verbleibende Leerzeichen entfernt werden.

Und da ich jetzt in Abstimmung mit Beta-User die Maintenance für httpmod.template übernommen habe, habe ich es gerade auch eingecheckt.

Ich nutze die Gelegenheit, um eine Frage zu stellen: was meint ihr, wenn ich die Liste mit Kategorien ergänze - also ein Präfix bei jedem Name - damit die Liste übersichtlicher wird? Siehe Bild als Beispiel.

EDIT: oder mit Trennzeilen, wie im 2. Bild. Finde ich sogar besser.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 08 September 2020, 09:30:42
Vorab mal ein herzliches Danke, dass du das mit httpmod.template übernimmst!

Es freut mich sehr, dass das "Baby" jetzt einen Maintainer bekommt, der das Modul HTTPMOD richtig gut kennt und auch schon vielen User bei ihren Fragen dazu weiterhelfen konnte :) .




Das mit dem Trennstrich finde ich eine gute Idee! Die eckigen Klammern sehen zwar auch ok aus, allerdings bin ich immer etwas zurückhaltend, was "spezielle" Zeichen angeht (kann aber nicht sagen, ob das hier unbeabsichtigte Nebenwirkungen hätte). (Muß mal schauen, ob das mit den Trennlinien auch eine Verbesserung für mqtt2.template wäre ::) .)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 16 September 2020, 14:34:50
Zitat von: amenomade am 08 September 2020, 01:13:30Ich nutze die Gelegenheit, um eine Frage zu stellen: was meint ihr, wenn ich die Liste mit Kategorien ergänze - also ein Präfix bei jedem Name - damit die Liste übersichtlicher wird? Siehe Bild als Beispiel.

EDIT: oder mit Trennzeilen, wie im 2. Bild. Finde ich sogar besser.
Coole Idee! Ich finde beide Vorschläge in Kombination super - ein Trennstrich um die Kategorien zu trennen plus Prefix-Kategorisierung der einzelnen Templates.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 23 Oktober 2020, 13:54:21
Wegen ->https://forum.fhem.de/index.php/topic,87234.msg1094780.html#msg1094780 und der gezeigten Lösung von Christoph Morrison (https://forum.fhem.de/index.php?action=profile;u=17701) ein Update für das pharmacy_emergency_service_germany Template:
263 attr DEVICE reading07OExpr POSIX::strftime "%a %e.%m.%Y %H:%M", localtime($val)
266 attr DEVICE reading08OExpr POSIX::strftime "%a %e.%m.%Y %H:%M", localtime($val)



EDIT: ein weiterer Vorschlag:
263 attr DEVICE reading07OExpr POSIX::strftime "%a, %e.%m.%Y %H:%MUhr", localtime($val)
266 attr DEVICE reading08OExpr POSIX::strftime "%a, %e.%m.%Y %H:%MUhr", localtime($val)

erzeugt Readings wie Fr, 23.10.2020 09:00Uhr.

Ich finde noch einen reread hilfreich:
attr DEVICE webCmd reread

Weiterhin, ob man es schön findet oder nicht, kann man noch folgenden stateFormat nutzen - stellt die Informationen in einer kleinen Tabelle da und macht die Telefonnummer klickbar:
attr DEVICE stateFormat { my $ret .= "<div style=\"display:table;;width:100%;;\">";; #table\
$ret .= "<div style=\"display:table-row;;width:100%;;\">";; #row\
$ret .= "<div style=\"display:table-cell;;padding:3pt;;width:50%;;text-align:left;;\">";; #cell\
$ret .= "<a href=\"";;\
$ret .= "https:\/\/www.openstreetmap.org\/?";;\
$ret .= "mlat=".ReadingsVal($name,"Breitengrad",0);;\
$ret .= "&mlon=".ReadingsVal($name,"Laengengrad",0);;\
$ret .= "#map=18";;\
$ret .= "\/".ReadingsVal($name,"Breitengrad",0);;\
$ret .= "\/".ReadingsVal($name,"Laengengrad",0);;\
$ret .= "\" rel=\"noopener noreferrer\" target=\"_blank\" style=\"font-weight:bold;\">".ReadingsVal($name,"Name","?")."</a><br \/>";;\
$ret .= ReadingsVal($name,"Strasse","")."<br /\>";;\
$ret .= ReadingsVal($name,"Plz","")."&nbsp;;".ReadingsVal($name,"Ort","");;\
$ret .= "</div>";; #/cell\
$ret .= "<div style=\"display:table-cell;;width:50%;;text-align:left;;\">";; #cell\
my $numberlink = ReadingsVal($name,"Telefon","");;\
$numberlink =~ s/\s+//g;;\
$ret .= "Tel.: <a href=\"tel:+49".substr($numberlink, 1)."\">".ReadingsVal($name,"Telefon","")."</a><br /\>";;\
$ret .= "Fax.: ".ReadingsVal($name,"Telefax","");;\
$ret .= "</div>";; #/cell\
$ret .= "</div>";; #/row\
$ret .= "<div style=\"display:table-row;;width:100%;;\">";; #row\
$ret .= "<div style=\"display:table-cell;;padding:3pt;;width:50%;;text-align:left;;\">";; #cell\
$ret .= "Long: ".sprintf("%.5f", ReadingsNum($name,"Laengengrad",0))."<br /\>";;\
$ret .= "Lat: ".sprintf("%.5f", ReadingsNum($name,"Breitengrad",0));;\
$ret .= "</div>";; #/cell\
$ret .= "<div style=\"display:table-cell;;width:50%;;text-align:left;;\">";; #cell\
$ret .= "Von ".ReadingsVal($name,"Beginn","")."<br /\>";;\
$ret .= "Bis ".ReadingsVal($name,"Ende","");;\
$ret .= "</div>";; #/cell\
$ret .= "</div>";; #/row\
$ret .= "</div>";; #/table\
return $ret;;\
}
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 23 Oktober 2020, 14:46:18
anbei ein neuer Versuch für das template vom bergfex Wetter.
oder habe ich etwas nicht mitbekommen, und es gibt schon eine bessere Version?

SG Joe

defmod bergfexInnsbruck HTTPMOD https://www.bergfex.at/sommer/innsbruck/wetter/ 1440
attr bergfexInnsbruck userattr get01-02OExpr get01Expr get01Name get01OExpr get01Poll:0,1 get01RegOpt get01Regex get01URL get02Expr get02Name get02Poll:0,1 get02RegOpt get02Regex get03Expr readingOExpr
attr bergfexInnsbruck devStateIcon {"<img src='https:".ReadingsVal($name,"fc1_icon","")."' alt='".ReadingsVal($name,"condition","")."' />"}
attr bergfexInnsbruck enableControlSet 1
attr bergfexInnsbruck event-on-change-reading .+
attr bergfexInnsbruck get01Expr $val =~ /.*title="(.*)"|.*?>\n?([\d,-]+)|([\d:.,-]*)/;; $val="$1$2$3";;
attr bergfexInnsbruck get01Name Wetter
attr bergfexInnsbruck get01Poll 1
attr bergfexInnsbruck get01RegOpt smx
attr bergfexInnsbruck get01Regex ,\s(?<uhrzeit>\d\d:\d\d)[^\n]+\
\n(?<textS0>[^\n]+).*?\
Niederschlag:\s+(?<niederschlag>\d+.).*?\
\
(?:9-Tage\sWettervorhersage).*?\
\
(?'textD0'(?<="icon"......).{1,100}png..title..(?:.+?)").*?\
(?'tmax0'(?<="tmax">)(?:[\d,]+)°).*?\
(?'rainW0'(?<=\n)(?:[\d,]+)%).*?\
(?'rain0'(?<=rrr)\d+.+?\n(?:[\d,-]+)l?).*?\
(?'sunhour0'(?<=sonne)\d+">[^<]+(?:<))\
\
#.*?(?<tag1>(?&tag0))\
(?:.*?(?<textD1>(?&textD0)))?\
.*?(?<tmax1>(?&tmax0))\
.*?(?<rain1>(?&rain0))\
.*?(?<sunhour1>(?&sunhour0))\
\
#.*?(?<tag2>(?&tag0))\
.*?(?<textD2>(?&textD0))\
.*?(?<tmax2>(?&tmax0))\
.*?(?<rain2>(?&rain0))\
.*?(?<sunhour2>(?&sunhour0))\
\
#.*?(?<tag3>(?&tag0))\
.*?(?<textD3>(?&textD0))\
.*?(?<tmax3>(?&tmax0))\
.*?(?<rain3>(?&rain0))\
.*?(?<sunhour3>(?&sunhour0))\
\
#.*?(?<tag4>(?&tag0))\
.*?(?<textD4>(?&textD0))\
.*?(?<tmax4>(?&tmax0))\
.*?(?<rain4>(?&rain0))\
.*?(?<sunhour4>(?&sunhour0))\
\
#.*?(?<tag5>(?&tag0))\
.*?(?<textD5>(?&textD0))\
.*?(?<tmax5>(?&tmax0))\
.*?(?<rain5>(?&rain0))\
.*?(?<sunhour5>(?&sunhour0))\
\
#.*?(?<tag6>(?&tag0))\
.*?(?<textD6>(?&textD0))\
.*?(?<tmax6>(?&tmax0))\
.*?(?<rain6>(?&rain0))\
.*?(?<sunhour6>(?&sunhour0))\
\
#.*?(?<tag7>(?&tag0))\
.*?(?<textD7>(?&textD0))\
.*?(?<tmax7>(?&tmax0))\
.*?(?<rain7>(?&rain0))\
.*?(?<sunhour7>(?&sunhour0))\
\
#.*?(?<tag8>(?&tag0))\
.*?(?<textD8>(?&textD0))\
.*?(?<tmax8>(?&tmax0))\
.*?(?<rain8>(?&rain0))\
.*?(?<sunhour8>(?&sunhour0))\
\
attr bergfexInnsbruck get01URL https://www.bergfex.at/sommer/innsbruck/wetter/
attr bergfexInnsbruck get02Expr $val =~ /.*<p>([^<]+)/;; $val="$1";;
attr bergfexInnsbruck get02Name Wetter2
attr bergfexInnsbruck get02Poll 1
attr bergfexInnsbruck get02RegOpt smx
attr bergfexInnsbruck get02Regex (?'txtL0'<h2>[^>]+?<span\sclass='less-important'>[^>]+\/[^>]+>.<.h2>\n+<div\sclass="txt_markup"><p>[^<]+)<\
(?:.*?(?<txtL1>(?&txtL0)))?\
(?:.*?(?<txtL2>(?&txtL0)))?\
(?:.*?(?<txtL3>(?&txtL0)))?\
(?:.*?(?<txtL4>(?&txtL0)))?
attr bergfexInnsbruck get03Expr $val =~ /<p>([^<]+)</;; $val="$1";;
attr bergfexInnsbruck readingsWatcher 2000,?,sunhour0,sunhour1
attr bergfexInnsbruck room Wetter
attr bergfexInnsbruck showBody 0
attr bergfexInnsbruck showError 0
attr bergfexInnsbruck stateFormat condition bei temperature°C und chance_of_raining% Regenwahrscheinlichkeit
attr bergfexInnsbruck widgetOverride get01Regex:textField-long\
get02Regex:textField-long\
get01Expr:textField-long\
get02Expr:textField-long\
widgetOverride:textField-long
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 23 Oktober 2020, 18:49:49
Nein, es gibt im Moment keine neuere Version.

Aber wenn ich deine Raw Definition in Fhem eingebe, bekomme ich eine Fehlermeldung
Invalid Regex ,\s(?\d\d:\d\d)[^\n]+
\n(?[^\n]+).*?
Niederschlag:\s+(?\d+.).*?

(?:9-Tage\sWettervorhersage).*?

(?'textD0'(?<="icon"......).{1,100}png..title..(?:.+?)").*?
(?'tmax0'(?<="tmax">)(?:[\d,]+)°).*?
(?'rainW0'(?<=\n)(?:[\d,]+)%).*?
(?'rain0'(?<=rrr)\d+.+?\n(?:[\d,-]+)l?).*?
(?'sunhour0'(?<=sonne)\d+">[^<]+(?:<))

#.*?(?(?&tag0))
(?:.*?(?(?&textD0)))?
.*?(?(?&tmax0))
.*?(?(?&rain0))
.*?(?(?&sunhour0))

#.*?(?(?&tag0))
.*?(?(?&textD0))
.*?(?(?&tmax0))
.*?(?(?&rain0))
.*?(?(?&sunhour0))

#.*?(?(?&tag0))
.*?(?(?&textD0))
.*?(?(?&tmax0))
.*?(?(?&rain0))
.*?(?(?&sunhour0))

#.*?(?(?&tag0))
.*?(?(?&textD0))
.*?(?(?&tmax0))
.*?(?(?&rain0))
.*?(?(?&sunhour0))

#.*?(?(?&tag0))
.*?(?(?&textD0))
.*?(?(?&tmax0))
.*?(?(?&rain0))
.*?(?(?&sunhour0))

#.*?(?(?&tag0))
.*?(?(?&textD0))
.*?(?(?&tmax0))
.*?(?(?&rain0))
.*?(?(?&sunhour0))

#.*?(?(?&tag0))
.*?(?(?&textD0))
.*?(?(?&tmax0))
.*?(?(?&rain0))
.*?(?(?&sunhour0))

#.*?(?(?&tag0))
.*?(?(?&textD0))
.*?(?(?&tmax0))
.*?(?(?&rain0))
.*?(?(?&sunhour0))

Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 23 Oktober 2020, 19:18:21
Zitat von: amenomade am 23 Oktober 2020, 18:49:49
Aber wenn ich deine Raw Definition in Fhem eingebe, bekomme ich eine Fehlermeldung

Sorry, da hat sich beim Kopieren ein ZEichen-Escape verabschieded. So gehts.
defmod bergfexInnsbruck HTTPMOD https://www.bergfex.at/sommer/innsbruck/wetter/ 1440
attr bergfexInnsbruck devStateIcon {"<img src='https:".ReadingsVal($name,"fc1_icon","")."' alt='".ReadingsVal($name,"condition","")."' />"}
attr bergfexInnsbruck enableControlSet 1
attr bergfexInnsbruck event-on-change-reading .+
attr bergfexInnsbruck get01Expr $val =~ /.*title="(.*)"|.*?>\n?([\d,-]+)|([\d:.,-]*)/;; $val="$1$2$3";;
attr bergfexInnsbruck get01Name Wetter
attr bergfexInnsbruck get01Poll 1
attr bergfexInnsbruck get01RegOpt smx
attr bergfexInnsbruck get01Regex ,\s(?<uhrzeit>\d\d:\d\d)[^\n]+\
\n(?<textS0>[^\n]+).*?\
Niederschlag:\s+(?<niederschlag>\d+.).*?\
\
(?:9-Tage\sWettervorhersage).*?\
#(?'tag0'(?:Heute|Morgen|Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag|Sonntag|>\D\D,\s\d\d\.<)).*? \
\
(?'textD0'(?<="icon"......).{1,100}png..title..(?:.+?)").*?\
(?'tmax0'(?<="tmax">)(?:[\d,]+)°).*?\
(?'rainW0'(?<=\n)(?:[\d,]+)%).*?\
(?'rain0'(?<=rrr)\d+.+?\n(?:[\d,-]+)l?).*?\
(?'sunhour0'(?<=sonne)\d+">[^<]+(?:<))\
\
#.*?(?<tag1>(?&tag0))\
(?:.*?(?<textD1>(?&textD0)))?\
.*?(?<tmax1>(?&tmax0))\
.*?(?<rain1>(?&rain0))\
.*?(?<sunhour1>(?&sunhour0))\
\
#.*?(?<tag2>(?&tag0))\
.*?(?<textD2>(?&textD0))\
.*?(?<tmax2>(?&tmax0))\
.*?(?<rain2>(?&rain0))\
.*?(?<sunhour2>(?&sunhour0))\
\
#.*?(?<tag3>(?&tag0))\
.*?(?<textD3>(?&textD0))\
.*?(?<tmax3>(?&tmax0))\
.*?(?<rain3>(?&rain0))\
.*?(?<sunhour3>(?&sunhour0))\
\
#.*?(?<tag4>(?&tag0))\
.*?(?<textD4>(?&textD0))\
.*?(?<tmax4>(?&tmax0))\
.*?(?<rain4>(?&rain0))\
.*?(?<sunhour4>(?&sunhour0))\
\
#.*?(?<tag5>(?&tag0))\
.*?(?<textD5>(?&textD0))\
.*?(?<tmax5>(?&tmax0))\
.*?(?<rain5>(?&rain0))\
.*?(?<sunhour5>(?&sunhour0))\
\
#.*?(?<tag6>(?&tag0))\
.*?(?<textD6>(?&textD0))\
.*?(?<tmax6>(?&tmax0))\
.*?(?<rain6>(?&rain0))\
.*?(?<sunhour6>(?&sunhour0))\
\
#.*?(?<tag7>(?&tag0))\
.*?(?<textD7>(?&textD0))\
.*?(?<tmax7>(?&tmax0))\
.*?(?<rain7>(?&rain0))\
.*?(?<sunhour7>(?&sunhour0))\
\
#.*?(?<tag8>(?&tag0))\
.*?(?<textD8>(?&textD0))\
.*?(?<tmax8>(?&tmax0))\
.*?(?<rain8>(?&rain0))\
.*?(?<sunhour8>(?&sunhour0))\
\
(?sx)(?:.*?\n<h2>\n+Tirol(?'txtL0'.*?<\/h2>.*?<\/div>\n\n))?
attr bergfexInnsbruck get01URL https://www.bergfex.at/sommer/innsbruck/wetter/
attr bergfexInnsbruck get02Expr $val =~ /.*<p>([^<]+)/;; $val="$1";;
attr bergfexInnsbruck get02Name Wetter2
attr bergfexInnsbruck get02Poll 1
attr bergfexInnsbruck get02RegOpt smx
attr bergfexInnsbruck get02Regex (?'txtL0'<h2>[^>]+?<span\sclass='less-important'>[^>]+\/[^>]+>.<.h2>\n+<div\sclass="txt_markup"><p>[^<]+)<\
(?:.*?(?<txtL1>(?&txtL0)))?\
(?:.*?(?<txtL2>(?&txtL0)))?\
(?:.*?(?<txtL3>(?&txtL0)))?\
(?:.*?(?<txtL4>(?&txtL0)))?
attr bergfexInnsbruck get03Expr $val =~ /<p>([^<]+)</;; $val="$1";;
attr bergfexInnsbruck room Wetter
attr bergfexInnsbruck showBody 0
attr bergfexInnsbruck showError 0
attr bergfexInnsbruck stateFormat condition bei temperature°C und chance_of_raining% Regenwahrscheinlichkeit
attr bergfexInnsbruck widgetOverride get01Regex:textField-long\
get02Regex:textField-long\
get01Expr:textField-long\
get02Expr:textField-long\
widgetOverride:textField-long
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 27 November 2020, 10:20:54
Dank eines Updates durch mcp (https://forum.fhem.de/index.php/topic,78501.msg1104534.html#msg1104534) kann der homematic-firmware-check jetzt auch HmIP, anbei das Update fürs Template:
#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 a HTTPMOD device like <br>define DEVICE HTTPMOD https://update.homematic.com/firmware/api/firmware/search/DEVICE 86400<br /><a href="https://forum.fhem.de/index.php/topic,78501.msg1104534.html#msg1104534">Source: Forum</a>
order:X_01a
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 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 2
attr DEVICE reading01Name hmfw-type
attr DEVICE reading01RegOpt g
attr DEVICE reading01Regex (?i)"type":"((?:\w+[-]*){1,})
attr DEVICE reading02AutoNumLen 2
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 room fw-checks
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE showNewFWOnly yes
attr DEVICE stateFormat {   my $ret ="";;\
    my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","2000-01-01 00:00:00"))));;\
my $nextCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(InternalVal($name,"TRIGGERTIME_FMT","2000-01-01 00:00:00"))));;\
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">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 = AttrVal($dev,"firmware","?");;\
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 .= "<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)/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 model hm_fw_check_v2
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 28 November 2020, 19:08:51
@yersinia: Danke. Habs eingecheckt.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 29 November 2020, 10:25:28
Zitat von: amenomade am 28 November 2020, 19:08:51@yersinia: Danke. Habs eingecheckt.
Ich habe zu danken. :)
Gibt es schon was neues bezüglich der Kategoriesierung aus #120 (https://forum.fhem.de/index.php/topic,97694.msg1083804.html#msg1083804) - wirst du deinen Vorschlag weiter verfolgen?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 29 November 2020, 14:06:04
Haha. Leider habe ich das dummerweise und ohne Backup durch das checkout für die letzte Änderung überschrieben... Heisst: es kommt noch ;)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 29 November 2020, 15:31:49
Passiert. Top. :)

Auch ich hab gerade gesehen, dass beim kopieren der Vorlage einige Fehler (zweimal userattr zB) sich eingeschlichen haben ::) Hier eine korrigierte Version:
#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 a HTTPMOD device like <br>define DEVICE HTTPMOD https://update.homematic.com/firmware/api/firmware/search/DEVICE 86400<br /><a href="https://forum.fhem.de/index.php/topic,78501.msg1104534.html#msg1104534">Source: Forum</a>
order:X_01a
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 2
attr DEVICE reading01Name hmfw-type
attr DEVICE reading01RegOpt g
attr DEVICE reading01Regex (?i)"type":"((?:\w+[-]*){1,})
attr DEVICE reading02AutoNumLen 2
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 room fw-checks
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE showNewFWOnly yes
attr DEVICE stateFormat {   my $ret ="";;\
    my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","2000-01-01 00:00:00"))));;\
my $nextCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(InternalVal($name,"TRIGGERTIME_FMT","2000-01-01 00:00:00"))));;\
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">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)/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 model hm_fw_check_v2
setreading DEVICE attrTemplateVersion 20201129

Sorry. -.-
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 29 November 2020, 15:50:41
Update für das Bergfex Template. Das konnte doch tatsächlich keine Minus-Temperaturen auslesen.
Das führte zu diesem Regex -Fehler und führte zu einem kompletten "hängen" von FHEM.
Your regular expression leads to "catastrophic backtracking", making it too complex to be run to completion.

Anbei eine aktualisierte Version:


defmod bergfexInnsbruck HTTPMOD https://www.bergfex.at/sommer/innsbruck/wetter/ none
attr bergfexInnsbruck devStateIcon {"<img src='https:".ReadingsVal($name,"fc1_icon","")."' alt='".ReadingsVal($name,"condition","")."' />"}
attr bergfexInnsbruck enableControlSet 1
attr bergfexInnsbruck event-on-change-reading .+
attr bergfexInnsbruck get01Expr $val =~ /.*title="(.*)"|.*?>\n?([\d,-]+)|([\d:.,-]*)/;; $val="$1$2$3";;
attr bergfexInnsbruck get01Name Wetter
attr bergfexInnsbruck get01Poll 1
attr bergfexInnsbruck get01RegOpt smx
attr bergfexInnsbruck get01Regex \p{Any}\
\
,\s(?<uhrzeit>\d\d:\d\d)[^\n]+\
\n(?<textS0>[^\n]+).*?\
Niederschlag:\s+(?<niederschlag>\d+.).*?\
\
(?:9-Tage\sWettervorhersage).*?\
\
(?'textD0'(?<="icon"......).{1,100}png..title..(?:.+?)").*?\
(?'tmax0'(?<="tmax">)(?:[\d,-]+)°).*?\
(?'tmin0'(?<="tmin">)(?:[\d,-]+)°).*?\
(?'rainW0'(?<=\n)(?:[\d,]+)%).*?\
(?'rain0'(?<=rrr)\d+.+?\n(?:[\d,-]+)l?).*?\
(?'sunhour0'(?<=sonne)\d+">[^<]+(?:<))\
\
(?:.*?(?<textD1>(?&textD0)))?\
.*?(?<tmax1>(?&tmax0))\
.*?(?<tmin1>(?&tmin0))\
.*?(?<rainW1>(?&rainW0))\
.*?(?<rain1>(?&rain0))\
.*?(?<sunhour1>(?&sunhour0))\
\
.*?(?<textD2>(?&textD0))\
.*?(?<tmax2>(?&tmax0))\
.*?(?<tmin2>(?&tmin0))\
.*?(?<rainW2>(?&rainW0))\
.*?(?<rain2>(?&rain0))\
.*?(?<sunhour2>(?&sunhour0))\
\
.*?(?<textD3>(?&textD0))\
.*?(?<tmax3>(?&tmax0))\
.*?(?<tmin3>(?&tmin0))\
.*?(?<rainW3>(?&rainW0))\
.*?(?<rain3>(?&rain0))\
.*?(?<sunhour3>(?&sunhour0))\
\
.*?(?<textD4>(?&textD0))\
.*?(?<tmax4>(?&tmax0))\
.*?(?<tmin4>(?&tmin0))\
.*?(?<rainW4>(?&rainW0))\
.*?(?<rain4>(?&rain0))\
.*?(?<sunhour4>(?&sunhour0))\
\
.*?(?<textD5>(?&textD0))\
.*?(?<tmax5>(?&tmax0))\
.*?(?<tmin5>(?&tmin0))\
.*?(?<rainW5>(?&rainW0))\
.*?(?<rain5>(?&rain0))\
.*?(?<sunhour5>(?&sunhour0))\
\
.*?(?<textD6>(?&textD0))\
.*?(?<tmax6>(?&tmax0))\
.*?(?<tmin6>(?&tmin0))\
.*?(?<rain6>(?&rain0))\
.*?(?<sunhour6>(?&sunhour0))\
\
.*?(?<textD7>(?&textD0))\
.*?(?<tmax7>(?&tmax0))\
.*?(?<tmin7>(?&tmin0))\
.*?(?<rain7>(?&rain0))\
.*?(?<sunhour7>(?&sunhour0))\
\
.*?(?<textD8>(?&textD0))\
.*?(?<tmax8>(?&tmax0))\
.*?(?<tmin8>(?&tmin0))\
#.*?(?<rainW8>(?&rainW0))\
.*?(?<rain8>(?&rain0))\
.*?(?<sunhour8>(?&sunhour0))\

attr bergfexInnsbruck get01URL https://www.bergfex.at/sommer/innsbruck/wetter/
attr bergfexInnsbruck get02Expr $val =~ /.*<p>([^<]+)/;; $val="$1";;
attr bergfexInnsbruck get02Name Wetter2
attr bergfexInnsbruck get02Poll 1
attr bergfexInnsbruck get02RegOpt smx
attr bergfexInnsbruck get02Regex (?'txtL0'<h2>[^>]+?<span\sclass='less-important'>[^>]+\/[^>]+>.<.h2>\n+<div\sclass="txt_markup"><p>[^<]+)<\
(?:.*?(?<txtL1>(?&txtL0)))?\
(?:.*?(?<txtL2>(?&txtL0)))?\
(?:.*?(?<txtL3>(?&txtL0)))?\
(?:.*?(?<txtL4>(?&txtL0)))?
attr bergfexInnsbruck get03Expr $val =~ /<p>([^<]+)</;; $val="$1";;
attr bergfexInnsbruck stateFormat condition bei temperature°C und chance_of_raining% Regenwahrscheinlichkeit
attr bergfexInnsbruck widgetOverride get01Regex:textField-long\
get02Regex:textField-long\
get01Expr:textField-long\
get02Expr:textField-long\
widgetOverride:textField-long

Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 29 November 2020, 17:35:02
@JoeALLb: schon mal besser, aber das Problem bei bergfex, ist dass je nach Stadt die Darstellung anders ist. Funktioniert es z.B. auch für Wien oder Salzburg? Sonst sehe ich die Interesse für ein template gering.

Siehe z.B.:
https://www.bergfex.at/sommer/innsbruck/wetter/
https://www.bergfex.at/sommer/wien/wetter/
https://www.bergfex.at/sommer/wien/wetter/stationen/wien-donaufeld/
https://www.bergfex.at/sommer/salzburg/wetter/

Oder wie muss man die richtige URL bestimmen?

EDIT: und devStateIcon und stateFormat funktionieren nicht



Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 29 November 2020, 17:54:23
Innsbruck, Wien und Salzburg funktionieren., Stationen nicht (müssen auch nicht!).

DevstateIcon einfach weglassen, das hatte ich mir lokal "gespiegelt".
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 29 November 2020, 18:36:14
Zitat von: JoeALLb am 29 November 2020, 17:54:23
Innsbruck, Wien und Salzburg funktionieren., Stationen nicht (müssen auch nicht!).

DevstateIcon einfach weglassen, das hatte ich mir lokal "gespiegelt".
Bei mir geht Wien mit der URL https://www.bergfex.at/sommer/wien/wetter/ nicht
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 29 November 2020, 19:07:43
Bei mir schon.

Ohne Fehlermeldung?
Bleiben alle Datenfelder leer?

Anbei das List meines Devices mit Readings. Sieht gut aus.


defmod bergfexWien HTTPMOD https://www.bergfex.at/sommer/wien/wetter/ none
attr bergfexWien userattr get01Name get01OExpr get01Poll:0,1 get01RegOpt get01Regex get01URL get02Name get02OExpr get02Poll:0,1 get02RegOpt get02Regex get03OExpr
attr bergfexWien devStateIcon {"<img src='https:".ReadingsVal($name,"fc1_icon","")."' alt='".ReadingsVal($name,"condition","")."' />"}
attr bergfexWien enableControlSet 1
attr bergfexWien event-on-change-reading .+
attr bergfexWien get01Name Wetter
attr bergfexWien get01OExpr $val =~ /.*title="(.*)"|.*?>\n?([\d,-]+)|([\d:.,-]*)/;; $val="$1$2$3";;
attr bergfexWien get01Poll 1
attr bergfexWien get01RegOpt smx
attr bergfexWien get01Regex \p{Any}\
\
,\s(?<uhrzeit>\d\d:\d\d)[^\n]+\
\n(?<textS0>[^\n]+).*?\
Niederschlag:\s+(?<niederschlag>\d+.).*?\
\
(?:9-Tage\sWettervorhersage).*?\
\
(?'textD0'(?<="icon"......).{1,100}png..title..(?:.+?)").*?\
(?'tmax0'(?<="tmax">)(?:[\d,-]+)°).*?\
(?'tmin0'(?<="tmin">)(?:[\d,-]+)°).*?\
(?'rainW0'(?<=\n)(?:[\d,]+)%).*?\
(?'rain0'(?<=rrr)\d+.+?\n(?:[\d,-]+)l?).*?\
(?'sunhour0'(?<=sonne)\d+">[^<]+(?:<))\
\
(?:.*?(?<textD1>(?&textD0)))?\
.*?(?<tmax1>(?&tmax0))\
.*?(?<tmin1>(?&tmin0))\
.*?(?<rainW1>(?&rainW0))\
.*?(?<rain1>(?&rain0))\
.*?(?<sunhour1>(?&sunhour0))\
\
.*?(?<textD2>(?&textD0))\
.*?(?<tmax2>(?&tmax0))\
.*?(?<tmin2>(?&tmin0))\
.*?(?<rainW2>(?&rainW0))\
.*?(?<rain2>(?&rain0))\
.*?(?<sunhour2>(?&sunhour0))\
\
.*?(?<textD3>(?&textD0))\
.*?(?<tmax3>(?&tmax0))\
.*?(?<tmin3>(?&tmin0))\
.*?(?<rainW3>(?&rainW0))\
.*?(?<rain3>(?&rain0))\
.*?(?<sunhour3>(?&sunhour0))\
\
.*?(?<textD4>(?&textD0))\
.*?(?<tmax4>(?&tmax0))\
.*?(?<tmin4>(?&tmin0))\
.*?(?<rainW4>(?&rainW0))\
.*?(?<rain4>(?&rain0))\
.*?(?<sunhour4>(?&sunhour0))\
\
.*?(?<textD5>(?&textD0))\
.*?(?<tmax5>(?&tmax0))\
.*?(?<tmin5>(?&tmin0))\
.*?(?<rainW5>(?&rainW0))\
.*?(?<rain5>(?&rain0))\
.*?(?<sunhour5>(?&sunhour0))\
\
.*?(?<textD6>(?&textD0))\
.*?(?<tmax6>(?&tmax0))\
.*?(?<tmin6>(?&tmin0))\
.*?(?<rain6>(?&rain0))\
.*?(?<sunhour6>(?&sunhour0))\
\
.*?(?<textD7>(?&textD0))\
.*?(?<tmax7>(?&tmax0))\
.*?(?<tmin7>(?&tmin0))\
.*?(?<rain7>(?&rain0))\
.*?(?<sunhour7>(?&sunhour0))\
\
.*?(?<textD8>(?&textD0))\
.*?(?<tmax8>(?&tmax0))\
.*?(?<tmin8>(?&tmin0))\
#.*?(?<rainW8>(?&rainW0))\
.*?(?<rain8>(?&rain0))\
.*?(?<sunhour8>(?&sunhour0))\

attr bergfexWien get01URL https://www.bergfex.at/sommer/innsbruck/wetter/
attr bergfexWien get02Name Wetter2
attr bergfexWien get02OExpr $val =~ /.*<p>([^<]+)/;; $val="$1";;
attr bergfexWien get02Poll 1
attr bergfexWien get02RegOpt smx
attr bergfexWien get02Regex (?'txtL0'<h2>[^>]+?<span\sclass='less-important'>[^>]+\/[^>]+>.<.h2>\n+<div\sclass="txt_markup"><p>[^<]+)<\
(?:.*?(?<txtL1>(?&txtL0)))?\
(?:.*?(?<txtL2>(?&txtL0)))?\
(?:.*?(?<txtL3>(?&txtL0)))?\
(?:.*?(?<txtL4>(?&txtL0)))?
attr bergfexWien get03OExpr $val =~ /<p>([^<]+)</;; $val="$1";;
attr bergfexWien readingsWatcher 2000,?,sunhour0,sunhour1
attr bergfexWien room Wetter
attr bergfexWien showBody 0
attr bergfexWien showError 0
attr bergfexWien stateFormat condition bei temperature°C und chance_of_raining% Regenwahrscheinlichkeit
attr bergfexWien widgetOverride get01Regex:textField-long\
get02Regex:textField-long\
get01Expr:textField-long\
get02Expr:textField-long\
widgetOverride:textField-long

setstate bergfexWien condition bei temperature°C und chance_of_raining% Regenwahrscheinlichkeit
setstate bergfexWien 2020-11-29 19:05:31 activ 1
setstate bergfexWien 2020-11-29 19:03:31 niederschlag 5
setstate bergfexWien 2020-11-29 19:03:31 rain0 -
setstate bergfexWien 2020-11-29 19:03:31 rain1 -
setstate bergfexWien 2020-11-29 19:03:31 rain2 3
setstate bergfexWien 2020-11-29 19:03:31 rain3 0,6
setstate bergfexWien 2020-11-29 19:03:31 rain4 1
setstate bergfexWien 2020-11-29 19:03:31 rain5 2
setstate bergfexWien 2020-11-29 19:03:31 rain6 40
setstate bergfexWien 2020-11-29 19:03:31 rain7 33
setstate bergfexWien 2020-11-29 19:03:31 rain8 14
setstate bergfexWien 2020-11-29 19:03:31 rainW0 5
setstate bergfexWien 2020-11-29 19:03:31 rainW1 15
setstate bergfexWien 2020-11-29 19:03:31 rainW2 60
setstate bergfexWien 2020-11-29 19:03:31 rainW3 35
setstate bergfexWien 2020-11-29 19:03:31 rainW4 35
setstate bergfexWien 2020-11-29 19:03:31 rainW5 45
setstate bergfexWien 2020-11-29 19:03:31 sunhour0 2
setstate bergfexWien 2020-11-29 19:03:31 sunhour1 8
setstate bergfexWien 2020-11-29 19:03:31 sunhour2 -
setstate bergfexWien 2020-11-29 19:03:31 sunhour3 2
setstate bergfexWien 2020-11-29 19:03:31 sunhour4 2
setstate bergfexWien 2020-11-29 19:03:31 sunhour5 3
setstate bergfexWien 2020-11-29 19:03:31 sunhour6 -
setstate bergfexWien 2020-11-29 19:03:31 sunhour7 -
setstate bergfexWien 2020-11-29 19:03:31 sunhour8 1
setstate bergfexWien 2020-11-29 19:03:31 textD0 stark bewölkt 2h Sonne
setstate bergfexWien 2020-11-29 19:03:31 textD1 wolkenlos 8h Sonne
setstate bergfexWien 2020-11-29 19:03:31 textD2 leichter Schneefall 0h Sonne
setstate bergfexWien 2020-11-29 19:03:31 textD3 wolkig 2h Sonne
setstate bergfexWien 2020-11-29 19:03:31 textD4  2h Sonne
setstate bergfexWien 2020-11-29 19:03:31 textD5 wolkig 3h Sonne
setstate bergfexWien 2020-11-29 19:03:31 textD6 mäßiger Regen 0h Sonne
setstate bergfexWien 2020-11-29 19:03:31 textD7 Schneeregen 0h Sonne
setstate bergfexWien 2020-11-29 19:03:31 textD8  1h Sonne
setstate bergfexWien 2020-11-29 19:03:31 textS0 -
setstate bergfexWien 2020-11-29 19:03:31 tmax0 0
setstate bergfexWien 2020-11-29 19:03:31 tmax1 4
setstate bergfexWien 2020-11-29 19:03:31 tmax2 3
setstate bergfexWien 2020-11-29 19:03:31 tmax3 3
setstate bergfexWien 2020-11-29 19:03:31 tmax4 2
setstate bergfexWien 2020-11-29 19:03:31 tmax5 6
setstate bergfexWien 2020-11-29 19:03:31 tmax6 7
setstate bergfexWien 2020-11-29 19:03:31 tmax7 6
setstate bergfexWien 2020-11-29 19:03:31 tmax8 5
setstate bergfexWien 2020-11-29 19:03:31 tmin0 -3
setstate bergfexWien 2020-11-29 19:03:31 tmin1 -6
setstate bergfexWien 2020-11-29 19:03:31 tmin2 -7
setstate bergfexWien 2020-11-29 19:03:31 tmin3 -4
setstate bergfexWien 2020-11-29 19:03:31 tmin4 -3
setstate bergfexWien 2020-11-29 19:03:31 tmin5 -3
setstate bergfexWien 2020-11-29 19:03:31 tmin6 0
setstate bergfexWien 2020-11-29 19:03:31 tmin7 1
setstate bergfexWien 2020-11-29 19:03:31 tmin8 0
setstate bergfexWien 2020-11-29 19:03:31 uhrzeit 19:00

Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 29 November 2020, 19:24:23
Ok, geht doch, sorry. Ich weiss nicht, was ich früher gemacht hatte.

Ich werde es übenehmen.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 29 November 2020, 21:29:48
Ne, jetzt weiss ich: das funktioniert doch nicht. In deinem "wien" Beispiel hieroben hast Du get01URL nicht geändert, deswegen kriegst Du noch Werte, und zwar... die von Innsbruck immer noch.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: JoeALLb am 29 November 2020, 22:07:37
Ok, weil die URL von wien
https://www.bergfex.at/sommer/wien-stadt/wetter/

lautet. dann gehts wieder.
Lösch mal get01URL , das brauchts nicht. (schadet aber auch nicht).

Joe
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 29 November 2020, 22:10:44
Na gut, dann wiederum die Frage: wie bestimmt man die richtige URL für seine Stadt?
Ich lösche get01URL aber nutze getURL mit einem Parameter CITY drinn.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 29 November 2020, 22:14:39
Hab gerade was eingecheckt, mit einem Kommentar beim Parameter CITY. Mal sehen ob das verständlich ist
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 30 November 2020, 12:02:47
@amenomade, könntest du die Korrektur aus #131 (https://forum.fhem.de/index.php/topic,97694.msg1105566.html#msg1105566) noch ins SVN schubsen? Du kannst auch dies hier kopieren - inkludiert auch gleich die neue Sortierung:
#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 a HTTPMOD device like <br>define DEVICE HTTPMOD https://update.homematic.com/firmware/api/firmware/search/DEVICE 86400<br /><a href="https://forum.fhem.de/index.php/topic,78501.msg1104534.html#msg1104534">Source: Forum</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 2
attr DEVICE reading01Name hmfw-type
attr DEVICE reading01RegOpt g
attr DEVICE reading01Regex (?i)"type":"((?:\w+[-]*){1,})
attr DEVICE reading02AutoNumLen 2
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 = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","2000-01-01 00:00:00"))));;\
my $nextCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(InternalVal($name,"TRIGGERTIME_FMT","2000-01-01 00:00:00"))));;\
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">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)/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 20201129

Danke. :)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 30 November 2020, 20:00:52
Eigentlich ist userAttr für Standard-Attribute des HTTPMODs egal, oder? HTTPMOD setzt das standardmässig, sobal man die entspr. Attribute definiert, damit man sie nachträglich ändern kann. Aber die sind durch Wildcards immer erlaubt.

Was bewirkt showNewFWOnly:yes,no ?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 01 Dezember 2020, 10:37:26
Zitat von: amenomade am 30 November 2020, 20:00:52Was bewirkt showNewFWOnly:yes,no ?
showNewFWOnly steuert, welche Devices angezeigt werden: der Default yes zeigt nur solche FHEM-Devices an, wo ein Update gefunden wurde; no zeigt alle (gefundene) FHEM-Devices sowie die gefundene Version an (siehe auch hier (https://forum.fhem.de/index.php/topic,78501.msg1022560.html#msg1022560)).

EDIT: die Funktion ist analog zum updatableDevicesMode im JsonMod template:
Zitat von: yersinia am 16 April 2020, 13:08:51Die Funktion entspricht grundsätzlich dem Httpmod template. Es gibt auch hier ein user Attribute updatableDevicesMode - beim Standard onlyUpdatable werden nur solche Devices, für die eine neue firmware gefunden worden ist, angezeigt; bei all werden alle HM-Devices im FHEM mit der gefundenen Firmware Version angezeigt. Dadurch können auch Devices auftauchen, für die es idR keine Updates geben würde (zB HM-SEC-SCO). Mit dem Update vom 25.11.'20 werden sowohl HM als auch HmIP Devices angezeigt.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 02 Dezember 2020, 02:45:26
Zitat von: yersinia am 30 November 2020, 12:02:47
@amenomade, könntest du die Korrektur aus #131 (https://forum.fhem.de/index.php/topic,97694.msg1105566.html#msg1105566) noch ins SVN schubsen? Du kannst auch dies hier kopieren - inkludiert auch gleich die neue Sortierung:
Danke. :)
Eingecheckt
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 02 Dezember 2020, 11:18:59
Ich muss dich wegen (https://forum.fhem.de/index.php/topic,78501.msg1106499.html#msg1106499) nochmal um ein Update bitten: ::)
#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

Danke. :)



Edit, weil ich gerade dabei war, noch ein update für das template fuel_oil_check basierend auf 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), Amount (Menge) and loading points (Entladestellen), hose length (Schlauchlaenge) and truck trailer accessibility (mit Anhaenger oder ohne) 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)}
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 12345
attr DEVICE replacement02Mode text
attr DEVICE replacement02Regex %%MENGE%%
attr DEVICE replacement02Value 3000
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=short_vehicle
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 20201202


..und basieredn auf 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), Amount (Menge) and loading 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)}
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 12345
attr DEVICE replacement02Mode text
attr DEVICE replacement02Regex %%MENGE%%
attr DEVICE replacement02Value 3000
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 20201202
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 02 Dezember 2020, 19:46:41
Wäre es nicht besser die Parameter in der URL als par: zu definieren, wenn Du sowieso noch ein defmod machst, und dann einfach den User zu bitten, ein "leeres" HTTPMOD anzulegen (define xxx HTTPMOD none 0)?

Beispiel, das ich noch gestern Abend gebastelt habe:
#Pharmacy emergency service Germany - aponet, Forum https://forum.fhem.de/index.php/topic,87234.0.html
name:aponet_pharmacy_emergency_service_germany
filter:TYPE=HTTPMOD
desc: Gets the current emergency service of a pharmacy closeby your postal code from aponet.de<br />Define an empty HTTPMOD device with <br />define DEVICE HTTPMOD none 0<br /><a href="https://forum.fhem.de/index.php/topic,87234.0.html">Source: Forum</a><br />
order:DIV02
par:SEARCHZIPCODE;Zip code of the city you want to search around;
par:SEARCHRADIUS;Radius for the search;
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
defmod DEVICE HTTPMOD https://www.aponet.de/apotheke/notdienstsuche?tx_aponetpharmacy_search[action]=result&tx_aponetpharmacy_search[controller]=Search&tx_aponetpharmacy_search[search][plzort]=SEARCHZIPCODE&tx_aponetpharmacy_search[search][date]=&tx_aponetpharmacy_search[search][street]=&tx_aponetpharmacy_search[search][radius]=SEARCHRADIUS&tx_aponetpharmacy_search[search][lat]=&tx_aponetpharmacy_search[search][lng]=&type=1982 0
attr DEVICE reading01Name NotName
attr DEVICE reading01Regex class="name">(.*?)<\/h4>
attr DEVICE reading02Name NotdienstVon
attr DEVICE reading02Regex Notdienst vom(.*?Uhr)
attr DEVICE reading03Name NotdienstBis
attr DEVICE reading03Regex Notdienst vom.*?Uhr bis(.*?Uhr)
attr DEVICE reading04Name NotdienstTelefon
attr DEVICE reading04Regex href="tel:(.*?)"
attr DEVICE reading05Name NotdienstAdresse
attr DEVICE reading05Regex (?s)strasse">([\sa-zA-Z0-9äöüÄÖÜß.&#;;_-]+).*?plz">(\d+).*?ort">([\sa-zA-Z0-9äöüÄÖÜß.&#;;_-]+)<
attr DEVICE reading06Name DatumVon
attr DEVICE reading06Regex Notdienst vom ([ 0-9.:&#;;_-]+)
attr DEVICE stateFormat NotName, NotdienstTelefon, NotdienstAdresse-1 in NotdienstAdresse-2 NotdienstAdresse-3
attr DEVICE model aponet_pharmacy_emergency_service_germany
setreading DEVICE attrTemplateVersion 20201202
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 03 Dezember 2020, 11:36:48
Zitat von: amenomade am 02 Dezember 2020, 19:46:41Wäre es nicht besser die Parameter in der URL als par: zu definieren, wenn Du sowieso noch ein defmod machst, und dann einfach den User zu bitten, ein "leeres" HTTPMOD anzulegen (define xxx HTTPMOD none 0)?
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.
Bei meinem Vorschlag muss der Endanwender bis zu drei (heizoel24) bzw fünf (easyoil) Attribute anpassen, die -zugegebenermaßen- auch nicht unbedingt selbsterklärend sind - aber man findet die Attribute untereinander. Gut, die zu ersetzende Suchbegriffe sind auf Deutsch.
Ich bin da Leidenschaftslos und kann nur einen subjektiven Eindruck beisteuern - ich finde meinen Vorschlag einfacher zugänglich. Wie siehst du das?

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:
Internals:
   .getList   
   .setList   interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
   .updateReadingList 1
   .updateRequestHash 1
   CFGFN     
   DEF        none 0
   FUUID      5fc8bebc-f33f-3151-4c78-1497fd480a571817
   Interval   0
   MainURL   
   ModuleVersion 4.0.12 - 24.10.2020
   NAME       TEST
   NOTIFYDEV  global
   NR         8707
   NTFY_ORDER 50-TEST
   STATE      NotName, NotdienstTelefon, NotdienstAdresse-1 in NotdienstAdresse-2 NotdienstAdresse-3
   TYPE       HTTPMOD
   .attraggr:
   .attrminint:
   CompiledRegexes:
   READINGS:
     2020-12-03 11:32:43   attrTemplateVersion 20201202
Attributes:
   model      aponet_pharmacy_emergency_service_germany
   reading01Name NotName
   reading01Regex class="name">(.*?)<\/h4>
   reading02Name NotdienstVon
   reading02Regex Notdienst vom(.*?Uhr)
   reading03Name NotdienstBis
   reading03Regex Notdienst vom.*?Uhr bis(.*?Uhr)
   reading04Name NotdienstTelefon
   reading04Regex href="tel:(.*?)"
   reading05Name NotdienstAdresse
   reading05Regex (?s)strasse">([\sa-zA-Z0-9äöüÄÖÜß.&#;;_-]+).*?plz">(\d+).*?ort">([\sa-zA-Z0-9äöüÄÖÜß.&#;;_-]+)<
   reading06Name DatumVon
   reading06Regex Notdienst vom ([ 0-9.:&#;;_-]+)
   stateFormat NotName, NotdienstTelefon, NotdienstAdresse-1 in NotdienstAdresse-2 NotdienstAdresse-3
   userattr   reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex reading06Name reading06Regex

Oder bediene ich das falsch (PEBKAC)?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Intruder1956 am 03 Dezember 2020, 12:36:31
Hallo
kann es sein, das das Template für clever-tanken nicht mehr funktioniert, wegen Änderungen ?

Bekomme keine Preise angezeigt.

Danke und Gruß

Werner
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 03 Dezember 2020, 12:48:47
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 (https://forum.fhem.de/index.php/topic,22554.0.html) die letzten Beiträge durchgeschaut?
Möglicherweise findest du da schon Hinweise, welche Einstellungen (zB RegExe zu ändern wären).
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 03 Dezember 2020, 19:28:41
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 ;)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 04 Dezember 2020, 10:16:55
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?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 04 Dezember 2020, 10:47:50
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?)?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 04 Dezember 2020, 12:24:05
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.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 04 Dezember 2020, 12:51:02
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]
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag 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. Im Endeffekt wird dann doch wieder ein Thread aufgemacht. Irgendwann ist man selbst auch mal ein taubes Nüßchen (https://forum.fhem.de/index.php/topic,115158.msg1094250.html#msg1094250), 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.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 04 Dezember 2020, 14:01:16
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 (https://forum.fhem.de/index.php/topic,115158.msg1094250.html#msg1094250), 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?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag 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. 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
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 04 Dezember 2020, 15:21:25
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... ::) )
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 04 Dezember 2020, 23:28:46
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?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 04 Dezember 2020, 23:32:50
@Intruder1956: bei mir funktionieren noch beide Templates.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Intruder1956 am 05 Dezember 2020, 00:20:27
Hallo,
es ist Single und SuperE10 wird nicht angezeigt.

Danke und gute Nacht
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 05 Dezember 2020, 00:32:43
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
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Intruder1956 am 05 Dezember 2020, 09:18:03
guten morge, jau hab ich  :)
http://www.clever-tanken.de/tankstelle_details/28587 (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
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 05 Dezember 2020, 09:47:53
Zitat von: Intruder1956 am 05 Dezember 2020, 09:18:03
guten morge, jau hab ich  :)
http://www.clever-tanken.de/tankstelle_details/28587 (http://www.clever-tanken.de/tankstelle_details/28587)
Diese Tankstelle hat kein Super E10. Zumindest nicht auf der clever-tanken webseite.

Zitat von: amenomade am 04 Dezember 2020, 23:28:46Danke für die interessante Diskussion.
Perfekt, Danke! :)
Zitat von: amenomade am 04 Dezember 2020, 23:28:46Ich habe eingecheckt (mit Korrektur in stateFormat von heizung24 - zu viele Semikola)
Kommen die nicht automatisch im RAW Modus dazu wenn, ich im stateFormat ein Semikolon verwende? Analog zum Perl-Befehlsende?
Demnach muss ein verwendetes &nbsp; zu &nbsp;; werden - oder wird das im Attribut-Template anders gehandhabt?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 05 Dezember 2020, 19:06:51
Zitat von: yersinia am 05 Dezember 2020, 09:47:53
Kommen die nicht automatisch im RAW Modus dazu wenn, ich im stateFormat ein Semikolon verwende? Analog zum Perl-Befehlsende?
Demnach muss ein verwendetes &nbsp; zu &nbsp;; werden - oder wird das im Attribut-Template anders gehandhabt?

Anscheinend müssen die im Template nicht verdoppelt sein, sonst landen 4 Semikola in RawDef. Ich vermute AnalyseCommand verdoppelt die schon.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Otto123 am 05 Dezember 2020, 19:36:33
Im DEF Editor keine "Zeilenverbinder" \ und einzelne ;
Im Raw Def müssen "Zeilenverbinder" \ und doppelte ;
Im Template müssen "Zeilenverbinder" \ und einzelne ;

Und wenn man im Template FHEM Befehle mit mehreren Ebenen einbaut  ;D - braucht man irgendwas aus der "Drogerie" dazu ;) mindestens hochprozentiges Popcorn
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 06 Dezember 2020, 15:43:08
Zitat von: amenomade am 05 Dezember 2020, 19:06:51Anscheinend müssen die im Template nicht verdoppelt sein, sonst landen 4 Semikola in RawDef. Ich vermute AnalyseCommand verdoppelt die schon.
Zitat von: Otto123 am 05 Dezember 2020, 19:36:33Im DEF Editor keine "Zeilenverbinder" \ und einzelne ;
Im Raw Def müssen "Zeilenverbinder" \ und doppelte ;
Im Template müssen "Zeilenverbinder" \ und einzelne ;
:o DAS muss man auch erstmal wissen. Aber gut, man lernt nie aus. Auf zur sinnfrei-doppelte-Semikola-Eliminierung...

esyoil (ich hab das template von fuel_oil_check zu fuel_oil_check_esyoil umbenannt)
#Contributed by subseven & yersinia, see https://forum.fhem.de/index.php/topic,107189.msg1017754.html#msg1017754
name:fuel_oil_check_esyoil
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), 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_esyoil
setreading DEVICE attrTemplateVersion 20201206


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%% 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
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 20201206


homematic-fw-check:
#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 20201206



Es funktioniert übrigens ganz gut, wenn man erst ein HTTMOD Device mit
define meinDevice HTTMOD none 0
definiert und dann das Template auswählt und mit [set] übernimmt. Mit den par: gefällt mir auch ganz gut. Topp.

Was ich noch nicht ganz verstanden habe, ist warum das dropdown im userAttr nicht zieht:
replacement04Value:40m,60m,80m
Im template (https://svn.fhem.de/trac/changeset/23292/trunk) steht es richtig drin, aber HTTPMOD generiert trotzdem noch ein replacement04Value was dann in etwa so aussieht im userAttr:
replacement04Value replacement04Value:40m,60m,80m
Einer eine Idee wie das kommt?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 06 Dezember 2020, 16:02:51
Das mit replacement04Value hängt an dem HTTPMOD Modul.
Machst du auf einem leeren HTTPMOD zuerst "userattr replacement04Value:40m,60m,80m", dann ist das Attribut in der Liste auswählbar, und die Werte können auch aus einer Liste ausgewählt werden

Sobald aber einmal gesetzt, kommt die Liste für Werte nicht mehr.

Ich vermute, es hängt an der Logik von HTTMOD mit "Wilcardattribute". Wäre eine Frage an StefanStrobel in einem neuen Thread

Sind andere Änderungen als doppelte Semikola in den Templates? Die störende hatte ich schon entfernt (zumindest glaube ich)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 06 Dezember 2020, 16:25:04
Zitat von: amenomade am 06 Dezember 2020, 16:02:51Sind andere Änderungen als doppelte Semikola in den Templates? Die störende hatte ich schon entfernt (zumindest glaube ich)
Ja:
Zitat von: yersinia am 06 Dezember 2020, 15:43:08esyoil (ich hab das template von fuel_oil_check zu fuel_oil_check_esyoil umbenannt)
Darüberhinaus habe ich in allen drei templates in #168 alle doppelten Semikola entfernt. Also sowohl am Zeilenende (bleibt doppelt im stateFormat) als auch die HTML-Maskierungen - insbesondere bei esyoil, heizoel24 hattest du gut bereinigt. :)
Und die Template Version auf 20201206 geändert. Der Rest ist gleich geblieben.

Zitat von: amenomade am 06 Dezember 2020, 16:02:51Ich vermute, es hängt an der Logik von HTTMOD mit "Wilcardattribute". Wäre eine Frage an StefanStrobel in einem neuen Thread
Ich habs mal in den generellen HTTPMOD-Thread gepostet (https://forum.fhem.de/index.php/topic,45176.msg1108013.html#msg1108013).
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 06 Dezember 2020, 16:50:22
Ok, ich habe noch 3600 durch INTERVAL im defmod von heizoel24 ersetzt, und eingecheckt.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 06 Dezember 2020, 19:59:48
Zitat von: amenomade am 06 Dezember 2020, 16:50:22
Ok, ich habe noch 3600 durch INTERVAL im defmod von heizoel24 ersetzt, und eingecheckt.
/_\ Ausgezeichnet, vielen Dank. :)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: artoffhem am 03 Januar 2021, 12:38:40
Hallo!

es gab mal eine Frage betreffend ORF_weather template und dem ersetzen von "," durch "."

Ich habe es wie vorgeschlagen mit dem reading01OExpr gelöst, jedoch einen etwas anderen Ausdruck verwendet. Anbei meine funktionierende Lösung und eventuell findet es  ja den Weg in das Template.

- userattr mit "reading01OExpr" anlegen
attr ORF reading01OExpr {$val=~s/,/\./; return $val;}

Das Regex für die Wetterdaten liest leider nur die Zahlen ohne Vorzeichen aus, und somit werden negative Temperaturen in positive umgewandelt. Anbei ein Beispeil des html codes wie er von ORF ausgeliefert wird, wobei für negative Zahlen der html code "&minus;" verwendet wird. Dieses Problem habe ich leider nicht lösen können, aber vielleicht hat wer eine Idee.

     <div class="leftCol">
         <p class="offscreen">Beobachtung: stark bew�lkt.</p>
         <p>
            <span>Seeh�he</span><span class="offscreen">:</span>
            314 <abbr title="Meter">m</abbr>
         </p>
         <p>
            <span>Temperatur</span><span class="offscreen">:</span>
            &minus;1,3&thinsp;<abbr title="Grad Celsius">&deg;C</abbr>
         </p>
         <p>
            <span>Taupunkt</span><span class="offscreen">:</span>
            &minus;2,5&thinsp;<abbr title="Grad Celsius">&deg;C</abbr>
         </p>
         <p>
            <span>Wind</span><span class="offscreen">:</span>
            Ost, 7 <abbr title="Kilometer pro Stunde">km/h</abbr>
         </p>
         <p>
            <span>Windspitzen</span><span class="offscreen">:</span>
            Ost, 10 <abbr title="Kilometer pro Stunde">km/h</abbr>
         </p>
         <p class="snow">&nbsp;</p>
      </div>


Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 03 Januar 2021, 17:01:25
ZitatDas Regex für die Wetterdaten liest leider nur die Zahlen ohne Vorzeichen aus, und somit werden negative Temperaturen in positive umgewandelt.

Hab ne Korrektur gerade eingecheckt.

Für das Ersetzen von "," durch "." gab es schon was im Template, das mMn funktioniert
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: artoffhem am 05 Januar 2021, 10:34:24
habe gerade die Korrektur geprüft, und prinzipiell funktioniert Sie, wenn man den Code von 'readingOExpr' in einem 'reading01OExpr' anlegt.

Beim set des attrTemplates wird derzeit das 'readingOExpr' gar nicht angelgt obwohl es im Template vorhanden ist. Ohne eine Recherche gemacht zu haben vermute ich, dass das 'readingOExpr' dem jeweiligen Regex (01, 02, ..) zugeordnet werden muss.

danke für den schnellen fix.

Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 05 Januar 2021, 11:35:25
readingOExpr funktioniert auch. Dann gilt es für alle Readings, die nicht ein eigenes readingXXOExpr haben.

Hab gerade getestet: attr gelöscht und wieder set attrTemplate gemacht. Es wird wieder angelegt. Was sagt die Log bei dir, und zeig bitte ein "list" von deinem HTTPMOD nach "set attrTemplate". Vielleicht gibt es irgendeinen anderen Konflikt
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: artoffhem am 05 Januar 2021, 13:02:31
anbei die Shritte die ich gemacht habe.

define ORFs HTTPMOD none 0
attr ORFs verbose 5

list ORFs
Internals:
   CFGFN     
   DEF        none 0
   FUUID      5ff44ea2-f33f-df76-6452-e1c8a4d91b9136ae
   Interval   0
   MainURL   
   ModuleVersion 4.0.16 - 5.12.2020
   NAME       ORFs
   NOTIFYDEV  global
   NR         282
   NTFY_ORDER 50-ORFs
   STATE      ???
   TYPE       HTTPMOD
Attributes:
   room       Wetter
   verbose    5


set ORFs attrTemplate ORF_weather

Fehlermeldung: Please define ORF_Weather first

LOG
2021.01.05 12:33:54 3: ORFs: URL is none, periodic updates will be limited to explicit GetXXPoll attribues (if defined)
2021.01.05 12:33:54 3: ORFs: interval is 0, no periodic updates will done.
2021.01.05 12:33:54 3: ORFs: Defined without URL featurelevel 6
2021.01.05 12:35:52 5: ORFs: set called with attrTemplate ORF_weather
2021.01.05 12:36:10 5: ORFs: set called with attrTemplate ORF_weather MAINURL=https://wetter.orf.at/salzburg/ STATIONNAME=saalbach
2021.01.05 12:36:10 5: AttrTemplate replace DEVICE=>ORFs,MAINURL=>https://wetter.orf.at/salzburg/,STATIONNAME=>saalbach,WHICHROOM=>Wetter
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs userattr get01Name get01Poll:0,1 get01URL get02-1Name get02-2Name get02-3Name get02-4Name get02-5Name get02-6Name get02-7Name get02-8Name get02Name get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs enableControlSet 1
2021.01.05 12:36:10 5: ORFs: UpdateHintList called
2021.01.05 12:36:10 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:10 5: ORFs: UpdateHintList: getlist =
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs get01Name Wetterdaten
2021.01.05 12:36:10 5: ORFs: ManageUserAttr updated userattr list to get01Poll:0,1 get01URL get02-1Name get02-2Name get02-3Name get02-4Name get02-5Name get02-6Name get02-7Name get02-8Name get02Name get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:10 5: ORFs: UpdateHintList called
2021.01.05 12:36:10 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:10 5: ORFs: UpdateHintList: getlist = Wetterdaten:noArg
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs get01Poll 1
2021.01.05 12:36:10 5: ORFs: ManageUserAttr updated userattr list to get01URL get02-1Name get02-2Name get02-3Name get02-4Name get02-5Name get02-6Name get02-7Name get02-8Name get02Name get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:10 5: ORFs: UpdateHintList called
2021.01.05 12:36:10 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:10 5: ORFs: UpdateHintList: getlist = Wetterdaten:noArg
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs get01URL https://wetter.orf.at/salzburg/saalbach/
2021.01.05 12:36:10 5: ORFs: ManageUserAttr updated userattr list to get02-1Name get02-2Name get02-3Name get02-4Name get02-5Name get02-6Name get02-7Name get02-8Name get02Name get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:10 5: ORFs: UpdateHintList called
2021.01.05 12:36:10 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:10 5: ORFs: UpdateHintList: getlist = Wetterdaten:noArg
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs get02-1Name sunRise
2021.01.05 12:36:10 5: ORFs: ManageUserAttr updated userattr list to get02-2Name get02-3Name get02-4Name get02-5Name get02-6Name get02-7Name get02-8Name get02Name get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:10 5: ORFs: UpdateHintList called
2021.01.05 12:36:10 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:10 5: ORFs: UpdateHintList: getlist = Wetterdaten:noArg
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs get02-2Name sunSet
2021.01.05 12:36:10 5: ORFs: ManageUserAttr updated userattr list to get02-3Name get02-4Name get02-5Name get02-6Name get02-7Name get02-8Name get02Name get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:10 5: ORFs: UpdateHintList called
2021.01.05 12:36:10 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:10 5: ORFs: UpdateHintList: getlist = Wetterdaten:noArg
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs get02-3Name moonPhase
2021.01.05 12:36:10 5: ORFs: ManageUserAttr updated userattr list to get02-4Name get02-5Name get02-6Name get02-7Name get02-8Name get02Name get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:10 5: ORFs: UpdateHintList called
2021.01.05 12:36:10 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:10 5: ORFs: UpdateHintList: getlist = Wetterdaten:noArg
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs get02-4Name moonRise
2021.01.05 12:36:10 5: ORFs: ManageUserAttr updated userattr list to get02-5Name get02-6Name get02-7Name get02-8Name get02Name get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:10 5: ORFs: UpdateHintList called
2021.01.05 12:36:10 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:10 5: ORFs: UpdateHintList: getlist = Wetterdaten:noArg
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs get02-5Name moonSet
2021.01.05 12:36:10 5: ORFs: ManageUserAttr updated userattr list to get02-6Name get02-7Name get02-8Name get02Name get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:10 5: ORFs: UpdateHintList called
2021.01.05 12:36:10 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:10 5: ORFs: UpdateHintList: getlist = Wetterdaten:noArg
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs get02-6Name dayLength
2021.01.05 12:36:10 5: ORFs: ManageUserAttr updated userattr list to get02-7Name get02-8Name get02Name get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:10 5: ORFs: UpdateHintList called
2021.01.05 12:36:10 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:10 5: ORFs: UpdateHintList: getlist = Wetterdaten:noArg
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs get02-7Name dawn
2021.01.05 12:36:10 5: ORFs: ManageUserAttr updated userattr list to get02-8Name get02Name get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:10 5: ORFs: UpdateHintList called
2021.01.05 12:36:10 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:10 5: ORFs: UpdateHintList: getlist = Wetterdaten:noArg
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs get02-8Name dusk
2021.01.05 12:36:10 5: ORFs: ManageUserAttr updated userattr list to get02Name get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:10 5: ORFs: UpdateHintList called
2021.01.05 12:36:10 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:10 5: ORFs: UpdateHintList: getlist = Wetterdaten:noArg
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs get02Name Astro-Daten
2021.01.05 12:36:10 5: ORFs: ManageUserAttr updated userattr list to get02Poll:0,1 get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:10 5: ORFs: UpdateHintList called
2021.01.05 12:36:10 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:10 5: ORFs: UpdateHintList: getlist = Astro-Daten:noArg Wetterdaten:noArg
2021.01.05 12:36:10 5: AttrTemplate exec attr ORFs get02Poll 1
2021.01.05 12:36:11 5: ORFs: ManageUserAttr updated userattr list to get02Regex get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:11 5: ORFs: UpdateHintList called
2021.01.05 12:36:11 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:11 5: ORFs: UpdateHintList: getlist = Astro-Daten:noArg Wetterdaten:noArg
2021.01.05 12:36:11 5: AttrTemplate exec attr ORFs get02Regex Sonnenaufgang um <\/span>(.*)<s[\w\W]*Sonnenuntergang um <\/span>(.*)<s\p{Any}*?Mondphase:\s?([^\.]+)[\w\W]*Mondaufgang um\s?<\/span>(\d\d:\d\d)<s[\w\W]*Monduntergang um <\/span>(\d\d:\d\d)<s[\w\W]*Tagesl[^>]+>(\d\d:\d\d)&[\w\W]*Morgen<\/span>: <\/span>(\d\d:\d\d)&[\w\W]*Abend:<\/span><\/span>(\d\d:\d\d)
2021.01.05 12:36:11 5: ORFs: ManageUserAttr updated userattr list to get02URL reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:11 5: ORFs: UpdateHintList called
2021.01.05 12:36:11 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:11 5: ORFs: UpdateHintList: getlist = Wetterdaten:noArg Astro-Daten:noArg
2021.01.05 12:36:11 5: AttrTemplate exec attr ORFs get02URL https://wetter.orf.at/salzburg/
2021.01.05 12:36:11 5: ORFs: ManageUserAttr updated userattr list to reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01Regex
2021.01.05 12:36:11 5: ORFs: UpdateHintList called
2021.01.05 12:36:11 5: ORFs: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue
2021.01.05 12:36:11 5: ORFs: UpdateHintList: getlist = Wetterdaten:noArg Astro-Daten:noArg
2021.01.05 12:36:11 5: AttrTemplate exec attr ORFs reading01Regex (?s)Temperatur.*?.*?>.*?(?<temperature>(−)?[\d,]+)&thinsp.*?Taupunkt.*?.*?>.*?(?<taupunkt>(−)?[\d,]+)&thinsp.*?Wind.*?>\n\s*(?<wind>[^<]+)\s<abbr.*?Windspitzen.*?>\n\s*(?<windspitzen>[^<]+)\s<abbr.*?Luftdruck.*?>\n\s*(?<luftdruck>[^<]+)\s<abbr.*?Luftfeuchtigkeit.*?>\n\s*(?<humidity>[^<]+)\s<abbr.*?Sonnenschein.*?>\n\s*(?<sonne>[^<]+)\s<abbr.*?Niederschlag.*?>\n\s*(?<rain>[^<\n]+).*?</p.*?(?<messwerte>Messwerte[^<\n]+)
2021.01.05 12:36:11 5: ORFs: ManageUserAttr updated userattr list to reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name
2021.01.05 12:36:11 5: AttrTemplate exec attr ORFs room Wetter
2021.01.05 12:36:11 5: AttrTemplate exec attr ORF_Weather readingOExpr $val =~ s/([\d]+),([\d]+) */$1.$2/ if $val =~ m{[\d]+,[\d]+ *\z};$val=~s/&minus\;/-/;$val
2021.01.05 12:36:11 5: AttrTemplate exec attr ORFs stateFormat W: wind, H: humidity%rH, T: temperature°C
2021.01.05 12:36:11 5: AttrTemplate exec attr ORFs model ORF_weather
2021.01.05 12:36:11 5: AttrTemplate exec setreading ORFs attrTemplateVersion 20201129


list ORFs readingOExpr scheint nicht auf
Internals:
   CFGFN     
   DEF        none 0
   FUUID      5ff44ea2-f33f-df76-6452-e1c8a4d91b9136ae
   Interval   0
   MainURL   
   ModuleVersion 4.0.16 - 5.12.2020
   NAME       ORFs
   NOTIFYDEV  global
   NR         282
   NTFY_ORDER 50-ORFs
   STATE      W: wind, H: humidity%rH, T: temperature°C
   TYPE       HTTPMOD
   CompiledRegexes:
   READINGS:
     2021-01-05 12:36:11   attrTemplateVersion 20201129
Attributes:
   enableControlSet 1
   get01Name  Wetterdaten
   get01Poll  1
   get01URL   https://wetter.orf.at/salzburg/saalbach/
   get02-1Name sunRise
   get02-2Name sunSet
   get02-3Name moonPhase
   get02-4Name moonRise
   get02-5Name moonSet
   get02-6Name dayLength
   get02-7Name dawn
   get02-8Name dusk
   get02Name  Astro-Daten
   get02Poll  1
   get02Regex Sonnenaufgang um <\/span>(.*)<s[\w\W]*Sonnenuntergang um <\/span>(.*)<s\p{Any}*?Mondphase:\s?([^\.]+)[\w\W]*Mondaufgang um\s?<\/span>(\d\d:\d\d)<s[\w\W]*Monduntergang um <\/span>(\d\d:\d\d)<s[\w\W]*Tagesl[^>]+>(\d\d:\d\d)&[\w\W]*Morgen<\/span>: <\/span>(\d\d:\d\d)&[\w\W]*Abend:<\/span><\/span>(\d\d:\d\d)
   get02URL   https://wetter.orf.at/salzburg/
   model      ORF_weather
   reading01Regex (?s)Temperatur.*?.*?>.*?(?<temperature>(&minus;)?[\d,]+)&thinsp.*?Taupunkt.*?.*?>.*?(?<taupunkt>(&minus;)?[\d,]+)&thinsp.*?Wind.*?>\n\s*(?<wind>[^<]+)\s<abbr.*?Windspitzen.*?>\n\s*(?<windspitzen>[^<]+)\s<abbr.*?Luftdruck.*?>\n\s*(?<luftdruck>[^<]+)\s<abbr.*?Luftfeuchtigkeit.*?>\n\s*(?<humidity>[^<]+)\s<abbr.*?Sonnenschein.*?>\n\s*(?<sonne>[^<]+)\s<abbr.*?Niederschlag.*?>\n\s*(?<rain>[^<\n]+).*?</p.*?(?<messwerte>Messwerte[^<\n]+)
   room       Wetter
   stateFormat W: wind, H: humidity%rH, T: temperature°C
   userattr   reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name
   verbose    5


get ORFs Wetterdaten
list ORFs  Komma ersetzung fehlt, und minus korrektur funktioniert auch nicht
Internals:
   BUSY       0
   CFGFN     
   DEF        none 0
   FUUID      5ff44ea2-f33f-df76-6452-e1c8a4d91b9136ae
   Interval   0
   MainURL   
   ModuleVersion 4.0.16 - 5.12.2020
   NAME       ORFs
   NOTIFYDEV  global
   NR         282
   NTFY_ORDER 50-ORFs
   STATE      W: West, 2, H: 88%rH, T: &minus;10,0°C
   TYPE       HTTPMOD
   value     
   CompiledRegexes:
   HTTPCookieHash:
     HopSession;:
       Name       HopSession
       Options    Path=/; Domain=.orf.at; HttpOnly
       Path       
       Value      127.0.0.81.3.204.1p3r08gexej2s
   HttpUtils:
     NAME       
     addr       https://wetter.orf.at:443
     auth       0
     buf       
     code       200
     compress   1
     conn       
     data       
     displayurl https://wetter.orf.at/salzburg/saalbach/
     header     
     host       wetter.orf.at
     httpheader HTTP/1.1 200 OK
Date: Tue, 05 Jan 2021 11:40:49 GMT
Server: Jetty(6.1.22)
X-Cache: MISS from 127.0.0.1
ETag: "wQJRb89Ey8up6Lgkah1nxw=="
Content-Length: 22625
Content-Type: text/html; charset=utf-8
Set-Cookie: HopSession=127.0.0.81.3.204.1p3r08gexej2s; Path=/; Domain=.orf.at; HttpOnly
Strict-Transport-Security: max-age=600
Vary: Accept-Encoding
Connection: close
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    443
     hu_portSfx
     ignoreredirects 1
     loglevel   4
     path       /salzburg/saalbach/
     protocol   https
     redirects  0
     timeout    2
     url        https://wetter.orf.at/salzburg/saalbach/
     sslargs:
   QUEUE:
   READINGS:
     2021-01-05 12:36:11   attrTemplateVersion 20201129
     2021-01-05 12:40:49   humidity        88
     2021-01-05 12:40:49   luftdruck       896
     2021-01-05 12:40:49   messwerte       Messwerte von 12.00 Uhr
     2021-01-05 12:40:49   rain            0,0
     2021-01-05 12:40:49   sonne           0
     2021-01-05 12:40:49   taupunkt        &minus;11,7
     2021-01-05 12:40:49   temperature     &minus;10,0
     2021-01-05 12:40:49   wind            West, 2
     2021-01-05 12:40:49   windspitzen     West, 4
   REQUEST:
     context    get
     data       
     header     
     ignoreredirects 0
     num        01
     retryCount 0
     type       get01
     url        https://wetter.orf.at/salzburg/saalbach/
     value     
   defptr:
     readingBase:
       humidity   reading
       luftdruck  reading
       messwerte  reading
       rain       reading
       sonne      reading
       taupunkt   reading
       temperature reading
       wind       reading
       windspitzen reading
     readingNum:
       humidity   01
       luftdruck  01
       messwerte  01
       rain       01
       sonne      01
       taupunkt   01
       temperature 01
       wind       01
       windspitzen 01
     readingOutdated:
     requestReadings:
       get01:
         humidity   reading 01
         luftdruck  reading 01
         messwerte  reading 01
         rain       reading 01
         sonne      reading 01
         taupunkt   reading 01
         temperature reading 01
         wind       reading 01
         windspitzen reading 01
Attributes:
   enableControlSet 1
   get01Name  Wetterdaten
   get01Poll  1
   get01URL   https://wetter.orf.at/salzburg/saalbach/
   get02-1Name sunRise
   get02-2Name sunSet
   get02-3Name moonPhase
   get02-4Name moonRise
   get02-5Name moonSet
   get02-6Name dayLength
   get02-7Name dawn
   get02-8Name dusk
   get02Name  Astro-Daten
   get02Poll  1
   get02Regex Sonnenaufgang um <\/span>(.*)<s[\w\W]*Sonnenuntergang um <\/span>(.*)<s\p{Any}*?Mondphase:\s?([^\.]+)[\w\W]*Mondaufgang um\s?<\/span>(\d\d:\d\d)<s[\w\W]*Monduntergang um <\/span>(\d\d:\d\d)<s[\w\W]*Tagesl[^>]+>(\d\d:\d\d)&[\w\W]*Morgen<\/span>: <\/span>(\d\d:\d\d)&[\w\W]*Abend:<\/span><\/span>(\d\d:\d\d)
   get02URL   https://wetter.orf.at/salzburg/
   model      ORF_weather
   reading01Regex (?s)Temperatur.*?.*?>.*?(?<temperature>(&minus;)?[\d,]+)&thinsp.*?Taupunkt.*?.*?>.*?(?<taupunkt>(&minus;)?[\d,]+)&thinsp.*?Wind.*?>\n\s*(?<wind>[^<]+)\s<abbr.*?Windspitzen.*?>\n\s*(?<windspitzen>[^<]+)\s<abbr.*?Luftdruck.*?>\n\s*(?<luftdruck>[^<]+)\s<abbr.*?Luftfeuchtigkeit.*?>\n\s*(?<humidity>[^<]+)\s<abbr.*?Sonnenschein.*?>\n\s*(?<sonne>[^<]+)\s<abbr.*?Niederschlag.*?>\n\s*(?<rain>[^<\n]+).*?</p.*?(?<messwerte>Messwerte[^<\n]+)
   room       Wetter
   stateFormat W: wind, H: humidity%rH, T: temperature°C
   userattr   reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name
   verbose    5


attr ORFs userattr ... readingOExpr
attr ORFs readingOExpr $val =~ s/([\d]+),([\d]+) */$1.$2/ if $val =~ m{[\d]+,[\d]+ *\z};$val=~s/&minus\;/-/;$val
get ORFs Wetterdaten
list ORFs
Internals:
   BUSY       0
   CFGFN     
   DEF        none 0
   FUUID      5ff44ea2-f33f-df76-6452-e1c8a4d91b9136ae
   Interval   0
   MainURL   
   ModuleVersion 4.0.16 - 5.12.2020
   NAME       ORFs
   NOTIFYDEV  global
   NR         282
   NTFY_ORDER 50-ORFs
   STATE      W: West, 2, H: 88%rH, T: -10.0°C
   TYPE       HTTPMOD
   value     
   CompiledRegexes:
   HTTPCookieHash:
     HopSession;:
       Name       HopSession
       Options    Path=/; Domain=.orf.at; HttpOnly
       Path       
       Value      127.0.0.81.3.204.1plpx55t5uxi5
   HttpUtils:
     NAME       
     addr       https://wetter.orf.at:443
     auth       0
     buf       
     code       200
     compress   1
     conn       
     data       
     displayurl https://wetter.orf.at/salzburg/saalbach/
     header     Cookie: HopSession=127.0.0.81.3.204.1p3r08gexej2s
     host       wetter.orf.at
     httpheader HTTP/1.1 200 OK
Date: Tue, 05 Jan 2021 11:58:53 GMT
Server: Jetty(6.1.22)
X-Cache: MISS from 127.0.0.1
ETag: "wQJRb89Ey8up6Lgkah1nxw=="
Content-Length: 22625
Content-Type: text/html; charset=utf-8
Set-Cookie: HopSession=127.0.0.81.3.204.1plpx55t5uxi5; Path=/; Domain=.orf.at; HttpOnly
Strict-Transport-Security: max-age=600
Vary: Accept-Encoding
Connection: close
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    443
     hu_portSfx
     ignoreredirects 1
     loglevel   4
     path       /salzburg/saalbach/
     protocol   https
     redirects  0
     timeout    2
     url        https://wetter.orf.at/salzburg/saalbach/
     sslargs:
   QUEUE:
   READINGS:
     2021-01-05 12:36:11   attrTemplateVersion 20201129
     2021-01-05 12:58:53   humidity        88
     2021-01-05 12:58:53   luftdruck       896
     2021-01-05 12:58:53   messwerte       Messwerte von 12.00 Uhr
     2021-01-05 12:58:53   rain            0.0
     2021-01-05 12:58:53   sonne           0
     2021-01-05 12:58:53   taupunkt        -11.7
     2021-01-05 12:58:53   temperature     -10.0
     2021-01-05 12:58:53   wind            West, 2
     2021-01-05 12:58:53   windspitzen     West, 4
   REQUEST:
     context    get
     data       
     header     
     ignoreredirects 0
     num        01
     retryCount 0
     type       get01
     url        https://wetter.orf.at/salzburg/saalbach/
     value     
   defptr:
     readingBase:
       humidity   reading
       luftdruck  reading
       messwerte  reading
       rain       reading
       sonne      reading
       taupunkt   reading
       temperature reading
       wind       reading
       windspitzen reading
     readingNum:
       humidity   01
       luftdruck  01
       messwerte  01
       rain       01
       sonne      01
       taupunkt   01
       temperature 01
       wind       01
       windspitzen 01
     readingOutdated:
     requestReadings:
       get01:
         humidity   reading 01
         luftdruck  reading 01
         messwerte  reading 01
         rain       reading 01
         sonne      reading 01
         taupunkt   reading 01
         temperature reading 01
         wind       reading 01
         windspitzen reading 01
Attributes:
   enableControlSet 1
   get01Name  Wetterdaten
   get01Poll  1
   get01URL   https://wetter.orf.at/salzburg/saalbach/
   get02-1Name sunRise
   get02-2Name sunSet
   get02-3Name moonPhase
   get02-4Name moonRise
   get02-5Name moonSet
   get02-6Name dayLength
   get02-7Name dawn
   get02-8Name dusk
   get02Name  Astro-Daten
   get02Poll  1
   get02Regex Sonnenaufgang um <\/span>(.*)<s[\w\W]*Sonnenuntergang um <\/span>(.*)<s\p{Any}*?Mondphase:\s?([^\.]+)[\w\W]*Mondaufgang um\s?<\/span>(\d\d:\d\d)<s[\w\W]*Monduntergang um <\/span>(\d\d:\d\d)<s[\w\W]*Tagesl[^>]+>(\d\d:\d\d)&[\w\W]*Morgen<\/span>: <\/span>(\d\d:\d\d)&[\w\W]*Abend:<\/span><\/span>(\d\d:\d\d)
   get02URL   https://wetter.orf.at/salzburg/
   model      ORF_weather
   reading01Regex (?s)Temperatur.*?.*?>.*?(?<temperature>(&minus;)?[\d,]+)&thinsp.*?Taupunkt.*?.*?>.*?(?<taupunkt>(&minus;)?[\d,]+)&thinsp.*?Wind.*?>\n\s*(?<wind>[^<]+)\s<abbr.*?Windspitzen.*?>\n\s*(?<windspitzen>[^<]+)\s<abbr.*?Luftdruck.*?>\n\s*(?<luftdruck>[^<]+)\s<abbr.*?Luftfeuchtigkeit.*?>\n\s*(?<humidity>[^<]+)\s<abbr.*?Sonnenschein.*?>\n\s*(?<sonne>[^<]+)\s<abbr.*?Niederschlag.*?>\n\s*(?<rain>[^<\n]+).*?</p.*?(?<messwerte>Messwerte[^<\n]+)
   readingOExpr $val =~ s/([\d]+),([\d]+) */$1.$2/ if $val =~ m{[\d]+,[\d]+ *\z};$val=~s/&minus\;/-/;$val
   room       Wetter
   stateFormat W: wind, H: humidity%rH, T: temperature°C
   userattr   reading01-1Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name


danke
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 05 Januar 2021, 13:08:23
Ok, Fehler im Template, danke.
Es steht:
attr ORF_Weather readingOExpr $val =~ s/([\d]+),([\d]+) */$1.$2/ if $val =~ m{[\d]+,[\d]+ *\z};$val=~s/&minus\;/-/;$val

Was nur funktioniert, wenn das Device ORF_Weather heisst

attr DEVICE readingOExpr $val =~ s/([\d]+),([\d]+) */$1.$2/ if $val =~ m{[\d]+,[\d]+ *\z};$val=~s/&minus\;/-/;$val
wäre besser ;)

EDIT: hab die Korrektur eingecheckt
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: artoffhem am 05 Januar 2021, 13:23:30
perfekt, das scheint die Lösung zu sein.
eventuell bitte noch das attrTemplateVersion aktualisieren.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 05 Januar 2021, 13:29:07
Das habe ich vergessen. Ist aber nicht so schlimm. Ich mache es beim nächsten Einchecken.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: artoffhem am 05 Januar 2021, 14:16:37
weil ich gerade dabei bin habe ich mir auch noch die Astro-Daten angesehen, die momentan nicht funktionieren. Der Grund dürfte das Regex für dayLength sein, dass 00:00 erwartert, jedoch momentan 0:00 ist. ORF liefert hier im Gegensatz zu anderen Zeiten keine führende NULL aus.
... [\w\W]*Tagesl[^>]+>(\d\d:\d\d)&[\w\W]* ...

meine Lösung würde so aussehen
... [\w\W]*Tagesl[^>]+>([\d]+:\d\d)&[\w\W]* ...

ORF Astro-Daten
      <div class="details">
         <div class="sunData">
            <p class="rise" title="Sonnenaufgang"><span class="offscreen">Sonnenaufgang um </span>07:56<span class="offscreen"> Uhr.</span></p>
            <p class="set" title="Sonnenuntergang"><span class="offscreen">Sonnenuntergang um </span>16:31<span class="offscreen"> Uhr.</span></p>
         </div>

         <div class="moonData">
            <p class="offscreen">Mondphase: Abnehmender Halbmond.</p>
            <p class="rise" title="Mondaufgang"><span class="offscreen">Mondaufgang um </span>23:48<span class="offscreen"> Uhr.</span></p>
            <p class="set" title="Monduntergang"><span class="offscreen">Monduntergang um </span>11:40<span class="offscreen"> Uhr.</span></p>
         </div>
      </div>

      <div class="extendedDetails">
         <p><span class="label">Tagesl&auml;nge: </span>8:34&thinsp;<abbr title="Stunden">h</abbr></p>
         <p><span class="label">D&auml;mmerung<span class="offscreen"> Morgen</span>: </span>07:21&thinsp;Uhr</p>
         <p><span class="label"><span class="offscreen">D&auml;mmerung Abend:</span></span>17:06&thinsp;Uhr</p>
      </div>
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: amenomade am 09 Januar 2021, 01:03:13
Hab die Korrektur eingecheckt. Danke Dir :)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: antonwinden am 04 April 2021, 08:35:44
Habe hier ein komisches Problem:
Wetter von ORF Neusiedl am See (https://wetter/orf/at/burgenland/neusiedlsee) funktioniert ohne Probleme.
Nur wenn ich Podersdorf auswähle stürzt mein Fhem ab -> https://wetter/orf/at/burgenland/podersdorf

die letzten Zeilen im Log sind:
   <script type="text/javascript">,
   var ivwPrefix = "RedCont/Wetter/Oesterreichwetter/v2wet/v2bgl/v2lawe/station/";,
   var oewa_data = {,
           "cn": "at",,
           "st": "at_w_atorf",,
           "sv": "in",,
           "ps": "lin",,
           "cp": "RedCont/Wetter/Oesterreichwetter/v2wet/v2bgl/v2lawe/station/",,
           "sc": "yes",
         };,,
>,
,
,
</body>,
</html>,
,
,
2021.04.04 08:27:43.239 4: ORFp: BodyDecode is not decoding the response body (charset utf-8, bodyDecode defaults to none),
2021.04.04 08:27:43.239 5: ORFp: GetCookies is looking for Cookies,
2021.04.04 08:27:43.239 4: ORFp: GetCookies parsed Cookie: HopSession Wert 127.0.0.178.18.171.8214try4wwf0 Rest Path=/; Domain=.orf.at; HttpOnly,
2021.04.04 08:27:43.239 5: ORFp: ExtractSid called, context get, num 01,
2021.04.04 08:27:43.239 4: ORFp: checking for redirects, code=200, ignore=0,
2021.04.04 08:27:43.239 4: ORFp: no redirects to handle,
2021.04.04 08:27:43.239 5: ORFp: Read callback sets LAST_REQUEST to get01,
2021.04.04 08:27:43.239 5: ORFp: CheckAuth decided no authentication required,
2021.04.04 08:27:43.240 5: ORFp: ExtractReading for context get, num 01 - no individual parse definition,
2021.04.04 08:27:43.240 5: ORFp: UpdateReadingList created list of reading.* nums to parse during getUpdate as 01,
2021.04.04 08:27:43.240 5: ORFp: Read starts parsing response to get01 with defined readings: 01,
2021.04.04 08:27:43.240 5: ORFp: ExtractReading reading01 with regex /(?^:(?s)Temperatur.*?.*?>.*?(?<temperature>(&minus;)?[\d,]+)&thinsp.*?Taupunkt.*?.*?>.*?(?<taupunkt>(&minus;)?[\d,]+)&thinsp.*?Wind.*?>\n\s*(?<wind>[^<]+)\s<abbr.*?Windspitzen.*?>\n\s*(?<windspitzen>[^<]+)\s<abbr.*?Luftdruck.*?>\n\s*(?<luftdruck>[^<]+)\s<abbr.*?Luftfeuchtigkeit.*?>\n\s*(?<humidity>[^<]+)\s<abbr.*?Sonnenschein.*?>\n\s*(?<sonne>[^<]+)\s<abbr.*?Niederschlag.*?>\n\s*(?<rain>[^<\n]+).*?</p.*?(?<messwerte>Messwerte[^<\n]+))/...,

danach kommt nichts mehr...
kann auch mit neusiedl am See gut leben...
gruß Anton
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 23 April 2021, 10:53:00
Wegen Änderung einiger Readings nach Upgrade auf 9.4.0 kleine Anpassung am HTTPMOD tasmota_firmware_check (analog zum JsonMod Template (https://forum.fhem.de/index.php/topic,110350.msg1151612.html#msg1151612)):
#Contributed by OdfFHEM, see https://forum.fhem.de/index.php/topic,97694.msg992348.html#msg992348
name:tasmota_firmware_updates
filter:TYPE=HTTPMOD
desc: Check Tasmota homepage for available new firmware files<br>Define a HTTPMOD device like <br>define tasmotaupdates HTTPMOD https://github.com/arendst/Tasmota/tags 86400<a href="https://forum.fhem.de/index.php/topic,97694.msg992308.html#msg992308">Source: Forum</a>.
order:TECHZ06
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:UPDATABLEDEVICESMODE;Actual mode for updatableDevices, defaults to onlyUpdatable; {AttrVal("DEVICE","updatableDevicesMode","onlyUpdatable")}
par:INTERVAL;Actual interval for updating, defaults to one week; {InternalVal("DEVICE","Interval","604800")}
defmod DEVICE HTTPMOD https://github.com/arendst/Tasmota/tags INTERVAL
attr DEVICE userattr reading01Name reading01Regex reading02Name reading02OExpr reading02Regex updatableDevicesMode:onlyUpdatable,all
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 0
attr DEVICE reading01Name latestVersion
attr DEVICE reading01Regex commit-title">[\w\W]*?<a href=".*">[\w\W]*?v(\d*.\d*.\d*)[\w\W]*?</a>
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})$/ ;; "$3.$2.$1"
attr DEVICE reading02Regex relative-time[\w\W]*?datetime="(\d*-\d*-\d*)T\d*:\d*:\d*Z"
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat { my $ret ="";;\
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;\
    $ret .= '<div style="text-align:left;;">';;\
    $ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" target="_blank">tasmota</a>-check => '.$lastCheck;;\
    $ret .= '<br><br><pre>';;\
    $ret .= "| device                           | current |   new   |  released  |<br>";;\
    $ret .= "---------------------------------------------------------------------<br>";;\
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
    if($check eq "no updates needed!") {\
      $ret .= '| <b style="color:green;;">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } elsif($check eq "error => no or wrong data from server!") {\
      $ret .= '| <b style="color:red;;">';;\
      $ret .= sprintf("%-65s",$check);;\
      $ret .= '</b> |';;\
    } else {\
      my @devices = split(',',$check);;\
      foreach my $devStr (@devices) {\
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
        $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;\
        $ret .= '</b></a> | ';;\
        $ret .= '<b style="color:lightgray;;">';;\
        $ret .= '<a href="http://'.ReadingsVal($dev,"Info2_IPAddress",ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0"))).'/up" target="_blank">';;\
        $ret .= sprintf("%7s",$old);;\
        $ret .= '</a></b> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:red;;">';;\
        $ret .= sprintf("%7s",$new);;\
        $ret .= '</b></a> | ';;\
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
        $ret .= '<b style="color:black;;">';;\
        $ret .= sprintf("%-10s",$date);;\
        $ret .= '</b></a>';;\
        $ret .= " |<br>";;\
      }\
    }\
    $ret .= '</pre></div>';;\
  return $ret;;\
}
attr DEVICE timestamp-on-change-reading .*
attr DEVICE updatableDevicesMode UPDATABLEDEVICESMODE
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=INFO1_Version!=")) {\
      my $version = ReadingsVal($dev,"Info1_Version",ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0")));;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if ( AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION ) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model tasmota_firmware_updates
setreading DEVICE attrTemplateVersion 20210423
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: mähschaf am 18 Mai 2021, 17:49:04
[quote author=yersinia link=topic=97694.msg1151626#msg1151626 date=1619167980]
setreading DEVICE attrTemplateVersion 20210423

[/quote]

Hallo,

bei mir ist trotz Updates die - nicht funktionierende - attrTemplateVersion 20201129 verfügbar/installiert.

Wie komme ich am geschicktesten an die neue Version?

Viele Grüße und besten Dank
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Otto123 am 18 Mai 2021, 17:59:01
Zitat von: mähschaf am 18 Mai 2021, 17:49:04

Wie komme ich am geschicktesten an die neue Version?

{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: mähschaf am 18 Mai 2021, 18:07:35
Hallo Otto,

danke für die prompte Hilfe.

Damit müsste doch eigentlich folgende Datei auf meinem Server landen, oder?

https://svn.fhem.de/fhem/trunk/fhem/FHEM/lib/AttrTemplate/httpmod.template (https://svn.fhem.de/fhem/trunk/fhem/FHEM/lib/AttrTemplate/httpmod.template)

Die müsste bei einem normalen "update" doch auch gezogen werden, oder nicht?

Das Problem scheint mir zu sein, dass diese Datei die alte Version enthält.....

setreading DEVICE attrTemplateVersion 20201129
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Otto123 am 18 Mai 2021, 18:13:13
sorry meine Zeile war für mqtt2 musst Du den Namen austauschen:
{ Svn_GetFile("FHEM/lib/AttrTemplate/httpmod.template", "FHEM/lib/AttrTemplate/httpmod.template", sub(){ AttrTemplate_Initialize() }) }

nach einem Update ohne Neustart muss eventuell das ausgeführt werden?:
{ AttrTemplate_Initialize() }
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: mähschaf am 18 Mai 2021, 18:16:07
Hallo Otto,

ja, das war mir auch aufgefallen.

Kann es trotzdem sein, dass der Stand des httpmod.template im SVN veraltet ist?

Oder verstehe ich etwas falsch?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Otto123 am 18 Mai 2021, 20:02:23
Du hast sicher Recht: Im SVN ist die Version 23490 09.01.2021 00:02:35

Und von Beta-User gab es nach dem Beitrag von  yersinia keinen Beitrag: "... ich habe ferdisch ... " ;)

im Kopf steht "#Contributed by OdfFHEM ..." mmh soll ich das jetzt einfach einchecken? Könnte ich machen  :-\ Edit: ich war im falschen Film  :o
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 19 Mai 2021, 09:07:58
Ich denke, mein Änderungsvorschlag ist obsolet wegen (https://forum.fhem.de/index.php/topic,94494.msg1155541.html#msg1155541):
Zitat von: Beta-User am 10 Mai 2021, 14:41:50
_Mit_ j2nv geht wohl nicht, aber _vor_ sollte gehen:

attr DEVICE readingList \
  TELETOPIC/INFO.:.* { $EVENT =~ m,^..Info[1-3]..(.+).$, ?  json2nameValue($1,'',$JSONMAP) : json2nameValue($EVENT,'',$JSONMAP) }

Daher wird Beta-User den nun offensichtlich nicht mehr benötigten 'patch' nicht übernommen haben, vermute ich.
MMn würde meine Änderung nicht schaden, wäre auch abwärtskompatibel - aber bedeutet auch insgesamt mehr (ie unübersichtlichen) Code.

Die Lorbeeren für dieses Template gehören OdfFHEM.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 19 Mai 2021, 10:20:28
Zitat von: yersinia am 19 Mai 2021, 09:07:58
[...] Daher wird Beta-User
Zur Klarstellung: Maintainer für httpmod.template ist seit längerem amenomade ;) . Ich gedenke daher im Moment nicht, Vorschläge für neue attrTemplate aus eigenem Antrieb einzupflegen, zumal ich für HTTPMOD wirklich nach wie vor nicht kompetent bin...

Was die IP-Adress-Thematik angeht, finde ich den Vorschlag mit der Erweiterung auf das "normale" j2nv()-Ergebnis aber gut, weil der HTTPMOD dann auch für die paßt, die - aus welchem Grund auch immer -  an der Stelle ihre readingList nicht anpassen wollen. Die Frage ist mAn. allenfalls, was als erstes geprüft und wie der Ausdruck effizienterweise notiert werden sollte.

Würde folgende Variante der betreffenden Zeile ins Spiel bringen:
$ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;\
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 19 Mai 2021, 10:56:47
Zitat von: Beta-User am 19 Mai 2021, 10:20:28Zur Klarstellung: Maintainer für httpmod.template ist seit längerem amenomade ;).
Stimmt. ::)
Zitat von: Beta-User am 19 Mai 2021, 10:20:28Würde folgende Variante der betreffenden Zeile ins Spiel bringen:
$ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;\
Dies setzt voraus, dass, wie du schreibst, das readingsList in dem MQTT2 Device entsprechend aktualisiert worden ist. Alternativ steht immernoch diese Kaskade als Vorschlag:
$ret .= '<a href="http://'.ReadingsVal($dev,"Info2_IPAddress",ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0"))).'/up" target="_blank">';;\
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 19 Mai 2021, 11:04:38
Zitat von: yersinia am 19 Mai 2021, 10:56:47
Dies setzt voraus, dass, wie du schreibst, das readingsList in dem MQTT2 Device entsprechend aktualisiert worden ist.
Vermutlich übersehe ich was wichtiges, bin aber auch nach nochmaligem Drübersehen der Ansicht, dass mein Vorschlag "effizienter" ist, weil a) alle alten und "neuen" (via aktuellem mqtt2-template "zurechtgebogenen") Fälle bereits in Stufe 1 abgedeckt sind und nur die (unterstellt wenigen) Fälle, die mit INFO2.* arbeiten (firmware-update ohne Änderung der readingList) dann als Ersatzwert in Stufe 2 ausgewertet werden.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 19 Mai 2021, 11:51:56
MAn übersiehst du nichts. Und ja, dein Weg ist effizienter/eleganter weil es näher an der Ursache ansetzt als hier nur die Symptome zu behandeln.
Dies setzt allerdings voraus, dass der Anwender deinen effizienten/eleganten Weg implementiert - oder gar einen Zusammenhang zwischen HTTPMOD-fw-check und mqtt-Device-Template herstellt und dann selbstständig (!) letzteres aktualisiert. Und irgendwie zweifel ich nicht daran, dass es nicht doch den ein oder anderen geben wird, der das übersieht. ;)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 19 Mai 2021, 12:07:41
Wir sind uns einig: Es wird einige geben, die über diese (mAn. völlig unnötige) Änderung in Tasmota stolpern werden, ob nun im Rahmen von HTTPMOD oder MQTT2_DEVICE oder beidem...

Ziel sollte sein, dass ein Anwender, der jetzt einsteigt, ein "konsistentes" Erlebnis hat - dafür würde die Aktualisierung auf der MQTT2_DEVICE-Seite ausreichen. Vorausgesetzt, der Anwender nutzt diese Option. Macht er das nicht, ist er (tendenziell) in der Minderheit und muss dann damit "leben", dass er den etwas ineffizienteren "2. Ast" beschreitet, wenn er nur den HTTPMOD verwendet...

Aber auch dann sollte er mAn. mit der kurzen Fassung zum richtigen Ergebnis kommen, oder?
(Vorausgesetzt, er löscht das veraltete Reading, sollte das noch auf eine nicht mehr zutreffende IP verweisen). Nur auf diesen Fall (kein update der readingList in M2D) bezog sich die Frage, ob ich was übersehe.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 19 Mai 2021, 12:20:01
Ja, wir sind uns einig. :)
Zitat von: Beta-User am 19 Mai 2021, 12:07:41Aber auch dann sollte er mAn. mit der kurzen Fassung zum richtigen Ergebnis kommen, oder?
(Vorausgesetzt, er löscht das veraltete Reading, sollte das noch auf eine nicht mehr zutreffende IP verweisen). Nur auf diesen Fall (kein update der readingList in M2D) bezog sich die Frage, ob ich was übersehe.
Neee, weil (list Auszug eines meiner tasmota mqtt2 devices mit template ohne readingsList update):
READINGS:
     2021-04-23 09:54:59   Info1_Version   9.4.0(tasmota)
     2021-04-23 09:54:59   Info2_IPAddress 192.168.60.21
     2021-04-23 09:51:27   attrTemplateVersion 20200828
Attributes:
   readingList tele/IPTelefon/LWT:.* LWT
  tele/IPTelefon/STATE:.* { json2nameValue($EVENT,'',$JSONMAP) }
  tele/IPTelefon/SENSOR:.* { json2nameValue($EVENT,'',$JSONMAP) }
  tele/IPTelefon/INFO.:.* { json2nameValue($EVENT,'',$JSONMAP) }
  tele/IPTelefon/UPTIME:.* { json2nameValue($EVENT,'',$JSONMAP) }
  stat/IPTelefon/POWER1:.* state
  stat/IPTelefon/RESULT:.* { json2nameValue($EVENT,'',$JSONMAP) }

bekommst du mit
$ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;\
nicht abgegriffen. Ich weiss nicht, ob es in irgendeinem (tasmota-) MQTT2 Device mit template noch ein reading INFO2.* gibt/geben wird.
Daher auch
$ret .= '<a href="http://'.ReadingsVal($dev,"Info2_IPAddress",ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0"))).'/up" target="_blank">';;\
obgleich mir die Reihenfolge egal ist, gern auch:
$ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress",ReadingsVal($dev,"Info2_IPAddress","0.0.0.0"))).'/up" target="_blank">';;\
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 19 Mai 2021, 12:26:53
Zitat von: yersinia am 19 Mai 2021, 12:20:01
Neee, weil (list Auszug eines meiner tasmota mqtt2 devices mit template ohne readingsList update):
READINGS:
     2021-04-23 09:54:59   Info1_Version   9.4.0(tasmota)
     2021-04-23 09:54:59   Info2_IPAddress 192.168.60.21
     2021-04-23 09:51:27   attrTemplateVersion 20200828

bekommst du mit
$ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;\
nicht abgegriffen.
Die Argumentation verstehe ich immer noch nicht.
Greift
ReadingsVal($dev,"IPAddress",
ins Leere (wie in deinem list), kommt der Ersatzwert zum Zug. Und der verweist doch auf die richtige Stelle, oder?
ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")
Ist also mAn. nur eine Reihenfolgefrage bei der Prüfung, aber keine effektiv andere Funktionalität.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 19 Mai 2021, 12:30:54
Ich gehe davon aus, dass ReadingsVal case-sensitive ist:
ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")
versus
     2021-04-23 09:54:59   Info2_IPAddress 192.168.60.21

Oder wird Info2_IPAddress über INFO2_IPAddress gefunden?  ???
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 19 Mai 2021, 12:38:51
Argh, hatte das übersehen, dass es zwei Schreibweisen von "INFO2" geben könnte :o :-[ ...
Aber klar, autocreate complex macht den "großen" Prefix (diese Änderung bei Tasmota: was ein M...! >:( ) ::) .

Tendenziell würde ich nur die beiden "Hauptfälle" abdecken, also a) alte Schreibweise und b) neue (Info2_IPAddress), wie sie sich ergibt, wenn man das "einfache" j2nv() machen läßt. (Wer complex haben will, wird sich zu helfen wissen).
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: mähschaf am 19 Mai 2021, 16:32:42
Hallo, ich nochmal :-)

Zitat von: yersinia am 19 Mai 2021, 11:51:56
Dies setzt allerdings voraus, dass der Anwender deinen effizienten/eleganten Weg implementiert - oder gar einen Zusammenhang zwischen HTTPMOD-fw-check und mqtt-Device-Template herstellt und dann selbstständig (!) letzteres aktualisiert.

Danke für den Hinweis, das hatte ich bisher nicht. Es war mir auch nicht klar, dass das Tasmota-Update auf 9.4.0 Reading-Namen ändert...
Ich habe den Code von Dir, yersina, manuell in die Datei übernommen. Nach einem Neustart der Tasmota-Geräte stimmte dann auch die FW-Version im FW-Update-Device wieder.

Zitat von: Beta-User am 19 Mai 2021, 12:07:41
Ziel sollte sein, dass ein Anwender, der jetzt einsteigt, ein "konsistentes" Erlebnis hat - dafür würde die Aktualisierung auf der MQTT2_DEVICE-Seite ausreichen. Vorausgesetzt, der Anwender nutzt diese Option. Macht er das nicht, ist er (tendenziell) in der Minderheit und muss dann damit "leben", dass er den etwas ineffizienteren "2. Ast" beschreitet, wenn er nur den HTTPMOD verwendet...

Aber auch dann sollte er mAn. mit der kurzen Fassung zum richtigen Ergebnis kommen, oder?
(Vorausgesetzt, er löscht das veraltete Reading, sollte das noch auf eine nicht mehr zutreffende IP verweisen). Nur auf diesen Fall (kein update der readingList in M2D) bezog sich die Frage, ob ich was übersehe.

Das bedeutet: Lösche ich die alten Readings "Version" und "IPAdress" im MQTT2-Tasmota-Device, wäre evt. alles wieder gut?
Ich habe mich übrigens zwischendurch gefragt, ob es evt. ein AttrTemplate für die Tasmota-Devices gibt, das diese Arbeit übernimmt? Gibt es sowas? Außerdem habe ich mich gefragt, ob es evt. einen Befehl "update readings" gibt. Aber gefunden habe ich nichts entsprechendes, also komme ich wohl um das deleteReading nicht herum...

Danke für Eure Hilfe, ich hoffe, ich beanspruche Euch nicht über Gebühr...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 19 Mai 2021, 16:44:33
Zitat von: mähschaf am 19 Mai 2021, 16:32:42
Das bedeutet: Lösche ich die alten Readings "Version" und "IPAdress" im MQTT2-Tasmota-Device, wäre evt. alles wieder gut?
Ich habe mich übrigens zwischendurch gefragt, ob es evt. ein AttrTemplate für die Tasmota-Devices gibt, das diese Arbeit übernimmt? Gibt es sowas? Außerdem habe ich mich gefragt, ob es evt. einen Befehl "update readings" gibt. Aber gefunden habe ich nichts entsprechendes, also komme ich wohl um das deleteReading nicht herum...
...ist zwar keine Frage zu httpmod.template, aber trotzdem an der Stelle:
Ein "upgrade"-attrTemplate für bestehende readingList-Attribute gibt es nicht - wer mag, darf eines erstellen.

Was immer geht: Schauen, welches "model" es war und genau das wieder anwenden (vorher checken, ob man was geändert hat). In der Regel sollte die Funktionalität "neu" dann der Funktionalität "alt" entsprechen. Es gibt auch seit längerem ein "versions"-Reading, aus dem sich der Stand des aktuell angewendeten "model" ergibt - ggf. kann man dann im svn über die Änderungshistorie rausfinden, was genau (seitdem) anders ist...

Achtung: attrTemplate anwenden löscht fast alle Readings, damit werden auch die "unnötigen" beseitigt, die nicht (mehr) zum aktuellen Stand passen.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 19 Mai 2021, 16:47:35
Zitat von: Beta-User am 19 Mai 2021, 12:38:51Tendenziell würde ich nur die beiden "Hauptfälle" abdecken, also a) alte Schreibweise und b) neue (Info2_IPAddress), wie sie sich ergibt, wenn man das "einfache" j2nv() machen läßt. (Wer complex haben will, wird sich zu helfen wissen).
Guter Vorschlag, meine Zustimmung hast du.
$ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"Info2_IPAddress","0.0.0.0")).'/up" target="_blank">';;\
:)

Zitat von: mähschaf am 19 Mai 2021, 16:32:42Das bedeutet: Lösche ich die alten Readings "Version" und "IPAdress" im MQTT2-Tasmota-Device, wäre evt. alles wieder gut?
Ich habe mich übrigens zwischendurch gefragt, ob es evt. ein AttrTemplate für die Tasmota-Devices gibt, das diese Arbeit übernimmt? Gibt es sowas? Außerdem habe ich mich gefragt, ob es evt. einen Befehl "update readings" gibt. Aber gefunden habe ich nichts entsprechendes, also komme ich wohl um das deleteReading nicht herum...
Ja, für viele Tasmota-Geräte gibt es Templates, da diese auch über MQTT2 eingebunden werden können, siehe hier -> mqtt2.template: Contributing (https://forum.fhem.de/index.php/topic,94495.0.html) (für Fragen, Bugs usw: mqtt2.template: bugs, Fragen, Anregungen (https://forum.fhem.de/index.php/topic,94494.0.html); letzte SVN-Version der Templates (https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/mqtt2.template))
Teile der Readings und Attribute können, wie bei den httmod templates übrigens auch, via
set [DEVICE] attrTemplate [TEMPLATE]
geändert aber auch aktualisiert (ie bestehende Werte werden überschrieben) werden.

Alte Readings müssen ggf händisch gelöscht werden.
Zitat von: Beta-User am 19 Mai 2021, 16:44:33Achtung: attrTemplate anwenden löscht fast alle Readings, damit werden auch die "unnötigen" beseitigt, die nicht (mehr) zum aktuellen Stand passen.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 19 Mai 2021, 17:17:38
Zitat von: yersinia am 19 Mai 2021, 16:47:35
Alte Readings müssen ggf händisch gelöscht werden.
Sorry, ich war an der Stelle unpräzise: Bei mqtt2.template wird das in der Regel so gemacht; kann sein, dass es bei HTTPMOD nicht in derselben Form stattfindet.
Kann man aber vorher (direkt über FHEMWEB bei Auswahl über das dropdown-Menü) checken, denn in der Regel ist irgendwo im template ein deletereading-Befehl.
(OT: ich muss mir mal ansehen, ob das ggf. auch das IODev-Reading betrifft; das könnte auch kontraproduktiv sein...)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: mähschaf am 19 Mai 2021, 18:49:28
Ja, danke, jetzt verstehe ich deutlich mehr! :-)

Ich habe mich voerst für einen "sanfteren" Eingriff entschieden, da ich nach dem Erstellen meiner Tasmota-Geräte mehrere AttrTemplates angewandt habe und danach noch einiges herumgebastelt. Da macht ganz von vorne wenig Spaß.

deletereading MQTT2_tasmota00.* .* 3542400

3542400 entspricht etwas weniger als dem Zeitpunkt, seit dem ich auf 9.4.0 aktualisiert habe.

Im Moment schaut's gut aus, falls nicht, kenne ich nun in etwa die Hintergründe und weiß ich Dank Euch jetzt, wie ich mit AttrTemplates weitermachen könnte.  :D

Danke vielmals!
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 20 Mai 2021, 09:31:45
Zitat von: mähschaf am 19 Mai 2021, 18:49:28
Ich habe mich voerst für einen "sanfteren" Eingriff entschieden, [...]
Danke für die Rückmeldung, aber falls das jemand nachmachen will, würde ich eine etwas andere regex für die Readings empfehlen:

deletereading MQTT2_tasmota00.* (?!associatedWith|IODev) 3542400
Further reading wegen der genannten zwei '"speziellen" Readings z.B.:
https://forum.fhem.de/index.php/topic,114960.msg1125012.html#msg1125012
https://forum.fhem.de/index.php/topic,120603.msg1153041.html#msg1153041

Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: mähschaf am 17 Juni 2021, 20:26:03
Guten Abend!

Danke für die Präzisierung und die Hilfen. Das "further reading" muss ich mir mal für schlechtes Wetter aufheben :-)

Im SVN zu httpmod.template findet sich folgende Zeile zum userattr "updatableDevices":

foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=INFO1_Version!="))


Damit wird - so verstehe ich das zumindest als Laie - auf das Reading "Version" abgestellt/gefiltert. Ich habe das für mich angepasst:

foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=Info1_Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER~INFO1_Version!="))

So klappt es dann zumindest bei mir. Eventuell hilft es anderen, deshalb dachte ich, ich schreibe es ganz kurz...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Lazgar am 22 Juli 2021, 07:07:19
Hallo.

Ich habe leider ein Problem mit dem Template für das Wetter vom ORF.
Leider kommt es immer wieder vor, dass für meinen Bezirk keine Wetterdaten vorhanden sind.
Statt der Werte steht dann nur "k. A." was erstmal nicht so schlimm wäre...
...leider kommt das HttpMod-Device nicht so gut damit zurecht (vermutlich weil er sich integar erwartet aber einen string bekommt).
Der FHEM-Prozess geht auf 100% CPU-Last und Fhem ist nicht mehr erreichbar.

Kann man das irgendwie abfangen oder zumindest verhindern das Fhem als ganzes blockiert wird?

Danke und LG,
Lazgar
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: joelinux am 09 Februar 2022, 15:26:41
Hallo zusammen,

die beiden httpmod Definitionen für tasmotaupdates und zigbee2mqtt_updates haben bei mir seit ein paar Wochen die neuesten Versions Nummern nicht angezeigt.
Nach etwas Debugging Arbeit mit verbose 5 sieht es so aus,dass Github die Versions Tags in einem veränderten h4 Header verschickt. Die bisherige reading01Regex passt nicht mehr.

Eine neue reading01Regex könnte lauten: tag-title">[\w\W]*?<a href=".*">[\w\W]*?v(\d*.\d*.\d*)[\w\W]*?</a>

Mit der neuen reading01Regex arbeiten sowohl tasmotaupdates und zigbee2mqtt_updates wieder wie zuvor.

Mit freundlichem Gruß

joelinux
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: kjmEjfu am 07 Juli 2022, 10:56:53
Das tasmota_updates liefert mittlerweile einen Fehler im Log:

2022.07.07 10:56:16.752 1: PERL WARNING: Use of uninitialized value $dev in concatenation (.) or string at (eval 1613921) line 21.
2022.07.07 10:56:16.752 1: PERL WARNING: Use of uninitialized value in sprintf at (eval 1613921) line 22.
2022.07.07 10:56:16.753 1: PERL WARNING: Use of uninitialized value $old in sprintf at (eval 1613921) line 26.
2022.07.07 10:56:16.753 1: PERL WARNING: Use of uninitialized value $new in concatenation (.) or string at (eval 1613921) line 28.
2022.07.07 10:56:16.753 1: PERL WARNING: Use of uninitialized value $new in sprintf at (eval 1613921) line 30.
2022.07.07 10:56:16.753 1: PERL WARNING: Use of uninitialized value $new in concatenation (.) or string at (eval 1613921) line 32.
2022.07.07 10:56:16.753 1: PERL WARNING: Use of uninitialized value $date in sprintf at (eval 1613921) line 34.


Jemand eine Idee woran das liegt?
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: rudolfkoenig am 07 Juli 2022, 11:06:37
Nach "attr global stacktrace 1" weiss man mehr.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: kjmEjfu am 07 Juli 2022, 11:37:54
Zitat von: rudolfkoenig am 07 Juli 2022, 11:06:37
Nach "attr global stacktrace 1" weiss man mehr.

2022.07.07 11:32:33.681 1: PERL WARNING: Use of uninitialized value $dev in concatenation (.) or string at (eval 1626052) line 21.
2022.07.07 11:32:33.682 1: eval:  my $ret ="";;
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;
    $ret .= '<div style="text-align:left;;">';;
    $ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" target="_blank">tasmota</a>-check => '.$lastCheck;;
    $ret .= '<br><br><pre>';;
    $ret .= "| device                           | current |   new   |  released  |<br>";;
    $ret .= "---------------------------------------------------------------------<br>";;
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;
    if($check eq "no updates needed!") {
      $ret .= '| <b style="color:green;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } elsif($check eq "error => no or wrong data from server!") {
      $ret .= '| <b style="color:red;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } else {
      my @devices = split(',',$check);;
      foreach my $devStr (@devices) {
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;
        $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;
        $ret .= '</b></a> | ';;
        $ret .= '<b style="color:lightgray;;">';;
        $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;
        $ret .= sprintf("%7s",$old);;
        $ret .= '</a></b> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:red;;">';;
        $ret .= sprintf("%7s",$new);;
        $ret .= '</b></a> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:black;;">';;
        $ret .= sprintf("%-10s",$date);;
        $ret .= '</b></a>';;
        $ret .= " |<br>";;
      }
    }
    $ret .= '</pre></div>';;
  return $ret;;

2022.07.07 11:32:33.682 1: stacktrace:
2022.07.07 11:32:33.682 1:     main::__ANON__                      called by (eval 1626052) (21)
2022.07.07 11:32:33.682 1:     (eval)                              called by fhem.pl (4852)
2022.07.07 11:32:33.682 1:     main::evalStateFormat               called by fhem.pl (4957)
2022.07.07 11:32:33.682 1:     main::readingsEndUpdate             called by ./FHEM/98_HTTPMOD.pm (2437)
2022.07.07 11:32:33.682 1:     HTTPMOD::ReadCallback               called by FHEM/HttpUtils.pm (720)
2022.07.07 11:32:33.682 1:     main::__ANON__                      called by fhem.pl (778)
2022.07.07 11:32:33.682 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4736.
2022.07.07 11:32:33.682 1: eval:  my $ret ="";;
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;
    $ret .= '<div style="text-align:left;;">';;
    $ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" target="_blank">tasmota</a>-check => '.$lastCheck;;
    $ret .= '<br><br><pre>';;
    $ret .= "| device                           | current |   new   |  released  |<br>";;
    $ret .= "---------------------------------------------------------------------<br>";;
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;
    if($check eq "no updates needed!") {
      $ret .= '| <b style="color:green;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } elsif($check eq "error => no or wrong data from server!") {
      $ret .= '| <b style="color:red;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } else {
      my @devices = split(',',$check);;
      foreach my $devStr (@devices) {
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;
        $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;
        $ret .= '</b></a> | ';;
        $ret .= '<b style="color:lightgray;;">';;
        $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;
        $ret .= sprintf("%7s",$old);;
        $ret .= '</a></b> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:red;;">';;
        $ret .= sprintf("%7s",$new);;
        $ret .= '</b></a> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:black;;">';;
        $ret .= sprintf("%-10s",$date);;
        $ret .= '</b></a>';;
        $ret .= " |<br>";;
      }
    }
    $ret .= '</pre></div>';;
  return $ret;;

2022.07.07 11:32:33.682 1: stacktrace:
2022.07.07 11:32:33.682 1:     main::__ANON__                      called by fhem.pl (4736)
2022.07.07 11:32:33.682 1:     main::AttrVal                       called by (eval 1626052) (22)
2022.07.07 11:32:33.682 1:     (eval)                              called by fhem.pl (4852)
2022.07.07 11:32:33.683 1:     main::evalStateFormat               called by fhem.pl (4957)
2022.07.07 11:32:33.683 1:     main::readingsEndUpdate             called by ./FHEM/98_HTTPMOD.pm (2437)
2022.07.07 11:32:33.683 1:     HTTPMOD::ReadCallback               called by FHEM/HttpUtils.pm (720)
2022.07.07 11:32:33.683 1:     main::__ANON__                      called by fhem.pl (778)
2022.07.07 11:32:33.683 1: PERL WARNING: Use of uninitialized value in sprintf at (eval 1626052) line 22.
2022.07.07 11:32:33.683 1: eval:  my $ret ="";;
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;
    $ret .= '<div style="text-align:left;;">';;
    $ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" target="_blank">tasmota</a>-check => '.$lastCheck;;
    $ret .= '<br><br><pre>';;
    $ret .= "| device                           | current |   new   |  released  |<br>";;
    $ret .= "---------------------------------------------------------------------<br>";;
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;
    if($check eq "no updates needed!") {
      $ret .= '| <b style="color:green;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } elsif($check eq "error => no or wrong data from server!") {
      $ret .= '| <b style="color:red;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } else {
      my @devices = split(',',$check);;
      foreach my $devStr (@devices) {
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;
        $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;
        $ret .= '</b></a> | ';;
        $ret .= '<b style="color:lightgray;;">';;
        $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;
        $ret .= sprintf("%7s",$old);;
        $ret .= '</a></b> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:red;;">';;
        $ret .= sprintf("%7s",$new);;
        $ret .= '</b></a> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:black;;">';;
        $ret .= sprintf("%-10s",$date);;
        $ret .= '</b></a>';;
        $ret .= " |<br>";;
      }
    }
    $ret .= '</pre></div>';;
  return $ret;;

2022.07.07 11:32:33.683 1: stacktrace:
2022.07.07 11:32:33.683 1:     main::__ANON__                      called by (eval 1626052) (22)
2022.07.07 11:32:33.683 1:     (eval)                              called by fhem.pl (4852)
2022.07.07 11:32:33.683 1:     main::evalStateFormat               called by fhem.pl (4957)
2022.07.07 11:32:33.683 1:     main::readingsEndUpdate             called by ./FHEM/98_HTTPMOD.pm (2437)
2022.07.07 11:32:33.683 1:     HTTPMOD::ReadCallback               called by FHEM/HttpUtils.pm (720)
2022.07.07 11:32:33.683 1:     main::__ANON__                      called by fhem.pl (778)
2022.07.07 11:32:33.683 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4661.
2022.07.07 11:32:33.683 1: eval:  my $ret ="";;
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;
    $ret .= '<div style="text-align:left;;">';;
    $ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" target="_blank">tasmota</a>-check => '.$lastCheck;;
    $ret .= '<br><br><pre>';;
    $ret .= "| device                           | current |   new   |  released  |<br>";;
    $ret .= "---------------------------------------------------------------------<br>";;
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;
    if($check eq "no updates needed!") {
      $ret .= '| <b style="color:green;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } elsif($check eq "error => no or wrong data from server!") {
      $ret .= '| <b style="color:red;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } else {
      my @devices = split(',',$check);;
      foreach my $devStr (@devices) {
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;
        $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;
        $ret .= '</b></a> | ';;
        $ret .= '<b style="color:lightgray;;">';;
        $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;
        $ret .= sprintf("%7s",$old);;
        $ret .= '</a></b> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:red;;">';;
        $ret .= sprintf("%7s",$new);;
        $ret .= '</b></a> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:black;;">';;
        $ret .= sprintf("%-10s",$date);;
        $ret .= '</b></a>';;
        $ret .= " |<br>";;
      }
    }
    $ret .= '</pre></div>';;
  return $ret;;

2022.07.07 11:32:33.683 1: stacktrace:
2022.07.07 11:32:33.684 1:     main::__ANON__                      called by fhem.pl (4661)
2022.07.07 11:32:33.684 1:     main::ReadingsVal                   called by (eval 1626052) (25)
2022.07.07 11:32:33.684 1:     (eval)                              called by fhem.pl (4852)
2022.07.07 11:32:33.684 1:     main::evalStateFormat               called by fhem.pl (4957)
2022.07.07 11:32:33.684 1:     main::readingsEndUpdate             called by ./FHEM/98_HTTPMOD.pm (2437)
2022.07.07 11:32:33.684 1:     HTTPMOD::ReadCallback               called by FHEM/HttpUtils.pm (720)
2022.07.07 11:32:33.684 1:     main::__ANON__                      called by fhem.pl (778)
2022.07.07 11:32:33.684 1: PERL WARNING: Use of uninitialized value $d in hash element at fhem.pl line 4661.
2022.07.07 11:32:33.684 1: eval:  my $ret ="";;
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;
    $ret .= '<div style="text-align:left;;">';;
    $ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" target="_blank">tasmota</a>-check => '.$lastCheck;;
    $ret .= '<br><br><pre>';;
    $ret .= "| device                           | current |   new   |  released  |<br>";;
    $ret .= "---------------------------------------------------------------------<br>";;
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;
    if($check eq "no updates needed!") {
      $ret .= '| <b style="color:green;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } elsif($check eq "error => no or wrong data from server!") {
      $ret .= '| <b style="color:red;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } else {
      my @devices = split(',',$check);;
      foreach my $devStr (@devices) {
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;
        $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;
        $ret .= '</b></a> | ';;
        $ret .= '<b style="color:lightgray;;">';;
        $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;
        $ret .= sprintf("%7s",$old);;
        $ret .= '</a></b> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:red;;">';;
        $ret .= sprintf("%7s",$new);;
        $ret .= '</b></a> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:black;;">';;
        $ret .= sprintf("%-10s",$date);;
        $ret .= '</b></a>';;
        $ret .= " |<br>";;
      }
    }
    $ret .= '</pre></div>';;
  return $ret;;

2022.07.07 11:32:33.684 1: stacktrace:
2022.07.07 11:32:33.684 1:     main::__ANON__                      called by fhem.pl (4661)
2022.07.07 11:32:33.684 1:     main::ReadingsVal                   called by (eval 1626052) (25)
2022.07.07 11:32:33.684 1:     (eval)                              called by fhem.pl (4852)
2022.07.07 11:32:33.684 1:     main::evalStateFormat               called by fhem.pl (4957)
2022.07.07 11:32:33.684 1:     main::readingsEndUpdate             called by ./FHEM/98_HTTPMOD.pm (2437)
2022.07.07 11:32:33.684 1:     HTTPMOD::ReadCallback               called by FHEM/HttpUtils.pm (720)
2022.07.07 11:32:33.684 1:     main::__ANON__                      called by fhem.pl (778)
2022.07.07 11:32:33.684 1: PERL WARNING: Use of uninitialized value $old in sprintf at (eval 1626052) line 26.
2022.07.07 11:32:33.685 1: eval:  my $ret ="";;
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;
    $ret .= '<div style="text-align:left;;">';;
    $ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" target="_blank">tasmota</a>-check => '.$lastCheck;;
    $ret .= '<br><br><pre>';;
    $ret .= "| device                           | current |   new   |  released  |<br>";;
    $ret .= "---------------------------------------------------------------------<br>";;
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;
    if($check eq "no updates needed!") {
      $ret .= '| <b style="color:green;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } elsif($check eq "error => no or wrong data from server!") {
      $ret .= '| <b style="color:red;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } else {
      my @devices = split(',',$check);;
      foreach my $devStr (@devices) {
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;
        $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;
        $ret .= '</b></a> | ';;
        $ret .= '<b style="color:lightgray;;">';;
        $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;
        $ret .= sprintf("%7s",$old);;
        $ret .= '</a></b> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:red;;">';;
        $ret .= sprintf("%7s",$new);;
        $ret .= '</b></a> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:black;;">';;
        $ret .= sprintf("%-10s",$date);;
        $ret .= '</b></a>';;
        $ret .= " |<br>";;
      }
    }
    $ret .= '</pre></div>';;
  return $ret;;

2022.07.07 11:32:33.685 1: stacktrace:
2022.07.07 11:32:33.685 1:     main::__ANON__                      called by (eval 1626052) (26)
2022.07.07 11:32:33.685 1:     (eval)                              called by fhem.pl (4852)
2022.07.07 11:32:33.685 1:     main::evalStateFormat               called by fhem.pl (4957)
2022.07.07 11:32:33.685 1:     main::readingsEndUpdate             called by ./FHEM/98_HTTPMOD.pm (2437)
2022.07.07 11:32:33.685 1:     HTTPMOD::ReadCallback               called by FHEM/HttpUtils.pm (720)
2022.07.07 11:32:33.685 1:     main::__ANON__                      called by fhem.pl (778)
2022.07.07 11:32:33.685 1: PERL WARNING: Use of uninitialized value $new in concatenation (.) or string at (eval 1626052) line 28.
2022.07.07 11:32:33.685 1: eval:  my $ret ="";;
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;
    $ret .= '<div style="text-align:left;;">';;
    $ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" target="_blank">tasmota</a>-check => '.$lastCheck;;
    $ret .= '<br><br><pre>';;
    $ret .= "| device                           | current |   new   |  released  |<br>";;
    $ret .= "---------------------------------------------------------------------<br>";;
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;
    if($check eq "no updates needed!") {
      $ret .= '| <b style="color:green;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } elsif($check eq "error => no or wrong data from server!") {
      $ret .= '| <b style="color:red;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } else {
      my @devices = split(',',$check);;
      foreach my $devStr (@devices) {
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;
        $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;
        $ret .= '</b></a> | ';;
        $ret .= '<b style="color:lightgray;;">';;
        $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;
        $ret .= sprintf("%7s",$old);;
        $ret .= '</a></b> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:red;;">';;
        $ret .= sprintf("%7s",$new);;
        $ret .= '</b></a> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:black;;">';;
        $ret .= sprintf("%-10s",$date);;
        $ret .= '</b></a>';;
        $ret .= " |<br>";;
      }
    }
    $ret .= '</pre></div>';;
  return $ret;;

2022.07.07 11:32:33.685 1: stacktrace:
2022.07.07 11:32:33.685 1:     main::__ANON__                      called by (eval 1626052) (28)
2022.07.07 11:32:33.685 1:     (eval)                              called by fhem.pl (4852)
2022.07.07 11:32:33.685 1:     main::evalStateFormat               called by fhem.pl (4957)
2022.07.07 11:32:33.685 1:     main::readingsEndUpdate             called by ./FHEM/98_HTTPMOD.pm (2437)
2022.07.07 11:32:33.685 1:     HTTPMOD::ReadCallback               called by FHEM/HttpUtils.pm (720)
2022.07.07 11:32:33.685 1:     main::__ANON__                      called by fhem.pl (778)
2022.07.07 11:32:33.685 1: PERL WARNING: Use of uninitialized value $new in sprintf at (eval 1626052) line 30.
2022.07.07 11:32:33.685 1: eval:  my $ret ="";;
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;
    $ret .= '<div style="text-align:left;;">';;
    $ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" target="_blank">tasmota</a>-check => '.$lastCheck;;
    $ret .= '<br><br><pre>';;
    $ret .= "| device                           | current |   new   |  released  |<br>";;
    $ret .= "---------------------------------------------------------------------<br>";;
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;
    if($check eq "no updates needed!") {
      $ret .= '| <b style="color:green;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } elsif($check eq "error => no or wrong data from server!") {
      $ret .= '| <b style="color:red;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } else {
      my @devices = split(',',$check);;
      foreach my $devStr (@devices) {
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;
        $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;
        $ret .= '</b></a> | ';;
        $ret .= '<b style="color:lightgray;;">';;
        $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;
        $ret .= sprintf("%7s",$old);;
        $ret .= '</a></b> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:red;;">';;
        $ret .= sprintf("%7s",$new);;
        $ret .= '</b></a> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:black;;">';;
        $ret .= sprintf("%-10s",$date);;
        $ret .= '</b></a>';;
        $ret .= " |<br>";;
      }
    }
    $ret .= '</pre></div>';;
  return $ret;;

2022.07.07 11:32:33.685 1: stacktrace:
2022.07.07 11:32:33.685 1:     main::__ANON__                      called by (eval 1626052) (30)
2022.07.07 11:32:33.685 1:     (eval)                              called by fhem.pl (4852)
2022.07.07 11:32:33.685 1:     main::evalStateFormat               called by fhem.pl (4957)
2022.07.07 11:32:33.685 1:     main::readingsEndUpdate             called by ./FHEM/98_HTTPMOD.pm (2437)
2022.07.07 11:32:33.685 1:     HTTPMOD::ReadCallback               called by FHEM/HttpUtils.pm (720)
2022.07.07 11:32:33.685 1:     main::__ANON__                      called by fhem.pl (778)
2022.07.07 11:32:33.686 1: PERL WARNING: Use of uninitialized value $new in concatenation (.) or string at (eval 1626052) line 32.
2022.07.07 11:32:33.686 1: eval:  my $ret ="";;
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;
    $ret .= '<div style="text-align:left;;">';;
    $ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" target="_blank">tasmota</a>-check => '.$lastCheck;;
    $ret .= '<br><br><pre>';;
    $ret .= "| device                           | current |   new   |  released  |<br>";;
    $ret .= "---------------------------------------------------------------------<br>";;
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;
    if($check eq "no updates needed!") {
      $ret .= '| <b style="color:green;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } elsif($check eq "error => no or wrong data from server!") {
      $ret .= '| <b style="color:red;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } else {
      my @devices = split(',',$check);;
      foreach my $devStr (@devices) {
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;
        $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;
        $ret .= '</b></a> | ';;
        $ret .= '<b style="color:lightgray;;">';;
        $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;
        $ret .= sprintf("%7s",$old);;
        $ret .= '</a></b> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:red;;">';;
        $ret .= sprintf("%7s",$new);;
        $ret .= '</b></a> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:black;;">';;
        $ret .= sprintf("%-10s",$date);;
        $ret .= '</b></a>';;
        $ret .= " |<br>";;
      }
    }
    $ret .= '</pre></div>';;
  return $ret;;

2022.07.07 11:32:33.686 1: stacktrace:
2022.07.07 11:32:33.686 1:     main::__ANON__                      called by (eval 1626052) (32)
2022.07.07 11:32:33.686 1:     (eval)                              called by fhem.pl (4852)
2022.07.07 11:32:33.686 1:     main::evalStateFormat               called by fhem.pl (4957)
2022.07.07 11:32:33.686 1:     main::readingsEndUpdate             called by ./FHEM/98_HTTPMOD.pm (2437)
2022.07.07 11:32:33.686 1:     HTTPMOD::ReadCallback               called by FHEM/HttpUtils.pm (720)
2022.07.07 11:32:33.686 1:     main::__ANON__                      called by fhem.pl (778)
2022.07.07 11:32:33.686 1: PERL WARNING: Use of uninitialized value $date in sprintf at (eval 1626052) line 34.
2022.07.07 11:32:33.686 1: eval:  my $ret ="";;
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;
    $ret .= '<div style="text-align:left;;">';;
    $ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" target="_blank">tasmota</a>-check => '.$lastCheck;;
    $ret .= '<br><br><pre>';;
    $ret .= "| device                           | current |   new   |  released  |<br>";;
    $ret .= "---------------------------------------------------------------------<br>";;
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;
    if($check eq "no updates needed!") {
      $ret .= '| <b style="color:green;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } elsif($check eq "error => no or wrong data from server!") {
      $ret .= '| <b style="color:red;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } else {
      my @devices = split(',',$check);;
      foreach my $devStr (@devices) {
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;
        $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;
        $ret .= '</b></a> | ';;
        $ret .= '<b style="color:lightgray;;">';;
        $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;
        $ret .= sprintf("%7s",$old);;
        $ret .= '</a></b> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:red;;">';;
        $ret .= sprintf("%7s",$new);;
        $ret .= '</b></a> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:black;;">';;
        $ret .= sprintf("%-10s",$date);;
        $ret .= '</b></a>';;
        $ret .= " |<br>";;
      }
    }
    $ret .= '</pre></div>';;
  return $ret;;

2022.07.07 11:32:33.686 1: stacktrace:
2022.07.07 11:32:33.686 1:     main::__ANON__                      called by (eval 1626052) (34)
2022.07.07 11:32:33.686 1:     (eval)                              called by fhem.pl (4852)
2022.07.07 11:32:33.686 1:     main::evalStateFormat               called by fhem.pl (4957)
2022.07.07 11:32:33.686 1:     main::readingsEndUpdate             called by ./FHEM/98_HTTPMOD.pm (2437)
2022.07.07 11:32:33.686 1:     HTTPMOD::ReadCallback               called by FHEM/HttpUtils.pm (720)
2022.07.07 11:32:33.686 1:     main::__ANON__                      called by fhem.pl (778)
2022.07.07 11:32:33.686 1: PERL WARNING: Use of uninitialized value $dev in concatenation (.) or string at (eval 1626052) line 21.
2022.07.07 11:32:33.686 1: eval:  my $ret ="";;
    my $lastCheck = ReadingsTimestamp($name,"MATCHED_READINGS","???");;
    $ret .= '<div style="text-align:left;;">';;
    $ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" target="_blank">tasmota</a>-check => '.$lastCheck;;
    $ret .= '<br><br><pre>';;
    $ret .= "| device                           | current |   new   |  released  |<br>";;
    $ret .= "---------------------------------------------------------------------<br>";;
    my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;
    if($check eq "no updates needed!") {
      $ret .= '| <b style="color:green;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } elsif($check eq "error => no or wrong data from server!") {
      $ret .= '| <b style="color:red;;">';;
      $ret .= sprintf("%-65s",$check);;
      $ret .= '</b> |';;
    } else {
      my @devices = split(',',$check);;
      foreach my $devStr (@devices) {
        my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;
        $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;
        $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;
        $ret .= '</b></a> | ';;
        $ret .= '<b style="color:lightgray;;">';;
        $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")).'/up" target="_blank">';;
        $ret .= sprintf("%7s",$old);;
        $ret .= '</a></b> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:red;;">';;
        $ret .= sprintf("%7s",$new);;
        $ret .= '</b></a> | ';;
        $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;
        $ret .= '<b style="color:black;;">';;
        $ret .= sprintf("%-10s",$date);;
        $ret .= '</b></a>';;
        $ret .= " |<br>";;
      }
    }
    $ret .= '</pre></div>';;
  return $ret;;


Geht noch ewig lang so weiter.
Stacktrace überfordert mich regelmäßig.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: rudolfkoenig am 07 Juli 2022, 12:33:15
Der Inhalt des updatableDevices Readings entspricht nicht den Erwartungen des Programmes im stateFormat-Attribut.

Btw. stateFormat ist eher fuer Auswertung (wie abspeichern im FileLogs, auswerten in Apps, etc) gedacht, und nicht fuer die Anzeige im Browser. Dafuer sollte man devStateIcon verwenden.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: kjmEjfu am 07 Juli 2022, 13:04:34
Zitat von: rudolfkoenig am 07 Juli 2022, 12:33:15
Der Inhalt des updatableDevices Readings entspricht nicht den Erwartungen des Programmes im stateFormat-Attribut.

Btw. stateFormat ist eher fuer Auswertung (wie abspeichern im FileLogs, auswerten in Apps, etc) gedacht, und nicht fuer die Anzeige im Browser. Dafuer sollte man devStateIcon verwenden.

Ok, danke für den Hinweis.
Meine Tasmota-Devices waren noch nicht mit den neuesten Templates aufgestattet, da hat sich wohl was geändert.

Wegen stateFormat musst du den Template-Erstellern ins Gewissen reden, ich nutze das nur ;-)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: kjmEjfu am 12 Juli 2022, 15:28:11
Die reading01Regex von tasmota_updates müsste mal angepasst werden.

tag-title">[\w\W]*?<a href=".*">[\w\W]*?v(\d*.\d*.\d*)[\w\W]*?</a>

Die Versionsnummer 24 auf https://github.com/arendst/Tasmota/tags bringt die Regex aus dem Tritt und liefert ein "c" zurück statt einer "12.0.2".

Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 06 August 2022, 20:36:08
@kjmEjfu

Version 24, die eigentlich keine Version ist, sorgt für Durcheinander.
Mit der nächsten, hoffentlich richtigen Versionsnummer sollte wieder alles passen.

reading01Regex - leicht angepasst - könnte so aussehen:

tag-title">[\s\W]*?<a href=".*">[\s\W]*?v(\d+.\d+.\d+)[\s\W]*?</a>


reading01 für latestVersion holt die erste, wirklich passende Version ... 12.0.2
reading02 holt das Datum für latestDate vom 24er-Eintrag ... 20.06.2022 ... ist aber (zum Glück) identisch
reading03 holt die URL für latestHref vom 24er-Eintrag ... ist sichtbar falsch; stört aber nicht, da dieses Reading momentan nicht wirklich benötigt wird.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 07 August 2022, 21:16:41
@OdfFhem: wäre es sinnvoller auf https://api.github.com/repos/arendst/Tasmota/releases/latest (https://api.github.com/repos/arendst/Tasmota/releases/latest) zu wechseln? Liefert zwar ein Json zurück aber auch hier kann der tag des aktuellen Release ausgelesen werden - ich nutze das für einen gleichen JsonMod tasmota fw check (https://forum.fhem.de/index.php/topic,110350.0.html).
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 07 August 2022, 21:52:29
@yersinia ... vielen Dank für Deinen Hinweis

Habe gestern Abend angefangen, die beiden Templates für Tasmota und zigbee2mqtt anzupassen und zu testen. Dabei nutze ich genau den von Dir genannten Link, da man hier wenig "erraten" muss ...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 07 August 2022, 22:59:30
Nach der gestrigen Analyse der GitHub-Probleme habe ich begonnen, die veralteten Templates für tasmota sowie zigbee2mqtt anzupassen.

tasmota

#Contributed by OdfFHEM, see https://forum.fhem.de/index.php/topic,97694.msg992348.html#msg992348
name:tasmota_firmware_updates
filter:TYPE=HTTPMOD
desc: Check Tasmota homepage for available new firmware files<br>Define a HTTPMOD device like <br>define tasmotaupdates HTTPMOD https://github.com/arendst/Tasmota/tags 86400<a href="https://forum.fhem.de/index.php/topic,97694.msg992308.html#msg992308">Source: Forum</a>.
order:TECHZ06
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:UPDATABLEMODE;Actual mode for updatableDevices, defaults to onlyUpdatable; {AttrVal("DEVICE","updatableDevicesMode","onlyUpdatable")}
par:INTERVAL;Actual interval for updating, defaults to one week; {InternalVal("DEVICE","Interval","604800")}
defmod DEVICE HTTPMOD https://api.github.com/repos/arendst/Tasmota/releases/latest INTERVAL
attr DEVICE userattr reading01JSON reading01Name reading01OExpr reading02JSON reading02Name reading02OExpr updatableDevicesMode:onlyUpdatable,all
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 0
deleteattr DEVICE reading01Regex
attr DEVICE reading01JSON tag_name
attr DEVICE reading01Name latestVersion
attr DEVICE reading01OExpr $val =~ m/^v(\d+).(\d+).(\d+)$/ ;; "$1.$2.$3"
deleteattr DEVICE reading02Regex
attr DEVICE reading02JSON published_at
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})T..:..:..Z$/ ;; "$3.$2.$1"
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat { \
  my $ret ="";;\
  $ret .= '<div style="text-align:left;;">';;\
  my $lastCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","1970-01-01 00:00:00"))));;\
  $ret .= '<div style="text-align:left;;">last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">tasmota</a>-check => '.$lastCheck.' ...</div>';;\
  $ret .= '<br><pre>';;\
  $ret .= "| device                           | current |   new   |  released  |<br>";;\
  $ret .= "---------------------------------------------------------------------<br>";;\
  my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
  if($check eq "no updates needed!") {\
    $ret .= '| <b style="color:green;;">';;\
    $ret .= sprintf("%-65s",$check);;\
    $ret .= '</b> |';;\
  } elsif($check eq "error => no or wrong data from server!") {\
    $ret .= '| <b style="color:red;;">';;\
    $ret .= sprintf("%-65s",$check);;\
    $ret .= '</b> |';;\
  } else {\
    my @devices = split(',',$check);;\
    foreach my $devStr (@devices) {\
      my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\
      $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
      $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;\
      $ret .= '</b></a> | ';;\
      $ret .= '<b style="color:lightgray;;">';;\
      $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"Info2_IPAddress","0.0.0.0")).'/up" target="_blank">';;\
      $ret .= sprintf("%7s",$old);;\
      $ret .= '</a></b> | ';;\
      $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
      $ret .= '<b style="color:red;;">';;\
      $ret .= sprintf("%7s",$new);;\
      $ret .= '</b></a> | ';;\
      $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
      $ret .= '<b style="color:black;;">';;\
      $ret .= sprintf("%-10s",$date);;\
      $ret .= '</b></a>';;\
      $ret .= " |<br>";;\
    }\
  }\
  $ret .= '</pre><br>';;\
  my $nextCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(InternalVal($name,".TRIGGERTIME",0)));;\
  $ret .= '<div style="text-align:left;;">... next <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">tasmota</a>-check => '.$nextCheck.'</div>';;\
  $ret .= '</div>';;\
  return $ret;;\
}
attr DEVICE timestamp-on-change-reading .*
attr DEVICE updatableDevicesMode UPDATABLEMODE
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=Info1_Version!=")) {\
      my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"Info1_Version","0.0.0"));;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if ( AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION ) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model tasmota_firmware_updates
setreading DEVICE attrTemplateVersion 20220807


zigbee2mqtt

#Contributed by OdfFHEM, see https://forum.fhem.de/index.php/topic,97694.msg998835.html#msg998835
name:zigbee2mqtt_daemon_updates
filter:TYPE=HTTPMOD
desc: Check zigbee2mqtt homepage for new versions of the deamon software.<br>Define a HTTPMOD device like <br>define zigbee2mqtt_updates HTTPMOD https://github.com/Koenkk/zigbee2mqtt/tags 604800<br><a href="https://forum.fhem.de/index.php/topic,97694.msg998835.html#msg998835">Source: Forum</a>.
order:TECHZ07
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:INTERVAL;Actual interval for updating, defaults to one day; {InternalVal("DEVICE","Interval",604800)}
par:UPDATABLEMODE;Actual mode for updatableDevices, defaults to onlyUpdatable; {AttrVal("DEVICE","updatableDevicesMode","onlyUpdatable")}
defmod DEVICE HTTPMOD https://api.github.com/repos/Koenkk/zigbee2mqtt/releases/latest INTERVAL
attr DEVICE userattr reading01JSON reading01Name reading01OExpr reading02JSON reading02Name reading02OExpr updatableDevicesMode:onlyUpdatable,all
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 0
deleteattr DEVICE reading01Regex
attr DEVICE reading01JSON tag_name
attr DEVICE reading01Name latestVersion
attr DEVICE reading01OExpr $val =~ m/^(\d+).(\d+).(\d+)$/ ;; "$1.$2.$3"
deleteattr DEVICE reading02Regex
attr DEVICE reading02JSON published_at
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})T..:..:..Z$/ ;; "$3.$2.$1"
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat { \
  my $ret ="";;\
  $ret .= '<div style="text-align:left">';;\
  my $lastCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","1970-01-01 00:00:00"))));;\
  $ret .= '<div style="text-align:left;;">last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">zigbee2mqtt</a>-check => '.$lastCheck.' ...</div>';;\
  $ret .= '<br><pre>';;\
  $ret .= "| device                           | current |   new   |  released  |<br>";;\
  $ret .= "---------------------------------------------------------------------<br>";;\
  my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
  if($check eq "no updates needed!") {\
    $ret .= '| <b style="color:green">';;\
    $ret .= sprintf("%-65s",$check);;\
    $ret .= '</b> |';;\
  } elsif($check eq "error => no or wrong data from server!") {\
    $ret .= '| <b style="color:red">';;\
    $ret .= sprintf("%-65s",$check);;\
    $ret .= '</b> |';;\
  } else {\
    my @devices = split(',',$check);;\
    foreach my $devStr (@devices) {\
      my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\
      $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
      $ret .= sprintf("%-32s",$dev);;\
      $ret .= '</b></a> | ';;\
      $ret .= '<b style="color:lightgray">';;\
      $ret .= sprintf("%7s",$old);;\
      $ret .= '</b> | ';;\
      $ret .= '<a href="https://github.com/Koenkk/zigbee2mqtt/releases/tag/'.$new.'">';;\
      $ret .= '<b style="color:'.(($new eq $old)?'black':'red').'">';;\
      $ret .= sprintf("%7s",$new);;\
      $ret .= '</b></a> | ';;\
      $ret .= '<a href="https://github.com/Koenkk/zigbee2mqtt/releases/tag/'.$new.'">';;\
      $ret .= '<b style="color:black">';;\
      $ret .= sprintf("%-10s",$date);;\
      $ret .= '</b></a>';;\
      $ret .= " |<br>";;\
    }\
  }\
  $ret .= '</pre><br>';;\
  my $nextCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(InternalVal($name,".TRIGGERTIME",0)));;\
  $ret .= '<div style="text-align:left;;">... next <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">zigbee2mqtt</a>-check => '.$nextCheck.'</div>';;\
  $ret .= '</div>';;\
  return $ret;;\
}
attr DEVICE updatableDevicesMode UPDATABLEMODE
attr DEVICE timestamp-on-change-reading .*
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=NAME=.*zigbee.*bridge.*")) {\
      my $version = ReadingsVal($dev,"version","0.0.0");;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if (AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model zigbee2mqtt_daemon_updates
setreading DEVICE attrTemplateVersion 20220807



Den Parameter UPDATABLEDEVICESMODE in UPDATABLEMODE umbenannt; ansonsten verhindert die DEVICE-Ersetzung einen sinnvolle Attribut-Vorbelegung.
Frage dazu - insbesondere an @Beta-User: Gibt es eine Möglichkeit DEVICE in einem solchen Fall zu neutralisieren ?

Bei der Testung vom angepassten zigbee2mqtt_daemon_updates wurde ständig ein harter Fehler "Unknown command <a" generiert. Zunächst dachte ich, dass es am Inhalt von stateFormat liegt, am Ende waren es aber dann folgende Zeilen:

desc: Check zigbee2mqtt homepage for new versions of the deamon software.<br>Define a HTTPMOD device like <br>define zigbee2mqtt_updates HTTPMOD https://github.com/Koenkk/zigbee2mqtt/tags 604800<br>
<a href="https://forum.fhem.de/index.php/topic,97694.msg998835.html#msg998835">Source: Forum</a>.

desc darf wohl nur aus einer Zeile bestehen - wie alle anderen Angaben auch.

Jeweils die <devspec> an die aktuell gebräuchlichen Verhältnisse angepasst.

deleteattr verwendet, um störende Altlasten loszuwerden.


Bei meinen Tests scheint alles zu funktionieren, aber wie immer: Machen Andere die gleiche Erfahrung oder gibt es Probleme ?
@yersinia ... Vielleicht hast Du ja Lust für einen praktischen Test ...


@Beta-User ... Sollte es keine Probleme geben, kannst Du die angepassten Versionen übernehmen ?


@rudolfkoenig ... Demnächst würde ich auch mal das devStateIcon-Attribut antesten ...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: rudolfkoenig am 08 August 2022, 08:15:18
Zitat@rudolfkoenig ... Demnächst würde ich auch mal das devStateIcon-Attribut antesten ...
Muss ich dafuer was tun, oder ist das als Drohung zu verstehen ? :)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 08 August 2022, 08:31:57
Zitat von: rudolfkoenig am 08 August 2022, 08:15:18
Muss ich dafuer was tun, oder ist das als Drohung zu verstehen ? :)
+1 für Drohung. ;D

Zitat von: OdfFhem am 07 August 2022, 22:59:30tasmota

#Contributed by OdfFHEM, see https://forum.fhem.de/index.php/topic,97694.msg992348.html#msg992348
name:tasmota_firmware_updates
filter:TYPE=HTTPMOD
desc: Check Tasmota homepage for available new firmware files<br>Define a HTTPMOD device like <br>define tasmotaupdates HTTPMOD https://github.com/arendst/Tasmota/tags 86400<a href="https://forum.fhem.de/index.php/topic,97694.msg992308.html#msg992308">Source: Forum</a>.
order:TECHZ06
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:UPDATABLEMODE;Actual mode for updatableDevices, defaults to onlyUpdatable; {AttrVal("DEVICE","updatableDevicesMode","onlyUpdatable")}
par:INTERVAL;Actual interval for updating, defaults to one week; {InternalVal("DEVICE","Interval","604800")}
defmod DEVICE HTTPMOD https://api.github.com/repos/arendst/Tasmota/releases/latest INTERVAL
attr DEVICE userattr reading01JSON reading01Name reading01OExpr reading02JSON reading02Name reading02OExpr updatableDevicesMode:onlyUpdatable,all
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 0
deleteattr DEVICE reading01Regex
attr DEVICE reading01JSON tag_name
attr DEVICE reading01Name latestVersion
attr DEVICE reading01OExpr $val =~ m/^v(\d+).(\d+).(\d+)$/ ;; "$1.$2.$3"
deleteattr DEVICE reading02Regex
attr DEVICE reading02JSON published_at
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})T..:..:..Z$/ ;; "$3.$2.$1"
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat { \
  my $ret ="";;\
  $ret .= '<div style="text-align:left;;">';;\
  my $lastCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","1970-01-01 00:00:00"))));;\
  $ret .= '<div style="text-align:left;;">last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">tasmota</a>-check => '.$lastCheck.' ...</div>';;\
  $ret .= '<br><pre>';;\
  $ret .= "| device                           | current |   new   |  released  |<br>";;\
  $ret .= "---------------------------------------------------------------------<br>";;\
  my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
  if($check eq "no updates needed!") {\
    $ret .= '| <b style="color:green;;">';;\
    $ret .= sprintf("%-65s",$check);;\
    $ret .= '</b> |';;\
  } elsif($check eq "error => no or wrong data from server!") {\
    $ret .= '| <b style="color:red;;">';;\
    $ret .= sprintf("%-65s",$check);;\
    $ret .= '</b> |';;\
  } else {\
    my @devices = split(',',$check);;\
    foreach my $devStr (@devices) {\
      my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\
      $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
      $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;\
      $ret .= '</b></a> | ';;\
      $ret .= '<b style="color:lightgray;;">';;\
      $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"Info2_IPAddress","0.0.0.0")).'/up" target="_blank">';;\
      $ret .= sprintf("%7s",$old);;\
      $ret .= '</a></b> | ';;\
      $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
      $ret .= '<b style="color:red;;">';;\
      $ret .= sprintf("%7s",$new);;\
      $ret .= '</b></a> | ';;\
      $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'">';;\
      $ret .= '<b style="color:black;;">';;\
      $ret .= sprintf("%-10s",$date);;\
      $ret .= '</b></a>';;\
      $ret .= " |<br>";;\
    }\
  }\
  $ret .= '</pre><br>';;\
  my $nextCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(InternalVal($name,".TRIGGERTIME",0)));;\
  $ret .= '<div style="text-align:left;;">... next <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">tasmota</a>-check => '.$nextCheck.'</div>';;\
  $ret .= '</div>';;\
  return $ret;;\
}
attr DEVICE timestamp-on-change-reading .*
attr DEVICE updatableDevicesMode UPDATABLEMODE
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=Info1_Version!=")) {\
      my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"Info1_Version","0.0.0"));;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if ( AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION ) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model tasmota_firmware_updates
setreading DEVICE attrTemplateVersion 20220807

[...]
@yersinia ... Vielleicht hast Du ja Lust für einen praktischen Test ...
Ich nutze zwar mittlerweile nur noch JsonMod dafür, aber ich teste das hier gern. Und es läuft soweit ganz gut - mit kleineren Verbesserungsvorschlägen noch besser:
- kannst du den Hyperlinks hinter der neuen Version und dem Release-Datum ein target="_blank" verpassen, dadurch öffnet sich der link nicht in dem gleichen Tab/Fenster
- das release datum ist schlecht zu lesen wenn man -so wie ich- einen Dark-style nutzt, vlt lässt du das style="color:black;" hier weg
Danke für deine Mühe, sieht sonst wirklich gut aus.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 08 August 2022, 10:32:04
Zitat von: OdfFhem am 07 August 2022, 22:59:30
@Beta-User ... Sollte es keine Probleme geben, kannst Du die angepassten Versionen übernehmen ?
Moin, ich gehe mal davon aus, dass amenomade einfach grade länger im Urlaub ist und das dann irgendwann gerne machen wird:
Zitat von: amenomade am 08 September 2020, 01:13:30
Und da ich jetzt in Abstimmung mit Beta-User die Maintenance für httpmod.template übernommen habe, habe ich es gerade auch eingecheckt.

Zitat von: OdfFhem am 07 August 2022, 22:59:30
Den Parameter UPDATABLEDEVICESMODE in UPDATABLEMODE umbenannt; ansonsten verhindert die DEVICE-Ersetzung einen sinnvolle Attribut-Vorbelegung.
Frage dazu - insbesondere an @Beta-User: Gibt es eine Möglichkeit DEVICE in einem solchen Fall zu neutralisieren ?
DEVICE (genauer: alle par:-Parameter) kann/muss man "escapen". So sollte es funktionieren:
UPDATABLE\DEVICESMODE
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 08 August 2022, 19:21:30
Zitat von: rudolfkoenig am 08 August 2022, 08:15:18
Muss ich dafuer was tun, oder ist das als Drohung zu verstehen ? :)

Nein, in keinster Weise eine Drohung ... sollte eigentlich eher eine Art Info sein, dass Deine Empfehlung ernst genommen wird.

Da ich das devStateIcon-Attribut schon an einigen Stellen nutze, denke ich momentan, dass Du vermutlich nichts erweitern musst. Aber ich kann mich natürlich auch irren ...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 08 August 2022, 20:35:04
@yersinia ... schon mal vielen Dank fürs Testen sowie die Verbesserungsvorschläge

Beide Templates noch ein wenig überarbeitet/getestet und Deine Vorschläge einfliessen lassen.

tasmota

#Contributed by OdfFHEM, see https://forum.fhem.de/index.php/topic,97694.msg992348.html#msg992348
name:tasmota_firmware_updates
filter:TYPE=HTTPMOD
desc: Check Tasmota homepage for available new firmware files<br>Define a HTTPMOD device like <br>define tasmotaupdates HTTPMOD https://github.com/arendst/Tasmota/tags 86400<a href="https://forum.fhem.de/index.php/topic,97694.msg992308.html#msg992308">Source: Forum</a>.
order:TECHZ06
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:UPDATABLEMODE;Actual mode for updatableDevices, defaults to onlyUpdatable; {AttrVal("DEVICE","updatableDevicesMode","onlyUpdatable")}
par:INTERVAL;Actual interval for updating, defaults to one week; {InternalVal("DEVICE","Interval","604800")}
defmod DEVICE HTTPMOD https://api.github.com/repos/arendst/Tasmota/releases/latest INTERVAL
attr DEVICE userattr reading01JSON reading01Name reading01OExpr reading02JSON reading02Name reading02OExpr updatableDevicesMode:onlyUpdatable,all
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 0
deleteattr DEVICE reading01Regex
attr DEVICE reading01JSON tag_name
attr DEVICE reading01Name latestVersion
attr DEVICE reading01OExpr $val =~ m/^v(\d+).(\d+).(\d+)$/ ;; "$1.$2.$3"
deleteattr DEVICE reading02Regex
attr DEVICE reading02JSON published_at
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})T..:..:..Z$/ ;; "$3.$2.$1"
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat { \
  my $ret ="";;\
  $ret .= '<div style="text-align:left;;">';;\
  my $lastCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","1970-01-01 00:00:00"))));;\
  $ret .= '<div style="text-align:left;;">last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">tasmota</a>-check => '.$lastCheck.' ...</div>';;\
  $ret .= '<br><pre>';;\
  $ret .= "| device                           | current |   new   |  released  |<br>";;\
  $ret .= "---------------------------------------------------------------------<br>";;\
  my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
  if($check eq "no updates needed!") {\
    $ret .= '| <b style="color:green;;">';;\
    $ret .= sprintf("%-65s",$check);;\
    $ret .= '</b> |';;\
  } elsif($check eq "error => no or wrong data from server!") {\
    $ret .= '| <b style="color:red;;">';;\
    $ret .= sprintf("%-65s",$check);;\
    $ret .= '</b> |';;\
  } else {\
    my @devices = split(',',$check);;\
    foreach my $devStr (@devices) {\
      my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\
      $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
      $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;\
      $ret .= '</b></a> | ';;\
      $ret .= '<b style="color:lightgray;;">';;\
      $ret .= '<a href="http://'.ReadingsVal($dev,"Info2_IPAddress",ReadingsVal($dev,"INFO2_IPAddress",ReadingsVal($dev,"IPAddress","0.0.0.0"))).'/up" target="_blank">';;\
      $ret .= sprintf("%7s",$old);;\
      $ret .= '</a></b> | ';;\
      $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'" target="_blank">';;\
      $ret .= '<b style="color:red;;">';;\
      $ret .= sprintf("%7s",$new);;\
      $ret .= '</b></a> | ';;\
      $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'" target="_blank">';;\
      $ret .= '<b>';;\
      $ret .= sprintf("%-10s",$date);;\
      $ret .= '</b></a>';;\
      $ret .= " |<br>";;\
    }\
  }\
  $ret .= '</pre><br>';;\
  my $nextCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(InternalVal($name,".TRIGGERTIME",0)));;\
  $ret .= '<div style="text-align:left;;">... next <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">tasmota</a>-check => '.$nextCheck.'</div>';;\
  $ret .= '</div>';;\
  return $ret;;\
}
attr DEVICE timestamp-on-change-reading .*
attr DEVICE updatableDevicesMode UPDATABLEMODE
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*")) {\
      my $version = ReadingsVal($dev,"Info1_Version",ReadingsVal($dev,"INFO1_Version",ReadingsVal($dev,"Version","0.0.0")));;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if ( AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION ) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model tasmota_firmware_updates
setreading DEVICE attrTemplateVersion 20220808


zigbee2mqtt

#Contributed by OdfFHEM, see https://forum.fhem.de/index.php/topic,97694.msg998835.html#msg998835
name:zigbee2mqtt_daemon_updates
filter:TYPE=HTTPMOD
desc: Check zigbee2mqtt homepage for new versions of the deamon software.<br>Define a HTTPMOD device like <br>define zigbee2mqtt_updates HTTPMOD https://github.com/Koenkk/zigbee2mqtt/tags 604800<br><a href="https://forum.fhem.de/index.php/topic,97694.msg998835.html#msg998835">Source: Forum</a>.
order:TECHZ07
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:INTERVAL;Actual interval for updating, defaults to one day; {InternalVal("DEVICE","Interval",604800)}
par:UPDATABLEMODE;Actual mode for updatableDevices, defaults to onlyUpdatable; {AttrVal("DEVICE","updatableDevicesMode","onlyUpdatable")}
defmod DEVICE HTTPMOD https://api.github.com/repos/Koenkk/zigbee2mqtt/releases/latest INTERVAL
attr DEVICE userattr reading01JSON reading01Name reading01OExpr reading02JSON reading02Name reading02OExpr updatableDevicesMode:onlyUpdatable,all
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 0
deleteattr DEVICE reading01Regex
attr DEVICE reading01JSON tag_name
attr DEVICE reading01Name latestVersion
attr DEVICE reading01OExpr $val =~ m/^(\d+).(\d+).(\d+)$/ ;; "$1.$2.$3"
deleteattr DEVICE reading02Regex
attr DEVICE reading02JSON published_at
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})T..:..:..Z$/ ;; "$3.$2.$1"
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat { \
  my $ret ="";;\
  $ret .= '<div style="text-align:left">';;\
  my $lastCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","1970-01-01 00:00:00"))));;\
  $ret .= '<div style="text-align:left;;">last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">zigbee2mqtt</a>-check => '.$lastCheck.' ...</div>';;\
  $ret .= '<br><pre>';;\
  $ret .= "| device                           | current |   new   |  released  |<br>";;\
  $ret .= "---------------------------------------------------------------------<br>";;\
  my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
  if($check eq "no updates needed!") {\
    $ret .= '| <b style="color:green">';;\
    $ret .= sprintf("%-65s",$check);;\
    $ret .= '</b> |';;\
  } elsif($check eq "error => no or wrong data from server!") {\
    $ret .= '| <b style="color:red">';;\
    $ret .= sprintf("%-65s",$check);;\
    $ret .= '</b> |';;\
  } else {\
    my @devices = split(',',$check);;\
    foreach my $devStr (@devices) {\
      my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\
      $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
      $ret .= sprintf("%-32s",$dev);;\
      $ret .= '</b></a> | ';;\
      $ret .= '<b style="color:lightgray">';;\
      $ret .= sprintf("%7s",$old);;\
      $ret .= '</b> | ';;\
      $ret .= '<a href="https://github.com/Koenkk/zigbee2mqtt/releases/tag/'.$new.'" target="_blank">';;\
      $ret .= '<b style="color:'.(($new eq $old)?'black':'red').'">';;\
      $ret .= sprintf("%7s",$new);;\
      $ret .= '</b></a> | ';;\
      $ret .= '<a href="https://github.com/Koenkk/zigbee2mqtt/releases/tag/'.$new.'" target="_blank">';;\
      $ret .= '<b>';;\
      $ret .= sprintf("%-10s",$date);;\
      $ret .= '</b></a>';;\
      $ret .= " |<br>";;\
    }\
  }\
  $ret .= '</pre><br>';;\
  my $nextCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(InternalVal($name,".TRIGGERTIME",0)));;\
  $ret .= '<div style="text-align:left;;">... next <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">zigbee2mqtt</a>-check => '.$nextCheck.'</div>';;\
  $ret .= '</div>';;\
  return $ret;;\
}
attr DEVICE updatableDevicesMode UPDATABLEMODE
attr DEVICE timestamp-on-change-reading .*
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=NAME=.*zigbee.*bridge.*")) {\
      my $version = ReadingsVal($dev,"version","0.0.0");;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if (AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model zigbee2mqtt_daemon_updates
setreading DEVICE attrTemplateVersion 20220808



@all
Da man insbesondere bei Tasmota drei Entwicklungsstände unterstützen will/sollte, bin ich beim devspec auch auf readingList ausgewichen.
Gäbe es eigentlich eine Möglichkeit, alle Geräte mittels list aufzuführen, die eins von drei möglichen Readings haben ?
(heisst übersetzt: ein qualifiziertes DEVICE hat entweder ein Reading namens Version oder INFO1_Version oder Info1_Version)
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 08 August 2022, 20:49:13
Zitat von: Beta-User am 08 August 2022, 10:32:04
Moin, ich gehe mal davon aus, dass amenomade einfach grade länger im Urlaub ist und das dann irgendwann gerne machen wird:
Den Wechsel zu amenomade habe ich scheinbar nicht mitbekommen - sorry ... mal schauen, was sich noch an den Templates bis zum Einchecken ändert ...

Zitat von: Beta-User am 08 August 2022, 10:32:04
DEVICE (genauer: alle par:-Parameter) kann/muss man "escapen".

Vorübergehend habe ich UPDATABLEMODE wieder in UPDATABLEDEVICESMODE umbenannt:

attr DEVICE updatableDevicesMode UPDATABLEDEVICESMODE
--> DEVICE lautet "TasmotaFirmwareRelease"
--> attr-Anweisung führt zum vorhersehbaren Attribut-Wert "UPDATABLETasmotaFirmwareReleaseSMODE"

attr DEVICE updatableDevicesMode UPDATABLE\DEVICESMODE
--> DEVICE wird nicht mehr eingesetzt
--> attr-Anweisung wird aber quasi 1:1 ausgeführt und es findet keinerlei Ersetzung statt
--> Attribut-Wert lautet "UPDATABLEDEVICESMODE"
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Beta-User am 08 August 2022, 20:59:36
Zitat von: OdfFhem am 08 August 2022, 20:49:13
Vorübergehend habe ich UPDATABLEMODE wieder in UPDATABLEDEVICESMODE umbenannt:
Ah, jetzt ist auch bei mir der Groschen gefallen - sowas geht mWn. nicht, die par:-Namen sollten keine "wechselseitigen Bruchstücke" bzw. "DEVICE" enthalten... Dachte, das sollte hinterher (nach Anwendung des attrTemplate) im Klartext so stehen bleiben ::) .
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 09 August 2022, 08:19:18
Zitat von: OdfFhem am 08 August 2022, 20:35:04
@all
Da man insbesondere bei Tasmota drei Entwicklungsstände unterstützen will/sollte, bin ich beim devspec auch auf readingList ausgewichen.
Gäbe es eigentlich eine Möglichkeit, alle Geräte mittels list aufzuführen, die eins von drei möglichen Readings haben ?
(heisst übersetzt: ein qualifiziertes DEVICE hat entweder ein Reading namens Version oder INFO1_Version oder Info1_Version)

Irgendwie scheint die Lösung einfach ... Verwendung von Komma führt wohl zum Ziel ...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 09 August 2022, 08:21:13
@OdfFhem:
Zitat von: OdfFhem am 08 August 2022, 20:35:04@all
Da man insbesondere bei Tasmota drei Entwicklungsstände unterstützen will/sollte, bin ich beim devspec auch auf readingList ausgewichen.
Gäbe es eigentlich eine Möglichkeit, alle Geräte mittels list aufzuführen, die eins von drei möglichen Readings haben ?
(heisst übersetzt: ein qualifiziertes DEVICE hat entweder ein Reading namens Version oder INFO1_Version oder Info1_Version)
Ich nutze für die JsonMod Version die devspec
readingList~.*tele[/].*INFO.*
was einem list
list readingList~.*tele[/].*INFO.*
entspricht und greife dann kaskadierend drauf zu, zB
my $version = ReadingsVal($dev,"Info1_Version",ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0")));

Zitat von: OdfFhem am 08 August 2022, 20:35:04Beide Templates noch ein wenig überarbeitet/getestet und Deine Vorschläge einfliessen lassen.

tasmota

#Contributed by OdfFHEM, see https://forum.fhem.de/index.php/topic,97694.msg992348.html#msg992348
name:tasmota_firmware_updates
filter:TYPE=HTTPMOD
desc: Check Tasmota homepage for available new firmware files<br>Define a HTTPMOD device like <br>define tasmotaupdates HTTPMOD https://github.com/arendst/Tasmota/tags 86400<a href="https://forum.fhem.de/index.php/topic,97694.msg992308.html#msg992308">Source: Forum</a>.
order:TECHZ06
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:UPDATABLEMODE;Actual mode for updatableDevices, defaults to onlyUpdatable; {AttrVal("DEVICE","updatableDevicesMode","onlyUpdatable")}
par:INTERVAL;Actual interval for updating, defaults to one week; {InternalVal("DEVICE","Interval","604800")}
defmod DEVICE HTTPMOD https://api.github.com/repos/arendst/Tasmota/releases/latest INTERVAL
attr DEVICE userattr reading01JSON reading01Name reading01OExpr reading02JSON reading02Name reading02OExpr updatableDevicesMode:onlyUpdatable,all
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 0
deleteattr DEVICE reading01Regex
attr DEVICE reading01JSON tag_name
attr DEVICE reading01Name latestVersion
attr DEVICE reading01OExpr $val =~ m/^v(\d+).(\d+).(\d+)$/ ;; "$1.$2.$3"
deleteattr DEVICE reading02Regex
attr DEVICE reading02JSON published_at
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})T..:..:..Z$/ ;; "$3.$2.$1"
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat { \
  my $ret ="";;\
  $ret .= '<div style="text-align:left;;">';;\
  my $lastCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","1970-01-01 00:00:00"))));;\
  $ret .= '<div style="text-align:left;;">last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">tasmota</a>-check => '.$lastCheck.' ...</div>';;\
  $ret .= '<br><pre>';;\
  $ret .= "| device                           | current |   new   |  released  |<br>";;\
  $ret .= "---------------------------------------------------------------------<br>";;\
  my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
  if($check eq "no updates needed!") {\
    $ret .= '| <b style="color:green;;">';;\
    $ret .= sprintf("%-65s",$check);;\
    $ret .= '</b> |';;\
  } elsif($check eq "error => no or wrong data from server!") {\
    $ret .= '| <b style="color:red;;">';;\
    $ret .= sprintf("%-65s",$check);;\
    $ret .= '</b> |';;\
  } else {\
    my @devices = split(',',$check);;\
    foreach my $devStr (@devices) {\
      my ($dev,$old,$new,$date) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\)$/;;\
      $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
      $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;\
      $ret .= '</b></a> | ';;\
      $ret .= '<b style="color:lightgray;;">';;\
      $ret .= '<a href="http://'.ReadingsVal($dev,"Info2_IPAddress",ReadingsVal($dev,"INFO2_IPAddress",ReadingsVal($dev,"IPAddress","0.0.0.0"))).'/up" target="_blank">';;\
      $ret .= sprintf("%7s",$old);;\
      $ret .= '</a></b> | ';;\
      $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'" target="_blank">';;\
      $ret .= '<b style="color:red;;">';;\
      $ret .= sprintf("%7s",$new);;\
      $ret .= '</b></a> | ';;\
      $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'" target="_blank">';;\
      $ret .= '<b>';;\
      $ret .= sprintf("%-10s",$date);;\
      $ret .= '</b></a>';;\
      $ret .= " |<br>";;\
    }\
  }\
  $ret .= '</pre><br>';;\
  my $nextCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(InternalVal($name,".TRIGGERTIME",0)));;\
  $ret .= '<div style="text-align:left;;">... next <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">tasmota</a>-check => '.$nextCheck.'</div>';;\
  $ret .= '</div>';;\
  return $ret;;\
}
attr DEVICE timestamp-on-change-reading .*
attr DEVICE updatableDevicesMode UPDATABLEMODE
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    foreach my $dev (devspec2array("TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*")) {\
      my $version = ReadingsVal($dev,"Info1_Version",ReadingsVal($dev,"INFO1_Version",ReadingsVal($dev,"Version","0.0.0")));;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      if ( AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $version ne $VERSION ) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE.")";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model tasmota_firmware_updates
setreading DEVICE attrTemplateVersion 20220808
Passt & sieht gut aus!
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: rudolfkoenig am 09 August 2022, 08:58:44
ZitatGäbe es eigentlich eine Möglichkeit, alle Geräte mittels list aufzuführen, die eins von drei möglichen Readings haben ?
(heisst übersetzt: ein qualifiziertes DEVICE hat entweder ein Reading namens Version oder INFO1_Version oder Info1_Version)


fhem> define d1 dummy
fhem> setreading d1 Version 1
fhem> define d2 dummy
fhem> setreading d2 INFO1_Version 2
fhem> define d3 dummy
fhem> setreading d3 Info1_Version 3
fhem> list .* Version Info1_Version INFO1_Version
d1                   2022-08-09 08:52:13   Version         1
d2                   2022-08-09 08:52:13   INFO1_Version   2
d3                   2022-08-09 08:52:13   Info1_Version   3


Ich vermute aber, dass man hier eigentlich devspec und nicht list braucht, und dieser Vorschlag nicht weiterhilft.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 13 August 2022, 06:18:02
Zitat von: rudolfkoenig am 09 August 2022, 08:58:44
Ich vermute aber, dass man hier eigentlich devspec und nicht list braucht, und dieser Vorschlag nicht weiterhilft.

Stimmt, letztlich suche ich eine devspec - finde bzw. teste diese allerdings meist mittels list.

Die hier verwendete devspec führt zum selben Ergebnis bei den drei dummys.

list Version!=,INFO1_Version!=,Info1_Version!= Version INFO1_Version Info1_Version

Nach diesem devspec-Muster würde ich das Template anpassen ...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: yersinia am 13 August 2022, 08:58:16
Zitat von: OdfFhem am 13 August 2022, 06:18:02Die hier verwendete devspec führt zum selben Ergebnis bei den drei dummys.

list Version!=,INFO1_Version!=,Info1_Version!= Version INFO1_Version Info1_Version

Nach diesem devspec-Muster würde ich das Template anpassen ...
Spuckt bei mir neben den Tasmota-Devices auch das hminfo device aus, da
Internals:
   FUUID      5c443cf2-f33f-3151-5ba5-4115d6f1ec7f06fd
   NAME       hm
   NR         78
   NTFY_ORDER 50-hm
   STATE      updated:2022-06-27 14:34:11
   TYPE       HMinfo
   Version    01 ##<==== DESWEGEN
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 14 August 2022, 08:54:08
@yersinia

Die sich nach dem devspec-Muster ergebende Anpassung sähe ungefähr so aus:

list TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=INFO1_Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=Info1_Version!=


Damit sollten sich nur in Frage kommende Geräte qualifizieren und die kaskadierende Ermittlung der installierten Version zum Erfolg führen ...
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: OdfFhem am 03 September 2022, 21:03:57
Templates für tasmota bzw. zigbee2mqtt überarbeitet:
- das Attribut stateFormat legt jetzt nur noch den Inhalt von STATE fest
- das Attribut devStateIcon legt die anzuzeigende (Tabellen)Information fest


#Contributed by OdfFHEM
name:tasmota_firmware_updates
filter:TYPE=HTTPMOD
desc: Check Tasmota homepage for available new firmware files<br>Define a HTTPMOD device like <br>define tasmotaupdates HTTPMOD https://github.com/arendst/Tasmota/tags 86400<a href="https://forum.fhem.de/index.php/topic,97694.msg992308.html#msg992308">Source: Forum</a>.
order:TECHZ06
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:UPDATABLEMODE;Actual mode for updatableDevices, defaults to onlyUpdatable; {AttrVal("DEVICE","updatableDevicesMode","onlyUpdatable")}
par:INTERVAL;Actual interval for updating, defaults to one week; {InternalVal("DEVICE","Interval","604800")}
defmod DEVICE HTTPMOD https://api.github.com/repos/arendst/Tasmota/releases/latest INTERVAL
attr DEVICE userattr reading01JSON reading01Name reading01OExpr reading02JSON reading02Name reading02OExpr updatableDevicesMode:onlyUpdatable,all
attr DEVICE devStateIcon {\
  my $ret ="";;\
  $ret .= '<div style="text-align:left;;">';;\
  my $lastCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","1970-01-01 00:00:00"))));;\
  $ret .= '<div style="text-align:left;;">last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">tasmota</a>-check => '.$lastCheck.' ...</div>';;\
  $ret .= '<br><pre>';;\
  my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
  if($check eq "no updates needed!") {\
    $ret .= '<b style="color:green;;">';;\
    $ret .= sprintf("%-68s",$check);;\
    $ret .= '</b>';;\
  } elsif($check eq "error => no or wrong data from server!") {\
    $ret .= '<b style="color:red;;">';;\
    $ret .= sprintf("%-68s",$check);;\
    $ret .= '</b>';;\
  } else {\
    $ret .= "| device                           | current |   new   |  released  |<br>";;\
    $ret .= "---------------------------------------------------------------------<br>";;\
    my @devices = split(',',$check);;\
    splice(@devices, 0, 1);;\
    foreach my $devStr (@devices) {\
      my ($dev,$old,$new,$date,$updatable) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\s\|\s([^\)]+)\)$/;;\
      $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
      $ret .= sprintf("%-32s",AttrVal($dev,"alias",$dev));;\
      $ret .= '</b></a> | ';;\
      $ret .= '<b>';;\
      $ret .= '<a href="http://'.ReadingsVal($dev,"Info2_IPAddress", ReadingsVal($dev,"INFO2_IPAddress", ReadingsVal($dev,"IPAddress","0.0.0.0"))).'/up" target="_blank">';;\
      $ret .= sprintf("%7s",$old);;\
      $ret .= '</a></b> | ';;\
      $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'" target="_blank">';;\
      $ret .= '<b'.(($updatable eq "0")?'':' style="color:red;;"').'>';;\
      $ret .= sprintf("%7s",$new);;\
      $ret .= '</b></a> | ';;\
      $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'" target="_blank">';;\
      $ret .= '<b>';;\
      $ret .= sprintf("%-10s",$date);;\
      $ret .= '</b></a>';;\
      $ret .= " |<br>";;\
    }\
  }\
  $ret .= '</pre><br>';;\
  my $nextCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(InternalVal($name,".TRIGGERTIME",0)));;\
  $ret .= '<div style="text-align:left;;">... next <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">tasmota</a>-check => '.$nextCheck.'</div>';;\
  $ret .= '</div>';;\
  return $ret;;\
}
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 0
deleteattr DEVICE reading01Regex
attr DEVICE reading01JSON tag_name
attr DEVICE reading01Name latestVersion
attr DEVICE reading01OExpr $val =~ m/^v(\d+).(\d+).(\d+)$/ ;; "$1.$2.$3"
deleteattr DEVICE reading02Regex
attr DEVICE reading02JSON published_at
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})T..:..:..Z$/ ;; "$3.$2.$1"
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat {\
  my $ret ="";;\
  my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
  if($check eq "no updates needed!") {\
    $ret .= sprintf("%s",$check);;\
  } elsif($check eq "error => no or wrong data from server!") {\
    $ret .= sprintf("%s",$check);;\
  } else {\
    $ret .= sprintf("%s update(s) needed",(split(',',$check))[0]);;\
  }\
  return $ret;;\
}
attr DEVICE timestamp-on-change-reading .*
attr DEVICE updatableDevicesMode UPDATABLEMODE
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    my $updatableCounter = 0;;\
    my $devspec = "TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=Version!=";;\
    $devspec .= ",TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=INFO1_Version!=";;\
    $devspec .= ",TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=Info1_Version!=";;\
    foreach my $dev (devspec2array($devspec)) {\
      my $version = ReadingsVal($dev,"Info1_Version", ReadingsVal($dev,"INFO1_Version", ReadingsVal($dev,"Version","0.0.0")));;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      my $updatable = ($version ne $VERSION)?"1":"0";;\
      if ( AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $updatable ne "0" ) {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE." | ".$updatable.")";;\
      }\
      $updatableCounter += 1 if ($updatable ne "0");;\
    }\
    $ret = $updatableCounter.",".$ret if($ret ne "");;\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model tasmota_firmware_updates
setreading DEVICE attrTemplateVersion 20220828
set DEVICE reread



#Contributed by OdfFHEM
name:zigbee2mqtt_daemon_updates
filter:TYPE=HTTPMOD
desc: Check zigbee2mqtt homepage for new versions of the deamon software.<br>Define a HTTPMOD device like <br>define zigbee2mqtt_updates HTTPMOD https://github.com/Koenkk/zigbee2mqtt/tags 604800<br><a href="https://forum.fhem.de/index.php/topic,97694.msg998835.html#msg998835">Source: Forum</a>.
order:TECHZ07
par:WHICHROOM;Actual room of the device, defaults to HTTPMOD; {AttrVal("DEVICE","room","HTTPMOD" )}
par:INTERVAL;Actual interval for updating, defaults to one day; {InternalVal("DEVICE","Interval",604800)}
par:UPDATABLEMODE;Actual mode for updatableDevices, defaults to onlyUpdatable; {AttrVal("DEVICE","updatableDevicesMode","onlyUpdatable")}
defmod DEVICE HTTPMOD https://api.github.com/repos/Koenkk/zigbee2mqtt/releases/latest INTERVAL
attr DEVICE userattr reading01JSON reading01Name reading01OExpr reading02JSON reading02Name reading02OExpr updatableDevicesMode:onlyUpdatable,all
attr DEVICE devStateIcon {\
  my $ret ="";;\
  $ret .= '<div style="text-align:left">';;\
  my $lastCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"MATCHED_READINGS","1970-01-01 00:00:00"))));;\
  $ret .= '<div style="text-align:left;;">last <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">zigbee2mqtt</a>-check => '.$lastCheck.' ...</div>';;\
  $ret .= '<br><pre>';;\
  my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
  if($check eq "no updates needed!") {\
    $ret .= '<b style="color:green">';;\
    $ret .= sprintf("%-65s",$check);;\
    $ret .= '</b>';;\
  } elsif($check eq "error => no or wrong data from server!") {\
    $ret .= '<b style="color:red">';;\
    $ret .= sprintf("%-65s",$check);;\
    $ret .= '</b>';;\
  } else {\
    $ret .= "| device                           | current |   new   |  released  |<br>";;\
    $ret .= "---------------------------------------------------------------------<br>";;\
    my @devices = split(',',$check);;\
    splice(@devices, 0, 1);;\
    foreach my $devStr (@devices) {\
      my ($dev,$old,$new,$date,$updatable) = $devStr =~ m/^([^\s]+)\s\(([^\s]+)\s\|\s([^\s]+)\s\|\s([^\)]+)\s\|\s([^\)]+)\)$/;;\
      $ret .= '| <a href="/fhem?detail='.$dev.'"><b>';;\
      $ret .= sprintf("%-32s",$dev);;\
      $ret .= '</b></a> | ';;\
      $ret .= '<b>';;\
      $ret .= sprintf("%7s",$old);;\
      $ret .= '</b> | ';;\
      $ret .= '<a href="https://github.com/Koenkk/zigbee2mqtt/releases/tag/'.$new.'" target="_blank">';;\
      $ret .= '<b'.(($updatable eq "0")?'':' style="color:red;;"').'>';;\
      $ret .= sprintf("%7s",$new);;\
      $ret .= '</b></a> | ';;\
      $ret .= '<a href="https://github.com/Koenkk/zigbee2mqtt/releases/tag/'.$new.'" target="_blank">';;\
      $ret .= '<b>';;\
      $ret .= sprintf("%-10s",$date);;\
      $ret .= '</b></a>';;\
      $ret .= " |<br>";;\
    }\
  }\
  $ret .= '</pre><br>';;\
  my $nextCheck = POSIX::strftime("%d.%m.%Y, %H:%M",localtime(InternalVal($name,".TRIGGERTIME",0)));;\
  $ret .= '<div style="text-align:left;;">... next <a title="versions" href="'.InternalVal($name,"MainURL","unknown").'" target="_blank">zigbee2mqtt</a>-check => '.$nextCheck.'</div>';;\
  $ret .= '</div>';;\
  return $ret;;\
}
attr DEVICE enableControlSet 1
attr DEVICE event-on-change-reading .*
attr DEVICE event-on-update-reading LAST_ERROR,MATCHED_READINGS
attr DEVICE handleRedirects 0
deleteattr DEVICE reading01Regex
attr DEVICE reading01JSON tag_name
attr DEVICE reading01Name latestVersion
attr DEVICE reading01OExpr $val =~ m/^(\d+).(\d+).(\d+)$/ ;; "$1.$2.$3"
deleteattr DEVICE reading02Regex
attr DEVICE reading02JSON published_at
attr DEVICE reading02Name latestDate
attr DEVICE reading02OExpr $val =~ m/^(.{4})-(.{2})-(.{2})T..:..:..Z$/ ;; "$3.$2.$1"
attr DEVICE showError 1
attr DEVICE showMatched 1
attr DEVICE stateFormat {\
  my $ret ="";;\
  my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
  if($check eq "no updates needed!") {\
    $ret .= sprintf("%s",$check);;\
  } elsif($check eq "error => no or wrong data from server!") {\
    $ret .= sprintf("%s",$check);;\
  } else {\
    $ret .= sprintf("%s update(s) needed",(split(',',$check))[0]);;\
  }\
  return $ret;;\
}
attr DEVICE updatableDevicesMode UPDATABLEMODE
attr DEVICE timestamp-on-change-reading .*
attr DEVICE userReadings updatableDevices:MATCHED_READINGS.* {\
  my $ret = "";;\
  if (ReadingsVal($name,"MATCHED_READINGS","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    my $VERSION = ReadingsVal($name,"latestVersion","unknown");;\
    my $DATE = ReadingsVal($name,"latestDate","unknown");;\
    my $updatableCounter = 0;;\
    my $devspec = "TYPE=MQTT[2]?_[D]EVICE:FILTER=NAME=.*zigbee.*bridge.*";;\
    foreach my $dev (devspec2array($devspec)) {\
      my $version = ReadingsVal($dev,"version","0.0.0");;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      my $updatable = ($version ne $VERSION)?"1":"0";;\
      if (AttrVal($name,"updatableDevicesMode","onlyUpdatable") eq "all" || $updatable ne "0") {\
        $ret .= "," if($ret ne "");;\
        $ret .= $dev." (".$version." | ".$VERSION." | ".$DATE." | ".$updatable.")";;\
      }\
      $updatableCounter += 1 if ($updatable ne "0");;\
    }\
    $ret = $updatableCounter.",".$ret if($ret ne "");;\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr DEVICE webCmd reread
attr DEVICE room WHICHROOM
attr DEVICE model zigbee2mqtt_daemon_updates
setreading DEVICE attrTemplateVersion 20220828
set DEVICE reread

Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: DasQ am 08 November 2022, 19:28:21
hi,

da ich heut drüber gestolpert bin, dacht ich ich verlink das mal hier, da des template für easyoil nimmer stimmt.

Zitat von: yersinia am 20 Juli 2021, 10:40:16
Da esyoil sich nicht mehr abfragen lässt (https://forum.fhem.de/index.php/topic,107189.msg1166658.html#msg1166658), habe ich den Weg via check24 gefunden - lustigerweise nutzt check24 nach Angaben auf deren Webseite den Service von esyoil. Anbei die neue & erweiterte raw:
defmod Heizoel_esyoil HTTPMOD https://www.check24.de/heizoel/?c24_calculate=calculate&zipcode=%%PLZ%%&amount=%%MENGE%%&up=%%ENTLADESTELLEN%%&prod=%%OILGRADE%%&payment_type=%%PAYMENT%%&%%ANHANGER%%&%%SCHLAUCHLAENGE%%&%%EXPRESS%% 3600
attr Heizoel_esyoil userattr replacement03Value:1,2,3,4,5,6,7,8,9,10 replacement04Value:hose=,hose=hose_l,hose=hose_xl replacement05Value:short_vehicle=,short_vehicle=short_vehicle replacement06Value:8,4 replacement07Value:1,2,3,4,6 replacement08Value:express=,express=1
attr Heizoel_esyoil enableControlSet 1
attr Heizoel_esyoil reading010Name Heizoelpreis
attr Heizoel_esyoil reading010OExpr $val =~ s/,/\./;; $val;;
attr Heizoel_esyoil reading010Regex ([\d\,]+)\&nbsp\;;\&euro\;;
attr Heizoel_esyoil replacement01Mode text
attr Heizoel_esyoil replacement01Regex %%PLZ%%
attr Heizoel_esyoil replacement01Value 12345
attr Heizoel_esyoil replacement02Mode text
attr Heizoel_esyoil replacement02Regex %%MENGE%%
attr Heizoel_esyoil replacement02Value 5000
attr Heizoel_esyoil replacement03Mode text
attr Heizoel_esyoil replacement03Regex %%ENTLADESTELLEN%%
attr Heizoel_esyoil replacement03Value 1
attr Heizoel_esyoil replacement04Mode text
attr Heizoel_esyoil replacement04Regex %%SCHLAUCHLAENGE%%
attr Heizoel_esyoil replacement04Value hose=
attr Heizoel_esyoil replacement05Mode text
attr Heizoel_esyoil replacement05Regex %%ANHAENGER%%
attr Heizoel_esyoil replacement05Value short_vehicle=
attr Heizoel_esyoil replacement06Mode text
attr Heizoel_esyoil replacement06Regex %%OILGRADE%%
attr Heizoel_esyoil replacement06Value 8
attr Heizoel_esyoil replacement07Mode text
attr Heizoel_esyoil replacement07Regex %%PAYMENT%%
attr Heizoel_esyoil replacement07Value 2
attr Heizoel_esyoil replacement08Mode text
attr Heizoel_esyoil replacement08Regex %%EXPRESS%%
attr Heizoel_esyoil replacement08Value express=
attr Heizoel_esyoil stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
#my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,"Heizoelpreis","2000-01-01 00:00:00"))));;\
#my $lastCheck = FmtDateTime(InternalVal($name,".LastUpdate",0));;\
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;\
my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";;\
my $link = "https://www.check24.de/heizoel/?c24_calculate=calculate";;\
$link .= "&zipcode=".AttrVal($name,"replacement01Value","");;\
$link .= "&amount=".AttrVal($name,"replacement02Value","");;\
$link .= "&up=".AttrVal($name,"replacement03Value","");;\
$link .= "&".AttrVal($name,"replacement04Value","");; #hose length\
$link .= "&".AttrVal($name,"replacement05Value","");; #short vehicle\
$link .= "&prod=".AttrVal($name,"replacement06Value","");; # product 8 = normal schwefelarm 4 = premium schwefelarm\
$link .= "&payment_type=".AttrVal($name,"replacement07Value","");; # 1 = Barzahlung, 2 = EC-Karte, 3 = Vorkasse, 4 = Lastschrift, 5 = Wärmekonto, 6 = Rechnung, 10 = Ratenkauf\
$link .= "&".AttrVal($name,"replacement08Value","");; #express;;\
$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 Heizoel_esyoil timeout 10
attr Heizoel_esyoil webCmd reread

Dabei sind

  • replacement01Value => Postleitzahl
  • replacement02Value => Bestellmenge
  • replacement03Value => Entladestellen
  • replacement04Value => Schlauchlänge (hose= = egal; hose=hose_l = 60m; hose=hose_xl = 80m)
  • replacement05Value => Tankwagen mit/ohne Anhänger (short_vehicle= = mit Anhänger möglich; short_vehicle=short_vehicle = ohne Anhänger)
  • replacement06Value => Ölsorte (8 = normal schwefelarm; 4 = premium schwefelarm)
  • replacement07Value => Zahlart (1 = Bar; 2 = EC-Karte; 3 = Vorkasse; 4 = Lastschrift; 6 = Rechnung)
  • replacement08Value => Expresslieferung (express= = nein; express=1 = ja)



EDIT: @amenomade: ein Vorschlag für das Template:
#Contributed by subseven & yersinia, see https://forum.fhem.de/index.php/topic,107189.msg1167281.html#msg1167281
name:fuel_oil_check_esyoil
filter:TYPE=HTTPMOD
desc: checks fuel oil prices via check24.de (service provided by esyoil.com)<br />Define a HTTPMOD device like<br />define heizoelpreis HTTPMOD https://www.check24.de/heizoel/?c24_calculate=calculate&zipcode=%%PLZ%%&amount=%%MENGE%%&up=%%ENTLADESTELLEN%%&prod=%%OILGRADE%%&payment_type=%%PAYMENT%%&%%ANHANGER%%&%%SCHLAUCHLAENGE%%&%%EXPRESS%% 3600<br />Maintain Attributes for ZIP (PLZ), order volume (Bestellmenge), unloading points (Entladestellen), hose length (Schlauchlaenge), truck trailer accessibility (mit Anhaenger moeglich), oilgrade (Oelsorte), payment method (Zahlart) and express delivery (Expresslieferung) 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.msg1167281.html#msg1167281">this FHEM forum thread</a>
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","12345")}
par:ORDERVOLUME;fuel order volume in litre / Bestellmenge in Liter; {AttrVal("DEVICE","replacement02Value","5000")}
defmod DEVICE HTTPMOD https://www.check24.de/heizoel/?c24_calculate=calculate&zipcode=%%PLZ%%&amount=%%MENGE%%&up=%%ENTLADESTELLEN%%&prod=%%OILGRADE%%&payment_type=%%PAYMENT%%&%%ANHANGER%%&%%SCHLAUCHLAENGE%%&%%EXPRESS%% INTERVAL
attr DEVICE userattr replacement03Value:1,2,3,4,5,6,7,8,9,10 replacement04Value:hose=,hose=hose_l,hose=hose_xl replacement05Value:short_vehicle=,short_vehicle=short_vehicle replacement06Value:8,4 replacement07Value:1,2,3,4,6 replacement08Value:express=,express=1
attr DEVICE enableControlSet 1
attr DEVICE reading010Name Heizoelpreis
attr DEVICE reading010OExpr $val =~ s/,/\./;; $val;;
attr DEVICE reading010Regex ([\d\,]+)\&nbsp\;;\&euro\;;
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 hose=
attr DEVICE replacement05Mode text
attr DEVICE replacement05Regex %%ANHAENGER%%
attr DEVICE replacement05Value short_vehicle=
attr DEVICE replacement06Mode text
attr DEVICE replacement06Regex %%OILGRADE%%
attr DEVICE replacement06Value 8
attr DEVICE replacement07Mode text
attr DEVICE replacement07Regex %%PAYMENT%%
attr DEVICE replacement07Value 2
attr DEVICE replacement08Mode text
attr DEVICE replacement08Regex %%EXPRESS%%
attr DEVICE replacement08Value express=
attr DEVICE stateFormat { my $price = 0.0;;\
$price = (AttrNum($name,"replacement02Value",0)*ReadingsNum($name,"Heizoelpreis",0))/100;;\
my $lastCheck = ReadingsTimestamp($name,"Heizoelpreis","");;\
my $ret = "<div style=\"text-align: left;;\">".$lastCheck.":";;\
my $link = "https://www.check24.de/heizoel/?c24_calculate=calculate";;\
$link .= "&zipcode=".AttrVal($name,"replacement01Value","");;\
$link .= "&amount=".AttrVal($name,"replacement02Value","");;\
$link .= "&up=".AttrVal($name,"replacement03Value","");;\
$link .= "&".AttrVal($name,"replacement04Value","");; #hose length\
$link .= "&".AttrVal($name,"replacement05Value","");; #short vehicle\
$link .= "&prod=".AttrVal($name,"replacement06Value","");; # product 8 = normal schwefelarm 4 = premium schwefelarm\
$link .= "&payment_type=".AttrVal($name,"replacement07Value","");; # 1 = Barzahlung, 2 = EC-Karte, 3 = Vorkasse, 4 = Lastschrift, 5 = Wärmekonto, 6 = Rechnung, 10 = Ratenkauf\
$link .= "&".AttrVal($name,"replacement08Value","");; #express;;\
$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 room WHICHROOM
attr DEVICE model fuel_oil_check_esyoil
setreading DEVICE attrTemplateVersion 20210720


in wie weit des noch aktuell ist kann ich nicht sagen, aber es funktioniert.
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: DasQ am 14 November 2022, 18:51:41
hi,

ich nochmals.

also mir ist jetzt aufgefallen das mit dem single tankstellen template mir haufenweise "fehler" im log auf tauchen.

2022.11.14 18:09:29 2: Undefined subroutine &main::KraftstoffLP called at (eval 211973) line 1.

2022.11.14 18:09:29 2: Undefined subroutine &main::KraftstoffLP called at (eval 211974) line 1.

2022.11.14 18:09:29 2: Undefined subroutine &main::KraftstoffLP called at (eval 211976) line 1.

2022.11.14 18:09:29 2: Undefined subroutine &main::KraftstoffLP called at (eval 211977) line 1.

2022.11.14 18:09:29 2: Undefined subroutine &main::KraftstoffLP called at (eval 211979) line 1.

2022.11.14 18:09:29 2: Undefined subroutine &main::KraftstoffLP called at (eval 211980) line 1.

2022.11.14 18:09:29 2: Undefined subroutine &main::KraftstoffLP called at (eval 211988) line 1.

2022.11.14 18:09:29 2: Undefined subroutine &main::KraftstoffLP called at (eval 211989) line 1.


jetzt kann ich nicht sagen ob es aus meiner readingsgroup kommt oder aus dem httpmod

list httpmod
Internals:
   BUSY       0
   DEF        http://www.clever-tanken.de/tankstelle_details/56801 600
   FUUID      636b8658-f33f-5aff-a325-145c63a4b51896eb
   Interval   600
   MainURL    http://www.clever-tanken.de/tankstelle_details/56801
   ModuleVersion 4.1.14 - 19.8.2022
   NAME       Tankstelle_Avia_Wiggensbach
   NOTIFYDEV  global
   NR         182
   NTFY_ORDER 50-Tankstelle_Avia_Wiggensbach
   STATE      E5: 1.929 € / E10: 1.869 € / D: 2.049 €
   TYPE       HTTPMOD
   eventCount 435
   value     
   CompiledRegexes:
   HTTPCookieHash:
     csrftoken;:
       Name       csrftoken
       Options    expires=Mon, 13 Nov 2023 17:46:02 GMT; Max-Age=31449600; Path=/; SameSite=Lax
       Path       
       Value      z9fwKPApgMklmhne1mSiuPb7E8Okg5tlfHX8JodIJhFS3eZE31MQVXNfJV8aInQd
   HttpUtils:
     NAME       
     addr       https://www.clever-tanken.de:443
     auth       0
     code       200
     compress   1
     conn       
     data       
     displayurl https://www.clever-tanken.de/tankstelle_details/56801
     header     Cookie: csrftoken=z9fwKPApgMklmhne1mSiuPb7E8Okg5tlfHX8JodIJhFS3eZE31MQVXNfJV8aInQd
     host       www.clever-tanken.de
     httpheader HTTP/1.1 200 OK
Date: Mon, 14 Nov 2022 17:46:02 GMT
Server: Apache/2.4.29 (Ubuntu)
Vary: Cookie,Accept-Encoding
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Set-Cookie: csrftoken=z9fwKPApgMklmhne1mSiuPb7E8Okg5tlfHX8JodIJhFS3eZE31MQVXNfJV8aInQd; expires=Mon, 13 Nov 2023 17:46:02 GMT; Max-Age=31449600; Path=/; SameSite=Lax
Connection: close
     httpversion 1.0
     hu_blocking 0
     hu_filecount 1
     hu_port    443
     hu_portSfx
     ignoreredirects 1
     loglevel   4
     path       /tankstelle_details/56801
     protocol   https
     redirects  0
     timeout    10
     url        https://www.clever-tanken.de/tankstelle_details/56801
     sslargs:
   QUEUE:
   READINGS:
     2022-11-14 18:46:02   Diesel          2.049
     2022-11-14 18:46:02   SuperE10        1.869
     2022-11-14 18:46:02   SuperE5         1.929
     2022-11-09 11:57:06   attrTemplateVersion 20201129
     2022-11-14 18:46:02   city            Wiggensbach
     2022-11-14 18:46:02   street          Kempter Str. 11
     2022-11-14 18:46:02   zip             87487
   REQUEST:
     context    reading
     data       
     header     
     ignoreredirects 0
     num        unknown
     priority   1
     retryCount 0
     type       update
     url        https://www.clever-tanken.de/tankstelle_details/56801
   defptr:
     readingBase:
       Diesel     reading
       SuperE10   reading
       SuperE5    reading
       city       reading
       street     reading
       zip        reading
     readingNum:
       Diesel     01
       SuperE10   02
       SuperE5    03
       city       09
       street     07
       zip        08
     readingOutdated:
     requestReadings:
       update:
         Diesel     reading 01
         SuperE10   reading 02
         SuperE5    reading 03
         city       reading 09
         street     reading 07
         zip        reading 08
Attributes:
   enableControlSet 1
   group      Kraftstoffe
   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>
   reading07Name street
   reading07Regex "streetAddress">(.*)<
   reading08Name zip
   reading08Regex "http://schema.org/postalCode">(.*)<
   reading09Name city
   reading09Regex "http://schema.org/addressCountry">(.*)<
   readingOExpr $val =~ s/<[\d\D]+>//;$val
   room       all
   stateFormat E5: SuperE5 € / E10: SuperE10 € / D: Diesel €
   timeout    10
   userattr   reading04Name reading04Regex
   verbose    2


list readingsgroup

Internals:
   DEF        <Tankstelle>,<Diesel>,<Super E5>,<Super E10>,<PLZ>,<Ort>,<Straße> Tankstelle_.*:Diesel,SuperE5,SuperE10,zip,city,street
   FUUID      636a618e-f33f-5aff-8fc7-eb87da630dbfce73
   NAME       rg_Kraftstoffpreise
   NR         169
   NTFY_ORDER 50-rg_Kraftstoffpreise
   STATE      Initialized
   TYPE       readingsGroup
   changed    0
   mayBeVisible 1
   CONTENT:
     Tankstelle_Avia_Wiggensbach 1
     Tankstelle_Fenepark 1
     Tankstelle_Jet_LinderStr 1
     Tankstelle_Kaufmarkt_WaHo 1
     Tankstelle_Ran 1
   CONTENT2:
   DEVICES:
     ARRAY(0x55a0e010ae78)
     ARRAY(0x55a0e030b598)
     ARRAY(0x55a0dfc73140)
     ARRAY(0x55a0dfea7a70)
     ARRAY(0x55a0dfa7f008)
     ARRAY(0x55a0df9dd228)
   fhem:
     lastDefChange 7
     last_update 1668347742.16653
   helper:
     DEF       
     valueFormat {"$1<sup>$2</sup> €" if ($READING=~/^Super|Diesel/ && $VALUE=~/^(\d\.\d\d)(\d)$/)}
     valueStyle {'style="color:green;font-weight:bold"' if ($READING=~/^Super|Diesel/ && $VALUE eq KraftstoffLP($READING))}
     cellStyle:
       r:1        style="font-weight:bold"
     positions:
       Tankstelle_Avia_Wiggensbach.Diesel 2:1
       Tankstelle_Avia_Wiggensbach.SuperE10 2:3
       Tankstelle_Avia_Wiggensbach.SuperE5 2:2
       Tankstelle_Avia_Wiggensbach.city 2:5
       Tankstelle_Avia_Wiggensbach.street 2:6
       Tankstelle_Avia_Wiggensbach.zip 2:4
       Tankstelle_Fenepark.Diesel 3:1
       Tankstelle_Fenepark.SuperE10 3:3
       Tankstelle_Fenepark.SuperE5 3:2
       Tankstelle_Fenepark.city 3:5
       Tankstelle_Fenepark.street 3:6
       Tankstelle_Fenepark.zip 3:4
       Tankstelle_Jet_LinderStr.Diesel 4:1
       Tankstelle_Jet_LinderStr.SuperE10 4:3
       Tankstelle_Jet_LinderStr.SuperE5 4:2
       Tankstelle_Jet_LinderStr.city 4:5
       Tankstelle_Jet_LinderStr.street 4:6
       Tankstelle_Jet_LinderStr.zip 4:4
       Tankstelle_Kaufmarkt_WaHo.Diesel 5:1
       Tankstelle_Kaufmarkt_WaHo.SuperE10 5:3
       Tankstelle_Kaufmarkt_WaHo.SuperE5 5:2
       Tankstelle_Kaufmarkt_WaHo.city 5:5
       Tankstelle_Kaufmarkt_WaHo.street 5:6
       Tankstelle_Kaufmarkt_WaHo.zip 5:4
       Tankstelle_Ran.Diesel 6:1
       Tankstelle_Ran.SuperE10 6:3
       Tankstelle_Ran.SuperE5 6:2
       Tankstelle_Ran.city 6:5
       Tankstelle_Ran.street 6:6
       Tankstelle_Ran.zip 6:4
     values:
       formated:
         undef
         ARRAY(0x55a0dfe6bbe0)
         ARRAY(0x55a0e00f1b80)
         ARRAY(0x55a0dfc68b80)
         ARRAY(0x55a0dfe6bb98)
         ARRAY(0x55a0e0477cd8)
         ARRAY(0x55a0e037e628)
       orig:
         undef
         ARRAY(0x55a0df9dbbc8)
         ARRAY(0x55a0e04834b0)
         ARRAY(0x55a0dfc7fb88)
         ARRAY(0x55a0e02ca5c8)
         ARRAY(0x55a0e041ced8)
         ARRAY(0x55a0e02e64e8)
       prefixsuffix:
         undef
         ARRAY(0x55a0dfa21158)
         ARRAY(0x55a0e04e2a40)
         ARRAY(0x55a0dfe65cd0)
         ARRAY(0x55a0dfd9a9f8)
         ARRAY(0x55a0df9dc4b0)
         ARRAY(0x55a0dfd69038)
Attributes:
   alias      Kraftstoffpreisübersicht
   cellStyle  {"r:1" => 'style="font-weight:bold"'}
   group      Kraftstoffe
   room       INFO
   valueFormat {"$1<sup>$2</sup> €" if ($READING=~/^Super|Diesel/ && $VALUE=~/^(\d\.\d\d)(\d)$/)}
   valueStyle {'style="color:green;font-weight:bold"' if ($READING=~/^Super|Diesel/ && $VALUE eq KraftstoffLP($READING))}


für nenn tip wär ich sehr dankbar

Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Otto123 am 14 November 2022, 18:55:00
Hi,

da es nur 2x in Deiner ReadingsGroup steht, kann es nur daher kommen ;)

ZitatvalueStyle {'style="color:green;font-weight:bold"' if ($READING=~/^Super|Diesel/ && $VALUE eq KraftstoffLP($READING))}

Gruß Otto
Titel: Antw:httpmod.template: bugs, Fragen, Anregungen
Beitrag von: DasQ am 14 November 2022, 19:05:33
Danke  ;)

nachdem ichs hier gepostet hatte, hab ich nochmals selber gesucht und auch gefunden ... wenn man schon blind aus dem wiki kopiert sollte man halt auch alles kopieren. der part zur "99_myUtils.pm" fehlte ganz einfach ... ich seckel.

Farbliche Hervorhebung

Folgender Code kommt in 99_myUtils.pm

###########################################################################################
### Funktion für Ermittlung vom niedrigsten Preis für readingsGroup rg_Kraftstoffpreise ###
###########################################################################################
# damit die Funktion richtig funktioniert müssen alle Tankstellennamen mit "Tankstelle_"
# beginnen oder entsprechend devspec2array auf die eigenen Namen anpassen

sub KraftstoffLP($) {
  my ($r) = @_;
  return (sort map {ReadingsNum($_,$r,999)} devspec2array("Tankstelle_.*"))[0];
}



sorry fürs off topic
Titel: Aw: httpmod.template: bugs, Fragen, Anregungen
Beitrag von: 50watt am 30 Juni 2023, 12:50:22
Ich schlage folgende Änderung für das HTTPMOD template "zigbee2mqtt_daemon_updates" vor:
Statt (templateVersion: 20201129)
attr DEVICE reading01Regex commit-title">[\w\W]*?[\w\W]*?(\d*\.\d*\.\d*)[\w\W]*?
das:
attr DEVICE reading01Regex <a href=\"\/Koenkk\/zigbee2mqtt\/releases\/tag\/*?(\d*\.\d*\.\d*)[\w\W]*?</a>
Damit funktioniert (für mich) die Abfrage für die "latestVersion" von zigbee2mqtt wieder.
Titel: Aw: httpmod.template: bugs, Fragen, Anregungen
Beitrag von: Mexx13 am 25 Februar 2024, 21:09:23
Hallo,
ist hier bei den template noch jemand aktiv dabei?
ich verwende Bergfex und bekomme ständig die Fehlermeldung im Log:

2024.02.25 20:52:56 3: Bergfex: perl expression eval with expresion package main; my $timeDiff = $oRef->{'$timeDiff'};$val =~ /.*title="(.*)"|.*?>\n?([\d,-]+)|([\d:.,-]*)/;; $val="$1$2$3";; created warning: Use of uninitialized value $1 in concatenation (.) or string at (eval 264751) line 1.

2024.02.25 20:52:56 3: Bergfex: perl expression eval with expresion package main; my $timeDiff = $oRef->{'$timeDiff'};$val =~ /.*title="(.*)"|.*?>\n?([\d,-]+)|([\d:.,-]*)/;; $val="$1$2$3";; created warning: Use of uninitialized value $2 in concatenation (.) or string at (eval 264751) line 1.

2024.02.25 20:52:56 3: Bergfex: perl expression eval with expresion package main; my $timeDiff = $oRef->{'$timeDiff'};$val =~ /.*title="(.*)"|.*?>\n?([\d,-]+)|([\d:.,-]*)/;; $val="$1$2$3";; created warning: Use of uninitialized value $1 in concatenation (.) or string at (eval 264752) line 1.

2024.02.25 20:52:56 3: Bergfex: perl expression eval with expresion package main; my $timeDiff = $oRef->{'$timeDiff'};$val =~ /.*title="(.*)"|.*?>\n?([\d,-]+)|([\d:.,-]*)/;; $val="$1$2$3";; created warning: Use of uninitialized value $2 in concatenation (.) or string at (eval 264752) line 1.

2024.02.25 20:52:56 3: Bergfex: perl expression eval with expresion package main; my $timeDiff = $oRef->{'$timeDiff'};$val =~ /.*title="(.*)"|.*?>\n?([\d,-]+)|([\d:.,-]*)/;; $val="$1$2$3";; created warning: Use of uninitialized value $1 in concatenation (.) or string at (eval 264753) line 1.

Da scheint mit der regex etwas nicht zu stimmen, hat da jemand ahnung von? ich leider nicht :-/

Das zweite Thema. alle werte von "0" werden leider als ein Minus "-" in bergfex dargestellt und Punkt"0.3" als Komma "0,3". Kann man das umwandeln lassen, weil man könnte damit dann besser rechnen?
Wäre cool wenn da jemand ahnung davon hat, ich sage mal Danke für dieses Modul :D
Lg Max