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
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.
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 ;) .)
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
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
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...!
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 :-)
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.
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 }
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 }
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...
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 (https://wiki.fhem.de/wiki/AttrTemplate)
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
::) 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!
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"}
Zu $newstate: Du hattest schon "alles" mit in die readingList eingebaut? Die Musterzeile hatte die Deklaration ganz am Anfang enthalten, ist evtl. untergegangen:
Zitat von: Beta-User am 12 Februar 2020, 07:40:51
/Home/EIOBoard1state:.* { my $newstate = $EVENT =~ m,output...([01])([01]{7}), ? $1 ? "on" : "off";;;; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
Das ist schon mal gut, dass CH1 funktioniert. CH2 muß anders sein, weil wir da ja die erste Ziffer "as is" übernehmen wollen. Kannst du mal das hier testen:
attr EIOBoard1_M2_CH2 setList off:noArg { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/([01])[01]([01]{6})/${1}0$2/g;;;; "/Home/EIOBoard1ctr setr=$output" }\
on:noArg { my $output = ReadingsVal($NAME,"output","00000000");;;; $output =~ s/([01])[01]([01]{6})/${1}1$2/g;;;; "/Home/EIOBoard1ctr setr=$output"}
Falls das klappt und du Lust hast, das attrTemplate zu vervollständigen: Für die anderen müßte man dann die Zahl der Wiederholungen ändern, also für den dritten:
s/([01]{2})[01]([01]{5})/${1}1$2/g
Und bitte einmal mit nur einem ";" beim GUI-Editieren austesten...
CH2 funktioniert jetzt auch - Super.
Und es reicht ein ; in der GUI aus.
Bei der readingList muss ich nochmal nachfragen. Aus:
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 }
Wird:
attr EIOBoard1_M2 readingList /Home/EIOBoard1state:.* { $EVENT =~ m,output...([01]{8}), ? {"output"=>$1} : undef }\
/Home/EIOBoard1state:.* { my $newstate = $EVENT =~ m,output...([01])([01]{7}), ? $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
Da bekomme ich aber ein:
syntax error at (eval 12916007) line 1, at EOF
Global symbol "$newstate" requires explicit package name (did you forget to declare "my $newstate"?) at (eval 12916007) line 1.
Global symbol "$newstate" requires explicit package name (did you forget to declare "my $newstate"?) at (eval 12916007) line 1.
attr EIOBoard1_M2 readingList /Home/EIOBoard1state:.* { my $newstate = $EVENT} funktioniert. Mit dem Rest hinten aber nicht mehr. Ich finde den Fehler nicht.
Mist... Mein Code war Käse, ich habe mich durch die Fehlermeldung irgendwie in die falsche Richtung leiten lassen, da waren wohl zu viele Schritte auf einmal...
So sollte es klappen:
/Home/EIOBoard1state:.* { $EVENT =~ /output...([01])([01]{7})/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
Hi, nix mehr mit Käse! Alles Bestens. Vielen Dank.
Ich schaue mir das dann mal mit dem Template an.
...habe mir mal gleich noch so ein Board bestellt.
:)
Puh, Danke für die Entwarnung!
Dann warte ich jetzt mal, was du aus den Bausteinchen jetzt so zauberst und wie die Erfahrungen mit dem Ding auf längere Frist so sind - wie gesagt, ich mag das Teil schon alleine deshalb, weil es verkabelt wird, auch wenn ich grade keinen Bedarf habe (und wenn, den dann mit MySensors@RS485 decken würde)...
Bin mal gespannt, wann der erste unserer MCU-Cracks sich des Teils annimmt und eine eigene firmware dafür baut - diese Klimmzüge zur Auswertung von output könnte man sich sparen, würde das Teil gleich "vernünftige" Rückmeldung zu einzelnen Kanälen geben ;D .
Hi, ich wollte das nun für die anderen Relays erweitern und scheitere schon beim anpassen des realdingList von CH2. Das Relays schaltet richtig, der state bleibt aber immer on:
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 =~ /output...([01])[01]([01]{6})/;; my $newstate = $2 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
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})/${1}0$2/g;; "/Home/EIOBoard1ctr setr=$output" }\
on:noArg { my $output = ReadingsVal($NAME,"output","00000000");; $output =~ s/([01])[01]([01]{6})/${1}1$2/g;; "/Home/EIOBoard1ctr setr=$output"}
attr EIOBoard1_M2_CH2 setStateList on off
setstate EIOBoard1_M2_CH2 on
setstate EIOBoard1_M2_CH2 2020-02-15 09:06:19 output 00000000
setstate EIOBoard1_M2_CH2 2020-02-15 09:58:47 state on
Hier nochmal der funktionierende CH1:
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 =~ /output...([01])([01]{7})/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
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-12 18:05:23 associatedWith EIOBoard1_M2_CH2
setstate EIOBoard1_M2 2020-02-13 17:38:04 output 00000000
setstate EIOBoard1_M2 2020-02-15 10:22:00 state on
Die Vervollständigung für die weiteren Kanäle verstehe ich nicht. Habe das jetzt mal nach Gefühl gemacht :-[
Kannst Du das bitte richtig rücken?
CH1 s/[01]([01]{7})/1$1/g
CH2 s/([01])[01]([01]{6})/${1}1$2/g
CH3 s/([01]{2})[01]([01]{5})/${1}1$2/g -> muss das 1$3/g sein?
CH4 s/([01]{3})[01][01]([01]{4})/${1}1$4/g
CH5 s/([01]{4})[01][01][01]([01]{3})/${1}1$5/g
CH6 s/([01]{5})[01][01][01][01]([01]{2})/${1}1$6/g
CH7 s/([01]{6})[01][01][01][01][01]([01]{1})/${1}1$7/g
CH8 s/([01]{7})[01][01][01][01][01][01]([01])/${1}1$8/g
Ist etwas regex...
$1 ist der erste "hit", $2 der zweite usw. -> das, was du haben willst, muß also "in die regex-Klammer":
attr EIOBoard1_M2_CH2 readingList /Home/EIOBoard1state:.* { $EVENT =~ /output...[01]([01])([01]{6})/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
(Habe die Klammer um die erste Stelle entfernt, damit wir die umklammerte zweite Stelle wieder $1 ;) )
(Zum Weiterlesen und vorab-Testen (z.B.): https://regexr.com (https://regexr.com/),da ist auch das mit den eckigen Klammern "etwas" nebenbei erläutert)
Hi, da die Relays sich wegen den gesendeten Nullen gegenseitig ausgeschaltet hatten, habe ich das auf x umgestellt und die RegEx angepasst.
Das funktioniert bislang ohne Einschränkungen.
Hier der aktuelle Stand:
defmod EIOBoard1CH1_M2 MQTT2_DEVICE
attr EIOBoard1CH1_M2 IODev MQTT2Client
attr EIOBoard1CH1_M2 comment Channel 1 for EIOBoard1_M2, see also EIOBoard1_M2_CH2
attr EIOBoard1CH1_M2 genericDeviceType switch
attr EIOBoard1CH1_M2 model 8channel_ethernet_board_split
attr EIOBoard1CH1_M2 readingList /Home/EIOBoard1state:.* { $EVENT =~ /output...([01])[01]{7}/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr EIOBoard1CH1_M2 room 82.MQTT
attr EIOBoard1CH1_M2 setList on:noArg /Home/EIOBoard1ctr setr=1xxxxxxx\
off:noArg /Home/EIOBoard1ctr setr=0xxxxxxx
attr EIOBoard1CH1_M2 setStateList on off
#
defmod EIOBoard1CH2_M2 MQTT2_DEVICE
attr EIOBoard1CH2_M2 IODev MQTT2Client
attr EIOBoard1CH2_M2 comment Channel 1 for EIOBoard1_M2, see also EIOBoard1_M2_CH2
attr EIOBoard1CH2_M2 genericDeviceType switch
attr EIOBoard1CH2_M2 model 8channel_ethernet_board_split
attr EIOBoard1CH2_M2 readingList /Home/EIOBoard1state:.* { $EVENT =~ /output...[01]([01])[01]{6}/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr EIOBoard1CH2_M2 room 82.MQTT
attr EIOBoard1CH2_M2 setList on:noArg /Home/EIOBoard1ctr setr=x1xxxxxx\
off:noArg /Home/EIOBoard1ctr setr=x0xxxxxx
attr EIOBoard1CH2_M2 setStateList on off
#
defmod EIOBoard1CH3_M2 MQTT2_DEVICE
attr EIOBoard1CH3_M2 IODev MQTT2Client
attr EIOBoard1CH3_M2 comment Channel 1 for EIOBoard1_M2, see also EIOBoard1_M2_CH2
attr EIOBoard1CH3_M2 genericDeviceType switch
attr EIOBoard1CH3_M2 model 8channel_ethernet_board_split
attr EIOBoard1CH3_M2 readingList /Home/EIOBoard1state:.* { $EVENT =~ /output...[01]{2}([01])[01]{5}/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr EIOBoard1CH3_M2 room 82.MQTT
attr EIOBoard1CH3_M2 setList on:noArg /Home/EIOBoard1ctr setr=xx1xxxxx\
off:noArg /Home/EIOBoard1ctr setr=xx0xxxxx
attr EIOBoard1CH3_M2 setStateList on off
#
defmod EIOBoard1CH4_M2 MQTT2_DEVICE
attr EIOBoard1CH4_M2 IODev MQTT2Client
attr EIOBoard1CH4_M2 comment Channel 1 for EIOBoard1_M2, see also EIOBoard1_M2_CH2
attr EIOBoard1CH4_M2 genericDeviceType switch
attr EIOBoard1CH4_M2 model 8channel_ethernet_board_split
attr EIOBoard1CH4_M2 readingList /Home/EIOBoard1state:.* { $EVENT =~ /output...[01]{3}([01])[01]{4}/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr EIOBoard1CH4_M2 room 82.MQTT
attr EIOBoard1CH4_M2 setList on:noArg /Home/EIOBoard1ctr setr=xxx1xxxx\
off:noArg /Home/EIOBoard1ctr setr=xxx0xxxx
attr EIOBoard1CH4_M2 setStateList on off
#
defmod EIOBoard1CH5_M2 MQTT2_DEVICE
attr EIOBoard1CH5_M2 IODev MQTT2Client
attr EIOBoard1CH5_M2 comment Channel 1 for EIOBoard1_M2, see also EIOBoard1_M2_CH2
attr EIOBoard1CH5_M2 genericDeviceType switch
attr EIOBoard1CH5_M2 model 8channel_ethernet_board_split
attr EIOBoard1CH5_M2 readingList /Home/EIOBoard1state:.* { $EVENT =~ /output...[01]{4}([01])[01]{3}/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr EIOBoard1CH5_M2 room 82.MQTT
attr EIOBoard1CH5_M2 setList on:noArg /Home/EIOBoard1ctr setr=xxxx1xxx\
off:noArg /Home/EIOBoard1ctr setr=xxxx0xxx
attr EIOBoard1CH5_M2 setStateList on off
#
defmod EIOBoard1CH6_M2 MQTT2_DEVICE
attr EIOBoard1CH6_M2 IODev MQTT2Client
attr EIOBoard1CH6_M2 comment Channel 1 for EIOBoard1_M2, see also EIOBoard1_M2_CH2
attr EIOBoard1CH6_M2 genericDeviceType switch
attr EIOBoard1CH6_M2 model 8channel_ethernet_board_split
attr EIOBoard1CH6_M2 readingList /Home/EIOBoard1state:.* { $EVENT =~ /output...[01]{5}([01])[01]{2}/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr EIOBoard1CH6_M2 room 82.MQTT
attr EIOBoard1CH6_M2 setList on:noArg /Home/EIOBoard1ctr setr=xxxxx1xx\
off:noArg /Home/EIOBoard1ctr setr=xxxxx0xx
attr EIOBoard1CH6_M2 setStateList on off
#
defmod EIOBoard1CH7_M2 MQTT2_DEVICE
attr EIOBoard1CH7_M2 IODev MQTT2Client
attr EIOBoard1CH7_M2 comment Channel 1 for EIOBoard1_M2, see also EIOBoard1_M2_CH2
attr EIOBoard1CH7_M2 genericDeviceType switch
attr EIOBoard1CH7_M2 model 8channel_ethernet_board_split
attr EIOBoard1CH7_M2 readingList /Home/EIOBoard1state:.* { $EVENT =~ /output...[01]{6}([01])[01]/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr EIOBoard1CH7_M2 room 82.MQTT
attr EIOBoard1CH7_M2 setList on:noArg /Home/EIOBoard1ctr setr=xxxxxx1x\
off:noArg /Home/EIOBoard1ctr setr=xxxxxx0x
attr EIOBoard1CH7_M2 setStateList on off
#
defmod EIOBoard1CH8_M2 MQTT2_DEVICE
attr EIOBoard1CH8_M2 IODev MQTT2Client
attr EIOBoard1CH8_M2 comment Channel 1 for EIOBoard1_M2, see also EIOBoard1_M2_CH2
attr EIOBoard1CH8_M2 genericDeviceType switch
attr EIOBoard1CH8_M2 model 8channel_ethernet_board_split
attr EIOBoard1CH8_M2 readingList /Home/EIOBoard1state:.* { $EVENT =~ /output...[01]{7}([01])/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr EIOBoard1CH8_M2 room 82.MQTT
attr EIOBoard1CH8_M2 setList on:noArg /Home/EIOBoard1ctr setr=xxxxxxx1\
off:noArg /Home/EIOBoard1ctr setr=xxxxxxx0
attr EIOBoard1CH8_M2 setStateList on off
Hier noch die nun nicht genutzte Variante zur Steuerung. Vielleicht kann`s jemand gebrauchen.
Die Steuerung über http mit z.B.:
set EIOBoard1_http RelaisOn 5
set EIOBoard1_http RelaisOn 3
set EIOBoard1_http RelaisOff 5
defmod EIOBoard1_http HTTPMOD http://admin:12345678@192.168.48.122 45
attr EIOBoard1_http userattr set0Name set0URL set1Name set1URL
attr EIOBoard1_http enableControlSet 1
attr EIOBoard1_http room 59.Test
attr EIOBoard1_http set0Name RelaisOn
attr EIOBoard1_http set0URL http://admin:12345678@192.168.48.122/relay.cgi?relayon$val=on
attr EIOBoard1_http set1Name RelaisOff
attr EIOBoard1_http set1URL http://admin:12345678@192.168.48.122/relay.cgi?relayoff$val=off
Und ein MQTT2 Device, dass den Status aller Relais in einzelnen Readings anzeigt:
defmod EIOBoard1v1_M2 MQTT2_DEVICE
attr EIOBoard1v1_M2 IODev MQTT2Client
attr EIOBoard1v1_M2 disable 0
attr EIOBoard1v1_M2 jsonMap input:0
attr EIOBoard1v1_M2 readingList /Home/EIOBoard1state:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr EIOBoard1v1_M2 room 59.Test,82.MQTT
attr EIOBoard1v1_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)}
attr EIOBoard1v1_M2 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 }
Vielen Dank für die Unterstützung!
Danke schon mal für die Rückmeldung...
Das mit den "xx" ist ja auch elegant, hatte ich irgendwie überlesen; dann übernehmen wir das :) .
Ich nehme mal an, es ist ok, wenn ich deine Fotos ins Wiki packe? Dazu wäre es noch gut, wir hätten eine Foto mit geschlossenem Gehäuse?
Dann hier mal die Vorschläge für die attrTemplates:
name:8channel_ethernet_board_split
filter:TYPE=MQTT2_DEVICE
desc: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!
order:W_03
par:STATETOPIC;Command topic prefix;{ AttrVal("DEVICE","readingList","") =~ m,([^:/]+state)/, ? $1 : undef }
par:CMNDTOPIC;Command topic prefix;{ AttrVal("DEVICE","readingList","") =~ m,([^:/]+)state/, ? ${1}ctr : undef }
par:ICON;ICON as set, defaults to on;{ AttrVal("DEVICE","icon","on") }
attr DEVICE icon ICON
attr DEVICE model 8channel_ethernet_board_split
attr DEVICE setStateList on off
set DEVICE attrTemplate mqtt2_speech_recognition_type_switch
deletereading -q DEVICE (?!associatedWith).*
copy DEVICE DEVICE_CH2
copy DEVICE DEVICE_CH3
copy DEVICE DEVICE_CH4
copy DEVICE DEVICE_CH5
copy DEVICE DEVICE_CH6
copy DEVICE DEVICE_CH7
copy DEVICE DEVICE_CH8
setreading DEVICE associatedWith DEVICE_CH1,DEVICE_CH2,DEVICE_CH3,DEVICE_CH4,DEVICE_CH5,DEVICE_CH6,DEVICE_CH7,DEVICE_CH8
setreading DEVICE_CH2 associatedWith DEVICE,DEVICE_CH1,DEVICE_CH3,DEVICE_CH4,DEVICE_CH5,DEVICE_CH6,DEVICE_CH7,DEVICE_CH8
setreading DEVICE_CH3 associatedWith DEVICE,DEVICE_CH1,DEVICE_CH2,DEVICE_CH4,DEVICE_CH5,DEVICE_CH6,DEVICE_CH7,DEVICE_CH8
setreading DEVICE_CH4 associatedWith DEVICE,DEVICE_CH1,DEVICE_CH2,DEVICE_CH3,DEVICE_CH5,DEVICE_CH6,DEVICE_CH7,DEVICE_CH8
setreading DEVICE_CH5 associatedWith DEVICE,DEVICE_CH1,DEVICE_CH2,DEVICE_CH3,DEVICE_CH4,DEVICE_CH6,DEVICE_CH7,DEVICE_CH8
setreading DEVICE_CH6 associatedWith DEVICE,DEVICE_CH1,DEVICE_CH2,DEVICE_CH3,DEVICE_CH4,DEVICE_CH5,DEVICE_CH7,DEVICE_CH8
setreading DEVICE_CH7 associatedWith DEVICE,DEVICE_CH1,DEVICE_CH2,DEVICE_CH3,DEVICE_CH4,DEVICE_CH5,DEVICE_CH6,DEVICE_CH8
setreading DEVICE_CH8 associatedWith DEVICE,DEVICE_CH1,DEVICE_CH2,DEVICE_CH3,DEVICE_CH4,DEVICE_CH5,DEVICE_CH6,DEVICE_CH7
attr DEVICE_CH2 readingList STATETOPIC { $EVENT =~ /output...[01]([01])[01]{6}/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr DEVICE_CH3 readingList STATETOPIC { $EVENT =~ /output...[01]{2}([01])[01]{5}/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr DEVICE_CH4 readingList STATETOPIC { $EVENT =~ /output...[01]{3}([01])[01]{4}/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr DEVICE_CH5 readingList STATETOPIC { $EVENT =~ /output...[01]{4}([01])[01]{3}/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr DEVICE_CH6 readingList STATETOPIC { $EVENT =~ /output...[01]{5}([01])[01]{2}/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr DEVICE_CH7 readingList STATETOPIC { $EVENT =~ /output...[01]{6}([01])[01]/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr DEVICE_CH8 readingList { $EVENT =~ /output...[01]{7}([01])/;; my $newstate = $1 ? "on" : "off";; $newstate eq ReadingsVal($NAME,"state","unknown") ? undef : {"state"=>$newstate} }
attr DEVICE setList on:noArg CMNDTOPIC setr=1xxxxxxx\
off:noArg CMNDTOPIC setr=0xxxxxxx
attr DEVICE_CH2 setList on:noArg CMNDTOPIC setr=x1xxxxxx\
off:noArg CMNDTOPIC setr=x0xxxxxx
attr DEVICE_CH3 setList on:noArg CMNDTOPIC setr=xx1xxxxx\
off:noArg CMNDTOPIC setr=xx0xxxxx
attr DEVICE_CH4 setList on:noArg CMNDTOPIC setr=xxx1xxxx\
off:noArg CMNDTOPIC setr=xxx0xxxx
attr DEVICE_CH5 setList on:noArg CMNDTOPIC setr=xxxx1xxx\
off:noArg CMNDTOPIC setr=xxxx0xxx
attr DEVICE_CH6 setList on:noArg CMNDTOPIC setr=xxxxx1xx\
off:noArg CMNDTOPIC setr=xxxxx0xx
attr DEVICE_CH7 setList on:noArg CMNDTOPIC setr=xxxxxx1x\
off:noArg CMNDTOPIC setr=xxxxxx0x
attr DEVICE_CH8 setList on:noArg CMNDTOPIC setr=xxxxxxx1\
off:noArg CMNDTOPIC setr=xxxxxxx0
attr DEVICE readingList STATETOPIC
setreading DEVICE associatedWith DEVICE_CH1,DEVICE_CH2,DEVICE_CH3,DEVICE_CH4,DEVICE_CH5,DEVICE_CH6,DEVICE_CH7,DEVICE_CH8
name:8channel_ethernet_board_unified
filter:TYPE=MQTT2_DEVICE
desc: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!
order:W_03a
par:STATETOPIC;Command topic prefix;{ AttrVal("DEVICE","readingList","") =~ m,([^:/]+state)/, ? $1 : undef }
par:CMNDTOPIC;Command topic prefix;{ AttrVal("DEVICE","readingList","") =~ m,([^:/]+)state/, ? ${1}ctr : undef }
par:ICON;ICON as set, defaults to on;{ AttrVal("DEVICE","icon","on") }
attr DEVICE icon ICON
attr DEVICE setStateList on off
attr DEVICE jsonMap input:0
attr DEVICE readingList STATETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr DEVICE 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 }
attr DEVICE setList out1:0,1 {my $command = $EVTPART1."xxxxxxx";; "CMNDTOPIC setr=$command"}\
out2:0,1 {my $command = "x".$EVTPART1."xxxxxx";; "CMNDTOPIC setr=$command"}\
out3:0,1 {my $command = "xx".$EVTPART1."xxxxx";; "CMNDTOPIC setr=$command"}\
out4:0,1 {my $command = "xxx".$EVTPART1."xxxx";; "CMNDTOPIC setr=$command"}\
out5:0,1 {my $command = "xxxx".$EVTPART1."xxx";; "CMNDTOPIC setr=$command"}\
out6:0,1 {my $command = "xxxxx".$EVTPART1."xx";; "CMNDTOPIC setr=$command"}\
out7:0,1 {my $command = "xxxxxx".$EVTPART1."x";; "CMNDTOPIC setr=$command"}\
out8:0,1 {"CMNDTOPIC setr=xxxxxxx".$EVTPART1}
attr DEVICE model 8channel_ethernet_board_unified
(Testen wäre klasse...)
Die attrTemplate sind u.a. seit eben im svn. Bitte daher ggf. die Test-File entfernen, könnte sonst zu Problemen mit namensgleichen templates kommen.
Habe auch einen ganz kurzen Abschnitt ins Wiki reingebastelt; das mit dem Kabel hat halt was...
Jetzt würde mich nur interessieren, ob andere Geräte (mit dem Chipsatz?) auch "MQTT sprechen"; es gibt da ja noch diverse andere Angebote auf gängigen Marktplätzen (meistens aber dann ohne Gehäuse).
Beim set Board attrTemplate ... bekomme ich:
Error checking template regexp: syntax error at (eval 28349358) line 1, near "${1}ctr "
Ich mache Morgen mal ein Update und teste das dann nochmal.
1000 Dank für Deine Arbeit, so ist das eine coole Lösung!
Parallel zu dem Teil habe ich mit einem Arduino Mega/Wiznet und MQTT Sketch gearbeitet - Funktioniert auch zuverlässig. Dieses Board ist aber halt kompakter. Die MCU ist ja ein frei programmierbarer Cortex M3, da kann wohl nur getestet werden, was der Chinese implementiert hat :-)
Hier mal noch zwei Bilder fürs Wiki.
Danke für die Bilder - bemaßt ist super! - und die Hinweise, was noch nicht paßt mit den regex; sollte jetzt (hoffentlich vollst....) gefixt sein.
Klar ist das mit der firmware auf der MCU eine Wundertüte, aber vielleicht findet ja jemand raus, was man mit "ISP1" anfangen kann - sieht mir nach einer SPI-Programmierschnittstelle aus, aber ich bin da kein Experte, und wenn die firmware nicht nach Hause telefoniert (?), sollte das auch so gehen...
Danke auch für die nette Rückmeldung und die Geduld beim Rausarbeiten unserer Lösung :) .
Hi, das sieht schon sehr gut aus.
Bei: set EIOBoard2 attrTemplate 8channel_ethernet_board_split ...
bekomme ich aber ein: EIOBoard2 attr readingList: more parameters needed
Das bezieht sich wohl auf CH1, da fehlt noch das readingList:
defmod EIOBoard2 MQTT2_DEVICE
attr EIOBoard2 IODev MQTT2Client
attr EIOBoard2 genericDeviceType switch
attr EIOBoard2 icon on
attr EIOBoard2 model 8channel_ethernet_board_split
attr EIOBoard2 room 82.MQTT
attr EIOBoard2 setList on:noArg /Home/EIOBoard1ctr setr=1xxxxxxx\
off:noArg /Home/EIOBoard1ctr setr=0xxxxxxx
attr EIOBoard2 setStateList on off
Die anderen Devices sind ok.
Thx, ist jetzt hoffentlich auch vollends gefixt... ::)
Passt. THX!
Hallo zusammen,
ich habe ein dingtain Zwei Kanal Netzwerk Relay. Ich konnte das Relay über MQTT erfolgreich einbinden. Leider bekomme ich das mit dem Schalten nicht hin.
Mit meiner Set_List bekomme ich zwar die Möglichkeit zwischen On und Off umzuschalten, aber irgendwie bekomme ich nicht das Ergebnis , dass ich möchte.
Readingslist
myBroker:/dingtian/relay1225/out/r1:.* r1
myBroker:/dingtian/relay1225/out/r2:.* r2
myBroker:/dingtian/relay1225/out/i1:.* i1
myBroker:/dingtian/relay1225/out/i2:.* i2
myBroker:/dingtian/relay1225/out/relay1:.* { json2nameValue($EVENT) }
myBroker:/dingtian/relay1225/out/relay2:.* { json2nameValue($EVENT) }
myBroker:/dingtian/relay1225/out/input1:.* { json2nameValue($EVENT) }
myBroker:/dingtian/relay1225/out/input2:.* { json2nameValue($EVENT) }
myBroker:/dingtian/relay1225/out/ip:.* ip
myBroker:/dingtian/relay1225/out/sn:.* sn
myBroker:/dingtian/relay1225/out/mac:.* mac
myBroker:/dingtian/relay1225/out/input_cnt:.* input_cnt
myBroker:/dingtian/relay1225/out/relay_cnt:.* relay_cnt
myBroker:Advantech/DEVNAME/ctl/do1:.* { json2nameValue($EVENT) }
myBroker:/dingtian/relay1225/in/r1:.* r1
myBroker:cmnd/dingtian/relay1225/in/r1:.* r1
myBroker:cmnd/dingtian/relay1225/in/r2:.* r2
attr Digitain_2_Channel_Relay setList out1:on,off cmnd/dingtian/relay1225/in/r1 ON, off cmnd/dingtian/relay1225/in/r1 OFF\
out2:on,off cmnd/dingtian/relay1225/in/r2 ON, off cmnd/dingtian/relay1225/in/r2 OFF
Bitte dazu einen neuen Thread aufmachen und die "was soll ich liefern?"-Threads beachten (einschl. der Formatierungshinweise (v.a. Code-Tags)). Die Hard- und Firmware scheint komplett unterschiedlich zu sein, das paßt mit ziemlicher Sicherheit nicht zusammen.
Dann: Das sieht mir nach MQTT2_CLIENT als IO aus, und die readingList ist vermutlich durch irgendwelche Versuche ergänzt worden?
Tipp: Ggf. das Teil erst mal über einen MQTT2_SERVER verbinden, dann bekommt man auch "subscriptions" angezeigt (falls (!?!) es keine Doku dazu gibt.