MQTT2_DEVICE - readingList nur definiertes JSON

Begonnen von igami, 18 März 2019, 17:34:28

Vorheriges Thema - Nächstes Thema

igami

Ich habe einen IRBlaster und diesen wie folgt definiert:

defmod IRBlaster MQTT2_DEVICE DVES_xxxxxx
attr IRBlaster IODev mqttServer
attr IRBlaster autocreate 0
attr IRBlaster readingList DVES_xxxxxx:tele/IRBlaster/LWT:.* state\
DVES_xxxxxx:tele/IRBlaster/STATE:.* { json2nameValue($EVENT, 'STATE_', $JSONMAP) }\
DVES_xxxxxx:tele/IRBlaster/RESULT:.* {IrReceived=>$EVENT}
attr IRBlaster room MQTT2_DEVICE

setstate IRBlaster 2019-03-18 17:24:58 IrReceived {"IrReceived":{"Protocol":"SONY","Bits":15,"Data":"542A"}}


In dem Reading "IrReceived" möchte ich nun nur den "inneren Teil" stehen haben.

{"Protocol":"SONY","Bits":15,"Data":"542A"}


Wie muss ich das im Attribut readingList definieren?
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

rudolfkoenig

Ich wuerde den Ausdruck mit json2nameValue parsen und die readings mit jsonMap umbenennen oder ausblenden.
Es gibt aber bestimmt noch viele Alternativen.

igami

json2nameValue bricht das ganze zu weit auf, dann muss ich es wieder zusammensetzen.
Habe mir nun mit

DVES_xxxxxx:tele/IRBlaster/RESULT:.* {IrReceived=>encode_json(decode_json($EVENT)->{IrReceived})}

beholfen.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Beta-User

Moin zusammen,

dank igami und TomLee "lebt" jetzt also mein erstes Tasmota-Device ;) .

Hier mal meine RAW-Definition, soweit hier interessant:
defmod MQTT2_DVES_8BABA9 MQTT2_DEVICE DVES_8BABA9
attr MQTT2_DVES_8BABA9 IODev MQTT2_FHEM_Server
attr MQTT2_DVES_8BABA9 readingList tele/tasm_8BABA9/LWT:.* LWT\
cmnd/tasm_8BABA9/POWER:.* POWER\
tele/tasm_8BABA9/INFO1:.* { json2nameValue($EVENT) }\
tele/tasm_8BABA9/INFO2:.* { json2nameValue($EVENT) }\
tele/tasm_8BABA9/INFO3:.* { json2nameValue($EVENT) }\
stat/tasm_8BABA9/RESULT:.* { json2nameValue($EVENT) }\
stat/tasm_8BABA9/POWER:.* POWER\
tele/tasm_8BABA9/STATE:.* { json2nameValue($EVENT) }\
tele/tasm_8BABA9/RESULT:.* { $EVENT =~ m,..IrReceived....Protocol...([A-Za-z0-9]+)...Bits..([\d]+)..Data...([A-Za-z0-9]+)..., ? {"$1_$2"=>$3} : json2nameValue($EVENT) }\
tele/tasm_8BABA9/UPTIME:.* { json2nameValue($EVENT) }
attr MQTT2_DVES_8BABA9 room MQTT2_DEVICE
attr MQTT2_DVES_8BABA9 setList irsend:textField cmnd/tasm_8BABA9/irsend {"Protocol":"$EVTPART1","Bits":$EVTPART2,"Data":"0x$EVTPART3"}


Was macht das:
Alle "IrReceived"-JSON-Blobs werden nicht über json2nameValue() ausgewertet, sondern landen jeweils in einem eigenen Reading, dessen Name aus dem Protokoll und der Anzahl der Bits zusammengesetzt ist. So bekommt (fast) jedes Gerät ein eigenes Reading.

Man kann damit direkt beliebige Codes senden, indem man einfach sowas wie
set <device> irsend NEC 32 5EA1B847 verwendet. (Evtl. wäre die Anzahl der Wiederholungen optional noch eine gute Sache).
Damit sollte es dann wieder relativ einfach in das remotecontrol-Format zu übersetzen sein, ohne jedesmal die "Langform" in JSON verwenden zu müssen.

Hoffe, das hilft weiter :) .

(Das wiki aktualisiere ich bei Gelegenheit entsprechend, die Tasmota-Geschichte gefällt mir besser als meine gemoddete firmware).
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