beliebige Attribute "toggeln", z.B. autocreate, verbose etc

Begonnen von Sany, 12 April 2023, 10:23:57

Vorheriges Thema - Nächstes Thema

Sany

Habe die RAW-Def auch als Text-Datei mit hochgeladen. Jetzt geht es aber auch den Codeblock zu kopieren. In meiner früheren Version wurde beim übertragen des Codes aus dem Notepadd++ ins Forum eine lange Zeile umgebrochen und hier dann im Editor irgendwie mit einem Zeilenumbruch versehen, der dann beim Einfügen in fhem zum Fehler geführt hat.

Hallo zusammen,

ein code-Schnipsel, der beim Umzug von HUEbridge auf zigbee2mqtt entstand, um komfortabel das autocreate vom MQTT2Server zu schalten. Es ist aber beliebig konfigurierbar, um irgendwelche Attribute bequem zu "toggeln".
Die Attribute sowie deren gewünschte Zustände werden in der DEF eingetragen, das perl-DOIF samt uiTable erzeugt eine Tabelle (gleiche Reihenfolge wie die Einträge in der DEF).
Das Beispiel wird in den Räumen System, MQTT2_DEVICE und DOIF_UI eingetragen. Im Raum System und MQTT2_DEVICE hat es keine "Überschrift" mit dem Devicenamen, nur in DOIF_UI kann man es anklicken zum editieren. Das läßt sich an die eigenen Bedürfnisse anpassen und ist im Attribut uiTable beschrieben.
Selbstverständlich erscheint das "rote Fragezeichen", wenn man hier umschaltet. Eben genau so, als würde man das entsprechende Attribut editieren. Das DOIF macht auch nix anderes, als einen fhem-Befehl "attr Device Attribut Value" zu senden.

Das zweite Bild zeigt das Tool im Raum DOIF_UI mit Überschrift, das erste im Raum System ohne Überschrift.
Ach ja, ich verwende noch die group ADMIN, damit steht es (bei mir) dann ganz oben im entsprechenden Raum)

Viel Erfolg!


Sany


Edit: hatte versehentlich ein paar "private" Variablen für Farben drin, ist jetzt korrigiert.

als RAW zum direkten einfügen:
defmod di_SetSysAttr DOIF subs{                                                                ## Beschreibung\
    ## Eintragen der Attribute, die geschaltet werden sollen. Als <off> den Wert eintragen, der bei Schalter=off gesetzt wird, ebenso bei <on>\
    ## Beschreibung ist nur Text, der die beiden Möglichkeiten darstellt.\
    ## beim Umschalten wird das gewählte Attribut entsprechend gesetzt, zur Anzeige dahinter wird das Attribut tatsächlich neu gelesen und angezeigt.\
    ## Das kann auch mit einer Verzögerung geschehen, je nach Systemperformance und Attribut\
    ##\
    ## nur hier ändern!        Device          attr        <off>  <on>    Beschreibung \
    ##push (@{$_attrEntry},[qw(  myMQTT2Srv      autocreate  no    simple  no/simple )]);;\
    push (@{$_attrEntry},[qw(  global          stacktrace  0      1        0/1      )]);;\
    push (@{$_attrEntry},[qw(  global          verbose      3      5        3/5      )]);;\
    push (@{$_attrEntry},[qw(  autocreate      disable      0      1        0/1      )]);;\
    ##+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\
    ## ab hier nix mehr ändern\
\
sub $SELF_attrState {\
        my $dev = shift;;\
        my $attrname = shift;;\
    \
        set_Reading("AttrState_$dev"."_$attrname",AttrVal($dev,$attrname,"???"),1);;\
        ##::Debug("attr: ".$dev.": ".AttrVal($dev,$attrname,"???"));;\
    }\
} ## end subs\
\
init{\
        for (my $i=0;; $i < @{$_attrEntry};; $i++) {\
::Debug("ArrayInhalt $i: ".$_attrEntry[$i][1]);;\
            (AttrVal("$_attrEntry[$i]","$_attrEntry[$i][1]","---") eq "$_attrEntry[$i][3]")?set_Reading("$_attrEntry[$i]_$_attrEntry[$i][1]_attr","on") : set_Reading("$_attrEntry[$i]_$_attrEntry[$i][1]_attr","off");;\
            set_Exec("init_$i",2+$i,qq($SELF_attrState("$_attrEntry[$i]","$_attrEntry[$i][1]")));;\
        }\
 }\
 \
DEF TPL_attrSet (\
$1_ON{\
    if([$SELF:"^$1_$2_attr:.on$"]){\
        set_Reading('AttrState_$1_$2','wait',1);;\
        fhem("attr $1 $2 $4");;\
        set_Exec("ston_$1",2,$SELF_attrState("$1","$2"),'AttrVal("$1","$2","???") ne "$4"');;\
    }\
}\
\
$1_OFF{\
    if([$SELF:"^$1_$2_attr:.off$"]){\
        set_Reading('AttrState_$1_$2','wait',1);;\
        fhem("attr $1 $2 $3");;\
        set_Exec("stoff_$1",2,$SELF_attrState("$1","$2"),'AttrVal("$1","$2","???") ne "$3"');;\
    }\
}\
\
) ## end DEF TPL\
\
FOR (@{$_attrEntry},TPL_attrSet($_$1,$_$2,$_$3,$_$4))
attr di_SetSysAttr event-on-change-reading Attr.*,.*_attr
attr di_SetSysAttr group ADMIN
attr di_SetSysAttr room DOIF_UI,MQTT2_DEVICE,System
attr di_SetSysAttr uiTable {\
package ui_Table;;\
$TC{0,2} = "align='left'";;\
$TC{1} = "align='right'";;\
$TC{3} = "align='center'";;\
$TR{0} = "style='font-size:80%'";;\
\
## die folgenden Einstellungen nach eigenen Bedürfnis bitte anpassen\
## Details unter https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#CSS-Variablen_und_Steuerungsattribute\
##\
$SHOWNOSTATE=1;;                            ## das Device hat keine Anzeige des STATE (brauchts nicht)\
$SHOWNODEVICELINE = "MQTT2_DEVICE|System";;  ## in den hier eingetragenen rooms wird der Devicename nicht angezeigt, deshalb ist dieses Tool auch\
##                                            im room DOIF_UI, hier kann es zum editieren ausgewählt werden\
$SHOWNODEVICELINK = 1;;                      ## die eingetragenen Devices sind nicht anklickbar\
}\
\
"Device:"|"attribute:"|"setting:"|"posbleValues:"\
FOR (@{$_attrEntry},"$_$1"|"$_$2"|WID([$SELF:$_$1_$_$2_attr],"iconSwitch,off,ios_on_fill\@lime,on,ios_off_fill\@slategray").style([$SELF:AttrState_$_$1_$_$2],([$SELF:AttrState_$_$1_$_$2] eq 'wait')?"orange":([$SELF:AttrState_$_$1_$_$2] eq "$_$3")?"slategray" : "lime","13")|style("$_$5","slategray","11")|"")

fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....