NEWS
Temperatur mit Potentiometer simulieren: Lösung mit ESPHome
-
Hallo zusammen,
lange habe ich gebraucht, aber am Ende hat es doch geklappt...
Folgende Ausgangsituation:
In meiner Lüftungsanlage sind 2 Enthalpierückgewinner (Wärmeräder) verbaut. Die Drehzahl (=Leistung zur Rückgewinnung von Feuchte und Temperatur aus der Abluft) ist abhängig von der Außentemperatur, die mit einem NTC 10kOhm im Gerät gemessen wird (niedrige Außentemperatur = hohe Leistung, hohe Außentemperatur = k(l)eine Leistung). Problem ist, dass die Effizienz der Wärmeräder so hoch ist, dass ich im Winter die Feuchtigkeit nicht aus dem Haus bekomme und ich zusätzlich Stoßlüften muss, was ja nicht im Sinne des Erfinders ist. Ich muss also irgendwie die Drehzahl der Wärmeräder steuern, um noch die maximale Wärme aus der Abluft zu holen, ohne dass mir die Hütte zu feucht wird.Das einfachste erscheint mir, den NTC 10kOhm mit einem Potentiometer zu simulieren. Dazu habe ich das x9c104s (0 - ca. 100 kOhm) ausgewählt, damit kann ich den gesamten Temperaturbereich abdecken, um die Drehzahl von 0 - 100% anzusteuern. Besser wäre der x9c503s (50 kOhm) gewesen (feinere Abstufung), den habe ich aber nicht als fertiges Bauteil gefunden. Die NTC 10 kOhm Kennlinie steht im Internet als Wertetabelle zur Verfügung.
Ich habe also den NTC-Fühler im Gerät von der Platine abgeklemmt (Garantie ist aufgrund des Alters schon erloschen) und das digitale Potentiometer angeschlossen, um eine Temperatur und damit die über eine Kennlinie in der Elektronik vorgegebene Drehzahl einzustellen.
Lösung mit ESPHome:
Es kommen folgende Komponenten zum Einsatz:-
x9c104s als fertiges Bauteil
-
ESP8266 D1 Mini mit USB-Netzteil
-
8.1 kOhm Widerstand
Das Ganze wird wie folgt verkabelt:
- 5V und G vom D1 Mini abgreifen und an VCC und GND vom x9c anschließen (einer von beiden Pins, welcher ist egal)
- D1 an CS (im Bild: graues Kabel)
- D2 an U/D (rotes Kabel)
- D3 an INC (gelbes Kabel)
- RL unbedingt auf GND (orangenes Kabel), sonst werden Fantasie-Widerstandswerte gemessen.
- RW mit dem 8.1 kOhm Widerstand beschalten, so dass bei Potentiometeransteuerung "0" (=0.00 kOhm) 8.1 kOhm (= ca. 29.5°) gemessen werden und die Steuerung keine Störung erkennt. Ich hatte zufällig 8.1 kOhm rumliegen, was für meinen Anwendungsfall passt. Je nach Anwendungsfall können andere Widerstände besser geeignet sein oder man braucht gar keinen.
- Am Ausgang vom 8.1 kOhm Widerstand wird der variablen Widerstand zur Verfügung gestellt (weißes Kabel), gemessen gegen
- RL: Das ist die Masse des digitalen Potis (grünes Kabel).
Angesteuert wird das Potentiometer mit einem Wert von 0-100%, wobei man die Auflösung von 100 Schritten beachten muss (also ganze Zahlen zur Ansteuerung nehmen). In manchen Situationen verhält sich das Poti etwas eigenwillig, z.B.:
- Zu schnelle Wertänderungen (z.B. < 3 Sekunden) führen dazu, dass der Widerstandswert nicht mehr zur Ansteuerung passt. 50% sollten 50 kOhm sein (+-20% Toleranz lt. Hersteller beachten), das kann aber bei zu schneller Änderung auseinanderlaufen, das heißt bei 50% hat das Ding auf einmal z.B. nur noch 40 kOhm.
- Wird der selbe Wert mehrfach hintereinander geschrieben (z.B. zeitgetriggert) verändert sich der Widerstandswert, so dass Ansteuerung und Widerstand auseinanderlaufen (z.B. 46% = 46 kOhm, 46% = 44 kOhm, 46% = 42kOhm etc.). Wert also nur schreiben, wenn er sich verändert.
- Bei erhöhen des Wertes um 1% (z.B. 42 % => 43 % => 44%) - trotz ausreichender Zeit zwischen den Sprüngen - kann es sein, dass der Widerstand schrittweise reduziert wird, obwohl er steigen sollte und irgendwann ist bei einer Ansteuerung von z.B. 50% der Widerstand 0 kOhm. Hier probiere ich gerade, ob sich das über z.B. 5% Schritte verhindern lässt.
- Ein Auseinanderlaufen lässt sich beheben, wenn das Poti genullt wird (Ansteuerung 0% = 0 kOhm).
- Es kann noch mehr Eigenwilligkeiten geben, die oben sind mir bisher aufgefallen.
Die yaml Konfiguration sieht wie folgt aus:
esphome: name: "lueftung-drehzahl-wrg" esp8266: board: d1_mini # Enable logging logger: # Enable Home Assistant API api: reboot_timeout: 0s # Allow OTA updates ota: # "Visit" im Dashboard web_server: wifi: ssid: ... password: ... manual_ip: static_ip: ... gateway: ... subnet: ... #Potentiometer output: - platform: x9c id: x9c_pot cs_pin: D1 ud_pin: D2 inc_pin: D3 initial_value: 0.01 number: - platform: template id: Drehzahl_Input name: "Drehzahl Input" optimistic: true min_value: -20 max_value: 120 initial_value: 0 step: 2 on_value: then: - output.set_level: id: x9c_pot level: !lambda |- return id(Drehzahl_Input).state / 100.0;
wifi:
muss natürlich den lokalen Gegebenheiten angepasst werden.
output:
- hier wird das Poti nach ESPHome-Anleitung konfiguriert. Die Pins können anders vergeben werden, dann muss die Verdrahtung entsprechend angepasst werden
number:
- wird über den ESPHome-Adapter als Objekt im ioBroker angelegt
- lässt sich damit aus ioBroker über die API verändern
- min: -20, max: 120: Warum Werte > 100 und < 0? Es kann vorkommen, dass durch das Auseinanderlaufen von Ansteuerung und Widerstandswert bei 0% z.B. 4 kOhm anstatt 0 kOhm ausgegeben werden. Mit einer negativen Ansteuerung zieht man 0% wieder auf 0 kOhm. Analog dazu die 100% Ansteuerung.
- mit
on_value: then: - output.set_level: id: x9c_pot level: !lambda |- return id(Drehzahl_Input).state / 100.0;
wird der Wert (number), der von ioBroker oder über den Schieberegler (Web-Server vom D1 Mini) kommt, an den "output" mit der ID des Poti gegeben.
Jetzt kann man sich überlegen, wie man den Wert des Poti (number) im ioBroker generiert: über manuelle Eingabe oder automatisiert über ein Script. In meinem Fall verwende ich den PID-Regler-Adapter und regle die Zuluft-Feuchte.
-