PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MQTT-Formatierung für Sensor in Home Assistant


HisN
2024-02-18, 02:31:46
Wir haben einen niedlichen e-UP in der Einfahrt zu stehen, bei dem ich gerne den Batteriestand abfragen würde, sobald er in der Einfahrt abgestellt wird.
Das geht natürlich per CLOUD-APP. Aber dafür möchte VW auch gerne 100 Euro für 2 Jahre bekommen. Und dafür dass deren Software nur alle Jubeljahre mal vernünftig funktioniert, hab ich einfach keinen Bock drauf.

Dafür hab ich mir einen MQTT-Fähigen OBD2-Adapter besorgt.
Ich möchte das gerne per Home-Assistant automatisieren. Aber meine Kenntnisse vom selbigen reichen dafür einfach nicht aus. Eventuell kann mir da einer von euch unter die Arme greifen? Den großteil der Arbeit hab ich schon erledigt.

First Things first:
Ein nettes { "bus": "0", "type": "tx", "frame": [{ "id": 2015, "dlc": 8, "rtr": false, "extd": false, "data": [3, 34, 2, 140, 170, 170, 170, 170] }] }; per mqtt auf wican/xxxxxid/can/tx gesendet.
Entlockt dem UP ein freundliches
{"bus":"0","type":"rx","ts":35216,"frame":[{"id":2029,"dlc":8,"rtr":false,"extd":false,"data":[4,98,2,140,68,170,170,170]}]}
auf dem wican/xxxxxxid/can/rx topic

Cool. Also ab in Home-Assistant und zwei Sensoren eingerichtet.


mqtt:
sensor:
- name: "E-UP Status MQTT"
state_topic: "wican/xxxxxid/status"
value_template: "{{ value_json.status }}"

- name: "E-UP SOC MQTT"
state_topic: "wican/xxxxxid/can/rx"


Und dann eine kleine Automatisation eingerichtet, was den MQTT-Status überwacht. Und sofort wenn der Status auf Online wechselt (das passiert, wenn sich der OBD-Adapter ins WLAN einloggt beim Parken oder beim Losfahren, wenn der Zündschlüssel gedreht wird) die "Frage" nach dem SOC im topic vom wican published (geiles denglisch).


alias: MQTT e-UP SOC Abfrage
description: ""
trigger:
- platform: state
entity_id:
- sensor.e_up_status_mqtt
to: online
condition: []
action:
- service: mqtt.publish
data:
qos: 0
retain: false
payload: >-
{ "bus": "0", "type": "tx", "frame": [{ "id": 2015, "dlc": 8, "rtr":
false, "extd": false, "data": [3, 34, 2, 140, 170, 170, 170, 170] }] };
topic: wican/xxxxxid/can/tx
mode: single


Und da hänge ich jetzt.
Der SOC vom UP ist der 5. Wert im Data-Block (hier im Beispiel also 68), den man noch wundervoll durch 255 teilen darf und dann mit 100 Multiplizieren. (oder gleich nur durch 2,55 teilen).

Aber dafür bin ich echt zu blöd. Wie mache ich dem Home-Assistant-Sensor klar, dass er aus
{"bus":"0","type":"rx","ts":35216,"frame":[{"id":2029,"dlc":8,"rtr":false,"extd":false,"data":[4,98,2,140,68,170,170,170]}]}
den data-Block den 5 Wert nimmt und ihn dann durch 2,55 teilt? *seufz*

Ist einer von euch in Home-Assistant bewandert?
Ich würde ja sagen, dass ich das irgendwie mit "split" hinbekomme, aber ich schaffe es ja nicht mal "nur" den data-Block abzuholen im Sensor.

Ein


mqtt:
sensor:
- name: "E-UP SOC MQTT"
state_topic: "wican/xxxxxid/can/rx"
value_template: "{{ value_json.data }}"


z.b. gibt immer einen leeren String als Rückmeldung :-(


Ah ... wenn ich "frame" abfrage, dann verringere ich schon den Datenberg.


mqtt:
sensor:
- name: "E-UP SOC MQTT"
state_topic: "wican/xxxxxid/can/rx"
value_template: "{{ value_json.frame }}"



[
{
"id": 2029,
"dlc": 8,
"rtr": false,
"extd": false,
"data": [
4,
98,
2,
140,
68,
170,
170,
170
]
}
]


Ich hab so dermaßen keine Ahnung von diesen Datenformaten.. das geht mir so auf den Sack^^

Marscel
2024-02-18, 12:37:07
Vielleicht:

value_json.frame.data[4] | int / 255 | int * 100

The_Invisible
2024-02-18, 12:43:13
frame ist noch ein Array, also value_json.frame[0].data[4]

HisN
2024-02-18, 14:20:19
Jaaaaaa. Das ist die Lösung.
Ich bin einfach zu blöd für sowas. Dankeeee

myMind
2024-02-18, 16:42:41
Vielleicht hilft dir ja folgendes beim nächsten Mal.

Es gibt zwei gebräuchliche Datenstrukturen:

Array (Listen) - Zugriff über einen Index -> []
Objekt (Maps) - Zugriff über einen Schlüssel (Key-Value) -> {}


Wichtige Besonderheiten

Yaml

Eine Liste kann anstelle von [] auch durch eingerückte Minusse untereinander angezeigt werden.


Json

Keine Kommentare möglich



Das Json in "payload" hattest Du ja schon aus dem umgebenden Yaml herausextrahiert. Wenn es um Json geht, dann ist jq das ultimative Tool:
$ cat value.json
{
"bus": "0",
"type": "tx",
"frame": [
{
"id": 2015,
"dlc": 8,
"rtr": false,
"extd": false,
"data": [
3,
34,
2,
140,
170,
170,
170,
170
]
}
]
}
$ jq ".frame[0].data[4]" ./value.json
170

Mit jq kann man sich da selbst sehr gut ranarbeiten. Also mit jq "." ./value.json anfangen und dann Stück für Stück runtergehen. Bei einer Map den Key nehmen, bei einer Liste den Index. Z.B.
$ jq ".frame" ./value.json
[
{
"id": 2015,
"dlc": 8,
"rtr": false,
"extd": false,
"data": [
3,
34,
2,
140,
170,
170,
170,
170
]
}
]


Etwas Werbung für jq:

n8sOmEe2SDg