DIY Heizkörperlüfter mit ESPHome und HomeAssistant

Hallo helge 1,
danke für die Antwort habe ich jetzt auch kapiert :slight_smile:
Ich habe hier einen anderen RelaisTyp https://de.aliexpress.com/item/1005002147923725.html?spm=a2g0o.order_list.order_list_main.41.72f95c5fTJ19g7&gatewayAdapt=glo2deu
Der funktioniert auch soweit, d.h. ich kann die Temperatur einlesen und das PWM Signal wird auch ausgegeben aber das Relais schaltet einfach nicht. Laut Anleitung soll

Relais steuerungs befehl (Hex Hex-Format):
Schlagen relais: a0 01 01 a2
Relais schließen: a0 01 00 a1 <

also sind die UART Befehle auch gleich. Ich habe schon ein anderes Modual ausprobiert aber immer die gleich Reaktion.
Habt ihr hier noch eine Idee
Vielen dank schon mal die beste Comunity hier.
Gruß
Andreas

Hallo @all,
jetzt kann ich auch mal beitragen, das Modul von Ali wie im Bild arbeitet nur mit einer Baudrate von 115200. Also einfach im Code “baude_rate: 115200” eintragen und schon funktioniert das auch mit dem Modul.

grafik

Hi,

ich versuche auch gerade das Projekt umzusetzen. Bei mir scheitert es allerdings irgendwie schon am Flashen des ESP.
Ich habe genau die Sachen bestellt, die oben verlinkt sind. Wenn ich den ESP auf das Programmiermodulstecke und beides in den USB Port, flackert die blaue LED kurz. Ist dann aber aus.
Ich bekomme absolut keine Verbindung. Egal ob ich es an den Raspi mit HomeAssistant stecke oder an den USB Port meines PC.
Ich kann auch die Baudrate nicht verstellen.
Einen Boot-Button habe ich nicht.
Und wie ich den GPIO0 to GND verbinden soll, ist mir auch ein Rätsel. Die Pins stecken ja im Programmiermodul…

Vielleicht hat noch jemand eine Idee.

Vielen Danke
tors10


Drahtbrücke anlöten !?!? - nur mal so ne Idee

Ich könnte was dran löten und dann wieder die Brücke entfernen und das mache ich dann 3x und dann ist das Modul hinüber.
Die Brücke muss ja nur initial beim ersten Flashen drin sein, um ins Bootmenue zu kommen. Danach nicht mehr.

Mach die auf dem Programmieradapter drauft, da kannst die drauf lassen - hab ich auch so gemacht.

1 „Gefällt mir“

Wenn man es gescheit macht, funktioniert es auch. Danke für den Tipp!
Jetzt gehts ans einbinden…

Tolles Thema! Bitte entschuldigt meine Anfängerfragen:

  1. Der Bestelllink “ESP-01S” führt zum einem ESP8266. Der Bestelllink “Relaisplatine” enthält ebenfalls einen ESP8266, zumindest verstehe ich die Beschreibung so (“The WiFi relay module is equipped with an ESP8266…”). Es reicht doch ein Controller, oder?

  2. Kann man den Lüfter nicht auch per PWM zum stehen bringen? Welchen Mehrwert hat es, ihn per Switch zu schalten?

@JK123
Die Platine hinter dem Bestelllink beinhaltet bereits einen aufgesteckten ESP01 respektive einen esp8266 Controller. Da muss sonst nix mehr dazu bestellt werden.

Zu Frage 2, manche Lüfter scheinen stehen zu bleiben, wenn man das PWM Signal ganz runter dreht. Die Regel ist das aber nicht.

Ich habe für die nächste Heizsaison auch vor, meine Heizkörper zwangszubelüften, da ich gerade dabei bin meine WP einzubauen und fange bereits an, einen Prototyp zu bauen. Allerdings habe ich festgestellt, dass meine 12V Platine relativ warm wird und verhältnismäßig viel verbraucht (0,5-0,6W ohne Lüfter) Mein Dev Board mit NodeMCU verbraucht laut Energy Check 3000 nur die Hälfte.
Kann das jemand bestätigen, oder habe ich nur eine billige Chinaversion erworben.

Ich hab aus diesem Grund mal die Spannung auf 9V reduziert und siehe da, das Teil wird weniger warm und verbraucht jetzt auch nur noch 0,2W. Wichtig ist aber, das Relais schaltet noch und die Lüfter drehen sich auch noch mehr als ausreichend. PWM funktioniert auch. Wenn ich es schaffe die Spannung noch ein paar zehntel Volt zu reduzieren, könnte der Lüfter auch ohne Relais stehen bleiben. Bei 9V und runtergeregelten PWM steht der Lüfter fast still. Allerdings weiß ich nicht, ob die Lüfter wirklich keinen Strom mehr ziehen, wenn sie still stehen.

VG
Rubinho

Das mit dem Stromverbrauch der Relaisplatine kann ich bestätigen. Bei mir sind es 0,9W incl. Netzteil, wobei ich nicht weiß, wie genau mein Messgerät in diesem Bereich ist.
Mit einem (!) angeschlossenen langsam drehenden Lüfter sind es 2,3W. Mehrere Lüfter habe ich noch nicht angeschlossen. Mein Lüfter ist ein Xilence 120mm Modell (XPF120.R.PWM)

Ok, ein kleines Problem ist aufgetaucht. Und erst jetzt (meine Heizung läuft seit gestern wieder) bemerke ich, dass meine Esp-programmierung nicht mehr online ist.
Ursache war ein ESPHome Update von 2024.05, bei den umfangreiche Änderungen eingepflegt wurden
( ESPHome 2024.6.0 - 19th June 2024 — ESPHome )
Nun habe in den Code die Änderungen eingepflegt, komme aber mit Fehlermeldungen beim Install oder Validate nicht weiter. Hier meine Fehlermeldung:

INFO ESPHome 2024.9.1
INFO Reading configuration /config/esphome/esp01-heizkoerper-fan-wohnzimmer.yaml...
ERROR Error while reading config: Invalid YAML syntax:

while parsing a block mapping
  in "/config/esphome/esp01-heizkoerper-fan-wohnzimmer.yaml", line 1, column 1
expected <block end>, but found '<block sequence start>'
  in "/config/esphome/esp01-heizkoerper-fan-wohnzimmer.yaml", line 162, column 3

Hier mein Code:

substitutions:
  devicename: esp01-hz-fan-wohnzimmer
  upper_devicename: ESP01-Heizkoerper-Fan-Wohnzimmer
  DallasID: "3C050457505B"
  IPAddress: "192.168.1.135"
  ApiKey: "apikey"
  OTAPass: "otapass"
  APPass: "password"

esphome:
  name: $devicename

esp8266:
  board: esp01_1m
  restore_from_flash: true

preferences:
    flash_write_interval: 3min

# Enable logging
logger:
#  level: VERBOSE
  baud_rate: 0

debug:
    #update_interval: 5s

# Enable Home Assistant API
api:
  encryption:
    key: ${ApiKey}

ota:
  platform: esphome
  password: ${OTAPass}

wifi:
  ssid: Blaufrosch-Fritzbox7490-2,4Ghz
  password: Ez&34gdB?!QQ!
  domain: .fritz.box
  manual_ip:
    static_ip: ${IPAddress}
    subnet: 255.255.255.0
    gateway: 192.168.1.1
    dns1: 192.168.1.1

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: ${upper_devicename}
    password: ${APPass}

captive_portal:

uart:
  baud_rate: 9600
  tx_pin: 1
    
switch:
  - platform: template
    id: FanRelais
    internal: true
    optimistic: true
    restore_mode: RESTORE_DEFAULT_OFF 
    turn_on_action:
      - logger.log: "switch - FanRelais - turn_on_action - uart.write: Turn On!"
      - uart.write: [0xA0, 0x01, 0x01, 0xA2]
    turn_off_action:
      - logger.log: "switch - FanRelais - turn_off_action - uart.write: Turn Off!"
      - uart.write: [0xA0, 0x01, 0x00, 0xA1]

  - platform: template
    name: "${upper_devicename} ManualMode"
    id: ManualMode
    optimistic: true
    restore_mode: RESTORE_DEFAULT_ON

button:
  - platform: restart
    name: "${upper_devicename} Restart"   
    disabled_by_default: true
  - platform: factory_reset
    name: "${upper_devicename} Factory reset"   
    disabled_by_default: true

    
#DS18B20 shared bus pin, needs external 4.7k ohm pull-up resistor to 3.3V
one_wire:
  - platform: gpio
    pin: GPIO0

output:
  - platform: esp8266_pwm
    pin: GPIO2
    frequency: 20000 Hz
    id: pwm_output
    
fan:
  - platform: speed
    output: pwm_output
    name: ${upper_devicename} Ventilatoren
    id: fans
    on_turn_on:
      - logger.log: "Fan - on_turn_on - Relais turn On!"
      - switch.turn_on:
          id: FanRelais
    on_turn_off:
      - logger.log: "Fan - on_turn_off - Relais turn Off!"
      - switch.turn_off:
          id: FanRelais 


#Math: ((10/3)*Temp)-(63 1/3)
#Math: ((10/3)*Temp)-(63,333)
#Math: ((3,3)*Temp)-(63,333)
    
sensor:
    address: 0x7f3c050457505b28
    name: ${upper_devicename} Heizkörpertemperatur
  
    id: temp
    on_value:
      then:
        - logger.log:
            format: "Dallas - on_value - Temp: %.1f - ManualMode: %s"
            args: [ 'id(temp).raw_state', 'id(ManualMode).state ? "ON" : "OFF"' ]
  
        - if: 
            condition: 
              and:
                - switch.is_off: ManualMode
                - lambda: |-
                        int tmp = id(temp).state;
                        return (tmp >= 33);
            then:
              - logger.log:
                  format: "Dallas - on_value - start - Temp (%.1f)"
                  args: [ 'id(temp).raw_state' ]
              - fan.turn_on:
                  id: fans
                  speed: !lambda |-
                    int fanvalue = ((4) * id(temp).raw_state) - 80;
                    fanvalue = fanvalue > 70 ? 70 : fanvalue;
                    return fanvalue;
              - logger.log:
                  format: "Dallas - on_value - end - Temp (%.1f) => Fan-Value %i"
                  args: [ 'id(temp).raw_state', 'id(fans).speed' ]
            else:
              - if: 
                  condition: 
                    and:
                      - switch.is_off: ManualMode
                      - lambda: |-
                              int tmp = id(temp).state;
                              return (tmp <33);
                  then:
                    - fan.turn_off:
                        id: fans
                    - logger.log:
                        format: "Dallas - on_value - Temp (%.1f) < 33 => Fan Off"
                        args: [ 'id(temp).raw_state' ]



  - platform: uptime
    id: Uptime
    internal: true
    update_interval: 60s
    disabled_by_default: true
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: esp01_gas_uptime_human
            state: !lambda |-
              int seconds = round(id(Uptime).raw_state);
              int days = seconds / (24 * 3600);
              seconds = seconds % (24 * 3600);
              int hours = seconds / 3600;
              seconds = seconds % 3600;
              int minutes = seconds /  60;
              seconds = seconds % 60;
              return (
                (days ? to_string(days) + "d " : "") +
                (hours ? to_string(hours) + "h " : "") +
                (minutes ? to_string(minutes) + "m " : "") +
                (to_string(seconds) + "s")
              ).c_str();

  - platform: wifi_signal
    internal: true
    id: rssi_sensor

  - platform: template
    name: "${upper_devicename} Wifi"
    unit_of_measurement: "%"
    accuracy_decimals: 0
    icon: "mdi:wifi"
    update_interval: 60s
    disabled_by_default: true
    lambda: |-
      // Taken from   https://github.com/tzapu/WiFiManager/blob/master/...
      int quality;
      const int rssi = id(rssi_sensor).state;
      if(rssi <= -100){quality = 0;}
      else if (rssi >= -50){quality = 100;}
      else{quality = 2 * (rssi + 100);}
      return quality;

time:
  - platform: homeassistant
    id: homeassistant_time

      
text_sensor:
  - platform: version
    name: ${upper_devicename} ESPHome Version
    disabled_by_default: true
  - platform: wifi_info
    ip_address:
      name: ${upper_devicename} IP Address
      disabled_by_default: true
    ssid:
      name: ${upper_devicename} SSID
      disabled_by_default: true
    bssid:
      name: ${upper_devicename} BSSID
      disabled_by_default: true
  - platform: template
    id: esp01_gas_uptime_human
    name: ${upper_devicename} Uptime Human Readable
    icon: mdi:clock-start
    disabled_by_default: true
  - platform: debug
    device:
      name: "${upper_devicename} Device Info"
      disabled_by_default: true
    reset_reason:
      name: "${upper_devicename} Reset Reason"
      disabled_by_default: true



web_server: # creates a web server where you can access all this stuff without home assistant (good for debugging or working headless (no HA))
  port: 80
  include_internal: true
  ota: true

binary_sensor: # exposes online status
  - platform: status
    name: "${upper_devicename} Status"
    disabled_by_default: false

Hallo Helge1,
wo bzw. wie hat du den Pullup-Widerstand eingebaut, und welchen Wert? Ich habe das gleiche Problem, aber schon mit nur einem Lüfter.

Wundert mich, dass hier so viel auf das kombinierte ESP8266+Relais-Board gesetzt wird (OK, ist kostengünstig und klein) aber wenn man sich ein D1 Mini Board und ein Relaisboard getrennt kauft, dann kann man den ESP ganz einfach über USB flashen ohne Brücken löten zu müssen und man hat viel mehr Anschlüsse frei für weitere Komponenten.

z.B.

(die Links warn ne Schnellsuche, hab das genaue Kleingedruckte dabei noch nicht gelesen => Also könnte besser Angebote geben)

Ohne es technisch zu verstehen habe ich testweise einen 4K7 Widerstand eingebaut um den PWM-Ausgang nach 3,3V zu ziehen. Genau das gleiche Prinzip wie beim Sensor. Jetzt läuft der Prozessor zuverlässig an.

Der Vorteil ist das man nur eine Spannung braucht, hier 12 V für die Lüfter und das Board.
Wenn du die Bauteile einzeln nimmst musst du dir erst eine Lösung überlegen wie du den D1 versorgst und die Lüfter.

Ich verstehe gerade auch noch nicht so ganz, wie mit zwei GPIOs zwei Dinge ausgegeben und eins eingelesen wird. Die 12V-Relais-Boards, die bei mir ankamen, haben einfach GPIO0 mit dem Relais verbunden; der Code scheint aber ueber TX das Relais schalten zu wollen. Haben eure Relaisboards irgendwelche Jumper, mit denen man TX aufs Relais legen kann? Oder habe ich jetzt einfach das falsche Board und kann nur an/aus, aber kein PWM?

Soweit ich das hier verstanden habe, wird ein spezielles Relais/ESP Board verwendet, welches das Relais über den UART-Bus schaltet. Das heißt auf der Platine ist der ESP per UART mit irgend einem Hilfs-IC verbunden, welcher das Relais schaltet.
Das aufgesteckte ESP-01 Board stellt zusätzlich zur UART-Verbindung noch zwei GPIOs bereit (GPIO-0 und GPIO-2) . GPIO-0 wird für das Einlesen des Dallas Temperatursensors verwendet und GPIO-2 für die PWM Geschwindigkeitsregelung der Lüfter. Zum Anschließen der GPIOs muss man die Anschlußkabel auf der Rückseite der Platine an die abgebildeten GPIO-Lötpunkte löten.
Es gibt auch Boards mit Relais und ESP-01, wo das Relais einfach über GPIO-0 geschaltet wird (ich kannte bisher nur diese Boards). Hier könnte man die Geschwindigkeitsregelung über GPIO-2 laufen lassen, für den Temperatursensor wäre allerdings kein GPIO mehr übrig. TX ist bei diesen Boards auch GPIO-1, vielleicht könnte man das für den Temperatursensor verwenden. Allerdings werden TX und RX auch zum Programmieren des ESP-01 verwendet, daher ist möglicherweise eine andere Verwendung nicht möglich…

Ja, dass das per UART schalten soll, hab ich dann spaeter verstanden, ich hab nur noch nicht verstanden, wie die Platine beschaltet ist dafuer :smiley: Es scheint sich wohl um diese Variante zu handeln, der Link oben fuehrt auf was anderes.

Ich habe Boards, wo nur GPIO0 das Relais schaltet. An das Auslesen via TX oder RX hab ich auch schon gedacht. Wenn das Modul in der Relaisplatine steckt, ist das ja egal – fuers Programmieren muesste man es sowieso wieder herausnehmen.

Guten Morgen zusasmmen,

ich folge dem Post bereits seit längerer Zeit da mir alle Heizungbooster-/verstärker alle zu “dumm” für den aufgerufenen Preis sind. Vor allem die dynamische Steuerung von Smarten Fensterthermostaten in Kombi mit Kontaktssensoren ist mir wichtig.

Auch sehe ich das Potential nicht ganz ausgeschöpft das etwa da soft erwähnte Problem der Staubentwicklung meines Erachtens eine Frage des Betrachtungwinkel ist. Ganz nach dem Motto “A feature, not a bug” könnten man ein Netz vor Ventilatoren setzen um den Staub einzufangen. In Kombi mit den Lüftern auf 100% könnte man die Luft damit indirekt reinigen.

Auch die Sensorik ist erweiterbar um eine bessere Analyse & Steuerung zu erhalten:

  1. Temp-Ssenoren für beide Heizungsrohe (Ein- & Abgang) um Rücklauf-Temps zu messen
    H11343 - Littelfuse
  2. Temp-Sensor für Zu- und Abluft zur beseren Lüftersteuerung (den Swetspot für die Wärmeübertragung finden)
  3. PWM-Lüfter mittels intelligenterer Steuerung (Hysterese) um sich an Trägheit der Heizung anzupasen und für leiseren Betrieb während der nacht (Bsp. https://getfancontrol.com/)

Ich möchte Euch daher meinen aktuellen Rechereche-Stand mit allen Quellen teilen um der Community evt. etwas auf die Sprünge zu helfen. Ich suche auch aktiv nach Experten die Interesse daran hätten das Projekt aktiv & bezahlt weiter zu verfolgen.

Hier meine Recherchequellen:

Quelle 1

  • Teile
  • 3D Druck Daten

Quelle 2

  • Schaltplan

Quelle 3

  • Teileliste
  • Schaltplan
  • Software

Quelle 4
Sehr gute Serie mit vielen Erläuterungen und Detail in welchen Situation der Booster nicht verwendet werden sollte!

Teil 1: https://www.youtube.com/watch?v=mOFhHYtmqNk
Teil 2: https://www.youtube.com/watch?v=p8Asbv4lzyY
Teil 3: https://www.youtube.com/watch?v=eeTRLoJ-gXQ
Teil 4: https://www.youtube.com/watch?v=Fw7aeaNneBY

Quelle 5
Dieser Post

Quelle 6
Studie aus “Case Studies in Thermal Engineering”. Sehr interesant zu lesen. Sonst aber wenig Mehrwert

Quelle 7
Reddit Thread - nur genereller Austausch
https://www.reddit.com/r/Energiewirtschaft/comments/1abeezz/experiment_was_bringen_heizungsbooster/

Quelle 8
Alternatives Design (patentiert)

Meine Geräte die ich daheim im Einastz habe und mit denen ich sehr zufrieden bin:
Thermosstate

Kontaktsensoren

Luft-Senssoren (zur doppelten Kontrolle)

Steckdosen (nur indirekt relevant)

Hallo @mathmoe ,
finde dein Projekt mega. Habe mir schon die Komponenten geholt. In Sachen ESPHome bin ich nicht so fit, aber es sieht so aus als wenn durch das neueste Update vom ESPHome sich einige Befehle geändert haben oder nicht mehr funktionieren. hast du evtl eine aktuelle Konfiguration die du zur Verfügung stellen kannst? Das wäre super, da ich aktuell bissle aufm Schlauch stehe