Skip to content

Integration FHEM

tobiasfaust edited this page May 13, 2021 · 14 revisions

Nachdem nun der ESP8266 fröhlich seine Daten ins MQTT schiebt muss nun die Steuerung in FHEM aufgebaut werden.

Basiskonfiguration

Es wird davon ausgegangen das in FHEM bereits ein MQTT Server Device definiert ist.

  • Mosquitto Server via MQTT Modul
  • oder ein FHEM eigener MQTT Broker via MQTT_SERVER Modul

Gehen wir davon aus das der ESP8266 über die Weboberfläche analog des Minimalbeispiels wie folgt konfiguriert wurde:

  • Hostname: PumpControl
  • 1 Ventil mit dem SubTopic: Ventil1

In FHEM wird daher der ESP8266 wie folgt definiert:

defmod PumpControl MQTT_DEVICE
attr PumpControl publishSet_Ventil1-on-for-timer PumpControl/Ventil1/on-for-timer
attr PumpControl stateFormat WaterLevel%
attr PumpControl room Bewaesserung
attr PumpControl subscribeReading_raw PumpControl/raw
attr PumpControl subscribeReading_WaterLevel PumpControl/level
attr PumpControl subscribeReading_Threads PumpControl/Threads
attr PumpControl subscribeReading_Ventil1 PumpControl/Ventil1/state

Automatisierung

Zum Zwecke der Automatisierung haben wir bereits einen Bodenfeuchtesensor (BF_Tomaten) in FHEM definiert, der einen prozentualen Wert im Reading moisture liefert. Dies kann zb. ein Bluetooth Xiaomi Plant Sensor, ein Vegetronix Bodenfeuchtesenor o.ä. sein. Weiterhin ist zur Wetterabhängigen Bewässerung ein PROPLANTA Device (Agroweather) definiert. Die einzelnen Schwellwerte werden über UserReadings eingestellt. Das ermöglicht später auch eine TabletUI Integration.

Das DOIF arbeitet wie folgt: Sobald der eingestellte Bodenfeuchtewert unterschritten wird (hier: 29%) und der prognostizierte Niederschlag des aktuellen Tages ebenfalls unter dem eingestellten Schwellwert (hier: 3mm) liegt, wird das Bewässerungsventil für 300 sekunden geöffnet.
Oder der Bodenfeuchtewert liegt noch weiter darunter (hier: 25%), dann wird unabhängig des erwarteten Niederschlags das Ventil für 300sek geöffnet. Das ist zb. dann relevant wenn NIederschlag erwartet wird, aber es trotzdem nicht regnet ;)
Oder der erste Zeitpunkt ist eingestellt und ein Soll Bodenfeuchtewert, dann wird nur einmal exakt zu diesem Zeitpunkt bewässert wenn der Sollwert über dem IST Wert liegt. Der eingestellte Niderschlagsschwellwert wird aber berücksichtigt.
Oder der erste Zeitpunkt ist ausgewählt und kein Soll Bodenfeuchtewert (= 0) dann wird zum Zeitpunkt bewässert. Der eingestellte Niderschlagsschwellwert wird aber berücksichtigt.
Oder der erste und zweite Zeitpunkt ist eingestellt, ein Soll Bodenfeuchtewert und Niederschlagsschwellwert muss ebenfalls eingestellt sein. dann wird bis zum Erreichen der Soll Bodenfeuchte bewässert aber nur innnerhalb des eingestellten Zeitfensters.

defmod DOIF_Bew_VG_Wanne DOIF (([$SELF:1-time] ne "00:00" and [[$SELF:1-time]]) and [$SELF:2-treshold-moisture,0] > 0  and [?BF_VG_Wanne:moisture]<=[$SELF:2-treshold-moisture,99] and [?AgroWeather:fc0_rain]<[$SELF:2-treshold-rain,99]) 
(set PumpControl VG-Wanne-on-for-timer [$SELF:0-duration]) DOELSEIF (([$SELF:1-time] ne "00:00" and [[$SELF:1-time]]) and [$SELF:2-treshold-moisture,0] == 0 and [?AgroWeather:fc0_rain]<[$SELF:2-treshold-rain,99])
(set PumpControl VG-Wanne-on-for-timer [$SELF:0-duration]) DOELSEIF (([$SELF:1-time] eq "00:00" and [$SELF:2-treshold-moisture,0] > 0 and [BF_VG_Wanne:moisture]<=[$SELF:2-treshold-moisture,99] and [?AgroWeather:fc0_rain]<[$SELF:2-treshold-rain,99]))
(set PumpControl VG-Wanne-on-for-timer [$SELF:0-duration]) DOELSEIF ([$SELF:1-time] ne "00:00" and [$SELF:2-time] ne "00:00" and ([[$SELF:1-time]-[$SELF:2-time]]) and [$SELF:2-treshold-moisture,0] > 0 and [BF_VG_Wanne:moisture]<=[$SELF:2-treshold-moisture,99]) (set PumpControl VG-Wanne-on-for-timer [$SELF:0-duration]) DOELSEIF ([$SELF:1-treshold-moisture,0] > 0 and [BF_VG_Wanne:moisture]<=[$SELF:1-treshold-moisture,99] ) (set PumpControl VG-Wanne-on-for-timer [$SELF:0-duration]) DOELSE attr DOIF_Bew_VG_Wanne DbLogExclude .* attr DOIF_Bew_VG_Wanne comment cmd_1: Zeitpunkt und SollSensorFeuchte gesetzt cmd_2: Zeitpunkt gesetzt, keine SollSensorFeuchte cmd_3: Zeitpunkt nicht gesetzt, SollSensorFeuchte gesetzt cmd_4: Zeitraum und SollSensorFeuchte gesetzt cmd_5: Mindestfeuchte gesetzt, ohne Beruecksichtigung der Regenwarscheinlichkeit cmd_6: mache nix attr DOIF_Bew_VG_Wanne do always attr DOIF_Bew_VG_Wanne readingList 1-treshold-moisture 2-treshold-moisture 2-treshold-rain 0-duration 1-time 2-time attr DOIF_Bew_VG_Wanne room Aussen attr DOIF_Bew_VG_Wanne verbose 3 set DOIF_Bew_VG_Wanne 0-duration 180 set DOIF_Bew_VG_Wanne 1-time 00:00 set DOIF_Bew_VG_Wanne 1-treshold-moisture 40 set DOIF_Bew_VG_Wanne 2-time 00:00 set DOIF_Bew_VG_Wanne 2-treshold-moisture 45 set DOIF_Bew_VG_Wanne 2-treshold-rain 3

Visualisierung im TabletUI

Hier ein Beispiel wie eine Visualisierung aussehen könnte. Das Sprinkle Symbol zeigt, ob das Ventil geöffnet/geschlossen ist. Mit einem Druck auf das Symbol wird ein Schaltvorgang (on-for-timer) sofort ausgelöst. Ein weiterer Druck schließt das Ventil vorzeit vor Ablauf des on-for-timers.

Die Anzeigen der Bodenfeuchte, des Nährstoffgehaltes und der Batterie zustand beziehen sich auf den eingesetzten Bodenfeuchtesensor, hier ein Bluetooth Xiaomi Plant Sensor.

Mit dem Settings Symbol ganz rechts öffnet sich das Settings Menü mit dem man die im Device definierten Userreadings einstellen kann.

Der Schalter für die Automatik aktiviert/deaktivert das DOIF.

Als Erstes muss das Template " ftui_template_garden_sprinkle.html " definiert werden. Dieses kann unverändert aus github 1:1 übernommen werden. Anschließend kann das Template im eigentlichen TabletUI Code eingebettet und mit Parametern gefüllt verwendet werden.

Der folgende beispielhaft Codeblock wird dann in die eigentliche TabletUI Seite aufgenommen. Die Parameter müssen ggf nach den vorherrschenden Namensgebungen angepasst werden. Ein passendes Beispiel findet sich auch im Github " ftui_garden_sprinkle.html "

      <div data-template="ftui_template_garden_sprinkle.html"
        data-parameter='{"par_BF_dev":"BF_VG_Wanne",
                     "par_PumpControl_dev":"PumpControl",
                     "par_PumpControl_Ventil_dev":"Ventil-VG-Wanne",
                     "par_on-for-timer":"VG-Wanne-on-for-timer",
                     "par_DOIF_Bew":"DOIF_Bew_VG_Wanne",
                     "par_DOIF_enableAttr":""}'>
      </div>

Die Parameter bedeuteten folgendes:

Parameter Bedeutung Beispiel
par_BF_dev Das Device des Bodenfeuchtesensors BF_Tomaten
par_PumpControl_dev Das MQTT Device der PumpControl Instanz die das Ventil steuert PumpControl
par_PumpControl_Ventil_dev Das in der PunpControl Instanz definierte Subtopic zum Ventil Ventil1
par_on-for-timer Die on-for-timer Definition zu dem Ventil in der MQTT PumpControl Instanz Ventil1-on-for-timer
par_DOIF_Bew Das Device des dazugehörigen DOIF´s DOIF_Bew_Tomaten
par_DOIF_enableAttr Nur zu verwenden wenn das DOIF remote via MQTT_DEVICE anggeschlossen sein sollte mode

Links:

Clone this wiki locally