Bewässerungssteuerung: Unterschied zwischen den Versionen

Aus FHEMWiki
KKeine Bearbeitungszusammenfassung
K (2 Typos verbessert)
 
(12 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Todo|Diese Seite sollte an die im [http://forum.fhem.de/index.php/topic,22142.0.html Forum] beschriebene aktuelle Version der Steuerung angepasst werden.}}
<div style="float:right">
{{Infobox Modul
|ModPurpose=Kontrollinstanz der Bewässerungssteuerung
|ModType=contrib
|ModFTopic=22142
|ModForumArea=Unterstützende Dienste
|ModTechName=97_SprinkleControl.pm
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=118 Tobias]
}}
{{Infobox Modul
|ModPurpose=Spezialisiertes Modul zur Bewässerungssteuerung
|ModType=contrib
|ModFTopic=22142
|ModForumArea=Unterstützende Dienste
|ModTechName=98_Sprinkle.pm
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=118 Tobias]
}}
</div>


Diese Seite beschreibt, wie man intelligent seine Bewässerung steuern kann wenn man zb. Bodenfeuchtesensoren installiert hat.
Diese Seite beschreibt, wie man intelligent seine Bewässerung steuern kann wenn man Bodenfeuchtesensoren installiert hat.
 
Weiterhin kann man eine maximale Obergrenze von parallelen Bewässerungen angeben wenn man z.B. von einem Brunnen nur einen begrenzten Mengendurchfluss hat oder das Netzteil nicht alle Ventile gleichzeitig schalten kann.
Hinweis: Der Autor hat dieses [http://forum.fhem.de/index.php/topic,22142.0.html hier] in einem Modul bereitgestellt


__INHALTSVERZEICHNIS__
__INHALTSVERZEICHNIS__
Zeile 9: Zeile 25:
Es wird von folgenden Komponenten ausgegangen:
Es wird von folgenden Komponenten ausgegangen:


* Gardena Magnetventile, angesprochen über einen FS20-Aktor (zb. S8M)
* Gardena oder Hunter Magnetventile, angesprochen über einen FS20-Aktor (zb. S8M), Homematic-Aktor oder 1wireSchaltaktoren
* Bodenfeuchtesensoren, zb. FS20 BF oder andere (zb. an einem [[AVR-NET-IO]])
* Bodenfeuchtesensoren, zb. FS20 BF oder andere (z. B. an einem [[AVR-NET-IO#Analoge_Eing.C3.A4nge_in_FHEM_einbinden|AVR-NET-IO]] oder funkangebunden per  [[SWAP#Beispiel:_panStamp_soilmoisture_Sketch_in_FHEM_einbinden|Panstamp]])


=allgemeine Einstellungen=
==allgemeine Vorbereitungen==
Bitte die Prozedur "on-for-timer-offcheck" anlegen: [[On-for-timer_zur%C3%BCcksetzen]]
Wird ein 2- oder 8fach 1wire Schaltaktor verwendet, so muss jedes Ventil per [[ReadingsProxy|readingsProxy]] maskiert werden.
==Anlegen zusätzlicher Attribute==
Bei jedem FS20 Aktor muss in FHEM das Attribut ''follow-on-for-timer'' auf 1 gesetzt werden.
Es müssen folgende neue globale Attribute angelegt werden:
* schwellwert
* sensor


==Anlegen der Bodenfeuchtesensoren==
===Anlegen der Bodenfeuchtesensoren===
Für einen FS20 Sensor: FS20BF
Für eines FS20 Sensor: FS20BF
  define Bodenfeuchtesensor FS20 34f2 00
  define Bodenfeuchtesensor FS20 34f2 00
  attr Bodenfeuchtesensor room Bewässerung
  attr Bodenfeuchtesensor room Bewässerung


Für eine 1wire Version: einen analogen Sensor (zb. Vegetronix), angeschlossen an einen 4fach A/D Converter DS2450
Für eine 1wire Version: einen analogen Sensor (zb. Vegetronix), angeschlossen an einen 4fach A/D Converter DS2450
  define Bodenfeuchte OWAD DS2450 50310C000000 60
  define Bodenfeuchte OWAD DS2450 03140C000000 60
attr Bodenfeuchte AFunction VA*33.9
attr Bodenfeuchte AUnit percent|%
attr Bodenfeuchte BFunction VB*33.9
attr Bodenfeuchte BUnit percent|%
attr Bodenfeuchte CFunction VC*33.9
attr Bodenfeuchte CUnit percent|%
attr Bodenfeuchte event-on-change-reading state
  attr Bodenfeuchte model DS2450
  attr Bodenfeuchte model DS2450
  attr Bodenfeuchte room Bewässerung
  attr Bodenfeuchte room Bewässerung
attr Bodenfeuchte userReadings VWC_A {sprintf("%.0f",(11.6552 * ReadingsVal("$name","A",0)**4 + 7.10835 * ReadingsVal("$name","A",0)**2 - 0.569557) / (ReadingsVal("$name","A",0)**2 + 1))}


Alternativ auch andere, siehe [[AVR-NET-IO]]
Kabelgebundene Vegetronix Bodenfeuchtesensoren können per [[SWAP#Beispiel:_panStamp_soilmoisture_Sketch_in_FHEM_einbinden|Panstamp-Anbindung]] auch funkbasiert arbeiten.


==zentrale Schaltvariable==
===Bewässerungsventile definieren===
Erstellung einer Schaltvariable um im Frontend die Bewässerung zentral zu steuern
Falls für jedes Magnetventil ein eigenes Device existiert. Zb. bei Nutzung von eines SM8/SM4/FS20ST/HM-LC-SW4-DR
 
  define Bewaesserung_Ventil1 FS20 2305 51
* Auto =&gt; Je nach Angabe des Bodenfeuchtesensors wird bewässert oder nicht
  attr Bewaesserung_Ventil1 model fs20st
* On =&gt; Es wird immer bewässert
  attr Bewaesserung_Ventil1 room Bewässerung
* Off =&gt; Es wird nicht bewässert
 
  define Bewaesserung_Active dummy
attr Bewaesserung_Active room Bewässerung
  attr Bewaesserung_Active setList Auto On Off
  attr Bewaesserung_Active webCmd Auto:On:Off
 
=Steuerung mittels 1wire=
wird die Bewässerungssteuerung mittels 1Wire betrieben, so verfügt 1 Device (i.d.R DS2406/DS2408/DS1413) über 2 oder 8 Ports. Wie diese einerseits komfortabel per FHEM-Weboberfläche zu steuern als auch eine automatisierte Steuerung zu realisieren ist soll dieser Abschnitt aufzeigen.


==Anlegen des Schalt-Devices==
Wird die Bewässerungssteuerung mittels 1Wire betrieben, so verfügt 1 Device (i.d.R DS2406/DS2408/DS1413) über 2 oder 8 Ports.
An folgendem Device hängen die physischen Bewässerungsventile. Dieses muss natürlich an die eigenen Gegebenheiten angepasst werden :)
An folgendem Device hängen die physischen Bewässerungsventile. Dieses muss natürlich an die eigenen Gegebenheiten angepasst werden :)
  define Schalter_links OWSWITCH DS2408 F4D210000000
  define Schalter_rechts OWSWITCH DS2408 xxxxxxxxxxxxxx
  attr Schalter_links event-on-change-reading A,B,C,D,E,F,G,H
  attr Schalter_rechts IODev 1wireBus
  attr Schalter_links model DS2408
  attr Schalter_rechts model DS2408
  attr Schalter_links room OWX
  attr Schalter_rechts room Bewässerung
attr Schalter_rechts stateS .


==Anlegen der DummyDevices==
Zusätzlich das readingsProxy-Device für den Port A
Über diese "Schalter" werden die einzelnen Bewässerungsstränge gesteuert.
  define Bewaesserung_Ventil1 readingsProxy Schalter_rechts:A
define Bewaesserung_Tomaten dummy
attr Bewaesserung_Ventil1 room Bewässerung
attr Bewaesserung_Tomaten alias Bewässerung Tomaten
attr Bewaesserung_Ventil1 setFn {"output A $CMD"}
attr Bewaesserung_Tomaten eventMap /on-for-timer 30:Anschalten/off:Ausschalten/
attr Bewaesserung_Ventil1 setList on off
attr Bewaesserung_Tomaten group Bewässerung
attr Bewaesserung_Ventil1 valueFn {($VALUE eq "ON.")?"OFF":"ON"}
attr Bewaesserung_Tomaten room OWX
  attr Bewaesserung_Ventil1 webCmd on:off
attr Bewaesserung_Tomaten schwellwert 58
attr Bewaesserung_Tomaten sensor Schalter_links:A Bodenfeuchte:A
attr Bewaesserung_Tomaten webCmd Anschalten:Ausschalten
 
Auf der Weboberfläche erscheinen die Schalter "Anschalten" und Ausschalten". Diese werden mittels eventmap auf "on-for-timer 30" und "off" intern umgesetzt und später an den 1wireBaustein weitergegeben.
Über das Attribut "sensor" wird eine Zuordnung zum tatsächlichen 1wireDevice als auch zum dazugehörigen Sensor vorgenommen und wird folgendermaßen definiert:
attr Bewaesserung_Tomaten sensor Device[:Port] [Bodenfeuchtesensor[:Port]]
Im Beispiel ist das 1wireDevice ein DS2408 und heißt "Schalter_links" und die Bewässerung der Tomaten hängt am Port A. Der zugehörige Bodenfeuchtesensor in den Tomaten hängt an einem DS2450 mit dem Namen "Bodenfeuchte" ebenfalls am Port A.
Über den Schwellwert wird eingestellt, ab welcher Bodenfeuchte tatsächlich bewässert werden soll.
 
==Anlegen des Notify´s  für die DummySchalter==
Folgendes Notify reagiert auf die Events der Dummyschalter. Es wird hier im Beispiel das Event "Anschalten" auf "on-for-timer 30" umgesetzt sowie das Sensor- und schwellwertattribut abgerufen. Das Sensorattribut wird in den Device- und Sensorabschnitt zergliedert. Anschließend wird mit den so ermittelten Parametern die zentrale Bewässerungsprozedur aufgerufen.
 
  <nowiki>define Bewaesserung_Macro notify Bewaesserung.* {\
  my $device=$NAME;;\
  my @a = (undef, $EVENT);;\
  @a = ReplaceEventMap($device, \@a, 0);;\
  shift @a;;\
  my $status = join(" ", @a);;\
  my @temp = split(" ", AttrVal($device, "sensor", " "));;\
  my $schwellwert = AttrVal($device, "schwellwert", "");;\
\
  Log 5, "Prozeduraufruf: Bewaesserung($temp[0],$temp[1],$schwellwert,$status)";;\
  Bewaesserung($temp[0],$temp[1],$schwellwert,$status, $device);;\
}
attr Bewaesserung_Macro group Bewässerung
attr Bewaesserung_Macro room OWX </nowiki>
 
==zentrale Bewässerungsprozedur==
Die zentrale Prozedur wird als UTIL Datei im FHEM Verzeichnis gespeichert. Hier wird die Entscheidung getroffen, ob bewässert werden soll oder nicht. Es wird die aktuelle Bodenfeuchte im Zusammenhang mit dem Schwellwert ausgewertet sowie die globale Einstellung "Auto"/"On"/"Off"<br>
<nowiki>##############################################
# $Id:$
package main;
 
use strict;
use warnings;
use POSIX;
use URI::Escape;
 
sub
Utils_Bewaesserung_Initialize($$)
{
  my ($hash) = @_;
}
 
##############################################
# Prozedur zur Bewässerungssteuerung
# Parameter:
#  1. Device:Port  (zb. Schalter:A)
#  2. Sensor:Port  (zb. MySens:C)
#  3. Schwellwert  (0-100 in % - zb. 55)
#  4. Timer Befehl  (zb. on-for-timer 30)
#  5. Dummy-Schalter (optional)
#
# Bsp: Bewaesserung("Schalter_links:A","Bodenfeuchte:A",56,"on-for-timer 30")
##############################################
sub
Bewaesserung($$$$$) {
  my ($device,$sensor,$schwellwert,$command,$dummyschalter) = @_;
  my ($deviceport, $sensorport);
  my $auto = ReadingsVal("Bewaesserung_Active", "state", "Off");
  my $bodenfeuchte;
  my (@tempd, @temps);
 
  #es muss immer ein Command übergeben werden
  if($command !~ m/(on|on-for-timer|off)/) {
    Log 3, "Abbruch: Fehlende Angabe des Commands";
    return;
  }
 
  # falsche Schwellwertangabe
  if(defined($schwellwert) && $schwellwert !~ m/^(\d+)$/) {
    Log 3, "Schwellwert definiert, aber nicht nummerisch: $schwellwert";
    return;
  }
 
  @tempd = split(":", $device)  if($device =~ m/:/);
  $device = $tempd[0];
  $deviceport = $tempd[1] if($tempd[1]);
 
  @temps = split(":", $sensor)  if($sensor =~ m/:/);
  $sensor = $temps[0];
  $sensorport = $temps[1] if($temps[1]);
 
  if(!$defs{$device}) {
    Log 3, "Fehlerhafte Angabe des Devices: $device";
    return;
  }
 
  if(defined($sensor) && !$defs{$sensor}) {
    Log 3, "Fehlerhafte Angabe des Sensors: $sensor";
    return;
  }
 
 
  if (($auto eq "Auto") && (!defined($sensor))) {
    Log 3, "Automatikmodus angefordert aber kein Sensor definiert.";
    return;
  } elsif (($auto eq "Auto") && (!defined($schwellwert))) {
    Log 3, "Automatikmodus angefordert aber kein Schwellwert definiert."
    return;
  } elsif(($auto eq "Auto") && (defined($sensor))) {
    # Status des Sensors abfragen 
    if (defined($sensorport)) {
      $bodenfeuchte = ReadingsVal($sensor, $sensorport, undef) if (!defined($bodenfeuchte));
    } else {
      $bodenfeuchte = ReadingsVal($sensor, "state", undef) if (!defined($bodenfeuchte));
      $bodenfeuchte = ReadingsVal($sensor, "status", undef) if (!defined($bodenfeuchte));
    }
    # im Fehlerfall setze Bodenfeuchte auf 100%
    if(!defined($bodenfeuchte)) {
      Log 3, "Kann Bodenfeuchte nicht ermitteln. Breche Vorgang ab.";
      $bodenfeuchte = 999;
    } else {
      #Bodenfeuchte ist kein Messwert sondern nur ein on/off Reading
      $bodenfeuchte = 0 if(lc($bodenfeuchte) =~ m/^(on)/);
      $bodenfeuchte = 101 if(lc($bodenfeuchte) =~ m/^(off)/);
    }
  } else {
    # kein sensor definiert und kein Automatikmodus, setze Bodenfeuchte auf 0% und
    # Schwellwert auf 100% damit bewässert wird
    $bodenfeuchte = 0;
    $schwellwert  = 100;
  }
 
  if(($auto eq "Auto") || ($auto eq "On")) {
    Log 3, "Modus: $auto -> Device: $device:$deviceport, Bodenfeuchte: $bodenfeuchte%, Schwellwert: $schwellwert%, DummySchalter: $dummyschalter";
    if ($schwellwert >= $bodenfeuchte) {
      Log 3, "fhem: set $device output $deviceport $command";
      fhem "set $device output $deviceport $command";
      if (defined($dummyschalter)) {
        Log 3, "fhem: setState $dummyschalter $command";
        Log 3, "fhem: on_for_timer_offcheck($dummyschalter, $command)";
        fhem "setState $dummyschalter $command";
        on_for_timer_offcheck($dummyschalter, $command);
      }
    } else {
      Log 3, "fhem: set $device output $deviceport off";
      fhem "set $device output $deviceport off";
      if (defined($dummyschalter)) {
        Log 3, "fhem: setState $dummyschalter off";
        fhem "setState $dummyschalter off";
      }
    }
  } #elsif Device ne off -> set Device off
}
 
1;
 
</nowiki>


=Steuerung mittels FS20/einzelner Devices=
===Module bereitstellen===
Falls für jedes Magnetventil ein eigenes Device existiert. Zb. bei Nutzung von eines SM8/SM4/FS20ST
Als nächstes sind die benötigten Module aus dem FHEM SVN contrib Verzeichnis in das FHEM-Verzeichnis zu kopieren:
 
* [http://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/97_SprinkleControl.pm 97_SprinkleControl.pm]
==Bewässerungsventile definieren==
* [http://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/98_Sprinkle.pm 98_Sprinkle.pm]
Als erstes werden die Bewässerungsventile in FHEM definiert, zb.:
define Bewaesserung_Ventil1 FS20 2305 51
attr Bewaesserung_Ventil1 model fs20st
attr Bewaesserung_Ventil1 room Bewässerung


==Zuweisung eines Sensors einem oder mehrerer Bewässerungsventile==
==Definitionen==
Hier der Fall eines FS20BF Bodenfeuchtesensors. Dieser übermittelt nur im state ein "on" oder "off"
Pro Bewässerung bzw Bewässerungsventil ist eine SprinkleInstanz zu definieren:
attr Bewaesserung_Ventil1 sensor Bodenfeuchtesensor


Im Falle der 1wire Version wird das Ventil 1 mit dem Bodenfeuchtesensor "gepaired" der am Port A des Sensors "Bodenfeuchte" hängt. Dieser übermittelt einen echten Dezimalwert.
define MySprinkle1 Sprinkle Bewaesserung_Ventil1 Bodenfeuchte:VWC_A +00:05:00;
attr Bewaesserung_Ventil1 sensor Bodenfeuchte:A
attr MySprinkle1 Sprinkle_OnTimeSec 30;
attr MySprinkle1 Sprinkle_SensorThreshold 55;
attr MySprinkle1 room Bewässerung;
attr MySprinkle1 webCmd Auto:An:Aus:Toggle:Disable;
Die Timerangabe kann periodisch z.B. +00:05:00 alle 5min (wie im Beispiel oben) oder einmalig am Tag z.b. 04:00:00 für 4:00 Uhr eingestellt werden. Nach Ablauf des Timers wird überprüft, ob die Bodenfeuchte im Reading ''VWC_A'' kleiner als der Wert im Attribut ''Sprinkle_SensorThreshold'' ist und gegebenenfalls ein ''on-for-timer'' Befehl auf den Aktor ''Bewaesserung_Ventil1'' abgesetzt. Die Dauer der Beregnung bzw. des on-for-timers richtet sich nach dem Attributwert ''Sprinkle_OnTimeSec''.


Es sind folgende ''Set'' Befehle möglich:
* '''Disable''' <br> Deaktivierung. Erst ein erneuter Disable-Befehl aktiviert die Instanz wieder. Während einer Deaktivierung werden keine anderen Befehle akzeptiert
* '''An''' <br> Manuelles Starten eines Bewässerungsprozesses
* '''Aus''' <br> Manuelles Stoppen eines Bewässerungsprozesses
* '''Toggle''' <br> Je nach aktuellem Zustand wird ein Bewässerungsprozess gestartet oder gestoppt
* '''Auto''' <br> Der Auto-Modus ist nur verfügbar, wenn ein Bodenfeuchtesensor angegeben ist sowie die Attribute ''Sprinkle_OnTimeSec'' und ''Sprinkle_SensorThreshold'' angegeben sind.  <br>
Der erste Klick auf ''Auto'' versetzt die Instanz in den AutoModus. Jeder folgende Klick startet einen Bewässerungsprozess im AutoModus - Je nach Zustand der Bodenfeuchte wird nun bewässert oder nicht.


==zentrale Prozedur zur Bewässerung==
==weitere Spezialfälle==
Jetzt wird die zentrale Prozedur zur Steuerung angelegt:
Ist die Anzahl der parallelen Bewässerungsprozesse zu begrenzen, so ist eine übergeordnete Kontrollinstanz zu definieren. Beispielsweise durch einen maximalen Wasserdurchfluss den ein Brunnen bedienen kann.


  <nowiki>define BewNotify notify BewNotify {
  define MySprinkleControl SprinkleControl;
my @@args    = split(" ",'%EVENT');
  attr MySprinkleControl SprinkleControl_MaxParallel 1;
my $device  = "%EVTPART0";
  attr MySprinkleControl room Bewässerung;
my $duration = "%EVTPART1";
my $sensor  = AttrVal($device, "sensor", undef);
my @@sArr    = split(":", $sensor)              if($sensor =~ m/:/);
my $auto    = ReadingsVal("Bewaesserung_Active", "state", "Off");
  my $sensorstate = "on";
  my $schwellwert = 0;


if(($auto eq "Auto") || ($auto eq "On")) {
Hiermit wird maximal ein Bewässerungsprozess zugelassen. Alle folgenden werden in eine Queue eingereiht und nacheinander abgearbeitet.<br>
  if((defined ($sensor)) && ($auto eq "Auto")) {
Die vorher definierte SprinkleInstanz ist nun noch mit der Kontrollinstanz zu verbinden.
    if (defined($sArr[0])) {
      $sensorstate = ReadingsVal($sArr[0], $sArr[1], undef);
      $schwellwert = AttrVal($sArr[0], "schwellwert", undef);
      $schwellwert = AttrVal($sArr[0], $sArr[1]."Low", 0) if (!defined($schwellwert));
    } else {
      $schwellwert = AttrVal($sensor, "schwellwert", undef);
      $sensorstate = ReadingsVal($sensor, "state", undef)  if (!defined($sensorstate));
      $sensorstate = ReadingsVal($sensor, "status", undef) if (!defined($sensorstate));
    }
    $sensorstate = "off" if (!defined($sensorstate));
  }
 
  if($sensorstate eq "on") {
      fhem "set $device on-for-timer $duration";
  } elsif ($sensorstate =~ m/^(\d+)/) {
    Log 5, "Sensorstate: $sensorstate";
   
    Log 5, "Schwellwert: $schwellwert";
    if ($schwellwert >= $sensorstate) { fhem "set $device on-for-timer $duration"; }
  } elsif (ReadingsVal($device, "state", "") ne "off" ) {
      fhem "set $device off";
  }
}
}
attr BewNotify comment Prozedur um aufgrund Umweltzustände die Bewässerung freizugeben oder nicht. Bsp: BewNotify {Device} {Dauer in sek} {Schaltvariable}
attr BewNotify room Bewässerung</nowiki>


Das geübte Auge wird feststellen, das für die Bodenfeuchtesensoren sowohl das Reading "state" als auch das Reading "status" abgefragt wird. Das liegt daran, das die FS20 BF ein Reading "state" haben, die analogen Bodenfeuchtesensoren über die ECMDDevice classdef-Definition ein "status" Reading (Das Reading "state" ist intern verwendet und darf nicht doppelt vergeben werden).
attr MySprinkle1 SprinkleControl SprinkleControl;


==Zeitsteuerung==
Mit einer einzelnen SprinkleInstanz kann man die Auswirkung noch nicht erkennen, dazu müssen weitere SprinkleInstanzen für weitere Bewässerungsventile angelegt werden
6. Abschließend wird die Bewässerung in die Zeitsteuerung übergeben


<nowiki>define Timer_Ventil1 at *00:00:00 trigger BewNotify Bewaesserung_Ventil1 1920
==Links==
attr Timer_Ventil1 room Bewässerung</nowiki>
Forumsthread zum Modul: {{Link2Forum|Topic=22142}}
Hiermit wird täglich um 0Uhr die Bewässerungsprozedur aufgerufen bei dem Ventil1 für 30min geöffnet wird. Abhängig natürlich von der Einstellung [Auto|On|Off] der Schaltariable "Bewaesserung_Active"


[[Kategorie:Code Snippets]]
[[Kategorie:Code Snippets]]

Aktuelle Version vom 4. Juli 2018, 18:42 Uhr

Bewässerungssteuerung
Zweck / Funktion
Kontrollinstanz der Bewässerungssteuerung
Allgemein
Typ Contrib
Details
Dokumentation Thema
Support (Forum) Unterstützende Dienste
Modulname 97_SprinkleControl.pm
Ersteller Tobias
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Bewässerungssteuerung
Zweck / Funktion
Spezialisiertes Modul zur Bewässerungssteuerung
Allgemein
Typ Contrib
Details
Dokumentation Thema
Support (Forum) Unterstützende Dienste
Modulname 98_Sprinkle.pm
Ersteller Tobias
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!

Diese Seite beschreibt, wie man intelligent seine Bewässerung steuern kann wenn man Bodenfeuchtesensoren installiert hat. Weiterhin kann man eine maximale Obergrenze von parallelen Bewässerungen angeben wenn man z.B. von einem Brunnen nur einen begrenzten Mengendurchfluss hat oder das Netzteil nicht alle Ventile gleichzeitig schalten kann.

Es wird von folgenden Komponenten ausgegangen:

  • Gardena oder Hunter Magnetventile, angesprochen über einen FS20-Aktor (zb. S8M), Homematic-Aktor oder 1wireSchaltaktoren
  • Bodenfeuchtesensoren, zb. FS20 BF oder andere (z. B. an einem AVR-NET-IO oder funkangebunden per Panstamp)

allgemeine Vorbereitungen

Wird ein 2- oder 8fach 1wire Schaltaktor verwendet, so muss jedes Ventil per readingsProxy maskiert werden. Bei jedem FS20 Aktor muss in FHEM das Attribut follow-on-for-timer auf 1 gesetzt werden.

Anlegen der Bodenfeuchtesensoren

Für eines FS20 Sensor: FS20BF

define Bodenfeuchtesensor FS20 34f2 00
attr Bodenfeuchtesensor room Bewässerung

Für eine 1wire Version: einen analogen Sensor (zb. Vegetronix), angeschlossen an einen 4fach A/D Converter DS2450

define Bodenfeuchte OWAD DS2450 03140C000000 60
attr Bodenfeuchte model DS2450
attr Bodenfeuchte room Bewässerung
attr Bodenfeuchte userReadings VWC_A {sprintf("%.0f",(11.6552 * ReadingsVal("$name","A",0)**4 + 7.10835 * ReadingsVal("$name","A",0)**2 - 0.569557) / (ReadingsVal("$name","A",0)**2 + 1))}

Kabelgebundene Vegetronix Bodenfeuchtesensoren können per Panstamp-Anbindung auch funkbasiert arbeiten.

Bewässerungsventile definieren

Falls für jedes Magnetventil ein eigenes Device existiert. Zb. bei Nutzung von eines SM8/SM4/FS20ST/HM-LC-SW4-DR

define Bewaesserung_Ventil1 FS20 2305 51
attr Bewaesserung_Ventil1 model fs20st
attr Bewaesserung_Ventil1 room Bewässerung

Wird die Bewässerungssteuerung mittels 1Wire betrieben, so verfügt 1 Device (i.d.R DS2406/DS2408/DS1413) über 2 oder 8 Ports. An folgendem Device hängen die physischen Bewässerungsventile. Dieses muss natürlich an die eigenen Gegebenheiten angepasst werden :)

define Schalter_rechts OWSWITCH DS2408 xxxxxxxxxxxxxx
attr Schalter_rechts IODev 1wireBus
attr Schalter_rechts model DS2408
attr Schalter_rechts room Bewässerung
attr Schalter_rechts stateS .

Zusätzlich das readingsProxy-Device für den Port A

define Bewaesserung_Ventil1 readingsProxy Schalter_rechts:A
attr Bewaesserung_Ventil1 room Bewässerung
attr Bewaesserung_Ventil1 setFn {"output A $CMD"}
attr Bewaesserung_Ventil1 setList on off
attr Bewaesserung_Ventil1 valueFn {($VALUE eq "ON.")?"OFF":"ON"}
attr Bewaesserung_Ventil1 webCmd on:off

Module bereitstellen

Als nächstes sind die benötigten Module aus dem FHEM SVN contrib Verzeichnis in das FHEM-Verzeichnis zu kopieren:

Definitionen

Pro Bewässerung bzw Bewässerungsventil ist eine SprinkleInstanz zu definieren:

define MySprinkle1 Sprinkle Bewaesserung_Ventil1 Bodenfeuchte:VWC_A +00:05:00;
attr MySprinkle1 Sprinkle_OnTimeSec 30;
attr MySprinkle1 Sprinkle_SensorThreshold 55;
attr MySprinkle1 room Bewässerung;
attr MySprinkle1 webCmd Auto:An:Aus:Toggle:Disable;

Die Timerangabe kann periodisch z.B. +00:05:00 alle 5min (wie im Beispiel oben) oder einmalig am Tag z.b. 04:00:00 für 4:00 Uhr eingestellt werden. Nach Ablauf des Timers wird überprüft, ob die Bodenfeuchte im Reading VWC_A kleiner als der Wert im Attribut Sprinkle_SensorThreshold ist und gegebenenfalls ein on-for-timer Befehl auf den Aktor Bewaesserung_Ventil1 abgesetzt. Die Dauer der Beregnung bzw. des on-for-timers richtet sich nach dem Attributwert Sprinkle_OnTimeSec.

Es sind folgende Set Befehle möglich:

  • Disable
    Deaktivierung. Erst ein erneuter Disable-Befehl aktiviert die Instanz wieder. Während einer Deaktivierung werden keine anderen Befehle akzeptiert
  • An
    Manuelles Starten eines Bewässerungsprozesses
  • Aus
    Manuelles Stoppen eines Bewässerungsprozesses
  • Toggle
    Je nach aktuellem Zustand wird ein Bewässerungsprozess gestartet oder gestoppt
  • Auto
    Der Auto-Modus ist nur verfügbar, wenn ein Bodenfeuchtesensor angegeben ist sowie die Attribute Sprinkle_OnTimeSec und Sprinkle_SensorThreshold angegeben sind.

Der erste Klick auf Auto versetzt die Instanz in den AutoModus. Jeder folgende Klick startet einen Bewässerungsprozess im AutoModus - Je nach Zustand der Bodenfeuchte wird nun bewässert oder nicht.

weitere Spezialfälle

Ist die Anzahl der parallelen Bewässerungsprozesse zu begrenzen, so ist eine übergeordnete Kontrollinstanz zu definieren. Beispielsweise durch einen maximalen Wasserdurchfluss den ein Brunnen bedienen kann.

define MySprinkleControl SprinkleControl;
attr MySprinkleControl SprinkleControl_MaxParallel 1;
attr MySprinkleControl room Bewässerung;

Hiermit wird maximal ein Bewässerungsprozess zugelassen. Alle folgenden werden in eine Queue eingereiht und nacheinander abgearbeitet.
Die vorher definierte SprinkleInstanz ist nun noch mit der Kontrollinstanz zu verbinden.

attr MySprinkle1 SprinkleControl SprinkleControl;

Mit einer einzelnen SprinkleInstanz kann man die Auswirkung noch nicht erkennen, dazu müssen weitere SprinkleInstanzen für weitere Bewässerungsventile angelegt werden

Links

Forumsthread zum Modul: Thema