|
From: <e....@us...> - 2011-09-10 15:15:29
|
Revision: 415
http://openautomation.svn.sourceforge.net/openautomation/?rev=415&view=rev
Author: e.max
Date: 2011-09-10 15:15:22 +0000 (Sat, 10 Sep 2011)
Log Message:
-----------
Zykluszeit wurde nicht korrekt verarbeitet, Zyklus-Anpassung nun exakt in Sekunden, dadurch keine 1-Sekunden leer-Zyklen mehr, weniger Systemlast. Alte plugin_info eintr?\195?\164ge werden bei neuer Versionsnummer nun bereinigt.
Modified Paths:
--------------
wiregate/plugin/generic/emx_uhr.pl
Modified: wiregate/plugin/generic/emx_uhr.pl
===================================================================
--- wiregate/plugin/generic/emx_uhr.pl 2011-09-10 08:29:05 UTC (rev 414)
+++ wiregate/plugin/generic/emx_uhr.pl 2011-09-10 15:15:22 UTC (rev 415)
@@ -1,6 +1,10 @@
# Plugin zum Zeitabhaengigen Schalten von GA's (Schaltuhr)
# License: GPL (v2)
# version von emax
+
+# Plugin zum Zeitabhaengigen Schalten von GA's (Schaltuhr)
+# License: GPL (v2)
+# version von emax
#
# $Id$
#
@@ -10,111 +14,125 @@
# ## who yyyymmdd bug# description
# -- --- -------- ----- ----------------------------------------
# . ... ........ ..... vorlage
+# 3 edh 20110910 ..... Zykluszeit wurde nicht korrekt verarbeitet,
+# Zyklus-Anpassung nun exakt in Sekunden,
+# - dadurch keine 1-Sekunden leer-Zyklen mehr,
+# - weniger Systemlast.
+# Alte plugin_info einträge werden bei neuer
+# versionsnummer nun bereinigt.
# 2 edh 20110910 ----- Bug im Wertevergleich in 'matches()' gefixt
# 1 edh 20110807 ----- wg. utf-8 Zirkus Umlaute in ae/ue/oe geaendert
# 0 edh 20110708 ----- erste Version
-
-#---------------
-# Einstellungen:
-#---------------
+#-----------------------------------------------------------------------------
+# Einstellungen
+#-----------------------------------------------------------------------------
+
my @Zeiten =
- (
- { Name=>'Test', Aktiv=>'1', Std=>undef, Min=>undef, MTag=>undef, Mon=>undef, WTag=>undef, Wert=>'1', DPT=>'1', GA=>'1/1/30', Log=>'1' },
- { Name=>'Bewaesserung', Aktiv=>'1', Std=>'7', Min=> '0', MTag=>'3', Mon=>'4-9', WTag=>'1-5', Wert=>'1', DPT=>'1', GA=>'1/1/30' },
- { Name=>'AussenlichtEin', Aktiv=>'1', Std=>'19', Min=>'30', MTag=>'4', Mon=>undef, WTag=>'1,3,5', Wert=>'1', DPT=>'1', GA=>'1/2/40' },
- { Name=>'AussenlichtAus', Aktiv=>'1', Std=>'7', Min=> '0', MTag=>undef, Mon=>undef, WTag=>'2,4,6', Wert=>'0', DPT=>'1', GA=>'1/2/40' }
+ (
+ # Beispiele
+ { Name=>'Test', Aktiv=>'0', Std=>undef, Min=>undef, MTag=>undef, Mon=>undef, WTag=>undef, Wert=>'1', DPT=>'1', GA=>'1/1/30', Log=>'1' },
+ { Name=>'Bewaesserung', Aktiv=>'0', Std=>'7', Min=> '0', MTag=>'3', Mon=>'4-9', WTag=>'1-5', Wert=>'1', DPT=>'1', GA=>'1/1/30' },
+ { Name=>'AussenlichtEin', Aktiv=>'0', Std=>'19', Min=>'30', MTag=>'4', Mon=>undef, WTag=>'1,3,5', Wert=>'1', DPT=>'1', GA=>'1/2/40' },
+ { Name=>'AussenlichtAus', Aktiv=>'0', Std=>'7', Min=> '0', MTag=>undef, Mon=>undef, WTag=>'2,4,6', Wert=>'0', DPT=>'1', GA=>'1/2/40' }
);
-#-------------------
-# ENDE Einstellungen
-#-------------------
+#-----------------------------------------------------------------------------
+# ENDE Einstellungen
+#-----------------------------------------------------------------------------
use POSIX;
-#--------------------------------------------------------------------
+#-----------------------------------------------------------------------------
# Eigenen Aufruf-Zyklus setzen
# Das script verarbeitet keine Sekunden, weshalb die kleinste
# Granulaitaet ohne zusaetzlioche Statusverarbeitung eine Minute ist.
-#--------------------------------------------------------------------
+#-----------------------------------------------------------------------------
my $cycleTime = 60;
-#--------------------------------------------------------------------
-# definiert die Sekunde, ab der neu synchronisiert wird
-#--------------------------------------------------------------------
-my $slotEnd = 10;
+#-----------------------------------------------------------------------------
+# definiert die Sekunde, ab der neu synchronisiert wird
+# ACHTUNG: Sollte nicht kleiner als 1 Sekunde sein.
+#-----------------------------------------------------------------------------
+my $slotEnd = 1;
-#--------------------------------------------------------------------
-# Die Versionsnummer ist Teil des plugin_info hashes und dient
-# dazu, dass das script definierte Anfangskonditionen findet
-# auch ohne alles neu starten zu muessen. Die Nummer
-# einfach nach einer AEnderung des scripts um eins erhoehen.
-#--------------------------------------------------------------------
-my $version = 1;
+#-----------------------------------------------------------------------------
+# Die Versionsnummer is Teil des plugin_info hashes und dient
+# dazu, dass das script definierte anfangskonditionen findet
+# auch ohne den wiregated neu starten zu muessen. Die Nummer
+# einfach nach einer Aenderung des scripts um eins erhoehen.
+#-----------------------------------------------------------------------------
+my $version = 8;
-#--------------------------------------------------------------------
-# Auswertung von Bereichs und Listenvergleichen
+#-----------------------------------------------------------------------------
+# Auswertung von Bereichs und Listenvergleichen
# Prueft, ob ein Wert zu einer Liste oder in einen Bereich passt
-#--------------------------------------------------------------------
+#-----------------------------------------------------------------------------
sub matches
{
- my ($value, $def) = @_; # Zu pruefender Wert, Bereichsdefinition
+ my ($value, $def) = @_; # Zu pruefender Wert, Bereichsdefinition
(!$def) and return 1;
+
foreach (split(/,/, $def))
- {
- s/\s+//g; # Blanks entfernen
- s/^0+//g; # fuehrende Nullen entfernen
- (/^$value$/) and return 1; # Alpha-Vergleich (vermeidet Laufzeitfehler)
+ {
+ s/\s+//g;
+ s/^0+//g; # fuehrende Nullen entfernen
+ # Vergleich auf Alpha-Basis (vermeidet Laufzeit-Fehler)
+ (/^$value$/) and return 1;
(/^([\d]+)-(\d+)/) and return ($value >= $1 && $value <= $2);
}
return 0;
}
-#====================================================================
-# main()
-#====================================================================
-
-# kontrollierte Startkonditionen setzen
-if (!defined $plugin_info{$plugname.$version.'firstRun'})
+#-----------------------------------------------------------------------------
+# Zykluszeit setzen
+#-----------------------------------------------------------------------------
+sub setCycle
{
- $plugin_info{$plugname.$version.'firstRun'} = 1;
- plugin_log($plugname, "Started plugin version $version, first have to sync with time slot.");
- # die Anpassungs der Zyklyzweit erfolgt dynamisch, s.u.
- $plugin_info{$plugname.'_cycle'} = 1;
+ my ($seconds,$uSec) = gettimeofday();
+ my $curSec = $seconds%60;
+ if ( $curSec >= $slotEnd)
+ {
+ $plugin_info{$plugname.'_cycle'} = $cycleTime - $curSec - $uSec/1000000;
+ plugin_log($plugname, "cycle time set to $plugin_info{$plugname.'_cycle'} second");
+ }
+ else
+ {
+ $plugin_info{$plugname.'_cycle'} = $cycleTime;
+ }
}
+
+#=============================================================================
+# main()
+#=============================================================================
+
my ($curSec,$curMin,$curStu,$curMTag,$curMon,$curJahr,$curWTag,$curJTag,$isdst) = localtime(time);
$curJahr += 1900;
-#--------------------------------------------------------------------
-# Es ist sinnvoll, dafuer zu sorgen, dass die Startzeit dieses Plugins
-# mit der Zeit nicht "abdriftet", da sonst ueber lange Laufzeiten ein
-# Minutenueberlauf entstehen koennte, und so Ereignisse verloren gingen.
-# Aus diesem Grund prueft das script, ob es innerhalb der ersten 10 Sekunden
-# einer Minute laeuft, Wenn das nicht der Fall ist, wird so lange eine
-# verkuerzte Zykluszeit verwendet, bis die Ausfuehrung wieder im vorgesehenen
-# Zeitraum ablaeuft.
-#
-# Bei der Erstausfuehrung des Plugins nimmt dieses erst nach Erreichen
-# des vorgesehenen Zeitfensters die eigentliche Arbeit auf, weil der
-# Abstand zwischen zwei Triggern sonst zu klein werden koennte.
-#--------------------------------------------------------------------
-
-if ($curSec >= $slotEnd)
+# kontrollierte Startkonditionen setzen
+if (!defined $plugin_info{"$plugname.$version.firstRun"})
{
- if ($plugin_info{$plugname.'_cycle'} != 1)
+ # obsolete Versionen von $plugin_info bereinigen
+ foreach (keys %plugin_info)
{
- plugin_log($plugname, "lost time-slot due to time drift, reducing cycle time to 1 second");
- $plugin_info{$plugname.'_cycle'} = 1;
+ if (/^$plugname\./)
+ {
+ delete $plugin_info{$_};
+ plugin_log($plugname, "deleted plugin_info[$_]");
+ }
}
-
- # bei Erstausfuehrung auf Zeitfenster warten
- ($plugin_info{$plugname.$version.'firstRun'} == 1) and return;
+ plugin_log($plugname, "Started plugin version $version, will execute with first time-slot.");
+ $plugin_info{"$plugname.$version.firstRun"} = 1;
+ &setCycle();
}
+# beim ersten mal nur ausfuehren, wenn inmnerhalb des slots
+($curSec >= $slotEnd && $plugin_info{"$plugname.$version.firstRun"} == 1) and return;
+
# pruefen, ob in dieser Minute bereits ausgefuehrt
-(defined $plugin_info{$plugname.$version.'lastMinute'} && $plugin_info{$plugname.$version.'lastMinute'} == $curMin) and return;
+(defined $plugin_info{"$plugname.$version.lastMinute"} && $plugin_info{"$plugname.$version.lastMinute"} == $curMin) and return;
foreach my $Zeit (@Zeiten)
{
@@ -131,5 +149,10 @@
knx_write($Zeit->{GA},$Zeit->{Wert}, $Zeit->{DPT});
}
-$plugin_info{$plugname.$version.'lastMinute'} = $curMin;
-$plugin_info{$plugname.$version.'firstRun'} = 0;
+$plugin_info{"$plugname.$version.lastMinute"} = $curMin;
+
+# ggf. Zykluszeit korrigieren
+&setCycle();
+$plugin_info{"$plugname.$version.firstRun"} = 0;
+
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|