ESPHome Sprawność rekuperacji

Cześć,

Jestem zielony w temacie a chciał bym mieć wgląd w sprawność temperaturową rekuperacji. W tym celu mam D1_mini z podpiętymi 4 szt DS18B20 w celu pomiaru temperatur na wlocie i wylocie i to działa poprawnie (pomijając odchylnie poszczególnych odczytów względem siebie). Do obliczenia sprawności jest prosty wzór h= (“Supply Air Temperature” - “Outdoor Air Temperature” ) / (“Return Air Temperature” - “Exhaust Air Temperature”) x 100% ale nie mam zielonego pojęcia jak go zaimplementować do kodu YAML żeby sprawność dostawać jako encje. Czy ktoś z szanownego grona jest wstanie mi pomóc?

captive_portal:

dallas:
  - pin: D1 

sensor:
  - platform: dallas
    address: 0xa73de1e380b20c28
    name: "Exhaust Air Temperature"
  - platform: dallas
    address: 0xe63de1e380a9b128
    name: "Outdoor Air Temperature"
  - platform: dallas
    address: 0x903de1e380f02928
    name: "Supply Air Temperature"
  - platform: dallas
    address: 0x803de1e380b4c328
    name: "Return Air Temperature"

U siebie mam zrobione tak, w configuration.yaml:

sensor:
  - platform: template
      req_sprawnosc:
        unit_of_measurement: '%'
        value_template: "{{ (100*(states('sensor.comfoairq_supply_temperature')|float - states('sensor.comfoairq_outside_temperature')|float) / (states('sensor.comfoairq_inside_temperature')|float - states('sensor.comfoairq_outside_temperature')|float)) | float(0)|round(1) }}"       

Potem masz to w encji “sensor.req_sprawnosc”.

Pewnie ilość floatów i round-ów przytłacza i da się to zrobić bardziej elegancko, ale u mnie działa. Korzystałem ze wzoru Sprawność rekuperatora - jak policzyć?

ESPHome Cookbook Logo

Dziękuję za odpowiedź ale coś mi nie idzie

captive_portal:

dallas:
  - pin: D1 

sensor:
  - platform: dallas
    address: 0xa73de1e380b20c28
    name: "Exhaust Air Temperature"
  - platform: dallas
    address: 0xe63de1e380a9b128
    name: "Outdoor Air Temperature"
  - platform: dallas
    address: 0x903de1e380f02928
    name: "Supply Air Temperature"
  - platform: dallas
    address: 0x803de1e380b4c328
    name: "Return Air Temperature"
  
  - platform: template
     req_sprawnosc:
     unit_of_measurement: '%'
     value_template: "{{ (100*(states('sensor.esp_recuperation_supply_air_temperature')|float - states('sensor.esp_recuperation_outdoor_air_temperature')|float) / (states('sensor.esp_recuperation_return_air_temperature')|float - states('sensor.esp_recuperation_outdoor_air_temperature')|float)) | float(0)|round(1) }}"       

wywala błąd podczas walidacji

INFO ESPHome 2023.9.2
INFO Reading configuration /config/esphome/esp-recuperation.yaml...
ERROR Error while reading config: Invalid YAML syntax:

mapping values are not allowed here
  in "/config/esphome/esp-recuperation.yaml", line 52, column 19:
         req_sprawnosc:
                      ^

Przechwytywanie

Na szybko: sprawdź czy masz dobre wcięcia: przed “req_sprawnosc” brakuje spacji, a przed “unit” i “value” dwóch dodatkowych spacji.

Już kombinowałem ze spacjami i efekt ten sam, nie bardzo wiem o co tu chodzi ;-(
Przechwytywanie

@Maurycy, @m2teusz sami siebie wprowadzacie w błąd ponieważ
@Maurycy pisze o konfiguracji sensor w HA - "U siebie mam zrobione tak, w configuration.yaml" - plik configuration.yaml to plik konfiguracyjny w HA a Ty @m2teusz próbujesz tę konfiguracje zastosować w ESPHome co napewno nie będzie działać. Czy coś wymaga jeszcze wyjaśnienia?

Dziękuję kolego za wyjaśnienie a czy był byś wstanie podpowiedzieć jak to powinno wyglądać ESPhome

Trzeba wkleić cała swoją konfiguracje a nie jakieś wyrywki .

Poniżej moje marne wypociny:

esphome:
  name: esp-recuperation
  friendly_name: Recuperation

esp8266:
  board: d1_mini

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxx"

ota:
  password: "xxx"

wifi:
  ssid: "xxx"
  password: "xxx"
  
  use_address: 192.168.10.100
  power_save_mode: none
  fast_connect: true

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp-Recuperation"
    password: "0zZyhPl750kW"

captive_portal:

dallas:
  - pin: D1 

sensor:
  - platform: dallas
    address: 0xa73de1e380b20c28
    name: "Exhaust Air Temperature"
    id: exhaust
    icon: "mdi:home-export-outline"
  - platform: dallas
    address: 0xe63de1e380a9b128
    name: "Outdoor Air Temperature"
    id: outdoor
    icon: "mdi:home-import-outline"
  - platform: dallas
    address: 0x903de1e380f02928
    name: "Supply Air Temperature"
    id: supply
    icon: "mdi:home-import-outline"
  - platform: dallas
    address: 0x803de1e380b4c328
    name: "Return Air Temperature"
    id: return_temp
    icon: "mdi:home-export-outline"
  - platform: template
    name: req_sprawnosc
    unit_of_measurement: '%'  
    lambda: return {(100*(states id(supply)|float - states id(outdoor)|float) / (states id(return_temp)|float - states id(outdoor)|float)) | float(0)|round(1) }}"  

Ten kod generuje Tobie błędy ? Jakie ?

Nie widzę tu błędów w konfiguracji INFO Configuration is valid!

A podczas kompilacji:

INFO ESPHome 2023.9.3
INFO Reading configuration /config/esphome/esp-recuperation.yaml...
INFO Generating C++ source...
INFO Compiling app...
Processing esp-recuperation (board: d1_mini; framework: arduino; platform: platformio/espressif8266@3.2.0)
--------------------------------------------------------------------------------
HARDWARE: ESP8266 80MHz, 80KB RAM, 4MB Flash
Dependency Graph
|-- ESPAsyncTCP-esphome @ 2.0.0
|-- ESPAsyncWebServer-esphome @ 3.1.0
|-- DNSServer @ 1.1.1
|-- ESP8266WiFi @ 1.0
|-- ESP8266mDNS @ 1.2
|-- noise-c @ 0.1.4
Compiling .pioenvs/esp-recuperation/src/main.cpp.o
/config/esphome/esp-recuperation.yaml:61:140: warning: missing terminating " character
   61 |     lambda: return {(100*(states id(supply)|float - states id(outdoor)|float) / (states id(return_temp)|float - states id(outdoor)|float)) | float(0)|round(1) }}"
      |                                                                                                                                            ^
/config/esphome/esp-recuperation.yaml:61:140: error: missing terminating " character
/config/esphome/esp-recuperation.yaml: In lambda function:
/config/esphome/esp-recuperation.yaml:61:21: error: 'states' was not declared in this scope; did you mean 'static'?
   61 |     lambda: return {(100*(states id(supply)|float - states id(outdoor)|float) / (states id(return_temp)|float - states id(outdoor)|float)) | float(0)|round(1) }}"
      |                     ^~~~~~
      |                     static
/config/esphome/esp-recuperation.yaml:61:27: error: expected ')' before 'supply'
   61 |     lambda: return {(100*(states id(supply)|float - states id(outdoor)|float) / (states id(return_temp)|float - states id(outdoor)|float)) | float(0)|round(1) }}"
      |                    ~      ^~~~~~~
      |                           )
/config/esphome/esp-recuperation.yaml:61:137: error: expected ')' before '}' token
   61 |     lambda: return {(100*(states id(supply)|float - states id(outdoor)|float) / (states id(return_temp)|float - states id(outdoor)|float)) | float(0)|round(1) }}"
      |               ~                                                                                                                         ^~
      |                                                                                                                                         )
/config/esphome/esp-recuperation.yaml:61:138: error: could not convert '{<expression error>}' from '<brace-enclosed initializer list>' to 'esphome::optional<float>'
   61 |     lambda: return {(100*(states id(supply)|float - states id(outdoor)|float) / (states id(return_temp)|float - states id(outdoor)|float)) | float(0)|round(1) }}"
      |                                                                                                                                          ^
      |                                                                                                                                          |
      |                                                                                                                                          <brace-enclosed initializer list>
/config/esphome/esp-recuperation.yaml:61:139: error: expected ';' before '}' token
   61 |     lambda: return {(100*(states id(supply)|float - states id(outdoor)|float) / (states id(return_temp)|float - states id(outdoor)|float)) | float(0)|round(1) }}"
      |                                                                                                                                           ^
      |                                                                                                                                           ;
/config/esphome/esp-recuperation.yaml: In function 'void setup()':
/config/esphome/esp-recuperation.yaml:61:140: error: expected ')' before '}' token
   61 |     lambda: return {(100*(states id(supply)|float - states id(outdoor)|float) / (states id(return_temp)|float - states id(outdoor)|float)) | float(0)|round(1) }}"
      |                                                                                                                                            ^
      |                                                                                                                                            )
src/main.cpp:330:41: note: to match this '('
  330 |   template__templatesensor->set_template([=]() -> optional<float> {
      |                                         ^
/config/esphome/esp-recuperation.yaml: At global scope:
/config/esphome/esp-recuperation.yaml:62:4: error: expected unqualified-id before ')' token
/config/esphome/esp-recuperation.yaml:68:3: error: 'App' does not name a type
/config/esphome/esp-recuperation.yaml:69:1: error: expected declaration before '}' token
*** [.pioenvs/esp-recuperation/src/main.cpp.o] Error 1
========================= [FAILED] Took 12.56 seconds =========================

(1) }}"

cudzysłowów - masz tyko zamykający

Zrobiłem trochę na około ale działa

captive_portal:

dallas:
  - pin: D1 

sensor:
  - platform: dallas
    address: 0xa73de1e380b20c28
    name: "Exhaust Air Temperature"
    id: exhaust
    icon: "mdi:home-export-outline"
  - platform: dallas
    address: 0xe63de1e380a9b128
    name: "Outdoor Air Temperature"
    # -0,6 st. C
    id: outdoor
    icon: "mdi:home-import-outline"
  - platform: dallas
    address: 0x903de1e380f02928
    name: "Supply Air Temperature"
    id: supply
    icon: "mdi:home-import-outline"
  - platform: dallas
    address: 0x803de1e380b4c328
    name: "Return Air Temperature"
     # -0,3 st. C
    id: return_temp
    icon: "mdi:home-export-outline"
  
  
  - platform: template
    name: "Temperature Efficiency"
    unit_of_measurement: '%'  
    icon: "mdi:chart-bell-curve-cumulative"
    update_interval: 60s
#  lambda: return "{(100*(states id(supply)|float - states id(outdoor)|float) / (states id(return_temp)|float - states id(outdoor)|float)) | float(0)|round(1) }}"  
#  lambda: return {(100*(states('Return Air Temperature')|float - states('Outdoor Air Temperature')|float) / (states('Return Air Temperature')|float - states('Outdoor Air Temperature')|float))}
    lambda: |-
      float supp = id(supply).state;
      float outd = id(outdoor).state;
      float retu = id(return_temp).state;
      float exha = id(exhaust).state;
      return ((supp - outd) / (retu - outd)) * 100;

Edit:

Ma ktoś może pomysł jak “zabezpieczyć” aby wartość zwracana była w zakresie 0-125%, niestety zdarza się ze wartości są od -500 do +600 (sic!).

1 polubienie

Nie wiem czy rozwiązałeś problem, ale pewno polega on na tym, że -500 do +600% wynika z błędnych odczytów temperatury jednego z czujników. Załóż sobie filtr na odczyty temperatury, że jeśli poza jakimś sensownym zakresem, to jakaś wartość…