MQTT2_DEVICE und toggle?

Begonnen von Aurel_B, 30 Mai 2024, 11:01:39

Vorheriges Thema - Nächstes Thema

Aurel_B

Hallo zusammen,


ich möchte gerne bei einem MQTT2_DEVICE einen "set" Befehl toggeln können. Es handelt sich - vereinfacht gesagt - um ein Relais welches auf das Topic "Kuehlschrank/EG/PV" hört und die Befehle 1 oder 0 kennt.
Mein MQTT2_DEVICE hat ein custom StateFormat, "devStateIcon" möchte ich daher nicht verwenden. Ich kriegs irgendwie nicht hin, hat jemand so etwas ähnliches schon implementiert?

Im Endeffekt möchte ich ein Icon welches ich anklicken kann (zusätzlich zum state) und dieses schaltet mir mein Relais ein- oder aus, analog zu der bekannten Glühbirne beim "dummy" mit "setExtensions".

Ich habe bereits mit "toggle" experimentiert, er ist vorhanden und macht im Moment gar nix. Ich müsste ihn wohl noch in die "setList" reinnehmen, nur wie?

defmod Kuehlschrank_EG MQTT2_DEVICE Mosquitto
attr Kuehlschrank_EG DbLogInclude Temperature
attr Kuehlschrank_EG icon mdt-fridge
attr Kuehlschrank_EG readingList Kuehlschrank/EG/Temp:.* Temp_Unkorrigiert\
Kuehlschrank/EG/Komp:.* Compressor\
Kuehlschrank/EG/RemainingOn:.* RemainingOn\
Kuehlschrank/EG/RemainingOff:.* RemainingOff\
Kuehlschrank/EG/PV:.* PV
attr Kuehlschrank_EG room Haushalt
attr Kuehlschrank_EG setExtensionsEvent 1
attr Kuehlschrank_EG setList on Kuehlschrank/EG/PV 1\
off Kuehlschrank/EG/PV 0
attr Kuehlschrank_EG stateFormat Temperature°C (Kompressor:Compressor, P<b></b>V:PV)
attr Kuehlschrank_EG userReadings Temperature:Temp_Unkorrigiert.* {ReadingsNum($name, 'Temp_Unkorrigiert', -10) - 4.5}
attr Kuehlschrank_EG webCmd on:off

Aurel_B

Ich habe eine Lösung, geht das auch eleganter?

attr Kuehlschrank_EG setList toggle { my $PV=ReadingsNum($NAME,'PV',0); $PV=1-$PV; return 'Kuehlschrank/EG/PV '.$PV;}

Beta-User

Also:
Da MQTT2_DEVICE SetExtensions nutzt,  "kann" es automatisch auch "toggle", allerdings muss die Erweiterung den "state" kennen - den gibt aber deine readingList nicht her, du müßtest bei "PV" einen passenden Hash zurückgeben statt des Klartextes.

Eventuell würde ich einen Blick in das Wiki "Schritt für Schritt" (zu M2D) weiterhelfen, da steht drin, wie das in etwa geht, und z.B. auch, wie man die Temperatur-Korrektur direkt vornehmen könnte.

PS:
Die CID in der Definition macht vermutlich keinen Sinn, wenn du mit MQTT2_CLIENT arbeitest kommt da tendenziell sonst Zeug an, das du nicht da haben willst.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Aurel_B

Danke dir für deine Antwort! CID habe ich rausgenommen.

Das toggle funktioniert weiterhin nicht. Erst, wenn ich das stateFormat rausnehme, funktioniert es. Das Topic "Kuehlschrank/EG/PV" habe ich wie im Wiki beschrieben auf das Reading "state" gemappt, das Internal STATE wird ja weiterhin durch stateFormat überschrieben. Wenn ich das gemäss "set extensions" richtig verstehe, braucht "toggle" on/off (resp. zumindest "on" um nach "off" schalten zu können) im Internal STATE. Damit fällt stateFormat flach?

Ich glaube, beim Dummy spielt das keine Rolle weil man da ja wohl eh nur on/off verwendet. Hier beim MQTT2_DEVICE empfinde ich das toggle so als ein wenig limitierend weil man hier ja eventuell auch noch weitere Informationen darstellen möchte und dafür stateFormat nützlich ist.

Als Workaround fallen mir ein: devStateIcon mit Perl Code anstelle von stateFormat oder widgetOverride als toggle Ersatz. Beides für mich unübersichtlich, da bleibe ich lieber bei meinem eigenen toggle aus Antwort #1.

Temperatur habe ich direkt korrigiert, danke für den Hinweis!

defmod Kuehlschrank_EG MQTT2_DEVICE
attr Kuehlschrank_EG DbLogInclude Temperature
attr Kuehlschrank_EG icon mdt-fridge
attr Kuehlschrank_EG readingList Kuehlschrank/EG/Temp:.* {Temperature=>($EVENT - 4.5)}\
Kuehlschrank/EG/Komp:.* Compressor\
Kuehlschrank/EG/RemainingOn:.* RemainingOn\
Kuehlschrank/EG/RemainingOff:.* RemainingOff\
Kuehlschrank/EG/PV:.* { $EVENT ? {state=>'on'} : {state=>'off'} }
attr Kuehlschrank_EG room Haushalt
attr Kuehlschrank_EG setExtensionsEvent 1
attr Kuehlschrank_EG setList on Kuehlschrank/EG/PV 1\
off Kuehlschrank/EG/PV 0
attr Kuehlschrank_EG stateFormat Temperature°C (Kompressor:Compressor, P<b></b>V:PV) <---- DAS MUSS WEG DAMIT toggle FUNKTIONIERT!
attr Kuehlschrank_EG webCmd on:off:toggle

Beta-User

Zitat von: Aurel_B am 31 Mai 2024, 15:11:43Wenn ich das gemäss "set extensions" richtig verstehe, braucht "toggle" on/off (resp. zumindest "on" um nach "off" schalten zu können) im Internal STATE.
Arg, da war was... Hatte dazu vor Ewigkeiten auch mal eine Diskussion mit Rudi, ob man da nicht besser "state" (Reading) verwenden wollte statt dem Internal. Wäre halt "riskant", das zu ändern, wenn ich mich recht entsinne.

Ergo ist es sinnvoll, das toggle-Kommando direkt zu implementieren, (ähnlich) wie du das auch schon gemacht hattest. Sorry for inconvenience.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Aurel_B

Jo, toggle gemäss INTERNAL macht wohl in 99% der Anwendungsfälle Sinn, bei MQTT/DOIF etc. eventuell nicht, dafür hat man dort eigene Möglichkeiten. Danke dir

Beta-User

Na ja, sobald ein Device mehrere Readings neben state hat, wird toggle zum Glücksspiel, und ich würde wetten, dass man in >99,89% der Fälle den Unterschied nicht merken würde, wenn (vorrangig) auf "state" umgestellt würde... (und der große Rest sind vermutlich unbeabsichtigte Fehler, weil immer aus geschaltet wird!)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors