mqtt2.template für RFbridge von Sonoff entwickeln

Begonnen von Tueftler1983, 27 März 2019, 10:02:44

Vorheriges Thema - Nächstes Thema

Tueftler1983

Hallo zusammen,
in diesem Thead soll ein template entwickelt werden um die Sonoff RFBridge gescheit unter MQTT2 anzubinden.

Beta-User und ich beginnen hier mal aber sind für Unterstützung offen und dankbar!


Tueftler1983

#1
So in der Konsole von der RFbridge steht das....

19:35:26 MQT: /SmartHome/Interface/Bridge/tele/LWT = online (beibehalten)
19:35:26 MQT: /SmartHome/Interface/Bridge/cmnd/POWER =
19:35:26 MQT: /SmartHome/Interface/Bridge/tele/INFO1 = {"Module":"Sonoff Bridge","Version":"5.12.0","FallbackTopic":"RFbridge","GroupTopic":"sonoffs"}
19:35:26 MQT: /SmartHome/Interface/Bridge/tele/INFO2 = {"WebServerMode":"Admin","Hostname":"Sonoff","IPAddress":"192.168.2.50"}
19:35:26 MQT: /SmartHome/Interface/Bridge/tele/INFO3 = {"RestartReason":"Software/System restart"}
19:35:34 MQT: /SmartHome/Interface/Bridge/tele/STATE = {"Time":"2019.03.26 19:35:34","Uptime":"0 00:00:13","Vcc":3.471,"Wifi":{"AP":1,"SSId":"FRITZ!Box 6360 Cable Holger","RSSI":68,"APMac":"C8:0E:14:xx:xx:xx"}}
19:44:21 MQT: /SmartHome/Interface/Bridge/tele/RESULT = {"RfReceived":{"Sync":12460,"Low":440,"High":1250,"Data":"128489","RfKey":"None"}}

Dazu das im MQTT2_MQTT2CLIENT

MQTT2Client:/SmartHome/Interface/Bridge/tele/LWT:.* LWT
MQTT2Client:/SmartHome/Interface/tele/sonoff/LWT:.* LWT
MQTT2Client:/SmartHome/Interface/Garten/tele/LWT:.* LWT
MQTT2Client:/SmartHome/Interface/Spuelmaschine/tele/LWT:.* LWT
MQTT2Client:/SmartHome/Interface/Trockner/tele/LWT:.* LWT
MQTT2Client:/SmartHome/Interface/Spuelmaschine/tele/UPTIME:.* { json2nameValue($EVENT) }
MQTT2Client:/SmartHome/Interface/Garten/tele/UPTIME:.* { json2nameValue($EVENT) }
MQTT2Client:/SmartHome/Interface/Trockner/tele/UPTIME:.* { json2nameValue($EVENT) }
MQTT2Client:/SmartHome/Interface/Bridge/tele/UPTIME:.* { json2nameValue($EVENT) }
MQTT2Client:/SmartHome/Interface/Bridge/tele/STATE:.* { json2nameValue($EVENT) }
MQTT2Client:/SmartHome/Interface/Bridge/tele/RESULT:.* { json2nameValue($EVENT) }


Habe dann in der über autocreate angelegten RFbridge 2 Readings hinzugefügt (die zwei unteren Zeilen)
/SmartHome/Interface/Bridge/cmnd/POWER:.* POWER
/SmartHome/Interface/Bridge/tele/INFO1:.* { json2nameValue($EVENT) }
/SmartHome/Interface/Bridge/tele/INFO2:.* { json2nameValue($EVENT) }
/SmartHome/Interface/Bridge/tele/INFO3:.* { json2nameValue($EVENT) }
/SmartHome/Interface/Bridge/tele/RESULT:.* { json2nameValue($EVENT) }
/SmartHome/Interface/Bridge/tele/STATE:.* { json2nameValue($EVENT) }


So und noch die Raw Definition der RFbridge

defmod MQTT2_Bridge MQTT2_DEVICE Bridge
attr MQTT2_Bridge IODev MQTT2_Client
attr MQTT2_Bridge readingList /SmartHome/Interface/Bridge/cmnd/POWER:.* POWER\
/SmartHome/Interface/Bridge/tele/INFO1:.* { json2nameValue($EVENT) }\
/SmartHome/Interface/Bridge/tele/INFO2:.* { json2nameValue($EVENT) }\
/SmartHome/Interface/Bridge/tele/INFO3:.* { json2nameValue($EVENT) }\
/SmartHome/Interface/Bridge/tele/RESULT:.* { json2nameValue($EVENT) }\
/SmartHome/Interface/Bridge/tele/STATE:.* { json2nameValue($EVENT) }
attr MQTT2_Bridge room MQTT2_DEVICE

setstate MQTT2_Bridge 2019-03-26 19:35:27 FallbackTopic RFbridge
setstate MQTT2_Bridge 2019-03-26 19:35:27 GroupTopic sonoffs
setstate MQTT2_Bridge 2019-03-26 19:35:27 Hostname Sonoff
setstate MQTT2_Bridge 2019-03-26 19:35:27 IPAddress 192.168.2.50
setstate MQTT2_Bridge 2019-03-26 19:35:27 Module Sonoff Bridge
setstate MQTT2_Bridge 2019-03-26 19:35:27 POWER
setstate MQTT2_Bridge 2019-03-26 19:35:27 RestartReason Software/System restart
setstate MQTT2_Bridge 2019-03-27 10:11:18 RfReceived_Data 100401
setstate MQTT2_Bridge 2019-03-27 10:11:18 RfReceived_High 900
setstate MQTT2_Bridge 2019-03-27 10:11:18 RfReceived_Low 350
setstate MQTT2_Bridge 2019-03-27 10:11:18 RfReceived_RfKey None
setstate MQTT2_Bridge 2019-03-27 10:11:18 RfReceived_Sync 10590
setstate MQTT2_Bridge 2019-03-27 08:55:34 Time 2019.03.27 08:55:33
setstate MQTT2_Bridge 2019-03-27 08:55:34 Uptime 0 13:20:13
setstate MQTT2_Bridge 2019-03-27 08:55:34 Vcc 3.471
setstate MQTT2_Bridge 2019-03-26 19:35:27 Version 5.12.0
setstate MQTT2_Bridge 2019-03-26 19:35:27 WebServerMode Admin
setstate MQTT2_Bridge 2019-03-27 08:55:34 Wifi_AP 1
setstate MQTT2_Bridge 2019-03-27 08:55:34 Wifi_APMac C8:0E:14:55:25:98
setstate MQTT2_Bridge 2019-03-27 08:55:34 Wifi_RSSI 66
setstate MQTT2_Bridge 2019-03-27 08:55:34 Wifi_SSId FRITZ!Box 6360 Cable Holger
setstate MQTT2_Bridge 2019-03-26 19:35:27 associatedWith MQTT2_GeneralBridge



Tueftler1983

In den Readings sind die für mich wichtigen Daten enthalten, das ist das RfReceived_Data das ist das empfangene Funksignal über das ich Events auslösen kann. Ich weiß nicht welche Daten noch benötigt werden.

Beta-User

So, also ausgehend von der Info ist das Ergebnis in etwa so:19:44:21 MQT: /SmartHome/Interface/Bridge/tele/RESULT = {"RfReceived":{"Sync":12460,"Low":440,"High":1250,"Data":"128489","RfKey":"None"}}Aus dem template zur tasmota-IR (A_01d_tasmota_ir) wissen wir, dass bei Ir folgendes funktioniert:
tele/DEVNAME/RESULT:.* { $EVENT =~ m,..IrReceived....Protocol...([A-Za-z0-9]+)...Bits..([\d]+)..Data...([A-Za-z0-9]+)..., ? {"$1_$2"=>$3} : json2nameValue($EVENT) }
Das bildet für jede Protokoll-Bit-Kombination jeweils ein neues Reading und schreibt die Data-Information da rein.

Daraus leite ich mal folgenden Test für die readingList ab:
/SmartHome/Interface/Bridge/tele/RESULT:.* { $EVENT =~ m,..RfReceived....Sync..([A-Za-z0-9]+)..Low..([\d]+)..High..([\d]+)..Data...([A-Za-z0-9]+)...RfKey...([^"]+)..., ? {"$1_$2_$3"=>$4_$5} : json2nameValue($EVENT) }

Kannst du das mal testen und ggf. verbessern? Die Herleitung ist hoffentlich einigermaßen nachvollziehbar...
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

Tueftler1983

Also das läst sich so nicht in der readingList speichern, gibt einen Syntax error.
syntax error at (eval 535909) line 1, near "$4_"
syntax error at (eval 535909) line 1, near "}}"

Beta-User

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

Tueftler1983

Diese Readings werden ja schon gebildet:
RfReceived_Data
775151
2019-03-27 07:08:55
RfReceived_High
460
2019-03-27 07:08:55
RfReceived_Low
150
2019-03-27 07:08:55
RfReceived_RfKey
None
2019-03-27 07:08:55
RfReceived_Sync
5070

Durch diese Zeile in der readingList
/SmartHome/Interface/Bridge/tele/RESULT:.* { json2nameValue($EVENT) }

Tueftler1983

Gut das hat er geschluckt, neue Readings werden aber keine angelegt beim Empfang eines Signales
Zitat von: Beta-User am 27 März 2019, 10:42:12
Dann mach mal Anführungszeichen drumrum:"$4_$5"

Beta-User

Neuer Versuch; ich würde auf den "None"-Teil der regex als Problem tippen, das kann aber auch was anderes sein...
/SmartHome/Interface/Bridge/tele/RESULT:.* { $EVENT =~ m,..RfReceived....Sync..([A-Za-z0-9]+)..Low..([\d]+)..High..([\d]+)..Data...([A-Za-z0-9]+)...RfKey...(None)..., ? {"$1_$2_$3"=>"$4_$5"} : json2nameValue($EVENT) }
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

Zitat von: Tueftler1983 am 27 März 2019, 10:42:57
Durch diese Zeile in der readingList
/SmartHome/Interface/Bridge/tele/RESULT:.* { json2nameValue($EVENT) }
Ändere das mal bitte:/SmartHome/Interface/Bridge/tele/RESULT:.* {RfReceived=>encode_json(decode_json($EVENT)->{RfReceived})}
Damit sollten wir erkennen, was bei der anderen verabeitungsmäßig durchläuft (die andere macht Einzelreadings, wenn die regexp nicht paßt), diese hier sollte "den inneren JSON" in ein neues Readings schreiben.
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

Tueftler1983

Also das bringt noch nen Syntax fehler
/SmartHome/Interface/Bridge/tele/RESULT:.* { $EVENT =~ m,..RfReceived....Sync..([A-Za-z0-9]+)..Low..([\d]+)..High..([\d]+)..Data...([A-Za-z0-9]+)...RfKey...(None)..., ? {"$1_$2_$3"=>"$4_$5"}}


Was meinst du jetzt?
Soll ich die zeile löschen
/SmartHome/Interface/Bridge/tele/RESULT:.* { json2nameValue($EVENT) }

Und durch diese ersetzen?
/SmartHome/Interface/Bridge/tele/RESULT:.* {RfReceived=>encode_json(decode_json($EVENT)->{RfReceived})}

Beta-User

Das mit dem Syntaxfehler muß ich mir in Ruhe ansehen (der ":" und die nachfolgende Funktion fehlen mit Absicht?).

Dann verwende für die "RESULT"-Zeile nur noch einen Eintrag.
Wenn das hier geht, dann das:
/SmartHome/Interface/Bridge/tele/RESULT:.* { $EVENT =~ m,..RfReceived.*, ? {RfReceived=>encode_json(decode_json($EVENT)->{RfReceived})} : json2nameValue($EVENT) }
Sonst:/SmartHome/Interface/Bridge/tele/RESULT:.* {RfReceived=>encode_json(decode_json($EVENT)->{RfReceived})}
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

Tueftler1983

Also der code läuft und erzeugt für jeden empfangenen code ein eigenes Reading
/SmartHome/Interface/Bridge/tele/RESULT:.* { $EVENT =~ m,..RfReceived.*, ? {RfReceived=>encode_json(decode_json($EVENT)->{RfReceived})} : json2nameValue($EVENT) }
Habe mal Screenshot von den Readings und der readingList gemacht

Beta-User

Hmm, da paßt irgendwas nicht zusammen...

Die Readingnamen mit "Zahl1_Zahl2_Zahl3" und die Readings selbst passen zu dem Code, den ich bis 11:00 Uhr gepostet hatte, vermutlich noch ohne den "None"-Text, aber mit Anführungszeichen.

Jedenfalls paßt es nicht zu dem aktuellen. Der müßte ein Reading mit Namen RfReceived bilden und da einen JSON reinschreiben.

Bitte nochmal alle Readings löschen, und dann die Schritte ab Einführung der Anführungszeichen nochmal durchgehen (nur ein Eintrag für RESULT), dabei das Browserfenster nach dem Senden des RF-Codes aktualisieren. Bitte bei dem Schritt anhalten, der Readings in obigem Format liefert, wenn es sowas gibt...

Dann: RfKey scheint für was "bekanntes" zu stehen, wenn er nicht None ist. Kannst du so eine mal drücken und den MQTT-Verkehr dazu (eigentlich: den JSON) zeigen?
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

Tueftler1983

#14
Also diese Definition
/SmartHome/Interface/Bridge/tele/RESULT:.* { $EVENT =~ m,..RfReceived....Sync..([A-Za-z0-9]+)..Low..([\d]+)..High..([\d]+)..Data...([A-Za-z0-9]+)...RfKey...([^"]+)..., ? {"$1_$2_$3"=>"$4_$5"} : json2nameValue($EVENT) }
Liefert das Reading wenn ein Signal empfangen wird
5130_150_470
775544_None


RFkey ist, man kann in der Bridge 15 Keys anlernen. Also wie eine frei programmierbare Funkfernbedienung. Habe ich aber keine da ich mit der Bridge nur Signale Empfange aber keine Sende