httpmod.template: bugs, Fragen, Anregungen

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

Vorheriges Thema - Nächstes Thema

Beta-User

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

#46
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>"}
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

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

Beta-User

 :)
Danke für die Rückmeldung. Das ganze ist jetzt via update verfügbar, nochmaliges kurzes Gegenchecken wäre nett...
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

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

Beta-User

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

OdfFhem

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


  • Um ans Datum zu kommen, musste die URL geändert werden; damit sollte hier auch ein defmod ins Template übernommen werden (wie z.B. bei eq3). Evtl. sollte man das aktuell geltende Aktualisierungsintervall aus einem schon existierenden FHEM-Device auslesen und übernehmen.
  • Es ist momentan kein Redirect-Handling mehr nötig; um es bei vorhandenen FHEM-Devices abzuschalten, bitte so übernehmen.
  • Die gewünschten Readings sind nun leicht anders zu ermitteln.


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

Beta-User

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

OdfFhem

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

Beta-User

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

OdfFhem

@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)) {\



Beta-User

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

OdfFhem

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

Beta-User

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

OdfFhem

#59
@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 ...