8fach I/O Board mit MQTT2_Device

Begonnen von cberl, 23 Januar 2020, 17:41:19

Vorheriges Thema - Nächstes Thema

cberl

Hallo in die Runde,

ich habe mir in der Bucht ein 8x I/O Relais Board für 60€ geholt:
https://www.ebay.de/itm/8in8-out-Network-Relay-Controller-WEB-TCP-UDP-Support-Offline-Timer-MQTT-xs90/153347308210?hash=item23b4363ab2:g:RL0AAOSwOShcRWlR
Das WebIf kann auf Englisch gestellt werden.

Die Relais kann ich per http steuern und abfragen. Nun bin ich noch auf eine versteckte Konfigseite für MQTT gestoßen, wo ich den Broker vom Chinamann auf meinen eigenen drehen kann.
Das Topic (per Default die Seriennummer 0218091547293896) kann ich auch (bis max. 16 Zeichen) anpassen. Mehr geht da leider nicht. 

Ein Subscribe funktioniert:
Bei einem Schaltvorgang sendet das Teil einen JSON
Wenn ein Relay bzw. Input on ist, steht die jeweilige Ziffer auf 1:

Alles aus:                                                {"cmd":"post","output":"00000000","input":"00000000","sn":"0218091547293896"}
Relais3 per WebIf auf On gesetzt:             {"cmd":"post","output":"00100000","input":"00000000","sn":"0218091547293896"}
Relais2 mit Eingang am Board geschalten: {"cmd":"post","output":"01000000","input":"01000000","sn":"0218091547293896"}

Ein Publish ist mir aber noch nicht gelungen (kann ja die Relais notfalls per http steuern).
Gibt wohl auch eine App mit der das Teil über die Chinacloud gesteuert werden kann. Verschlüsselung gibt`s da nicht. Also könnte ich das vielleicht sniffen.
Mangels Chin. Sprachkentnissen habe ich das aber erstmal gelassen.

Für das Board habe ich mir ein MQTT2 Device angelegt, welches mir auch schön den JSON zerlegt:

Internals:
   CFGFN     
   DEVICETOPIC EIOBoard1
   FUUID      5e28b7a8-f33f-51cc-8ed1-1634b5eb89a81169
   IODev      MQTT2Client
   LASTInputDev MQTT2Client
   MQTT2Client_MSGCNT 1146
   MQTT2Client_TIME 2020-01-23 17:02:41
   MSGCNT     1146
   NAME       EIOBoard1
   NR         123583
   STATE      ???
   TYPE       MQTT2_DEVICE
   READINGS:
     2020-01-23 17:02:41   cmd             post
     2020-01-23 17:02:41   input           00000000
     2020-01-23 17:02:41   output          00000000
     2020-01-23 17:02:41   sn              0218091547293896
Attributes:
   IODev      MQTT2Client
   readingList 0218091547293896state:.* { json2nameValue($EVENT) }
   room       82.MQTT


Nun hätte ich gerne noch jedes Zeichen von input und output in einem einzelnen Reading.
Wie bekomme ich das am Besten hin? Hat vielleicht noch jemand eine Idee zum Publish?

Bye 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

rudolfkoenig

ZitatNun hätte ich gerne noch jedes Zeichen von input und output in einem einzelnen Reading.
Mir faellt dazu ein langes userReadings ein:attr EIOBoard1 userReadings in1:input:.* { $event =~ m/(.).......$/;;$1 }, in2:input:.* { $event =~ m/.(.)......$/;;$1 }, in3:input {usw....


ZitatHat vielleicht noch jemand eine Idee zum Publish?
Mit MQTT2_SERVER koennte man das subscription der Gegenseite ausgeben (list .* subscriptions), und dann raten.
Was Vergleichbares duerfte auch bei jedem externen MQTT-Server gehen.

Beta-User

MMn. wäre die "Vollversion", das ganze mit einem myUtils-Code auszuwerten. Soweit ich das verstanden habe, kommen ja bei jeder Änderung immer alle Ifos, so dass man nicht unterscheiden kann, was neu und was alt ist...

Der myUtils-Code müßte dann aussortieren, was nicht geändert ist, und dann eben für jeden Kanal ein eigenes Reading setzen, indem nur die entsprechenden Werte in den Rückgabehash übernommen werden.

Etwas in diese Richtung geht tasmota_use_DS18x20_id, aber das hier wäre deutlich komplexer...

(Wäre m.E. aber lohnenswert, das "richtig" zu machen, denn es ist was mit einem Kabel...! Schade, dass die firmware nicht dokumentiert ist, aber evtl. findet sich auch jemand, der rausfindet, was es für eine mcu ist und wie man die flasht ;) .)
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

Die Lösung mit dem userreading funktioniert prima. Danke.

Und Ja - Ich bin auch ein großer Fan von verkabelter Technik.

Eine andere Firmware dürfte schwierig werden: Da ist ein Cortex-m3 drauf und auf dem kleinen Kamerad steht 7ca6xtg3/83848ks0, Optokoppler für die Eingänge - Die Platine ist ordentlich aufgebaut.
Mit http und mqtt kann ich das Teil ausreichend gut steuern & auslesen. Eigentlich ein cooles Teil für 57€.
Ins Internet lasse ich es aber nicht :-)

Anbei noch ein paar Bilder.
Es gibt auch ein PDF zu der TCP Schnittstelle auf Chinesisch. Mit dem Google Translator ist das aber recht verständlich.
Vielleicht kanns noch jemand gebrauchen:

Die Relay werden so geschalten:
http://192.168.48.122/relay_en.cgi?relayon1=on
http://192.168.48.122/relay_en.cgi?relayoff1=off
Die mqtt Seite gibts unter http://192.168.48.122/zm.cgi

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

cberl

#4
Das Teil kann jetzt komplett über mqtt gesteuert werden:

Das Subscribe auf: 0218091547293896state
Und ein Publish auf z.B. 0218091547293896ctr setr=1001000
schaltet das erste und das vierte Relais.

Ein x lässt das jeweilige Relais im ursprünglichen Zustand z.B. xxxx1xxx schaltet dann nur das Relais 5 ein
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

Kannst du bitte nochmal ein RAW-list von dem ganzen Device einstellen?

Das Ding ist wirklich interessant, und irgendwie werde ich den Verdacht nicht los, dass das heute noch nicht so richtig ausentwickelt ist...

Du hast ja z.B. eine Aktualisierung des Zeitstempels aller In- und Outputs, wenn sich nur einer ändert, oder? Da ist bestimmt was zu machen...!
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

Da ist unbestritten noch Brach liegendes Potential da.

Hier das List:

Internals:
   DEVICETOPIC EIOBoard1_M2
   FUUID      5e28b7a8-f33f-51cc-8ed1-1634b5eb89a81169
   IODev      MQTT2Client
   LASTInputDev MQTT2Client
   MQTT2Client_MSGCNT 60
   MQTT2Client_TIME 2020-02-10 18:25:22
   MSGCNT     60
   NAME       EIOBoard1_M2
   NR         1473
   STATE      Input: 00000000 Relais: 00000000
   TYPE       MQTT2_DEVICE
   READINGS:
     2020-02-10 18:25:22   cmd             post
     2020-02-10 18:25:22   in1             0
     2020-02-10 18:25:22   in2             0
     2020-02-10 18:25:22   in3             0
     2020-02-10 18:25:22   in4             0
     2020-02-10 18:25:22   in5             0
     2020-02-10 18:25:22   in6             0
     2020-02-10 18:25:22   in7             0
     2020-02-10 18:25:22   in8             0
     2020-02-10 18:25:22   input           00000000
     2020-02-10 18:25:22   out1            0
     2020-02-10 18:25:22   out2            0
     2020-02-10 18:25:22   out3            0
     2020-02-10 18:25:22   out4            0
     2020-02-10 18:25:22   out5            0
     2020-02-10 18:25:22   out6            0
     2020-02-10 18:25:22   out7            0
     2020-02-10 18:25:22   out8            0
     2020-02-10 18:25:22   output          00000000
     2020-02-10 18:25:22   sn              /Home/EIOBoard1
Attributes:
   IODev      MQTT2Client
   readingList /Home/EIOBoard1state:.* { json2nameValue($EVENT) }
   room       82.MQTT
   stateFormat Input: input Relais: output
   userReadings in1:input:.* { $event =~ m/(.).......$/;;$1 }, in2:input:.* { $event =~ m/.(.)......$/;;$1 }, in3:input:.* { $event =~ m/..(.).....$/;;$1 }, in4:input:.* { $event =~ m/...(.)....$/;;$1 }, in5:input:.* { $event =~ m/....(.)...$/;;$1 }, in6:input:.* { $event =~ m/.....(.)..$/;;$1 }, in7:input:.* { $event =~ m/......(.).$/;;$1 }, in8:input:.* { $event =~ m/.......(.)$/;;$1 } , out1:output:.* { $event =~ m/(.).......$/;;$1 }, out2:output:.* { $event =~ m/.(.)......$/;;$1 }, out3:output:.* { $event =~ m/..(.).....$/;;$1 }, out4:output:.* { $event =~ m/...(.)....$/;;$1 }, out5:output:.* { $event =~ m/....(.)...$/;;$1 }, out6:output:.* { $event =~ m/.....(.)..$/;;$1 }, out7:output:.* { $event =~ m/......(.).$/;;$1 }, out8:output:.* { $event =~ m/.......(.)$/;;$1 }


Bislang gibts nur den Status der Ein- & Ausgänge.

Das Publish über setlist ist bei 8x on & off recht unübersichtlich.
Eine einfache Möglichkeit wäre ja, für jedes Relais ein eigenes Device anzulegen. Viel schicker wäre aber ein Device für alle Relais.

Hier ein Publish: /Home/EIOBoard1ctr setr=xx1xxxxx
Und hier das Subscribe: /Home/EIOBoard1state/#   {"cmd":"post","output":"00100000","input":"00000000","sn":"/Home/EIOBoard1"}

Damit es nicht zu einfach wird: Die Eingänge schalten direkt die Ausgänge. Wenn ein Eingang auf high / on liegt, schaltet das Relais auf on.
Kommt nun per mqtt ein off, gewinnt der letzte Befehl also hier mqtt. Das sieht dann so aus:
{"cmd":"post","output":"00000000","input":"00100000","sn":"/Home/EIOBoard1"}

Und anders herum: Bei einem on per mqtt kann das auch wieder über ein on und off am Eingang abgeschalten werden. Hoffe, ich habe mich verständlich ausgedrückt :-)



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

ZitatViel schicker wäre aber ein Device für alle Relais.
Das bedeutet viel Bastelarbeit, weil alle Voreinstellungen in FHEM fuer Einzelschalter ausgelegt sind.
Ich sehe z.Bsp. bei Mehrfachschalter "Herausforderungen" bei der FHEMWEB Anzeige, SetExtensions oder bei den Sprachassistenten.

Fuer ein gute FHEM-Integration muesste das Geraet ueber ein bridge-device in Einzelschalter aufgesplittet werden: das ist zwar Arbeit, dafuer sind die anderen Sachen schon geloest. Die Frage ist, ob der Aufwand sich lohnt, d.h. viele Benutzer die o.g. Features haben wollen.

Beta-User

Na ja, am Ende muß man bei dem Teil wohl immer alle einzelnen Relaisstände kennen, sonst kann man den Sendecommand nicht bauen, oder? Dann ist es (auch angesichts der nicht allzuhohen zu erwartenden Nutzerzahlen) m.E. einfacher, ein Einheitsdevice zu haben und die einzelnen Kanäle z.B. über je einen ReadingsProxy zu visualisieren...

Da die inputs immer die outputs schalten, sich aber nicht getrennt nutzen lassen (?), würde ich vorschlagen, die zu ignorieren, wichtig ist eigentlich nur, dass der out-Zustand korrekt ist, oder?

Dann könnte man z.B. jsonMap verwenden und input wegfiltern:

attr EIOBoard1_M2  readingList /Home/EIOBoard1state:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr EIOBoard1_M2 jsonMap input:0

Man könnte den Rest auch über eine myUtils-sub machen, oder weiter über die userReadings. Sowas hier (ungetestet) sollte nur Änderungen durchlassen:
out1:output:.* { $event =~ m/(.).......$/;;ReadingsVal($name,"out1",undef) ne $1 ? $1 : undef }

Für die setList wird es "spaßiger", da könnten wir z.B. substr verwenden, um den aus dem "output"-Reading zusammenzubasteln.

Also z.B. (ebenfalls ungetestet) in diese Richtung:
attr EIOBoard1_M2 setList out2:0,1  {my $output = ReadingsVal($name,"output","00000000");; my $start = substr $output, 1;; my $end = substr $output, -6;; ( "/Home/EIOBoard1ctr setr=$start" . $EVTPART1 . $end  }
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
Stimmt - der Zustand der Eingänge ist nicht wirklich wichtig. Die Eingänge haben letzendlich immer Einfluss auf die Ausgänge.

Das userReadings funktioniert tadellos, es wird nun nur das jeweilige Reading aktualisiert.
Beim setList gehts noch durcheinander:

set EIOBoard1_M2 out2 1 - schaltet Relais8 Ein
set EIOBoard1_M2 out2 1 - Relais8 bleibt Ein und Relais7 Ein
set EIOBoard1_M2 out2 1 - Relais8+7 bleiben Ein und Relais6 Ein
set EIOBoard1_M2 out2 1 - Relais8+7+6 bleiben Ein und Relais5 Ein
set EIOBoard1_M2 out2 1 - Relais8+7+6+5 bleiben Ein und Relais4 Ein
set EIOBoard1_M2 out2 0 - Relais8+7+6+5+4 bleiben Ein und Relais3 Ein
set EIOBoard1_M2 out2 0 - Relais8+7+6+5+4+3 bleiben Ein und Relais2 Ein
..

Internals:
   CFGFN     
   DEVICETOPIC EIOBoard1_M2
   FUUID      5e41ad70-f33f-51cc-62f7-9eb635047492dbe4
   IODev      MQTT2Client
   LASTInputDev MQTT2Client
   MQTT2Client_MSGCNT 142
   MQTT2Client_TIME 2020-02-10 21:09:16
   MSGCNT     142
   NAME       EIOBoard1_M2
   NR         31321
   STATE      out2
   TYPE       MQTT2_DEVICE
   JSONMAP:
     input      0
   READINGS:
     2020-02-10 21:09:16   cmd             post
     2020-02-10 20:49:05   out1            0
     2020-02-10 21:09:02   out2            1
     2020-02-10 21:08:50   out3            0
     2020-02-10 21:09:01   out4            0
     2020-02-10 21:06:44   out5            0
     2020-02-10 21:06:44   out6            0
     2020-02-10 21:05:16   out7            0
     2020-02-10 21:03:13   out8            0
     2020-02-10 21:09:16   output          01000000
     2020-02-10 21:09:16   sn              /Home/EIOBoard1
     2020-02-10 21:05:16   state           out2
Attributes:
   IODev      MQTT2Client
   jsonMap    input:0
   readingList /Home/EIOBoard1state:.* { json2nameValue($EVENT,'',$JSONMAP) }
   room       82.MQTT
   setList    out2:0,1  {my $output = ReadingsVal($NAME,"output","00000000");; my $start = substr $output, 1;; my $end = substr $output, -6;; ( "/Home/EIOBoard1ctr setr=$start" . $EVTPART1 . $end)}
   userReadings out1:output:.* { $event =~ m/(.).......$/;;ReadingsVal($name,"out1",undef) ne $1 ? $1 : undef }, out2:output:.* { $event =~ m/.(.)......$/;;ReadingsVal($name,"out2",undef) ne $1 ? $1 : undef }, out3:output:.* { $event =~ m/..(.).....$/;;ReadingsVal($name,"out3",undef) ne $1 ? $1 : undef }, out4:output:.* { $event =~ m/...(.)....$/;;ReadingsVal($name,"out4",undef) ne $1 ? $1 : undef }, out5:output:.* { $event =~ m/....(.)...$/;;ReadingsVal($name,"out5",undef) ne $1 ? $1 : undef }, out6:output:.* { $event =~ m/.....(.)..$/;;ReadingsVal($name,"out6",undef) ne $1 ? $1 : undef }, out7:output:.* { $event =~ m/......(.).$/;;ReadingsVal($name,"out7",undef) ne $1 ? $1 : undef }, out8:output:.* { $event =~ m/.......(.)$/;;ReadingsVal($name,"out8",undef) ne $1 ? $1 : undef }

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

Hm, da fehlte wohl noch eine 0, in substr...
my $start = substr $output, 0, 1

Sollte mit regex eigentlich auch einfacher gehen (mal wieder ungetestet):
setList    out2:0,1  {my $output = ReadingsVal($NAME,"output","00000000");; $output = $output =~ "s/([01]{1})[01]([01]{6})/\\1$EVTPART1\\2/g";; "/Home/EIOBoard1ctr setr=$output"}
Und nachdem ich das überschlafen habe, gebe ich Rudi recht: wir sollten direkt versuchen, da 8 einkanalige MQTT2-Devices draus zu basteln. Muß mal etwas hirnen, aber das sollte eigentlich kein größeres Problem sein.

Bitte zukünftig RAW-lists (list -r oder der entsprechende Button unter dem Device), das ist für mich einfacher zu transferieren...
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

#11
Zum Testen mal ein Versuch mit zwei Kanälen:

name:8channel_ethernet_board_split
filter:TYPE=MQTT2_DEVICE
desc:Configures a 8 channel relay board see <a href="https://forum.fhem.de/index.php/topic,107536.msg1016379.html#msg1016379">Forum Thread</a> for more info about the hardware and basic MQTT configuration.<br>NOTE: This will create some new devices for the other channels!
order:C_01
par:STATETOPIC;State topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]+state):, ? "$1" : undef }
par:CMNDTOPIC;Command topic prefix, without trailing /;{ AttrVal("DEVICE","readingList","") =~ m,([^:]+)state:, ? "${1}ctr" : undef }
attr DEVICE model 8channel_ethernet_board_split
attr DEVICE readingList \
  STATETOPIC:.* { $EVENT =~ m,output...([01]{8}), ? {"output"=>$1} : undef }\
  STATETOPIC:.* { $EVENT =~ m,output...([01])([01]{7}), ? $1 ? {"state"=>"on"} : {"state"=>"off"} : undef }
attr DEVICE setList \
  off:noArg  { my $output = ReadingsVal($NAME,"output","00000000");; $output =~ s/[01]([01]{7})/0\\1/g;; "CMNDTOPIC setr=$output" }\
  on:noArg   { my $output = ReadingsVal($NAME,"output","00000000");; $output =~ s/[01]([01]{7})/1\\1/g;; "CMNDTOPIC setr=$output"}
attr DEVICE comment Channel 1 for DEVICE, see also DEVICE_CH2
deletereading -q DEVICE (?!associatedWith).*
attr DEVICE setStateList on off
setreading DEVICE associatedWith DEVICE_CH2
set DEVICE attrTemplate mqtt2_speech_recognition_type_switch
attr DEVICE model 8channel_ethernet_board_split
copy DEVICE DEVICE_CH2
attr DEVICE_CH2 readingList \
  STATETOPIC:.* { $EVENT =~ m,output...([01]{8}), ? {"output"=>$1} : undef }\
  STATETOPIC:.* { $EVENT =~ m,output...[01]([01])([01]{6}), ? $1 ? {"state"=>"on"} : {"state"=>"off"} : undef }
attr DEVICE_CH2 setList \
  off:noArg  { my $output = ReadingsVal($NAME,"output","00000000");; $output =~ s/([01])[01]([01]{6})/\\10\\2/g;; "CMNDTOPIC setr=$output" }\
  on:noArg   { my $output = ReadingsVal($NAME,"output","00000000");; $output =~ s/([01])[01]([01]{6})/\\11\\2/g;; "CMNDTOPIC setr=$output"}


Hoffe mal, das mit dem Regexen klappt, ich bin da immer noch etwas unsicher, was wo landet... ::)

Anleitung für den Umgang mit dem Code an sich ist hier: https://wiki.fhem.de/wiki/AttrTemplate
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

Cool, es nimmt Gestalt an. Er landet aber noch nicht ganz richtig:

set EIOBoard1_M2 attrTemplate 8channel_ethernet_board_split /Home/EIOBoard1state /Home/EIOBoard1ctr
#
set EIOBoard1_M2 on -> schaltet Relays1 und Relays3 Ein

/Home/EIOBoard1ctr setr=1\1
/Home/EIOBoard1state {"cmd":"setr","output":"10100000","input":"00000000","sn":"/Home/EIOBoard1"}
/Home/EIOBoard1state {"cmd":"post","output":"10100000","input":"00000000","sn":"/Home/EIOBoard1"}
#
>list -r EIOBoard1_M2
define EIOBoard1_M2 MQTT2_DEVICE
attr EIOBoard1_M2 IODev MQTT2Client
attr EIOBoard1_M2 comment Channel 1 for EIOBoard1_M2, see also EIOBoard1_M2_CH2
attr EIOBoard1_M2 genericDeviceType switch
attr EIOBoard1_M2 model 8channel_ethernet_board_split
attr EIOBoard1_M2 readingList /Home/EIOBoard1state:.* { $EVENT =~ m,output...([01]{8}), ? {"output"=>$1} : undef }\
  /Home/EIOBoard1state:.* { $EVENT =~ m,output...([01])([01]{7}), ? $1 ? {"state"=>"on"} : {"state"=>"off"} : undef }
attr EIOBoard1_M2 room 82.MQTT
attr EIOBoard1_M2 setList off:noArg  { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/[01]([01]{7})/0\\1/g;;;; "/Home/EIOBoard1ctr setr=$output" }\
  on:noArg   { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/[01]([01]{7})/1\\1/g;;;; "/Home/EIOBoard1ctr setr=$output"}
attr EIOBoard1_M2 setStateList on off

setstate EIOBoard1_M2 on
setstate EIOBoard1_M2 2020-02-11 21:48:23 associatedWith EIOBoard1_M2_CH2
setstate EIOBoard1_M2 2020-02-11 21:58:52 output 10100000
setstate EIOBoard1_M2 2020-02-11 21:58:52 state on


set EIOBoard1_M2 off -> Relays1 AUS, Relays3 bleibt EIN

/Home/EIOBoard1ctr setr=0\1
/Home/EIOBoard1state {"cmd":"setr","output":"00100000","input":"00000000","sn":"/Home/EIOBoard1"}
/Home/EIOBoard1state {"cmd":"post","output":"00100000","input":"00000000","sn":"/Home/EIOBoard1"}

>list -r EIOBoard1_M2
defmod EIOBoard1_M2 MQTT2_DEVICE
attr EIOBoard1_M2 IODev MQTT2Client
attr EIOBoard1_M2 comment Channel 1 for EIOBoard1_M2, see also EIOBoard1_M2_CH2
attr EIOBoard1_M2 genericDeviceType switch
attr EIOBoard1_M2 model 8channel_ethernet_board_split
attr EIOBoard1_M2 readingList /Home/EIOBoard1state:.* { $EVENT =~ m,output...([01]{8}), ? {"output"=>$1} : undef }\
  /Home/EIOBoard1state:.* { $EVENT =~ m,output...([01])([01]{7}), ? $1 ? {"state"=>"on"} : {"state"=>"off"} : undef }
attr EIOBoard1_M2 room 82.MQTT
attr EIOBoard1_M2 setList off:noArg  { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/[01]([01]{7})/0\\1/g;;;; "/Home/EIOBoard1ctr setr=$output" }\
  on:noArg   { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/[01]([01]{7})/1\\1/g;;;; "/Home/EIOBoard1ctr setr=$output"}
attr EIOBoard1_M2 setStateList on off

setstate EIOBoard1_M2 off
setstate EIOBoard1_M2 2020-02-11 21:48:23 associatedWith EIOBoard1_M2_CH2
setstate EIOBoard1_M2 2020-02-11 22:02:54 output 00100000
setstate EIOBoard1_M2 2020-02-11 22:02:54 state off


set EIOBoard1_M2_CH2 on -> schaltet Relays2 und Relays3 EIN

/Home/EIOBoard1ctr setr=\11\2
/Home/EIOBoard1state {"cmd":"setr","output":"01101000","input":"00000000","sn":"/Home/EIOBoard1"}
/Home/EIOBoard1state {"cmd":"post","output":"01100000","input":"00000000","sn":"/Home/EIOBoard1"}

>list -r EIOBoard1_M2_CH2
defmod EIOBoard1_M2_CH2 MQTT2_DEVICE
attr EIOBoard1_M2_CH2 IODev MQTT2Client
attr EIOBoard1_M2_CH2 comment Channel 1 for EIOBoard1_M2, see also EIOBoard1_M2_CH2
attr EIOBoard1_M2_CH2 genericDeviceType switch
attr EIOBoard1_M2_CH2 model 8channel_ethernet_board_split
attr EIOBoard1_M2_CH2 readingList /Home/EIOBoard1state:.* { $EVENT =~ m,output...([01]{8}), ? {"output"=>$1} : undef }\
  /Home/EIOBoard1state:.* { $EVENT =~ m,output...[01]([01])([01]{6}), ? $1 ? {"state"=>"on"} : {"state"=>"off"} : undef }
attr EIOBoard1_M2_CH2 room 82.MQTT
attr EIOBoard1_M2_CH2 setList off:noArg  { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/([01])[01]([01]{6})/\\10\\2/g;;;; "/Home/EIOBoard1ctr setr=$output" }\
  on:noArg   { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/([01])[01]([01]{6})/\\11\\2/g;;;; "/Home/EIOBoard1ctr setr=$output"}
attr EIOBoard1_M2_CH2 setStateList on off

setstate EIOBoard1_M2_CH2 on
setstate EIOBoard1_M2_CH2 2020-02-11 22:06:59 output 01100000
setstate EIOBoard1_M2_CH2 2020-02-11 22:06:59 state on


set EIOBoard1_M2_CH2  off -> Relays2 bleibt EIN, Relays3 AUS

/Home/EIOBoard1ctr setr=\10\2
/Home/EIOBoard1state {"cmd":"setr","output":"01001000","input":"00000000","sn":"/Home/EIOBoard1"}
/Home/EIOBoard1state {"cmd":"post","output":"01000000","input":"00000000","sn":"/Home/EIOBoard1"}
>list -r EIOBoard1_M2_CH2
defmod EIOBoard1_M2_CH2 MQTT2_DEVICE
attr EIOBoard1_M2_CH2 IODev MQTT2Client
attr EIOBoard1_M2_CH2 comment Channel 1 for EIOBoard1_M2, see also EIOBoard1_M2_CH2
attr EIOBoard1_M2_CH2 genericDeviceType switch
attr EIOBoard1_M2_CH2 model 8channel_ethernet_board_split
attr EIOBoard1_M2_CH2 readingList /Home/EIOBoard1state:.* { $EVENT =~ m,output...([01]{8}), ? {"output"=>$1} : undef }\
  /Home/EIOBoard1state:.* { $EVENT =~ m,output...[01]([01])([01]{6}), ? $1 ? {"state"=>"on"} : {"state"=>"off"} : undef }
attr EIOBoard1_M2_CH2 room 82.MQTT
attr EIOBoard1_M2_CH2 setList off:noArg  { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/([01])[01]([01]{6})/\\10\\2/g;;;; "/Home/EIOBoard1ctr setr=$output" }\
  on:noArg   { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/([01])[01]([01]{6})/\\11\\2/g;;;; "/Home/EIOBoard1ctr setr=$output"}
attr EIOBoard1_M2_CH2 setStateList on off

setstate EIOBoard1_M2_CH2 on
setstate EIOBoard1_M2_CH2 2020-02-11 22:10:10 output 01000000
setstate EIOBoard1_M2_CH2 2020-02-11 22:10:10 state on



Seltsam ist auch die fünfte Ziffer in 01001000 bei setr, im post passt es dann aber wieder
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

#13
 ::) Hmm, so ist das, wenn man Dinge aus dem INet kopiert und nicht alles selbst vorab testet...

Die Ersetzungsschreibweise \\ für die Parameter ist wohl Mist, das muß wohl "ganz normal" $1 bzw. $2 sein:
attr EIOBoard1_M2 setList off:noArg  { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/[01]([01]{7})/0$1/g;;;; "/Home/EIOBoard1ctr setr=$output" }\
  on:noArg   { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/[01]([01]{7})/1$1/g;;;; "/Home/EIOBoard1ctr setr=$output"}

attr EIOBoard1_M2_CH2 setList off:noArg  { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/([01])[01]([01]{6})/$10$2/g;;;; "/Home/EIOBoard1ctr setr=$output" }\
  on:noArg   { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/([01])[01]([01]{6})/$11$2/g;;;; "/Home/EIOBoard1ctr setr=$output"}


Und bei der readingList zu "state" muß ich auch nochmal nachbessern, da muß erst nachgesehen werden, was der derzeitige ist. Ungetestetes Muster:
  /Home/EIOBoard1state:.* { my $newstate = $EVENT =~ m,output...([01])([01]{7}), ? $1 ? "on" : "off";;;; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }

Kannst du auch (wenn es funktioniert, dann) nochmal testen, ob man wirklich so viele escapte ; braucht (";;"). Kommt mir etwas viel vor...

Stimme aber zu: Jetzt ist es auf dem richtigen Weg, Danke für die Geduld!
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

Vielen Dank, dass Du Dich diesem Thema annimmst. Was auch immer ich dazu beitragen kann, das mache ich gerne.

Bei dem readingList bekomme ich einen Fehler:

syntax error at (eval 12023334) line 1, at EOF
Global symbol "$newstate" requires explicit package name (did you forget to declare "my $newstate"?) at (eval 12023334) line 1.

Beim setList werden in der GUI nur zwei ;; angezeigt. Im RAW hingegen ;;;;

CH1 funktioniert:

>set EIOBoard1_M2 on
/Home/EIOBoard1ctr setr=10000000
/Home/EIOBoard1state {"cmd":"setr","output":"10000000","input":"00000000","sn":"/Home/EIOBoard1"}

defmod EIOBoard1_M2 MQTT2_DEVICE
attr EIOBoard1_M2 IODev MQTT2Client
attr EIOBoard1_M2 comment Channel 1 for EIOBoard1_M2, see also EIOBoard1_M2_CH2
attr EIOBoard1_M2 genericDeviceType switch
attr EIOBoard1_M2 model 8channel_ethernet_board_split
attr EIOBoard1_M2 readingList /Home/EIOBoard1state:.* { $EVENT =~ m,output...([01]{8}), ? {"output"=>$1} : undef }\
  /Home/EIOBoard1state:.* { $EVENT =~ m,output...([01])([01]{7}), ? $1 ? {"state"=>"on"} : {"state"=>"off"} : undef }
attr EIOBoard1_M2 room 82.MQTT
attr EIOBoard1_M2 setList off:noArg  { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/[01]([01]{7})/0$1/g;;;; "/Home/EIOBoard1ctr setr=$output" }\
  on:noArg   { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/[01]([01]{7})/1$1/g;;;; "/Home/EIOBoard1ctr setr=$output"}
attr EIOBoard1_M2 setStateList on off

setstate EIOBoard1_M2 on
setstate EIOBoard1_M2 2020-02-11 21:48:23 associatedWith EIOBoard1_M2_CH2
setstate EIOBoard1_M2 2020-02-12 16:32:05 output 10000000
setstate EIOBoard1_M2 2020-02-12 16:32:05 state on

>set EIOBoard1_M2 off
/Home/EIOBoard1ctr setr=00000000
/Home/EIOBoard1state {"cmd":"setr","output":"00000000","input":"00000000","sn":"/Home/EIOBoard1"}


Bei CH2 schaltet das Relays nicht und es werden nur sechs Ziffern gesendet.
Das setList von CH2 sieht auch ganz anders aus:
CH1: $output =~ s/[01]([01]{7})/0$1/g;;
CH2: $output =~ s/([01])[01]([01]{6})/$10$2/g;;


>set EIOBoard1_M2_CH2 on
/Home/EIOBoard1ctr setr=000000
/Home/EIOBoard1state {"cmd":"setr","output":"00000000","input":"00000000","sn":"/Home/EIOBoard1"}

defmod EIOBoard1_M2_CH2 MQTT2_DEVICE
attr EIOBoard1_M2_CH2 IODev MQTT2Client
attr EIOBoard1_M2_CH2 comment Channel 1 for EIOBoard1_M2, see also EIOBoard1_M2_CH2
attr EIOBoard1_M2_CH2 genericDeviceType switch
attr EIOBoard1_M2_CH2 model 8channel_ethernet_board_split
attr EIOBoard1_M2_CH2 readingList /Home/EIOBoard1state:.* { $EVENT =~ m,output...([01]{8}), ? {"output"=>$1} : undef }\
  /Home/EIOBoard1state:.* { $EVENT =~ m,output...[01]([01])([01]{6}), ? $1 ? {"state"=>"on"} : {"state"=>"off"} : undef }
attr EIOBoard1_M2_CH2 room 82.MQTT
attr EIOBoard1_M2_CH2 setList off:noArg  { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/([01])[01]([01]{6})/$10$2/g;;;; "/Home/EIOBoard1ctr setr=$output" }\
  on:noArg   { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/([01])[01]([01]{6})/$11$2/g;;;; "/Home/EIOBoard1ctr setr=$output"}
attr EIOBoard1_M2_CH2 setStateList on off

setstate EIOBoard1_M2_CH2 off
setstate EIOBoard1_M2_CH2 2020-02-12 16:32:57 output 00000000
setstate EIOBoard1_M2_CH2 2020-02-12 16:32:57 state off



>set EIOBoard1_M2_CH2 off
/Home/EIOBoard1ctr setr=000000
/Home/EIOBoard1state {"cmd":"setr","output":"00000000","input":"00000000","sn":"/Home/EIOBoard1"}




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