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

  • gindler
    antwortet
    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.

    Einen Kommentar schreiben:


  • DK178
    antwortet
    Kurze Frage:

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

    Gruß,
    David

    Einen Kommentar schreiben:


  • makki
    antwortet
    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

    Einen Kommentar schreiben:


  • Walter2263
    antwortet
    Danke, Walter

    Einen Kommentar schreiben:


  • gindler
    antwortet
    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

    Einen Kommentar schreiben:


  • Walter2263
    antwortet
    Danke, Walter

    Einen Kommentar schreiben:


  • makki
    antwortet
    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

    Einen Kommentar schreiben:


  • Walter2263
    antwortet
    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

    Einen Kommentar schreiben:


  • gindler
    antwortet
    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.

    Einen Kommentar schreiben:


  • Walter2263
    antwortet
    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

    Einen Kommentar schreiben:


  • mivola
    antwortet
    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

    Einen Kommentar schreiben:


  • 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;
    }
Lädt...
X