|
From: <pf...@us...> - 2012-11-10 05:46:06
|
Revision: 1112
http://openautomation.svn.sourceforge.net/openautomation/?rev=1112&view=rev
Author: pfry
Date: 2012-11-10 05:45:58 +0000 (Sat, 10 Nov 2012)
Log Message:
-----------
Neue Optionen fetch, eibd_cache, recalc_on_request und transmit_on_startup
Modified Paths:
--------------
wiregate/plugin/generic/Logikprozessor.pl
wiregate/plugin/generic/MissGoogle.pl
wiregate/plugin/generic/conf.d/Logikprozessor.conf
Modified: wiregate/plugin/generic/Logikprozessor.pl
===================================================================
--- wiregate/plugin/generic/Logikprozessor.pl 2012-11-09 15:18:18 UTC (rev 1111)
+++ wiregate/plugin/generic/Logikprozessor.pl 2012-11-10 05:45:58 UTC (rev 1112)
@@ -98,8 +98,7 @@
for my $t (keys %logic)
{
- next if $t eq 'debug';
- $t=~s/^_//g;
+ next if $t eq 'debug' || $t=~/^_/;
# Debuggingflag gesetzt
my $debug = $logic{debug} || $logic{$t}{debug};
@@ -117,6 +116,12 @@
next;
}
+ if(defined $logic{$t}{fetch} && ref $logic{$t}{fetch} && ref $logic{$t}{fetch} ne 'ARRAY')
+ {
+ plugin_log($plugname, "Config err: \$logic{$t}{fetch} ist weder Skalar noch ARRAY-Referenz ([...]).");
+ next;
+ }
+
if(defined $logic{$t}{state} && ref $logic{$t}{state} && ref $logic{$t}{state} ne 'HASH')
{
plugin_log($plugname, "Config err: \$logic{$t}{state} ist weder Skalar noch HASH-Referenz ({...}).");
@@ -137,7 +142,7 @@
}
# transmit-Adresse abonnieren
- my $transmit=groupaddress($logic{$t}{transmit});
+ my $transmit=groupaddress $logic{$t}{transmit};
$plugin_subscribe{$transmit}{$plugname}=1;
plugin_log($plugname, "\$logic{$t}: Transmit-GA $transmit nicht in %eibgaconf gefunden") if $debug && !exists $eibgaconf{$transmit};
@@ -149,44 +154,39 @@
if($logic{$t}{timer})
{
set_next_call($t, $debug);
- next;
}
- # fuer Nicht-Timer-Logiken: alle receive-Adressen abonnieren (eine oder mehrere)
- my $receive=groupaddress($logic{$t}{receive});
+ # Nun alle receive-Adressen abonnieren (eine oder mehrere)
+ my $receive=groupaddress $logic{$t}{receive};
next unless $receive;
- unless(ref $receive)
- {
- $plugin_subscribe{$receive}{$plugname}=1;
- plugin_log($plugname, "\$logic{$t}: Receive-GA $receive nicht in %eibgaconf gefunden") if $debug && !exists $eibgaconf{$receive};
- }
- else
+ $receive=[$receive] unless ref $receive;
+
+ for my $rec (@{$receive})
{
- for my $rec (@{$receive})
- {
- $plugin_subscribe{$rec}{$plugname}=1;
- plugin_log($plugname, "\$logic{$t}: Receive-GA $rec nicht in %eibgaconf gefunden") if $debug && !exists $eibgaconf{$rec};
- }
+ $plugin_subscribe{$rec}{$plugname}=1;
+ plugin_log($plugname, "\$logic{$t}: Receive-GA $rec nicht in %eibgaconf gefunden") if $debug && !exists $eibgaconf{$rec};
}
-
- if($logic{$t}{transmit_on_startup})
- {
- # Berechnung und Senden beim Startup des Logikprozessors
- # Vorsicht: Logiken mit dieser Bedingung koennen durch knx_read-Requests den Logikprozessor deutlich (!)
- # ueber die erlaubten 10s Ausfuehrungszeit eines Wiregate-Plugins bringen.
- # In diesem Fall wird die Initialisierung des Logikprozessors unvollstaendig abgebrochen!
- # Empfehlung: nur solche Logiken mit transmit_on_startup versehen, deren Read-Requests auf schnell
- # antwortende externe KNX-Geraete gehen oder sowieso durch den EIB-Cache beantwortet werden,
- # also bspw. nicht auf andere Plugins warten.
- my $result=execute_logic($t, $receive, undef, undef);
- my $ga=groupaddress($logic{$t}{transmit});
- $retval.="\$logic{$t}{transmit}(Logik) -> $ga:$result " if $debug;
- knx_write($ga, $result); # DPT aus eibga.conf
- }
}
+# plugin_log($plugname, "Initialisierungsblock beendet");
+
+ # ab hier wuerde uns ein Timeout nicht mehr so stark treffen...
+ for my $t (keys %logic)
+ {
+ next if $t eq 'debug' || $t=~/^_/;
+ next unless $logic{$t}{transmit_on_startup};
+
+ my $debug = $logic{debug} || $logic{$t}{debug};
+
+ # Berechnung und Senden beim Startup des Logikprozessors
+ my $result=execute_logic($t, undef, undef);
+ my $ga=groupaddress $logic{$t}{transmit};
+ plugin_log($plugname, "\$logic{$t}{transmit}(Logik) -> $ga:$result") if $debug;
+ knx_write($ga, $result); # DPT aus eibga.conf
+ }
+
$retval.=$count." initialisiert";
}
@@ -201,8 +201,7 @@
# welche translate-Logik ist aufgerufen?
for my $t (keys %logic)
{
- next if $t eq 'debug';
- $t=~s/^_//g;
+ next if $t eq 'debug' || $t=~/^_/;
my $transmit=groupaddress($logic{$t}{transmit});
my $transmit_ga = ($ga eq $transmit);
@@ -210,7 +209,7 @@
my $receive=groupaddress($logic{$t}{receive});
my $receive_ga=0;
- if(defined $receive && !$logic{$t}{timer})
+ if(defined $receive)
{
unless(ref $logic{$t}{receive})
{
@@ -233,30 +232,32 @@
if($transmit_ga)
{
# Ein Read-Request auf einer Transmit-GA wird mit dem letzten Ergebnis beantwortet
+ # ausser das Flag recalc_on_request ist gesetzt
# Read-Requests auf die receive-Adressen werden gar nicht beantwortet
if($msg{apci} eq "A_GroupValue_Read")
{
my $result=$plugin_info{$plugname.'_'.$t.'_result'};
- if(defined $result)
+ if(!defined $result || $logic{$t}{recalc_on_request})
{
+ # falls gespeichertes Ergebnis ungueltig, neuer Berechnungsversuch
+ $result=execute_logic($t, undef, undef)
+ unless defined $logic{$t}{recalc_on_request} && $logic{$t}{recalc_on_request}==0;
+
+ $retval.="$ga:Lesetelegramm -> \$logic{$t}{transmit}(Logik) -> $ga:$result gesendet. " if $debug && defined $result;
+ knx_write($ga, $result, undef, 0x40) if defined $result; # response, DPT aus eibga.conf
+ }
+ else
+ {
$retval.="$ga:Lesetelegramm -> \$logic{$t}{transmit}(memory) -> $ga:$result gesendet. " if $debug;
knx_write($ga, $result, undef, 0x40); # response, DPT aus eibga.conf
}
- else
- {
- # falls gespeichertes Ergebnis ungueltig, neuer Berechnungsversuch
- $result=execute_logic($t, groupaddress($logic{$t}{receive}), undef, undef);
-
- $retval.="$ga:Lesetelegramm -> \$logic{$t}{transmit}(Logik) -> $ga:$result gesendet. " if $debug;
- knx_write($ga, $result, undef, 0x40); # response, DPT aus eibga.conf
- }
next;
}
- elsif(!$receive_ga) # Receive geht vor - bei Timer-Logiken ist receive_ga immer 0
+ elsif(!$receive_ga) # Wenn eine GA sowohl in transmit als auch receive vorkommt, geht receive vor
{
- if(defined $in) # Write/Response-Telegramm: das waren moeglicherweise wir selbst, also nicht antworten
+ if(defined $in) # Write/Response-Telegramm auf transmit: das waren moeglicherweise wir selbst, also nicht antworten
{
$plugin_info{$plugname.'_'.$t.'_result'}=$in; # einfach Input ablegen
}
@@ -283,7 +284,7 @@
# Aufruf der Logik-Engine
my $prevResult=$plugin_info{$plugname.'_'.$t.'_result'};
- my $result=execute_logic($t, $receive, $ga, $in);
+ my $result=execute_logic($t, $ga, $in);
# war Wiregate der Sender des Telegramms?
# Zirkelaufruf mit wiederholt gleichen Ergebnissen ausschliessen
@@ -360,7 +361,7 @@
{
# ...es sei denn, es ist eine timer-Logik. Die muss jetzt ausgefuehrt werden
# Aufruf der Logik-Engine
- $result=execute_logic($t, groupaddress($logic{$t}{receive}), undef, undef);
+ $result=execute_logic($t, undef, undef);
$retval.="\$logic{$t} -> $transmit:".
(defined $result?$result.($toor?" gespeichert":" gesendet"):"nichts zu senden")." (Timer) " if $debug;
@@ -387,12 +388,15 @@
# bspw wegen eines Plugin-Timeouts waehrend der Berechnung
for my $t (keys %logic)
{
- next if $t eq 'debug' || !defined $logic{$t}{timer};
+ next if $t eq 'debug' || $t=~/^_/;
+ next unless defined $logic{$t}{timer};
my $timer=$plugin_info{$plugname.'__'.$t.'_timer'};
next if defined $timer && $timer>time();
+ plugin_log($plugname, "\$logic{$t}: Timer nicht korrekt gesetzt ($plugin_info{$plugname.'__'.$t.'_timer'}), berechne erneut");
+
# Debuggingflag gesetzt
my $debug = $logic{debug} || $logic{$t}{debug};
set_next_call($t, $debug);
@@ -715,20 +719,21 @@
if($nextcall=~/^([0-9]+)\:([0-9]+)/)
{
my $seconds=3600*($1-substr($time_of_day,0,2))+60*($2-substr($time_of_day,3,2))-substr($time_of_day,6,2);
- plugin_log($plugname, "Naechster Aufruf der Timer-Logik '$t'$daytext um $nextcall."); # if $debug;
+ plugin_log($plugname, "Naechster Aufruf der Timer-Logik '$t'$daytext um $nextcall.");# if $debug;
my $timer=$systemtime+$seconds+3600*24*$days_until_nextcall;
$plugin_info{$plugname.'__'.$t.'_timer'}=$timer;
+# plugin_log($plugname, "\$plugin_info{$plugname.'__'.$t.'_timer'}=$plugin_info{$plugname.'__'.$t.'_timer'}=$timer ?");# if $debug;
}
else
{
- plugin_log($plugname, "Ungueltige Uhrzeit des naechsten Aufrufs der Timer-Logik '$t'$daytext."); # if $debug;
+ plugin_log($plugname, "Ungueltige Uhrzeit des naechsten Aufrufs der Timer-Logik '$t'$daytext.");# if $debug;
}
}
else
{
plugin_log($plugname, "Logik '$t' wird nicht mehr aufgerufen (alle in time=>... festgelegten Termine sind verstrichen).")
- if $logic{$t}{timer}; # if $debug;
+ if $logic{$t}{timer};# && $debug;
delete $plugin_info{$plugname.'__'.$t.'_timer'};
}
@@ -738,8 +743,7 @@
# Im wesentlichen Vorbesetzen von input und state, Aufrufen der Logik, knx_write, Zurueckschreiben von state
sub execute_logic
{
- my ($t, $receive, $ga, $in)=@_; # Logikindex $t, Bustelegramm erhalten auf $ga mit Inhalt $in
- # $receive muss die direkten Gruppenadressen enthalten - Decodierung von Kuerzeln wird nicht vorgenommen
+ my ($t, $ga, $in)=@_; # Logikindex $t, Bustelegramm erhalten auf $ga mit Inhalt $in
# Debuggingflag gesetzt
my $debug = $logic{debug} || $logic{$t}{debug};
@@ -747,12 +751,31 @@
# als erstes definiere das Input-Array fuer die Logik
my $input=$in;
+ # alle receive-GAs
+ my $receive=groupaddress $logic{$t}{receive};
+ my $fetch=groupaddress $logic{$t}{fetch};
+
+ if(defined $fetch)
+ {
+ if(!defined $receive)
+ {
+ $receive=$fetch;
+ }
+ else
+ {
+ # Arrays machen, falls es noch keines ist
+ $fetch=[$fetch] unless ref $fetch;
+ $receive=[$receive] unless ref $receive;
+ push @{$receive}, @{$fetch};
+ }
+ }
+
# Array-Fall: bereite Input-Array fuer Logik vor
if(!ref $receive)
{
# wenn ga gesetzt, steht der Input-Wert in $in
# wenn receive undefiniert, gibt es keine receive-GA
- $in=$input=knx_read($receive, 300) if !$ga && $receive;
+ $in=$input=knx_read($receive, (defined $logic{$t}{eibd_cache}?$logic{$t}{eibd_cache}:300)) if !$ga && $receive;
}
else
{
@@ -765,7 +788,8 @@
}
else
{
- push @{$input}, knx_read($rec, 300);
+ $in=knx_read($rec, (defined $logic{$t}{eibd_cache}?$logic{$t}{eibd_cache}:300));
+ push @{$input}, $in;
}
}
}
Modified: wiregate/plugin/generic/MissGoogle.pl
===================================================================
--- wiregate/plugin/generic/MissGoogle.pl 2012-11-09 15:18:18 UTC (rev 1111)
+++ wiregate/plugin/generic/MissGoogle.pl 2012-11-10 05:45:58 UTC (rev 1112)
@@ -247,11 +247,12 @@
for my $f (keys %text)
{
my $t=$text{$f};
+ $t=~s/ /\%20/g;
my $p=$f; $p=~s!/[^/]*$!!;
my $m=$f; $m=~s!\.wav$!.mp3!;
next if -f $f;
system "mkdir", "-p", $p;
- system "wget", "http://translate.google.de/translate_tts?ie=UTF-8&q=$t", "--keep-session-cookies", "--user-agent=sag_ich_nicht", "-O", $m;
+ system "wget", "http://translate.google.de/translate_tts?ie=UTF-8&q=$t&tl=de", "--keep-session-cookies", "--user-agent=sag_ich_nicht", "-O", $m;
system "mpg123", "-w", $f, $m;
system "rm", "-f", "tmp.wav", "tmp2.wav";
system "sox", $f, "tmp.wav", "silence", "1", "0.001", "0.2%", "1", "0.3", "0.1%";
Modified: wiregate/plugin/generic/conf.d/Logikprozessor.conf
===================================================================
--- wiregate/plugin/generic/conf.d/Logikprozessor.conf 2012-11-09 15:18:18 UTC (rev 1111)
+++ wiregate/plugin/generic/conf.d/Logikprozessor.conf 2012-11-10 05:45:58 UTC (rev 1112)
@@ -109,8 +109,10 @@
# Logiken mit timer-Klausel weichen in mehreren Punkten von den bisherigen Logiken ab:
# * sie ignorieren die delay-Klausel und die cool-Klausel
# * Die transmit_only_on_request-Klausel funktioniert aber
- # * jeglicher Bustraffic auf receive-Adressen wird ignoriert.
- # * Evtl. spezifizierte receive-Adressen werden aber beim Timer-Aufruf abgefragt, um das input-Array vorzubesetzen).
+ # * ALTES VERHALTEN: jeglicher Bustraffic auf receive-Adressen wird ignoriert. JETZT NICHT MEHR - FALLS MAN DIESES
+ # VERHALTEN M\xD6CHTE, KANN STATT receive=>.... DIE OPTION fetch=>... GENUTZT WERDEN!
+ # * Evtl. spezifizierte receive-Adressen werden beim Timer-Aufruf abgefragt, um das input-Array vorzubesetzen).
+ #
# Weitere Infos zu Timer-Spezifikationen
# * Als timer-Eintrag geht entweder ein einzelner Eintrag timer=>{...} wie oben oder eine Liste solcher Eintraege
# time=>[{...},{...},{...},...].
@@ -164,7 +166,7 @@
# F\xFCr komplexere F\xE4lle kann auch eine sub \xFCbergeben werden, die dann einen passenden Hash zur\xFCckgeben muss. In die sub
# wird der Aufrufkontext \xFCbergeben, der den "input", das "result" und den "state" umfasst. Daneben stehen aber auch
# vereinfachte Skalare zur Verf\xFCgung, $input, $state und $result.
-
+
subProwl => {
receive => '1/2/5',
prowl => sub {
@@ -193,6 +195,22 @@
}
}
+ # Weitere Optionen ohne Beispiel:
+
+ # 14. Die Optionen transmit_on_startup=>1 fuehrt die Logik bei der Initialisierung einmal aus (Vorsicht: bei zu
+ # vielen solchen Logiken kann das zum Timeout des Plugins fuehren!).
+
+ # 15. Falls Read-Requests an die transmit-Adresse einer Logik
+ # geschickt werden, so fuehrt das normalerweise zur erneuten Uebertragung des letzten Resultats bzw, falls dieses undef ist,
+ # zur Ausfuehrung der Logik und Uebertragung des Resultats. Mit recalc_on_request=>0 wird die Ausfuehrung der Logik in diesem
+ # Fall unterdrueckt, mit recalc_on_request=>1 wird sie in jedem Fall erzwungen.
+
+ # 16. Die Option eibd_cache legt die Cache-Zeit bei knx_read-Aufrufen fest. Default ist 300.
+
+ # 17. Neben receive kann in fetch=>... eine weitere GA oder GA-Liste \xFCbergeben werden. Diese GAs werden NICHT abonniert, und
+ # Telegramme hierauf l\xF6sen die Logik auch nicht aus, sie werden nur bei Ausf\xFChrung der Logik per knx_read ausgelesen und in
+ # $input hinterlegt
+
);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|