httpmod.template: bugs, Fragen, Anregungen

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

Vorheriges Thema - Nächstes Thema

amenomade

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

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

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

Ok, geht doch, sorry. Ich weiss nicht, was ich früher gemacht hatte.

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

amenomade

#138
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.
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

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

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

amenomade

#141
Hab gerade was eingecheckt, mit einem Kommentar beim Parameter CITY. Mal sehen ob das verständlich ist
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

@amenomade, könntest du die Korrektur aus #131 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. :)
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

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

#144
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).

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

Zitat von: yersinia am 30 November 2020, 12:02:47
@amenomade, könntest du die Korrektur aus #131 noch ins SVN schubsen? Du kannst auch dies hier kopieren - inkludiert auch gleich die neue Sortierung:
Danke. :)
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

#146
Ich muss dich wegen 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
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

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

Intruder1956

Hallo
kann es sein, das das Template für clever-tanken nicht mehr funktioniert, wegen Änderungen ?

Bekomme keine Preise angezeigt.

Danke und Gruß

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