FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: 87insane am 26 März 2020, 16:26:59

Titel: [GELÖST] - Color::devStateIcon in Perl devStateIcon
Beitrag von: 87insane am 26 März 2020, 16:26:59
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
Titel: Antw:Color::devStateIcon in Perl devStateIcon
Beitrag von: Beta-User am 26 März 2020, 16:44:44
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.
Titel: Antw:Color::devStateIcon in Perl devStateIcon
Beitrag von: 87insane am 26 März 2020, 16:52:52
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)
Titel: Antw:Color::devStateIcon in Perl devStateIcon
Beitrag von: Beta-User am 26 März 2020, 17:16:36
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")}
Titel: Antw:Color::devStateIcon in Perl devStateIcon
Beitrag von: 87insane am 26 März 2020, 19:36:09
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.
Titel: Antw:Color::devStateIcon in Perl devStateIcon
Beitrag von: Prof. Dr. Peter Henning am 27 März 2020, 06:59:50
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
Titel: Antw:Color::devStateIcon in Perl devStateIcon
Beitrag von: Beta-User am 27 März 2020, 10:27:31
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.
Titel: Antw:Color::devStateIcon in Perl devStateIcon
Beitrag von: 87insane am 27 März 2020, 12:01:24
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ß?
Titel: Antw:Color::devStateIcon in Perl devStateIcon
Beitrag von: Beta-User am 27 März 2020, 12:11:19
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".
Titel: Antw:Color::devStateIcon in Perl devStateIcon
Beitrag von: 87insane am 27 März 2020, 12:16:37
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ß?
Titel: Antw:Color::devStateIcon in Perl devStateIcon
Beitrag von: 87insane am 27 März 2020, 12:27:59
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.
Titel: Antw:Color::devStateIcon in Perl devStateIcon
Beitrag von: Beta-User am 27 März 2020, 12:36:42
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...

Titel: Antw:Color::devStateIcon in Perl devStateIcon
Beitrag von: 87insane am 27 März 2020, 12:44:21
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 ;)
Titel: Antw:Color::devStateIcon in Perl devStateIcon
Beitrag von: Beta-User am 27 März 2020, 12:58:15
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...
Titel: Antw:Color::devStateIcon in Perl devStateIcon
Beitrag von: 87insane am 27 März 2020, 13:32:34
Danke

Habe den "neuen" Code bei mir überall mit eingebaut. Finde ich gut! DANKE für Eure Hilfe!
Titel: Antw:[GELÖST] - Color::devStateIcon in Perl devStateIcon
Beitrag von: Beta-User am 27 März 2020, 13:46:08
Hmm, war das jetzt irgendwas, was irgendwo in die templates einfließen sollte...?
(Dann bitte in einem vollständigen Zusammenhang, wo es wie hingehört, sonst muß ich raten, und das geht gelegentlich schief).

Oder willst du das ers noch etwas beobachten, ob es tut wie gewünscht?
Titel: Antw:[GELÖST] - Color::devStateIcon in Perl devStateIcon
Beitrag von: 87insane am 27 März 2020, 14:13:35
Denke das geht so....
Habe es bei mir bei allen LED Stripes oder Lichtern so eingefügt und setStateList angepasst auf die gewünschten Werte von rgb, Color usw. Klappen tut das bei Tasmota oder auch Shelly ohne Probleme.

Würde in allen Templates mit LED klappen. Der kleine grüne/gelbe/rote Punkt bliebe erhalten und man hat sogar das spezielle Farbige Icon mit Dim Anzeige.

Tasmota hattest du bereits geliefert. Anbei noch Shelly mit Ampel:
{ my $amp = ReadingsVal($name,"online","false") eq "false" ? "rot" : ReadingsVal($name,"new_fw","false") eq "true" ? "gelb" : "gruen";; my $light = Color::devStateIcon($name,"rgb","rgb","gain","state");; $light =~ s/.*:([^:]+):.*/$1/;; my $cons = ReadingsVal($name,"power","unknown");; 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\">".FW_makeImage($light)."</a> Aktuell: $cons W </div>" }

setStateList on off gain rgb

Anbei von der Lampe auch mal ein FHEM Bild.
Titel: Antw:[GELÖST] - Color::devStateIcon in Perl devStateIcon
Beitrag von: Beta-User am 27 März 2020, 14:16:59
Wenn du
Zitat von: 87insane am 27 März 2020, 14:13:35
setStateList on off gain rgb
das so brauchst, ist noch was schief. Da hat nur "on" "off" und ggf. "toggle" was verloren. Halt alles, was in "state" soll. Alles andere nicht.
Titel: Antw:[GELÖST] - Color::devStateIcon in Perl devStateIcon
Beitrag von: 87insane am 27 März 2020, 14:19:43
Wenn ich COLOR richtig verstanden habe braucht er die Info immer kurz im Status. Ansonsten bleibt die kleine Lampe in FHEM bei Veränderung von z.B. Color aus, obwohl die Lampe in echt an ist.
Titel: Antw:[GELÖST] - Color::devStateIcon in Perl devStateIcon
Beitrag von: Beta-User am 27 März 2020, 14:32:48
Hmm, das muß ich testen, aber wenn, ist es mMn. eine unerwünsche Nebenwirkung.
Titel: Antw:[GELÖST] - Color::devStateIcon in Perl devStateIcon
Beitrag von: 87insane am 27 März 2020, 15:40:05
Darauß habe ich das so gelesen, verstanden und deswegen auch getestet.

...In type kann zur Zeit rgb, dimmer oder switch übergeben werden. Im Reading für die Helligkeit wird neben den Werten 0-100 auch on und off verstanden.
Ein Beispiel für eine Lampe, die im Reading rgb die aktuell eingestellte Farbe und im Reading state on oder off enthalten kann...

Quelle: https://wiki.fhem.de/wiki/Color -> Farbige Lampen Icons

state ändert sich NICHT auf on/off wenn in setstatelist nicht auch rgb/color, oder wie es eben benannt wurde, drin steht und darüber der Einschalt-Befehl generiert wird.
Weiß nicht ob man versteht wie ich das meine aber es geht bei allen LED Lampen die ich habe genau wie beschrieben super. Habe keine Nebeneffekte feststellen können.
Titel: Antw:[GELÖST] - Color::devStateIcon in Perl devStateIcon
Beitrag von: Beta-User am 27 März 2020, 15:49:46
Na ja, ich hatte mit justme1968 zufällig neulich an Color::devStateIcon() rumgebastelt und meine weiter, das ist eine falsche Schlußfolgerung, die du da ziehst. "Spielgerät" war übrigens ein rgbw-Tasmota 8.1. Ich bin mir also einigermaßen sicher, dass das funktionieren sollte, ohne dass man an den falschen Dingen was dreht.

"state" sollte sich auf "on" ändern, wenn der Tasmota das Einschalten zurückmeldet(!). Ende. Wenn er das nicht tut, ist was anderes faul. Jedenfalls hat in setStateList nur was verloren, was mit state zu tun haben soll.
Daher solltest du nochmal nachsehen, was über welchen Topic reinkommt, wo es landet und nicht nochmal dieselbe FALSCHE Frage stellen...
Titel: Antw:[GELÖST] - Color::devStateIcon in Perl devStateIcon
Beitrag von: 87insane am 27 März 2020, 16:16:09
Das Verhalten ist bei Tasmota und Shelly identisch. Weswegen ich glaube das es nicht an den Geräten liegen kann.
Ich weiß nicht warum über Aktivierung von RGB oder so eben KEIN on kommt. Dies passiert nur wenn.... steht ja alles schon da.

Keine Ahnung wonach ich da nun suchen soll.