[gelöst] Einzelnes Ergebnis mit readingList abonnieren

Begonnen von oelkanne, 28 Februar 2021, 13:06:11

Vorheriges Thema - Nächstes Thema

oelkanne

Guten Tag,

Ziel: "Position" mit dem Attr "readingList" zu abonieren und in das reading "state" zu übergeben, in einen Schritt

Die MQTT2 message sieht so aus:


12:30:50 MQT: stat/MiniTiger4gang_2/RESULT = {"Shutter1":{"Position":100,"Direction":0,"Target":100}}


Mein workaround sieht zur Zeit so aus:
Ich abonniere mit "readingList" alle "Results"
attr MiniTiger4gang_2a readingList tele/MiniTiger4gang_2/RESULT:.* { json2nameValue($EVENT) }\

dadurch wird unter anderen auch das Reading "Shutter1_Position" generiert sowie der Wert "100" geliefert.

Um das Ergebnis in das Reading "state" zu übergeben nutze ich das attribut userReading:

attr MiniTiger4gang_2a userReadings state {(ReadingsVal($name,"Shutter1_Position","error"))}

Das funktioniert soweit.

Gibt es eine Möglichkeit die "Position" direkt mit ReadingList zu abonnieren und das Ergebnis ins "state" zu schreiben?

etwa so: (diese Beispiel geht leider nicht)
attr MiniTiger4gang_2a readingList stat/MiniTiger4gang_2/RESULT:{json2nameValue("Shutter1_Position")}   {{'state' => Shutter1_Position}}

Otto123

#1
Hi,

das geht ohne userReadings auch gut mit  attr jsonMap Shutter1_Position:state
Ich glaube das ist der angedachte Weg dafür.
Du kannst damit auch die unerwünschten Readings "in den Skat drücken" jsonname:0

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

#2
Entweder mit jsonMap oder so in der Art wie in deinem letzten Beispiel.

probier mal:

attr MiniTiger4gang_2a readingList tele/MiniTiger4gang_2/RESULT:.* { $EVENT =~ m,Position..(\d+), ? {"state"=>$1} : json2nameValue($EVENT) }

Gruß

Thomas

TomLee

Zur Sicherheit:

jsonMap greift nur mit der Angabe des dritten Parameter $JSONMAP in json2nameValue

{ json2nameValue($EVENT,'',$JSONMAP) }

Beta-User

Hmm, also:
a) json2nameValue() kennt noch einen 4. Parameter, damit kann man Filtern ;) . Ungetestet vielleicht so:
{ json2nameValue($EVENT,'',$JSONMAP,'Shutter1') }b) Man kann auch erst $EVENT parsen und dann nur den "inneren JSON" an json2nameValue() übergeben. Gibt ein paar Beispiele dazu in mqtt2.template, vielleicht mal bei den zigbee2tasmota-templates anfangen zu suchen.
c) Eventuell kann man den Tasmota auch so konfigurieren, dass er für jedes Shutter-Device einen eigenen Topic nimmt und dann (nur) den auswerten?

Würde bei c) beginnen, wenn das nicht klappt schauen, ob a) ausreicht und zuletzt Variante b) nehmen...
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

oelkanne

Herzlichen Dank für die wertvollen Tipps!

Die Variante von TomLee passte am Besten.
stat/MiniTiger4gang_1/RESULT:.* { $EVENT =~ m,Shutter1....Position..(\d+), ? {"state"=>$1} : json2nameValue($EVENT) }

Viele Grüße
Oelkanne

TomLee

Ich würde gerne diesen Thread für mein Verständnis zum 4. Parameter (Filter) in json2nameValue nutzen.

Wäre es damit dann auch möglich nur ein Reading Position zu erhalten oder geht das nur mit dem vorangestellten Shutter1_(Position) ?

{ json2nameValue($EVENT,'','$JSONMAP','Position') }

rudolfkoenig

Parameter #4 ist ein Regexp, mit dem die fertigen Schluessel (vulgo Reading-Namen) gefiltert werden, ohne den sonst ueblichen Ergaenzung mit ^und $.

Oder auch: "Shutter1_Position" =~ m/Position/

TomLee

ZitatOder auch: "Shutter1_Position" =~ m/Position/

Habs bis heute nicht verstanden, kann mir jemand ein Beispiel zeigen wie das genau gemeint war.