[GELÖST] - Color::devStateIcon in Perl devStateIcon

Begonnen von 87insane, 26 März 2020, 16:26:59

Vorheriges Thema - Nächstes Thema

87insane

Hallo zusammen,

da ich gerne alles einheitlich habe aber auch gerne neue Dinge probiere, ist mir in einem MQTT2 Template aufgefallen wie schick Color::devStateIcon ist.
In dem Template steht als Beispiel:
devStateIcon {Color::devStateIcon($name,"rgb","Color","pct","state")}

Nun möchte ich das gerne mit anderem Code verknüpfen.
{ my $amp = ReadingsVal($name,"LWT","Offline") eq "Offline" ? "rot" : "gruen";; my $light = ReadingsVal($name,"state","off") eq "on"?'light_light_dim_100@green':'light_light_dim_00';; my $show = "<a href=\"http://".ReadingsVal($name,"IPAddress","none")." \"target=\"_blank\">".FW_makeImage("10px-kreis-".$amp)."</a>";; "<div> $show <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</div>" }
Dies ist der Tasmota angepasste Code um auch die kleine Ampel als Symbol vor dem eigentlichem Icon zu haben. Kennen einige sicher von den Shelly Templates.

Ich hätte erwartet, dass ich den Teil mit Color:: einfach in my $light packen kann oder aber am Ende bei der Ausgabe.
Leider erscheint zwar ein Lampen Symbol aber anders wie erwartet bleibt dieses immer einfach "aus". Egal was bei rgb, Color oder state steht. Normal (ohne den ganzen anderen Code) geht es wie gewünscht. Man sieht anhand der Stahlen an der Lampe wie hell/dunkel diese ist usw.


Nun habe ich böser Weise einfach mal eine PM geschrieben. Geantwortet wurde mir von Beta-User wie folgt:
Zitat...das hätte das Zeug zu einem separaten Thread gehabt...

Zum Knobeln mal ein Ansatzpunkt: Was ist die Rückgabe von Color:devStateIcon()?
(bzw. wie sieht die aus? Und wie wird die dann wohl weiterverarbeitet?)
Zum schnelleren Finden: https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/Color.pm#L60

Bin mal gespannt, was du mit der Info machst ;D ;) .

Und nochmal: Das ist tatsächlich einen eigenen Thread wert, weil die Lösung dieser Aufgabe evtl. helfen kann, sehr viele devStateIcon-Codes wieder in eine für die user lesbarere Variante "umzustricken" ;) .

Darfst gerne die Anfrage und meine Antwort öffentlich posten.

Die Rückgaben wären demnach:
60   return ".*:$s@#$RGB:toggle" if( $percent < 100 );
61   return ".*:on@#$rgb:toggle";


Ich vermute das ich
Variante A) einfach etwas anders schreiben muss
Variante B) einfach an anderer Stelle unterbringen muss

Mir kommt es vor, als würde von Color:: einfach nichts ausgewertet.

So hatte ich das z.B. gedacht:
{ my $amp = ReadingsVal($name,"LWT","Offline") eq "Offline" ? "rot" : "gruen";; my $light = Color::devStateIcon($name,"rgb","Color","pct","state"):'light_light_dim_00';; my $show = "<a href=\"http://".ReadingsVal($name,"IPAddress","none")." \"target=\"_blank\">".FW_makeImage("10px-kreis-".$amp)."</a>";; "<div> $show <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</div>" }

Wer kann hier helfen und mir den Knoten aus dem Kopf entfernen?

Gruß,
87insane

Beta-User

Na ja, das ganze ich eigentlich keine richtige Anfängerfrage mehr, sondern schon eine etwas härtere Nuß (deren Lösung ich auch noch nicht kenne).

Aber vielleicht bringen dich ein paar Zeilen und das Umfeld dieser Zeilen etwas weiter in diesem kleinen Ratespielchen: https://forum.fhem.de/index.php/topic,97586.msg908543.html#msg908543

Tippen würde ich, dass es funktioniert, wenn man nicht den Weg versucht, jetzigen devStateIcon-Code aufzubohren, sondern den Color-Code "vorneweg" um Code ergänzt, der (mit der passenden Vorformatierung) "was ähnliches" liefert wie Color::devStateIcon() ;) .
Was mir im Moment noch nicht abschließend klar ist, wäre eigentlich nur die Frage, wieviel html man zurückgeben kann/muß/darf.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

87insane

#2
Mit:
{ my $amp = ReadingsVal($name,"LWT","Offline") eq "Offline" ? "rot" : "gruen";; my $show = "<a href=\"http://".ReadingsVal($name,"IPAddress","none")." \"target=\"_blank\">".FW_makeImage("10px-kreis-".$amp)."</a>";; "<div> $show <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".Color::devStateIcon($name,"rgb","Color","pct","state")."</div>" }

Erhalte ich immerhin die korrekte Rückgabe:
.*:off:toggle

Nur ein Symbol wird nicht erzeugt darauß.

Ich würde am Ende nicht wie beim Rollo alle Icons einzeln setzen wollen der Color:: Befehl macht das an sich ja auch "von alleine".

Das hier:
{ my $amp = ReadingsVal($name,"LWT","Offline") eq "Offline" ? "rot" : "gruen";; my $light = {Color::devStateIcon($name,"rgb","Color","pct","state")};; my $show = "<a href=\"http://".ReadingsVal($name,"IPAddress","none")." \"target=\"_blank\">".FW_makeImage("10px-kreis-".$amp)."</a>";; "<div> $show <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">". $light ."</div>" }

ergibt:
HASH(0x48b3830)

Beta-User

Zitat von: 87insane am 26 März 2020, 16:52:52
Ich würde am Ende nicht wie beim Rollo alle Icons einzeln setzen wollen der Color:: Befehl macht das an sich ja auch "von alleine".
Genau hier liegt m.E. ein Denkfehler vor: Color::devStateIcon() liefert eben gerade keine fertigen Icons, sondern "nur" die Vorgabe für FHEMWEB, das dann seinerseits wohl _zeilenweise_ FW_makeImage() aufruft ;) .
Ohne es getestet zu haben, würde ich mal mit folgendem ins Rennen gehen...:
{ my $amp = ReadingsVal($name,"LWT","Offline") eq "Offline" ? "rot" : "gruen";; my $show = '<a href="http://'.ReadingsVal($name,"IPAddress","none").' "target="_blank">10px-kreis-'.$amp.'</a>\n'.Color::devStateIcon($name,"rgb","Color","pct","state")}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

87insane

Geht schon mal nicht wegen verschiedenen Dingen. Hast einen Lückentext gebaut.... Muss ich aber auf später/morgen vertagen. Hab aber deine Version auch an ein paar Stellen verändert aber ohne erfolg. Denke ich weiß worauf du hinaus wolltest. Teste morgen weiter.

Prof. Dr. Peter Henning

#5
Zitat
Was mir im Moment noch nicht abschließend klar ist, wäre eigentlich nur die Frage, wieviel html man zurückgeben kann/muß/darf.

Beliebig viel. Allerdings würde ich das nicht mit devStateIcon machen, sondern direkt im stateFormat Attribut. Beispielsweise erzeuge ich mit dem Attributwert
<embed src='fhem/SVGX_widget?type=bar&subtype=red&size=200x120&p1=energy&s1=35.0 kWh&p2=power&s2=1 kW&p3=EV'/>

einen Aufruf der URL "<fhem-ip>:8083/fhem/SVGX_widget?<parameter aus den readings energy und power>".

Diese Funktion wiederum ist - in meiner Datei 99_PlotUtils.pm - einfach als Erweiterung von FHEMWEB definiert worden.

sub PlotUtils_Initialize($$)
{
  my ($hash) = @_;
  $data{FWEXT}{"/SVGX_widget"}{FUNC} = "SVGX_widget";
  $data{FWEXT}{"/SVGX_widget"}{FORKABLE} = 1;
}


und erzeugt richtig komplexe SVG-Diagramme, die dann als state angezeigt werden. Beispiele


###############################################################################
#
#  SVG Widgets
#
###############################################################################

sub SVGX_widget($)
{
  my ($arg) = @_;
  my $type = $FW_webArgs{type};
  my $subtype = $FW_webArgs{subtype};
 
  my @size=split('x',($FW_webArgs{size} ? $FW_webArgs{size} : "320x240"));
  #Log 1,"++++++++++++++++++++++++++++++++++++++++++++";
  #Log 1,"SVGX_widget type $type (subtype $subtype) called with $arg";
  #Log 1,"SVG Plotmode is ".AttrVal($FW_wname, "plotmode", "SVG");
  #Log 1,"SVGX_widget has size ".$size[0]."x".$size[1];
  #Log 1,"++++++++++++++++++++++++++++++++++++++++++++";
 
  $FW_RETTYPE = "image/svg+xml";
  $FW_RET="";
  FW_pO '<svg xmlns="http://www.w3.org/2000/svg" viewBox="10 0 320 210" width="'.$size[0].'px" height="'.$size[1].'px">';

  if( $type eq 'bar' ){
    #
    # Horizontal color bar
    #
    #  ---------------
    # | |    | |    | |
    #  ---------------
    #
    # 16           264
    # three parameters w. scale
    # p1 = interior display value - either as "reading" name or as number
    #      if it is given as "reading" name, a dev parameter must be given
    # s1 = scale, consisting of max. value and unit e.g.: 35.0 kWh
    # p2 = exterior display value - either as "reading" name or as number
    # s2 = scale, consisting of (ignored) number and unit, e.g.: 1 kW
    # p3 = lower bottom label

    my $p1 = $FW_webArgs{p1};
    my $raw1;
    if( $p1 =~ /[\d\.]+/ ){
      $raw1 = $p1;
    } else {
      $raw1 = ReadingsVal($FW_webArgs{dev},$p1,0);
    }
    my @s1 = split(' ',$FW_webArgs{s1});

    my $p2 = $FW_webArgs{p2};
    my $raw2;
    if( $p2 =~ /[\d\.]+/ ){
      $raw2 = $p2;
    } else {
      $raw2 = ReadingsVal($FW_webArgs{dev},$p2,0);
    }
    my @s2 = split(' ',$FW_webArgs{s2});

    #-- scaling
    my $val1 = int(($raw1*1.0)/$s1[0]*248+24);
    my $textstyle;
    my $textpos;
    if( $val1 > 148 ){
      $textpos   = 28;
      $textstyle = "text-anchor:start;";
    }else{
      $textpos   = 272;
      $textstyle = "text-anchor:end;";
    }
 
    FW_pO '<defs>';
    #-- white - snow4
    FW_pO '<linearGradient id="grad0" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" style="stop-color:white;stop-opacity:1"/><stop offset="100%" style="stop-color:rgb(139, 137, 137);stop-opacity:1"/></linearGradient>';
    if( $subtype eq 'red'){
      #-- lightsalmon/red and lightsalmon/lightsalmon3
      FW_pO '<linearGradient id="grad1" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" style="stop-color:rgb( 255, 192, 188);stop-opacity:1"/><stop offset="100%" style="stop-color:red;stop-opacity:1"/></linearGradient>';
      FW_pO '<linearGradient id="grad2" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" style="stop-color:rgb( 255, 192, 188);stop-opacity:1"/><stop offset="100%" style="stop-color:rgb( 255, 140, 105);stop-opacity:1"/></linearGradient>';
   }elsif( $subtype eq 'green'){
      #-- chartreuse/green and chartreuse/chartreuse3
      FW_pO '<linearGradient id="grad1" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" style="stop-color:rgb( 127,255, 0);stop-opacity:1"/><stop offset="100%" style="stop-color:green;stop-opacity:1"/></linearGradient>';
      FW_pO '<linearGradient id="grad2" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" style="stop-color:rgb( 127,255, 0);stop-opacity:1"/><stop offset="100%" style="stop-color:rgb( 102, 205, 0);stop-opacity:1"/></linearGradient>';
    }elsif( $subtype eq 'blue'){
      #-- cyan/blue and cyan/cyan3
      FW_pO '<linearGradient id="grad1" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" style="stop-color:cyan;stop-opacity:1"/><stop offset="100%" style="stop-color:blue;stop-opacity:1"/></linearGradient>';
      FW_pO '<linearGradient id="grad2" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" style="stop-color:cyan;stop-opacity:1"/><stop offset="100%" style="stop-color:rgb( 0, 205, 205);stop-opacity:1"/></linearGradient>';
    }elsif( $subtype eq 'orange'){
      #-- LightGoldenrod1/DarkOrange and LightGoldenrod1/DarkGoldenrod3
      FW_pO '<linearGradient id="grad1" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" style="stop-color:rgb( 255, 236, 139);stop-opacity:1"/><stop offset="100%" style="stop-color:rgb( 255, 140, 0);stop-opacity:1"/></linearGradient>';
      FW_pO '<linearGradient id="grad2" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" style="stop-color:rgb( 255, 236, 139);stop-opacity:1"/><stop offset="100%" style="stop-color:rgb( 205, 149, 12);stop-opacity:1"/></linearGradient>';
    }elsif( $subtype eq 'pink'){
      #-- pink/deeppink and pink/hotpink3 -->
      FW_pO '<linearGradient id="grad1" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" style="stop-color:rgb( 255, 192, 203);stop-opacity:1"/><stop offset="100%" style="stop-color:rgb( 255, 20, 147);stop-opacity:1"/></linearGradient>';
      FW_pO '<linearGradient id="grad2" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" style="stop-color:rgb( 255, 192, 203);stop-opacity:1"/><stop offset="100%" style="stop-color:rgb( 205, 96, 144);stop-opacity:1"/></linearGradient>';
    }
    #-- colored shadow 1 / 2 pixel
    FW_pO '<filter id="cshadow1" x="0" y="0" width="200%" height="200%"><feOffset result="offOut" in="SourceGraphic" dx="1" dy="1" /><feColorMatrix result="matrixOut" in="offOut" type="matrix" values="0.2 0 0 0 0  0 0.2 0 0 0  0 0 0.2 0 0  0.95 0.95 0.95 0.3 0" /><feGaussianBlur result="blurOut" in="matrixOut" stdDeviation="1" /><feBlend in="SourceGraphic" in2="blurOut" mode="normal" /></filter>';
    FW_pO '<filter id="cshadow2" x="0" y="0" width="200%" height="200%"><feOffset result="offOut" in="SourceGraphic" dx="2" dy="2" /><feColorMatrix result="matrixOut" in="offOut" type="saturate" values="0.2" /><feGaussianBlur result="blurOut" in="matrixOut" stdDeviation="1" /><feBlend in="SourceGraphic" in2="blurOut" mode="normal" /></filter>';
    FW_pO '</defs>';
   
    FW_pO '<g><g transform="translate(0,45)">';
    FW_pO '<rect x="24"  y="5" width="40" height="80" rx="20" ry="40" fill="url(#grad0)"/>';
    FW_pO '<rect x="272" y="5" width="40" height="80" rx="20" ry="40" fill="rgb(250,250,250)"/>';
    #-- side
    FW_pO sprintf('<rect x="24" y="5" width="%d" height="80" rx="20" ry="40" fill="url(#grad1)"/>',$val1+16);
    #-- top
    FW_pO sprintf('<rect x="%d" y="5" width="40" height="80" rx="20" ry="40" fill="url(#grad2)"/>',$val1);
    #-- hull toptop line
    FW_pO '<rect x="272" y="5" width="40" height="80" rx="20" ry="40" fill="none" stroke="rgb(139, 137, 137)" stroke-width="2"/>';
    #-- hull top line
    FW_pO sprintf('<rect x="%d" y="5" width="40" height="80" rx="20" ry="40" fill="none" stroke="rgb(139, 137, 137)" stroke-width="2"/>',$val1);
    #-- hull side line
    FW_pO '<rect x="24"  y="5" width="288" height="80" rx="20" ry="40" fill="none" stroke="rgb(139, 137, 137)" stroke-width="2"/>';
    #-- label - if shadow is taken, use style filter:url(#cshadow1);
    FW_pO sprintf('<text x="%d" y="52" fill="rgb(75, 75, 75)" style="%sfont-family:Helvetica;font-size:30px;font-weight:bold">%5.2f %s</text>',
       $textpos,$textstyle,$raw1,$s1[1]);
    FW_pO '</g>';
    FW_pO sprintf('<text x="38" y="40" fill="blue" style="font-family:Helvetica;font-size:40px;font-weight:bold">%5.2f %s</text>',
       $raw2,$s2[1]);
    #-- label
    FW_pO sprintf('<text x="38" y="160" fill="rgb(75, 75, 75)" style="font-family:Helvetica;font-size:24px;font-weight:bold">%s</text>',
       $FW_webArgs{p3});
    FW_pO '</g>';
  }elsif($type eq 'colorcircle'){
    my $p1 = $FW_webArgs{p1};
    my $raw1;
    if( $p1 =~ /\d*(\.\d*)?/ ){
      $raw1 = $p1;
    } else {
      $raw1 = ReadingsVal($FW_webArgs{dev},$p1,0);
    }
    my $color="#".Color::pahColor(14,20,27,$raw1,1);
    FW_pO '<circle cx="115" cy="105" r="100" stroke="black" stroke-width="3" fill="'.$color.'"/>';
  }elsif($type eq 'thermometer'){
    #
    # Vertical thermometer symbol
    #
    #    ||
    #    || 
    #    ||
    #   |__|
    #
    # one parameters w. scale
    # p1 = display value - either as "reading" name or as number
    #      if it is given as "reading" name, a dev parameter must be given
    # s1 = scale, consisting of max. value and unit e.g.: 35.0 kWh
    #
   # --- HIER FEHLT CODE
  }
  FW_pO '</svg>';
  return ($FW_RETTYPE, $FW_RET);
}

sub
SVGX_getsize($)
{
  my ($d) = @_;
  return $FW_webArgs{plotsize} ?
                $FW_webArgs{plotsize} : AttrVal($d,"plotsize",$FW_plotsize);
}


Wie das dann aussieht, könnt Ihr dem Bild entnehmen.

LG

pah

Beta-User

Wir können das mit dem stateFormat noch ein paarmal diskutieren, aber je länger ich mich damit befasse, desto mehr halte ich das nicht für eine gute Lösung...

Bevor wir den TE mit Argumenten traktieren, hier erst mal die Lösung für devStateIcon:

attr DEVICE devStateIcon {my $onl = ReadingsVal($name,"LWT","false") eq "Online"?"10px-kreis-gruen":"10px-kreis-rot";; my $light = Color::devStateIcon($name,"rgb","Color","pct","state");; $light =~ s/.*:([^:]+):.*/$1/;; '<div><a href="http://'.ReadingsVal($name,"IPAddress","none").' "target="_blank">'.FW_makeImage($onl).'</a> <a href="/fhem?cmd.dummy=set '.$name.' toggle&XHR=1">'.FW_makeImage($light)."</a> uptime: ".ReadingsVal($name,"Uptime",0)."</div>";;}


Man kann auch versuchen, devStateIcon und stateFormat zu mischen, aber dabei kommt leider kein klickbarer Link für "die Ampel" raus:
attr USB_Plug devStateIcon { "Online:10px-kreis-gruen Offline:10px-kreis-rot (on|off)".Color::devStateIcon($name,"rgb","Color","pct","state") }
attr USB_Plug stateFormat <a href="http://IPAddress" target="_blank">\
LWT\
</a> \
state

(Kann ja sein, dass da jemand noch room for improvement entdeckt, denn diese Variante würde mir persönlich am ehesten zusagen, weil der Perl-Teil viel leichter verständlich wäre.).



Nun nochmal dazu, warum das Perl mMn. nach devStateIcon gehört und nicht nach stateFormat:

- stateFormat sollte "lesbaren" Text erzeugen. Sonst ist es nicht screenreader-freundlich (und bläht die Detailansicht unnötig auf). Das kann man vielleicht mit ein paar Tricks auch dort erreichen, ABER: zu denen ich bisher aber trotz mind. einer Anfrage in der Vergangenheit keine konkreten Vorschläge gehört. (Mit lesbar ist "für Menschen ohne Sucherei verwertbar" gemeint).
- stateFormat wird bei jeder Aktualisierung eines Readings ausgeführt. Wir brauchen aber grafische Elemente nur dann, wenn sie jemand ansieht. Die stateFormat-Lösung steht daher im Verdacht, nicht ganz so effizient mit ressourcen umzugehen (ich habe das nicht näher geprüft, weil mir das erste Argument schon reicht.

Gegen die devStateIcon-Lösung wurde in der Vergangenheit ins Feld geführt, dass man damit keine Größe der Grafik vorgeben könnte. Auch das habe ich jetzt nicht vertieft ausgetestet, aber jedenfalls, wenn man den roborock-Nutzern glaubt, geht das (ggf. mit etwas Aufwand/Anpassung des PlotUtils-Codes bzw. "doppelten Größenangaben") auch in devStateIcon:
attr DEVICE devStateIcon { '<img src="fhem/images/DEVNAME_map.svg" style="max-width:256;;max-height:256;;">' }

Just my2ct.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

87insane

#7
Hey,

wollte gerade nach X Tests schreiben und dann kam deine Antwort.
Danke zuerst!! Geht, wobei nicht ganz aber dazu gleich mehr.

Ich konnte feststellen das ich den Color:: Teil nie in <div> unterbringen konnte da die Ausgabe so von FHEM Web nicht bearbeitet wird. Also wollte ich gerade schreiben und du hast das via Regex gelöst. Was genau macht deine Regex? ~ s/.*:([^:]+):.*/$1/

Die kleine Lampe wird nun genauso gut angezeigt wie auch der kleine Kreis. Allerdings geht die kleine Lampe nicht an, wenn man direkt über einen der Slider schaltet. Also Temperatur oder Farbe oder so. Wenn ich die Lampe erst anmache und dann Farben oder Helligkeit usw ändere macht die kleine Lampe was sie soll. Das ist noch ein wenig komisch.


Ich selber mag devStateIcon lieber. Dieses hin und her gefummel mit den verschiedenen Formaten nervt mich. "Früher" hatte ich das auch immer so gemacht. Habe ich sogar in einigen alten Schaltern noch so. Aber ihr seid die Experten in dieser Sache hier. Bin gespannt was du zur Regex sagst...
   
devstateicon: Online:10px-kreis-gruen@green Offline:10px-kreis-rot@red 1.on:light_pendant_light@green:POWER1+off 1.off:light_pendant_light:POWER1+on 2.on:light_floor_lamp@green:POWER2+off 2.off:light_floor_lamp:POWER2+on

stateFormat
<a href="http://IPAddress" target="_blank">
LWT
</a>
1:POWER1
2:POWER2



EDIT: setStateList gelöscht und geht alles...Vermutlich könnte ich einfach die Befehle mit rein schreiben aber wäre der Unterschied so groß?

Beta-User

Die Regex holt einfach nur das rückgemeldete Icon samt Farbe aus dem zurückgegebenen Wert (seach+replace).

Wenn die Lampe nicht angeht, scheint "state" nicht aktualisiert zu werden. Da müßte man sich ggf. vorab ansehen, was der ESP tatsächlich macht und was er so schickt, wenn man im ausgeschalteten Zustand Farbe/Helligkeit ändert. Ich kann den Teil aber grade nicht gut testen und wollte erst mal nur sicherstellen, dass wir "auf demselben Pfad wandeln".
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

87insane

Okay.. Dann hätte ich ja nie ein Icon gesehen. Wo genau in der Rückgabe steht das drin? Hast du da ein Beispiel?
Hab meinen Beitrag hierüber editiert. Hab setStateList gelöscht und geht. Könnte die gewünschten Readings auch einfach bei schreiben aber ist der Unterschied so groß?

87insane

Ach ja..
Kann man mit Color:: nur das Standard Icon nutzen? Oder kann man auch sagen welches Icon genutzt werden soll? Wenn ja, kann man damit ja auch noch andere Dinge machen.
Für Rollos könnte man das direkt mit nutzen. PCT macht ja genau das gleiche.

Beta-User

Zitat von: 87insane am 26 März 2020, 16:26:59
Die Rückgaben wären demnach:
60     return ".*:$s@#$RGB:toggle" if( $percent < 100 );
61     return ".*:on@#$rgb:toggle";


Was setStateList angeht: Mir ist völlig unklar, auf welche Variante sich das bezieht, aber grundsätzlich würde ich sagen, dass es wieder rein sollte und an anderer Stelle was nachgearbeitet werden muß. Aber ohne list bzw. Info zum MQTT-Verkehr ist das Stochern im Nebel (bitte verschone mich und schau erst mal selbst nach, was da Sache ist).

Falls es sich auf die Regex-Variante beziehen sollte: Da muß halt ggf. dieregex erweitert werden, z.B.
Zitat1.+off:light_pendant_light:POWER1+on
Dann paßt es auch auf set_off.
Zitat1.+off.*:light_pendant_light:POWER1+on
würde dann z.B. auch auf off-for-timer matchen.

Zitat von: 87insane am 27 März 2020, 12:27:59
Kann man mit Color:: nur das Standard Icon nutzen?
Jein. Das Icon ist hart vercoded, aber selbstredend kann man auch weiterverarbeiten, was da zurückkommt. Es macht nur keinen großen Sinn, weil der Aufwand eher kleiner wird, wenn du was eigenes machst...
Z.B. das hier https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/mqtt2.template#L942 sollte sich relativ einfach auch mit Perl schreiben und dann erweitern lassen, Muster hast du ja jetzt...

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

87insane

Also da habe ich aber ein schöneres mit Perl:
Ist aus einem Shelly 2.5 als Rollo mit Tastern....
   
{ my $amp = ReadingsVal($name,"online","false") eq "false" ? "rot" : ReadingsVal($name,"new_fw","false") eq "true" ? "gelb" : "gruen";; my $con = ReadingsVal($name,"state","undef");; my $pic = $con eq "opening" ? 'fts_shutter_up@red' : $con eq "closing" ? 'fts_shutter_down@red' : $con eq "100" ? 'fts_shutter_100' : $con =~ /(\d)\d/ ? 'fts_shutter_'.$1.'0' : $con =~ /\b\d\b/ ? 'fts_shutter_10' : 'fts_shutter_updown';; my $show = "$amp" eq "gelb" ? "<a href=\"/fhem?cmd.dummy=set $name x_update&XHR=1\">".FW_makeImage("10px-kreis-".$amp)."</a>" : "<a href=\"http://".ReadingsVal($name,"ip","none")." \"target=\"_blank\">".FW_makeImage("10px-kreis-".$amp)."</a>";; "<div> $show <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\"></a>".FW_makeImage($pic)." </div>" }

das Thema setList macht hier aus dem Grund einen Sinn, da Color:: erwartet das z.B. das "Color" Reading sich auch melden. Habe ich eingefügt und geht wunderbar wie gewünscht!

Okay da hast du Recht. Macht also wenig Sinn für das Rollo. Hätte sonst den PCT Wert eines Rollos einfach genommen und diesen dann über das "Modul" gejagt. Danach via Regex das Symbol / den Namen ersetzt. So hast du das in der Regex ja gelöst.
Deine Regex ist mir aber noch immer nicht schlüssig. Kannst du die Regex mal wirklich auseinander nehmen und sagen was an welcher Stelle gesucht und ersetzt wird? Habe mit regex101 gerade mal ein wenig gespielt aber bin noch nicht wirklich dahinter gekommen.

An sich geht das Gewünschte hier also und ich finde es gut!
Könnte einige Personen für das Template ggf. begeistern ;)

Beta-User

Wenn kein Color-Reading da ist, kannst du die betreffende Stelle dann auch leer lassen, man braucht kein Reading zu erfinden:
Color::devStateIcon($name,"rgb",,"pct","state")
Also zu Fuß:
60     return ".*:$s@#$RGB:toggle" if( $percent < 100 );liefert ein eingefärbtes Lampensymbol "für alles" (".*") zurück, z.B.
.*:dim62%@#112233:toggle
Ab da solltest du mit dem Online-Tool weiterkommen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

87insane

Danke

Habe den "neuen" Code bei mir überall mit eingebaut. Finde ich gut! DANKE für Eure Hilfe!