FHEM Forum

FHEM - Hausautomations-Systeme => MQTT => Thema gestartet von: igami am 18 März 2019, 17:34:28

Titel: MQTT2_DEVICE - readingList nur definiertes JSON
Beitrag von: igami am 18 März 2019, 17:34:28
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?
Titel: Antw:MQTT2_DEVICE - readingList nur definiertes JSON
Beitrag von: rudolfkoenig am 18 März 2019, 18:03:25
Ich wuerde den Ausdruck mit json2nameValue parsen und die readings mit jsonMap umbenennen oder ausblenden.
Es gibt aber bestimmt noch viele Alternativen.
Titel: Antw:MQTT2_DEVICE - readingList nur definiertes JSON
Beitrag von: igami am 18 März 2019, 18:20:07
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.
Titel: Antw:MQTT2_DEVICE - readingList nur definiertes JSON
Beitrag von: Beta-User am 19 März 2019, 08:24:07
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).