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

cberl

Hi,

ZitatDie IP-Adresse könnte man (nach Tasmota-Beispiel) mit einem grünen Punkt für "connect" visualisieren und verlinken?
Du meinst da das Webif des Adam? Da gibts keinen generellen Connect Status. Für das Grün habe ich jetzt mal den connect aus dem Reading ausgewertet:

So sieht es jetzt das Unified aus:

defmod ADAM6060_00D0C9FC434C_unified MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_unified IODev MQTT2Client
attr ADAM6060_00D0C9FC434C_unified devStateIcon {my $alivecolor = 'rc_STOP@red';;$alivecolor='rc_STOP@green' if (ReadingsVal($name, "status","") eq "connect");;"<div>" . FW_makeImage("$alivecolor","rc_STOP") }
attr ADAM6060_00D0C9FC434C_unified jsonMap do1:state c:0 q:0 s:0 t:0
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})}

setstate ADAM6060_00D0C9FC434C_unified off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 di1 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 di2 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 di3 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 di4 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 di5 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 di6 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 do2 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 do3 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 do4 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 do5 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 do6 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 ipaddr 192.168.50.54
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 macid 00D0C9FC434C
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 name ADAM6060
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 state off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-26 16:27:50 status connect


Das Split für do1:

defmod ADAM6060_00D0C9FC434C_split_do1 MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_split_do1 IODev MQTT2Client
attr ADAM6060_00D0C9FC434C_split_do1 genericDeviceType switch
attr ADAM6060_00D0C9FC434C_split_do1 icon on
attr ADAM6060_00D0C9FC434C_split_do1 readingList Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/do1":(true)/"on"/g;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }\
Advantech/00D0C9FC434C/Device_Status:.* { json2nameValue($EVENT) }
attr ADAM6060_00D0C9FC434C_split_do1 room 82.MQTT
attr ADAM6060_00D0C9FC434C_split_do1 setExtensionsEvent 1
attr ADAM6060_00D0C9FC434C_split_do1 setList on:noArg Advantech/00D0C9FC434C/ctl/do1:r {"v":true}\
off:noArg Advantech/00D0C9FC434C/ctl/do1:r {"v":false}\

attr ADAM6060_00D0C9FC434C_split_do1 setStateList on off

setstate ADAM6060_00D0C9FC434C_split_do1 off
setstate ADAM6060_00D0C9FC434C_split_do1 2020-05-26 15:53:42 ipaddr 192.168.50.54
setstate ADAM6060_00D0C9FC434C_split_do1 2020-05-26 15:53:42 macid 00D0C9FC434C
setstate ADAM6060_00D0C9FC434C_split_do1 2020-05-26 15:53:42 name ADAM6060
setstate ADAM6060_00D0C9FC434C_split_do1 2020-05-26 15:58:11 state off
setstate ADAM6060_00D0C9FC434C_split_do1 2020-05-26 15:53:42 status connect


Das Split für di5 (nur Digital Input):

defmod ADAM6060_00D0C9FC434C_split_di5 MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_split_di5 IODev MQTT2Client
attr ADAM6060_00D0C9FC434C_split_di5 readingList Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/di5":(true)/"on"/g;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }\
Advantech/00D0C9FC434C/Device_Status:.* { json2nameValue($EVENT) }
attr ADAM6060_00D0C9FC434C_split_di5 room 82.MQTT

setstate ADAM6060_00D0C9FC434C_split_di5 on
setstate ADAM6060_00D0C9FC434C_split_di5 2020-05-26 16:21:51 state on


Ich bin damit schon recht zufrieden (funktioniert). Was meinst Du?
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 26 Mai 2020, 16:30:45
Ich bin damit schon recht zufrieden (funktioniert). Was meinst Du?
Erst mal:  :) .

Sieht schon ganz gut aus, alles weitere ist Jammern auf hohem Niveau ;D .

Da du es scheinbar wissen willst, jetzt noch die "aber" (im Sinne von "100%-Feinschliff"):
Zitat
Hi,
Du meinst da das Webif des Adam? Da gibts keinen generellen Connect Status.
War eher so gemeint: Bei Tasmota u.A. kann man mit dem Web-Interface wirklich was anfangen, z.B. updates anschubsen. Dann ist der Link auf die Webseite nice to have. Wenn das sowieso statisch ist, ist es Wurst, und man kann das einfacher halten (iV. multiline-stateFormat)...
attr ADAM6060_00D0C9FC434C_unified devStateIcon disconnect:rc_STOP@red connect:rc_STOP@green
attr ADAM6060_00D0C9FC434C_unified stateFormat status\
state
Wenn man mag, könnte man dann da noch die Relais 2-6 dazubasteln. Muß dann z.b. nummeriert werden und in devStateIcon entsprechend ergänzt: "2.on:on:do2+off 2.off:off:do2+on" (Falls du weiteren Text dazwischenbasteln willst, bitte darauf achten, dass nach jedes n:di(n) eine eigene Zeile bekommt). Alternativ ginge hier webCmd/webCmdLabel.

In dem "unified" könnte man das mit dem "changed" auch über mehrere readingList-Einträge machen, wobei man für die Kanäle do2-6 dann eine while-Schleife basteln könnte analog zu der hier (natürlich "aufgehübscht" mit der Frage, ob das geändert ist; das ist zugegebenermaßen ziemlich fancy, aber du scheinst es wirklich wissen zu wollen :) ...):
  TELETOPIC/RESULT:.* { my %ret; while ($EVENT =~ /.Id...([A-F0-9]{12})...Temperature..([-]?[\d]+\.[\d]+)./g) { $ret{"Temperatur_".$1}=$2; }; return \%ret; }\
Die Eingänge würde ich nicht vereinzeln, weil man damit ja eh' nur was anfangen kann, wenn man einen Eventhandler darauf ausetzt, und dem sind die SetExtensions egal... (Setzt aber voraus, dass man entweder nur Änderungen triggern läßt oder gleich mit der while-Schleife filtert ::) ).

Aber nochmal: "Jammern" auf hohem Niveau!
(Und du darfst auch gerne sagen, wenn dir das "too much" ist ;) .
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

Ein guter Tip mit den devStateIcon! Das werde ich mal noch in meine Modbus Schalter und EIO-Boards einbauen. Zu Schalten gibts halt immer was  ;)
Die while-Schleife ist mir dann doch etwas to much, letztendlich gibts ja noch event-on-change-reading.

Das Unified sieht nun so aus:

defmod ADAM6060_00D0C9FC434C_unified MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_unified IODev MQTT2Client
attr ADAM6060_00D0C9FC434C_unified devStateIcon disconnect:rc_STOP@red connect:rc_STOP@green 2.on:on:do2+off 2.off:off:do2+on 3.on:on:do3+off 3.off:off:do3+on 4.on:on:do4+off 4.off:off:do4+on 5.on:on:do5+off 5.off:off:do5+on 6.on:on:do6+off 6.off:off:do6+on
attr ADAM6060_00D0C9FC434C_unified event-on-change-reading .*
attr ADAM6060_00D0C9FC434C_unified jsonMap do1:state c:0 q:0 s:0 t:0
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 stateFormat status\
state\
2:do2\
3:do3\
4:do4\
5:do5\
6:do6\
<br>\
DigiIn\
di1\
di2\
di3\
di4\
di5\
di6
attr ADAM6060_00D0C9FC434C_unified webCmd :

setstate ADAM6060_00D0C9FC434C_unified connect\
off\
2:off\
3:off\
4:off\
5:off\
6:off\
<br>\
DigiIn\
on\
on\
on\
on\
off\
on


1000 Dank!
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

 :)

Aber jetzt will ich es wissen ;D 8) ::) ...
Vielleicht magst du ja doch noch folgendes testen:

attr ADAM6060_00D0C9FC434C_unified readingList Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/true/"on"/g; $EVENT =~ s/false/"off"/g; my %ret; while ($EVENT =~ /.d[io]...(on|off)./g) { my $rname = $1 ne "do1" ? $1 : "state"; $2 eq ReadingsVal($NAME,$rname,"unknown") ? undef : $ret{$rname}=$2 }; return \%ret;}\
...
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

Beta-User

...falls das klappt, wären das hier die attrTemplates:
name:6channel_ethernet_board_6input_split
filter:TYPE=MQTT2_DEVICE
desc:For use with Advantech ADAM6060 ethernet board. <br>NOTE: First experimental version, for configuration and to contribute see <a href="https://forum.fhem.de/index.php/topic,111429.0.html">Forum Thread</a>.
order:W_04
par:DEVNAME;Device's name in the topic tree;{ AttrVal("DEVICE","readingList","") =~ m,Advantech/([^/]+)/, ? $1 : undef }
par:ICON;ICON as set, defaults to on;{ AttrVal("DEVICE","icon","on") }
attr DEVICE icon ICON
deletereading -q DEVICE (?!associatedWith).*
attr DEVICE devStateIcon disconnect:rc_STOP@red connect:rc_STOP@green
attr DEVICE readingList Advantech/DEVNAME/data:.* { $EVENT =~ m/do1":(true)/g;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }\
Advantech/DEVNAME/Device_Status:.* { json2nameValue($EVENT) }
attr DEVICE setExtensionsEvent 1
attr DEVICE setList on:noArg Advantech/DEVNAME/ctl/do1:r {"v":true}\
  off:noArg Advantech/DEVNAME/ctl/do1:r {"v":false}
attr DEVICE stateFormat status\
state\
<br>\
DigiIn\
di1\
di2\
di3\
di4\
di5\
di6
attr DEVICE webCmd : 
copy DEVICE DEVICE_CH2
copy DEVICE DEVICE_CH3
copy DEVICE DEVICE_CH4
copy DEVICE DEVICE_CH5
copy DEVICE DEVICE_CH6
setreading DEVICE associatedWith DEVICE_CH1,DEVICE_CH2,DEVICE_CH3,DEVICE_CH4,DEVICE_CH5,DEVICE_CH6
setreading DEVICE_CH2 associatedWith DEVICE,DEVICE_CH1,DEVICE_CH3,DEVICE_CH4,DEVICE_CH5,DEVICE_CH6
setreading DEVICE_CH3 associatedWith DEVICE,DEVICE_CH1,DEVICE_CH2,DEVICE_CH4,DEVICE_CH5,DEVICE_CH6
setreading DEVICE_CH4 associatedWith DEVICE,DEVICE_CH1,DEVICE_CH2,DEVICE_CH3,DEVICE_CH5,DEVICE_CH6
setreading DEVICE_CH5 associatedWith DEVICE,DEVICE_CH1,DEVICE_CH2,DEVICE_CH3,DEVICE_CH4,DEVICE_CH6
setreading DEVICE_CH6 associatedWith DEVICE,DEVICE_CH1,DEVICE_CH2,DEVICE_CH3,DEVICE_CH4,DEVICE_CH5
attr DEVICE_CH2 readingList Advantech/DEVNAME/data:.* { $EVENT =~ m/do2":(true)/g;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr DEVICE_CH3 readingList Advantech/DEVNAME/data:.* { $EVENT =~ m/do3":(true)/g;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr DEVICE_CH4 readingList Advantech/DEVNAME/data:.* { $EVENT =~ m/do4":(true)/g;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr DEVICE_CH5 readingList Advantech/DEVNAME/data:.* { $EVENT =~ m/do5":(true)/g;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr DEVICE_CH6 readingList Advantech/DEVNAME/data:.* { $EVENT =~ m/do6":(true)/g;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr DEVICE_CH2 setList on:noArg Advantech/DEVNAME/ctl/do2:r {"v":true}\
  off:noArg Advantech/DEVNAME/ctl/do2:r {"v":false}
attr DEVICE_CH3 setList on:noArg Advantech/DEVNAME/ctl/do3:r {"v":true}\
  off:noArg Advantech/DEVNAME/ctl/do3:r {"v":false}
attr DEVICE_CH4 setList on:noArg Advantech/DEVNAME/ctl/do4:r {"v":true}\
  off:noArg Advantech/DEVNAME/ctl/do4:r {"v":false}
attr DEVICE_CH5 setList on:noArg Advantech/DEVNAME/ctl/do5:r {"v":true}\
  off:noArg Advantech/DEVNAME/ctl/do5:r {"v":false}
attr DEVICE_CH6 setList on:noArg Advantech/DEVNAME/ctl/do6:r {"v":true}\
  off:noArg Advantech/DEVNAME/ctl/do6:r {"v":false}
set DEVICE,DEVICE_CH2,DEVICE_CH3,DEVICE_CH4,DEVICE_CH5,DEVICE_CH6 attrTemplate speechcontrol_type_switch
attr DEVICE,DEVICE_CH2,DEVICE_CH3,DEVICE_CH4,DEVICE_CH5,DEVICE_CH6 model 6channel_ethernet_board_6input_split
setreading DEVICE,DEVICE_CH2,DEVICE_CH3,DEVICE_CH4,DEVICE_CH5,DEVICE_CH6 attrTemplateVersion 20200527

name:6channel_ethernet_board_6input_unified
filter:TYPE=MQTT2_DEVICE
desc:For use with Advantech ADAM6060 ethernet board. <br>NOTE: First experimental version, for configuration and to contribute see <a href="https://forum.fhem.de/index.php/topic,111429.0.html">Forum Thread</a>.
order:W_04a
par:DEVNAME;Device's name in the topic tree;{ AttrVal("DEVICE","readingList","") =~ m,Advantech/([^/]+)/, ? $1 : undef }
par:ICON;ICON as set, defaults to on;{ AttrVal("DEVICE","icon","on") }
attr DEVICE icon ICON
deletereading -q DEVICE (?!associatedWith).*
attr DEVICE devStateIcon disconnect:rc_STOP@red connect:rc_STOP@green 2.on:on:do2+off 2.off:off:do2+on 3.on:on:do3+off 3.off:off:do3+on 4.on:on:do4+off 4.off:off:do4+on 5.on:on:do5+off 5.off:off:do5+on 6.on:on:do6+off 6.off:off:do6+on
attr DEVICE readingList Advantech/DEVNAME/data:.* { $EVENT =~ s/true/"on"/g; $EVENT =~ s/false/"off"/g; my %ret; while ($EVENT =~ /.d[io]...(on|off)./g) { my $rname = $1 ne "do1" ? $1 : "state"; $2 eq ReadingsVal($NAME,$rname,"unknown") ? undef : $ret{$rname}=$2 }; return \%ret; }\
Advantech/DEVNAME/Device_Status:.* { json2nameValue($EVENT) }
attr DEVICE setExtensionsEvent 1
attr DEVICE setList on:noArg Advantech/DEVNAME/ctl/do1:r {"v":true}\
  off:noArg Advantech/DEVNAME/ctl/do1:r {"v":false}\
  do2:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";; qq(Advantech/DEVNAME/ctl/do2:r {"v":$payload})}\
  do3:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";; qq(Advantech/DEVNAME/ctl/do3:r {"v":$payload})}\
  do4:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";; qq(Advantech/DEVNAME/ctl/do4:r {"v":$payload})}\
  do5:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";; qq(Advantech/DEVNAME/ctl/do5:r {"v":$payload})}\
  do6:on,off {my $payload = $EVTPART1 eq "on" ? "true" : "false";; qq(Advantech/DEVNAME/ctl/do6:r {"v":$payload})}
attr DEVICE stateFormat status\
state\
2:do2\
3:do3\
4:do4\
5:do5\
6:do6\
<br>\
DigiIn\
di1\
di2\
di3\
di4\
di5\
di6
attr DEVICE webCmd : 

set DEVICE attrTemplate speechcontrol_type_switch
attr DEVICE model 6channel_ethernet_board_6input_unified
setreading DEVICE attrTemplateVersion 20200527

Hoffe, das mit dem mehrfach-attrTemplate betr. Sprachsteuerung ist beim split nicht "too much"...

Gibt's eigentlich irgendwelche Einrichtungshinweise, um das Ding dazu zu überreden, überhaupt MQTT irgendwohin zu senden? (Beim "Konkurrenzprodukt" ist die betr. Seite wohl etwas versteckt).
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, dass passt noch nicht ganz:
Mit dem neuen readingList gibts nur noch das Reading state und das gibt den letzten do Schaltvorgang aus. Bei einem di Schaltvorgang ändert sich nichts.


defmod ADAM6060_00D0C9FC434C_unified MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_unified IODev MQTT2Client
attr ADAM6060_00D0C9FC434C_unified devStateIcon disconnect:rc_STOP@red connect:rc_STOP@green 2.on:on:do2+off 2.off:off:do2+on 3.on:on:do3+off 3.off:off:do3+on 4.on:on:do4+off 4.off:off:do4+on 5.on:on:do5+off 5.off:off:do5+on 6.on:on:do6+off 6.off:off:do6+on
attr ADAM6060_00D0C9FC434C_unified event-on-change-reading .*
attr ADAM6060_00D0C9FC434C_unified jsonMap do1:state c:0 q:0 s:0 t:0
attr ADAM6060_00D0C9FC434C_unified readingList Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/true/"on"/g;; $EVENT =~ s/false/"off"/g;; my %ret;; while ($EVENT =~ /.d[io]...(on|off)./g) { my $rname = $1 ne "do1" ? $1 : "state";; $2 eq ReadingsVal($NAME,$rname,"unknown") ? undef : $ret{$rname}=$2 };; return \%ret;;}\
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 stateFormat status\
state\
2:do2\
3:do3\
4:do4\
5:do5\
6:do6\
<br>\
DigiIn\
di1\
di2\
di3\
di4\
di5\
di6
attr ADAM6060_00D0C9FC434C_unified webCmd :

setstate ADAM6060_00D0C9FC434C_unified status\
do5\
2:do2\
3:do3\
4:do4\
5:do5\
6:do6\
<br>\
DigiIn\
di1\
di2\
di3\
di4\
di5\
di6
setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 15:24:30 state do5




Zu der Einrichtung des ADAM6060:
Da gibt es die Konfigsoftware AdamApax.Net im Downloadbereich von Advantech.
Gerät suchen, Reiter Cloud, MQTT Host anpassen und save (def. PW ist 00000000) - Mehr ist nicht.
Etwas böse ist, dass nur die neueren ADAM6060-D MQTT können. Ältere Typen (BE, CE oder so) können nur http, Modbus, tcp...
Im Klartext steht das natürlich nirgendwo. Deswegen habe ich hier auch drei 6060 die ich über ModbusAttr am Fhem habe.
Die Version steht dummerweise nicht auf dem Gerät sondern ist entweder auf der Verpackung zu sehen oder über die Seriennummer auf der Supportseite herauszubekommen. Die Seriennummerabfrage funktioniert aber häufig 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

Hmm,

wäre auch zu schön gewesen. Aber an sich sollte das klappen, es fehlen vermutlich nur zwei Zeichen: "->"... Magst du das testen?

attr ADAM6060_00D0C9FC434C_unified readingList Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/true/"on"/g;; $EVENT =~ s/false/"off"/g;; my %ret;; while ($EVENT =~ /.d[io]...(on|off)./g) { my $rname = $1 ne "do1" ? $1 : "state";; $2 eq ReadingsVal($NAME,$rname,"unknown") ? undef : $ret->{$rname}=$2 };; return \%ret;;}\
Advantech/00D0C9FC434C/Device_Status:.* { json2nameValue($EVENT) }


Betr. der Einrichtung muß ich mir also was für "desc:" überlegen, aber du kannst gerne auch was vorschlagen...
Basis könnte das hier vom 8-Kanal-Board sein:
Zitatdesc:For use with some 8-channel ethernet boards. Might be usefull for other stuff based on TI's <a href="https://www.waveshare.com/wiki/DP83848_Ethernet_Board">DP83848 ethernet chipset</a>.<br>NOTE: First experimental version, for configuration and to contribute see <a href="https://forum.fhem.de/index.php/topic,107536.msg1016379.html#msg1016379">Forum Thread</a>. You have to configure MQTT first, might be found under http://<device-ip-adress>/zm.cgi!
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,
sobald das -> drin ist gibts ein: Global symbol "$ret" requires explicit package name (did you forget to declare "my $ret"?) at (eval 3263165) line 1.

Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/true/"on"/g; $EVENT =~ s/false/"off"/g; my %ret; while ($EVENT =~ /.d[io]...(on|off)./g) { my $rname = $1 ne "do1" ? $1 : "state"; $2 eq ReadingsVal($NAME,$rname,"unknown") ? undef : $ret->{$rname}=$2 }; return \%ret;}


Zu dem desc: schreibe ich was.
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

Argh, die erste Fassung war wohl eben nur fast richtig: 4 Zeichen zwischen [io] und (on|off) statt drei...

Für die Attribut-Eingabe (die Logik für "state" ist so rum vermutlich einfacher lesbar):
{ $EVENT =~ s/true/"on"/g; $EVENT =~ s/false/"off"/g; my %ret; while ($EVENT =~ /.d[io].{4}(on|off)./g) { my $rname = $1 eq "do1" ? "state" : $1; $2 eq ReadingsVal($NAME,$rname,"unknown") ? undef : $ret{$rname} = $2 }; return \%ret;}
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

Noch, keine Readings:

defmod ADAM6060_00D0C9FC434C_unified MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_unified IODev MQTT2Client
attr ADAM6060_00D0C9FC434C_unified devStateIcon disconnect:rc_STOP@red connect:rc_STOP@green 2.on:on:do2+off 2.off:off:do2+on 3.on:on:do3+off 3.off:off:do3+on 4.on:on:do4+off 4.off:off:do4+on 5.on:on:do5+off 5.off:off:do5+on 6.on:on:do6+off 6.off:off:do6+on
attr ADAM6060_00D0C9FC434C_unified jsonMap do1:state c:0 q:0 s:0 t:0
attr ADAM6060_00D0C9FC434C_unified readingList Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/true/"on"/g;; $EVENT =~ s/false/"off"/g;; my %ret;; while ($EVENT =~ /.d[io].{4}(on|off)./g) { my $rname = $1 eq "do1" ? "state" : $1;; $2 eq ReadingsVal($NAME,$rname,"unknown") ? undef : $ret{$rname} = $2 };; return \%ret;;}\
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 stateFormat status\
state\
2:do2\
3:do3\
4:do4\
5:do5\
6:do6\
<br>\
DigiIn\
di1\
di2\
di3\
di4\
di5\
di6
attr ADAM6060_00D0C9FC434C_unified webCmd :

setstate ADAM6060_00D0C9FC434C_unified status\
do6\
2:do2\
3:do3\
4:do4\
5:do5\
6:do6\
<br>\
DigiIn\
di1\
di2\
di3\
di4\
di5\
di6
setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 21:22:00 state do6



Zur desc: in Anlehnung an das EIO-Board:
For use with Advantech ADAM-6060-D 6-ch digital Input and 6-ch relay output.
NOTE: First experimental version, for configuration and to contribute see Forum Thread. You have to configure MQTT first with the Adam/Apax.Net Utility - cloud function: Set your broker and look for the topic.
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

...heute ist aber irgendwie der Wurm drin ::) .

Wir brauchen auch $1 (bzw. $2)...
{ $EVENT =~ s/true/"on"/g; $EVENT =~ s/false/"off"/g; my %ret; while ($EVENT =~ /.(d[io][1-6])...(on|off)./g) { my $rname = $1 eq "do1" ? "state" : $1; $2 eq ReadingsVal($NAME,$1,"unknown") ? undef : $ret{$1}=$2 }; return \%ret;}

desc ist m.E. ok so.
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

Es wird: Die Readings werden jetzt bei den Schaltvorgängen aktualisiert, lustigerweise wird aber nur der Zeitstempel vom state geändert.

setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 21:41:50 di1 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 21:41:50 di2 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 21:41:50 di3 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 21:41:50 di4 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 21:41:50 di5 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 21:41:50 di6 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 21:41:50 do1 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 21:41:50 do2 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 21:41:50 do3 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 21:41:50 do4 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 21:41:50 do5 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 21:41:50 do6 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-27 21:44:14 state do5
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

Jein...

Habe jetzt auch mal etwas mit dem Code rumgespielt und folgendes festgestellt: Es klappt genau 1x, beim zweiten Versuch, erscheint eine Fehlermeldung im Log, von wegen "read-only value" soll geändert werden. Bin noch nicht dahintergestiegen, was der Hintergrund ist, vielleicht finde ich es noch, oder Rudi erhellt mich mal wieder...?
Fehlermeldung sieht so aus (den publish mit mosquitto_pub kann man erkennen, ich hatte das RAW von gestern 21:27 modifiziert, code ist in der Fehlermeldung):
Zitat2020.05.28 08:37:23 1: ERROR evaluating my $DEVICETOPIC='ADAM6060_00D0C9FC434C_unified';my $JSONMAP='$defs{"ADAM6060_00D0C9FC434C_unified"}{JSONMAP}';my $TOPIC='Advantech/00D0C9FC434C/data';my $CID='test';my $NAME='ADAM6060_00D0C9FC434C_unified';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}';my $EVTPART0='{"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}';{ my (%rets, $rnam, $rvalue);; while ($EVENT =~ m/.(d[io][1-6]).{2}(true|false)/g) { $rnam = $1 eq "do1" ? "state" : $1;; $rvalue = $2 eq "true" ? "on" : "off";; $rvalue eq ReadingsVal($NAME,$rnam,"unknown") ? undef : $rets{$rnam} = $rvalue };; return \%rets;;}: Modification of a read-only value attempted at (eval 169338) line 1.
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

ZitatBin noch nicht dahintergestiegen, was der Hintergrund ist, vielleicht finde ich es noch, oder Rudi erhellt mich mal wieder...?
Falls ich helfen soll, bitte mir ein Nachstell-HOWTO basteln.

Beta-User

Zitat von: rudolfkoenig am 28 Mai 2020, 09:02:10
Falls ich helfen soll, bitte mir ein Nachstell-HOWTO basteln.
Gerne, dann also hier mal ausgehend von einem "nackten" System, davor mit udate versehen.
defmod m2server MQTT2_SERVER 1883 global
defmod ADAM6060_00D0C9FC434C_unified MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_unified IODev m2server
attr ADAM6060_00D0C9FC434C_unified devStateIcon disconnect:rc_STOP@red connect:rc_STOP@green 2.on:on:do2+off 2.off:off:do2+on 3.on:on:do3+off 3.off:off:do3+on 4.on:on:do4+off 4.off:off:do4+on 5.on:on:do5+off 5.off:off:do5+on 6.on:on:do6+off 6.off:off:do6+on
attr ADAM6060_00D0C9FC434C_unified jsonMap do1:state c:0 q:0 s:0 t:0
attr ADAM6060_00D0C9FC434C_unified readingList Advantech/00D0C9FC434C/data:.* { my (%rets, $rnam, $rvalue);; while ($EVENT =~ m/.(d[io][1-6]).{2}(true|false)/g) { $rnam = $1 eq "do1" ? "state" : $1;; $rvalue = $2 eq "true" ? "on" : "off";; $rvalue eq ReadingsVal($NAME,$rnam,"unknown") ? undef : $rets{$rnam} = $rvalue };; return \%rets;;}\
Advantech/00D0C9FC434C/Device_Status:.* { json2nameValue($EVENT) }
attr ADAM6060_00D0C9FC434C_unified room Test
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 stateFormat status\
state\
2:do2\
3:do3\
4:do4\
5:do5\
6:do6\
<br>\
DigiIn\
di1\
di2\
di3\
di4\
di5\
di6
attr ADAM6060_00D0C9FC434C_unified webCmd :
Darauf dann ein publish:
mosquitto_pub -h localhost -i test -m '{"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}' -t Advantech/00D0C9FC434C/dataergibt folgende setstate im RAW:
setstate ADAM6060_00D0C9FC434C_unified status\
on\
2:off\
3:off\
4:off\
5:off\
6:off\
<br>\
DigiIn\
on\
on\
on\
on\
off\
on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-28 10:08:11 di1 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-28 10:08:11 di2 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-28 10:08:11 di3 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-28 10:08:11 di4 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-28 10:08:11 di5 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-28 10:08:11 di6 on
setstate ADAM6060_00D0C9FC434C_unified 2020-05-28 10:08:11 do2 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-28 10:08:11 do3 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-28 10:08:11 do4 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-28 10:08:11 do5 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-28 10:08:11 do6 off
setstate ADAM6060_00D0C9FC434C_unified 2020-05-28 10:08:11 state on

Darauf dann ein weiterer publish, (letzter Wert von false auf true geändert):
mosquitto_pub -h localhost -i test -m '{"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":true}' -t Advantech/00D0C9FC434C/data
und man erhält folgenden Logeintrag:
Zitat2020.05.28 10:12:07 1: ERROR evaluating my $CID='test';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":true}';my $EVTPART0='{"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":true}';my $NAME='ADAM6060_00D0C9FC434C_unified';my $DEVICETOPIC='ADAM6060_00D0C9FC434C_unified';my $TOPIC='Advantech/00D0C9FC434C/data';my $JSONMAP='$defs{"ADAM6060_00D0C9FC434C_unified"}{JSONMAP}';{ my (%rets, $rnam, $rvalue);; while ($EVENT =~ m/.(d[io][1-6]).{2}(true|false)/g) { $rnam = $1 eq "do1" ? "state" : $1;; $rvalue = $2 eq "true" ? "on" : "off";; $rvalue eq ReadingsVal($NAME,$rnam,"unknown") ? undef : $rets{$rnam} = $rvalue };; return \%rets;;}: Modification of a read-only value attempted at (eval 65) line 1.
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

Beta-User

So, nachdem ich leider auch nicht rausgefunden habe, wie man das zum laufen bekommt, habe ich eben die "event-on-change-Variante" eingecheckt (unified und split).

Da ich da auch gleich eine Art "master-Template" mit reingebastelt habe, um diese "dumme Schreibarbeit" mit den Querverweisen zukünftig zu vermeiden, kann es sein, dass da noch irgendwo ein Hund begraben ist... (=Testen für das split wäre nett).
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

Super Arbeit!

Das Unified funktioniert:

defmod ADAM6060_00D0C9FC434C_uTest MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_uTest IODev MQTT2Client
attr ADAM6060_00D0C9FC434C_uTest devStateIcon disconnect:rc_STOP@red connect:rc_STOP@green 2.on:on:do2+off 2.off:off:do2+on 3.on:on:do3+off 3.off:off:do3+on 4.on:on:do4+off 4.off:off:do4+on 5.on:on:do5+off 5.off:off:do5+on 6.on:on:do6+off 6.off:off:do6+on
attr ADAM6060_00D0C9FC434C_uTest disable 0
attr ADAM6060_00D0C9FC434C_uTest event-on-change-reading .*
attr ADAM6060_00D0C9FC434C_uTest genericDeviceType switch
attr ADAM6060_00D0C9FC434C_uTest icon on
attr ADAM6060_00D0C9FC434C_uTest jsonMap do1:state c:0 q:0 s:0 t:0
attr ADAM6060_00D0C9FC434C_uTest model 6channel_ethernet_board_6input_unified
attr ADAM6060_00D0C9FC434C_uTest 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_uTest room 82.MQTT
attr ADAM6060_00D0C9FC434C_uTest setExtensionsEvent 1
attr ADAM6060_00D0C9FC434C_uTest 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_uTest stateFormat status\
state\
2:do2\
3:do3\
4:do4\
5:do5\
6:do6\
<br>\
DigiIn\
di1\
di2\
di3\
di4\
di5\
di6
attr ADAM6060_00D0C9FC434C_uTest webCmd :

setstate ADAM6060_00D0C9FC434C_uTest connect\
off\
2:on\
3:off\
4:on\
5:off\
6:off\
<br>\
DigiIn\
on\
on\
on\
on\
off\
on
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:04:39 attrTemplateVersion 20200529
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:11:06 di1 on
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:11:06 di2 on
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:11:06 di3 on
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:11:06 di4 on
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:11:06 di5 off
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:11:06 di6 on
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:11:06 do2 on
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:11:06 do3 off
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:11:06 do4 on
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:11:06 do5 off
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:11:06 do6 off
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:10:12 ipaddr 192.168.50.54
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:10:12 macid 00D0C9FC434C
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:10:12 name ADAM6060
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:11:06 state off
setstate ADAM6060_00D0C9FC434C_uTest 2020-05-30 14:10:12 status connect



Das Schalten bei den do Split funktioniert, in der readingList des (ersten) Device fehlt noch die Abfrage von den di1 bis di6.


defmod ADAM6060_00D0C9FC434C_sTest MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_sTest IODev MQTT2Client
attr ADAM6060_00D0C9FC434C_sTest devStateIcon disconnect:rc_STOP@red connect:rc_STOP@green
attr ADAM6060_00D0C9FC434C_sTest disable 0
attr ADAM6060_00D0C9FC434C_sTest genericDeviceType switch
attr ADAM6060_00D0C9FC434C_sTest icon on
attr ADAM6060_00D0C9FC434C_sTest model 6channel_ethernet_board_6input_split
attr ADAM6060_00D0C9FC434C_sTest readingList Advantech/00D0C9FC434C/data:.* { $EVENT =~ m/do1":(true)/g;;;; my $newstate = $1 ? "on" : "off";;;; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }\
Advantech/00D0C9FC434C/Device_Status:.* { json2nameValue($EVENT) }
attr ADAM6060_00D0C9FC434C_sTest room 82.MQTT
attr ADAM6060_00D0C9FC434C_sTest setExtensionsEvent 1
attr ADAM6060_00D0C9FC434C_sTest setList on:noArg Advantech/00D0C9FC434C/ctl/do1:r {"v":true}\
  off:noArg Advantech/00D0C9FC434C/ctl/do1:r {"v":false}
attr ADAM6060_00D0C9FC434C_sTest stateFormat status\
state\
<br>\
DigiIn\
di1\
di2\
di3\
di4\
di5\
di6
attr ADAM6060_00D0C9FC434C_sTest webCmd :

setstate ADAM6060_00D0C9FC434C_sTest connect\
off\
<br>\
DigiIn\
di1\
di2\
di3\
di4\
di5\
di6
setstate ADAM6060_00D0C9FC434C_sTest 2020-05-30 13:54:42 attrTemplateVersion 20200529
setstate ADAM6060_00D0C9FC434C_sTest 2020-05-30 14:10:12 ipaddr 192.168.50.54
setstate ADAM6060_00D0C9FC434C_sTest 2020-05-30 14:10:12 macid 00D0C9FC434C
setstate ADAM6060_00D0C9FC434C_sTest 2020-05-30 14:10:12 name ADAM6060
setstate ADAM6060_00D0C9FC434C_sTest 2020-05-30 14:11:06 state off
setstate ADAM6060_00D0C9FC434C_sTest 2020-05-30 14:10:12 status connect


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

Danke für die Rückmeldung, den rList-Eintrag bei dem split habe ich jetzt ergänzt (nicht wundern wg. der jsonMap/do1-6:0).

@Rudi: Irgendwie hadre ich immer noch damit, dass wir hier (und evtl. anderswo) diese vielen unnötigen Events haben (und mein Versuch nicht geklappt hat, das via Perl abzustellen, immer noch keine Ahnung, warum; vermutlich ändert der irgendwie im Hintergrund $1?).
Im Moment spukt mir im Kopf der Gedanke rum, ob es nicht Sinn machen würde, json2nameValue() um noch einen Parameter zu ergänzen (event-only-if-changed, default:0). (Wenn man gemischte JSON hat, die Messwerte enthalten (deren Aktualisierung man erfahren will), muß man halt zwei Aufrufe machen und einen Prefix setzen).
Was meinst du?
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

Ich verstehe das eigentliche Problem nicht.

"Zu viele Events" an sich ist kein Problem, hoechstens wenn das zu "FHEM ist nicht schnell genug" fuehrt.
Meine Meinung zu "event-on-change-reading .*" bleibt: ich finde es nur in Ausnahmefaellen gerechtfertigt.

Beta-User

Deine Meinung zu event-on-change-reading teile ich im wesentlichen (auch wenn z.B. martinp876 irgendwo mal die Meinung vertreten hat, dass man bei CUL_HM das Attribut grundsätzlich auf .* setzen solle...).

Hier ist es aber so, dass ich das Senden von allen Zuständen eigentlich für einen Designfehler der Hardware halte. Das Ding hat nur Taster- (oder Schalter-) eingänge und Relais. Daher sollte via MQTT (!) auch immer nur das kommen, was sich geändert hat, nicht immer alles. Alles würde ich nur auf explizite Anforderung senden. Sonst stimmen die Zeitstempel nicht usw. (was z.B. bei ASC Probleme machen kann, allerdings nicht mit einem einzelnen Relay-Zustand).
Das kann man auch hinterher in FHEM reparieren, ist schon klar, aber imo werden wir immer wieder - grade bei den JSON-sprechenden Geräten - mit solchen imo überflüssigen Komplett-Infos "beglückt" werden. Da dann gleich vorne die Schere anzusetzen und wegzuschnippeln, was wir nicht brauchen, ist imo die beste Variante und auch insbesondere "event-on-change-reading" vorzuziehen.

Aber vielleicht übersehe ich mal wieder was wesentliches?
(Wie vorhin geschrieben: Es geht hier nicht um Meßwerte, sondern um Schaltzustände).
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

Ok, jetzt verstanden.
json2nameValue kennt keine Readings, man koennte es hoechstens als neuen MQTT2_DEVICE Attribut definieren, aber dann ziehe ich die globale/fhem.pl event-on-change-reading Variante vor.

Ich frage mich, warum man vermeintliche design-Fehler in FHEM reparieren muss. Ich wuerde das Attribut-Setzen dem Benutzer ueberlassen, und nicht in AttrTemplate aufnehmen. Das ist aber meine private Meinung, und nichtmal als Vorschlag gemeint.

Beta-User

Hmm, an das mit dem "noch-nicht-readings-Status" hatte ich nicht gedacht; ginge aber vermutlich, wenn man als 4. Argument "$name" übergeben könnte. Da json2nameValue() wohl immer der Vorbereitung der Reading-Aktualisierung dienen dürfte, wäre das vermutlich nicht schädlich?

Hatte gestern morgen auch noch rumgetestet, ob ich den zurückgegebenen Hash nochmal in eine loop packen kann und dann prüfen, aber auf die Schnelle wollte mir das nicht gelingen, irgendwas ging da mit den Datentypen schief. (Also falls du statt der "$name"-Variante eine "Routinier-Lösung" für readingList-Perl aus dem Ärmel schütteln magst ;) ).

Und ja, man kann die Frage stellen, ob es Sinn macht, in FHEM die Unzulänglichkeiten diverser Firmwares zu kompensieren. Vermutlich könnte man den Hersteller kontaktieren, aber ob der dann reagiert ist eine andere Frage... Da hat man bei community-Projekten vermutlich eher Chancen, aber auch da nicht immer, denn was ein "Fehler" ist, liegt ja teils auch im Auge des Betrachters. Wie dem auch sei: das zugrundeliegende Thema ist so gelagert, dass es hin und wieder vorkommt (bei dem 8-Kanal-Ethernet-Ding war es ähnlich, allerdings ohne JSON, und auch die shelly sind " Kandidaten").

Was event-on-change... angeht, werde ich das vermutlich als Attribut rausnehmen und bei nächster Gelegenheit einen farewell-Hinweis dazu einbauen. Mal schauen, ob das auch noch an anderer Stelle Sinn macht.
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

ZitatHmm, an das mit dem "noch-nicht-readings-Status" hatte ich nicht gedacht; ginge aber vermutlich, wenn man als 4. Argument "$name" übergeben könnte. Da json2nameValue() wohl immer der Vorbereitung der Reading-Aktualisierung dienen dürfte, wäre das vermutlich nicht schädlich?

Moeglich waere es schon, bloss es gehoert meiner Ansicht nach nicht hin, es waere ein Hack.
Falls event-on-change-reading nicht funktioniert: kannst Du mir zeigen, wie ich das Problem nachstellen kann?

Beta-User

Wann man etwas als Hack bezeichnen kann, würde mich allg. mal interessieren, aber du hast recht, es wäre ggf. eine andere/weitere Funktion, die man explizit nutzen sollte. Ist transparenter.

event-on- funktioniert grundsätzlich so, wie es der Name auch impliziert: Es unterdrückt den event, den trigger. Nicht mehr, nicht weniger. Das ist für "normales Event-Handling" ausreichend. Aber die Reading-Aktialisierung findet trotzdem statt, was bedeutet, dass mind. ReadingsAge was "falsches" behauptet, weil es nicht den letzten Schaltzeitpunkt zurückgibt (das wäre optimal), sondern eben den Zeitpunkt der letzten Aktualisierung. Ob das SetExtensions-Timer "kaputtmacht" kann ich nicht sagen, aber evtl. cberl? (also: setze den Hauptkanal auf "on-for-timer" und drücke dann irgendeine Taste, die damit nichts zu tun hat.

Der Vollständigkeit wegen noch mein nicht funktionierender Schleifen-Test-Code; geht evtl. besser mit map?
defmod ADAM6060_00D0C9FC434C_unified MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_unified IODev m2server
attr ADAM6060_00D0C9FC434C_unified devStateIcon disconnect:rc_STOP@red connect:rc_STOP@green 2.on:on:do2+off 2.off:off:do2+on 3.on:on:do3+off 3.off:off:do3+on 4.on:on:do4+off 4.off:off:do4+on 5.on:on:do5+off 5.off:off:do5+on 6.on:on:do6+off 6.off:off:do6+on
attr ADAM6060_00D0C9FC434C_unified jsonMap do1:state c:0 q:0 s:0 t:0
attr ADAM6060_00D0C9FC434C_unified readingList Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/true/"on"/g;; $EVENT =~ s/false/"off"/g;; my %rets = json2nameValue($EVENT,'',$JSONMAP);; my %cleaned;; for my $k (keys %rets) { if (ReadingsVal($NAME,$k,"unknown") ne $rets{$k}) { $cleaned{$k} = $rets{$k};;} };; return \%cleaned;;}\
Advantech/00D0C9FC434C/Device_Status:.* { json2nameValue($EVENT) }
attr ADAM6060_00D0C9FC434C_unified room Test
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 stateFormat status\
state\
2:do2\
3:do3\
4:do4\
5:do5\
6:do6\
<br>\
DigiIn\
di1\
di2\
di3\
di4\
di5\
di6
attr ADAM6060_00D0C9FC434C_unified webCmd :

Das reagiert aber gar nicht auf unterschiedliche publishes:
mosquitto_pub -h localhost -i test -m '{"s":1,"t":0,"q":192,"c":1,"di1":true,"di2":true,"di3":true,"di4":true,"di5":false,"di6":true,"do1":false,"do2":false,"do3":false,"do4":false,"do5":false,"do6":true}' -t Advantech/00D0C9FC434C/datamosquitto_pub -h localhost -i test -m '{"s":1,"t":0,"q":192,"c":1,"di1":true,"di2":true,"di3":true,"di4":true,"di5":false,"di6":true,"do1":false,"do2":false,"do3":false,"do4":false,"do5":false,"do6":false}' -t Advantech/00D0C9FC434C/data
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

ZitatWann man etwas als Hack bezeichnen kann, würde mich allg. mal interessieren
Hack fuer mich ist etwas, was jemand, der die Architektur eines Programmes kennt, nicht erwartet.
Es gehoert entweder nicht an dieser Stelle oder nicht so geloest.

ZitatAber die Reading-Aktialisierung findet trotzdem statt, was bedeutet, dass mind. ReadingsAge was "falsches" behauptet, weil es nicht den letzten Schaltzeitpunkt zurückgibt (das wäre optimal), sondern eben den Zeitpunkt der letzten Aktualisierung.

Dieses Problem koennte man mit timestamp-on-change-reading verarzten:
ZitatThe attribute takes a comma-separated list of readings. You may use regular expressions in that list. If set, the timestamps of the listed readings will not be changed if event-on-change-reading is also set and it would not create an event for this reading.

rudolfkoenig

ZitatDer Vollständigkeit wegen noch mein nicht funktionierender Schleifen-Test-Code; geht evtl. besser mit map?
json2nameValue liefert eine Referenz auf ein Hash zurueck und nicht ein Hash, ich kriege mit deinem Code "Reference found where even-sized list expected" in Log.

Die Loesung mit map ist etwas kuerzer, aber nicht "richtiger":

Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/true/"on"/g;; $EVENT =~ s/false/"off"/g;; my $rets = json2nameValue($EVENT,'',$JSONMAP);; my %cleaned;; map { $cleaned{$_} = $rets->{$_} if(ReadingsVal($NAME,$_,"unknown") ne $rets->{$_}) } keys %{$rets};; return \%cleaned }


Die grep Variante spart nochmal ein paar Buchstaben:

Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/true/"on"/g;; $EVENT =~ s/false/"off"/g;; my $rets = json2nameValue($EVENT,'',$JSONMAP);; my %cleaned = map { $_,$rets->{$_} } grep { ReadingsVal($NAME,$_,"unknown") ne $rets->{$_} } keys %{$rets};; return \%cleaned }


Beta-User

Doppeltes Danke!

timestamp-on... war mir irgendwie bisher völlig entgangen, aber eigentlich war es logisch, dass es sowas geben muß. (Shame on me!)

Was den Code angeht, hatte ich diverse Varianten ausprobiert und irgendwie mit dem letzten scheinbar gar keine Meldung im FHEM-log (gestern schon, aber mit anderen Varianten; evtl. ist da ein paarmal standby dazwischengekommen). Aber so langsam wird das mir Referenz auf Hash und direkt Hash wieder ein Stückchen klarer, auch wenn das vermutlich noch "ewig" dauern wird, bis ich das soweit intus habe, dass es halbwegs "automatisch" in die richtige Richtung geht mit der Syntax....
Von der Tendenz her würde ich jetzt die map/grep-Fassung einchecken, das sieht mir nach dem "richtigen" Weg hier aus. Oder würdest du alternativ eher den farewell mit (event|timestamp)-on-change-reading-Hinweis bevorzugen?
(Das läßt sich leichter auf ähnliche Fälle übertragen?)
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


cberl

Ich habe jetzt die grep Variante genommen - Funktioniert Bestens: Jetzt werden nur noch die Readings aktualisiert, wo auch was passiert.

Vielen Dank Euch Beiden!
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

Hallo, Danke für die Rückmeldung; hatte diese Variante zwischenzeitlich eingecheckt und den Code gleich noch hier zum "recycling" vorgeschlagen: https://forum.fhem.de/index.php/topic,111711.msg1060727.html#msg1060727...

Vielleicht magst du bei Gelegenheit nochmal die jetzige split-Variante testen, da habe ich noch ein paar Kleinigkeiten geändert, die ggf. dann auch weiter ausgerollt werden.
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, auch die Split Variante funktioniert Bestens. Hier noch das RAW des Sammeldevice:

defmod ADAM6060_00D0C9FC434C_sTest MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_sTest IODev MQTT2Client
attr ADAM6060_00D0C9FC434C_sTest comment Channel 1 for ADAM6060_00D0C9FC434C_sTest, see also ADAM6060_00D0C9FC434C_sTest_CH2, ADAM6060_00D0C9FC434C_sTest_CH3, ADAM6060_00D0C9FC434C_sTest_CH4, ADAM6060_00D0C9FC434C_sTest_CH5 and ADAM6060_00D0C9FC434C_sTest_CH6
attr ADAM6060_00D0C9FC434C_sTest devStateIcon disconnect:rc_STOP@red connect:rc_STOP@green
attr ADAM6060_00D0C9FC434C_sTest disable 0
attr ADAM6060_00D0C9FC434C_sTest genericDeviceType switch
attr ADAM6060_00D0C9FC434C_sTest icon on
attr ADAM6060_00D0C9FC434C_sTest jsonMap do1:state do2:0 do3:0 do4:0 do5:0 do6:0 c:0 q:0 s:0 t:0
attr ADAM6060_00D0C9FC434C_sTest model 6channel_ethernet_board_6input_split
attr ADAM6060_00D0C9FC434C_sTest readingList Advantech/00D0C9FC434C/data:.* { $EVENT =~ s/true/"on"/g;;;; $EVENT =~ s/false/"off"/g;;;; my $rets = json2nameValue($EVENT,'',$JSONMAP);;;; my %cleaned = map { $_,$rets->{$_} } grep { ReadingsVal($NAME,$_,"unknown") ne $rets->{$_} } keys %{$rets};;;; return \%cleaned }\
  Advantech/00D0C9FC434C/Device_Status:.* { json2nameValue($EVENT) }
attr ADAM6060_00D0C9FC434C_sTest room 82.MQTT
attr ADAM6060_00D0C9FC434C_sTest setExtensionsEvent 1
attr ADAM6060_00D0C9FC434C_sTest setList on:noArg Advantech/00D0C9FC434C/ctl/do1:r {"v":true}\
  off:noArg Advantech/00D0C9FC434C/ctl/do1:r {"v":false}
attr ADAM6060_00D0C9FC434C_sTest stateFormat status\
state\
<br>\
DigiIn\
di1\
di2\
di3\
di4\
di5\
di6
attr ADAM6060_00D0C9FC434C_sTest webCmd :

setstate ADAM6060_00D0C9FC434C_sTest connect\
off\
<br>\
DigiIn\
on\
on\
on\
on\
off\
on
setstate ADAM6060_00D0C9FC434C_sTest 2020-06-05 17:16:17 associatedWith ADAM6060_00D0C9FC434C_sTest_CH1,ADAM6060_00D0C9FC434C_sTest_CH2,ADAM6060_00D0C9FC434C_sTest_CH3,ADAM6060_00D0C9FC434C_sTest_CH4,ADAM6060_00D0C9FC434C_sTest_CH5,ADAM6060_00D0C9FC434C_sTest_CH6
setstate ADAM6060_00D0C9FC434C_sTest 2020-06-05 17:16:17 attrTemplateVersion 20200602
setstate ADAM6060_00D0C9FC434C_sTest 2020-06-05 17:16:33 di1 on
setstate ADAM6060_00D0C9FC434C_sTest 2020-06-05 17:16:33 di2 on
setstate ADAM6060_00D0C9FC434C_sTest 2020-06-05 17:16:33 di3 on
setstate ADAM6060_00D0C9FC434C_sTest 2020-06-05 17:16:33 di4 on
setstate ADAM6060_00D0C9FC434C_sTest 2020-06-05 17:20:34 di5 off
setstate ADAM6060_00D0C9FC434C_sTest 2020-06-05 17:16:33 di6 on
setstate ADAM6060_00D0C9FC434C_sTest 2020-06-05 17:20:05 ipaddr 192.168.50.54
setstate ADAM6060_00D0C9FC434C_sTest 2020-06-05 17:20:05 macid 00D0C9FC434C
setstate ADAM6060_00D0C9FC434C_sTest 2020-06-05 17:20:05 name ADAM6060
setstate ADAM6060_00D0C9FC434C_sTest 2020-06-05 17:16:51 state off
setstate ADAM6060_00D0C9FC434C_sTest 2020-06-05 17:20:05 status connect


Und das Einzeldevice:

defmod ADAM6060_00D0C9FC434C_sTest_CH2 MQTT2_DEVICE
attr ADAM6060_00D0C9FC434C_sTest_CH2 IODev MQTT2Client
attr ADAM6060_00D0C9FC434C_sTest_CH2 comment Channel 2 for ADAM6060_00D0C9FC434C_sTest, see also ADAM6060_00D0C9FC434C_sTest, ADAM6060_00D0C9FC434C_sTest_CH3, ADAM6060_00D0C9FC434C_sTest_CH4, ADAM6060_00D0C9FC434C_sTest_CH5 and ADAM6060_00D0C9FC434C_sTest_CH6
attr ADAM6060_00D0C9FC434C_sTest_CH2 devStateIcon disconnect:rc_STOP@red connect:rc_STOP@green
attr ADAM6060_00D0C9FC434C_sTest_CH2 disable 0
attr ADAM6060_00D0C9FC434C_sTest_CH2 genericDeviceType switch
attr ADAM6060_00D0C9FC434C_sTest_CH2 icon on
attr ADAM6060_00D0C9FC434C_sTest_CH2 jsonMap do1:state do2:0 do3:0 do4:0 do5:0 do6:0 c:0 q:0 s:0 t:0
attr ADAM6060_00D0C9FC434C_sTest_CH2 model 6channel_ethernet_board_6input_split
attr ADAM6060_00D0C9FC434C_sTest_CH2 readingList Advantech/00D0C9FC434C/data:.* { $EVENT =~ m/do2":(true)/g;;;; my $newstate = $1 ? "on" : "off";;;; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr ADAM6060_00D0C9FC434C_sTest_CH2 room 82.MQTT
attr ADAM6060_00D0C9FC434C_sTest_CH2 setExtensionsEvent 1
attr ADAM6060_00D0C9FC434C_sTest_CH2 setList on:noArg Advantech/00D0C9FC434C/ctl/do2:r {"v":true}\
  off:noArg Advantech/00D0C9FC434C/ctl/do2:r {"v":false}
attr ADAM6060_00D0C9FC434C_sTest_CH2 webCmd :

setstate ADAM6060_00D0C9FC434C_sTest_CH2 off
setstate ADAM6060_00D0C9FC434C_sTest_CH2 2020-06-05 17:16:17 associatedWith ADAM6060_00D0C9FC434C_sTest,ADAM6060_00D0C9FC434C_sTest_CH1,ADAM6060_00D0C9FC434C_sTest_CH3,ADAM6060_00D0C9FC434C_sTest_CH4,ADAM6060_00D0C9FC434C_sTest_CH5,ADAM6060_00D0C9FC434C_sTest_CH6
setstate ADAM6060_00D0C9FC434C_sTest_CH2 2020-06-05 17:16:17 attrTemplateVersion 20200602
setstate ADAM6060_00D0C9FC434C_sTest_CH2 2020-06-05 17:22:22 state off

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

Danke für die Rückmeldung!

(dann werde ich demnächst wohl noch ein paar andere split-Varianten umbauen und beim Rest ruhiger schlafen :) ).
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