Im ESP8266 Werte berechnen und als Entität zur Verfügung stellen

Hallo,
ich habe Temperatursensoren an einen ESP8266 angeschlossen um die Vor- und Rücklauftemperatur meiner Heizung zu messen. Das funktioniert auch wunderbar.
Jetzt wollte ich direkt im ESP auch die Differenz der beiden Werte als Entität zur Verfügung stellen aber ich scheitere schon daran.

# Individual sensors
sensor:
  - platform: dallas
    address: 0x2e09225451138928
    name: "Vorlauftemp HK1"
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-plus"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 2
  - platform: dallas
    address: 0x9f09225462eb9f28
    name: "Rücklauftemp HK1"
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-minus"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 2   
 # - platform: template 
 #   name: "Differenz HK1"
 #   unit_of_measurement: "°C"
 #   icon: "mdi:thermometer-plus"
 #   device_class: "temperature"
 #   state: >-
 #   { states("Vorlauf HK1") | float - states("Rücklauf HK1") | float | round(2) }

Bitte daher mal um Unterstützung wie ich das lösen kann.
Wenn ihr zusätzlich noch einen Tip habt wo ich mir das yaml’m beibringen kann, egal ob Buch oder online, wäre das super.
Vielen Dank schon im Voraus an euch
Gruß
Andreas

So läuft bei mir die Spreizung (in Kelvin :smiley:)

state: "{{ ( states('sensor.luxtronik_xxxx_0130_flow_in_temperature') | float - states('sensor.luxtronik_xxxx_0130_flow_out_temperature') | float ) | round(1) }}"
unit_of_measurement: 'K'

Danke Linos,
trotz Einheit in Kelvin läuft das nicht :slight_smile:

 - platform: template 
    name: "Differenz HK1"
    unit_of_measurement: "K"
    icon: "mdi:thermometer-plus"
    device_class: "temperature"
    state: "{{ states('Vorlauf HK1') | float - states('Rücklauf HK1') | float | round(2) }}"

Irgendwas mache ich immer falsch

So kann das nicht funktionieren.

Geh mal unter Entwicklerwerkzeuge - Zustände und such mal nach Vorlauf bzw. Rücklauf. Dann siehst du wie die heißen… irgendwas mit sensor.xyz. Die genauen Bezeichnungen setzt du dann in die Berechnung ein.

Und dann fehlen da noch Klammern.
state: "{{ (states('sensor.xyz') | float - states('sensor.abc') | float) round(2) }}"

Ansonsten gilt round nur für den letzten Eintrag.

So könnte es in esphome mit den ID’s gehen.

Verzichte mal bitte in der ID und generell in der Namensgebung auf Umlaute (ü), Leerzeichen (besser _) und in der ID-Abfrage auf die Hochkommer. Das kann im allgemeinen zu Problemen führen

sensor:
  - platform: template
    name: "Spreizung"
    state: "(id(temperatur1_hk1).state - id(temperatur2_hk1).state)"
   

Vielen Dank für die Tips aber beide Varianten haben nicht funktionert immer die Fehlermeldung

[state] is an invalid option for [sensor.template]. Did you mean [state_topic], [state_class]?

und ja der eine Wert ist wirklich ohne das “ü” geschrieben. @Linos du hast ja recht besser keine Sonderzeichen :frowning:

 - platform: template 
    name: "Differenz_HK1"
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-plus"
    device_class: "temperature"
    state: "{{ (states('sensor.heizungtemperaturen_vorlauftemp_hk1') | float - states('sensor.heizungtemperaturen_rcklauftemp_hk1') | float) round(2) }}"

Noch mehr Ideen ??

Jetzt geht mir auch langsam die Puste aus mit esphome :upside_down_face:

Ich habe noch etwas hier gefunden und angepasst


lambda: |-
  return id(temperatur1_hk1).state - id(temperatur2_hk1).state;
update_interval: 60s

Im Zweifelsfall einfach einen Template Sensor über die Helfer oder Configuration in HA erstellen. Das klappt bestimmt

Der Fehler kommt jetzt erst beim kompiliern :frowning:

Ich weis ich bin ein DAU, bitte versucht es weiter ich will das verstehen

Vielen Dank schon an alle

|-- noise-c @ 0.1.4
Compiling .pioenvs/heizungtemperaturen/src/main.cpp.o
/config/esphome/heizungtemperaturen.yaml: In lambda function:
/config/esphome/heizungtemperaturen.yaml:61:18: error: 'Vorlauftemp' was not declared in this scope
   61 |       return (id(Vorlauftemp HK1).state - id(Rücklauftemp HK1).state)
      |                  ^~~~~~~~~~~
/config/esphome/heizungtemperaturen.yaml:61:46: error: 'R\U000000fccklauftemp' was not declared in this scope
   61 |       return (id(Vorlauftemp HK1).state - id(Rücklauftemp HK1).state)
      |                                              ^~~~~~~~~~~~
/config/esphome/heizungtemperaturen.yaml:61:71: error: expected ';' before '}' token
   61 |       return (id(Vorlauftemp HK1).state - id(Rücklauftemp HK1).state)
      |                                                                      ^
      |                                                                      ;
   62 |     update_interval: 60s
      |                                                                       
*** [.pioenvs/heizungtemperaturen/src/main.cpp.o] Error 1
========================== [FAILED] Took 9.18 seconds ==========================

So wie ich das interpretiere, sagt der Fehler u.a. das er ein Problem mit den ID‘s hat.
Kannst du deine 3 aktuellen Sensoren, so wie du es jetzt hast, nochmal zeigen.

Hallo Linos,
erstmal danke das du am Ball bleibst bei meinem Problem :+1:
Die Konfig im ESP ist immer noch so wie im 1.Post lediglich den letzten Teil den ich dort auskommentiert habe ändere ich und ja die “'#” entferne ich dann.
Gruß
Andreas

@Baeckchen
Vergib mal für die Sensoren eine eindeutige interne id und spreche sie NICHT über den Namen an, so wie du es jetzt im Code stehen hast.

Hallo Bäckchen, gerne doch… :grinning:. Auch wenn ich nicht die qualifizierteste Person bezüglich ESPhome bin, so überwiegt nun doch die Neugierde :see_no_evil:

Ich habe bei den beiden dallas Sensoren eine “id” hinzugefügt, so wie FunnyRS bereits erwähnt hat. Die besagten “id`s” habe ich dann in dem template Sensor wieder aufgegriffen. Natürlich habe ich auch wieder das “K” hinzugefügt :joy:

sensor:
  - platform: dallas
    address: 0x2e09225451138928
    name: "Vorlauftemp HK1"
    id: vl_hk1
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-plus"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 2

  - platform: dallas
    address: 0x9f09225462eb9f28
    name: "Rücklauftemp HK1"
    id: rl_hk1
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-minus"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 2

  - platform: template 
    name: "Spreizung HK1"
    unit_of_measurement: "K"
    icon: "mdi:thermometer-plus"
    device_class: "temperature"
    update_interval: 60s
    lambda: |-
      return id(vl_hk1).state - id(rl_hk1).state

Danke mal wieder für die Tips,
habe es gleich ausprobiert, also der Code

# Individual sensors
sensor:
  - platform: dallas
    address: 0x2e09225451138928
    name: "Vorlauftemp HK1"
    id: Vl_HK1
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-plus"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 2
  - platform: dallas
    address: 0x9f09225462eb9f28
    name: "Rücklauftemp HK1"
    id: Rl_HK1
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-minus"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 2   
  - platform: template 
    name: "Spreizung HK1"
    unit_of_measurement: "K"
    icon: "mdi:thermometer-plus"
    device_class: "temperature"
    update_interval: 60s
    lambda: |-
      return id(Vl_HK1).state - id(Rl_HK1).state

und hier die Fehlermeldung :frowning:

Compiling .pioenvs/heizungtemperaturen/src/main.cpp.o
/config/esphome/heizungtemperaturen.yaml: In lambda function:
/config/esphome/heizungtemperaturen.yaml:64:43: error: expected ';' before '}' token
   64 |       return id(Vl_HK1).state - id(Rl_HK1).state
      |                                           ^
      |                                           ;
*** [.pioenvs/heizungtemperaturen/src/main.cpp.o] Error 1
========================== [FAILED] Took 9.03 seconds ==========================

Da habe ich wohl noch ein “ ; “ vergessen. Bei den äußeren Klammern bin ich mir nicht sicher, dürften aber auch nicht schaden.

return (id(Vl_HK1).state - id(Rl_HK1).state);
1 „Gefällt mir“

:heartbeat: :grinning:
Es läuft !!

Vielen Dank Linos das du mir geholfen hast. Natürlich auch an die anderen die mir hier Tips gegeben haben.
Aber jetzt die interessante Frage: Warum läuft das mit Lampda und nicht mit state ?

Hallo @Baeckchen
rein aus Interesse habe ich es mal bei mir mit state ausprobiert … es läuft mit nachfolgendem Code.

template:
  - sensor: # Heizung Spreizung (Differenz Vorlauf/Rücklauf)
    - name: "Spreizung_HK"
      unique_id: "HK_Differenz"
      device_class: temperature
      state_class: total
      unit_of_measurement: "K"
      state: >
        {{ 
        states('sensor.heizung_vorlauf_temperature')| float(0) - 
        states('sensor.heizung_rucklauf_temperature')| float(0) 
        }}

@Baeckchen freut mich das es geklappt hat. Jetzt hast du auch eine tolle Basis für zukünftige Berechnungen. Ob “Lambda” oder “state” kann ich dir nicht mit Sicherheit sagen aber ich vermute es liegt an der spezifischen Programmiersprache von ESPhome.

Ich habe deinen Code folgend korregiert eingefügt, für die Nachwelt. Könntest du das Thema als gelöst markieren :slight_smile:

# Individual sensors
sensor:
  - platform: dallas
    address: 0x2e09225451138928
    name: "Vorlauftemp HK1"
    id: Vl_HK1
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-plus"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 2
  - platform: dallas
    address: 0x9f09225462eb9f28
    name: "Rücklauftemp HK1"
    id: Rl_HK1
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-minus"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 2   
  - platform: template 
    name: "Spreizung HK1"
    unit_of_measurement: "K"
    icon: "mdi:thermometer-plus"
    device_class: "temperature"
    update_interval: 60s
    lambda: |-
      return (id(Vl_HK1).state - id(Rl_HK1).state);

@FrankS Du hast natürlich vollkommen recht, wenn man einen template sensor erstellen möchte. Baeckchen wollte die Berechnung direkt mit dem ESP8266 durchführen, also in ESPhome