Anwendungsbeispiel JsonMod #6: eq3 / homematic firmware check

Begonnen von yersinia, 16 April 2020, 13:08:51

Vorheriges Thema - Nächstes Thema

yersinia

Es gibt doch tatsächlich für ein Homematic classic Device (HM-ES-PMSw1-Pl) noch ein Update - auch wenn die Firmware von 2015 ist.
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

dennisk

Ich habe den Code aus dem ersten Post seit einigen Monaten drin und es wurde immer richtigerweise "no fw update needed" angezeigt. Heute hat mir meine Raspberrymatic angezeigt, dass für den HMIP-FSI16 ein Update bereitsteht. Der Firmware-Check aus dem ersten Post zeigt aber immer noch "no fw update needed" an. Das passiert, wenn "updateableDevicesMode" auf "onlyUpdatable" steht. Setze ich das Attribut auf "all", dann wird mir das Update für den HMIP-FSI16 korrekt angezeigt. Allerdings eben auch nur das Update für dieses eine Device, alle anderen HMIP-Devices, für die kein Update bereitsteht, werden nicht angezeigt - nach meinem Verständnis sollten in diesem Fall doch eigentlich alle Devices angezeigt werden, oder?

Liegt das an mir, oder am Code? Kann ich noch irgendwelche weiteren Infos liefern?

Danke schon mal und Grüße

dennisk

Einen Teil des Problems konnte ich lösen, indem ich die Zeile mit dem devspec2array angepasst habe: foreach my $dev (devspec2array("TYPE=CUL_HM|HMCCUDEV|HMCCUCHN:FILTER=DEF=(......|..............|................):FILTER=subType!=virtual")) {
Was mir jetzt noch fehlt, ist eine Möglichkeit, dass die Version derjenigen Devices, für die ein Update vorliegt, in Rot angezeigt wird. Hat da noch einer einen Tipp für mich?

dennisk

Das Anzeigen einer höheren Version in Rot habe ich folgendermaßen hinbekommen (im Folgenden das angepasste 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 .= '<div>last <a title="eq3-downloads" href="http://www.eq-3.de/service/downloads.html" rel="noopener noreferrer" target="_blank">homematic</a>-fw-check => ';
$ret .= $lastCheck;
$ret .= '</div>';
if(AttrVal($name,"updatableDevicesMode","") eq "all") {
$ret .= "<div>Attribute <font style=\"color:yellow;\">updatableDevicesMode</font> is set to <font style=\"color:yellow;font-weight:bold;\">all</font> = <font style=\"font-style:italic;\">all found Devices</font> will be displayed.</div>";
}
if(AttrVal($name,"useFwAliasMode","") eq "convert2Alias") {
$ret .= "<div>Attribute <font style=\"color:yellow;\">useFwAliasMode</font> is set to <font style=\"color:yellow;font-weight:bold;\">convert2Alias</font> = Device model is replaced where applicable.</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 .= '<br /><div style="display:table;width:100%;">';
$ret .= '<div style="display:table-row;">';
      $ret .= '<div style="display:table-cell;'.$cellstyle.'width:50%;font-weight:bold;">device</div>';
  $ret .= '<div style="display:table-cell;'.$cellstyle.'width: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,$readingStr) = $devStr =~ m/([^\s]+)[(]([^\s]+)[)]/;
        #my $md = AttrVal($dev,"model","?");
my $md = $readingStr;
        my $ofw = InternalVal($dev,"firmware",AttrVal($dev,"firmware","0.0"));
        my $nfw = ReadingsVal($name,$md,"none");
my $fw_link = "https://ccu3-update.homematic.com/firmware/download?cmd=download&serial=0&product=".$md;
$ret .= '<div style="display:table-row;" onmouseover="this.style.background=\''.$highlightcolor.'\';" onmouseout="this.style.background=\'transparent\';">';
$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:40%;font-weight:bold;color:lightgrey;">';
        $ret .= $md;
        $ret .= '</div>';
$ret .= '<div style="display:table-cell;'.$cellstyle.'width:5%;font-weight:bold;color:lightgrey;">';
        $ret .= $ofw;
        $ret .= '</div>';
        my ($oh,$ol,$op) = split('\.',$ofw);
        my ($nh, $nl, $np) = split('\.',$nfw);
        $ret .= '<div style="display:table-cell;'.$cellstyle.'width:5%;font-weight:bold;color:red;">';
        if((($nh > $oh) || (($nh == $oh) && ($nl > $ol)) || (($nh == $oh) && ($nl == $ol) && ($np > $op)))) {
  $ret .= '<a title="download firmware file" href="'.$fw_link.'" rel="noopener noreferrer" target="_blank" style="color:red!important;">';
                }
        else {
                  $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><br \/>'; #table
    }
$ret .= "<div style=\"text-align:left;\">(next check: ".$nextCheck.")</div>";
$ret .= '</div>';
  return $ret;
}


@yersinia Eventuell kannst Du das ja übernehmen - falls die Änderungen keine Nebenwirkungen haben? Testen kann ich leider nur mit HMIP.

yersinia

Zitat von: dennisk am 18 Juli 2021, 18:40:08Einen Teil des Problems konnte ich lösen, indem ich die Zeile mit dem devspec2array angepasst habe: foreach my $dev (devspec2array("TYPE=CUL_HM|HMCCUDEV|HMCCUCHN:FILTER=DEF=(......|..............|................):FILTER=subType!=virtual")) {
Danke, das habe ich so 1:1 übernommen. :)

Zitat von: dennisk am 18 Juli 2021, 18:40:08Was mir jetzt noch fehlt, ist eine Möglichkeit, dass die Version derjenigen Devices, für die ein Update vorliegt, in Rot angezeigt wird. Hat da noch einer einen Tipp für mich?
Zitat von: dennisk am 18 Juli 2021, 19:35:43Das Anzeigen einer höheren Version in Rot habe ich folgendermaßen hinbekommen
Ich verstehe den Anwendungsfall nicht ganz. Normalerweise sollte bei gesetztem Attribut updatableDevicesMode onlyUpdatable nur solche Devices angezeigt werden, die auch tatsächlich ein Firmware-Update haben. Optisch ist es ein nettes Gimmick. Dein Code erzeugt aber in beiden Fällen ein die Schriftfarbe rot - ist das beabsichtigt?
        if((($nh > $oh) || (($nh == $oh) && ($nl > $ol)) || (($nh == $oh) && ($nl == $ol) && ($np > $op)))) {
  $ret .= '<a title="download firmware file" href="'.$fw_link.'" rel="noopener noreferrer" target="_blank" style="color:red!important;">';
                }
        else {
                  $ret .= '<a title="download firmware file" href="'.$fw_link.'" rel="noopener noreferrer" target="_blank" style="color:red;">';
                };

Ich würde es eher so versuchen:
$ret .= '<div style="display:table-cell;'.$cellstyle.'width:5%;font-weight:bold;">';
        $ret .= '<a title="download firmware file" href="'.$fw_link.'" rel="noopener noreferrer" target="_blank"';
        my ($oh,$ol,$op) = split('\.',$ofw);
        my ($nh, $nl, $np) = split('\.',$nfw);
        if((($nh > $oh) || (($nh == $oh) && ($nl > $ol)) || (($nh == $oh) && ($nl == $ol) && ($np > $op)))) {
  $ret .= ' style="color:red;"';
            }
        $ret .= '>'.$nfw;

Wenn du das testen könntest und OK findest, übernehme ich das.
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

dennisk

Zitat von: yersinia am 18 Juli 2021, 20:41:14
Danke, das habe ich so 1:1 übernommen. :)
Gerne und danke!
Zitat von: yersinia am 18 Juli 2021, 20:41:14
Ich verstehe den Anwendungsfall nicht ganz. Normalerweise sollte bei gesetztem Attribut updatableDevicesMode onlyUpdatable nur solche Devices angezeigt werden, die auch tatsächlich ein Firmware-Update haben. Optisch ist es ein nettes Gimmick. Dein Code erzeugt aber in beiden Fällen ein die Schriftfarbe rot - ist das beabsichtigt?
        if((($nh > $oh) || (($nh == $oh) && ($nl > $ol)) || (($nh == $oh) && ($nl == $ol) && ($np > $op)))) {
  $ret .= '<a title="download firmware file" href="'.$fw_link.'" rel="noopener noreferrer" target="_blank" style="color:red!important;">';
                }
        else {
                  $ret .= '<a title="download firmware file" href="'.$fw_link.'" rel="noopener noreferrer" target="_blank" style="color:red;">';
                };
Stimmt, im else-Zweig kann das red natürlich weg - wobei das aus Deiner Vorlage aus dem ersten Post kommt. Bei mir waren die Zahlen allerdings noch nie rot, weshalb ich das im if-Zweig dann um ein !important ergänzt habe, womit es dann funktioniert.

Zitat von: yersinia am 18 Juli 2021, 20:41:14Ich würde es eher so versuchen:
$ret .= '<div style="display:table-cell;'.$cellstyle.'width:5%;font-weight:bold;">';
        $ret .= '<a title="download firmware file" href="'.$fw_link.'" rel="noopener noreferrer" target="_blank"';
        my ($oh,$ol,$op) = split('\.',$ofw);
        my ($nh, $nl, $np) = split('\.',$nfw);
        if((($nh > $oh) || (($nh == $oh) && ($nl > $ol)) || (($nh == $oh) && ($nl == $ol) && ($np > $op)))) {
  $ret .= ' style="color:red;"';
            }
        $ret .= '>'.$nfw;

Wenn du das testen könntest und OK findest, übernehme ich das.
Das habe ich probiert, scheint soweit zu klappen. Und ist definitiv weniger redundanter Code ;-) Wobei es bei mir eben nur mit color:red!important funktioniert.

yersinia

Normalerweise sollten alle gefundenen 'neuen' firmware-Versionen rot sein. Interessant ist, dass bei dir noch ein zusätzliches !important gesetzt werden muss - soweit ich weiss ist inlineCSS, wenn definiert, die zu bevorzugende Definition. Möglicherweise liegt dies an deiner Style/Frontend-Auswahl oder den benutzten Browser. Ich kann es jdfs nicht nachstellen (ich nutze den FHEMWEB dark style), von daher bin ich auf Hilfe angewiesen.
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

dennisk

Hab es grade mal mit dark ausprobiert und es funktioniert dann auch ohne !important. Habe bisher immer den default style (momentan f18) verwendet und die anderen styles ehrlich gesagt noch nie ausprobiert. Unter f18 sind die neuen Versionen übrigens dunkelgrün - egal ob  style="color:red;" gesetzt ist oder nicht; mit  style="color:red!important;" werden sie dann eben rot dargestellt. Wie man das jetzt aber am besten theme-unabhängig einbauen könnte, hab ich spontan keine Idee.

Was den Anwendungsfall angeht, so wäre es für mich logischer, dass nur bei den Geräten, für die tatsächlich eine neuere Version bereitsteht, die neue Version rot dargestellt wird. Rot im Sinne von "STOP! Handlungsbedarf!". So sticht der Eintrag auch dann hervor, wenn updatableDevicesMode auf all gesetzt ist.

yersinia

f18 ist der neuere/moderne Style für FHEMWEB imho - dark ist eigtl depricated.

Zitat von: dennisk am 19 Juli 2021, 09:23:32Wie man das jetzt aber am besten theme-unabhängig einbauen könnte, hab ich spontan keine Idee.
Das wäre mAn inlineCSS. ;)

Zitat von: dennisk am 19 Juli 2021, 09:23:32Was den Anwendungsfall angeht, so wäre es für mich logischer, dass nur bei den Geräten, für die tatsächlich eine neuere Version bereitsteht, die neue Version rot dargestellt wird. Rot im Sinne von "STOP! Handlungsbedarf!". So sticht der Eintrag auch dann hervor, wenn updatableDevicesMode auf all gesetzt ist.
So sehe ich das auch, daher ist der Standardwert des Attributs auch updatableDevicesMode onlyUpdatable und zeigt auch nur dann einen Eintrag an, wenn für ein Device ein Update gefunden worden ist. Und dann ist die (neue) firmware-Version sowieso rot bzw. wollte es sein. Wie gesagt, wenn man updatableDevicesMode auf all setzt (und ein reread durchführt), werden alle gefundenen Devices und deren Firmware-Versionen (alt/neu) angezeigt - hier würde man dann solche einfärben, wo es ein Update geben würde. Dafür würde die Code-Ergänzung sorgen.
$ret .= '<div style="display:table-cell;'.$cellstyle.'width:5%;font-weight:bold;">';
        $ret .= '<a title="download firmware file" href="'.$fw_link.'" rel="noopener noreferrer" target="_blank"';
        my ($oh,$ol,$op) = split('\.',$ofw);
        my ($nh, $nl, $np) = split('\.',$nfw);
        if((($nh > $oh) || (($nh == $oh) && ($nl > $ol)) || (($nh == $oh) && ($nl == $ol) && ($np > $op)))) {
  $ret .= ' style="color:red;"';
        }
        $ret .= '>'.$nfw;
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

fhemler

Hi zusammen,

seit heute Nacht 3:00 startete fhem auf meinem Rasperry 3 immer wieder neu.
Nach checken des Logfiles und debuggen des Starts von fhem habe ich herausgefunden, dass es an jsonmod und damit an diesem Homematic Firmware Check liegt.
Die folgende Fehlermeldung erscheint und fhem startet neu:
Month '12' out of range 0..11 at ./FHEM/98_JsonMod.pm line 1519.
Ich weiß nicht, woher der Monat "13" (wird ja in der Funktion um 1 verringert) kommt, auf der Webseite (https://www.eq-3.de/service/downloads.html) habe ich nichts gefunden.

Ich habe die ganze Definition des Firmwarechecks aus meiner fhem.cfg entfernt und fhem startet jetzt wieder wie gewohnt.
Ich wollte das nur mal als Info hierlassen, falls jemand anderes auch noch das Problem hat.

yersinia

Bist du dir 100% sicher, dass es mit dem hier bereitgestellten Auszug zu einem Month-Fehler kommt?
Irgendwie finde ich keine Variable Month. Hast du Details?
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

fhemler

Naja, was ich definitiv sagen kann, ist dass dein Code der einzige in meiner config ist, der was mit jsonmod zu tun hat.
Und nachdem ich das aus der fhem.cfg entfernt habe startete mein fhem wieder wie gewohnt (also ohne die o.g. Fehlermeldung).
Zur weiteren Nachforschung bin ich aufgrund von Ferien/Feiertagen und Family noch nicht gekommen. Ich bin froh, dass fhem wieder läuft  :D

yersinia

Dann würde mich ein list des Devices sowie die Versionen von perl und jsonmod interessieren.
Den einzigen Bezug zu Month sehe ich im Interval, dieser ist aber (im Standard) mit
attr homematic_fw_check interval 0 12 * * *
unauffällig.
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