Lüftungsanlage anhand des CO2-Wertes mit openHAB steuern
Eiko WagenknechtIn diesem Artikel zeige ich, wie du mit openHAB eine Lüftungsanlage automatisch basierend auf dem CO2-Wert im Raum steuern kannst. Als Hardware verwende ich die Maico Push/Pull 45 Lüftungsanlage und einen Netatmo CO2-Sensor, aber die Prinzipien lassen sich problemlos auf andere Systeme übertragen.
Inhaltsverzeichnis
Version
Zum Zeitpunkt der Veröffentlichung dieses Artikels war openHAB 3.0.1 aktuell. Bei neueren Versionen könnten sich Details geändert haben. Hinterlasse gerne einen Kommentar, falls du Anpassungen für neuere Versionen kennst - ich aktualisiere dann diesen Artikel.
Verwendetes Material
- Lüftungsgeräte Maico PushPull 45 RC (ca. 480 EUR)
- Homematic CCU3 (ca. 140 EUR)
- EnOcean USB 300 Gateway (ca. 57 EUR)
- CUxD EnOcean Lizenz (ca. 40 EUR)
- Netatmo Wetterstation (ca. 155 EUR)
- ggf. zusätzliches Innenmodul für die Station (ca. 65 EUR)
- Raspberry Pi für openHAB (z.B. Raspberry Pi 4 mit 4GB RAM, ca. 95 EUR)
- Eine zuverlässige microSD Karte mit mindestens 16GB (empfohlen: Samsung PRO Endurance 64GB, ca. 14 EUR)
- Kartenleser für die microSD Karte (ca. 14 EUR)
Das beschriebene Konzept funktioniert auch mit anderen Lüftungsgeräten, die an openHAB angebunden werden können, oder mit anderen CO2-Sensoren.
Vorbedingungen
Voraussetzung ist, dass sowohl die Lüftungsanlage als auch der CO2-Sensor bereits in openHAB eingebunden sind. In meinem Fall habe ich die Lüftungsanlage über die Homematic CCU3 angebunden, da ich Homematic schon länger als openHAB nutze. Die Einrichtung dieser Verbindung ist relativ komplex und in einem separaten Artikel beschrieben. Die Homematic-Zentrale ist über das Homematic Binding mit openHAB verbunden. Die Netatmo-Sensoren sind direkt über das Netatmo Binding in openHAB eingebunden.
Items
Für die Steuerung der Anlage stehen bei mir folgende Items zur Verfügung:
Lüftungsanlage:
Group e_EG_Buero_Lueftung "Lüftungsanlage" (r_EG_Buero) ["Fan"]
Number EG_Buero_Lueftung_Stufe_Ist "Aktuelle Stufe [%d]" (e_EG_Buero_Lueftung) ["Measurement"] { channel="homematic:GATEWAY-EXTRAS-CCU3:ccu3:GWE00000000:1#Lueftung-BueroSchlafzimmer-Ist" }
Number EG_Buero_Lueftung_Stufe_Soll "Eingestellte Stufe [%d]" (e_EG_Buero_Lueftung) ["Control"] { channel="homematic:GATEWAY-EXTRAS-CCU3:ccu3:GWE00000000:1#Lueftung-BueroSchlafzimmer-Soll" }
Dimmer EG_Buero_Lueftung_Stufe_Soll_Prozent "Eingestellte Stufe [%d %%]" { ga="Fan" [ name="Büro Lüfter", speeds="0=aus:null,20=eins,40=default:zwei,60=drei,80=vier,100=maximal:fuenf", lang="de", ordered=true ] }
Switch EG_Buero_Lueftung_Automatik "Automatikmodus (CO2)" (e_EG_Buero_Lueftung) ["Switch"]
Netatmo:
Group e_EG_Buero_Netatmo "Netatmo" (r_EG_Buero) ["Sensor"]
Number:Dimensionless EG_Buero_Netatmo_CO2 "CO2 Gehalt [%.0f ppm]" (e_EG_Buero_Netatmo, u_Persist_Change) ["Measurement", "CO2"] { channel="netatmo:NAModule4:api:*****:Co2" }
Number:Temperature EG_Buero_Netatmo_Temperatur "Temperatur [%.1f °C]" (e_EG_Buero_Netatmo, u_Persist_Change) ["Measurement", "Temperature"] { channel="netatmo:NAModule4:api:*****:Temperature" }
Number:Dimensionless EG_Buero_Netatmo_Luftfeuchtigkeit "Luftfeuchtigkeit [%.0f rF]" (e_EG_Buero_Netatmo, u_Persist_Change) ["Measurement", "Humidity"] { channel="netatmo:NAModule4:api:*****:Humidity" }
Für die eigentliche Steuerung werden nur EG_Buero_Lueftung_Stufe_Soll
, EG_Buero_Lueftung_Automatik
und EG_Buero_Netatmo_CO2
benötigt. Die anderen Items sind nur der Vollständigkeit halber aufgeführt.
Regeln
Nach einigem Nachdenken habe ich folgende Steuerungslogik entwickelt:
- Wenn das Fenster im Büro geschlossen ist und der Schlafmodus deaktiviert ist (die Anlage ist mit dem Schlafzimmer gekoppelt und leider recht laut), dann läuft die Anlage im Automatikbetrieb. Andernfalls ist sie ausgeschaltet.
- Im Automatikbetrieb wird alle 5 Minuten (um :00, :05, :10, usw.) der CO2-Wert geprüft.
- Wenn der Wert über 900 ppm liegt, wird die Lüftungsstufe erhöht, maximal jedoch auf Stufe 4 (die Lautstärke ist dann tagsüber noch erträglich).
- Wenn der Wert unter 700 ppm fällt, wird die Stufe reduziert, minimal jedoch auf Stufe 1 (das komplette Ausschalten erzeugt ein störendes Geräusch durch die Absperrung der Luftzufuhr).
In openHAB habe ich dies mit folgenden Regeln umgesetzt:
Aktivieren/Deaktivieren des Automatikmodus
rule "Lüftung - deaktivieren - Büro/Schlafzimmer"
when
Item EG_Buero_Fenster_Offen changed or
Item System_Variable_Schlafmodus changed
then
logDebug("co2", "Führe Regel 'Lüftung (de)aktivieren Büro/Schlafzimmer' aus.")
if (EG_Buero_Fenster_Offen.state == CLOSED && System_Variable_Schlafmodus.state == OFF) {
logInfo("co2", "Lüftungsanlage Büro/Schlafzimmer wird in den Automatikmodus geschaltet.")
EG_Buero_Lueftung_Automatik.sendCommand(ON)
} else {
logInfo("co2", "Lüftungsanlage Büro/Schlafzimmer wird ausgeschaltet.")
EG_Buero_Lueftung_Automatik.sendCommand(OFF)
EG_Buero_Lueftung_Stufe_Soll.sendCommand(0)
}
end
Steuerung anhand des aktuellen CO2-Wertes
rule "Lüftung - An CO2 Wert anpassen - Büro/Schlafzimmer"
when
Time cron "0 0/5 * * * ?" // every 5 minutes
then
logDebug("co2", "Führe Regel 'CO2 Büro/Schlafzimmer' aus.")
if (EG_Kueche_Lueftung_Automatik.state != ON || EG_Wohnen_Lueftung_Automatik.state != ON) {
logDebug("co2", "Automatik Modus für Küche/Wohnzimmer deaktiviert. Keine Aktion.")
return
}
val minLevel = 1
val maxLevel = 4
val setPointLow = 700
val setPointHigh = 900
val currentValue = (EG_Buero_Netatmo_CO2.state as Number).intValue
val currentLevel = (EG_Buero_Lueftung_Stufe_Soll.state as Number).intValue
logDebug("co2", "CO2 gehalt aktuell:" + currentValue)
logDebug("co2", "Zielwert (low):" + setPointLow)
logDebug("co2", "Zielwert (high):" + setPointHigh)
if (currentValue < setPointLow) {
if (currentLevel > minLevel) {
logDebug("co2", "CO2 Wert unter Zielwert, reduziere Lüftungsstufe.")
EG_Buero_Lueftung_Stufe_Soll.sendCommand(currentLevel - 1)
} else {
logDebug("co2", "CO2 Wert unter Zielwert, Level aber bereits auf Minimum. Keine Aktion.")
}
} else if (currentValue > setPointHigh) {
if (currentLevel < maxLevel) {
logDebug("co2", "CO2 Wert über Zielwert, erhöhe Lüftungsstufe.")
EG_Buero_Lueftung_Stufe_Soll.sendCommand(currentLevel + 1)
} else {
logDebug("co2", "CO2 Wert über Zielwert, Level aber bereits auf Maximum. Keine Aktion.")
}
}
end
Schlusswort
Ich freue mich über deine Kommentare, ob dir dieser Beitrag weitergeholfen hat. Schreib gerne, wenn du Fragen hast oder etwas unklar geblieben ist. Ich bin auch gespannt, welche weiteren Automatisierungs-Projekte du damit umsetzen konntest!
Keine Kommentare? Kein Problem.
Dieser Blog unterstützt keine Kommentare, aber deine Gedanken und Fragen sind immer willkommen. Du erreichst mich mich über die Kontaktdaten im Footer unten.
Unterstützung
Wenn diese Seite für dich hilfreich war und du dich bei mir bedanken möchtest, dann freue ich mich ganz außerordentlich darüber, wenn du für deinen nächsten Einkauf bei amazon.de über diesen Link gehst. Ich bekomme dann eine kleine Provision, für dich kostet es keinen Cent extra. Wenn du mich lieber anders unterstützen möchtest, findest du hier weitere Möglichkeiten.