Tinkerforge MQTT sensor - Attribute extrahieren

Hallo zusammen,

ich möchte aus einem Tinkerforge 0-20mA Sensor die Attribute aus dem MQTT payload extrahieren.

Der Sensor hat zwei Kanäle mit den entsprechenden “current” Werten aus dem jeweiligen Kanal.

Der MQTT-Payload sieht eigentlich recht einfach aus.

Das einzige Problem ist, dass der “current” Payload von “channel: 0” und “channel: 1” alle 2 Sekunden in nur eine “current” JSON-Nachricht geschrieben wird.

#payload beim start
{"channel": 0, "current": 6879635}
#payload nach 2 Sekunden
{"channel": 1, "current": 4987106}
#payload nach 4 Sekunden
{"channel": 0, "current": 6879541}
#payload nach 6 Sekunden
{"channel": 1, "current": 4987368}

#usw.. usw...

Wie kann ich jetzt die jeweiligen „current“ Werte aus “channel: 0” und “channel: 1” in einzelne Attribute aufteilen um damit 2 Sensoren zu erstellen?

Meine aktuelle config.yaml sieht wie folgt aus.

    - name: "Kollektor"
      state_topic: "tinkerforge/callback/industrial_dual_0_20ma_v2_bricklet/2191/current"
      state_class: "measurement"
      device_class: "current"
      unit_of_measurement: "mA"
      unique_id: "tf_mA_2191"
      value_template: '{{ value_json.current }}'
      json_attributes_topic: "tinkerforge/callback/industrial_dual_0_20ma_v2_bricklet/2191/current"
      force_update: 'true'
      device:
        identifiers: 'TF mA Eingänge 2191'
        name: 'TF mA Eingänge 2191'
        manufacturer: 'Tinkerforge'
        model: 'industrial_dual_0_20ma_v2_bricklet'
        serial_number: '2191'

Dieses value_template legt einen sensor an, der alle 2 sec. abwechselnd die Werte aus “channel: 0” und “channel: 1” schreibt.

Ich habe schon die verschiedenste Versionen mit dem value_template ausprobiert, krieg es aber nicht hin.

Wäre wirklich froh wenn mir dabei einer helfen könnte :wink:

Dies ist die entsprechende MQTT-Dokumentation des Tinkerforge-Sensors:
https://www.tinkerforge.com/en/doc/Software/Bricklets/IndustrialDual020mAV2_Bricklet_MQTT.html

Bin gerade nicht am PC und sage spontan, dupliziere den Sensor Kollektor in 1 und 2 und diese Zeile value_template: ‘{{ value_json.current }}’ wird um ein if value_json.channel ==1 bzw. 2 erweitert

EDIT:
Bin zurück und möchte meine Idee untermauern mit Code.

Kollektor 0

- name: "Kollektor_0"
      state_topic: "tinkerforge/callback/industrial_dual_0_20ma_v2_bricklet/2191/current"
      state_class: "measurement"
      device_class: "current"
      unit_of_measurement: "mA"
      unique_id: "tf_mA_2191_0"
      value_template: >
        {% if value_json.channel == 0 %}
          {{ value_json.current }}
        {% endif %}      json_attributes_topic: "tinkerforge/callback/industrial_dual_0_20ma_v2_bricklet/2191/current"
      force_update: 'true'
      device:
        identifiers: 'TF mA Eingänge 2191'
        name: 'TF mA Eingänge 2191'
        manufacturer: 'Tinkerforge'
        model: 'industrial_dual_0_20ma_v2_bricklet'
        serial_number: '2191'

Kollektor 1

- name: "Kollektor_1"
      state_topic: "tinkerforge/callback/industrial_dual_0_20ma_v2_bricklet/2191/current"
      state_class: "measurement"
      device_class: "current"
      unit_of_measurement: "mA"
      unique_id: "tf_mA_2191_1"
      value_template: >
        {% if value_json.channel == 1 %}
          {{ value_json.current }}
        {% endif %}      json_attributes_topic: "tinkerforge/callback/industrial_dual_0_20ma_v2_bricklet/2191/current"
      force_update: 'true'
      device:
        identifiers: 'TF mA Eingänge 2191'
        name: 'TF mA Eingänge 2191'
        manufacturer: 'Tinkerforge'
        model: 'industrial_dual_0_20ma_v2_bricklet'
        serial_number: '2191'

Durchlauf 1:

  • Channel 1 liefert Wert 1111 dann ist states.tf_ma_2191_1.state | float → 1111

Durchlauf 0:

  • Channel 1 liefert Wert 1110 dann ist states.tf_ma_2191_1.state | float → 1110

Durchlauf beide liefern zur gleichen Zeit (theoretisch)

  • Selbst dann hat jeder Sensor seinen eigenen Wert

Gutes Gelingen!

Ja, dass sieht schon mal besser aus, danke dir. :slight_smile:

Wenn ich mir jetzt meine beiden Entitäten anschaue, dann steht in beiden Attributen Channel: 1
und es sind im Kollektor 1 die “current” Attribut Werte aus Kollektor 2

Hm

Bist Du Dir sicher, daß sich im payload alle 2 s wirklich der Channel zwischen 0 und 1 wechselt?
Steht im Kollektor 1 nie der Channel 0?

Wird Channel als Zahl oder String geliefert? Wäre noch eine Idee.
Vielleicht mal testweise | int setzen?

{% if value_json.channel | int == 1 %}

Bildschirmaufnahme 2025-01-07 um 21.25.47

1 „Gefällt mir“

Schöner Beweis :slight_smile:

Das versuche mal noch

EDIT
Mir fällt noch was ein. Wenn das stimmt :grimacing: :monkey_face:
Ein Template Sensor wird nur minütlich aktualisiert oder muß getriggert werden. Der Wechsel ist aber alle 2 s.

Fortsetzung folgt gleich …

ok, denn auch mit {% if value_json.channel | int == 1 %} hat sich nicht geändert

Bevor ich loslege, muß ich sagen, ich bewege mich auf dünnem und ungetestem Eis…

Die Idee ist, einen bzw. zwei template based trigger anzulegen. Ich habe 1 Trigger : 1 Sensor selbst im Einsatz aber keinen MQTT Trigger. Und ChatGPT traue ich hier nur bedingt über den Weg.

Dennoch probiere es einmal. Ganz wichtig, immer vorher über die configuration.yaml die Prüfung drüber laufen lassen nach jeder Änderung / vor dem HA Neustart.

template:
  - trigger:
      - platform: mqtt
        topic: "tinkerforge/callback/industrial_dual_0_20ma_v2_bricklet/2191/current"
    sensor:
      - name: "Kollektor_0"
        unique_id: "tf_mA_2191_0"
        state: >
          {% if trigger.payload_json.channel == 0 %}
            {{ trigger.payload_json.current }}
          {% endif %}
        unit_of_measurement: "mA"
        device_class: current
        state_class: measurement
        attributes:
          raw_payload: "{{ trigger.payload }}"
      - name: "Kollektor_1"
        unique_id: "tf_mA_2191_1"
        state: >
          {% if trigger.payload_json.channel == 1 %}
            {{ trigger.payload_json.current }}
          {% endif %}
        unit_of_measurement: "mA"
        device_class: current
        state_class: measurement
        attributes:
          raw_payload: "{{ trigger.payload }}"

Ich bin sehr gespannt!

hier ein Fehler beim YAML Test

Konfigurationswarnungen
Invalid config for ‘mqtt’ at configuration.yaml, line 16: ‘template’ is an invalid option for ‘mqtt’, check: mqtt->0->template

Ich habe aber auch die MQTT gesplittet
mqtt: !include tinkerforge_energie_mqtt.yaml

Ich kann mir vorstellen, daß diese Art Vermischung nicht funktioniert. Nimm es alles wieder raus. Das geht sicher irgendwie im Template aber mir fehlt das Wissen, sry.

Wir müssen nur sicherstellen, daß der Template Sensor sich wirklich alle 2 s aktualisiert und nicht alle 60 s. Vielleicht kommt mir die Tage noch eine Idee.

alles gut, aber ich bin schon mal ein ganzes Stück weitergekommen.
Danke dir erstmal :wink:

Eine Sache fällt mir noch zu Deinem Screenshot ein.

  • Der Status wurde vermutlich richtig erkannt.
  • Die Attribute sind gleich über den Befehl
json_attributes_topic: "tinkerforge/callback/industrial_dual_0_20ma_v2_bricklet/2191/current"

Was wir sehen, ist das jeder der beiden Sensor ohne Fall Unterscheidung immer den gleichen payload als Attribut bekommt.

Das könnte den Screenshot erklären.

Vielleicht kann man hier auch eine Fall / Channel Unterscheidung machen? (geraten)

      json_attributes_template: >
        {% if value_json.channel == 0 %}
          {
            "current": "{{ value_json.current }}",
            "status": "{{ value_json.status }}"
          }
        {% else %}
          {}
        {% endif %}

Wäre ein Versuch wert selbst wenn es bei Erfolg meine 60 s Aktualisierung / Annahme zerlegt.

Ich schalte den PC aber jetzt aus :slight_smile: