Anwendungsbeispiel JsonMod #7: github api für firmware update checks nutzen

Begonnen von yersinia, 18 April 2020, 16:54:24

Vorheriges Thema - Nächstes Thema

yersinia

GitHub ist so nett und stellt für die repos eine API zur Verfügung, mit der man sich vielerlei Informatiomen als JSON ausgeben lassen kann. Unter anderem releases von dort gepflegter Firmware. Ich nutze das zZt für Tasmota und ESPEasy.

Beiden templates haben gemein, dass sie ein user attribut updatableDevicesMode besitzen - auf onlyUpdatable (default) gesetzt, zeigt es nur solche Devices mit aktualisierbaer firmware an; mit all werden alle gefundenen Devices angezeigt (ähnlich zum homematic firmware check).

Tasmota firmware check mit JsonMod
Danke an Beta-User für die Idee und Vorlage für das HTTPMOD Modul! Dieses JsonMod Device funktioniert analog zum HTTMOD template (siehe diesen Thread).

RAW Definiton zum Kopieren. Interval ist auf täglich um 12:00 eingestellt.
defmod tasmota_fw_check JsonMod https://api.github.com/repos/arendst/Tasmota/releases/latest
attr tasmota_fw_check userattr updatableDevicesMode:onlyUpdatable,all
attr tasmota_fw_check interval 0 12 * * *
attr tasmota_fw_check readingList single(jsonPath('$.tag_name'), 'git_version', 'none');;\
single(jsonPath('$.published_at'), 'published_at', 'none');;
attr tasmota_fw_check room WHICHROOM
attr tasmota_fw_check stateFormat { my $ret ="";;\
my $highlightcolor = "DarkSlateGray";;\
my $lastCheck = ReadingsTimestamp($name,".computedReadings",0);;\
my $nextCheck = InternalVal($name,"NEXT","0");;\
my $cellstyle = "padding:3pt;;border-bottom:1px dotted lightgray;;";;\
$ret .= '<div style="text-align:left;;">';;\
$ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" rel="noopener noreferrer" target="_blank">tasmota</a>-check => '.$lastCheck;;\
$ret .= '<br />';;\
my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;;;\
if($check eq "no updates needed!") {\
  $ret .= '<div style="color:limegreen;;font-weight:bold;;">';;\
  $ret .= $check;;\
  $ret .= '</div>';;\
} elsif($check eq "error => no or wrong data from server!") {\
  $ret .= '<div style="color:red;;font-weight:bold;;">';;\
  $ret .= $check;;\
  $ret .= '</div>';;\
} else {\
  $ret .= '<br /><div style="display:table;;width:60%;;">';;\
$ret .= '<div style="display:table-row;;">';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:55%;;font-weight:bold;;">device</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:15%;;font-weight:bold;;">current</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:15%;;font-weight:bold;;">new</div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:15%;;font-weight:bold;;">released</div>';;\
$ret .= '</div>';; #header\
  my @devices = split(' ',$check);;\
  ReadingsVal($name,"published_at","2000-01-01T00:00:00Z") =~ m/^20(\d+)-(\d+)-(\d+)/;;\
  my $date = "$3.$2.$1";;\
  foreach my $dev (@devices) {\
    my $ip = ReadingsVal($dev,"Info2_IPAddress",ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO2_IPAddress","0.0.0.0")));;\
    my $old = ReadingsVal($dev,"Info1_Version",ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0")));;\
$old =~ m/([0-9.]*).*/;;\
$old = $1;;\
my $new = ReadingsVal($name,"git_version","none");;\
$new =~ m/([\d].*)/;;\
$new = $1;;\
$ret .= '<div style="display:table-row;;" onmouseover="this.style.background=\''.$highlightcolor.'\';;" onmouseout="this.style.background=\'transparent\';;">';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:55%;;"><a href="/fhem?detail='.$dev.'">';;\
  $ret .= AttrVal($dev,"alias",$dev);;\
  $ret .= '</a></div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:15%;;font-weight:bold;;">';;\
  $ret .= '<a href="http://'.$ip.'/up" rel="noopener noreferrer" target="_blank" style="color:lightgray;;">';;\
  $ret .= $old;;\
  $ret .= '</a></div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:15%;;font-weight:bold;;">';;\
  $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'" rel="noopener noreferrer" target="_blank" style="color:red;;">';;\
  $ret .= $new;;\
  $ret .= '</a></div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:15%;;font-weight:bold;;">';;\
  $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'" rel="noopener noreferrer" target="_blank">';;\
  $ret .= $date;;\
  $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 tasmota_fw_check updatableDevicesMode onlyUpdatable
attr tasmota_fw_check update-on-start 1
attr tasmota_fw_check userReadings updatableDevices {\
  my $ret = "";;\
  my $updateall = AttrVal($name,"updatableDevicesMode","");;\
  if (ReadingsVal($name,".computedReadings","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
my $devspec = "TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=INFO1_Version!=,TYPE=MQTT[2]?_[D]EVICE:FILTER=readingList~.*tele[/].*INFO.*:FILTER=Info1_Version!=";;\
    my $VERSION = ReadingsVal($name,"git_version","none");;\
$VERSION =~ m/([\d].*)/;;\
$VERSION = $1;;\
my ($h, $m, $l) = split('\.',$VERSION);;\
foreach my $dev (devspec2array($devspec)) {\
  my $version = ReadingsVal($dev,"Info1_Version",ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0")));;\
      $version =~ m/([0-9.]*).*/;;\
      $version = $1;;\
      my ($fwh, $fwm, $fwl) = split('\.',$version);;\
      if ($updateall eq "all") {\
$ret .= $dev." ";;\
      } elsif (($fwh < $h) || (($fwh == $h) && ($fwm < $m)) || (($fwh == $h) && ($fwm == $m) && ($fwl < $l))) {\
$ret .= $dev." ";;\
  }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}


ESPEasy firmware check mit JsonMod
RAW Definiton zum Kopieren. Interval ist auf täglich um 12:00 eingestellt.
defmod ESPEasy_fw_check JsonMod https://api.github.com/repos/letscontrolit/ESPEasy/releases
attr ESPEasy_fw_check userattr updatableDevicesMode:onlyUpdatable,all localESPEasyVersion
attr ESPEasy_fw_check interval 0 12 * * *
attr ESPEasy_fw_check readingList single(jsonPath('$[0].tag_name'), 'git_version', 'none');;\
single(jsonPath('$[0].published_at'), 'published_at', 'none');;
attr ESPEasy_fw_check room WHICHROOM
attr ESPEasy_fw_check stateFormat { my $ret ="";;\
my $highlightcolor = "DarkSlateGray";;\
my $lastCheck = ReadingsTimestamp($name,".computedReadings",0);;\
my $nextCheck = InternalVal($name,"NEXT","0");;\
my $cellstyle = "padding:3pt;;border-bottom:1px dotted lightgray;;";;\
my $dev ="";;\
my $new = ReadingsVal($name,"git_version","unknown");;\
$new =~ m/([\d]{8})/;;\
$new = $1;;\
$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 />';;\
my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
if($check eq "no updates needed!") {\
$ret .= '<div style="color:limegreen;;font-weight:bold;;">';;\
$ret .= $check;;\
$ret .= '</div>';;\
} elsif($check eq "error => no or wrong data from server!") {\
$ret .= '<div style="color:red;;font-weight:bold;;">';;\
$ret .= $check;;\
$ret .= '</div>';;\
} else {\
$ret .= '<br /><div style="display:table;;width:80%;;">';;\
$ret .= '<div style="display:table-row;;" onmouseover="this.style.background=\''.$highlightcolor.'\';;" onmouseout="this.style.background=\'transparent\';;">';;\
      $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:60%;;font-weight:bold;;">device</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">current</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">new</div>';;\
$ret .= '</div>';; #header\
my @devices = split(' ',$check);;\
foreach my $dev (@devices) {\
            my $old = InternalVal($dev,"ESP_BUILD_GIT",AttrVal($name,"localESPEasyVersion",("[".InternalVal($dev,"ESP_BUILD","unknown")."]")));;\
$old =~ m/([\d]{8})/;;\
$old = $1;;\
$ret .= '<div style="display:table-row;;">';;\
          $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:60%;;">';;\
$ret .= '<a href="/fhem?detail='.$dev.'" title="'.$dev.' ('.$old.')" >';;\
$ret .= AttrVal($dev,"alias",$dev);;\
$ret .= '</a></div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">';;\
$ret .= '<a href="https://github.com/letscontrolit/ESPEasy/releases/tag/mega-'.$old.'" title="ESPEasy Release mega-'.$old.'" rel="noopener noreferrer" target="_blank" style="color:lightgray;;">';;\
$ret .= $old;;\
$ret .= '</a></div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">';;\
$ret .= '<a href="https://github.com/letscontrolit/ESPEasy/releases/tag/mega-'.$new.'" title="ESPEasy Release mega-'.$new.'" rel="noopener noreferrer" target="_blank" style="color:orange;;">';;\
$ret .= $new;;\
$ret .= '</a></div>';;\
$ret .= '</div>';; #row\
}\
$ret .= '</div>';; #table\
    }\
$ret .= "<br /><div style=\"text-align:left;;\">(next check: ".$nextCheck.")</div>";;\
$ret .= '</div>';;\
  return $ret;;\
}
attr ESPEasy_fw_check updatableDevicesMode onlyUpdatable
attr ESPEasy_fw_check update-on-start 1
attr ESPEasy_fw_check userReadings updatableDevices {\
  my $ret = "";;\
  my $updateall = AttrVal($name,"updatableDevicesMode","");;\
  my $VERSION = ReadingsVal($name,"git_version","unknown");;\
  $VERSION =~ m/([\d]{8})/;;\
  $VERSION = $1;;\
  my $version = "";;\
  if (ReadingsVal($name,".computedReadings","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    foreach my $dev (devspec2array("TYPE=ESPEasy:FILTER=HOST!=bridge")) {\
      $version = InternalVal($dev,"ESP_BUILD_GIT",AttrVal($name,"localESPEasyVersion","unknown"));;\
      $version =~ m/([\d]{8})/;;\
      $version = $1;;\
      if(($updateall eq "all") || ($version ne $VERSION)) {\
        $ret .= $dev." ";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}


SIGNALduino firmware check mit JsonMod
RAW Definiton zum Kopieren. Interval ist auf täglich um 12:00 eingestellt.
defmod SIGNALduino_fw_check JsonMod https://api.github.com/repos/RFD-FHEM/SIGNALDuino/releases
attr SIGNALduino_fw_check userattr updatableDevicesMode:onlyUpdatable,all localSIGNALduinoVersion
attr SIGNALduino_fw_check interval 0 12 * * *
attr SIGNALduino_fw_check localSIGNALduinoVersion 3.5.0
attr SIGNALduino_fw_check readingList single(jsonPath('$[0].tag_name'), 'git_version', 'none');;\
single(jsonPath('$[0].published_at'), 'published_at', 'none');;
attr SIGNALduino_fw_check room WHICHROOM
attr SIGNALduino_fw_check stateFormat { my $ret ="";;\
my $highlightcolor = "DarkSlateGray";;\
my $lastCheck = ReadingsTimestamp($name,".computedReadings",0);;\
my $nextCheck = InternalVal($name,"NEXT","0");;\
my $githuburl = "https://github.com/RFD-FHEM/SIGNALDuino/releases/tag/";;\
my $cellstyle = "padding:3pt;;border-bottom:1px dotted lightgray;;";;\
my $dev ="";;\
my $new = ReadingsVal($name,"git_version","unknown");;\
$ret .= '<div style="text-align:left;;">';;\
$ret .= '<div>last <a href="https://github.com/RFD-FHEM/SIGNALDuino" title="SIGNALDuino" rel="noopener noreferrer" target="_blank">SIGNALDuino</a> version check => ';;\
$ret .= $lastCheck;;\
$ret .= '</div>';;\
my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
if($check eq "no updates needed!") {\
$ret .= '<div style="color:limegreen;;font-weight:bold;;">';;\
$ret .= $check;;\
$ret .= '&nbsp;;(latest: <a href="'.$githuburl.ReadingsVal($name,"git_version","unknown").'" title="SIGNALDuino '.$new.'" rel="noopener noreferrer" target="_blank" style="color:limegreen !important;;">';;\
$ret .= $new;;\
$ret .= '</a>)';;\
$ret .= '</div>';;\
} elsif($check eq "error => no or wrong data from server!") {\
$ret .= '<div style="color:red;;font-weight:bold;;">';;\
$ret .= $check;;\
$ret .= '</div>';;\
} else {\
$ret .= '<br /><div style="display:table;;width:99%;;">';;\
$ret .= '<div style="display:table-row;;">';;\
      $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:60%;;font-weight:bold;;">device</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">current</div>';;\
  $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">new</div>';;\
$ret .= '</div>';; #header\
my @devices = split(' ',$check);;\
foreach my $dev (@devices) {\
my $old = InternalVal($dev,"version",AttrVal($name,"localSIGNALduinoVersion","unknown"));;\
$old =~ m/(([\d]\.[\d]\.[\d]))/;;\
$old = $1;;\
$ret .= '<div style="display:table-row;;" onmouseover="this.style.background=\''.$highlightcolor.'\';;" onmouseout="this.style.background=\'transparent\';;">';;\
          $ret .= '<div style="display:table-cell;;'.$cellstyle.'width:60%;;">';;\
$ret .= '<a href="/fhem?detail='.$dev.'" title="'.$dev.' ('.$old.')" >';;\
$ret .= AttrVal($dev,"alias",$dev);;\
$ret .= '</a></div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">';;\
$ret .= $old;;\
$ret .= '</div>';;\
$ret .= '<div style="display:table-cell;;'.$cellstyle.'width:20%;;font-weight:bold;;">';;\
$ret .= '<a href="'.$githuburl.ReadingsVal($name,"git_version","unknown").'" title="SIGNALduino '.$new.'" rel="noopener noreferrer" target="_blank" style="color:orange !important;;">';;\
$ret .= $new;;\
$ret .= '</a></div>';;\
$ret .= '</div>';; #row\
}\
$ret .= '</div>';; #table\
    }\
$ret .= "<div style=\"text-align:left;;\">(next check: ".$nextCheck.")</div>";;\
$ret .= '</div>';;\
  return $ret;;\
}
attr SIGNALduino_fw_check updatableDevicesMode onlyUpdatable
attr SIGNALduino_fw_check update-on-start 0
attr SIGNALduino_fw_check userReadings updatableDevices {\
  my $ret = "";;\
  my $updateall = AttrVal($name,"updatableDevicesMode","");;\
  my $VERSION = ReadingsVal($name,"git_version","unknown");;\
  $VERSION =~ m/(([\d]\.[\d]\.[\d]))/;;\
  $VERSION = $1;;\
  my $version = "";;\
  if (ReadingsVal($name,".computedReadings","") eq "") {\
    $ret = "error => no or wrong data from server!";;\
  } else {\
    foreach my $dev (devspec2array("TYPE=SIGNALduino")) {\
  $version = InternalVal($dev,"version",AttrVal($name,"localSIGNALduinoVersion","unknown"));;\
      $version =~ m/(([\d]\.[\d]\.[\d]))/;;\
      $version = $1;;\
      if(($updateall eq "all") || ($version ne $VERSION)) {\
        $ret .= $dev." ";;\
      }\
    }\
  }\
  return ($ret eq "")?"no updates needed!":$ret;;\
}
attr SIGNALduino_fw_check webCmd reread


Über Feedback, Vorschläge und weitere Ideen freue ich mich. :)

Änderungshistorie
2020-04-18: fehlende ), device name mit - korrigiert, typo im tasmota github link, ;;;; reduziert (zwei reichen ;))
2020-04-19: weg vom <pre> zu mehr responsive design (<div>-Tabelle)
2020-04-20: attr update-on-start 1 zu beiden Templates hinzugefügt
2020-04-24: row-highlighting bei onmouseover hinzugefügt
2020-05-22: um binford6000 Tabellenlose Lösung umzusetzen, gibt es in post #11 einen Vorschlag, stateFormat und devStateIcon entsprechend anzupassen
2020-09-16: GitHub API Referenz aktualisiert
2020-12-03: Änderung der Datum-/Zeitanzeige (Letzte Aktualisierung, nächste Aktualisierung) zurück auf FHEM Standard: YYYY-MM-DD hh:mm:ss
2021-02-24: schon lange liefert ESP-Easy keine GIT Build Version mehr mit (InternalVal ESP_BUILD_GIT), daher gibt es jetzt ein userAttr localESPEasyVersion welches optional manuell mit der zuletzt installierten ESP-Easy-Version gepflegt werden. Ist das Attribut gesetzt, prüft der firmware-check darauf. Die Version muss nach jedem Update neu gepflegt werden. Nicht elegant, dafür zeigt der firmware-check aber nun an, wenn wirklich ein Update zur Verfügung steht.
2021-04-23: kleines Update für tasmota-fw-check weil mit dem Update auf 9.4.0 ua die Readings Version und IP als Info1_ ankommen, es sollte Abwärtskompatibel sein
2021-04-25: kleine Korrektur (Danke an khk123)
2021-05-03: mit dem heutigen ESP-Easy Release (mega-20210503) werden auch wieder das InternalVal ESP_BUILD_GIT befüllt; wenn dieses gefüllt ist, wird das Attribut localESPEasyVersion ignoriert (siehe auch EDIT 2021-02-24)
2021-11-11: kleines Update zum ESP-GIT-Version handling
2022-01-24: erste Version für einen SIGNALDuino Firmware check - funktioniert analog zum ESPEasy firmware check
2022-08-16: devspec für tasmota fw check verfeinert (Dank geht an OdfFhem)
2022-09-04: tasmota-fw-check: ersetzen der Zeitfunktion für die published at Spalte. Danke an OdfFhem für den Hinweis
2023-02-23: tasmota-fw-check: Verfeinern der Firmware-Version checks auf verschiedene Versionen (selbstgebaute Tasmota-Versionen können vier Versionstellen haben und dadurch neuer als die offizielle Release-Version sein)
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

Andy89

coole Sache. Danke!

zwei Sachen:
im Userreading fehlt hier die geschlossen Klammer:
if (($updateall eq "all") || ($version ne $VERSION)) {

und der name geht nicht, da dies nicht erlaubt ist:
tasmota-fw-check ändern in zB tasmota_fw_check

Das überwachen meiner Tasmota Devices ist damit echt viel einfacher =) Danke!
Beste Grüße
Andy
FHEM 6.0 auf rPi4 docker (mit Alexa & Siri); dbLog, FTUI, Sonos, XiaomiMapCreator auf rPi4 docker;
raspimatic auf rPi3+ > diverse Aktoren und Sensoren;
LGW > (PCA301),EC3000,LaCrosse; MQTT2 > WLAN-Steckdosen,Xiaomi Map;
Harmony Hub;Sonos;Onkyo AVR;RGB WLAN Controller;Netatmo;Withings;Unifi;AMAD

yersinia

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

binford6000

ZitatBeiden templates haben gemein, dass sie ein user attribut updatableDevicesMode besitzen - auf onlyUpdatable (default) gesetzt,
Ist nicht im default gesetzt:
2020.04.18 17:45:00 1:  Error evaluating tasmota_fw_check userReading updatableDevices: syntax error at (eval 4765044) line 15, near ") {"
Global symbol "$ret" requires explicit package name (did you forget to declare "my $ret"?) at (eval 4765044) line 20.
Global symbol "$ret" requires explicit package name (did you forget to declare "my $ret"?) at (eval 4765044) line 20.
syntax error at (eval 4765044) line 21, near ";
}"

Du solltest es oben in den defmods noch einbauen. Die Fehlermeldung erscheint nicht nur im Log, sondern auch im STATE (siehe Bild).
Immerhin zeigt es die aktuelle Tasmota-Version schon mal an  ;)
VG Sebastian

binford6000

Mit gesetztem Attribut updatableDevicesMode auf onlyUpdatable das Gleiche. Die Fehlermeldung wird in den STATE geschrieben.
Wie machst du die Erkennung auf die MQTT(2)_DEVICEs?
Ich finde nichts was darauf hindeutet (etwa sowas wie "Reading Version =~ /tasmota/" o.ä.)
VG Sebastian

yersinia

Hmm, den Fehler kann ich so nicht nachvollziehen. Hast du 98_JsonMod.pm vom heutigen Update eingespielt?

Um die Devices bei Tasmota zu finden nutze ich analog zu
list readingList~.*tele[/].*INFO.*

Das userattr ist in beiden templates gesetzt:
attr tasmota_fw_check userattr updatableDevicesMode:onlyUpdatable,all
attr tasmota_fw_check updatableDevicesMode onlyUpdatable

attr ESPEasy_fw_check userattr updatableDevicesMode:onlyUpdatable,all
attr ESPEasy_fw_check updatableDevicesMode onlyUpdatable


Hast du ggf etwas vergessen zu kopieren?
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

binford6000

Zitat von: yersinia am 18 April 2020, 19:21:17
Hmm, den Fehler kann ich so nicht nachvollziehen. Hast du 98_JsonMod.pm vom heutigen Update eingespielt?

Um die Devices bei Tasmota zu finden nutze ich analog zu
list readingList~.*tele[/].*INFO.*

Das userattr ist in beiden templates gesetzt:
attr tasmota_fw_check userattr updatableDevicesMode:onlyUpdatable,all
attr tasmota_fw_check updatableDevicesMode onlyUpdatable

attr ESPEasy_fw_check userattr updatableDevicesMode:onlyUpdatable,all
attr ESPEasy_fw_check updatableDevicesMode onlyUpdatable

Hast du ggf etwas vergessen zu kopieren?

Hab jetzt nochmal gelöscht und neu angelegt. Klappt wunderbar!  :-X
Danke!
VG Sebastian

yersinia

Super @binford6000. :)

Ich habe stateFormat der beiden templates angepasst, siehe auch erster post im raw. Für bestehende Devices könnt ihr auch hieraus direkt ins Attribut kopieren (kein RAW!):

tasmota_fw_check stateFormat:
{ my $ret ="";
my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,".computedReadings","2000-01-01 00:00:00"))));
my $nextCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(InternalVal($name,"NEXT","2000-01-01 00:00:00"))));
my $cellstyle = "padding:3pt;border-bottom:1px dotted lightgray;";
$ret .= '<div style="text-align:left;">';
$ret .= 'last <a title="versions" href="https://github.com/arendst/Tasmota/releases" rel="noopener noreferrer" target="_blank">tasmota</a>-check => '.$lastCheck;
$ret .= '<br />';
my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;
if($check eq "no updates needed!") {
  $ret .= '<div style="color:limegreen;font-weight:bold;">';
  $ret .= $check;
  $ret .= '</div>';
} elsif($check eq "error => no or wrong data from server!") {
  $ret .= '<div style="color:red;font-weight:bold;">';
  $ret .= $check;
  $ret .= '</div>';
} else {
  $ret .= '<br /><div style="display:table;width:60%;">';
$ret .= '<div style="display:table-row;">';
  $ret .= '<div style="display:table-cell;'.$cellstyle.'width:55%;font-weight:bold;">device</div>';
  $ret .= '<div style="display:table-cell;'.$cellstyle.'width:15%;font-weight:bold;">current</div>';
  $ret .= '<div style="display:table-cell;'.$cellstyle.'width:15%;font-weight:bold;">new</div>';
$ret .= '<div style="display:table-cell;'.$cellstyle.'width:15%;font-weight:bold;">released</div>';
$ret .= '</div>'; #header
  my @devices = split(' ',$check);
  my $date = POSIX::strftime("%d.%m.%y",localtime(time_str2num(ReadingsVal($name,"published_at","2000-01-01T00:00:00Z"))));
  foreach my $dev (@devices) {
my $old = ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0"));
$old =~ m/([0-9.]*).*/;
$old = $1;
my $new = ReadingsVal($name,"git_version","none");
$new =~ m/([\d].*)/;
$new = $1;
$ret .= '<div style="display:table-row;">';
  $ret .= '<div style="display:table-cell;'.$cellstyle.'width:55%;"><a href="/fhem?detail='.$dev.'">';
  $ret .= AttrVal($dev,"alias",$dev);
  $ret .= '</a></div>';
  $ret .= '<div style="display:table-cell;'.$cellstyle.'width:15%;font-weight:bold;">';
  $ret .= '<a href="http://'.ReadingsVal($dev,"IPAddress",ReadingsVal($dev,"INFO1_IPAddress","0.0.0.0")).'/up" rel="noopener noreferrer" target="_blank" style="color:lightgray;">';
  $ret .= $old;
  $ret .= '</a></div>';
  $ret .= '<div style="display:table-cell;'.$cellstyle.'width:15%;font-weight:bold;">';
  $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'" rel="noopener noreferrer" target="_blank" style="color:red;">';
  $ret .= $new;
  $ret .= '</a></div>';
  $ret .= '<div style="display:table-cell;'.$cellstyle.'width:15%;font-weight:bold;">';
  $ret .= '<a href="https://github.com/arendst/Tasmota/releases/tag/v'.$new.'" rel="noopener noreferrer" target="_blank">';
  $ret .= $date;
  $ret .= '</a></div>';
$ret .= '</div>'; #row
  }
  $ret .= '</div>'; #table
}
$ret .= "<br /><div style=\"text-align:left;\">(next check: ".$nextCheck.")</div>";
$ret .= '</div>';
  return $ret;
}


ESPEasy_fw_check stateFormat:
{ my $ret ="";
my $lastCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(ReadingsTimestamp($name,".computedReadings","2000-01-01 00:00:00"))));
my $nextCheck = POSIX::strftime("%d.%m. %H:%M",localtime(time_str2num(InternalVal($name,"NEXT","2000-01-01T00:00:00Z"))));
my $cellstyle = "padding:3pt;border-bottom:1px dotted lightgray;";
my $dev ="";
my $new = ReadingsVal($name,"git_version","unknown");
#$new =~ m/([\d]{8})/;
#$new = $1;
$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 />';
my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");
if($check eq "no updates needed!") {
$ret .= '<div style="color:limegreen;font-weight:bold;">';
$ret .= $check;
$ret .= '</div>';
} elsif($check eq "error => no or wrong data from server!") {
$ret .= '<div style="color:red;font-weight:bold;">';
$ret .= $check;
$ret .= '</div>';
} else {
$ret .= '<br /><div style="display:table;width:80%;">';
$ret .= '<div style="display:table-row;">';
      $ret .= '<div style="display:table-cell;'.$cellstyle.'width:60%;font-weight:bold;">device</div>';
  $ret .= '<div style="display:table-cell;'.$cellstyle.'width:20%;font-weight:bold;">current</div>';
  $ret .= '<div style="display:table-cell;'.$cellstyle.'width:20%;font-weight:bold;">new</div>';
$ret .= '</div>'; #header
my @devices = split(' ',$check);
foreach my $dev (@devices) {
my $old = InternalVal($dev,"ESP_BUILD_GIT","unknown");
#$old =~ m/([\d]{8})/;
#$old = $1;
$ret .= '<div style="display:table-row;">';
          $ret .= '<div style="display:table-cell;'.$cellstyle.'width:60%;">';
$ret .= '<a href="/fhem?detail='.$dev.'" title="'.$dev.' ('.$old.')" >';
$ret .= AttrVal($dev,"alias",$dev);
$ret .= '</a></div>';
$ret .= '<div style="display:table-cell;'.$cellstyle.'width:20%;font-weight:bold;">';
$ret .= '<a href="https://github.com/letscontrolit/ESPEasy/releases/tag/'.$old.'" title="ESPEasy Release mega-'.$old.'" rel="noopener noreferrer" target="_blank" style="color:lightgray;">';
$ret .= $old;
$ret .= '</a></div>';
$ret .= '<div style="display:table-cell;'.$cellstyle.'width:20%;font-weight:bold;">';
$ret .= '<a href="https://github.com/letscontrolit/ESPEasy/releases/tag/'.$new.'" title="ESPEasy Release mega-'.$new.'" rel="noopener noreferrer" target="_blank" style="color:orange;">';
$ret .= $new;
$ret .= '</a></div>';
$ret .= '</div>'; #row
}
$ret .= '</div>'; #table
    }
$ret .= "<br /><div style=\"text-align:left;\">(next check: ".$nextCheck.")</div>";
$ret .= '</div>';
  return $ret;
}
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

binford6000

Ich habe jetzt stateFormat komplett weggelassen und mir dafür ein devStatetIcon wie bei fhemInstaller, nodejs und AptToDate gebastelt:
no.updates.needed.:security@green .*:security@red
Ich brauche die Detail-Infos nicht und es sieht dann einheitlich aus (siehe Screenshot)  :)
VG Sebastian

Andy89

Zitat von: binford6000 am 19 April 2020, 16:16:45
Ich habe jetzt stateFormat komplett weggelassen und mir dafür ein devStatetIcon wie bei fhemInstaller, nodejs und AptToDate gebastelt:
no.updates.needed.:security@green .*:security@red
danke =) find ich sinnvoll und werde ich auch so ins TabletUI übernehmen =)
FHEM 6.0 auf rPi4 docker (mit Alexa & Siri); dbLog, FTUI, Sonos, XiaomiMapCreator auf rPi4 docker;
raspimatic auf rPi3+ > diverse Aktoren und Sensoren;
LGW > (PCA301),EC3000,LaCrosse; MQTT2 > WLAN-Steckdosen,Xiaomi Map;
Harmony Hub;Sonos;Onkyo AVR;RGB WLAN Controller;Netatmo;Withings;Unifi;AMAD

binford6000

Hallo,
anscheinend funktioniert die Tasmota-Geschichte nicht mehr:
git Version steht auf 8.3.0, updatableDevices ist gefüllt mit Update-Kandidaten aber der STATE steht auf no updates needed!:
Internals:
   API_LAST_RES 1589623201.00055
   API__LAST_MSG 200
   DEF        https://api.github.com/repos/arendst/Tasmota/releases/latest
   FUUID      5e9bfbc1-f33f-0308-0f97-c935bbdb86a45fa8
   FVERSION   98_JsonMod.pm:0.217110/2020-04-17
   NAME       tasmota
   NEXT       2020-05-17 12:00:00
   NOTIFYDEV  global
   NR         373
   NTFY_ORDER 50-tasmota
   SOURCE     https://api.github.com/repos/arendst/Tasmota/releases/latest (200)
   STATE      no updates needed!
   SVN        21711 2020-04-17 23:29:22 UTC
   TYPE       JsonMod
   CONFIG:
     IN_REQUEST 0
     SOURCE     https://api.github.com/repos/arendst/Tasmota/releases/latest
     SECRET:
   READINGS:
     2020-05-16 12:00:01   git_version     v8.3.0
     2020-05-16 12:00:01   published_at    2020-05-14T14:45:00Z
     2020-05-16 12:00:01   updatableDevices auvisio bz_sonoff_socket conrad4c wz_vase_licht
Attributes:
   alias      Tasmota Update Status
   comment    */15 * * * *
*/1 * * * *
0 12 */1 * *
   devStateIcon no.updates.needed.:security@green .*:security@red
   group      Update
   icon       control_standby
   interval   0 12 */1 * *
   readingList single(jsonPath('$.tag_name'), 'git_version', 'none');
single(jsonPath('$.published_at'), 'published_at', 'none');
   room       90_System->90_System
   updatableDevicesMode onlyUpdatable
   userReadings updatableDevices {
  my $ret = "";
  my $updateall = AttrVal($name,"updatableDevicesMode","");
  if (ReadingsVal($name,".computedReadings","") eq "") {
    $ret = "error => no or wrong data from server!";
  } else {
  my $devspec = "readingList~.*tele[/].*INFO.*";
    my $VERSION = ReadingsVal($name,"git_version","none");
$VERSION =~ m/([\d].*)/;
$VERSION = $1;
foreach my $dev (devspec2array($devspec)) {
      my $version = ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0"));
      $version =~ m/([0-9.]*).*/;
      $version = $1;
      if (($updateall eq "all") || ($version ne $VERSION)) {
        $ret .= $dev." ";
      }
    }
  }
  return ($ret eq "")?"no updates needed!":$ret;
}
   userattr   updatableDevicesMode:onlyUpdatable,all


Wo liegt der Fehler?
VG Sebastian

yersinia

Also bei mir hat dieses tasmota fw-check device die aktualisierte firmware und zugehörige devices gefunden. Und bei dir auch:
     2020-05-16 12:00:01   git_version     v8.3.0
     2020-05-16 12:00:01   published_at    2020-05-14T14:45:00Z
     2020-05-16 12:00:01   updatableDevices auvisio bz_sonoff_socket conrad4c wz_vase_licht

Es stehen Updates für auvisio bz_sonoff_socket, conrad4c und wz_vase_licht zur Verfügung.

Ich denke, da du den Device-Code adaptiert hast, wird der STATE nicht aktualsiert - und somit greift auch devStateIcon nicht:
STATE      no updates needed!
[...]
devStateIcon no.updates.needed.:security@green .*:security@red

Du benötigst noch etwas, dass dir den STATE entsprechend anpasst.

EDIT: das könnte ungefähr so aussehen:
attr tasmota_fw_check devStateIcon false:security@green true:security@red
attr tasmota_fw_check stateFormat { my $ret="";;\
my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
if($check eq "no updates needed!") {\
  $ret = 'false';;\
} elsif($check eq "error => no or wrong data from server!") {\
  $ret = 'false';;\
} else {\
  $ret = 'true';;\
}\
  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

binford6000

ZitatHallo,
anscheinend funktioniert die Tasmota-Geschichte nicht mehr:
git Version steht auf 8.3.0, updatableDevices ist gefüllt mit Update-Kandidaten aber der STATE steht auf no updates needed!:

Wo liegt der Fehler?
VG Sebastian

Ich habs jetzt mit einem kleinen Helferlein gelöst:
tasmota:updatableDevices:.* {
if ($EVTPART1 =~ /<RegEx.aller.Tasmota.Devices>/) {
fhem("setstate $NAME updates available!")
}
else {
fhem("setstate $NAME no updates needed!")
}
}


VG Sebastian  8)

yersinia

Uih, scheint irgendwie komplexer zu sein. Aber warum nicht stateFormat wie hier beschrieben anpassen und mit devStateIcon drauf reagieren?
Zitat von: yersinia am 17 Mai 2020, 14:21:35EDIT: das könnte ungefähr so aussehen:
attr tasmota_fw_check devStateIcon false:security@green true:security@red
attr tasmota_fw_check stateFormat { my $ret="";;\
my $check = ReadingsVal($name,"updatableDevices","error => no or wrong data from server!");;\
if($check eq "no updates needed!") {\
  $ret = 'false';;\
} elsif($check eq "error => no or wrong data from server!") {\
  $ret = 'false';;\
} else {\
  $ret = 'true';;\
}\
  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

binford6000

Hab deine Lösung glatt überlesen...  :-X ...und das notify wieder gelöscht  ;)
VG Sebastian

yersinia

Zitat von: binford6000 am 22 Mai 2020, 10:03:43Hab deine Lösung glatt überlesen...  :-X ...und das notify wieder gelöscht  ;)
Och, es gibt viele Lösungsmöglichkeiten. Gute Alternativen sind nie verkehrt. Hauptsache es funktioniert. ;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

binford6000

Sowas sollte aber am besten immer in einem Device gemacht werden - ohne zusätzliches Gedöns in Form von notify/doif etc... Deswegen auch der Vorzug deiner Lösung im Device selbst.
VG Sebastian


Gesendet von iPad mit Tapatalk

yersinia

Kleines Update in #1:
ZitatEDIT 2021-02-24: schon lange liefert ESP-Easy keine GIT Build Version mehr mit (InternalVal ESP_BUILD_GIT), daher gibt es jetzt ein userAttr localESPEasyVersion welches optional manuell mit der zuletzt installierten ESP-Easy-Version gepflegt werden. Ist das Attribut gesetzt, prüft der firmware-check darauf. Die Version muss nach jedem Update neu gepflegt werden. Nicht elegant, dafür zeigt der Firmware-check aber nun an, wenn wirklich ein Update zur Verfügung steht.
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

Kleines Update in #1
ZitatEDIT 2021-04-23: kleines Update für tasmota-fw-check weil mit dem Update auf 9.4.0 ua die Readings Version und IP als Info1_ ankommen, es sollte Abwärtskompatibel sein
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

khk123

Ist da nicht etwas doppelt?

Zeile 30 und 31

my $old = ReadingsVal($dev,"Info1_Version",ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0")));;\
my $old = ReadingsVal($dev,"Version",ReadingsVal($dev,"INFO1_Version","0.0.0"));;\

VG
Karlheinz
FHEM6.2, RasPi4, RasPi Zero W,
CUL V3, HM, ZWave, IT, vcontrol, owntracks, alexa

yersinia

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

khk123

FHEM6.2, RasPi4, RasPi Zero W,
CUL V3, HM, ZWave, IT, vcontrol, owntracks, alexa

yersinia

Zitat von: yersinia am 24 Februar 2021, 09:40:45Kleines Update in #1:
ZitatEDIT 2021-02-24: schon lange liefert ESP-Easy keine GIT Build Version mehr mit (InternalVal ESP_BUILD_GIT), daher gibt es jetzt ein userAttr localESPEasyVersion welches optional manuell mit der zuletzt installierten ESP-Easy-Version gepflegt werden. Ist das Attribut gesetzt, prüft der firmware-check darauf. Die Version muss nach jedem Update neu gepflegt werden. Nicht elegant, dafür zeigt der Firmware-check aber nun an, wenn wirklich ein Update zur Verfügung steht.
Hurra, die GIT Version wird wieder befüllt:
ZitatEDIT 2021-05-03: mit dem heutigen ESP-Easy Release (mega-20210503) werden auch wieder das InternalVal ESP_BUILD_GIT befüllt; wenn dieses gefüllt ist, wird das Attribut localESPEasyVersion ignoriert (siehe auch EDIT 2021-02-24)
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

Update:
ZitatEDIT 2022-01-24: erste Version für einen SIGNALDuino Firmware check - funktioniert analog zum ESPEasy firmware check
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

OdfFhem

@yersinia

Aktuell enthält das Reading published_at bzgl. Tasmota den Wert "2022-08-25T11:50:49Z". Dies verursacht nach jedem FHEM-Neustart folgende Logeinträge:

2022.09.03 20:19:34.109 1: PERL WARNING: Argument "49Z" isn't numeric in subroutine entry at ./FHEM/99_Utils.pm line 21.
2022.09.03 20:19:34.109 3: eval: my $ret ="";
                                             ... Rest des Inhalts vom Attribut stateFormat

Mache ich z.B. ein reread, dann kommt es interessanterweise nicht zu diesen Logeinträgen.

Nutze ich die FHEM-Eingabezeile, dann

{ POSIX::strftime("%d.%m.%y",localtime(time_str2num(ReadingsVal("tasmota_fw_check","published_at","2000-01-01T00:00:00Z"))));; }

Gerät existiert ... keine neuen Logeinträge



{ POSIX::strftime("%d.%m.%y",localtime(time_str2num(ReadingsVal("tasmota_fw_checkkkkk","published_at","2000-01-01T00:00:11Z"))));; }

2022.09.03 21:21:17.579 1: PERL WARNING: Argument "11Z" isn't numeric in subroutine entry at ./FHEM/99_Utils.pm line 21.
2022.09.03 21:21:17.580 3: eval: { POSIX::strftime("%d.%m.%y",localtime(time_str2num(ReadingsVal("tasmota_fw_checkkkkk","published_at","2000-01-01T00:00:11Z")))); }

Gerät existiert nicht ... neue Logeinträge ... aber nur beim ersten Aufruf
... ändern auf 12Z, dann beim ersten Aufruf wieder neue Logeinträge
... ändern auf 13Z, dann beim ersten Aufruf wieder neue Logeinträge
...

yersinia

Ja, stimmt, das Handling der imho Zeitzonen-spezifischen Zeiten ist irgendwie komisch im FHEM. Hab mich damit aber auch nicht weitergehend befasst und nutze dafür anderen Code:
  ReadingsVal($name,"published_at","2000-01-01T00:00:00Z") =~ m/^20(\d+)-(\d+)-(\d+)/;
  my $date = "$3.$2.$1";

Ich werde das oben ergänzen, das ist mir irgendwie untergegangen. Danke für den Hinweis.
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