JSONPATH und Tasmota bei wechselndem/fehlendem Pfadinhalt

Die alternative Firmware für ESP8266 based devices

Moderatoren: seppy, udo1toni

Antworten
Holger_OH
Beiträge: 3
Registriert: 12. Okt 2020 17:24

JSONPATH und Tasmota bei wechselndem/fehlendem Pfadinhalt

Beitrag von Holger_OH »

Hallo zusammen,

Ich habe ein kleines Problem mit JSONPATH. Ich habe nun alles von Mqtt1.x nach Mqtt2.5 umgestellt. Das Ganze hat zwar
gedauert, aber es hat soweit funktioniert. Ein Problem habe ich jedoch mit JSONPATH.
Sofern beim Topic das entsprechende Payload dabei ist kein Problem, der Wert ist auszulesen, aber bei meiner Tasmota ZbBrigde senden z.B. die Umweltsensoren nur Werte die sich ändern. Also mal nur die Temperatur, mal die Feuchte, mal beides, mal mit Batterieangabe, mal ohne usw.
Funktioniert, wenn die Werte da sind. Das Problem ist, wenn diese fehlen, werden die Werte auf NULL gesetzt

MQTT Message:

Code: Alles auswählen

TOPIC: tardis/tele/ZigbeeBridge/1234/SENSOR
{"ZbReceived":{"0x1234":{"Device":"0x1234","BatteryVoltage":3.01,"BatteryPercentage":99,"Temperature":21.5,"Humidity":48.2,"Pressure":994,"PressureScale":-1,"PressureScaledValue":9945,"SeaPressure":994,"Endpoint":1,"LinkQuality":166}}}
oder
{"ZbReceived":{"0x1234":{"Device":"0x1234","Temperature":21.3,"Humidity":49.4,"Pressure":994,"PressureScale":-1,"PressureScaledValue":9945,"SeaPressure":994,"Endpoint":1,"LinkQuality":167}}}  
Lege ich nun in der .things ein Thing an wie:

Code: Alles auswählen

     Thing topic Test {
    Channels:
	 Type string : Test_Temp    		[ stateTopic="tardis/tele/ZigbeeBridge/1234/SENSOR", transformationPattern="JSONPATH:$.ZbReceived.*.Temperature" ]	
	 Type string : Test_Hydo    		[ stateTopic="tardis/tele/ZigbeeBridge/1234/SENSOR", transformationPattern="JSONPATH:$.ZbReceived.*.Humidity" ]	
	 Type string : Test_Batt    		[ stateTopic="tardis/tele/ZigbeeBridge/1234/SENSOR", transformationPattern="JSONPATH:$.ZbReceived.*.BatteryPercentage" ]	
    }	
Jetzt noch die items

Code: Alles auswählen

	String Test_Temp	"Temperatur [%s °C]"	{ channel="mqtt:topic:Broker:Test:Test_Temp" }
	String Test_Hydo	"Feuchte [%s %%]"	{ channel="mqtt:topic:Broker:Test:Test_Hydo" }
	String Test_Batt	"Batterie [%s %%]"	{ channel="mqtt:topic:Broker:Test:Test_Batt" }
Das Ergebnis, wenn Feuchte und Batt in einer Message fehlen:

Code: Alles auswählen

2020-12-30 21:27:28.929 [vent.ItemStateChangedEvent] - Test_Hydo changed from 49.2 to NULL
2020-12-30 21:27:28.933 [vent.ItemStateChangedEvent] - Test_Batt changed from 98 to NULL
2020-12-30 21:27:28.940 [vent.ItemStateChangedEvent] - Test_Temp changed from 22.5 to 22.9
Unter Mqtt1 hatte ich mir die Mühe gemacht und zuerst geprüft, ob der Wert im Pfad ist, aber das muss doch einfacher gehen. Ich komm nur nicht drauf.

Bisher als rule (anderer Sensor):

Code: Alles auswählen

rule "Aquara THP 01 Sensor"

when 
    Item Aquara_THP_01 changed
then
    val String json = (Aquara_THP_01.state as StringType).toString
	
	
	if(Aquara_THP_01.state.toString.contains("Temperature")) {		
				val String temp = transform("JSONPATH", "$.ZbReceived.*.Temperature", json)
		     Aquara_THP_01_temp.postUpdate(temp)		
	}
usw.......
Ich hoffe jemand kann mich erhellen.
Bis dahin einen guten Rutsch in 2021 und bleibt gesund.

Holger

Bubbleman
Beiträge: 120
Registriert: 22. Dez 2020 17:03
Answers: 1

Re: JSONPATH und Tasmota bei wechselndem/fehlendem Pfadinhalt

Beitrag von Bubbleman »

Hi

Ich habe nicht nachgesehen, aber meine, dass man in Tasmota das Sendeverhalten konfigurieren kann, so dass immer komplett gesendet wird.
Hier mal suchen: https://tasmota.github.io/docs/

Gruß
Thomas
OH 3.1, Raspberry 4B, 4GB RAM, 256 GB Solid State Drive via SATA <-> USB Adapter, ConBee II ZigBee Stick

Bubbleman
Beiträge: 120
Registriert: 22. Dez 2020 17:03
Answers: 1

Re: JSONPATH und Tasmota bei wechselndem/fehlendem Pfadinhalt

Beitrag von Bubbleman »

Hmmm

Ich habe seit gestern ein Setting, welches mir auch unterschiedliche Pfadinhalte sendet, per MQTT.
Ich lese meinen smarten Stromzähler mittels Fototransistor und WEMOS D1 Mini (Tasmota) aus.
Ich bekomme aber kein NULL, wenn die reduzierte Nachricht gesendet wird. Der letzte Wert im Item bleibt stehen.
Volle Nachricht, Intervall wie in Tasmota definiert.
{"Time":"2021-05-24T11:49:44","LK11BE":"total":4959.1361,"total_1d":9.9000,"total_7d":60.2000,"total_30d":270.4000,"total_365d":3382.0000,"current":389.0000}}
Reduzierte Nachricht, sendet bei jeder Änderung, also ständig.
{"Time":"2021-05-24T11:52:10","LK11BE":{"current":391.0000}}
Ich habe ein Thing und für jeden Wert einen Channel:

Code: Alles auswählen

UID: mqtt:topic:mosquitto:SMI1
label: Smart Meter Interface
thingTypeUID: mqtt:topic
configuration:
  payloadNotAvailable: Offline
  availabilityTopic: SMI/tele/LWT
  payloadAvailable: Online
bridgeUID: mqtt:broker:mosquitto
channels:
  - id: SMI_Watt_aktuell
    channelTypeUID: mqtt:number
    label: SMI_Watt_aktuell
    description: ""
    configuration:
      stateTopic: SMI/tele/SENSOR
      transformationPattern: JSONPATH:$.LK11BE.current
      unit: Watt
  - id: SMI_Verbrauch_1d
    channelTypeUID: mqtt:number
    label: Tagesverbrauch
    description: ""
    configuration:
      stateTopic: SMI/tele/SENSOR
      transformationPattern: JSONPATH:$.LK11BE.total_1d
      unit: kWh
  - id: SMI_Verbrauch_7d
    channelTypeUID: mqtt:number
    label: Wochenverbrauch
    description: null
    configuration:
      stateTopic: SMI/tele/SENSOR
      transformationPattern: JSONPATH:$.LK11BE.total_7d
      unit: kWh
  - id: SMI_Verbrauch_30d
    channelTypeUID: mqtt:number
    label: Monatsverbrauch
    description: null
    configuration:
      stateTopic: SMI/tele/SENSOR
      transformationPattern: JSONPATH:$.LK11BE.total_30d
      unit: kWh
  - id: SMI_Verbrauch_365d
    channelTypeUID: mqtt:number
    label: Jahresverbrauch
    description: null
    configuration:
      stateTopic: SMI/tele/SENSOR
      transformationPattern: JSONPATH:$.LK11BE.total_365d
      unit: kWh
  - id: SMI_Verbrauch_gesamt
    channelTypeUID: mqtt:number
    label: Gesamtverbrauch
    description: null
    configuration:
      stateTopic: SMI/tele/SENSOR
      transformationPattern: JSONPATH:$.LK11BE.total
      unit: kWh
Jeder Chanel hat ein eigenes Item!
Daher ändert sich an einem Item auch nichts, wenn sich auf dem verknüpften Channel nichts ändert.
Ich schätze es liegt an deiner Itemkonfiguration. Kann deinen Code aber nicht kommentieren, da ich nicht textuell arbeite.

Gruß
Thomas
OH 3.1, Raspberry 4B, 4GB RAM, 256 GB Solid State Drive via SATA <-> USB Adapter, ConBee II ZigBee Stick

Benutzeravatar
udo1toni
Beiträge: 13858
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: JSONPATH und Tasmota bei wechselndem/fehlendem Pfadinhalt

Beitrag von udo1toni »

Du kannst im TransformationPattern auch mehrere Transformations kombinieren. Damit ist es dann möglich, zunächst mit REGEX zu filtern und nur solche JSON Objekte durchzulassen, welche einen bestimmten Teilpfad enthalten. Das ist sogar in der Doku erklärt (wenn auch leider ohne konkretes Beispiel). Die Verknüpfung erfolgt durch ein spezielles Symbol - ∩. Dieses Symbol ist leider nicht direkt über die Tastatur verfügbar, aber in der Doku ist es aufgeführt (und in openHAB3 im Text, der zur Incomming Value Transformation gehört).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten