|
From: <pf...@us...> - 2012-05-10 10:15:36
|
Revision: 805
http://openautomation.svn.sourceforge.net/openautomation/?rev=805&view=rev
Author: pfry
Date: 2012-05-10 10:15:25 +0000 (Thu, 10 May 2012)
Log Message:
-----------
eibd_backend_address konfigurierbar gemacht, zur Vermeidung von Zirkellogiken
Modified Paths:
--------------
wiregate/plugin/generic/Logikprozessor.pl
wiregate/plugin/generic/conf.d/Logikprozessor.conf
Modified: wiregate/plugin/generic/Logikprozessor.pl
===================================================================
--- wiregate/plugin/generic/Logikprozessor.pl 2012-05-10 08:54:24 UTC (rev 804)
+++ wiregate/plugin/generic/Logikprozessor.pl 2012-05-10 10:15:25 UTC (rev 805)
@@ -48,6 +48,7 @@
my $systemtime=time();
# Konfigurationsfile einlesen
+my $eibd_backend_address='1.1.254';
my %logic=();
my $conf="/etc/wiregate/plugin/generic/conf.d/$plugname";
$conf.='.conf' unless $conf=~s/\.pl$/.conf/;
@@ -90,11 +91,11 @@
for my $t (keys %logic)
{
+ next if $t eq 'debug';
+
# Debuggingflag gesetzt
my $debug = $logic{debug} || $logic{$t}{debug};
- next if $t eq 'debug';
-
# Eintrag pruefen
if(defined $logic{$t}{receive} && ref $logic{$t}{receive} && ref $logic{$t}{receive} ne 'ARRAY')
{
@@ -170,6 +171,8 @@
# welche translate-Logik ist aufgerufen?
for my $t (keys %logic)
{
+ next if $t eq 'debug';
+
my $transmit=groupaddress($logic{$t}{transmit});
my $transmit_ga = ($ga eq $transmit);
@@ -230,7 +233,7 @@
# (Logik antwortet auf sich selbst in einer Endlosschleife)
# war Wiregate der Sender des Telegramms?
- my $sender_is_wiregate=int($msg{src})==0;
+ my $sender_is_wiregate = $msg{src} eq $eibd_backend_address;
# Aufruf der Logik-Engine
my $result=execute_logic($t, $receive, $ga, $in);
@@ -263,12 +266,13 @@
if($logic{$t}{delay})
{
$plugin_info{$plugname.'__'.$t.'_timer'}=$systemtime+$logic{$t}{delay};
- plugin_log($plugname, "$ga:$in -> \$logic{$t}{receive}(Logik) -> $transmit:$result, zu senden in ".$logic{$t}{delay}."s");
+ plugin_log($plugname, "$msg{src} $ga:$in -> \$logic{$t}{receive}(Logik) -> $transmit:$result, zu senden in ".$logic{$t}{delay}."s")
+ if $debug;
}
else
{
knx_write($transmit, $result);
- plugin_log($plugname, "$ga:$in -> \$logic{$t}{receive}(Logik) -> $transmit:$result gesendet") if $debug;
+ plugin_log($plugname, "$msg{src} $ga:$in -> \$logic{$t}{receive}(Logik) -> $transmit:$result gesendet") if $debug;
}
}
Modified: wiregate/plugin/generic/conf.d/Logikprozessor.conf
===================================================================
--- wiregate/plugin/generic/conf.d/Logikprozessor.conf 2012-05-10 08:54:24 UTC (rev 804)
+++ wiregate/plugin/generic/conf.d/Logikprozessor.conf 2012-05-10 10:15:25 UTC (rev 805)
@@ -3,6 +3,8 @@
# Logikprozessor.pl - Konfiguration
#
+$eibd_backend_address='1.1.254'; # eigene Adresse zur Vermeidung von Zirkellogiken
+
%logic=(
# 1. Alle Werte, die auf einer GA gesendet werden, werden mit 2 multipliziert auf einer anderen GA weitergegeben
mal2 => { receive=>'9/5/201', transmit=>'9/5/202', translate => sub { 2*$input; }, },
@@ -38,7 +40,7 @@
req => { receive=>'1/2/9', transmit=>'1/2/9', transmit_on_request=>1, translate => sub { 2*$input; }, },
# 6. Eine Logik, die einem Lichtanschalten gleich einen Dimmwert hinterherfeuert, und zwar tags und nachts einen verschiedenen:
- dim => { receive=>'2/2/9', transmit=>'2/3/9', translate => sub { return unless $input; $day ? 80 : 5; }, },
+ dim => { receive=>'2/2/9', transmit=>'2/3/9', translate => sub { return unless $input; $day ? 80 : 3; }, },
# Die Variablen $day_of_week (Mo...So), $day_of_month (01-31), $month (01-12), $year (2012),
# $weekend (0 oder 1), $weekday (= nicht $weekend), $time_of_day ("08:34:02"),
# $hour ("08"), $day (1 falls zwischen 7 und 23 Uhr, 0 sonst) und $night (entsprechend umgekehrt)
@@ -88,3 +90,73 @@
# in einen absoluten Wert umgewandelt
);
+
+# In meinem (Fry) speziellen GA-Schema kann ich mir die obige Einzelkonfiguration sparen, weil aus meinem
+# GA-Namensschema mit sprechenden Kuerzeln alle Zuweisungen folgen; das Konfigurationshash wird in folgender
+# Schleife automatisch erzeugt.
+%logic=(
+ wecker => { debug=>1, transmit=>'LI_SZ_Decke_1', timer=>{ time=>'22:23', day_of_month=>[(7..14)], day_of_week=>'Mi' }, translate => 1 },
+ wecker2 => { debug=>1, transmit=>'LI_SZ_Decke_1', timer=>{ time=>'22:24', day_of_month=>[(7..14)], day_of_week=>'Mi' }, translate => 0 },
+ lichtaus => { debug=>1, receive=>'LD_SZ_Decke_1', transmit=>'LD_SZ_Decke_1', translate => 0 },
+# temperatur => { receive=>['KR_E_Fermax_Oeffner','TA_A2'], transmit=>'WA_Temperatur',
+# translate => sub { return if $input->[0]; $input->[1]; },
+# },
+);
+
+# Memory-Funktion f\xFCr alle Aktoren, die kein KO fuer die Abfrage des eingestellten Wertes anbieten
+for my $rec (grep /^(LD|JP|JW)_\S*$/, keys %eibgaconf)
+{
+ $logic{$rec.'_mem'}={ transmit=>$rec, transmit_only_on_request=>1 };
+}
+
+# Wenn unter 3% gedimmt wird -> ausschalten
+for my $rec (grep /^LD_\S*$/, keys %eibgaconf)
+{
+ my $trm=$rec; $trm=~s/^LD/LI/;
+ $logic{$rec.'_off'}={ receive=>$rec, transmit=>$trm, translate => sub { $input<3 ? 0 : undef; } };
+}
+
+# Szenenbestaetigung: LEDs der Taster blinken nach Szenenspeicherung, diese 1s spaeter wieder ausschalten
+for my $rec (grep /^ZC_\S*$/, keys %eibgaconf)
+{
+ $logic{$rec.'_led_off'}={ debug=>1, receive=>$rec, transmit=>$rec, delay=>1, translate=>0 };
+}
+
+# nachts gedaempftes Licht. Auf einen Einschaltbefehl bei Nacht direkt einen Dimmwert hinterherschicken
+for my $rec (grep /^LI_\S*$/, keys %eibgaconf)
+{
+ my $trm=$rec; $trm=~s/^LI/LK/;
+ $logic{$rec.'_dim'}={ receive=>$rec, transmit=>$trm,
+ translate => sub { return undef unless $input;
+ return 3 if $night;
+ return 50; }
+ };
+}
+
+# Umwandlung relativer Dimmwerte in absolute Dimmwerte
+#for my $rec (grep /^LR_\S*$/, keys %eibgaconf)
+#{
+# next unless $eibgaconf{$rec}{name}=~/Dali/;
+# $rec=$eibgaconf{$rec}{short};
+# my $trm=$rec; $trm=~s/^LR/LK/;
+#
+# $logic{$rec}={
+# receive=>$rec, transmit=>$trm,
+# translate => sub { my ($state,$input)=@_; limit(0,(1+0.2*$input)*$state+5*$input,100); }
+# };
+#}
+
+# Umwandlung von Schaltbefehlen in absolute Dimmwerte
+#for my $rec (grep /^LI_\S*$/, keys %eibgaconf)
+#{
+# next unless $eibgaconf{$rec}{name}=~/Dali/;
+# $rec=$eibgaconf{$rec}{short};
+# my $trm=$rec; $trm=~s/^LI/LK/;
+#
+# $logic{$rec}={
+# receive=>$rec, transmit=>$trm,
+# translate => sub { my ($state,$input)=@_; 100*(1-$input); }
+# };
+#}
+
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|