MQTT2 true->on und false->off

Begonnen von cberl, 22 Mai 2020, 18:40:24

Vorheriges Thema - Nächstes Thema

cberl

Hallo in die Runde,

ich habe ein MQTT2 Device, wo die reading false und true sind. Das Auslesen & Schreiben funktioniert schon.
Ich will alle 6 in und out Kanäle in einem Device haben und möglichst nicht mit ReadingsProxy arbeiten.
Wie kann ich die readings in off und on übersetzen?
Ich habe das mit dem jsonMap getestet, das reading wird aber gewandelt.

Wie mache ich das am Besten mit dem set bzw. setList on->true und off->false?

Internals:
   CFGFN     
   DEF       
   DEVICETOPIC ADAM6060_00D0C9FC434C
   FUUID      5ec7f4b4-f33f-51cc-a9ab-73a3a304dfd5df07
   IODev      MQTT2Client
   LASTInputDev MQTT2Client
   MQTT2Client_MSGCNT 9
   MQTT2Client_TIME 2020-05-22 18:27:06
   MSGCNT     9
   NAME       ADAM6060_00D0C9FC434C
   NR         236302
   STATE      do1
   TYPE       MQTT2_DEVICE
   JSONMAP:
     false      off
     true       on
   OLDREADINGS:
   READINGS:
     2020-05-22 18:27:06   c               1
     2020-05-22 18:27:06   di1             true
     2020-05-22 18:27:06   di2             true
     2020-05-22 18:27:06   di3             true
     2020-05-22 18:27:06   di4             true
     2020-05-22 18:27:06   di5             true
     2020-05-22 18:27:06   di6             true
     2020-05-22 18:27:06   do1             false
     2020-05-22 18:27:06   do2             false
     2020-05-22 18:27:06   do3             false
     2020-05-22 18:27:06   do4             false
     2020-05-22 18:27:06   do5             false
     2020-05-22 18:27:06   do6             false
     2020-05-22 18:27:06   ipaddr          192.168.50.54
     2020-05-22 18:27:06   macid           00D0C9FC434C
     2020-05-22 18:27:06   name            ADAM6060
     2020-05-22 18:27:06   q               192
     2020-05-22 18:27:06   s               1
     2020-05-22 18:19:26   state           do1
     2020-05-22 18:27:06   status          connect
     2020-05-22 18:27:06   t               0
Attributes:
   IODev      MQTT2Client
   jsonMap    false:off true:on
   readingList Advantech/00D0C9FC434C/data:.* { json2nameValue($EVENT,'',$JSONMAP) }
Advantech/00D0C9FC434C/Device_Status:.* { json2nameValue($EVENT) }
   room       82.MQTT
   setList    do1:false,true Advantech/00D0C9FC434C/ctl/do1 {"v":$EVTPART1}
do2:false,true Advantech/00D0C9FC434C/ctl/do2 {"v":$EVTPART1}
do3:false,true Advantech/00D0C9FC434C/ctl/do3 {"v":$EVTPART1}
do4:false,true Advantech/00D0C9FC434C/ctl/do4 {"v":$EVTPART1}
do5:false,true Advantech/00D0C9FC434C/ctl/do5 {"v":$EVTPART1}
do6:false,true Advantech/00D0C9FC434C/ctl/do6 {"v":$EVTPART1}


Chris
Fhem immer aktuell @win2016 und @ubuntu VM|7xFRM/ArduinoEthernet|Homematic|HMLan|CUNO|HarmonyHub|Modbus|Z-Wave|Milight-Hub|MQTT|OWX an ETH-UART|GoogleAssist,Alexa,Sonos|2nHelios IP Vario|Amad-Odroid|Telegram|Enigma2

Beta-User

Hmm, auf die Schnelle sollte das _ähnlich_ sein wie bei dem 8-Kanal-Ding: 8channel_ethernet_board_split bzw. 8channel_ethernet_board_unified.

Anleihen dann noch bei wled_controller, was das mapping von state angeht:
{ $EVENT eq "true" ? {"state"=>"on"} : {"state"=>"off"} }

Und: "don" scheint für den "Hinkanal", "din" für den Rückkanal zu stehen => Sollte jeweils dasselbe Reading sein.

Würde empfehlen, das (auch) in Richtung "split" zu gestalten, nähere Infos zum Gerät und evtl. weitere Info für ein attrTemplate dazu wären für den nächsten evtl. hilfreich...
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

cberl

Sorry, für die mickerigen Infos. Ein schickes Template wäre toll.

Es handelt sich um ein Advantech ADAM6060, welches neben Modbus und http auch MQTT spricht.
Das Teil hat 6 Eingänge di (Digital Input) und 6 Relais Ausgänge do (Digital Output).
Die Ein- & Ausgänge stehen in keiner Beziehug zueinander, sind also separat nutzbar.
Über die Managementsoftware kann der der MQTT Host eingestellt werden. Authentifizierung & TLS wird unterstützt.
Der Topic ist mit Advantech/00D0C9FC434C/ vorgegeben und nicht veränderlich. 00D0C9FC434C ist dabei die MAC des Gerätes.
Der letzte Status wird von dem Gerät nicht gespeichert, nach einem Strom wech und wieder an, sind alle Relais aus.

Will Topic: Advantech/00D0C9FC434C/Device_Status
{"status":"connect","name":"ADAM6060","macid":"00D0C9FC434C","ipaddr":"192.168.50.54"}
nach dem TimeOut kommt
{"status":"disconnect","name":"ADAM6060","macid":"00D0C9FC434C","ipaddr":"192.168.48.23"}

Subscripe Topic:
Advantech/00D0C9FC434C/ctl/do1
Advantech/00D0C9FC434C/ctl/do2
Advantech/00D0C9FC434C/ctl/do3
Advantech/00D0C9FC434C/ctl/do4
Advantech/00D0C9FC434C/ctl/do5
Advantech/00D0C9FC434C/ctl/do6

Ein "Advantech/00D0C9FC434C/ctl/do2 {"v":true}" schaltet das Relais do2 ein
Ein "Advantech/00D0C9FC434C/ctl/do2 {"v":false}" schaltet das Relais do2 aus

Publish Topic: Advantech/00D0C9FC434C/data
Nach jeder Statusänderung kommt über Advantech/00D0C9FC434C/data
{"s":1,"t":0,"q":192,"c":1,"di1":true,"di2":true,"di3":true,"di4":true,"di5":true,"di6":true,"do1":false,"do2":true,"do3":false,"do4":false,"do5":false,"do6":false}
Hier ist das Relais do2 ein, die anderen Relais sind aus. Die Eingänge hängen momentan in der Luft und dadurch alle true bzw. on.
Die MQTT Doku gibts unter:

http://advdownload.advantech.com/productfile/Downloadfile4/1-1EGDNCJ/ADAM%20MQTT%20manual%20V1.pdf


Ein RAW:

defmod ADAM6060_00D0C9FC434C MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C IODev MQTT2Client
attr ADAM6060_00D0C9FC434C readingList Advantech/00D0C9FC434C/data:.* { json2nameValue($EVENT) }\
Advantech/00D0C9FC434C/Device_Status:.* { json2nameValue($EVENT) }
attr ADAM6060_00D0C9FC434C room 82.MQTT
attr ADAM6060_00D0C9FC434C setList do1:false,true Advantech/00D0C9FC434C/ctl/do1 {"v":$EVTPART1}\
do2:false,true Advantech/00D0C9FC434C/ctl/do2 {"v":$EVTPART1}\
do3:false,true Advantech/00D0C9FC434C/ctl/do3 {"v":$EVTPART1}\
do4:false,true Advantech/00D0C9FC434C/ctl/do4 {"v":$EVTPART1}\
do5:false,true Advantech/00D0C9FC434C/ctl/do5 {"v":$EVTPART1}\
do6:false,true Advantech/00D0C9FC434C/ctl/do6 {"v":$EVTPART1}

setstate ADAM6060_00D0C9FC434C do2
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 c 1
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 di1 true
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 di2 true
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 di3 true
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 di4 true
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 di5 true
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 di6 true
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 do1 false
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 do2 false
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 do3 false
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 do4 false
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 do5 false
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 do6 false
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 ipaddr 192.168.50.54
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 macid 00D0C9FC434C
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 name ADAM6060
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 q 192
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 s 1
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:13 state do2
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 status connect
setstate ADAM6060_00D0C9FC434C 2020-05-22 21:53:50 t 0


und ein list:

Internals:
   CFGFN     
   DEF       
   DEVICETOPIC ADAM6060_00D0C9FC434C
   FUUID      5ec7f4b4-f33f-51cc-a9ab-73a3a304dfd5df07
   IODev      MQTT2Client
   LASTInputDev MQTT2Client
   MQTT2Client_MSGCNT 23
   MQTT2Client_TIME 2020-05-22 21:53:50
   MSGCNT     23
   NAME       ADAM6060_00D0C9FC434C
   NR         236302
   STATE      do2
   TYPE       MQTT2_DEVICE
   OLDREADINGS:
   READINGS:
     2020-05-22 21:53:50   c               1
     2020-05-22 21:53:50   di1             true
     2020-05-22 21:53:50   di2             true
     2020-05-22 21:53:50   di3             true
     2020-05-22 21:53:50   di4             true
     2020-05-22 21:53:50   di5             true
     2020-05-22 21:53:50   di6             true
     2020-05-22 21:53:50   do1             false
     2020-05-22 21:53:50   do2             false
     2020-05-22 21:53:50   do3             false
     2020-05-22 21:53:50   do4             false
     2020-05-22 21:53:50   do5             false
     2020-05-22 21:53:50   do6             false
     2020-05-22 21:53:50   ipaddr          192.168.50.54
     2020-05-22 21:53:50   macid           00D0C9FC434C
     2020-05-22 21:53:50   name            ADAM6060
     2020-05-22 21:53:50   q               192
     2020-05-22 21:53:50   s               1
     2020-05-22 21:53:13   state           do2
     2020-05-22 21:53:50   status          connect
     2020-05-22 21:53:50   t               0
Attributes:
   IODev      MQTT2Client
   readingList Advantech/00D0C9FC434C/data:.* { json2nameValue($EVENT) }
Advantech/00D0C9FC434C/Device_Status:.* { json2nameValue($EVENT) }
   room       82.MQTT
   setList    do1:false,true Advantech/00D0C9FC434C/ctl/do1 {"v":$EVTPART1}
do2:false,true Advantech/00D0C9FC434C/ctl/do2 {"v":$EVTPART1}
do3:false,true Advantech/00D0C9FC434C/ctl/do3 {"v":$EVTPART1}
do4:false,true Advantech/00D0C9FC434C/ctl/do4 {"v":$EVTPART1}
do5:false,true Advantech/00D0C9FC434C/ctl/do5 {"v":$EVTPART1}
do6:false,true Advantech/00D0C9FC434C/ctl/do6 {"v":$EVTPART1}


Fhem immer aktuell @win2016 und @ubuntu VM|7xFRM/ArduinoEthernet|Homematic|HMLan|CUNO|HarmonyHub|Modbus|Z-Wave|Milight-Hub|MQTT|OWX an ETH-UART|GoogleAssist,Alexa,Sonos|2nHelios IP Vario|Amad-Odroid|Telegram|Enigma2

Beta-User

#3
Zitat von: cberl am 22 Mai 2020, 22:12:10
Sorry, für die mickerigen Infos.
Zur Beantwortung der eigentlichen Frage war es m.E. völlig ausreichend :) .

Jedenfalls ein optisch und m.E. auch funktional sehr ansprechendes Device, das ich gerne in die attrTemplate-file mit aufnehme! Zumal da auch "was neues" drin ist, das wir so noch nicht hatten ;) .

ZitatEin schickes Template wäre toll.
Na dann leg mal los...

(oder ist die Erwartung, dass ich die Arbeit mache ;) ?)

Ernsthaft: Das ist nicht so schwer. Würde vorschlagen, du machst erst mal eine "unified"-Konfiguration, und hinterher gliedern wir dann (nur) die Relais 2-5 als "split" aus; den ersten können wir gleich "SetExtensions-fähig" gestalten? (Das muss in Schritt 1 nicht als attrTemplate notiert sein, wenn doch, ist das ein "addon"!).

Hier mal die m.E. etwas schwierigeren Bruchstücke:

Vielleicht klappt das, nach dem Wiedereinschalten den Status am Server abholen zu lassen; dafür müßte man m.E. das "retain-flag setzen. Bei Relais 1 kein Problem (da brauchen wir getrennte on/off => Klartext, die dann in setStateList gehören), für Relais 2-5 evtl. schon, da (@unified) Perl, s.u.).

Zitat
if the topic name ends with :r, then the retain flag is set

Für die setList der Kanäle 2-5 brauchen wir dann etwas Perl (hier gleich mit dem retain-Versuch):
do2:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false"; qq(Advantech/00D0C9FC434C/ctl/do2:r {"v":$payload}) \
Der Rest sollte nicht mehr so schwierig sein, wenn du z.B. Tasmota kennst. Gib bitte Rückmeldung, ob dir das reicht, oder ob du detailiertere Hilfe brauchst?
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

cberl

Danke für die Unterstützung. Mittlerweile weiß ich sogar, wie ein escape von " erfolgt :-)
Das setList mit on/off klappt nun. Auch das retain funktioniert für alle Relais: Nach dem Einschalten wird der vorherige Status gesetzt.
Aus mir aber unerfindlichen Gründen will das jsonMap zu on/off im readingList nicht. Hast Du da eine Idee?

Wie kann ich die SetExtensions einbauen?
Ein

set ADAM6060_00D0C9FC434C_unified do4 on-for-timer 4

funktioniert nicht.

So sieht es jetzt aus:


defmod ADAM6060_00D0C9FC434C_unified MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_unified IODev MQTT2Client
attr ADAM6060_00D0C9FC434C_unified jsonMap true:on false:off
attr ADAM6060_00D0C9FC434C_unified readingList Advantech/00D0C9FC434C/data:.* { json2nameValue($EVENT,'',$JSONMAP) }\
Advantech/00D0C9FC434C/Device_Status:.* { json2nameValue($EVENT) }
attr ADAM6060_00D0C9FC434C_unified room 82.MQTT
attr ADAM6060_00D0C9FC434C_unified setExtensionsEvent 1
attr ADAM6060_00D0C9FC434C_unified setList do1:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;; "Advantech/00D0C9FC434C/ctl/do1:r {\"v\":$payload}"}\
do2:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;; "Advantech/00D0C9FC434C/ctl/do2:r {\"v\":$payload}"}\
do3:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;; "Advantech/00D0C9FC434C/ctl/do3:r {\"v\":$payload}"}\
do4:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;; "Advantech/00D0C9FC434C/ctl/do4:r {\"v\":$payload}"}\
do5:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;; "Advantech/00D0C9FC434C/ctl/do5:r {\"v\":$payload}"}\
do6:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;; "Advantech/00D0C9FC434C/ctl/do6:r {\"v\":$payload}"}

setstate ADAM6060_00D0C9FC434C_unified do4
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 c 1
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 di1 true
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 di2 true
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 di3 true
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 di4 true
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 di5 false
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 di6 true
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 do1 true
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 do2 false
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 do3 false
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 do4 false
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 do5 false
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 do6 false
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:26:15 ipaddr 192.168.50.54
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:26:15 macid 00D0C9FC434C
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:26:15 name ADAM6060
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 q 192
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 s 1
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:47:17 state do4
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:26:15 status connect
setstate ADAM6060_00D0C9FC434C_unified 2020-05-23 21:46:25 t 0
Fhem immer aktuell @win2016 und @ubuntu VM|7xFRM/ArduinoEthernet|Homematic|HMLan|CUNO|HarmonyHub|Modbus|Z-Wave|Milight-Hub|MQTT|OWX an ETH-UART|GoogleAssist,Alexa,Sonos|2nHelios IP Vario|Amad-Odroid|Telegram|Enigma2

rudolfkoenig

ZitatWie kann ich die SetExtensions einbauen?
on-for-timer und Konsorten sind verfuegbar, falls man ein on und ein off Befehl definiert hat.

Beta-User

...war vielleicht etwas viel kryptischer Input auf einmal:
Zitat von: Beta-User am 23 Mai 2020, 07:45:50
Bei Relais 1 kein Problem (da brauchen wir getrennte on/off => Klartext, die dann in setStateList gehören),
Z.B. aus dem 8-Kanal-Ethernet-Board split: attr DEVICE setList on:noArg CMNDTOPIC setr=1xxxxxxx\
  off:noArg CMNDTOPIC setr=0xxxxxxx
attr DEVICE setStateList on off


Was gefiel dir an der "qq"-Lösung nicht? (Ich finde die escaperei der Quotes zwischenzeitlich "unschön").

jsonMap macht was anderes, als du annimmst und ist hier (für den erhofften Zweck) untauglich, wir könnten aber versuchen, den JSON-String vorher zu bearbeiten. Ungetestet evtl:
attr ADAM6060_00D0C9FC434C_unified readingList Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/true/on/gmxs; $EVENT =~ s/false/off/gmxs;  json2nameValue($EVENT,'',$JSONMAP) }\
Für weitere Überlegungen zu jsonMap evtl mal folgender Startpunkt:

attr ADAM6060_00D0C9FC434C_unified jsonMap do1:state do2:Relais_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

cberl

Hi, Danke für den Versuch der Entkryptisierung ;)
Das escape mit qq ist wirklich schöner.
Ich hoffe, dass ich das richtig verstanden habe: Relais1 mit separatem on / off im setList und die anderen mit Perl?
Das readingList wird aber noch nicht aufgedröselt.
Das jsonMap habe ich eingetragen, verstehe aber den Zusammenhang nicht.


Zu on-for-timer: Kaum hat man ein on / off gehts auch :-) Danke für Info.

So sieht`s jetzt aus:


defmod ADAM6060_00D0C9FC434C_unified MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_unified IODev MQTT2Client
attr ADAM6060_00D0C9FC434C_unified jsonMap do1:state do2:Relais_2
attr ADAM6060_00D0C9FC434C_unified readingList Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/true/on/gmxs;; $EVENT =~ s/false/off/gmxs;;  json2nameValue($EVENT,'',$JSONMAP) }\
Advantech/00D0C9FC434C/Device_Status:.* { json2nameValue($EVENT) }
attr ADAM6060_00D0C9FC434C_unified room 82.MQTT
attr ADAM6060_00D0C9FC434C_unified setExtensionsEvent 1
attr ADAM6060_00D0C9FC434C_unified setList on:noArg Advantech/00D0C9FC434C/ctl/do1:r {"v":true}\
off:noArg Advantech/00D0C9FC434C/ctl/do1:r {"v":false}\
do2:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;;;;;; qq(Advantech/00D0C9FC434C/ctl/do2:r {"v":$payload})}\
do3:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;;;;;; qq(Advantech/00D0C9FC434C/ctl/do3:r {"v":$payload})}\
do4:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;;;;;; qq(Advantech/00D0C9FC434C/ctl/do4:r {"v":$payload})}\
do5:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;;;;;; qq(Advantech/00D0C9FC434C/ctl/do5:r {"v":$payload})}\
do6:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;;;;;; qq(Advantech/00D0C9FC434C/ctl/do6:r {"v":$payload})}
attr ADAM6060_00D0C9FC434C_unified setStateList on off

setstate ADAM6060_00D0C9FC434C_unified set_on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-24 18:13:56 c 1
setstate ADAM6060_00D0C9FC434C_unified 2020-05-24 17:51:45 ipaddr 192.168.50.54
setstate ADAM6060_00D0C9FC434C_unified 2020-05-24 17:51:45 macid 00D0C9FC434C
setstate ADAM6060_00D0C9FC434C_unified 2020-05-24 17:51:45 name ADAM6060
setstate ADAM6060_00D0C9FC434C_unified 2020-05-24 18:13:56 q 192
setstate ADAM6060_00D0C9FC434C_unified 2020-05-24 18:13:56 s 1
setstate ADAM6060_00D0C9FC434C_unified 2020-05-24 18:13:53 state set_on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-24 17:51:45 status connect
setstate ADAM6060_00D0C9FC434C_unified 2020-05-24 18:13:56 t 0

Fhem immer aktuell @win2016 und @ubuntu VM|7xFRM/ArduinoEthernet|Homematic|HMLan|CUNO|HarmonyHub|Modbus|Z-Wave|Milight-Hub|MQTT|OWX an ETH-UART|GoogleAssist,Alexa,Sonos|2nHelios IP Vario|Amad-Odroid|Telegram|Enigma2

Beta-User

Zitat von: cberl am 24 Mai 2020, 18:22:30
Relais1 mit separatem on / off im setList und die anderen mit Perl?
So war es gemeint (für die "unified"-Variante).

Was den Rest angeht, sendet das Ding entweder überraschend wenig Rückmeldung, oder mein Code ist Käse...
Für mich wäre es daher hilfreich zu wissen, was auf der MQTT-Kommunikationsebene so an Infos hin- und hergeht, wenn du was aus FHEM heraus schaltest und ggf. auch mal den einen oder andere Knopf am Gerät drückst.

An die Infos kommt man entweder mit einem externen MQTT-Client (mosquitto_sub), über RAW-Events am M2Server+Event-Monitor, oder ggf. (teilweise) auch über das Device, wenn man die readingList "mißbraucht":


attr ADAM6060_00D0C9FC434C_unified readingList Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/true/on/gmxs;; $EVENT =~ s/false/off/gmxs;;  json2nameValue($EVENT,'',$JSONMAP) }\
Advantech/00D0C9FC434C/Device_Status:.* { json2nameValue($EVENT) }\
Advantech/00D0C9FC434C/data:.* data_JSON\
Advantech/00D0C9FC434C/Device_Status:.* Device_Status_JSON

(Dann würde ich aber ein paar der JSON-Infos samt der zugehörigen Aktionen benötigen).
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

cberl

#9
Hi, geschwätzig ist das Ding wirklich nicht, ist eher auf das wirklich Notwendige beschränkt.
Das Json aus meinem zweiten Beitrag habe ich aus MQTT.fx. Ansonsten nutze ich noch den MQTT Explorer, der wirft eine schöne Baumstruktur aus (Anhang).

Nachdem ich über fhem z.B. ein Advantech/00D0C9FC434C/ctl/do1 {"v":true} oder auch {"v":false} sende,
antwortet das Teil immer mit allen Zuständen:
Advantech/00D0C9FC434C/data {"s":1,"t":0,"q":192,"c":1,"di1":true,"di2":true,"di3":true,"di4":true,"di5":false,"di6":true,"do1":true,"do2":false,"do3":false,"do4":false,"do5":false,"do6":false}
Alle Zustände werden auch bei einer Pegeländeung an den di (Digital Input) gesendet.

Unter Advantech/00D0C9FC434C/cfg/sensor/do1-6 und di1-6 wird der Type, aber kein Status ausgegeben:
{"typ":"do"}
..Wozu auch immer

Ansonsten gibts noch den LWT unter Advantech/00D0C9FC434C/Device_Status
Das steht aber schon in meinem zweiten Beitrag. Mehr ist nicht.
Fhem immer aktuell @win2016 und @ubuntu VM|7xFRM/ArduinoEthernet|Homematic|HMLan|CUNO|HarmonyHub|Modbus|Z-Wave|Milight-Hub|MQTT|OWX an ETH-UART|GoogleAssist,Alexa,Sonos|2nHelios IP Vario|Amad-Odroid|Telegram|Enigma2

Beta-User

 ;D dann war/ist wohl mein Code Käse...

Habe grade mal das in die Kommandozeile geworfen: { my $EVENT=' {"s":1,"t":0,"q":192,"c":1,"di1":true,"di2":true,"di3":true,"di4":true,"di5":false,"di6":true,"do1":true,"do2":false,"do3":false,"do4":false,"do5":false,"do6":false}';; $EVENT =~ s/true/on/gxms;; $EVENT =~ s/false/off/gxms;;return $EVENT}. Das liefert eigentlich einen sauber überarbeiteten JSON. Die Frage ist, warum scheinbar (?) die Weitververarbeitung nicht klappt. "set_on" klang jedenfalls danach, als sei was versendet worden, nur die Rückantwort scheint in Teilen (!) zu fehlen... Mysteriös.

Kannst du das mit der erweiterten readingList mal testen, ob da immer und zuverlässig was zurückkommt, wenn du von FHEM aus schaltest und dazu auch MQTT-fx laufen lassen?

Ansonsten mal die Parameter etwas reduzieren (sollte eigentlich unschädlich sein):
$EVENT =~ s/true/on/g;; $EVENT =~ s/false/off/g;;Eventuell müssen wir die "Umarbeitung" auch mal außerhalb des Variablennamens $EVENT versuchen... (my $newjson=
$EVENT =~ s/true/on/g;; $newjson =~ s/false/off/g;; json2nameValue($newjson,'',$JSONMAP))
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

rudolfkoenig

ZitatDas liefert eigentlich einen sauber überarbeiteten JSON.
Kann nicht glauben: "di6":true ist gueltiger JSON, "di6":on dagegen nicht, on muss als "on" geschrieben werden.

Beta-User

 ::) ... so einfach ist die Welt manchmal... Danke für den Schubs (da hätte ich auch selber drauf kommen können...)
Ergibt also:
$EVENT =~ s/true/"on"/g;; $EVENT =~ s/false/"off"/g;;
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

cberl

Das klappt. Danke!
Ich kann alle Relais on & off schalten, der Schaltstatus wird nach einem Stromausfall wiederhergestell, das Reading wird aktualisiert, di funktionioniert auch. Sehr schön.
Die Readings c, q, s und t sind unnütz (reserved for further use), stören aber auch nicht.
So sieht jetzt das RAW aus:

defmod ADAM6060_00D0C9FC434C_unified MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_unified IODev MQTT2Client
attr ADAM6060_00D0C9FC434C_unified jsonMap do1:state
attr ADAM6060_00D0C9FC434C_unified readingList Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/true/"on"/g;; $EVENT =~ s/false/"off"/g;; json2nameValue($EVENT,'',$JSONMAP) }\
Advantech/00D0C9FC434C/Device_Status:.* { json2nameValue($EVENT) }
attr ADAM6060_00D0C9FC434C_unified room 82.MQTT
attr ADAM6060_00D0C9FC434C_unified setExtensionsEvent 1
attr ADAM6060_00D0C9FC434C_unified setList on:noArg Advantech/00D0C9FC434C/ctl/do1:r {"v":true}\
off:noArg Advantech/00D0C9FC434C/ctl/do1:r {"v":false}\
do2:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;; qq(Advantech/00D0C9FC434C/ctl/do2:r {"v":$payload})}\
do3:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;; qq(Advantech/00D0C9FC434C/ctl/do3:r {"v":$payload})}\
do4:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;; qq(Advantech/00D0C9FC434C/ctl/do4:r {"v":$payload})}\
do5:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;; qq(Advantech/00D0C9FC434C/ctl/do5:r {"v":$payload})}\
do6:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";;;; qq(Advantech/00D0C9FC434C/ctl/do6:r {"v":$payload})}
attr ADAM6060_00D0C9FC434C_unified setStateList on off

setstate ADAM6060_00D0C9FC434C_unified off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 c 1
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 di1 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 di2 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 di3 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 di4 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 di5 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 di6 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 do2 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 do3 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 do4 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 do5 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 do6 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 ipaddr 192.168.50.54
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 macid 00D0C9FC434C
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 name ADAM6060
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 q 192
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 s 1
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 state off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 status connect
setstate ADAM6060_00D0C9FC434C_unified 2020-05-25 15:56:41 t 0


Fhem immer aktuell @win2016 und @ubuntu VM|7xFRM/ArduinoEthernet|Homematic|HMLan|CUNO|HarmonyHub|Modbus|Z-Wave|Milight-Hub|MQTT|OWX an ETH-UART|GoogleAssist,Alexa,Sonos|2nHelios IP Vario|Amad-Odroid|Telegram|Enigma2

Beta-User

Das hört man gerne!

Vorneweg evtl. die einfachen Dinge:
Zitat von: cberl am 25 Mai 2020, 15:59:37
Die Readings c, q, s und t sind unnütz (reserved for further use), stören aber auch nicht.
Kannst du mit weiteren jsonMap-Einträgen wegfiltern: c:0 q:0 usw..
Ganz so viele ";" in readingList müssen m.E. auch nicht sein.

Die IP-Adresse könnte man (nach Tasmota-Beispiel) mit einem grünen Punkt für "connect" visualisieren und verlinken?
(Falls die Web-Oberfläche vorhanden ist und zu irgendwas nutze.)

Das General-Bridge-Template habe ich zwischenzeitlich mal erweitert, so dass es automatisch neue Devices anlegt, wenn was mit "Advantech" kommt.

"Schwieriger" ist das mit den dauernden updates von allem. Ich kann sowas nicht leiden, das aber in dem "unified"-Ding abzustellen ist ein ziemlicher Aufwand. Hier wäre vermutlich ein "event-on-change"-Attribut hilfreich, um wenigstens die vielen unnützen Events auszuschalten, oder eben via userReadings, ähnlich wie hier: https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/lib/AttrTemplate/mqtt2.template#L2442.

Bei einer "split"-Variante würde dann was ähnliches ins Spiel kommen wie in 8channel_ethernet_board_split, da würde man den json vermutlich dann besser direkt auswerten und bei den weiteren Kanälen gar nicht mehr json2valueName() verwenden:
attr DEVICE readingList STATETOPIC.* { $EVENT =~ /output...([01])[01]{7}/;;  my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? return : {"state"=>$newstate} }
Bei split würde es dann wohl Sinn machen, alle Taster beim ersten Kanal zu halten und in jsonMap die überzähligen Relais-Kanäle mit ":0" nicht anzuzeigen.

Kommst du damit weiter?
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