httpmod.template: bugs, Fragen, Anregungen

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

Vorheriges Thema - Nächstes Thema

amenomade

#120
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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Beta-User

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 ::) .)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

yersinia

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

yersinia

#123
Wegen ->https://forum.fhem.de/index.php/topic,87234.msg1094780.html#msg1094780 und der gezeigten Lösung von Christoph Morrison 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;;\
}
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

JoeALLb

#124
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
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

amenomade

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))

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

JoeALLb

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
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

yersinia

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

amenomade

#128
@yersinia: Danke. Habs eingecheckt.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

yersinia

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

amenomade

Haha. Leider habe ich das dummerweise und ohne Backup durch das checkout für die letzte Änderung überschrieben... Heisst: es kommt noch ;)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

yersinia

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

JoeALLb

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

FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

amenomade

#133
@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



Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

JoeALLb

Innsbruck, Wien und Salzburg funktionieren., Stationen nicht (müssen auch nicht!).

DevstateIcon einfach weglassen, das hatte ich mir lokal "gespiegelt".
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270