userreading - mehrere Optionen für ein Reading

Begonnen von TWART016, 18 Mai 2019, 23:34:04

Vorheriges Thema - Nächstes Thema

TWART016

Hallo,

ich habe für Shelly ein MQTT Device. Die Werte kommen korrekt in das Device. Jedoch gibt es 2 Wege, einen von der Shelly App und eines über Tablet UI.

Bei der Shelly App gibt es ein Reading status_get
2019-05-18 23:29:18   status_get      {"ison":true,"mode":"color","red":0,"green":255,"blue":50,"white":255,"gain":0,"effect":0,"power":41.05,"overpower":false}


Bei FTUI rgb
2019-05-18 23:17:20   rgb             f4fcf2

Mit einem Userreading schreibe ich den hex Wert bereits in ein Reading red / blue / green
red {hex(substr(ReadingsVal($name,"rgb",0),0,2))},
green {hex(substr(ReadingsVal($name,"rgb",0),2,2))},
blue {hex(substr(ReadingsVal($name,"rgb",0),4,2))},


Jetzt würde ich das gerne so belassen, nur wenn sich bei status_get eine Farbe ändert, soll auch das reading red / green / blue angepasst warten. Wie ist eine Oder Verknüpfung in einem Userreading möglich?


Gruß
TWART016

Beta-User

So ganz habe ich zwar das Problem nicht durchschaut, wann welches Reading tatsächlich aktualisiert wird. Tendenziell scheint mir aber, du solltest erst mal den trigger enger fassen, vielleicht hilft das schon:

red:rgb {hex(substr(ReadingsVal($name,"rgb",0),0,2))},
green:rgb {hex(substr(ReadingsVal($name,"rgb",0),2,2))},
blue:rgb {hex(substr(ReadingsVal($name,"rgb",0),4,2))},

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

TWART016

Ja, bisher wird bei jedem Event von diesem Gerät das Reading aktualisiert.

Ziel ist das Reading red / blue / green.

Diese Werte bekomme ich entweder aus:
1) dem Reading rgb, welches über FTUI gesetzt wird
2) dem Reading status_get, welches per MQTT vom Shelly kommt

Kann man in einem Userreading 2 mal red schreiben?
red:rgb {hex(substr(ReadingsVal($name,"rgb",0),0,2))},
red:rgb REGEX,

Beta-User

Ob das 2x geht? Kann ich nicht sagen. Was hindert dich, es zu testen? Ggf. erst mal kein save machen, dann kannst du neu starten, wenn es Schwierigkeiten machen sollte.
Aber der trigger wäre dann wohl nicht rgb sondern status_get, oder?

In der MQTT2-Welt wäre es einfach, da kommte einfach ein readingList-Eintrag hin für den Topic, auf den das kommt und dann json2nameValue() als Funktion dahinter. Aber eigentlich sollte sich da expandJSON auch nicht wesentlich anders verhalten (wenn du das nutzt; irgenwoher müssen die Einzelwerte ja kommen.

Evtl. wäre ein RAW-list des Devices (und des expandJSON) hilfreich, dann sieht man eher, was wie reinkommt.

Aber mal was anderes: in FHEM ist es doch häufig einfacher, RRGGBB-Werte zu haben (ich bastel das daher z.B. bei dem MiLights so auch wieder aus den Einzelwerten zusammen). Welchen Vorteil hat für dich der umgekehrte Weg?
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

TWART016

Zitat von: Beta-User am 20 Mai 2019, 15:01:13
Ob das 2x geht? Kann ich nicht sagen. Was hindert dich, es zu testen? Ggf. erst mal kein save machen, dann kannst du neu starten, wenn es Schwierigkeiten machen sollte.
Aber der trigger wäre dann wohl nicht rgb sondern status_get, oder?
Leider wird dann immer die letzte Zeile genommen.

Damit wird leider nichts getriggert:
red:rgb {hex(substr(ReadingsVal($name,"rgb",0),0,2))},
green:rgb {hex(substr(ReadingsVal($name,"rgb",0),2,2))},
blue:rgb {hex(substr(ReadingsVal($name,"rgb",0),4,2))},


Zitat von: Beta-User am 20 Mai 2019, 15:01:13
Evtl. wäre ein RAW-list des Devices (und des expandJSON) hilfreich, dann sieht man eher, was wie reinkommt.
defmod Shelly_Wohnzimmer_test MQTT_DEVICE
attr Shelly_Wohnzimmer_test userattr subscribeReading_state publishSet_test
attr Shelly_Wohnzimmer_test IODev Mosquitto
attr Shelly_Wohnzimmer_test event-on-change-reading .*
attr Shelly_Wohnzimmer_test publishSet on off shellies/shellyrgbw2-5A3992/color/0/command
attr Shelly_Wohnzimmer_test publishSet_test shellies/shellyrgbw2-5A3992/color/0/set
attr Shelly_Wohnzimmer_test subscribeReading_state shellies/shellyrgbw2-5A3992/color/0
attr Shelly_Wohnzimmer_test subscribeReading_status_get shellies/shellyrgbw2-5A3992/color/0/status
attr Shelly_Wohnzimmer_test userReadings status_set {'{"turn":"' .ReadingsVal($name,"state",0) .'","red":' .ReadingsVal($name,"red",0) .',"green":' .ReadingsVal($name,"green",0) .',"blue":' .ReadingsVal($name,"blue",0) .',"white":' .ReadingsVal($name,"white",0) .',"gain":' .ReadingsVal($name,"gain",0) .',"effect":0}' },\
RGBr {hex(substr(ReadingsVal($name,"rgb",0),0,2))},\
red {hex(substr(ReadingsVal($name,"rgb",0),0,2))},\
RGBg {hex(substr(ReadingsVal($name,"rgb",0),2,2))},\
green {hex(substr(ReadingsVal($name,"rgb",0),2,2))},\
RGBb {hex(substr(ReadingsVal($name,"rgb",0),4,2))},\
blue {hex(substr(ReadingsVal($name,"rgb",0),4,2))},\
test {'{"turn":"' .ReadingsVal($name,"state",0) .'","red":' .ReadingsVal($name,"red",0) .',"green":' .ReadingsVal($name,"green",0) .',"blue":' .ReadingsVal($name,"blue",0) .',"white":' .ReadingsVal($name,"white",0) .',"gain":' .ReadingsVal($name,"gain",0) .',"effect":0}' },

setstate Shelly_Wohnzimmer_test on
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:56 RGBb 15
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:56 RGBg 27
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:56 RGBr 160
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:56 blue 15
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:26 effect 0
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:26 gain 0
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:56 green 27
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:26 ison 1
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:26 mode color
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:26 overpower 0
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:26 power 41.05
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:56 red 160
setstate Shelly_Wohnzimmer_test 2019-05-20 19:16:41 rgb a01b0f
setstate Shelly_Wohnzimmer_test 2019-05-20 19:17:16 state on
setstate Shelly_Wohnzimmer_test 2019-05-08 23:11:40 state_set on
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:56 status_get {"ison":true,"mode":"color","red":255,"green":87,"blue":192,"white":255,"gain":0,"effect":0,"power":41.05,"overpower":false}
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:56 status_set {"turn":"on","red":160,"green":27,"blue":15,"white":255,"gain":0,"effect":0}
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:56 test {"turn":"on","red":160,"green":27,"blue":15,"white":255,"gain":0,"effect":0}
setstate Shelly_Wohnzimmer_test 2019-05-08 22:33:29 test2 {"turn":"rgb","red":219,"green":91,"blue":141,"white":255,"gain":0,"effect":0}
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:56 transmission-state incoming publish received
setstate Shelly_Wohnzimmer_test 2019-05-20 19:20:26 white 255


defmod Shelly_Wohnzimmer_test_JSON expandJSON Shelly_Wohnzimmer_test:status_get:.*


Zitat von: Beta-User am 20 Mai 2019, 15:01:13
Aber mal was anderes: in FHEM ist es doch häufig einfacher, RRGGBB-Werte zu haben (ich bastel das daher z.B. bei dem MiLights so auch wieder aus den Einzelwerten zusammen). Welchen Vorteil hat für dich der umgekehrte Weg?
Stimmt schon. Nur setze ich den Wert über status_set und da wird der Wert in dezimal benötigt.

Beta-User

Versuch's mal so:
red:rgb.* {hex(substr(ReadingsVal($name,"rgb",0),0,2))},
green:rgb.* {hex(substr(ReadingsVal($name,"rgb",0),2,2))},
blue:rgb.* {hex(substr(ReadingsVal($name,"rgb",0),4,2))},

Das sollte eigentlich schon reichen, da die anderen Daten ja über eine andere Quelle reinkommen (zu einem anderen Zeitpunkt).
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

TWART016

Ja, das schon. Wenn die Werte über MQTT kommen, ändert sich das Reading red / green / blue nicht. Kann man das im Userreading machen, oder braucht man da ein notify?

Beta-User

Hmm, eigentlich hätte ich angenommen, das expandJSON das übernimmt.

Aber ich bin da raus, ich kenne mich eher in der MQTT2-Ecke aus, da ist sowas m.E. einfacher (es könnte sogar sein, dass es schon ein passendes template gibt).
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