|
From: <kru...@us...> - 2015-01-11 20:36:43
|
Revision: 2324
http://sourceforge.net/p/openautomation/code/2324
Author: krumboeck
Date: 2015-01-11 20:36:41 +0000 (Sun, 11 Jan 2015)
Log Message:
-----------
Updated StiebelEltron-LWZ-x04 plugin to v0.2
Modified Paths:
--------------
wiregate/plugin/generic/StiebelEltron-LWZ-x04.pl
wiregate/plugin/generic/conf.d/StiebelEltron-LWZ-x04.conf
Modified: wiregate/plugin/generic/StiebelEltron-LWZ-x04.pl
===================================================================
--- wiregate/plugin/generic/StiebelEltron-LWZ-x04.pl 2015-01-10 22:40:31 UTC (rev 2323)
+++ wiregate/plugin/generic/StiebelEltron-LWZ-x04.pl 2015-01-11 20:36:41 UTC (rev 2324)
@@ -1,6 +1,6 @@
######################################################################################
# Plugin StiebelEltron-LWZ-x04
-# V0.1 2014-09-13
+# V0.2 2015-01-11
# Lizenz: GPLv2
# Autor: krumboeck (http://knx-user-forum.de/members/krumboeck.html)
#
@@ -18,6 +18,12 @@
# TIPP: Bevor sie eine Variable beschreiben, lesen sie diese bitte
# ein und überprüfen sie die Korrektheit des Wertes.
#
+# Changelog:
+# 2014-09-13 0.1 Initiale Version veröffentlicht
+# 2015-01-11 0.2 Unterstützung von negativen Temperatur Werten
+# Unterstützung von Gruppierten Werten
+#
+#
######################################################################################
@@ -188,7 +194,7 @@
push @definitions, { name => 'Raumeinfluss', valueId => 0x01, valueSubId => 0x0F,
writeTarget => 0x06, requestTarget => 0x06, responseTarget => 0x0D,
decimalFactor => 1, format => 'none', knxTyp => '7' };
-push @definitions, { name => 'Warmwasser_unbekannt', valueId => 0x01, valueSubId => 0x12,
+push @definitions, { name => 'Betriebsart', valueId => 0x01, valueSubId => 0x12,
writeTarget => 0x03, requestTarget => 0x03, responseTarget => 0x0D,
decimalFactor => 1, format => 'none', knxTyp => '7' };
push @definitions, { name => 'Sommerbetrieb_Heizgrundeinstellung', valueId => 0x01, valueSubId => 0x16,
@@ -577,7 +583,26 @@
decimalFactor => 10, format => 'tenthDegree', knxTyp => '9.001' };
+my @combinations;
+push @combinations, { name => 'Wärmemenge_Heizen_Summe', def1 => 'Wärmemenge_Heizen_Summe_MWh', def2 => 'Wärmemenge_Heizen_Summe_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Solar_Heizung_Summe', def1 => 'Wärmemenge_Solar_Heizung_Summe_MWh', def2 => 'Wärmemenge_Solar_Heizung_Summe_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Nacherwärmung_Heizen_Summe', def1 => 'Wärmemenge_Nacherwärmung_Heizen_Summe_MWh', def2 => 'Wärmemenge_Nacherwärmung_Heizen_Summe_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Warmwasser_Summe', def1 => 'Wärmemenge_Warmwasser_Summe_MWh', def2 => 'Wärmemenge_Warmwasser_Summe_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Solar_Warmwasser_Summe', def1 => 'Wärmemenge_Solar_Warmwasser_Summe_MWh', def2 => 'Wärmemenge_Solar_Warmwasser_Summe_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Nacherwärmung_Warmwasser_Summe', def1 => 'Wärmemenge_Nacherwärmung_Warmwasser_Summe_MWh', def2 => 'Wärmemenge_Nacherwärmung_Warmwasser_Summe_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Kühlen_Summe', def1 => 'Wärmemenge_Kühlen_Summe_MWh', def2 => 'Wärmemenge_Kühlen_Summe_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Wärmerückgewinnung_Summe', def1 => 'Wärmemenge_Wärmerückgewinnung_Summe_MWh', def2 => 'Wärmemenge_Wärmerückgewinnung_Summe_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Heizen_Tag', def1 => 'Wärmemenge_Heizen_Tag_MWh', def2 => 'Wärmemenge_Heizen_Tag_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Solar_Heizung_Tag', def1 => 'Wärmemenge_Solar_Heizung_Tag_MWh', def2 => 'Wärmemenge_Solar_Heizung_Tag_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Nacherwärmung_Heizen_Tag', def1 => 'Wärmemenge_Nacherwärmung_Heizen_Tag_MWh', def2 => 'Wärmemenge_Nacherwärmung_Heizen_Tag_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Warmwasser_Tag', def1 => 'Wärmemenge_Warmwasser_Tag_MWh', def2 => 'Wärmemenge_Warmwasser_Tag_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Solar_Warmwasser_Tag', def1 => 'Wärmemenge_Solar_Warmwasser_Tag_MWh', def2 => 'Wärmemenge_Solar_Warmwasser_Tag_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Nacherwärmung_Warmwasser_Tag', def1 => 'Wärmemenge_Nacherwärmung_Warmwasser_Tag_MWh', def2 => 'Wärmemenge_Nacherwärmung_Warmwasser_Tag_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Kühlen_Tag', def1 => 'Wärmemenge_Kühlen_Tag_MWh', def2 => 'Wärmemenge_Kühlen_Tag_KWh', knxTyp => '13.013' };
+push @combinations, { name => 'Wärmemenge_Wärmerückgewinnung_Tag', def1 => 'Wärmemenge_Wärmerückgewinnung_Tag_MWh', def2 => 'Wärmemenge_Wärmerückgewinnung_Tag_KWh', knxTyp => '13.013' };
+
+
my @mapped;
my $interface = 'can0';
my @display = (0x1E, 0x1F, 0x20, 0x21, 0x22);
@@ -674,7 +699,7 @@
} elsif ($event =~ /cycle/) {
foreach my $entry (@mapped) {
if ($entry->{cycle}) {
- send_lwz_request($sc, $c, $canId, $entry);
+ send_lwz_request($sc, $c, $canId, $entry->{name}, $entry->{target});
}
}
} elsif ($event =~ /restart|modified/) {
@@ -716,27 +741,35 @@
}
sub send_lwz_request {
- my ($sock, $c, $id, $entry) = @_;
- my $definition = get_definition($entry->{name});
- if (defined $definition) {
- plugin_log($plugname, 'Bearbeite: ' . $definition->{name});
- } else {
- plugin_log($plugname, 'Kann Definition nicht finden: ' . $entry->{name});
+ my ($sock, $c, $id, $name, $target) = @_;
+ my $definition = get_definition($name);
+
+ if (! defined $definition) {
+ my $combination = get_combination_definition($name);
+ if (defined $combination) {
+ send_lwz_request($sock, $c, $id, $combination->{def1}, $target);
+ send_lwz_request($sock, $c, $id, $combination->{def2}, $target);
+ return;
+ }
+ plugin_log($plugname, 'Kann Definition nicht finden: ' . $name);
+ return;
}
+
+ plugin_log($plugname, 'Bearbeite: ' . $definition->{name});
if ($definition->{requestTarget} == TARGET_SYSTEM) {
can_send($sock, $c, $id, [(TARGET_SYSTEM<<4) | TYPE_REQUEST, 0x00, 0xFA, $definition->{valueId}, $definition->{valueSubId}, 0x00, 0x00]);
} elsif ($definition->{requestTarget} == TARGET_HEIZKREIS) {
- if (defined $entry->{target}) {
- if ($entry->{target} == HEIZKREIS_1 || $entry->{target} == HEIZKREIS_2) {
- can_send($sock, $c, $id, [(TARGET_HEIZKREIS<<4) | TYPE_REQUEST, $entry->{target}, 0xFA, $definition->{valueId}, $definition->{valueSubId}, 0x00, 0x00]);
+ if (defined $target) {
+ if ($target == HEIZKREIS_1 || $target == HEIZKREIS_2) {
+ can_send($sock, $c, $id, [(TARGET_HEIZKREIS<<4) | TYPE_REQUEST, $target, 0xFA, $definition->{valueId}, $definition->{valueSubId}, 0x00, 0x00]);
} else {
- plugin_log($plugname, $entry->{name} . ': Attribut "target" enthält einen ungültigen Wert');
+ plugin_log($plugname, $name . ': Attribut "target" enthält einen ungültigen Wert');
}
} else {
- plugin_log($plugname, $entry->{name} . ': Attribut "target" wird benötigt');
+ plugin_log($plugname, $name . ': Attribut "target" wird benötigt');
}
} else {
- plugin_log($plugname, $entry->{name} . ': Request type noch nicht implementiert');
+ plugin_log($plugname, $name . ': Request type noch nicht implementiert');
}
}
@@ -767,13 +800,44 @@
my $valueId = $data[3];
my $valueSubId = $data[4];
if (($source == SOURCE_SYSTEM || $source == SOURCE_HEIZKREIS) && $fix == 0xFA) {
- my ($entry, $definition) = find_mapping($source, $subSource, $valueId, $valueSubId);
+ my ($entry, $combination, $definition) = find_combination_mapping($source, $subSource, $valueId, $valueSubId);
+ if (! defined $entry) {
+ ($entry, $definition) = find_mapping($source, $subSource, $valueId, $valueSubId);
+ }
if (defined $entry) {
my $value = ($data[5] << 8) | $data[6];
my $convertedValue = convert_response_value($definition, $value);
if (defined $convertedValue) {
plugin_log($plugname, $entry->{name} . ': ' . $convertedValue);
- knx_write($entry->{knxStatusGA}, $convertedValue, $definition->{knxTyp});
+ if (defined $combination) {
+ my $currentTime = time();
+ saveCombinationValue($definition->{name}, $convertedValue, $currentTime);
+ my ($def1, $def2, $value1, $value2);
+ if ($combination->{def1} eq $definition->{name}) {
+ $def1 = $definition;
+ $value1 = $convertedValue;
+ $def2 = get_definition($combination->{def2});
+ $value2 = loadCombinationValue($combination->{def2}, $currentTime - 10);
+ } else {
+ $def2 = $definition;
+ $value2 = $convertedValue;
+ $def1 = get_definition($combination->{def1});
+ $value1 = loadCombinationValue($combination->{def1}, $currentTime - 10);
+ }
+ if (!defined $def1 || !defined $def2 || !defined $value1 || !defined $value2) {
+ return;
+ }
+ $value1 = convertValueToTargetTyp($value1, $def1->{knxTyp}, $combination->{knxTyp});
+ $value2 = convertValueToTargetTyp($value2, $def2->{knxTyp}, $combination->{knxTyp});
+ if (!defined $value1 || !defined $value2) {
+ dump_can_message('Kombinationswert konnte nicht in das richtige Format umgewandelt werden', $id, $dlc, \@data);
+ return;
+ }
+ $convertedValue = $value1 + $value2;
+ knx_write($entry->{knxStatusGA}, $convertedValue, $combination->{knxTyp});
+ } else {
+ knx_write($entry->{knxStatusGA}, $convertedValue, $definition->{knxTyp});
+ }
} else {
dump_can_message('Wert konnte nicht verarbeitet werden', $id, $dlc, \@data);
}
@@ -809,8 +873,46 @@
return (undef, undef);
}
+sub find_combination_mapping {
+ my ($source, $subSource, $valueId, $valueSubId) = @_;
+ foreach my $entry (@mapped) {
+ my $combination = get_combination_definition($entry->{name});
+
+ my $definition = get_definition($combination->{def1});
+ if ($valueId == $definition->{valueId} && $valueSubId == $definition->{valueSubId}) {
+ if ($source == SOURCE_SYSTEM) {
+ if ($subSource == 0x80) {
+ return ($entry, $combination, $definition);
+ }
+ } else {
+ if ($subSource == $entry->{target}) {
+ return ($entry, $combination, $definition);
+ }
+ }
+ }
+
+ $definition = get_definition($combination->{def2});
+ if ($valueId == $definition->{valueId} && $valueSubId == $definition->{valueSubId}) {
+ if ($source == SOURCE_SYSTEM) {
+ if ($subSource == 0x80) {
+ return ($entry, $combination, $definition);
+ }
+ } else {
+ if ($subSource == $entry->{target}) {
+ return ($entry, $combination, $definition);
+ }
+ }
+ }
+
+ }
+ return (undef, undef, undef);
+}
+
sub convert_response_value {
my ($definition, $value) = @_;
+ if ($definition->{format} eq 'tenthDegree') {
+ $value -= 0x10000 if $value >= 0x8000;
+ }
if (defined $definition->{decimalFactor}) {
return $value / $definition->{decimalFactor};
} else {
@@ -820,6 +922,9 @@
sub convert_to_lwz_value {
my ($definition, $value) = @_;
+ if ($definition->{format} eq 'tenthDegree') {
+ $value += 0x10000 if $value < 0;
+ }
if (defined $definition->{decimalFactor}) {
return $value * $definition->{decimalFactor};
my $value1 = (($value * $definition->{decimalFactor}) >> 8) & 0x00FF;
@@ -861,3 +966,49 @@
}
return undef;
}
+
+sub get_combination_definition {
+ my ($name) = @_;
+ foreach my $combination (@combinations) {
+ if ($name eq $combination->{name}) {
+ return $combination;
+ }
+ }
+ return undef;
+}
+
+#####################################
+# Wert für Wertekombination speichern
+#####################################
+sub saveCombinationValue {
+ my ($name, $value, $time) = @_;
+ $plugin_info{$plugname . '_Combination_' . $name} = $time . ':' . $value;
+}
+
+
+#################################
+# Wert für Wertekombination laden
+#################################
+sub loadCombinationValue {
+ my ($name, $time) = @_;
+ my $loaded = $plugin_info{$plugname . '_Combination_' . $name};
+ my ($valueTime, $value) = split(':', $loaded, 2);
+ if ($valueTime >= $time) {
+ return $value;
+ } else {
+ return undef;
+ }
+}
+
+sub convertValueToTargetTyp {
+ my ($value, $typ, $targetTyp) = @_;
+ if ($typ eq $targetTyp) {
+ return $value;
+ } elsif ($typ eq '13.010' && $targetTyp eq '13.013') {
+ return $value / 1000;
+ } elsif ($typ eq '13.013' && $targetTyp eq '13.010') {
+ return $value * 1000;
+ } else {
+ return undef;
+ }
+}
Modified: wiregate/plugin/generic/conf.d/StiebelEltron-LWZ-x04.conf
===================================================================
--- wiregate/plugin/generic/conf.d/StiebelEltron-LWZ-x04.conf 2015-01-10 22:40:31 UTC (rev 2323)
+++ wiregate/plugin/generic/conf.d/StiebelEltron-LWZ-x04.conf 2015-01-11 20:36:41 UTC (rev 2324)
@@ -177,6 +177,21 @@
# ls 8.010 Feuchte_Soll_Minimum
# ls 8.010 Feuchte_Soll_Maximum
# ls 9.001 Heizgrundeinstellung_Bivalenzpunkt
+#
+# Gruppenvariablen
+# l 13.013 Wärmemenge_Heizen_Summe
+# l 13.013 Wärmemenge_Solar_Heizung_Summe
+# l 13.013 Wärmemenge_Nacherwärmung_Heizen_Summe
+# l 13.013 Wärmemenge_Warmwasser_Summe
+# l 13.013 Wärmemenge_Solar_Warmwasser_Summe
+# l 13.013 Wärmemenge_Nacherwärmung_Warmwasser_Summe
+# l 13.013 Wärmemenge_Kühlen_Summe
+# l 13.013 Wärmemenge_Wärmerückgewinnung_Summe
+# l 13.013 Wärmemenge_Heizen_Tag
+# l 13.013 Wärmemenge_Solar_Heizung_Tag
+# l 13.013 Wärmemenge_Warmwasser_Tag
+# l 13.013 Wärmemenge_Solar_Warmwasser_Tag
+# l 13.013 Wärmemenge_Wärmerückgewinnung_Tag
###############################################################################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
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.
|
|
From: <pf...@us...> - 2015-02-15 20:57:13
|
Revision: 2358
http://sourceforge.net/p/openautomation/code/2358
Author: pfry
Date: 2015-02-15 20:57:10 +0000 (Sun, 15 Feb 2015)
Log Message:
-----------
Bugfix betreffend transmit_changes_only in Verbindung mit Neustart, ausserdem impliziert transmit_on_startup nun transmit_on_config
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-02-12 12:40:43 UTC (rev 2357)
+++ wiregate/plugin/generic/Logikprozessor.pl 2015-02-15 20:57:10 UTC (rev 2358)
@@ -251,10 +251,10 @@
}
}
+ plugin_log($plugname, "Bei folgende Logiken wurde daher reply_to_read_requests=>0 gesetzt:");
+ plugin_log($plugname, join ", ", keys %changed);
plugin_log($plugname, "(T) - transmit_only_on_request gesetzt");
plugin_log($plugname, "(R) - recalc_on_request gesetzt");
- plugin_log($plugname, "Bei folgende Logiken wurde daher reply_to_read_requests=>0 gesetzt:");
- plugin_log($plugname, join ", ", keys %changed);
}
# Ende Konfiguration pruefen #######################################################
@@ -436,12 +436,14 @@
$eibd_backend_address=$logic->{'_eibd_backend_address'} if defined $logic->{'_eibd_backend_address'};
+#plugin_log($plugname, $event.($event=~/bus/ ? " $msg{dst} $msg{val}":""));
+
# Alle Logiken mit transmit_on_startup=>1 als followup vormerken - dadurch kann uns ein Timeout nicht so sehr treffen...
if($event=~/restart|modified/)
{
for my $t (grep !/^(debug$|_)/, keys %{$logic})
{
- followup({$t=>0}) if $logic->{$t}{transmit_on_startup};
+ followup({$t=>0}) if $logic->{$t}{transmit_on_startup} || $logic->{$t}{transmit_on_config}; # startup impliziert config
}
}
@@ -735,7 +737,7 @@
next;
}
- if($logic->{$t}{transmit_changes_only} && ($result eq $prevResult))
+ if($logic->{$t}{transmit_changes_only} && ($result eq $prevResult) && !($event=~/restart|modified/ || $config_modified))
{
if(ref $logic->{$t}{transmit})
{
@@ -864,7 +866,7 @@
}
if(defined $result && !$logic->{$t}{transmit_only_on_request} && defined $logic->{$t}{transmit}
- && (!$logic->{$t}{transmit_changes_only} || $result ne $prevResult))
+ && !($logic->{$t}{transmit_changes_only} && $result eq $prevResult && !($event=~/restart|modified/ || $config_modified)))
{
my $transmit=groupaddress $logic->{$t}{transmit};
Modified: wiregate/plugin/generic/conf.d/Logikprozessor.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/Logikprozessor.conf_sample 2015-02-12 12:40:43 UTC (rev 2357)
+++ wiregate/plugin/generic/conf.d/Logikprozessor.conf_sample 2015-02-15 20:57:10 UTC (rev 2358)
@@ -287,7 +287,7 @@
# Hier wird die zweite Tuer zwei Sekunden spaeter geoeffnet und die dritte drei Sekunden nach der ersten.
# Statt der 2 und 3 koennte da auch stehen '2s', oder '2min', oder '2h'.
# Auch moeglich ist es - in diesem Beispiel vielleicht wenig sinnvoll - eine Definition analog der Option timer zu hinterlegen:
- Tuer1_oeffnen => { transmit=>'Tuer1', translate=>1, followup=>{time=>'08:00', weekday=>1} },
+ Tuer1_oeffnen => { transmit=>'Tuer1', translate=>1, followup=>{'Tuer2_oeffnen'=>{time=>'08:00', weekday=>1}} },
# Hier wuerde die Tur bspw. geoeffnet, wenn das naechste Mal 8 Uhr an einem Wochentag ist.
# 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.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2015-05-26 13:38:18
|
Revision: 2362
http://sourceforge.net/p/openautomation/code/2362
Author: makki1
Date: 2015-05-26 13:38:16 +0000 (Tue, 26 May 2015)
Log Message:
-----------
Modbus (RTU/TCP) Plugin-Example
Added Paths:
-----------
wiregate/plugin/generic/Herget_Modubus_Haus.pl
wiregate/plugin/generic/Herget_Modubus_Schwimm.pl
Added: wiregate/plugin/generic/Herget_Modubus_Haus.pl
===================================================================
--- wiregate/plugin/generic/Herget_Modubus_Haus.pl (rev 0)
+++ wiregate/plugin/generic/Herget_Modubus_Haus.pl 2015-05-26 13:38:16 UTC (rev 2362)
@@ -0,0 +1,122 @@
+# Plugin for Modbus<->KNX
+# Version 1.0 2014-10-17 (MM)
+# apt-get install libprotocol-modbus-perl
+
+####################
+### Definitionen ###
+####################
+# Eigenen Aufruf-Zyklus auf 60 Sekunden setzen
+# = zyklischer Werteversand der Modbus-Register
+$plugin_info{$plugname.'_cycle'} = 60;
+# GAs..
+# subscribe GAs
+# Aktuell alles unten hartcodiert, geht eleganter..
+
+#########################
+### Ende Definitionen ###
+#########################
+use Protocol::Modbus;
+
+$plugin_subscribe{'6/4/191'}{$plugname} = 1;
+$plugin_subscribe{'6/4/192'}{$plugname} = 1;
+$plugin_subscribe{'6/4/193'}{$plugname} = 1;
+$plugin_subscribe{'6/4/194'}{$plugname} = 1;
+$plugin_subscribe{'6/4/195'}{$plugname} = 1;
+$plugin_subscribe{'6/4/196'}{$plugname} = 1;
+$plugin_subscribe{'6/4/197'}{$plugname} = 1;
+$plugin_subscribe{'6/4/198'}{$plugname} = 1;
+$plugin_subscribe{'6/4/199'}{$plugname} = 1;
+$plugin_subscribe{'0/2/5'}{$plugname} = 1;
+
+my $ip = '192.168.17.35';
+
+my $modbus = Protocol::Modbus->new(driver=>'TCP', transport=>'TCP');
+my $trs = Protocol::Modbus::Transport->new(
+ driver => 'TCP',
+ address => $ip,
+ port => 502,
+ timeout => 3,
+);
+my $req = $modbus->readHoldRegistersRequest(
+ address => 0,
+ quantity => 16,
+);
+my $trn = $modbus->transaction($trs, $req);
+my $res = $trn->execute();
+my @inputs = @{ $res->registers() };
+
+if (%msg) { # telegramm vom KNX
+ if ($msg{'apci'} eq "A_GroupValue_Write") {
+ setModbusRegInt16(20,knx_read('6/4/191',0,9)*10);
+ setModbusRegInt16(21,knx_read('6/4/192',0,9)*10);
+ setModbusRegInt16(25,knx_read('0/2/5',0,9)*10);
+ setModbusRegInt16(26,knx_read('6/4/198',0,5.001)*10);
+ setModbusRegInt16(27,knx_read('6/4/199',0,5.001)*10);
+ my $reg24 = 0;
+ $reg24 |= knx_read('6/4/193',0,1);
+ $reg24 |= knx_read('6/4/194',0,1) << 1;
+ $reg24 |= knx_read('6/4/196',0,1) << 3;
+ $reg24 |= knx_read('6/4/195',0,1) << 4;
+ $reg24 |= knx_read('6/4/197',0,1) << 15;
+ setModbusRegInt16(24,$reg24);
+ }
+} else { # zyklisches senden
+ knx_write('6/4/161',getModbusRegInt16(2)/10,9);
+ knx_write('6/4/162',getModbusRegInt16(3)/10,9);
+ knx_write('6/4/163',getModbusRegInt16(4)/10,9);
+ knx_write('6/4/164',getModbusRegInt16(5)/10,9);
+ knx_write('6/4/171',getModbusRegInt16(8)/10,9);
+ knx_write('6/4/172',getModbusRegInt16(9)/10,9);
+ knx_write('6/4/173',getModbusRegInt16(10)/10,9);
+ knx_write('6/4/174',getModbusRegInt16(11),13);
+ knx_write('6/4/175',getModbusRegInt16(12),13);
+
+ my $reg7 = ((hex($inputs[14]) << 8) + hex($inputs[15])); # Status bitwise
+ knx_write('6/4/167',($reg7 >> 0) & 0x01,1);
+ knx_write('6/4/176',($reg7 >> 1) & 0x01,1);
+ knx_write('6/4/177',($reg7 >> 2) & 0x01,1);
+ knx_write('6/4/168',($reg7 >> 3) & 0x01,1);
+ knx_write('6/4/169',($reg7 >> 4) & 0x01,1);
+ knx_write('6/4/170',($reg7 >> 5) & 0x01,1);
+ knx_write('6/4/178',($reg7 >> 6) & 0x01,1);
+ knx_write('6/4/179',($reg7 >> 7) & 0x01,1);
+ knx_write('6/4/180',($reg7 >> 8) & 0x01,1);
+ knx_write('6/4/181',($reg7 >> 9) & 0x01,1);
+ knx_write('6/4/182',($reg7 >> 10) & 0x01,1);
+ knx_write('6/4/183',($reg7 >> 11) & 0x01,1);
+ knx_write('6/4/184',($reg7 >> 12) & 0x01,1);
+ knx_write('6/4/185',($reg7 >> 13) & 0x01,1);
+ knx_write('6/4/187',($reg7 >> 15) & 0x01,1);
+ my $reg15 = ((hex($inputs[30]) << 8) + hex($inputs[31])); # Status bitwise
+ knx_write('6/4/188',($reg15 >> 0) & 0x01,1);
+ knx_write('6/4/189',($reg15 >> 1) & 0x01,1);
+}
+
+sub getModbusRegInt16 {
+ my $idx = shift;
+ #my @in = shift;
+ $idx *= 2;
+ my $val = ((hex($inputs[$idx]) << 8) + hex($inputs[$idx+1]));
+ $val = $val > 32767 ? $val-65536 : $val;
+ return $val;
+}
+
+sub setModbusRegInt16 {
+ my $idx = shift;
+ my $val = shift;
+ $req = $modbus->writeRegisterRequest(
+ address => $idx,
+ value => $val,
+ );
+ $trn = $modbus->transaction($trs, $req);
+ $res = $trn->execute();
+}
+
+return;
+
+# FIXME: undef $modbus $trs $req $trn $res @inputs to avoid memleaks
+
+# TODO:
+# - Check modbus-response better/explicit
+# - Avoid memleaks by re-using a persistent Modbus-RTU/TCP connection
+# - round values to 0.1 before sending to Modbus?
Added: wiregate/plugin/generic/Herget_Modubus_Schwimm.pl
===================================================================
--- wiregate/plugin/generic/Herget_Modubus_Schwimm.pl (rev 0)
+++ wiregate/plugin/generic/Herget_Modubus_Schwimm.pl 2015-05-26 13:38:16 UTC (rev 2362)
@@ -0,0 +1,115 @@
+# Plugin for Modbus<->KNX
+# Version 1.0 2014-10-17 (MM)
+# apt-get install libprotocol-modbus-perl
+
+####################
+### Definitionen ###
+####################
+# Eigenen Aufruf-Zyklus auf 60 Sekunden setzen
+# = zyklischer Werteversand der Modbus-Register
+$plugin_info{$plugname.'_cycle'} = 60;
+# GAs..
+# subscribe GAs
+# Aktuell alles unten hartcodiert, geht eleganter..
+
+#########################
+### Ende Definitionen ###
+#########################
+use Protocol::Modbus;
+
+$plugin_subscribe{'6/0/58'}{$plugname} = 1;
+$plugin_subscribe{'6/0/59'}{$plugname} = 1;
+$plugin_subscribe{'6/0/60'}{$plugname} = 1;
+$plugin_subscribe{'6/0/61'}{$plugname} = 1;
+$plugin_subscribe{'6/0/62'}{$plugname} = 1;
+$plugin_subscribe{'6/0/63'}{$plugname} = 1;
+$plugin_subscribe{'6/0/64'}{$plugname} = 1;
+$plugin_subscribe{'0/2/5'}{$plugname} = 1;
+
+my $ip = '192.168.3.37';
+
+my $modbus = Protocol::Modbus->new(driver=>'TCP', transport=>'TCP');
+my $trs = Protocol::Modbus::Transport->new(
+ driver => 'TCP',
+ address => $ip,
+ port => 502,
+ timeout => 3,
+);
+my $req = $modbus->readHoldRegistersRequest(
+ address => 0,
+ quantity => 13,
+);
+my $trn = $modbus->transaction($trs, $req);
+my $res = $trn->execute();
+my @inputs = @{ $res->registers() };
+
+if (%msg) { # telegramm vom KNX
+ if ($msg{'apci'} eq "A_GroupValue_Write") {
+ setModbusRegInt16(18,knx_read('6/0/59',0,9)*10);
+ setModbusRegInt16(19,knx_read('6/0/60',0,9)*10);
+ setModbusRegInt16(20,knx_read('6/0/61',0,9)*10);
+ setModbusRegInt16(25,knx_read('0/2/5',0,9)*10);
+ my $reg24 = 0;
+ $reg24 |= knx_read('6/0/62',0,1);
+ $reg24 |= knx_read('6/0/63',0,1) << 1;
+ $reg24 |= knx_read('6/0/64',0,1) << 4;
+ $reg24 |= knx_read('6/0/58',0,1) << 15;
+ setModbusRegInt16(24,$reg24);
+ }
+} else { # zyklisches senden
+ knx_write('6/0/34',getModbusRegInt16(0)/10,5.001);
+ knx_write('6/0/35',getModbusRegInt16(1)/10,5.001);
+ knx_write('6/0/14',getModbusRegInt16(4)/10,9);
+ knx_write('6/0/36',getModbusRegInt16(5)/10,9);
+ knx_write('6/0/42',getModbusRegInt16(8)/10,9);
+ knx_write('6/0/43',getModbusRegInt16(9)/10,9);
+ knx_write('6/0/44',getModbusRegInt16(10)/10,9);
+ knx_write('6/0/45',getModbusRegInt16(11),13);
+ knx_write('6/0/46',getModbusRegInt16(12),13);
+ my $reg7 = ((hex($inputs[14]) << 8) + hex($inputs[15])); # Status bitwise
+ knx_write('6/0/37',($reg7 >> 0) & 0x01,1);
+ knx_write('6/0/38',($reg7 >> 1) & 0x01,1);
+ knx_write('6/0/39',($reg7 >> 3) & 0x01,1);
+ knx_write('6/0/40',($reg7 >> 4) & 0x01,1);
+ knx_write('6/0/41',($reg7 >> 5) & 0x01,1);
+ knx_write('6/0/47',($reg7 >> 2) & 0x01,1);
+ knx_write('6/0/48',($reg7 >> 6) & 0x01,1);
+ knx_write('6/0/49',($reg7 >> 7) & 0x01,1);
+ knx_write('6/0/50',($reg7 >> 8) & 0x01,1);
+ knx_write('6/0/51',($reg7 >> 9) & 0x01,1);
+ knx_write('6/0/52',($reg7 >> 10) & 0x01,1);
+ knx_write('6/0/53',($reg7 >> 11) & 0x01,1);
+ knx_write('6/0/54',($reg7 >> 12) & 0x01,1);
+ knx_write('6/0/55',($reg7 >> 13) & 0x01,1);
+ knx_write('6/0/56',($reg7 >> 14) & 0x01,1);
+ knx_write('6/0/57',($reg7 >> 15) & 0x01,1);
+}
+
+sub getModbusRegInt16 {
+ my $idx = shift;
+ #my @in = shift;
+ $idx *= 2;
+ my $val = ((hex($inputs[$idx]) << 8) + hex($inputs[$idx+1]));
+ $val = $val > 32767 ? $val-65536 : $val;
+ return $val;
+}
+
+sub setModbusRegInt16 {
+ my $idx = shift;
+ my $val = shift;
+ $req = $modbus->writeRegisterRequest(
+ address => $idx,
+ value => $val,
+ );
+ $trn = $modbus->transaction($trs, $req);
+ $res = $trn->execute();
+}
+
+return;
+
+# FIXME: undef $modbus $trs $req $trn $res @inputs to avoid memleaks
+
+# TODO:
+# - Check modbus-response better/explicit
+# - Avoid memleaks by re-using a persistent Modbus-RTU/TCP connection
+# - round values to 0.1 before sending to Modbus?
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|