|
From: <pf...@us...> - 2015-02-09 12:06:58
|
Revision: 2356
http://sourceforge.net/p/openautomation/code/2356
Author: pfry
Date: 2015-02-09 12:06:50 +0000 (Mon, 09 Feb 2015)
Log Message:
-----------
Bei Logiken ohne definierte transmit-Adressen werden definierte followup-Logiken ausgefuehrt (neu). Falls aber transmit-Adressen definiert sind, dann werden followups nur ausgeloest, wenn auch was gesendet wird (wie bisher). Ausserdem Debug-Ausgabe bei langen Logik-Laufzeiten
Modified Paths:
--------------
wiregate/plugin/generic/Logikprozessor.pl
wiregate/plugin/generic/conf.d/Logikprozessor.conf_sample
Modified: wiregate/plugin/generic/Logikprozessor.pl
===================================================================
--- wiregate/plugin/generic/Logikprozessor.pl 2015-01-29 23:15:32 UTC (rev 2355)
+++ wiregate/plugin/generic/Logikprozessor.pl 2015-02-09 12:06:50 UTC (rev 2356)
@@ -466,10 +466,11 @@
my $keep_subscription=0; # falls am Ende immer noch Null, die GA stornieren
# welche translate-Logik ist aufgerufen?
+ my $timebefore=undef;
for my $t (sort grep !/^(debug$|_)/, keys %{$logic->{'__'.$ga}})
{
- # Flags abfragen
- my $reply=$logic->{$t}{reply_to_read_requests};
+ $timebefore=time();
+
my $debug = $logic->{debug} || $logic->{$t}{debug};
# transmit hoert auf read- und write-Telegramme
@@ -496,8 +497,8 @@
# ausser recalc_on_request ist gesetzt, dann wird neu berechnet
if($msg{apci} eq "A_GroupValue_Read")
{
- next unless $reply;
-
+ next unless $logic->{$t}{reply_to_read_requests};
+
my $result=$plugin_info{$plugname.'__'.$t.'_result'};
if(!defined $result || $logic->{$t}{recalc_on_request})
@@ -531,12 +532,11 @@
next;
}
- elsif($reply && !defined $plugin_info{$plugname.'__'.$t.'_delay'})
+ elsif(defined $in && !defined $plugin_info{$plugname.'__'.$t.'_delay'}) # Speichern ist verboten, wenn noch ein Delay-Timer laeuft!
{
- # Speichern hat keinen Zweck, wenn wir spaeter sowieso nicht auf read-requests reagieren
- # oder wenn noch ein Delay-Timer laeuft! - dann ist das noch zu sendende Logikresultat gespeichert
- # und darf nicht geaendert werden
- $plugin_info{$plugname.'__'.$t.'_result'}=$in if defined $in;
+ # Speichern hat keinen Sinn, wenn wir diese Info spaeter niemals brauchen.
+ $plugin_info{$plugname.'__'.$t.'_result'}=$in
+ if $logic->{$t}{reply_to_read_requests} || $logic->{$t}{reply_to_read_requests};
}
}
}
@@ -675,6 +675,15 @@
$plugin_info{$plugname.'__'.$t.'_result'}=$prevResult; # altes Resultat wieder aufnehmen
$retval.=sprintf("(Logik) -> unveraendert, $prevResult wird in %.0f s gesendet; ", $plugin_info{$plugname.'__'.$t.'_delay'}-time()) if $debug;
}
+
+ # Followup definiert, aber keine transmit-Adresse definiert? Dann followup ausloesen
+ # (mit transmit-Adresse geschieht das nur, wenn auch was gesendet wurde)
+ if(!defined $transmit && defined $logic->{$t}{followup})
+ {
+ set_followup($t,$logic->{$t}{followup},$year,$day_of_year,$month,$day_of_month,$calendar_week,
+ $day_of_week_no,$hour,$minute,$time_of_day,$systemtime,$debug);
+ }
+
next;
}
@@ -780,7 +789,7 @@
# Cool-Periode starten
$plugin_info{$plugname.'__'.$t.'_cool'}=time()+$logic->{$t}{cool} if defined $logic->{$t}{cool};
- # Followup durch andere Logik definiert? Dann in Timer-Liste eintragen
+ # Followup definiert? Dann in Timer-Liste eintragen
if(defined $logic->{$t}{followup})
{
set_followup($t,$logic->{$t}{followup},$year,$day_of_year,$month,$day_of_month,$calendar_week,
@@ -788,6 +797,11 @@
}
}
}
+ continue
+ {
+ my $deadtime=time()-$timebefore;
+ plugin_log("$plugname $t",sprintf("logic took %.1fs (bus)",$deadtime)) if $deadtime>0.5;
+ }
unless($keep_subscription)
{
@@ -822,6 +836,8 @@
next;
}
+ my $timebefore=time();
+
# Debuggingflag gesetzt
my $debug = $logic->{debug} || $logic->{$t}{debug};
@@ -909,6 +925,9 @@
$day_of_week_no,$hour,$minute,$time_of_day,$systemtime,$debug);
}
}
+
+ my $deadtime=time()-$timebefore;
+ plugin_log("$plugname $t",sprintf("logic took %.1fs (timer)",$deadtime)) if $deadtime>0.5;
}
else # noch nicht faelliger Timer
{
@@ -1458,8 +1477,7 @@
# N un muss die Logik ausgewertet und das Resultat auf der Transmit-GA uebertragen werden
my $result=undef;
my %prowlContext=();
- my $timebefore=time();
-
+
unless(ref $logic->{$t}{translate})
{
# Trivialer Fall: translate enthaelt einen fixen Rueckgabewert
@@ -1557,10 +1575,6 @@
}
}
- my $timeelapsed=time()-$timebefore;
-
- plugin_log($plugname, sprintf("WARNING: $t: time elapsed %0.2fs",$timeelapsed)) if $timeelapsed>0.5;
-
return $result;
}
Modified: wiregate/plugin/generic/conf.d/Logikprozessor.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/Logikprozessor.conf_sample 2015-01-29 23:15:32 UTC (rev 2355)
+++ wiregate/plugin/generic/conf.d/Logikprozessor.conf_sample 2015-02-09 12:06:50 UTC (rev 2356)
@@ -292,10 +292,10 @@
# Alle Moeglichkeiten der Option timer stehen zur Verfuegung. Ein wichtiger Unterschied zu timer ist aber,
# dass mit dieser followup- Option nur eine EINMALIGE Ausfuehrung der Folgelogik verknuepft ist.
- # Auch wird der followup-Timer nur gesetzt, wenn davor auch etwas gesendet wurde. Ohne transmit kein followup!
+ # Falls es transmit-Adressen gibt, wird der followup-Timer NUR DANN gesetzt, wenn davor auch etwas gesendet wurde.
# Konsequenterweise wird bei gleichzeitiger Verwendung von delay=>... und followup=>... der Followup-Timer erst mit der verzoegerten
# Sendung des Telegramms eingerichtet.
- # Moechte man die evtl. laufenden followup-Timer loeschen, geht wieder ein einfaches return 'cancel', wie schon bei der Option delay.
+ # Moechte man die evtl. laufenden followup-Timer loeschen, geht wieder ein einfaches return 'cancel', wie schon bei der Option delay.
# Verwendung von followup als Funktion: im Unterschied zur timer-Option laesst sich ein followup-Timer
# auch innerhalb einer translate-Funktion ausfuehren:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|