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

  • Robert_Mini
    antwortet
    Hallo zusammen!

    Ich kämpfe gerade damit, dass das Bewaesserungsplugin teilweise mit Aufrufgrund: BUS ausgeführt wird, obwohl keine GA gesendet wird, die mit subscribe verknüpft ist.
    Habe extra geprüft, ob noch eine alte GA verbunden ist, allerdings ist das nicht der Fall.

    Hier das log:
    Code:
    2014-07-05 12:32:06.854,Bewaesserungssteuerung,------------------------------------ 
    2014-07-05 12:32:06.854,Bewaesserungssteuerung,1 (MAIN) Aufrufgrund: cycle 
    2014-07-05 12:32:06.855,Bewaesserungssteuerung,2 (MAIN) aktueller Status: 1 
    2014-07-05 12:32:06.867,Bewaesserungssteuerung,3 (SUB beregnung) Beregnung: Index 2 ('Obstgarten'), Trigger 5/4/110, Status 5/4/99, Sperre 0, Zeitfaktor 0.5 
    2014-07-05 12:32:06.867,Bewaesserungssteuerung,4 (SUB beregnung) Beregnung für Kreis 'Obstgarten' (re-)triggert 
    2014-07-05 12:32:06.889,Bewaesserungssteuerung,2,0s, 
    2014-07-05 12:32:36.954,Bewaesserungssteuerung,------------------------------------ 
    2014-07-05 12:32:36.955,Bewaesserungssteuerung,1 (MAIN) Aufrufgrund: bus 
    2014-07-05 12:32:36.955,Bewaesserungssteuerung,2 (MAIN) aktueller Status: 1 
    2014-07-05 12:32:36.955,Bewaesserungssteuerung,3 (BUS) aktueller Status: 1 
    2014-07-05 12:32:36.962,Bewaesserungssteuerung,2,0s, 
    2014-07-05 12:33:07.114,Bewaesserungssteuerung,------------------------------------ 
    2014-07-05 12:33:07.115,Bewaesserungssteuerung,1 (MAIN) Aufrufgrund: bus 
    2014-07-05 12:33:07.115,Bewaesserungssteuerung,2 (MAIN) aktueller Status: 1 
    2014-07-05 12:33:07.115,Bewaesserungssteuerung,3 (BUS) aktueller Status: 1 
    2014-07-05 12:33:07.122,Bewaesserungssteuerung,2,0s, 
    2014-07-05 12:33:37.369,Bewaesserungssteuerung,------------------------------------ 
    2014-07-05 12:33:37.370,Bewaesserungssteuerung,1 (MAIN) Aufrufgrund: bus 2014-07-05 
    12:33:37.370,Bewaesserungssteuerung,2 (MAIN) aktueller Status: 1 
    2014-07-05 12:33:37.371,Bewaesserungssteuerung,3 (BUS) aktueller Status: 1 
    2014-07-05 12:33:37.379,Bewaesserungssteuerung,2,0s, 
    2014-07-05 12:34:08.516,Bewaesserungssteuerung,------------------------------------ 
    2014-07-05 12:34:08.517,Bewaesserungssteuerung,1 (MAIN) Aufrufgrund: cycle 
    2014-07-05 12:34:08.517,Bewaesserungssteuerung,2 (MAIN) aktueller Status: 1 
    2014-07-05 12:34:08.523,Bewaesserungssteuerung,3 (SUB beregnung) Beregnung: Index 2 ('Obstgarten'), Trigger 5/4/110, Status 5/4/99, Sperre 0, Zeitfaktor 0.5 
    2014-07-05 12:34:08.524,Bewaesserungssteuerung,4 (SUB beregnung) Kreis 'Obstgarten' abgeschlossen 
    2014-07-05 12:34:08.524,Bewaesserungssteuerung,5 (SUB beregnung) Kreis 'Obstgarten' Dauer: 549 sek. (ist)/450 sek. (soll) 
    2014-07-05 12:34:08.531,Bewaesserungssteuerung,6 (SUB beregnung) Umschalten auf nächsten Kreis 
    2014-07-05 12:34:08.538,Bewaesserungssteuerung,7 (SUB beregnung) Beregnung: Index 3 ('Spruehregner'), Trigger 5/4/120, Status 5/4/99, Sperre 0, Zeitfaktor 0.5 
    2014-07-05 12:34:08.539,Bewaesserungssteuerung,8 (SUB beregnung) Beregnung für Kreis 'Spruehregner' (re-)triggert 
    2014-07-05 12:34:08.555,Bewaesserungssteuerung,2,0s,
    Dadurch, dass die Aufrufe als "BUS" interpretiert werden, wird die sub Beregnung nicht aufgerufen und damit verzögert sich das Umschalten => Dauer 549sec anstelle 450sec.

    Im Gruppenmonitor ist zu dieser Zeit aber nichts zu sehen, außer dass das WG den plugin status sendet.
    Dies passt damit zusammen, dass der Aufruf als BUS interpretiert wird und im MAIN Teil des plugins das if ($msg{'dst') eq $ga_plugintrigger") nicht erfüllt ist. Damit endet der MAIN Teil ohne aktion (nur status senden, wir im log und Gruppenmonitor sichtbar)
    und damit auch ohne Re-trigger => siehe die beiden Anhänge.

    Mein Verdacht ist daher, dass die Abfrage im Plugin:
    Code:
    elsif (%msg) {$gv_event = EVENT_BUS;}               # Bustraffic
    nicht konsistent funktioniert.

    Die Frage ist daher, wann der Wert für %msg zurückgesetzt wird.
    Ich vermute, dass hierfür ebenfalls ein 30s Timeout verwendet wird???

    Kennt hier jemand die Zusamenhänge? (Makki?)

    Danke für eure Hilfe
    Robert
    Angehängte Dateien

    Einen Kommentar schreiben:


  • Robert_Mini
    antwortet
    Ga's sehen gut aus.
    War bei deinem log der Kreis ost gesperrt?
    Die Sollzeit 0 beim Kreis süd weist auf ein knx_read hin, das ohne Rückgabewert endet.
    Steht auf der Visu ein Wert?

    Sonst Rücksetzen und Sequenz starten + neues log posten.
    Ich seh mir das am abend nochmal an.

    Lg Robert

    Einen Kommentar schreiben:


  • mivola
    antwortet
    Zitat von Robert_Mini Beitrag anzeigen
    Dein log mit Zeit 0 verstehe ich aber nicht. Sind die ga's in visu und plugin gleich?
    Ich denke schon. Hier mal die Ausschnitte aus der Config. Kannst du evtl nochmal drüber schauen? Oder stimmt irgendwas mit den DPTs nicht?

    visu:
    Code:
      <page name="Bewaesserung" visible="false" shownavbar-left="false">
            <group name="Einstellungen">
              <layout colspan="12"/>
              <switch mapping="OnOff" styling="GreyGreen">
                <layout colspan="4"/>
                <label><icon name="temp_temperature"/>Freigabe gesamt</label>
                <address transform="DPT:1.001" mode="readwrite">5/4/100</address>
              </switch>
              <infotrigger uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="left" infoposition="right" format="%.0f mm" change="absolute" min="0" max="30">
                <layout colspan="4"/>
                <label><icon name="temp_temperature"/>Regenlimit 24h</label>
                <address transform="DPT:9.001" mode="readwrite">5/4/101</address>
              </infotrigger>
              <infotrigger uplabel="+" downlabel="-" upvalue="0.1" downvalue="-0.1" align="left" infoposition="right" format="%.1f x" change="absolute" min="0.5" max="2">
                <layout colspan="4"/>
                <label><icon name="temp_temperature"/>Globaler Zeitfaktor</label>
                <address transform="DPT:9.001" mode="readwrite">9/6/5</address>
              </infotrigger>
            </group>         
            <group name="Manuelle Bedienung">
              <layout colspan="6"/>
              <switch mapping="OnOff" styling="GreyGreen">
                <layout colspan="4"/>
                <label><icon name="sani_sprinkling"/>Bewässerungs starten</label>
                <address transform="DPT:1.001" mode="readwrite">9/6/1</address>
    			<!--            <address transform="DPT:1.001" mode="read">9/6/2</address>-->
              </switch>
              <info format="%.1f min">
                <layout colspan="2"/>
                <label><icon name="time_timer"/>Gesamt</label>
                <address transform="DPT:9.001" mode="read">9/6/3</address>
              </info> 
              <switch mapping="OnOff" styling="GreyGreen">
                <layout colspan="4"/>
                <label><icon name="sani_sprinkling"/>Kreis 1 - Ost</label>
                <address transform="DPT:1.001" mode="readwrite">9/6/10</address>
              </switch>
              <info format="%.1f min">
                <layout colspan="2"/>
                <label><icon name="time_timer"/>Restzeit</label>
                <address transform="DPT:9.001" mode="readwrite">9/6/13</address>
              </info>   
              <switch mapping="OnOff" styling="GreyGreen">
                <layout colspan="4"/>
                <label><icon name="sani_sprinkling"/>Kreis 2 - Süd</label>
                <address transform="DPT:1.001" mode="readwrite">9/6/20</address>
    			<!--
                <address transform="DPT:1.001" mode="read">5/4/117</address>-->
              </switch>
              <info format="%.1f min">
                <layout colspan="2"/>
                <label><icon name="time_timer"/>Restzeit</label>
                <address transform="DPT:9.001" mode="readwrite">9/6/23</address>
              </info>
            </group> 
            <group name="Parameter Bewässerungskreise">
              <trigger value="1">
                <layout colspan="4"/>
                <label>Standardzeiten reset</label>
                <address transform="DPT:1.001" mode="readwrite">9/6/4</address>
              </trigger>
              <trigger value="0" mapping="Freigeben">
                <layout colspan="2"/>
                <address transform="DPT:1.001" mode="readwrite">5/4/107</address>
              </trigger>
              <infotrigger uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="left" infoposition="right" format="%.0f min" change="absolute" min="0" max="20">
                <layout colspan="4"/>
                <label><icon name="time_timer"/>Dauer Soll</label>
                <address transform="DPT:9.001" mode="readwrite">9/6/12</address>
              </infotrigger>
              <switch mapping="Sperre" styling="GreenRed">
                <layout colspan="2"/>
                <label></label>
                <address transform="DPT:1.001" mode="readwrite">9/6/14</address>
              </switch>
              <infotrigger uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="left" infoposition="right" format="%.0f min" change="absolute" min="0" max="20">
                <layout colspan="4"/>
                <label><icon name="time_timer"/>Dauer Soll</label>
                <address transform="DPT:9.001" mode="readwrite">9/6/22</address>
              </infotrigger>
              <switch mapping="Sperre" styling="GreenRed">
                <layout colspan="2"/>
                <label></label>
                <address transform="DPT:1.001" mode="readwrite">9/6/24</address>
              </switch>        
            </group>         
          </page>
    bewaesserung.pl:
    Code:
    my $ga_plugintrigger = "9/6/1";     # Start/Stop der Beregnungs-Sequenz
    my $ga_pluginstatus  = "9/6/2";     # Status, ob Sequenz aktiv/inaktiv (1/0)
    my $ga_gesamtzeit  = "9/6/3";     # Status, ob Sequenz aktiv/inaktiv (1/0)
    my $ga_zeitfaktor = "9/6/5";
    my $ga_resetdauer = "9/6/4";
    my $triggercycle = 30;                # 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 => "Ostseite", dauer => 900, ga_schalten => '9/6/10', ga_status => '9/6/11', ga_sperre => '9/6/14', ga_restzeit => '9/6/13', ga_dauer => '9/6/12'};
    push @Kreise, {name => "Suedseite", dauer => 90, ga_schalten => '9/6/20', ga_status => '9/6/21', ga_sperre => '9/6/24', ga_restzeit => '9/6/23', ga_dauer => '9/6/22'};
    Danke,
    Micha

    Einen Kommentar schreiben:


  • Robert_Mini
    antwortet
    Gesamtzeit wird nur während der aktiven Sequenz hochgezählt, nicht vorberechnet, dann müsste das plugin nämlich auf alle Dauer-ga's hören.

    Das korrekte handling, wenn keine ga für Sperre definiert ist, fehlt ebenso.

    Dein log mit Zeit 0 verstehe ich aber nicht. Sind die ga's in visu und plugin gleich?

    Lg
    Robert

    Einen Kommentar schreiben:


  • mivola
    antwortet
    Danke für die Config. Ich habe das jetzt mal (trocken ;-) ausprobiert - leider nur mit mäßigem Erfolg:
    - ich kann Soll-Zeiten für die Kreise über die Visu einstellen und auch wieder zurücksetzen
    - allerdings bleibt "Gesamtzeit" immer bei 0
    - dadurch sehe ich auch folgendes im Log:
    Code:
    2014-07-02 23:02:14.629,bewaesserung.pl,1 (MAIN) Aufrufgrund: bus
    2014-07-02 23:02:14.630,bewaesserung.pl,2 (MAIN) aktueller Status: 0
    2014-07-02 23:02:14.631,bewaesserung.pl,3 (BUS) aktueller Status: 0
    2014-07-02 23:02:14.631,bewaesserung.pl,4 (BUS) EIN-Telegramm empfangen
    2014-07-02 23:02:14.632,bewaesserung.pl,5 (BUS) Beregnungsprogramm gestartet
    2014-07-02 23:02:14.645,bewaesserung.pl,6 (SUB beregnung) Beregnung: Index 0 ('Ostseite'), Trigger 9/6/10, Status 9/6/11, Sperre 1, Zeitfaktor 
    2014-07-02 23:02:14.646,bewaesserung.pl,7 (SUB beregnung) Kreis 'Ostseite' gesperrt
    2014-07-02 23:02:14.652,bewaesserung.pl,8 (SUB beregnung) Umschalten auf nächsten Kreis
    2014-07-02 23:02:14.665,bewaesserung.pl,9 (SUB beregnung) Beregnung: Index 1 ('Suedseite'), Trigger 9/6/20, Status 9/6/21, Sperre 0, Zeitfaktor 
    2014-07-02 23:02:14.667,bewaesserung.pl,10 (SUB beregnung) Kreis 'Suedseite' abgeschlossen
    2014-07-02 23:02:14.669,bewaesserung.pl,11 (SUB beregnung) Kreis 'Suedseite' Dauer:  0 sek. (ist)/0 sek. (soll)
    2014-07-02 23:02:14.682,bewaesserung.pl,12 (SUB beregnung) keine weiteren Kreise, Beregnung beendet.
    2014-07-02 23:02:14.686,bewaesserung.pl,13 (SUB ende) Ventil für 'Ostseite' geschlossen
    2014-07-02 23:02:14.699,bewaesserung.pl,14 (SUB ende) Ventil für 'Suedseite' geschlossen
    2014-07-02 23:02:14.737,bewaesserung.pl,2,0.3s,
    => der Kreis wird also nur 0sek beregnet...

    Anmerkung: ich habe das Ganze erstmal ohne Aktor am Laufen. Könnte das ein Grund für das Fehlverhalten sein?

    Danke,
    Micha

    Einen Kommentar schreiben:


  • Robert_Mini
    antwortet
    Hallo Micha!

    Kein Problem.
    Hier der .xml Ausschnitt aus meiner CV.

    lg
    Robert
    Code:
          <page name="Bewässerung">
            <group name="Einstellungen">
              <layout colspan="12"/>
              <switch mapping="OnOff" styling="GreyGreen">
                <layout colspan="4"/>
                <label><icon name="temp_temperature"/>Freigabe gesamt</label>
                <address transform="DPT:1.001" mode="readwrite">5/4/100</address>
              </switch>
              <infotrigger uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="left" infoposition="right" format="%.0f mm" change="absolute" min="0" max="30">
                <layout colspan="4"/>
                <label><icon name="temp_temperature"/>Regenlimit 24h</label>
                <address transform="DPT:9.001" mode="readwrite">5/4/101</address>
              </infotrigger>
              <infotrigger uplabel="+" downlabel="-" upvalue="0.1" downvalue="-0.1" align="left" infoposition="right" format="%.1f x" change="absolute" min="0.5" max="2">
                <layout colspan="4"/>
                <label><icon name="temp_temperature"/>Globaler Zeitfaktor</label>
                <address transform="DPT:9.001" mode="readwrite">5/4/106</address>
              </infotrigger>
            </group>         
            <group name="Manuelle Bedienung">
              <layout colspan="6"/>
              <switch mapping="OnOff" styling="GreyGreen">
                <layout colspan="4"/>
                <label><icon name="sani_sprinkling"/>Bewässerungssequenz starten</label>
                <address transform="DPT:1.001" mode="write">5/4/102</address>
                <address transform="DPT:1.001" mode="read">5/4/103</address>
              </switch>
              <info format="%.1f min">
                <layout colspan="2"/>
                <label><icon name="time_timer"/>Gesamtzeit</label>
                <address transform="DPT:9.001" mode="readwrite">5/4/104</address>
              </info> 
              <switch mapping="OnOff" styling="GreyGreen">
                <layout colspan="4"/>
                <label><icon name="sani_sprinkling"/>Kreis 1 - Obstgarten</label>
                <address transform="DPT:1.001" mode="write">5/4/110</address>
                <address transform="DPT:1.001" mode="read">5/4/112</address>
              </switch>
              <info format="%.1f min">
                <layout colspan="2"/>
                <label><icon name="time_timer"/>Restzeit</label>
                <address transform="DPT:9.001" mode="readwrite">5/4/113</address>
              </info>   
              <switch mapping="OnOff" styling="GreyGreen">
                <layout colspan="4"/>
                <label><icon name="sani_sprinkling"/>Kreis 2 - Wiese Gartenhaus</label>
                <address transform="DPT:1.001" mode="write">5/4/115</address>
                <address transform="DPT:1.001" mode="read">5/4/117</address>
              </switch>
              <info format="%.1f min">
                <layout colspan="2"/>
                <label><icon name="time_timer"/>Restzeit</label>
                <address transform="DPT:9.001" mode="readwrite">5/4/118</address>
              </info>
              <switch mapping="OnOff" styling="GreyGreen">
                <layout colspan="4"/>
                <label><icon name="sani_sprinkling"/>Kreis 4 - Terrasse</label>
                <address transform="DPT:1.001" mode="write">5/4/125</address>
                <address transform="DPT:1.001" mode="read">5/4/127</address>
              </switch>
              <info format="%.1f min">
                <layout colspan="2"/>
                <label><icon name="time_timer"/>Restzeit</label>
                <address transform="DPT:9.001" mode="readwrite">5/4/128</address>
              </info>         
              <switch mapping="OnOff" styling="GreyGreen">
                <layout colspan="4"/>
                <label><icon name="sani_sprinkling"/>Kreis 5 - Brunnen</label>
                <address transform="DPT:1.001" mode="write">5/4/130</address>
                <address transform="DPT:1.001" mode="read">5/4/132</address>
              </switch>
              <info format="%.1f min">
                <layout colspan="2"/>
                <label><icon name="time_timer"/>Restzeit</label>
                <address transform="DPT:9.001" mode="readwrite">5/4/133</address>
              </info>          
              <switch mapping="OnOff" styling="GreyGreen">
                <layout colspan="4"/>
                <label><icon name="sani_sprinkling"/>Kreis 3 - Vorgarten+Pool</label>
                <address transform="DPT:1.001" mode="write">5/4/120</address>
                <address transform="DPT:1.001" mode="read">5/4/122</address>
              </switch>
              <info format="%.1f min">
                <layout colspan="2"/>
                <label><icon name="time_timer"/>Restzeit</label>
                <address transform="DPT:9.001" mode="readwrite">5/4/123</address>
              </info>           
            </group> 
            <group name="Parameter Bewässerungskreise">
              <trigger value="1">
                <layout colspan="4"/>
                <label>Standardzeiten wiederherstellen</label>
                <address transform="DPT:1.001" mode="readwrite">5/4/108</address>
              </trigger>
              <trigger value="0" mapping="Freigeben">
                <layout colspan="2"/>
                <address transform="DPT:1.001" mode="readwrite">5/4/107</address>
              </trigger>
              <infotrigger uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="left" infoposition="right" format="%.0f min" change="absolute" min="0" max="20">
                <layout colspan="4"/>
                <label><icon name="time_timer"/>Dauer Soll</label>
                <address transform="DPT:9.001" mode="readwrite">5/4/114</address>
              </infotrigger>
              <switch mapping="Sperre" styling="GreenRed">
                <layout colspan="2"/>
                <label></label>
                <address transform="DPT:1.001" mode="readwrite">5/4/111</address>
                <address transform="DPT:1.001" mode="read">5/4/107</address>
              </switch>
              <infotrigger uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="left" infoposition="right" format="%.0f min" change="absolute" min="0" max="20">
                <layout colspan="4"/>
                <label><icon name="time_timer"/>Dauer Soll</label>
                <address transform="DPT:9.001" mode="readwrite">5/4/119</address>
              </infotrigger>
              <switch mapping="Sperre" styling="GreenRed">
                <layout colspan="2"/>
                <label></label>
                <address transform="DPT:1.001" mode="readwrite">5/4/116</address>
                <address transform="DPT:1.001" mode="read">5/4/107</address>
              </switch>        
              <infotrigger uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="left" infoposition="right" format="%.0f min" change="absolute" min="0" max="20">
                <layout colspan="4"/>
                <label><icon name="time_timer"/>Dauer Soll</label>
                <address transform="DPT:9.001" mode="readwrite">5/4/129</address>
              </infotrigger>
              <switch mapping="Sperre" styling="GreenRed">
                <layout colspan="2"/>
                <label></label>
                <address transform="DPT:1.001" mode="readwrite">5/4/126</address>
                <address transform="DPT:1.001" mode="read">5/4/107</address>
              </switch>
              <infotrigger uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="left" infoposition="right" format="%.0f min" change="absolute" min="0" max="20">
                <layout colspan="4"/>
                <label><icon name="time_timer"/>Dauer Soll</label>
                <address transform="DPT:9.001" mode="readwrite">5/4/134</address>
              </infotrigger>
              <switch mapping="Sperre" styling="GreenRed">
                <layout colspan="2"/>
                <label></label>
                <address transform="DPT:1.001" mode="readwrite">5/4/131</address>
                <address transform="DPT:1.001" mode="read">5/4/107</address>
              </switch>
              <infotrigger uplabel="+" downlabel="-" upvalue="1" downvalue="-1" align="left" infoposition="right" format="%.0f min" change="absolute" min="0" max="20">
                <layout colspan="4"/>
                <label><icon name="time_timer"/>Dauer Soll</label>
                <address transform="DPT:9.001" mode="readwrite">5/4/124</address>
              </infotrigger>
              <switch mapping="Sperre" styling="GreenRed">
                <layout colspan="2"/>
                <label></label>
                <address transform="DPT:1.001" mode="readwrite">5/4/121</address>
                <address transform="DPT:1.001" mode="read">5/4/107</address>
              </switch>
            </group>         
          </page>

    Einen Kommentar schreiben:


  • mivola
    antwortet
    Zitat von Robert_Mini Beitrag anzeigen
    Hab zusätzlich einen Visu-Screenshot angehängt.
    Super Arbeit Robert. Könntest du evtl auch noch die entsprechende XML-Config-Datei der CometVisu (oder einen Ausschnitt daraus) hier einstellen?

    Danke!
    Micha

    Einen Kommentar schreiben:


  • Robert_Mini
    antwortet
    Ich poste hier mal meinen Zwischenstand.

    Folgende Erweiterungen:
    - Globaler Zeitfaktor für alle Kreise von GA DPT9
    - zykl. senden der Restzeit des akt. Kreis und Gesamtzeit
    - Abfrage des Sperrobjektes vom Aktorkanal
    - Lesen der Sollzeit von der Visu über GA
    - Reset der Zeiten auf Default

    Hab zusätzlich einen Visu-Screenshot angehängt.

    Wesentliche Änderungen hinsichtlich der DPT sind:
    - Angabe der GA bei knx_write und knx_read
    - ($msg{'data'} == 1) anstelle ($msg{'value'} == 1)

    @Mathias:
    Vielleicht können wir das wieder auf einen gemeinsamen, kompatiblen(!) Stand im SVN bringen? Ich denke hierzu fehlen im wesentlichen die Abfragen, wenn xxx_ga !='' bei allen optionalen Sendewerten.

    lg
    Robert

    Code:
    #############################################################################
    # Plugin: bewaesserung.pl (Gartenberegnung steuern)
    # V0.5 20140309
    # Autor: Mathias Gindler (mathias@gindler.de)
    # Erweiterung: Robert_Mini
    # 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:
    # - Zeitsteuerung
    # - aktiv/inaktiv
    # - Regenmengen- und Temperaturabhängigkeit
    #############################################################################
    #
    # 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;
    
    # return;
    # 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 = 6;
    my $debugindex = 1;
    my $gv_event=undef;
    
    my $startzeit;
    my $pluginstatus;
    
    my $ga_plugintrigger = "5/4/102";     # Start/Stop der Beregnungs-Sequenz
    my $ga_pluginstatus  = "5/4/103";     # Status, ob Sequenz aktiv/inaktiv (1/0)
    my $ga_gesamtzeit  = "5/4/104";     # Status, ob Sequenz aktiv/inaktiv (1/0)
    my $ga_zeitfaktor = "5/4/106";
    my $ga_resetdauer = "5/4/108";
    my $triggercycle = 30;                # 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 => "Wiese Gartenhaus", dauer => 900, ga_schalten => '5/4/115', ga_status => '5/4/99', ga_sperre => '5/4/116', ga_restzeit => '5/4/118', ga_dauer => '5/4/119'};
    push @Kreise, {name => "Terrasse",         dauer => 600, ga_schalten => '5/4/125', ga_status => '5/4/99', ga_sperre => '5/4/126', ga_restzeit => '5/4/128', ga_dauer => '5/4/129'};
    push @Kreise, {name => "Obstgarten",       dauer => 900, ga_schalten => '5/4/110', ga_status => '5/4/99', ga_sperre => '5/4/111', ga_restzeit => '5/4/113', ga_dauer => '5/4/114'};
    push @Kreise, {name => "Spruehregner",     dauer => 450, ga_schalten => '5/4/120', ga_status => '5/4/99', ga_sperre => '5/4/121', ga_restzeit => '5/4/123', ga_dauer => '5/4/124'};
    push @Kreise, {name => "Brunnen",          dauer => 600, ga_schalten => '5/4/130', ga_status => '5/4/99', ga_sperre => '5/4/131', ga_restzeit => '5/4/133', ga_dauer => '5/4/134'};
    
    plugin_log($plugname, "------------------------------------") if ($show_debug > 5);
    
    # Aufruf per Bus-Telegramm
    $plugin_subscribe{$ga_plugintrigger}{$plugname} = 1;
    $plugin_subscribe{$ga_resetdauer}{$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) {
    ## Start durch GA 
    # Zeiten vom Bus lesen ergänzen
        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{'data'} == 1){  #value durch data ersetzt
                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;
                    $plugin_info{$plugname.'_StartzeitSequenz'} = $startzeit;
                    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();
                }
            }
        }
        elsif ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $ga_resetdauer) {
            if ($msg{'data'} == 1){  #value durch data ersetzt
                plugin_log($plugname, $debugindex++." (BUS) ga_resetdauer aufgerufen") if ($show_debug > 0);
                foreach (@Kreise){
                    my $kreisdauer  = ($_->{dauer})/60;
                    knx_write($_->{ga_dauer}, $kreisdauer, 9);
                }
            }
        }
         
    } 
    
    knx_write($ga_pluginstatus, $pluginstatus, 1);  # aktuellen Status an Bus zurückmelden
    
    
    sub beregnung{
        my $x;
        my $kreisname;
        my $kreisdauer;
        my $ga_schalten;
        my $ga_status;
        my $ga_sperre;
        my $ga_restzeit;
        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};
        $ga_sperre     = $Kreise[$x]->{ga_sperre};
        $ga_restzeit   = $Kreise[$x]->{ga_restzeit};
    
        my $sperre = knx_read($ga_sperre, 0,1);
        my $zeitfaktor = knx_read($ga_zeitfaktor, 0,9);
    
        $kreisdauer    = ($Kreise[$x]->{dauer}) * $zeitfaktor;
        
        my $restzeit = 0;
        my $gesamtzeit = 0;
        plugin_log($plugname, $debugindex++." (SUB beregnung) Beregnung: Index $x ('$kreisname'), Trigger $ga_schalten, Status $ga_status, Sperre $sperre, Zeitfaktor $zeitfaktor") if ($show_debug > 5);
        
        if ($plugin_info{$plugname.'_Startzeit'} + $kreisdauer - 2 < time() or ($sperre == 1)){
            if (!$sperre) {
                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, 1);
            }
            else {
                plugin_log($plugname, $debugindex++." (SUB beregnung) Kreis '$kreisname' gesperrt") if ($show_debug > 0);
            }
            knx_write($ga_restzeit, $restzeit, 9);
            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);
                $gesamtzeit = (time() - $plugin_info{$plugname.'_StartzeitSequenz'})/60;
                knx_write($ga_gesamtzeit, $gesamtzeit, 9);
                ende();
            }
        }
        else{
            plugin_log($plugname, $debugindex++." (SUB beregnung) Beregnung für Kreis '$kreisname' (re-)triggert") if ($show_debug > 0);
            knx_write($ga_schalten, 1, 1);
            $restzeit = ($plugin_info{$plugname.'_Startzeit'} + $kreisdauer - time())/60;
            knx_write($ga_restzeit, $restzeit, 9);
            $gesamtzeit = (time() - $plugin_info{$plugname.'_StartzeitSequenz'})/60;
            knx_write($ga_gesamtzeit, $gesamtzeit, 9);
        }
    }
    
    sub ende{
        foreach (@Kreise){
            plugin_log($plugname, $debugindex++." (SUB ende) Ventil für '$_->{name}' geschlossen") if ($show_debug > 0);
            knx_write($_->{ga_schalten},0,1);
            knx_write($_->{ga_restzeit}, 0, 9);
        }
        $pluginstatus = 0;
        $plugin_info{$plugname.'_Status'} = $pluginstatus;
        $plugin_info{$plugname.'_cycle'} = 0;
    }
    Angehängte Dateien

    Einen Kommentar schreiben:


  • Frankthemoster
    antwortet
    Hallo Robert_Mini,

    ich denke die nicht importierten GA's im Wiregate könnten auch bei mir das Problem sein.

    Kannst du bitte deine Änderungen hier einstellen, vielleich funktionierts dann auch bei mir!

    Danke und Gruß

    Einen Kommentar schreiben:


  • Robert_Mini
    antwortet
    Hallo Mathias!

    Hab grad das plugin für meine Bewässerung aktiviert.
    Was soll ich sagen: funktioniert - DANKE!!!!

    Kompliment an deine Programmierung! Debug-log wirklich super übersichtlich, und durch die Sub() sehr flexibel gehalten.

    Habe 2. Kleinigkeiten geändert
    (hab meine GAs nicht importiert, da mir das zu aufwändig ist, bei jeder neuen GA in der ETS das import-tool anzuwerfen):
    - GA-Type im knx_write ergänzt
    - $msg{'data'} == 1 anstelle von $msg{'value'} == 1

    Könnte für die interessant sein, die ebenfalls die GAs nicht importiert haben.

    Folgende Dinge werde ich kurzfristig ergänzen (und gerne posten, wenn wer interessiert ist):
    - "Freigabeobjekt"
    - Mit der Status Rückmeldung auch die verbleibende Zeit des akt. Kreises schicken
    - Erkennung ob ein Kreis gesperrt ist (knx-read auf das Sperrobjekt des Aktors), wobei mir hier der Weg noch nicht ganz klar ist.

    Wenn dann noch Zeit bleibt:
    - Verstellung der Dauer über CV Infotrigger, das Plugin muss sich die Zeit auch merken und auf read am Bus antworten
    - Automatiksteuerung (Zeitschaltuhr + Abhängigkeit von Regenmenge der letzten 24h und Temperatur)

    Nochmals Danke für dein Plugin
    lg
    Robert

    Einen Kommentar schreiben:


  • Frankthemoster
    antwortet
    Hallo zusammen,

    bin derzeitg auch am verlegen meiner Gartenbewässerung mit 9St Magnetventilen, welche ich gerne über dieses Plugin ansteuern möchte.

    Da ich bis jetzt noch nicht die Zeit gefunden habe mich in Plugins einzulesen, geschweige den selbst welche zu schreiben,
    habe ich bis jetzt immer die vorhanden aus dem Forum genutzt und umgeschrieben (genau so wie dieses)

    Dazu habe ich mir einen neuen Schaltaktor gekauft
    - die Schaltausgänge auf Treppenlicht eingestellt (größere Zeit als im Plugin)
    - die Gruppenadressen für Start/ Stopp / Status angepaßt
    - die Gruppenadressen der einzelnen Regnerkreise eingetragen.

    Dennoch funktioniert das Plugin nicht.

    Beim Starten über die Gruppenadresse bekomme ich sofort in der Pluginlog

    -2014-06-08 16:22:53.410,bewässerung Rasen test.pl,1 (BUS)
    Beregnungsprogramm läuft nicht - keine Aktion ausgeführt

    Kann mir jemand helfen, denn der Rasenansaattermin rückt in greifbare Nähe und da sollte dieses Plugin laufen. Panik
    Muß evtl bei diesem Plugin noch was geändert werden??
    Brauche ich evtl noch Befehlszeilein in der config datei????
    Hat jemand dieses Plugin schon am laufen???

    Danke schon mal im Voraus
    Gruß

    Frank

    PS: habe mal mein Plugin in einer Text datei angehängt!
    Angehängte Dateien

    Einen Kommentar schreiben:


  • Piepenpaul
    antwortet
    Bei diesem Wetter macht Gartenarbeit mehr Spass, als am PC zu sitzen....
    Dann viel Erfolg.
    Vielleicht findest Du ja mal Zeit, Dein Plugin zu überarbeiten.

    Gruß,
    Dennis

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:

Lädt...
X