[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht

Begonnen von stefanru, 22 März 2019, 21:16:26

Vorheriges Thema - Nächstes Thema

DeeSPe

Ich nutze 0.13.0-b5. Ist die letzte Beta.
Wollte die Presets natürlich auch gern per Namen aufrufbar machen aber hier sind sie auch nicht mit Namen enthalten.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

KernSani

Gerade meinen WLED zusammengelötet, Template eingespielt, geärgert dass Effekte und Paletten nur als Zahlen kommen, diesen Post gefunden. Funktioniert :-) Klasse Erweiterung, Dan!
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

DeeSPe

#137
@Beta-User:
Ich habe soeben mal das AttrTemplate für WLED angepasst:
#source post: https://forum.fhem.de/index.php/topic,98880.msg995308.html#msg995308
name:wled_controller
filter:TYPE=MQTT2_DEVICE
desc:To control a WLED device, see https://github.com/Aircoookie/WLED/wiki for details).
order:W_01
{ Svn_GetFile("contrib/AttrTemplate/99_attrT_WLED_Utils.pm", "FHEM/99_attrT_WLED_Utils.pm", sub(){ CommandReload(undef, "99_attrT_WLED_Utils") }) }
par:BASE_ID;BASE_ID typically is wled;{ AttrVal("DEVICE","readingList","") =~ m,([^:]+)[/][^/]+[/][^/]+:, ? $1 : undef }
par:DEVNAME;Device name as configured;{ AttrVal("DEVICE","readingList","") =~ m,[^:]+[/]([^/]+)[/][^/]+:, ? $1 : undef }
par:ICON;ICON as set, defaults to hue_filled_iris;{ AttrVal("DEVICE","icon","hue_filled_iris") }
attr DEVICE icon ICON
attr DEVICE setList\
  on:noArg BASE_ID/DEVNAME on\
  off:noArg BASE_ID/DEVNAME off\
  toggle:noArg BASE_ID/DEVNAME t\
  rgb:colorpicker,RGB BASE_ID/DEVNAME/col #$EVTPART1\
  brightness:colorpicker,BRI,0,1,255 BASE_ID/DEVNAME\
  speed:colorpicker,BRI,0,1,255 BASE_ID/DEVNAME/api SX=$EVTPART1\
  intensity:colorpicker,BRI,0,1,255 BASE_ID/DEVNAME/api IX=$EVTPART1\
  effect:{"selectnumbers,0,1,".ReadingsNum($name,".effectscount",5).",0,lin"} BASE_ID/DEVNAME/api FX=$EVTPART1\
  effectname:{"select,".join(",",sort(split(",",ReadingsVal($name,".effects","Solid,Police"))))} {WLED_setName($NAME,"effect",$EVTPART1)}\
  palette:{"selectnumbers,0,1,".ReadingsNum($name,".palettescount",5).",0,lin"} BASE_ID/DEVNAME/api FP=$EVTPART1\
  palettename:{"select,".join(",",sort(split(",",ReadingsVal($name,".palettes","Default,Party"))))}  {WLED_setName($NAME,"palette",$EVTPART1)}\
  loadPreset:selectnumbers,0,1,3,0,lin BASE_ID/DEVNAME/api PL=$EVTPART1\
  dimup:noArg BASE_ID/DEVNAME/api A=~10\
  dimdown:noArg BASE_ID/DEVNAME/api A=~-10
attr DEVICE readingList \
  BASE_ID/DEVNAME/status:.* LWT\
  BASE_ID/DEVNAME/g:.* brightness\
  BASE_ID/DEVNAME/g:.* { $EVENT ? {"state"=>"on"} : {"state"=>"off"} }\
  BASE_ID/DEVNAME/c:.* { {"rgb"=>substr("$EVENT",1,6)} }\
  BASE_ID/DEVNAME/v:.* api\
  BASE_ID/DEVNAME/v:.* { $EVENT =~ m,(?<=<sx>)([\d]+)(?=<\/sx>), ? $1 eq ReadingsVal($NAME,"speed","unknown") ? return : {"speed"=>$1} : return; }\
  BASE_ID/DEVNAME/v:.* {$EVENT =~ m,(?<=<ix>)([\d]+)(?=<\/ix>), ? $1 eq ReadingsVal($NAME,"intensity","unknown") ? return : {"intensity"=>$1} : return }\
  BASE_ID/DEVNAME/v:.* {$EVENT =~ m,(?<=<fp>)([\d]+)(?=<\/fp>), ? $1 eq ReadingsVal($NAME,"palette","unknown") ? return : {"palette"=>$1} : return }\
  BASE_ID/DEVNAME/v:.* {$EVENT =~ m,(?<=<fx>)([\d]+)(?=<\/fx>), ? $1 eq ReadingsVal($NAME,"effect","unknown") ? return :{"effect"=>"$1"} : return }
deletereading -q DEVICE (?!associatedWith|IODev).*
attr DEVICE devStateIcon {Color::devStateIcon( $name, "rgb", "rgb", "brightness", "state" )}
attr DEVICE webCmd rgb:brightness:effectname:speed:intensity:palettename:loadPreset
attr DEVICE webCmdLabel RGB:Brightness\
:Effect:Speed:Intensity\
:Palette:Preset
attr DEVICE userReadings effectname:effect.* {WLED_getNames($name,"effect")},\
palettename:palette.* {WLED_getNames($name,"palette")}
attr DEVICE setStateList on off toggle
attr DEVICE comment For questions about the use of different widgets for color selection see discussion at https://forum.fhem.de/index.php/topic,98880.msg995308.html
set DEVICE attrTemplate speechcontrol_type_light_255
farewell:template has been applied successfully. <br>Note: webCmd is just an example; adopt this to your needs.
attr DEVICE model wled_controller
setreading DEVICE attrTemplateVersion 20211208 or prior


Und eine entsprechende Modul Datei für den Code erstellt (siehe Anhang), inkl. der gewünschten Anpassungen.

Ist das so passend? Oder fehlt noch etwas?

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Beta-User

 :) Werd's einchecken, obwohl bis auf einen "4-er" noch Potential besteht:
ZitatTotal violations:     8
Severity 5:            0
Severity 4:            2
Severity 3:            6
PS:
Einfach-Quotes würden es in der Regel auch tun, und
".".$nas."count"
würde ich vermutlich eher so notieren:
".${nas}count"
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

DeeSPe

Okay, ich werde mal noch weiter an der Kritik arbeiten. ;)

Irgendwas stimmt noch nicht mit dem Aufruf der Funktionen.
Habe mal meine Funktionsdatei eingespielt und neu gestartet, aber statt des Namens kommt nun im entsprechenden Reading:
Error evaluating WLED1 userReading effectname: Undefined subroutine &main::WLED_getNames called at (eval 12375) line 1.

Wie muss ich denn jetzt die Funktionen aus meiner .pm aufrufen?
Sorry, kenne mich mit Packaging noch nicht aus.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

Okay, habe es selbst herausgefunden wie die Funktionen aufzurufen sind.
Ich ändere das mal überall und gebe dann ein Update.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

TomLee

Zitat von: DeeSPe am 08 Dezember 2021, 15:08:34
Ich ändere das mal überall und gebe dann ein Update.

Stimmst du mir zu setstateList um loadPreset, dimdown und dimup zu ergänzen ?

Beta-User

Zitat von: TomLee am 08 Dezember 2021, 16:57:40
Stimmst du mir zu setstateList um loadPreset, dimdown und dimup zu ergänzen ?
...irritiert schau...
Warum das denn? Nach meiner Auffassung sollten in setStateList nur Infos stehen, die den "Hauptschalter" repräsentieren. Oder gibt das irgendwie Probleme mit den settern bei den Readings?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Weil in den Readings dazu immer nur set stehen würde, weil da ja nix zurückkommt ?

defmod MQTT2_WLED_TV MQTT2_DEVICE WLED_538e36
attr MQTT2_WLED_TV userattr lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0
attr MQTT2_WLED_TV IODev MQTT2_Server
attr MQTT2_WLED_TV alexaName streifen
attr MQTT2_WLED_TV comment "http://".InternalVal($NAME,'CID','0')."\
effect:selectnumbers,0,1,115,0,lin wled/538e36/api FX=$EVTPART1\
effectname:effect.* {my $h="http://192.168.188.95/json";;$h=~s/_/-/g;; HttpUtils_NonblockingGet( {url=>"$h", callback=>sub($$$) { my ($hash, $err, $data) = @_;; $data =~ m,effects..\[([^[]*?)],;;my $s=$1;;$s=~s/"//g;;$s=~ s/\n//g;;my @a= split(/,/ , $s);;my $i = ReadingsNum($NAME,"effect","1");;;;my $an=@a;;$a=$a[$i];;fhem("setreading $NAME effectname $a;;setreading $NAME effectnumber $an")} }) }
attr MQTT2_WLED_TV devStateIcon {my $os = ReadingsVal($name,"LWT","offline") eq "online" ? "gruen" : "rot";;\
my $cd = Color::devStateIcon( $name, "rgb", "rgb", "brightness", "state" );;\
$cd =~ s/.*:([^:]+):.*/$1/;;\
FW_makeImage('10px-kreis-'.$os)."<a href='/fhem?cmd.dummy=set $name toggle&XHR=1'>".FW_makeImage($cd).'</a>'}
attr MQTT2_WLED_TV event-on-change-reading brightness,effect,intensity,palette,rgb,speed,state,effectname,effectnumber,ircode,LWT,palettename
attr MQTT2_WLED_TV event-on-update-reading ircode
attr MQTT2_WLED_TV eventMap /effect 0:Solid/effect 2:Breathe/effect 63:Pride/loadPreset 1:Fire/
attr MQTT2_WLED_TV genericDeviceType light
attr MQTT2_WLED_TV group Wohnzimmer
attr MQTT2_WLED_TV homebridgeMapping Brightness=brightness::brightness,maxValue=100,factor=0.39216,delay=true
attr MQTT2_WLED_TV icon hue_filled_iris
attr MQTT2_WLED_TV model wled_controller
attr MQTT2_WLED_TV readingList wled/538e36/status:.* LWT\
  wled/538e36/g:.* brightness\
  wled/538e36/g:.* { $EVENT ? {"state"=>"on"} : {"state"=>"off"} }\
  wled/538e36/c:.* { {"rgb"=>substr("$EVENT",1,6)} }\
  wled/538e36/v:.* api\
  wled/538e36/v:.* { $EVENT =~ m,(?<=<sx>)([\d]+)(?=<\/sx>), ? $1 eq ReadingsVal($NAME,"speed","unknown") ? return : {"speed"=>$1} : return;; }\
  wled/538e36/v:.* {$EVENT =~ m,(?<=<ix>)([\d]+)(?=<\/ix>), ? $1 eq ReadingsVal($NAME,"intensity","unknown") ? return : {"intensity"=>$1} : return }\
  wled/538e36/v:.* {$EVENT =~ m,(?<=<fp>)([\d]+)(?=<\/fp>), ? $1 eq ReadingsVal($NAME,"palette","unknown") ? return : {"palette"=>$1} : return }\
  wled/538e36/v:.* {$EVENT =~ m,(?<=<fx>)([\d]+)(?=<\/fx>), ? $1 eq ReadingsVal($NAME,"effect","unknown") ? return :{"effect"=>"$1"} : return }\
WLED_538e36:wled/538e36/ircode:.* ircode
attr MQTT2_WLED_TV room MQTT2_DEVICE,Privat->OG->Wohnzimmer
attr MQTT2_WLED_TV setList on:noArg wled/538e36 on\
off:noArg wled/538e36 off\
toggle:noArg wled/538e36 t\
rgb:colorpicker,RGB wled/538e36/col #$EVTPART1\
brightness:colorpicker,BRI,0,1,255 wled/538e36\
speed:colorpicker,BRI,0,1,255 wled/538e36/api SX=$EVTPART1\
intensity:colorpicker,BRI,0,1,255 wled/538e36/api IX=$EVTPART1\
palette:selectnumbers,0,1,46,0,lin wled/538e36/api &T=1FP=$EVTPART1\
effect:knob,min:0,max:119,width:70,height:70,step:1,lineCap:round,angleOffset:180,cursor:3,thickness:.3 wled/538e36/api FX=$EVTPART1   \
loadPreset:selectnumbers,0,1,3,0,lin wled/538e36/api PL=$EVTPART1\
dimup:noArg wled/538e36/api A=~10\
dimdown:noArg wled/538e36/api A=~-10\
flash:noArg {my $v=ReadingsVal($NAME,"rgb","FFA000");;ReadingsVal($NAME,"state","off") eq "on"?fhem("set $NAME rgb FFFFFF;;sleep 0.5;;set $NAME rgb $v"):fhem("set $NAME toggle;;set $NAME rgb FFFFFF;;sleep 0.5;;set $NAME toggle")}\
effect:{"selectnumbers,0,1,".ReadingsNum($name,".effectscount",5).",0,lin"} {WLED_setName($NAME,"effect",$EVTPART1)}\
effectname:{"select,".join(",",sort(split(",",ReadingsVal($name,".effects","Solid,Police"))))} {WLED_setName($NAME,"effect",$EVTPART1)}\
palette:{"selectnumbers,0,1,".ReadingsNum($name,".palettescount",5).",0,lin"} {WLED_setName($NAME,"palette",$EVTPART1)}\
palettename:{"select,".join(",",sort(split(",",ReadingsVal($name,".palettes","Default"))))}  {WLED_setName($NAME,"palette",$EVTPART1)}
attr MQTT2_WLED_TV setStateList on off toggle loadPreset dimdown dimup
attr MQTT2_WLED_TV stateFormat LWT\ state
attr MQTT2_WLED_TV userReadings effectname:effect.* {WLED_getNames($name,"effect")},\
palettename:palette.* {WLED_getNames($name,"palette")}
attr MQTT2_WLED_TV webCmd rgb:brightness:effectname:speed:loadPreset:palettename:intensity
attr MQTT2_WLED_TV webCmdLabel RGB:Brightness\
:Effect:Speed:Preset\
:Palette:Intensity

setstate MQTT2_WLED_TV online\ on
setstate MQTT2_WLED_TV 2021-12-07 12:46:21 .effects Solid,Blink,Breathe,Wipe,Wipe_Random,Random_Colors,Sweep,Dynamic,Colorloop,Rainbow,Scan,Scan_Dual,Fade,Theater,Theater_Rainbow,Running,Saw,Twinkle,Dissolve,Dissolve_Rnd,Sparkle,Sparkle_Dark,SparklePlus,Strobe,Strobe_Rainbow,Strobe_Mega,Blink_Rainbow,Android,Chase,Chase_Random,Chase_Rainbow,Chase_Flash,Chase_Flash_Rnd,Rainbow_Runner,Colorful,Traffic_Light,Sweep_Random,Running_2,Aurora,Stream,Scanner,Lighthouse,Fireworks,Rain,Tetrix,Fire_Flicker,Gradient,Loading,Police,Police_All,Two_Dots,Two_Areas,Circus,Halloween,Tri_Chase,Tri_Wipe,Tri_Fade,Lightning,ICU,Multi_Comet,Scanner_Dual,Stream_2,Oscillate,Pride_2015,Juggle,Palette,Fire_2012,Colorwaves,Bpm,Fill_Noise,Noise_1,Noise_2,Noise_3,Noise_4,Colortwinkles,Lake,Meteor,Meteor_Smooth,Railway,Ripple,Twinklefox,Twinklecat,Halloween_Eyes,Solid_Pattern,Solid_Pattern_Tri,Spots,Spots_Fade,Glitter,Candle,Fireworks_Starburst,Fireworks_1D,Bouncing_Balls,Sinelon,Sinelon_Dual,Sinelon_Rainbow,Popcorn,Drip,Plasma,Percent,Ripple_Rainbow,Heartbeat,Pacifica,Candle_Multi,_Solid_Glitter,Sunrise,Phased,Twinkleup,Noise_Pal,_Sine,Phased_Noise,Flow,Chunchun,Dancing_Shadows,Washing_Machine,Candy_Cane,Blends,TV_Simulator,Dynamic_Smooth
setstate MQTT2_WLED_TV 2021-12-07 12:46:21 .effectscount 117
setstate MQTT2_WLED_TV 2021-12-07 12:46:38 .palettes Default,*_Random_Cycle,*_Color_1,*_Colors_1_2,*_Color_Gradient,*_Colors_Only,Party,Cloud,Lava,Ocean,Forest,Rainbow,Rainbow_Bands,Sunset,Rivendell,Breeze,Red___Blue,Yellowout,Analogous,Splash,Pastel,Sunset_2,Beech,Vintage,Departure,Landscape,Beach,Sherbet,Hult,Hult_64,Drywet,Jul,Grintage,Rewhi,Tertiary,Fire,Icefire,Cyane,Light_Pink,Autumn,Magenta,Magred,Yelmag,Yelblu,Orange___Teal,Tiamat,April_Night,Orangery,C9,Sakura,Aurora,Atlantica,C9_2,C9_New,Temperature,Aurora_2
setstate MQTT2_WLED_TV 2021-12-07 12:46:38 .palettescount 55
setstate MQTT2_WLED_TV 2021-12-05 10:18:24 IODev MQTT2_Server
setstate MQTT2_WLED_TV 2021-12-08 16:52:23 LWT online
setstate MQTT2_WLED_TV 2021-12-08 16:52:23 api <?xml version="1.0" ?><vs><ac>112</ac><cl>255</cl><cl>160</cl><cl>0</cl><cs>0</cs><cs>0</cs><cs>0</cs><ns>0</ns><nr>1</nr><nl>0</nl><nf>1</nf><nd>60</nd><nt>0</nt><fx>52</fx><sx>6</sx><ix>56</ix><fp>8</fp><wv>0</wv><ws>0</ws><ps>0</ps><cy>0</cy><ds>WLED_TV</ds><ss>0</ss></vs>
setstate MQTT2_WLED_TV 2021-12-08 16:52:23 brightness 112
setstate MQTT2_WLED_TV 2021-09-10 15:22:58 deinsettername set
setstate MQTT2_WLED_TV 2021-12-08 16:48:25 dimdown set
setstate MQTT2_WLED_TV 2021-12-08 16:47:30 dimup set
setstate MQTT2_WLED_TV 2021-12-08 16:52:23 effect 52
setstate MQTT2_WLED_TV 2021-12-08 16:52:23 effectname Circus
setstate MQTT2_WLED_TV 2021-09-10 22:48:36 effectnumber 118
setstate MQTT2_WLED_TV 2021-12-08 16:21:18 intensity 56
setstate MQTT2_WLED_TV 2021-12-08 16:42:51 ircode 0x71fe45b1
setstate MQTT2_WLED_TV 2021-12-08 16:47:56 loadPreset set 1
setstate MQTT2_WLED_TV 2021-12-08 16:49:54 palette 8
setstate MQTT2_WLED_TV 2021-12-08 16:49:55 palettename Lava
setstate MQTT2_WLED_TV 2021-12-08 16:52:23 rgb FFA000
setstate MQTT2_WLED_TV 2021-12-08 09:12:39 speed 6
setstate MQTT2_WLED_TV 2021-12-08 16:52:23 state on


TomLee

Das mag jetzt irritirend sein das die Readings in dem List vorhanden sind, ich hab sie bloss noch nicht gelöscht seit vorhin, als ich bevor ich schrieb nochmal getestet hatte warum ich die Namen in setstatList eingetragen hatte.

Beta-User

Ja. Und?
Besser, wie wenn der state mit was gefüllt wird, was da nicht hingehört (mAn.) ;) . Kann man notfalls mit einem periodicCmd löschen, wenn's einem nicht gefällt :) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Na ja, das steht ja nur solange drin bis wieder was in state landet.

Beim ValetudoRE-Template ist das auch so umgesetzt, Otto denkt dann wsl. so wie ich.


ZitatKann man notfalls mit einem periodicCmd löschen, wenn's einem nicht gefällt :) .

Da seh ich lieber "zufällig" mal eines der 3 Rückgabewerte der setter in state, wie drei unnötig angelegte Reading, die mal da sind und mal nicht.

DeeSPe

#147
Zitat von: TomLee am 08 Dezember 2021, 16:57:40
Stimmst du mir zu setstateList um loadPreset, dimdown und dimup zu ergänzen ?

Für dimdown und dimup stimme ich Dir zu, das braucht kein eigenes Reading und in "state" wird es sofort nach dem Setzen wieder mit "on/off" ersetzt.
Für loadPreset habe ich nun im AttrTemplate ein eigenes Reading mit eingebaut. Das Reading "loadPreset" wird also wie bisher erst mit "set X" gefüllt und danach dann aber auf die Nummer des gesetzten Presets gesetzt.

@Beta-User:
Hier nun das fertige AttrTemplate:
entfernt

Und im Anhang die Moduldatei.
Bis auf einen Eintrag aus Perlcritic habe ich alles beherzigt. Ich weiß einfach nicht was er mir mit "Always unpack @_ first at line 40, column 1. See page 178 of PBP." sagen möchte bzw. wie ich es weg bekommen soll.
Ich würde mich freuen wenn Du das so einchecken könntest.

Danke.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

#148
Ich habe mich nochmal durch die API Doku von WLED gelesen und noch ein paar weitere Setter eingebaut.
Auch das Auflösen der Effekte- und Palettennamen über "userReadings" war nicht ganz glücklich. Bei mir kam es immer wieder zu dem Problem dass teilweise die Namen nicht aufgelöst wurden.

Ich habe darum das AttrTemplate und die Moduldatei im vorherigen Beitrag noch einmal etwas umgebaut und auf den aktuellen Stand gebracht.

Zusätzlich habe ich "loadPreset" geändert in "preset" und "brightness" in "bri".
Und es gibt ein userReading für "pct".

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

TomLee

Was ist denn für dich der Hintergrund das brightness jetzt in bri umbenannt werden sollte ?