Hallo Fhemler,
ich steige solangsam mit meinen Geräte auf Shelly um, da diese doch einfacher zu Handhaben sind.
Nun eine Frage zum ShellyRGBW, welches ich mit einem RGBW streifen nutzen möchte.
Ich kann hier alle Farben einstellen (per rgb) z.b. 00FF00 oder FF0000, aber nicht diese beiden -> "000000" und "FFFFFF"
Da ich von Wifilight komme wo dies funktioniert, müsste ich jetzt änderungen vornehmen, was sich im Mischbetrieb schwierig gestaltet. Bevor ich dies due würde ich gern eure Meinung hören.
Eingebunden habe ich dies über MQTT2.
MFG Rico
Internals:
CID shellyrgbw2_D887B2
DEF shellyrgbw2_D887B2
DEVICETOPIC MQTT2_shellyrgbw2_D887B2
FUUID 614f2694-f33f-bec9-d656-1c0cc903e9e3c812
IODev myBroker
LASTInputDev myBroker
MSGCNT 320
NAME MQTT2_shellyrgbw2_D887B2
NR 1091
STATE on
TYPE MQTT2_DEVICE
myBroker_MSGCNT 320
myBroker_TIME 2021-10-17 19:49:45
Helper:
DBLOG:
power:
logdb:
TIME 1634492887.80815
VALUE 0.23
READINGS:
2021-10-17 19:24:18 IODev myBroker
2021-09-25 15:42:08 actions_stats_skipped 0
2021-09-25 15:42:08 attrTemplateVersion 20201215
2021-10-17 19:48:07 blue 0
2021-09-25 15:42:08 cfg_changed_cnt 0
2021-09-25 15:42:08 cloud_connected false
2021-09-25 15:42:08 cloud_enabled false
2021-09-25 15:42:02 color_0 on
2021-10-17 19:48:09 color_0_energy 35
2021-10-17 19:48:07 color_0_overpower 0
2021-10-17 19:48:07 color_0_power 0.23
2021-10-17 19:48:07 effect 0
2021-10-17 19:24:38 event
2021-10-17 19:24:38 event_cnt 0
2021-09-25 15:42:08 fs_free 152357
2021-09-25 15:42:08 fs_size 233681
2021-10-17 19:24:37 fw_ver 20210909-145215/v1.11.4-DNSfix-ge6b2f6d
2021-10-17 19:48:07 gain 16
2021-10-17 19:48:07 green 255
2021-10-17 19:48:07 has_timer false
2021-09-25 15:42:08 has_update false
2021-10-17 19:24:37 id shellyrgbw2-D887B2
2021-09-25 15:42:08 input 0
2021-10-17 19:48:07 input_0 0
2021-09-25 15:42:08 inputs_1_event
2021-09-25 15:42:08 inputs_1_event_cnt 0
2021-09-25 15:42:08 inputs_1_input 0
2021-10-17 19:24:37 ip 192.168.9.215
2021-10-17 19:48:07 ison true
2021-09-25 15:42:08 lights_1_blue 0
2021-09-25 15:42:08 lights_1_effect 0
2021-09-25 15:42:08 lights_1_gain 100
2021-09-25 15:42:08 lights_1_green 0
2021-09-25 15:42:08 lights_1_has_timer false
2021-09-25 15:42:08 lights_1_ison true
2021-09-25 15:42:08 lights_1_mode color
2021-09-25 15:42:08 lights_1_overpower false
2021-09-25 15:42:08 lights_1_power 2.38
2021-09-25 15:42:08 lights_1_red 255
2021-09-25 15:42:08 lights_1_source http
2021-09-25 15:42:08 lights_1_timer_duration 0
2021-09-25 15:42:08 lights_1_timer_remaining 0
2021-09-25 15:42:08 lights_1_timer_started 0
2021-09-25 15:42:08 lights_1_transition 0
2021-09-25 15:42:08 lights_1_white 0
2021-10-17 19:24:37 mac E8DB84D887B2
2021-09-25 15:42:08 meters_1_counters_1 1.829
2021-09-25 15:42:08 meters_1_counters_2 2.482
2021-09-25 15:42:08 meters_1_counters_3 0.000
2021-09-25 15:42:08 meters_1_is_valid true
2021-09-25 15:42:08 meters_1_overpower false
2021-09-25 15:42:08 meters_1_power 2.38
2021-09-25 15:42:08 meters_1_timestamp 1632584528
2021-09-25 15:42:08 meters_1_total 4
2021-10-17 19:48:07 mode color
2021-10-17 19:24:37 model SHRGBW2
2021-09-25 15:42:08 mqtt_connected true
2021-10-17 19:24:37 new_fw true
2021-10-17 19:49:45 online false
2021-10-17 19:48:07 overpower false
2021-10-17 19:48:07 power 0.23
2021-09-25 15:42:08 ram_free 38424
2021-09-25 15:42:08 ram_total 50880
2021-10-17 19:48:07 red 255
2021-10-17 19:48:07 rgb FFFF00
2021-09-25 15:42:08 serial 1
2021-10-17 19:48:07 source mqtt
2021-10-17 19:48:07 state on
2021-09-25 15:42:08 time 15:42
2021-10-17 19:48:07 timer_duration 0
2021-10-17 19:48:07 timer_remaining 0
2021-10-17 19:48:07 timer_started 0
2021-10-17 19:48:07 transition 0
2021-09-25 15:42:08 unixtime 1632577328
2021-09-25 15:42:08 update_has_update false
2021-09-25 15:42:08 update_new_version 20210909-145215/v1.11.4-DNSfix-ge6b2f6d
2021-09-25 15:42:08 update_old_version 20210909-145215/v1.11.4-DNSfix-ge6b2f6d
2021-09-25 15:42:08 update_status idle
2021-09-25 15:42:08 uptime 160
2021-10-17 19:48:07 white 0
2021-09-25 15:42:08 wifi_sta_connected true
2021-09-25 15:42:08 wifi_sta_ip 192.168.9.242
2021-09-25 15:42:08 wifi_sta_rssi -52
2021-09-25 15:42:08 wifi_sta_ssid FRITZ!Box 7490
2021-09-25 15:42:08 x_mqttcom set announce
Attributes:
devStateIcon {my $onl = ReadingsVal($name,"online","false") eq "true"?"10px-kreis-gruen":"10px-kreis-rot"; my $light = ReadingsVal($name,"state","off"); my $cons = ReadingsVal($name,"power","unknown"); "<a href=\"http://".ReadingsVal($name,"ip","none")." \"target=\"_blank\">".FW_makeImage($onl)."</a> <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a><div>Verbrauch: $cons</div>"}
genericDeviceType light
homebridgeMapping Brightness=brightness::brightness,maxValue=100,factor=0.39216,delay=true
icon light_control
model shelly2rgbw_color
readingList shellies/shellyrgbw2-D887B2/color/0/status:.* {json2nameValue($EVENT)}
shellies/shellyrgbw2-D887B2/color/0:.* state
shellies/shellyrgbw2-D887B2/online:.* online
shellies/announce:.* { $EVENT =~ m,..id...shellyrgbw2-D887B2...mac.*, ? json2nameValue($EVENT) : return }
shellyrgbw2_D887B2:shellies/shellyrgbw2-D887B2/announce:.* { json2nameValue($EVENT) }
shellyrgbw2_D887B2:shellies/shellyrgbw2-D887B2/info:.* { json2nameValue($EVENT) }
shellyrgbw2_D887B2:shellies/shellyrgbw2-D887B2/color/0/energy:.* color_0_energy
shellyrgbw2_D887B2:shellies/shellyrgbw2-D887B2/input/0:.* input_0
shellyrgbw2_D887B2:shellies/shellyrgbw2-D887B2/color/0/power:.* color_0_power
shellyrgbw2_D887B2:shellies/shellyrgbw2-D887B2/color/0/overpower:.* color_0_overpower
shellyrgbw2_D887B2:shellies/shellyrgbw2-D887B2/input_event/0:.* { json2nameValue($EVENT) }
room MQTT2_DEVICE
setList off:noArg shellies/shellyrgbw2-D887B2/color/0/command off
on:noArg shellies/shellyrgbw2-D887B2/color/0/command on
brightness:colorpicker,BRI,0,1,255 shellies/shellyrgbw2-D887B2/white/0/set {"mode":"white","brightness":"$EVTPART1"}
white:colorpicker,BRI,0,1,255 shellies/shellyrgbw2-D887B2/color/0/set {"white":"$EVTPART1"}
gain:colorpicker,BRI,0,1,100 shellies/shellyrgbw2-D887B2/color/0/set {"gain":"$EVTPART1"}
rgb:colorpicker,RGB {$EVTPART1=~/(..)(..)(..)/;if($1 ne $2 || $2 ne $3) {"shellies/shellyrgbw2-D887B2/color/0/set {\"mode\":\"color\",\"red\":".hex($1).",\"green\":".hex($2).",\"blue\":".hex($3)."}"}else{"shellies/shellyrgbw2-D887B2/color/0/set {\"turn\":\"on\",\"mode\":\"white\",\"brightness\":".int(hex($1)/2.55)."}"}}
white_on:colorpicker,BRI,0,1,100 shellies/shellyrgbw2-D887B2/color/0/set {"turn":"on","white":"$EVTPART1"}
gain_on:colorpicker,BRI,0,1,100 shellies/shellyrgbw2-D887B2/color/0/set {"turn":"on","gain":"$EVTPART1"}
rgb_on:colorpicker,RGB {$EVTPART1=~/(..)(..)(..)/;if($1 ne $2 || $2 ne $3) {"shellies/shellyrgbw2-D887B2/color/0/set {\"turn\":\"on\",\"mode\":\"color\",\"gain\":\"100\",\"red\":".hex($1).",\"green\":".hex($2).",\"blue\":".hex($3)."}"}else{"shellies/shellyrgbw2-D887B2/color/0/set {\"turn\":\"on\",\"mode\":\"white\",\"brightness\":".int(hex($1)/2.55)."}"}}
effect:selectnumbers,0,1,6,0,lin shellies/shellyrgbw2-D887B2/color/0/set {"effect":"$EVTPART1"}
x_update:noArg shellies/shellyrgbw2-D887B2/command update_fw
x_mqttcom shellies/shellyrgbw2-D887B2/command $EVTPART1
setStateList on off
userReadings rgb:red.* {if(ReadingsVal($name,"mode","") eq "color"){sprintf("%02X%02X%02X", ReadingsVal($name,"red",99), ReadingsVal($name,"green",99), ReadingsVal($name,"blue",99))}else{my $a=sprintf("%02X",ReadingsVal($name,"brightness",0)*2.555);"$a$a$a"}}
webCmd on:off:white:gain:rgb:effect:rgb FFFFFF:rgb ff0000:rgb 00ff00:rgb 0000ff:rgb FFF9A8
Na ja, wenn alle Farbwerte gleich sind, ist es eigentlich Weiß, und das biegt der Code in der setList zu RGB halt entsprchend hin. Wenn du das anders haben willst, kannst du ja mal testweise einfach $EVTPART1 unverändert durchreichen.
rgb:colorpicker,RGB {$EVTPART1=~/(..)(..)(..)/;'shellies/shellyrgbw2-D887B2/color/0/set {"mode":"color","red":'.hex($1).',"green":'.hex($2).',"blue":'.hex($3).'}'}
Hallo,
verstehe nicht ganz. Wo oder wie soll ich den Code testen?
Unter dem Attr Webcmd?
Wie gesagt, es gehen alle Farben außer die beiden.
FFFFFF müsste ja komplett hell machen und 000000 sollte eigentlich schwarz/off bedeuten.
Beide Befehle werden aber gar nicht akzeptiert.
MFG Rico.
Nein, im Attribut "setList" die eine Zeile tauschen, bei der es um rgb geht.
Ich kann aber nicht sagen, ob das klappt; evtl. muss da auch was am userReadings "rgb geändert werden. Es wäre hilfreich, wenn du je ein RAW-list liefern könntest in dem Zustand, dass es (via rgb 000000) ganz aus bzw. rgb FFFFFF ganz an geschaltet ist. In deinem list war ja irgendeine Farbe eingestellt.
Genial,
das funktioniert.
Kannst du mir in "einfachen Worten" erklären was jetzt anders ist.
Danke Rico
Na ja, wenn alle Werte für rot, gelb und blau gleich sind, ist es eigentlich ein "weiß"-Kommando (mit Helligkeitsangabe), und es ist "sauberer", das als solches an den ESP zu übergeben. Genau das macht die ursprüngliche Zeile, die Änderung übermittelt halt immer einen "einfachen" rgb-Wert.
Vom Coding her ist es in der Ausgangsfassung ein "ternärer operator", also eine verkürzte if -then - else-Konstruktion, beide Zeilen verwenden halt eine regex und Perl.
Ist das eine halbwegs einfache Erklärung, oder was interessiert dich im Besonderen?
Mich hätte interessiert warum die beiden nicht gehen.
Vermutlich kann der Shelly bei "schwarz" oder "weiß" mit der Helligkeit nicht umgehen, und wenn es direkt kommt gehts.
Um das rauszufinden, müßte man ein paar Tests machen, am einfachsten direkte publishes über den MQTT2_SERVER. Dann könnte/müßte man evtl. diese beiden Varianten nochmal gesondert abhandeln...
Mal schauen (aber nicht mehr heute), bitte melden, wenn Interesse besteht.
nein muss nicht sein, ab hier beginnt sowieso der Teil wo ich nur noch Bahnhof verstehe. 8)
Wichtig ist die Lösung für mich.
Funktioniert übrigens auch bei einer ShellyBulbduo.
Also Danke nochmal.
Hallo Ich nochmal,
ich habe heute mit Stacktrace folgende Warning erhalten.2021.10.21 17:51:45 1: PERL WARNING: Use of uninitialized value $3 in hex at (eval 646977) line 1.
2021.10.21 17:51:45 1: eval: my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $EVTPART1= $evalSpecials->{'%EVTPART1'};my $NAME= $evalSpecials->{'%NAME'};{$EVTPART1=~/(..)(..)(..)/;'shellies/shellyrgbw2-D887B2/color/0/set {"mode":"color","red":'.hex($1).',"green":'.hex($2).',"blue":'.hex($3).'}'}
2021.10.21 17:51:45 1: stacktrace:
Hängt das mit dieser Veränderung zusammen. Es werden alle 3 $1, $2, $3 als uninitialized angezeigt.
rgb:colorpicker,RGB {$EVTPART1=~/(..)(..)(..)/;'shellies/shellyrgbw2-D887B2/color/0/set {"mode":"color","red":'.hex($1).',"green":'.hex($2).',"blue":'.hex($3).'}'}
Ich habe es nochmal zurück geändert und da ist mir gerade aufgefallen das keine Farbe geht sobald $1, $2, $3, den gleichen Wert haben.
Kannst du das bitte noch mal prüfen.
Danke.
MFG Rico
Also:
Die "uninitialized"-Warnings dürften daher kommen, dass irgendwas/irgendwer versucht, einen "leeren" rgb-Wert zu setzen. Kann man mit einer entsprechenden Abfrage, ob z.B. $3 "defined" ist abfangen. Das ist aber kein originär mit der Änderung zusammenhängendes Thema, sondern eines, das auch die Version im template-file hat.
Irgendwann über das WE wird es daher ein update geben, das das abfängt.
Zitat von: rico5588 am 21 Oktober 2021, 17:59:36
Ich habe es nochmal zurück geändert und da ist mir gerade aufgefallen das keine Farbe geht sobald $1, $2, $3, den gleichen Wert haben.
Kannst du das bitte noch mal prüfen.
Im Ausgangstemplate ist das Absicht, weil - wie ich bereits versucht habe zu erläutern - "gleichwertige" rgb-Angaben eigentlich Weiß-Anweisungen sind, eben mit unterschiedlichen Helligkeitswerten (000000 mit der Besonderheit, dass es eigentlich "off" ist).
Jetzt muss ich raten, was du mit "zurück geändert" meinst: Falls der ESP auf z.B. "rgb 999999", (im JSON) gesendet als RGB-Angabe, gar nicht reagiert, ist es ein "Problem" der firmware, das das template bisher sauber umschifft hat, halt anscheinend um den Preis, dass "voll an" und "ganz aus" nicht funktionieren. Müßte/könnte man abfangen, indem man diese beiden Werte vorab in der Perl-Anweisung prüft, aber dazu bräuchte ich eine etwas genauere Problembeschreibung, die ich auch nachvollziehen kann (= FHEM-Befehle einerseits, MQTT-Rohdaten andererseits, zusammen mit einem RAW-list des ganzen Devices, das jeweils angesprochen ist).
Hallo,
vielleicht drücke ich mich falsch aus.
Punkt1: Im Original Template kann ich im rgb Picker die Werte 000000 und ffffff nicht anwählen. (im Foto Pfeil 1 oder direkt Eingabe)
Punkt2: die anderen Werte kann ich auch nicht anwählen 121212, 131313 etc alle, nennen wir es mal Graustufen. (im Foto Pfeil 2 oder direkt eingabe, wenn FFFFFF gesetzt wäre)
Das ist jetzt kein Problem für mich, wollte es nur mal anzeigen. Eben nur ein Unterschied zum Beispiel zum rgb bei Wifilight.
Mit deinem geänderten code
rgb:colorpicker,RGB {$EVTPART1=~/(..)(..)(..)/;'shellies/shellyrgbw2-D887B2/color/0/set {"mode":"color","red":'.hex($1).',"green":'.hex($2).',"blue":'.hex($3).'}'}
geht beides wie ich das von Wifilight kenne, nur eben mit den Warnings!
ZitatIm Ausgangstemplate ist das Absicht, weil - wie ich bereits versucht habe zu erläutern - "gleichwertige" rgb-Angaben eigentlich Weiß-Anweisungen sind, eben mit unterschiedlichen Helligkeitswerten
Das Versteh ich, man kann es halt nur nicht benutzen. Siehe Punkt 2.
Versteh ich das richtig, mit FFFFFF woltest du den 4 Kanal zuschalten?
Mit "zurück geändert" meine ich eben diesen code auf original ↑...
MFG Rico
Das Widget ist ein allgemeines, dann klappt das mit den beiden (bzw. Weiss-) Werten grundsätzlich nicht, ganz unabhängig vom konkteten Device. Welches Widget WifiLight da nutzt, weiß ich nicht, aber das Widget verhindert auch nicht das händische Setzen, so dass Testen der Werte an sich schon gehen sollte.
Die undef-Geschichte ist nachher mit dem svn-update hoffentlich erledigt.
Versteh ich das richtig, mit FFFFFF woltest du den 4 Kanal zuschalten?
Doppeltes Mißverständnis:
a) der Code ist nicht ursprünglich von mir, ich sammle nur ein, versuche eine Linie reinzubringen und stelle es dann allen zur Verfügung. Die meisten Geräte habe ich gar nicht, und WLAN finde ich sowieso "bäh"...
b) Alle weiss-Anweisungen gehen grundsätzlich in den white-Modus über, was ja grundsätzlich richtig sein sollte... Wie die Hardware das dann konkret umsetzt, entzieht sich meiner Kenntnis (siehe a) am Ende).
Hallo ich nochmal,
ich möchte gern meine Device für mich (für alle) noch etwas anpassen.
Ob du mir nochmal suport geben kannst?
Meine Vorstellung...
Wenn RGB = 000000 oder OFF dann aus.
off:noArg| shellies/shellycolorbulb-3C6105E500CC/color/0/command off
rgb:colorpicker,RGB {$EVTPART1=~/(..)(..)(..)/;if($1 eq "00" || $2 eq "00" || $3 eq "00") {"shellies/shellycolorbulb-3C6105E500CC/color/0/command off"}}
Wenn RGB = FFFFFF dann mode white mit Temp 4000
rgb:colorpicker,RGB {$EVTPART1=~/(..)(..)(..)/;if($1 eq "FF" || $2 eq "FF" || $3 eq "FF") {\"mode\":\"white\",\"brightness\":\"255\",\"temp\":\"4000\"}"}
alle anderen Farben 1:1
Es gibt noch eine Funktion effect in der Shellybulb, welche aktuell nicht angelegt ist...
Ich dachte das könnte so gehen, aber nein!
effect:selectnumbers,0,1,3,0,lin shellies/shellycolorbulb-3C6105E500CC/color/0/set {"effect":"$EVTPART1"}
MFG Rico (und wenn es mal zeitlich reinpasst, kein Stress!)
Da geht was mit den Abfragen durcheinander...
Zum einen muss alles, was rgb ist, dann auch über den einen setter gehen, hier mal ein Beispiel für die Erweiterung bzgl. "off":
rgb:colorpicker,RGB { return 'shellies/shellycolorbulb-3C6105E500CC/color/0/command off' if $EVTPART1 eq '000000'; $EVTPART1=~/(..)(..)(..)/;'shellies/shellyrgbw2-D887B2/color/0/set {"mode":"color","red":'.hex($1).',"green":'.hex($2).',"blue":'.hex($3).'}'}
Das sollte eigentlich ausreichen, damit du auch die Temp 4000-Variante hinbekommst ;) .
Zum Effekt:
An sich sieht dein Versuch schon ganz ok aus, kann sein, dass "nur" die falsche nummerische Übergabe stört (der reinen Lehre nach ohne Quotes), kann auch sein, dass ein weiterer Befehl dazu muss, z.B. on:
effect:selectnumbers,0,1,3,0,lin shellies/shellycolorbulb-3C6105E500CC/color/0/set {"effect": $EVTPART1, "turn": "on"}
die effekte gehen nun :D
Nun zu den Farben
Wichtig ist es immer die gleiche Lampe anzusprechen ;D 8) (3C6105E500CC<->shellyrgbw2-D887B2) habe gerade wieder die Küche zum leuchten gebracht...
Aber die "test" bulb geht nun - alles Farbig und Aus bei 000000.
rgb:colorpicker,RGB { return 'shellies/shellycolorbulb-3C6105E500CC/color/0/command off' if $EVTPART1 eq '000000'; $EVTPART1=~/(..)(..)(..)/;'shellies/shellyrgbw2-D887B2/color/0/set {"mode":"color","red":'.hex($1).',"green":'.hex($2).',"blue":'.hex($3).'}'}
Wenn ich jetzt noch FFFFFF dazu haben möchte kann ich das dann so erweitern?
rgb:colorpicker,RGB { return 'shellies/shellycolorbulb-3C6105E500CC/color/0/command off' if $EVTPART1 eq '000000'; return 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {\"turn\":\"on\",\"brightness\":".int(hex($1)/2.55).",\"mode\":\"white\",\"temp\":\"$EVTPART1\"}' if $EVTPART1 eq 'FFFFFF'; $EVTPART1=~/(..)(..)(..)/;'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"mode":"color","red":'.hex($1).',"green":'.hex($2).',"blue":'.hex($3).'}'}
Praktisch geht es so nicht!
Na ja, ein bißchen selber Knobeln schadet doch eigentlich nicht...
Dass du den weiteren Pfad als "mittleren Teil" ergänzen müßtest, hast du ja bereits korrekt erfasst. Aber warum dann noch die (nicht aufzulösende (s.u.)) Variable $EVTPART1 da steht, erschließt sich mir nicht, genausowenig die "escapes" für die doppelten Quotes.
Dein Suchwort heißt "Quotes in Perl" - siehe z.B. https://www.perlmonks.org/?node_id=401006.
Das bekommst du schon vollends hin ;) .
ich brauch doch nochmal einen Gedankeanstoß.
Ich bekomme es nicht hin, den mode White zu aktivieren.
Perl bin ich nicht so ganz (garnicht) Fit und meine TrialandError Methode zieht nicht 8)
Das hier sollte nach meiner Theorie den mode white, mit Farbe 4000 setzen, wo liegt das Problem ?
rgb:colorpicker,RGB { return 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {\"mode\":\"white\,\"temp\":\"4000\"}' if $EVTPART1 eq 'FFFFFF'}
Gruß Rico
Zitat von: rico5588 am 05 November 2021, 16:50:19
wo liegt das Problem ?
Bei "Quotes in Perl", ein bißchen "paarig" zählen, und einem fehlenden "Hosenträger" (vermutlich) ::) ...
rgb:colorpicker,RGB { return 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"white","temp":4000}' if $EVTPART1 eq 'FFFFFF'}
Ergänzend: Geschweifte Klammern sind mehrdeutig:
- die ersten sind für "das ist Perl-Code"-Erkennung in MQTT2_DEVICE;
- die inneren sind hier (!) die Textmarker für "das ist JSON" in der Payload
Es gibt aber noch weitere geschweifte Klammer-Typen, die man kennen sollte:
- Abgrenzung von "if"-Zweigen in Perl (bei "normalem, vorangestelltem if");
- Hash-Marker, um key-Value-Paare in Perl kenntlich zu machen/zu erzeugen...
Ist nicht ganz selbsterklärend, und man muss aufpassen, in welchem Kontext was steht.
So hatte ich das gestern auch schon versucht, geht aber nicht.
Zitatrgb:colorpicker,RGB { return 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"white","temp":4000}' if $EVTPART1 eq 'FFFFFF'}
so ↓ schaltet es zumindest in jede Farbe auf mode:white
rgb:colorpicker,RGB shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"white","temp":4000}
Mein Testgerät sagt, dass FFFFFF mit meinem Code zu einem passenden publish führt => kann keinen Fehler erkennen, tut mir leid.
so gehts nicht
rgb:colorpicker,RGB { return 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"white","temp":"$EVTPART1"}' if $EVTPART1 eq 'FFFFFF'}
so geht es bei jedem Farbwert
rgb:colorpicker,RGB { return 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"white","temp":"$EVTPART1"}'}
so geht es bei jedem Farbwert, sollte aber nur bei "FFFFFF" gehen
rgb:colorpicker,RGB { return 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"white","temp":4000}'if $EVTPART1 == 'FFFFFF'}
rgb:colorpicker,RGB { return 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"white","temp":4000}'if $EVTPART1 = 'FFFFFF'}
Es wird der Farbwert nicht erkannt. Andere gehen auch nicht (z.b. FFFFF1)
Noch eine Idee was ich testen kann?
Dieses wilde rumprobieren wird nicht weiterführen.
Sowas ist Quatsch und die Konsequenz im Log zu finden sein (nummeric eq)
Zitatif $EVTPART1 == 'FFFFFF'
Das ist auch Quatsch:
if $EVTPART1 = 'FFFFFF'
"=" ist eine Zuweisung, und die klappt/ist wahr.
Du mußt dich mit den Grundlagen beschäftigen.
Nochmal:
Zitat von: Beta-User am 05 November 2021, 17:07:48
Mein Testgerät sagt, dass FFFFFF mit meinem Code zu einem passenden publish führt => kann keinen Fehler erkennen, tut mir leid.
Was immer du gestern versucht hast, es war ziemlich sicher (geringfügig) was anderes. Damit bin ich erst mal raus.
Hallo,
Finale:
ich habe mich vom Colorpicker etwas in die Irre führen lassen.
Ich habe immer im Colorpicker FFFFFF eingegeben und dort hat er immer die Farbe FFFFFF im mode color eingestellt.
Niemals aber ist er in den mode white gesprungen...
Nach langem "Rum" probieren ;D habe ich den Befehl mal direkt abgesetzt.
set shelly2 rgb FFFFFF
Und hier geht's...
Alles nochmal auf Anfang und nun bin ich zufrieden.
Anbei nochmal die komplette RAW.
Vielleicht willst du ja den Teil mit die Effekte noch ins Temp übernehmen.
Da man zum umschalten des mode color|white das turn:on mitgeben muß, habe ich mir rgb_on gesparrt.
defmod Shelly2 MQTT2_DEVICE shellycolorbulb_3C6105E500CC
attr Shelly2 comment rgb:colorpicker,RGB {return 'shellies/shellycolorbulb-3C6105E500CC/color/0/command off' if $EVTPART1 eq '000000';; return 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"white","temp":"$EVTPART1"}' if $EVTPART1 eq 'FFFFFF';; $EVTPART1=~/(..)(..)(..)/;; 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"color","red":'.hex($1).',"green":'.hex($2).',"blue":'.hex($3).'}'}
attr Shelly2 devStateIcon {my $onl = ReadingsVal($name,"online","false") eq "true"?"10px-kreis-gruen":"10px-kreis-rot";; my $light = ReadingsVal($name,"state","off");; my $cons = ReadingsVal($name,"power","unknown");; "<a href=\"http://".ReadingsVal($name,"ip","none")." \"target=\"_blank\">".FW_makeImage($onl)."</a> <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a><div>Verbrauch: $cons</div>"}
attr Shelly2 disable 0
attr Shelly2 genericDeviceType light
attr Shelly2 homebridgeMapping Brightness=brightness::brightness,maxValue=100,factor=0.39216,delay=true
attr Shelly2 icon light_control
attr Shelly2 jsonMap brightness:pct
attr Shelly2 model shellybulb
attr Shelly2 readingList shellies/shellycolorbulb-3C6105E500CC/color/0/status:.* {json2nameValue($EVENT,'',$JSONMAP)}\
shellycolorbulb_3C6105E500CC:shellies/shellycolorbulb-3C6105E500CC/online:.* online\
shellycolorbulb_3C6105E500CC:shellies/shellycolorbulb-3C6105E500CC/announce:.* { json2nameValue($EVENT) }\
shellycolorbulb_3C6105E500CC:shellies/shellycolorbulb-3C6105E500CC/info:.* { json2nameValue($EVENT) }\
shellycolorbulb_3C6105E500CC:shellies/shellycolorbulb-3C6105E500CC/color/0:.* color_0\
shellycolorbulb_3C6105E500CC:shellies/shellycolorbulb-3C6105E500CC/light/0/power:.* light_0_power\
shellycolorbulb_3C6105E500CC:shellies/shellycolorbulb-3C6105E500CC/light/0/energy:.* light_0_energy\
shellycolorbulb_3C6105E500CC:shellies/shellycolorbulb-3C6105E500CC/color/0/status:.* { json2nameValue($EVENT) }
attr Shelly2 room MQTT2_DEVICE
attr Shelly2 setList off:noArg shellies/shellycolorbulb-3C6105E500CC/color/0/command off\
on:noArg shellies/shellycolorbulb-3C6105E500CC/color/0/command on\
effect:selectnumbers,0,1,3,0,lin shellies/shellycolorbulb-3C6105E500CC/color/0/set {"effect":"$EVTPART1"}\
effect_on:selectnumbers,0,1,3,0,lin shellies/shellycolorbulb-3C6105E500CC/color/0/set {"effect": $EVTPART1, "turn": "on"}\
pct:colorpicker,BRI,0,1,100 shellies/shellycolorbulb-3C6105E500CC/color/0/set {"gain":"$EVTPART1","brightness":"$EVTPART1"}\
pct_on:colorpicker,BRI,0,1,100 shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","gain":"$EVTPART1","brightness":"$EVTPART1"}\
ct:colorpicker,CT,3000,10,6500 {$EVTPART1=3000 if ($EVTPART1<3000);;"shellies/shellycolorbulb-3C6105E500CC/color/0/set {\"mode\":\"white\",\"temp\":\"$EVTPART1\"}"}\
ct_on:colorpicker,CT,3000,10,6500 {$EVTPART1=3000 if ($EVTPART1<3000);;"shellies/shellycolorbulb-3C6105E500CC/color/0/set {\"turn\":\"on\",\"mode\":\"white\",\"temp\":\"$EVTPART1\"}"}\
x_update:noArg shellies/shellycolorbulb-3C6105E500CC/command update_fw\
x_mqttcom shellies/shellycolorbulb-3C6105E500CC/command $EVTPART1\
rgb:colorpicker,RGB {return 'shellies/shellycolorbulb-3C6105E500CC/color/0/command off' if $EVTPART1 eq '000000';; return 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"white","temp":"$EVTPART1"}' if $EVTPART1 eq 'FFFFFF';; $EVTPART1=~/(..)(..)(..)/;; 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"color","red":'.hex($1).',"green":'.hex($2).',"blue":'.hex($3).'}'}
attr Shelly2 setStateList on off
attr Shelly2 userReadings ct:temp.* {ReadingsVal($name,"temp",3000)}, rgb:red.* {if(ReadingsVal($name,"mode","") eq "color"){sprintf("%02X%02X%02X", ReadingsVal($name,"red",99), ReadingsVal($name,"green",99), ReadingsVal($name,"blue",99))}else{my $a=sprintf("%02X",ReadingsVal($name,"brightness",0)*2.555);;"$a$a$a"}}
attr Shelly2 webCmd on:off:rgb:pct:ct:effect
zu guter letzt ...
Der state bleibt immer auf set_on oder set_off stehen, gibt es hierfür noch einen Trick?
Dieser hier https://forum.fhem.de/index.php/topic,94494.msg998583.html#msg998583 (https://forum.fhem.de/index.php/topic,94494.msg998583.html#msg998583) geht nicht da es kein Reading mit Power gibt?!
Ich habe das Device nochmal neu angelegt, damit war der "set" Fehler weg...und noch ein paar anpassungen durch geführt.
Im Attr devStateIcon steht ReadingsVal($name,"power","unknown")
Das Reading power gibt es bei mir nicht-> geändert in "light_0_power", nun wird der Verbrauch angezeigt.
alle Setlist Einträge mit "_on" haben nicht mehr funktioniert.
Ich habe Sie entfernt und "turn": "on" in den normal Zweig eingefügt.
webCmd effect hinzugefügt
defmod Shelly2 MQTT2_DEVICE shellycolorbulb_3C6105E500CC
attr Shelly2 devStateIcon {my $onl = ReadingsVal($name,"online","false") eq "true"?"10px-kreis-gruen":"10px-kreis-rot";; my $light = ReadingsVal($name,"state","off");; my $cons = ReadingsVal($name,"light_0_power","unknown");; "<a href=\"http://".ReadingsVal($name,"ip","none")." \"target=\"_blank\">".FW_makeImage($onl)."</a> <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a><div>Verbrauch: $cons</div>"}
attr Shelly2 genericDeviceType light
attr Shelly2 homebridgeMapping Brightness=brightness::brightness,maxValue=100,factor=0.39216,delay=true
attr Shelly2 icon light_control
attr Shelly2 jsonMap brightness:pct
attr Shelly2 model shellybulb
attr Shelly2 readingList shellies/shellycolorbulb-3C6105E500CC/color/0/status:.* {json2nameValue($EVENT,'',$JSONMAP)}\
shellycolorbulb_3C6105E500CC:shellies/shellycolorbulb-3C6105E500CC/online:.* online\
shellycolorbulb_3C6105E500CC:shellies/shellycolorbulb-3C6105E500CC/announce:.* { json2nameValue($EVENT) }\
shellycolorbulb_3C6105E500CC:shellies/shellycolorbulb-3C6105E500CC/info:.* { json2nameValue($EVENT) }\
shellycolorbulb_3C6105E500CC:shellies/shellycolorbulb-3C6105E500CC/color/0:.* color_0\
shellycolorbulb_3C6105E500CC:shellies/shellycolorbulb-3C6105E500CC/light/0/power:.* light_0_power\
shellycolorbulb_3C6105E500CC:shellies/shellycolorbulb-3C6105E500CC/light/0/energy:.* light_0_energy
attr Shelly2 room MQTT2_DEVICE
attr Shelly2 setList off:noArg shellies/shellycolorbulb-3C6105E500CC/color/0/command off\
on:noArg shellies/shellycolorbulb-3C6105E500CC/color/0/command on\
effect:selectnumbers,0,1,3,0,lin shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn": "on","mode":"color","effect":"$EVTPART1"}\
pct:colorpicker,BRI,0,1,100 shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","gain":"$EVTPART1","brightness":"$EVTPART1"}\
ct:colorpicker,CT,3000,10,6500 {$EVTPART1=3000 if ($EVTPART1<3000);;"shellies/shellycolorbulb-3C6105E500CC/color/0/set {\"turn\":\"on\",\"mode\":\"white\",\"temp\":\"$EVTPART1\"}"}\
x_update:noArg shellies/shellycolorbulb-3C6105E500CC/command update_fw\
x_mqttcom shellies/shellycolorbulb-3C6105E500CC/command $EVTPART1\
rgb:colorpicker,RGB {return 'shellies/shellycolorbulb-3C6105E500CC/color/0/command off' if $EVTPART1 eq '000000';; return 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"white","temp":"$EVTPART1"}' if $EVTPART1 eq 'FFFFFF';; $EVTPART1=~/(..)(..)(..)/;; 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"color","red":'.hex($1).',"green":'.hex($2).',"blue":'.hex($3).'}'}\
attr Shelly2 userReadings ct:temp.* {ReadingsVal($name,"temp",3000)}, rgb:red.* {if(ReadingsVal($name,'mode','') eq 'color'){sprintf("%02X%02X%02X", ReadingsVal($name,'red',99), ReadingsVal($name,'green',99), ReadingsVal($name,'blue',99))}else{my $a=sprintf("%02X",ReadingsVal($name,'brightness',0)*2.555);;"$a$a$a"}}
attr Shelly2 webCmd on:off:pct:ct:rgb:effect
Bekannter Fehler die noch offen sind
- state zeigt neben on off (as Lampe) auch rgb,ct,pct,effect im Klartext was erstmal komisch aussieht.
und hier noch das Template falls von Interesse
####################### shellybulb using original firmware
########################### by Rico
name:shellybulb
filter:TYPE=MQTT2_DEVICE:FILTER=readingList=.*shellies.*
desc:shellybulb using original firmware <br>Tested with 1.49
order:A_15
par:DEVNAME;name of this shelly;{ AttrVal('DEVICE','readingList','') =~ m,shellies/([^/]+)/, ? $1 : undef }
par:ICON;ICON as set, defaults to light_control;{ AttrVal('DEVICE','icon','light_control') }
attr DEVICE icon ICON
attr DEVICE devStateIcon {my $onl = ReadingsVal($name,'online','false') eq 'true'?'10px-kreis-gruen':'10px-kreis-rot'; my $light = ReadingsVal($name,'state','off'); my $cons = ReadingsVal($name,'light_0_power','unknown'); '<a href="http://'.ReadingsVal($name,'ip','none').' "target="_blank">'.FW_makeImage($onl)."</a> <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a><div>Verbrauch: $cons</div>"}
attr DEVICE setList\
off:noArg shellies/DEVNAME/color/0/command off\
on:noArg shellies/DEVNAME/color/0/command on\
effect:selectnumbers,0,1,3,0,lin shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn": "on","mode":"color","effect":"$EVTPART1"}\
pct:colorpicker,BRI,0,1,100 shellies/DEVNAME/color/0/set {"turn":"on","gain":"$EVTPART1","brightness":$EVTPART1}\
ct:colorpicker,CT,3000,10,6500 {$EVTPART1=3000 if $EVTPART1<3000;qq(shellies/DEVNAME/color/0/set {"turn":"on","mode":"white","temp":$EVTPART1})}\
rgb:colorpicker,RGB {return 'shellies/shellycolorbulb-3C6105E500CC/color/0/command off' if $EVTPART1 eq '000000'; return 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"white","temp":"$EVTPART1"}' if $EVTPART1 eq 'FFFFFF'; $EVTPART1=~/(..)(..)(..)/; 'shellies/shellycolorbulb-3C6105E500CC/color/0/set {"turn":"on","mode":"color","red":'.hex($1).',"green":'.hex($2).',"blue":'.hex($3).'}'}\
x_update:noArg shellies/DEVNAME/command update_fw\
x_mqttcom shellies/DEVNAME/command $EVTPART1
deletereading -q DEVICE status_.*
attr DEVICE readingList shellies/DEVNAME/color/0/status:.* {json2nameValue($EVENT,'',$JSONMAP)}
attr DEVICE userReadings ct:temp.* {ReadingsVal($name,"temp",3000)}, rgb:red.* {if(ReadingsVal($name,'mode','') eq 'color'){sprintf("%02X%02X%02X", ReadingsVal($name,'red',99), ReadingsVal($name,'green',99), ReadingsVal($name,'blue',99))}else{my $a=sprintf("%02X",ReadingsVal($name,'brightness',0)*2.555);"$a$a$a"}}
attr DEVICE webCmd on:off:pct:ct:rgb:effect
attr DEVICE jsonMap brightness:pct
set DEVICE x_mqttcom announce
set DEVICE attrTemplate speechcontrol_type_light
attr DEVICE model shellybulb
setreading DEVICE attrTemplateVersion 20211022
Via update kommt jetzt eine etwas veränderte Fassung. Wäre nett, wenn du die (ggf. mit einer Kopie deines "fertigen eigenen" Gerätes) austesten könntest.
Sieht sehr gut aus, geht besser wie meins. :o ;D
Ich kann jetzt im Colorpicker "FFFFFF" eingeben und die Lampe schaltet auf mode white.
Verbrauchsanzeige geht auch richtig!
siehe Anhang
Eine Frage, kann man einen Zeilenumbruch im Setlist machen? Dadurch das die Zeile solang geworden ist das Device Fenster 4 Seiten breit.
Grundsätzlich ist das kein Problem, eher eine schönheitsfrage!
Gruß und Danke Rico
Zitat von: rico5588 am 11 November 2021, 19:53:47
Eine Frage, kann man einen Zeilenumbruch im Setlist machen? Dadurch das die Zeile solang geworden ist das Device Fenster 4 Seiten breit.
Grundsätzlich ist das kein Problem, eher eine schönheitsfrage!
Das Attribut setList wird zeilenweise ausgewertet, der Perl-Code kann daher leider nicht umgebrochen werden. Evtl. könnte man mit etwas css nachhelfen, dass der Text nicht ganz so klein wird und/oder in der html-Ansicht umgebrochen, aber funktional im Attribut geht das afaik nicht.
Ansonsten: Danke für die Rückmeldung, dass das so funktioniert wie erhofft... 8)
Habe gerade gemerkt das noch eine kleinigkeit fehlt...
RGB:colorpicker,RGB {return 'shellies/shellycolorbulb-E8DB84AA555A/color/0/command off' if $EVTPART1 eq '000000';
return 'shellies/shellycolorbulb-E8DB84AA555A/color/0/set {"turn":"on","mode":"white","temp":4000}' if $EVTPART1 eq 'FFFFFF';
$EVTPART1=~/(..)(..)(..)/;
return if !defined $3; if($1 ne $2 || $2 ne $3){qq(shellies/shellycolorbulb-E8DB84AA555A/color/0/set {"mode":"color","gain":"100","red":).hex($1).qq(,"green":).hex($2).qq(,"blue":).hex($3).'}'}
else{qq(shellies/shellycolorbulb-E8DB84AA555A/color/0/set {"turn":"on","mode":"white","brightness":).int(hex($1)/2.55).'}'}}
und zwar "turn":"on"
im vorletzten zweig. Dadurch geht rgb mit einem Set Befehl nicht aus dem "aus" zustand an.
(nicht Wundern ich musste aus rgb, RGB machen damit mein doif vereinheitlicht bleiben kann.
Gruß Rico