Ankündigung

Einklappen
Keine Ankündigung bisher.

bewaesserung.pl - mein erstes Plugin zur Gartenbewässerung

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] bewaesserung.pl - mein erstes Plugin zur Gartenbewässerung

    Hallo zusammen,

    da ich unseren Garten demnächst automatisch bewässern will, habe ich mich nun endlich daran gemacht, mein erstes "vorzeigbares" Plugin zu schreiben, das ich hier kurz vorstellen möchte und freue mich, wenn es sonst noch jemand brauchen kann. Schließlich habe ich ein paar Code-Teile aus dem Forum hier wiederverwertet
    Kurze Beschreibung:
    • Start/manueller Stop über eine einzige GA
    • Rückmeldung (aktiv/inaktiv) über Status-GA
    • beliebig viele Beregnungs-Stränge mit individueller Dauer
    • zyklisches Antriggern des aktuellen Stranges (damit Verwendung der Treppenlicht-Funktion für erhöhte Sicherheit möglich)
    • reichlich Ausgaben ins Plugin-Log

    Wichtig war mir vor allem das zyklische Antriggern, da ich so über die Treppenlichtfunktion des Aktors sicherstellen kann, dass auch bei einer Fehlfunktion des WG bzw. des Plugins die Ventile wieder geschlossen werden.
    Es ist bestimmt noch nicht perfekt, aber ich finde es schon ganz brauchbar...


    Code:
    #############################################################################
    # Plugin: bewaesserung.pl (Gartenberegnung steuern)
    # V0.5 20140309
    # Autor: Mathias Gindler (mathias@gindler.de)
    # License: GPL (v3)
    #
    #############################################################################
    #
    # Beschreibung:
    # Ansteuerung mehrerer Beregnungstränge hintereinander für eine bestimmte Dauer
    # (je Strang), ausgelöst/gestoppt über eine einzige GA.
    # Dabei wird der Strang innerhalb der Dauer zyklisch neu angetriggert,
    # somit kann die Treppenlichtfunktion eines Aktors für eine Sicherheits-
    # abschaltung verwendet werden.
    #
    #############################################################################
    #
    # Änderungshistorie:
    #
    #############################################################################
    #
    # Offene Punkte:
    #
    #############################################################################
    #
    # Abhängigkeiten:
    #
    #############################################################################
    #
    # plugin_info-Werte
    # - aktKreisNr: Index (0-n) des aktuellen Kreises
    # - Startzeit: Start des aktuellen Kreises
    # - Status: Bewässerung aktiv (1) oder inaktiv (0)
    #
    #############################################################################
    
    use POSIX;
    use Time::Local;
    
    # Konstanten für Aufrufart
    use constant EVENT_RESTART => 'restart';
    use constant EVENT_MODIFIED => 'modified';
    use constant EVENT_BUS => 'bus';
    use constant EVENT_SOCKET => 'socket';
    use constant EVENT_CYCLE => 'cycle';
    
    my $show_debug = 1;
    my $debugindex = 1;
    my $gv_event=undef;
    
    my $startzeit;
    my $pluginstatus;
    
    my $ga_plugintrigger = "12/6/100";    # Start/Stop der Beregnungs-Sequenz
    my $ga_pluginstatus  = "12/6/102";    # Status, ob Sequenz aktiv/inaktiv (1/0)
    my $triggercycle = 10;                # Re-Trigger-Intervall  (entspricht max. Über-Bewässerung), 
                                          # muss kleiner als Treppenlicht-Einstellung des Aktors sein
    
    
    my @Kreise;    # Array für Regnerkreise
    push @Kreise, {name => "Rasen West", dauer => 100, ga_schalten => '12/6/10', ga_status => '12/6/12'};
    push @Kreise, {name => "Rasen Ost",  dauer => 110, ga_schalten => '12/6/20', ga_status => '12/6/22'};
    push @Kreise, {name => "Hecke",      dauer => 120, ga_schalten => '12/6/30', ga_status => '12/6/32'};
    
    plugin_log($plugname, "------------------------------------") if ($show_debug > 5);
    
    # Aufruf per Bus-Telegramm
    $plugin_subscribe{$ga_plugintrigger}{$plugname} = 1;
    
    # aktuellen Status lesen
    if ($plugin_info{$plugname.'_Status'} ne '') {$pluginstatus = $plugin_info{$plugname.'_Status'}};
    
    # Aus welchem Grund läuft das Plugin gerade
    if (!$plugin_initflag) {$gv_event = EVENT_RESTART;} # Restart des daemons / Reboot
    elsif ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'}) {$gv_event = EVENT_MODIFIED;} # Plugin modifiziert
    elsif (%msg) {$gv_event = EVENT_BUS;}               # Bustraffic
    elsif ($fh) {$gv_event = EVENT_SOCKET;}             # Netzwerktraffic
    else {$gv_event = EVENT_CYCLE;}                     # Zyklus
    
    plugin_log($plugname, $debugindex++." (MAIN) Aufrufgrund: $gv_event") if ($show_debug > 5);
    plugin_log($plugname, $debugindex++." (MAIN) aktueller Status: $pluginstatus") if ($show_debug > 5);
    
    if ($gv_event eq EVENT_RESTART) {
        ende();
    } 
    elsif ($gv_event eq EVENT_MODIFIED) {
        ende();
    }  
    elsif ($gv_event eq EVENT_SOCKET) {
    } 
    elsif ($gv_event eq EVENT_CYCLE) {
        beregnung();
    }
    elsif ($gv_event eq EVENT_BUS) {
        plugin_log($plugname, $debugindex++." (BUS) aktueller Status: $pluginstatus") if ($show_debug > 1);
        if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $ga_plugintrigger) {
            if ($msg{'value'} == 1){
                plugin_log($plugname, $debugindex++." (BUS) EIN-Telegramm empfangen") if ($show_debug > 1);
                $plugin_info{$plugname.'_cycle'} = $triggercycle;
                if ($pluginstatus == 1){
                    plugin_log($plugname, $debugindex++." (BUS) Beregnungsprogramm läuft bereits - keine Aktion ausgeführt") if ($show_debug > 0);
                }
                else{
                    plugin_log($plugname, $debugindex++." (BUS) Beregnungsprogramm gestartet") if ($show_debug > 0);
                    $startzeit = time();
                    $plugin_info{$plugname.'_Startzeit'} = $startzeit;
                    $plugin_info{$plugname.'_aktKreisNr'} = 0;
                    $pluginstatus = 1;
                    $plugin_info{$plugname.'_Status'} = $pluginstatus;
                    beregnung();
                }
            }
            else{
                plugin_log($plugname, $debugindex++." (BUS) AUS-Telegramm empfangen") if ($show_debug > 1);
                $plugin_info{$plugname.'_cycle'} = 0;
                if ($pluginstatus == 0){
                    plugin_log($plugname, $debugindex++." (BUS) Beregnungsprogramm läuft nicht - keine Aktion ausgeführt") if ($show_debug > 0);
                }
                else{
                    plugin_log($plugname, $debugindex++." (BUS) Beregnungsprogramm beendet") if ($show_debug > 0);
                    ende();
                }
            }
        } 
    } 
    
    knx_write($ga_pluginstatus, $pluginstatus);  # aktuellen Status an Bus zurückmelden
    
    
    sub beregnung{
        my $x;
        my $kreisname;
        my $kreisdauer;
        my $ga_schalten;
        my $ga_status;
        my $istdauer;
        
    # Parameter für aktuellen Kreis setzen    
        $x = $plugin_info{$plugname.'_aktKreisNr'};
        $kreisname     = $Kreise[$x]->{name};
        $ga_schalten   = $Kreise[$x]->{ga_schalten};
        $ga_status     = $Kreise[$x]->{ga_status};
        $kreisdauer    = $Kreise[$x]->{dauer};
        
        plugin_log($plugname, $debugindex++." (SUB beregnung) Beregnung: Index $x ('$kreisname'), Trigger $ga_schalten, Status $ga_status") if ($show_debug > 5);
        
        if ($plugin_info{$plugname.'_Startzeit'} + $kreisdauer < time()){
            plugin_log($plugname, $debugindex++." (SUB beregnung) Kreis '$kreisname' abgeschlossen") if ($show_debug > 0);
            $istdauer = sprintf("%2.0f", time() - $plugin_info{$plugname.'_Startzeit'});
            plugin_log($plugname, $debugindex++." (SUB beregnung) Kreis '$kreisname' Dauer: $istdauer sek. (ist)/$kreisdauer sek. (soll)") if ($show_debug > 0);
            knx_write($ga_schalten, 0);
            if ($x < $#Kreise){
                plugin_log($plugname, $debugindex++." (SUB beregnung) Umschalten auf nächsten Kreis") if ($show_debug > 0);
                $x++;
                $plugin_info{$plugname.'_aktKreisNr'} = $x;
                $plugin_info{$plugname.'_Startzeit'} = time();
    
    # nächste Zeile aktivieren, um sofort umzuschalten; 
    # wenn deaktiviert, wird nächster Kreis erst im nächsten Zyklus eingeschaltet ($triggercycle)
                beregnung();   
            }
            else{
                plugin_log($plugname, $debugindex++." (SUB beregnung) keine weiteren Kreise, Beregnung beendet.") if ($show_debug > 0);
                ende();
            }
        }
        else{
            plugin_log($plugname, $debugindex++." (SUB beregnung) Beregnung für Kreis '$kreisname' (re-)triggert") if ($show_debug > 0);
            knx_write($ga_schalten, 1);
        }
    }
    
    sub ende{
        foreach (@Kreise){
            plugin_log($plugname, $debugindex++." (SUB ende) Ventil für '$_->{name}' geschlossen") if ($show_debug > 0);
            knx_write($_->{ga_schalten},0);
        }
        $pluginstatus = 0;
        $plugin_info{$plugname.'_Status'} = $pluginstatus;
        $plugin_info{$plugname.'_cycle'} = 0;
    }
    CU,
    Mathias

    #2
    Bei uns wird der Garten erst dieses Jahr gemacht - deshalb kann ich es leider nicht testen. Aber die Beschreibung hört sich gut an :-)

    Nur eine Sache: sowas gehört ins SVN (wg Account am besten an makki wenden), sonst geht es hier im Forum irgendwann unter...

    VG
    Micha

    Kommentar


      #3
      Bewässerung vom Technikschacht aus ??

      Hi, bin auch gerade bei der Bewässerung. Habe KNX mit WG, würde das gerne ohne Aktor direkt über WG machen und das
      1-Wire Eight Channel Relay Board for Home Automation
      als "aktor" verwenden wollen. Die Ventile sind drausen im Garten (Technikschacht vom Pool) und ein WG Bus ist wegen der Temp Messung schon dort.
      Geht das mit Deine Plug-in?
      Einbundung einer Wetterstation?
      lg Walter
      Lieben Gruß Walter

      Kommentar


        #4
        Hallo Walter,

        das Plugin ist so aufgebaut, dass es periodisch ein "EIN"-Telegramm schickt, solange die Bewässerungsdauer noch nicht abgelaufen ist. Hiermit wird die Treppenlicht-Funktion des KNX-Aktors genutzt, um auch bei Ausfall des Plugins eine Sicherheits-Abschaltung zu haben. Das ist auch mein Hauptgrund, warum ich es mit einem KNX-Aktor mache und nicht mit Wiregate (vom fehlenden Verständnis (s. anderer Thread) mal abgesehen ).
        Trotzdem wird nach Zeitablauf des jeweiligen Stranges ein "AUS" geschickt.
        Ich würde also sagen, dass es auch ohne Treppenhaus-Funktion laufen müsste.
        CU,
        Mathias

        Kommentar


          #5
          Sicherheitshinweis

          Hi Gindler,
          danke für den Sicherheitshinweis, das ändert teilweise mein Konzept.
          da ich dort draussen nur einen WG und keinen KNX bus habe und auch nicht soviele Steuerleitungen legen möchte (abgesehen von mindestens 8 Aktorkanälen) , bleibe ich bei dem 1-Wire Eight Channel Relay Board for Home Automation als "aktor". Ich werde aber den 24V Trafo der Ventile mit einen normalen Aktorkanal versehen und dort die Treppenlichtfunktion einbauen - ist ja egal welcher BW Kreis hängenbleibt wenn alle offenen Vetile zumachen.
          Denkst an die Einbindung einer Wetterstation?
          lg Walter
          Lieben Gruß Walter

          Kommentar


            #6
            Ich habe das - ungeprüft! - mal ins SVN gelegt:
            Open Automation / Code / Commit [r2174]

            Denn sonst, richtig, gehts eher unter..

            Um auch gleich die eMail von Walter2263 zu beantworten: Das SVN ist ohne Account öffentlich zugänglich:
            Open Automation / Code / [r2174] /wiregate/plugin/generic

            Lediglich wenn man dort selbst mitarbeiten möchte, benötigt man einen SourceForge-Account und danach Info an ChrisM oder mich..

            Makki
            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
            -> Bitte KEINE PNs!

            Kommentar


              #7
              Danke, Walter
              Lieben Gruß Walter

              Kommentar


                #8
                Hallo Walter,
                Zitat von Walter2263 Beitrag anzeigen
                Denkst an die Einbindung einer Wetterstation?
                "Denken" ist relativ
                Wäre bestimmt schön, aber ist mangels eigener Wetterstation nicht in Planung. Zudem dies ziemlich knifflig werden dürfte, wenn man sich hier (und anderswo) die Gedankengänge anschaut, was da alles zu berücksichtigen ist:
                Sonne, Zeitpunkt letzter Regen, Menge letzter Regen, Wind über bestimmten Zeitraum, Bodenbeschaffenheit.....
                Darum ist die Version, so wie sie jetzt ist, für mich erstmal ausreichend: wenn ich glaube, gießen zu müssen, dann drück ich auf den Knopf, der Rest geht von alleine
                Über eine externe Logik kommt dann noch wahrscheinlich dazu, dass ich den Start auf einen bestimmten Zeitpunkt verschiebe: also abends Knopf drücken, am nächsten Morgen um 5:00 geht's dann los

                @Makki: Danke
                CU,
                Mathias

                Kommentar


                  #9
                  Danke, Walter
                  Lieben Gruß Walter

                  Kommentar


                    #10
                    Mal so am Rande wie ich das seit 4J mache (grob skizziert):

                    - Zeitschaltuhr Mo/Mi/Fr morgens -1h vor Sonnenaufgang
                    -- Sa/So ist man bei gutem Wetter eh im Garten, dann manuell aktiviert
                    - aktiviert: 48h kein Regen >2mm
                    - deaktiviert: Regen >5mm in 24h

                    - Das bedingt natürlich eine angebundene Wetterstation mit Regenmesser, bei mir eine WS2300 (gibts nichtmehr zu kaufen) via RS232

                    + Bodenfeuchte (siehe anderer Thread, sehr leidiges Thema!)
                    Daher meistens manuell.. Irgendwann vor 5J hab ich mal von geträumt, das final mit der (guten!) Vorhersage von yr.no zu automatisieren
                    Aber dafür muss alles stimmen: Wettervorhersage + Bodenfeuchte-Sensor.. Schwierig..

                    Makki
                    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                    -> Bitte KEINE PNs!

                    Kommentar


                      #11
                      Kurze Frage:

                      Code:
                      my $triggercycle = 10;
                      Die Wertangabe ist in Sekunden, oder? Bei der Dauer der Kreise ebenso?

                      Gruß,
                      David

                      Kommentar


                        #12
                        Hallo David,

                        jawoll - alle Zeitangaben in Sekunden. Die sind im Code nur relativ klein gehalten, damit das Testen schneller ging
                        In der realen Version hab ich jetzt erst mal (Rasen und Erfahrungen fehlen noch) 300s für den Trigger und 900s für die Kreise drin. Das Treppenhauslicht am Aktor muss dann halt größer als 300 sein.
                        CU,
                        Mathias

                        Kommentar


                          #13
                          Hallo Mathias,

                          dann hatte ich es zumindest richtig verstanden und konfiguriert. Funktioniert allerdings noch nicht. Da werde ich mich mal an die Settings im Aktor machen. Schätze da habe ich noch irgendwo was falsch konfiguriert.

                          Danke für das Plugin und den Support.

                          Gruß,
                          David

                          Kommentar


                            #14
                            Ich hatte bisher das einfache Plugin am Laufen .. hat aber seine Nachteile.

                            Meine Frage zu diesem hier:
                            Ist es relativ einfach möglich, mehrere Kreise gleichzeitig anzusteuern?

                            Ich lasse bei mir teilweise Kreise zeitglich laufen, da die Pumpenleistung nun doch ausreicht; möchte mir aber die Möglichkeit der Einzelansteuerung nicht verbauen.

                            Gesteuert werden die Ventile übers Wiregate mit Multi-I/Os. Da kann ich meines Wissens nur eine Gruppenadresse pro Kanal festlegen.

                            Gruß,
                            Dennis

                            Kommentar


                              #15
                              Hallo Dennis,

                              vor der Frage stehe ich auch gerade. Allerdings hab ich es einfacher, weil ich dem Aktorkanal einfach ne weitere GA (Kreis A+B) verpassen kann.
                              Im Hinterkopf spukt mir noch was rum, die max. mögliche Anzahl parallel laufender Kreise anhand von Pumpenleistung (l/h), Bedarf/Kreis (l/h), max. Leistungsaufnahme/Ventil (mA) und Leistung des Netzteils (mA) zu berechnen und damit die Bewässerungsdauer und somit die Laufzeit der Pumpe zu minimieren.
                              Im Moment ist jedoch eher Spatenarbeit angesagt als Kopfzerbrecherei - kann also noch eine Weile dauern
                              CU,
                              Mathias

                              Kommentar

                              Lädt...
                              X