Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Ankündigung
Einklappen
Keine Ankündigung bisher.
bewaesserung.pl - mein erstes Plugin zur Gartenbewässerung
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.
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!
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)
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;
}
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?
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.
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.
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:
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.
Ich meine mich zu erinnern, mal von dem Problem gelesen zu haben, dass ein Plugin unter gewissen Umständen auch noch zu "früheren" GAs subscribed ist/bleibt - also jenen GAs die irgendwann mal mit $plugin_subscribe "angemeldet" wurden. Ich glaube ein restart des wiregated brachte Abhilfe. Aber wie gesagt: alles nur eine vage Erinnerung - und wenn, dann sicherlich nur in einer alten Version aufgetreten ...
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
So, jetzt nochmal: beide Kreise freigegeben und zurückgesetzt. Zeit für die Kreise wird korrekt angezeigt: siehe Screenshot.
Ein Klick auf "Bewässerung starten" führt zu:
Code:
2014-07-07 22:46:04.846,bewaesserung.pl,------------------------------------
2014-07-07 22:46:04.847,bewaesserung.pl,1 (MAIN) Aufrufgrund: bus
2014-07-07 22:46:04.848,bewaesserung.pl,2 (MAIN) aktueller Status: 0
2014-07-07 22:46:04.848,bewaesserung.pl,3 (BUS) aktueller Status: 0
2014-07-07 22:46:04.848,bewaesserung.pl,4 (BUS) EIN-Telegramm empfangen
2014-07-07 22:46:04.848,bewaesserung.pl,5 (BUS) Beregnungsprogramm gestartet
2014-07-07 22:46:04.871,bewaesserung.pl,6 (SUB beregnung) Beregnung: Index 0 ('Ostseite'), Trigger 9/6/10, Status 9/6/11, Sperre 0, Zeitfaktor
2014-07-07 22:46:04.872,bewaesserung.pl,7 (SUB beregnung) Kreis 'Ostseite' abgeschlossen
2014-07-07 22:46:04.872,bewaesserung.pl,8 (SUB beregnung) Kreis 'Ostseite' Dauer: 0 sek. (ist)/0 sek. (soll)
2014-07-07 22:46:04.896,bewaesserung.pl,9 (SUB beregnung) Umschalten auf nächsten Kreis
2014-07-07 22:46:04.915,bewaesserung.pl,10 (SUB beregnung) Beregnung: Index 1 ('Suedseite'), Trigger 9/6/20, Status 9/6/21, Sperre 0, Zeitfaktor
2014-07-07 22:46:04.915,bewaesserung.pl,11 (SUB beregnung) Kreis 'Suedseite' abgeschlossen
2014-07-07 22:46:04.916,bewaesserung.pl,12 (SUB beregnung) Kreis 'Suedseite' Dauer: 0 sek. (ist)/0 sek. (soll)
2014-07-07 22:46:04.935,bewaesserung.pl,13 (SUB beregnung) keine weiteren Kreise, Beregnung beendet.
2014-07-07 22:46:04.946,bewaesserung.pl,14 (SUB ende) Ventil für 'Ostseite' geschlossen
2014-07-07 22:46:04.983,bewaesserung.pl,15 (SUB ende) Ventil für 'Suedseite' geschlossen
2014-07-07 22:46:05.043,bewaesserung.pl,2,0.3s,
So, nun scheint das erste Problem behoben: der Zeitfaktor war nicht gesetzt. Weder in der Visu noch im Log stand ein korrekter Wert drin. Nachdem ich die +/- Buttons in der Visu bedient habe, wird da jetzt auch was angezeigt :-) Und die Beregnung startet auch :-))
Allerdings bin ich gleich über das nächste Problem gestolpert: ich habe die Zeit der beiden Kreise in der Visu reduziert und danach die Beregnung gestartet. Statt der angezeigten Zeit wird für die beiden Kreise aber weiterhin der default-Wert benutzt. Siehe Screenshot und log:
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar