|
From: <kru...@us...> - 2014-05-24 10:10:29
|
Revision: 2192
http://sourceforge.net/p/openautomation/code/2192
Author: krumboeck
Date: 2014-05-24 10:10:24 +0000 (Sat, 24 May 2014)
Log Message:
-----------
v0.8 of RolladenAutomatik plugin
Modified Paths:
--------------
wiregate/plugin/generic/RollladenAutomatik.pl
wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample
Modified: wiregate/plugin/generic/RollladenAutomatik.pl
===================================================================
--- wiregate/plugin/generic/RollladenAutomatik.pl 2014-05-17 21:37:24 UTC (rev 2191)
+++ wiregate/plugin/generic/RollladenAutomatik.pl 2014-05-24 10:10:24 UTC (rev 2192)
@@ -1,6 +1,6 @@
######################################################################################
# Plugin RollladenAutomatik
-# V0.7 2013-11-05
+# V0.8 2014-05-24
# Lizenz: GPLv2
# Autoren: kleinklausi (http://knx-user-forum.de/members/kleinklausi.html)
# krumboeck (http://knx-user-forum.de/members/krumboeck.html)
@@ -24,6 +24,8 @@
# - Steuerung aufgrund der Raumtemperatur (krumboeck)
# - Hysteresewerte für Temperatur, Wind und Bewölkung (krumboeck)
# - Speichern der Rolladenposition und aktuellen Zuständen (krumboeck)
+# - Fahren auf Positionen welche im Aktor (z.B. Siemens 523/03) gespeichert sind (krumboeck)
+# - Überprüfen von Positionen vor Sonnenauf bzw. -untergang (krumboeck)
#
# TODO: Was teilweise integriert ist aber noch nicht komplett ist:
# - Bei Fensterdefinition auch Elevation oben bzw. unten angeben
@@ -159,15 +161,24 @@
next;
}
+ # Ermittle gewünschte Position und Grund des Fahrens für den Rollladen
my ($position, $bemerkung) = berechneRolladenposition($rolladen, $azimuth, $elevation, $lastAzimuth, $lastElevation, $daemmerung, $weather);
- my $lastPosition = ladeRolladenParameter($rolladen, "position");
+ # Fahre den Rollladen wenn es einen Positionswunsch gibt
if (defined $position) {
- if ($position != $lastPosition) {
- fahreRollladen($rolladen, $position);
- plugin_log($plugname,"Name: " . $rolladen->{name} . "; " . $bemerkung);
+
+ if ($position =~ m/((\d+|\*));Position:(\d+)/) {
+ if (positionChanged($rolladen, $position)) {
+ ladeRollladenPosition($rolladen, $position, $3);
+ plugin_log($plugname,"Name: " . $rolladen->{name} . " (Lade Pos); " . $bemerkung);
+ }
+ } else {
+ if (positionChanged($rolladen, $position)) {
+ fahreRollladen($rolladen, $position);
+ plugin_log($plugname,"Name: " . $rolladen->{name} . "; " . $bemerkung);
+ }
}
- } elsif ($debug) {
+ } elsif (defined $rolladen->{debug} && $rolladen->{debug}) {
plugin_log($plugname,"Name: " . $rolladen->{name} . "; Fahren wird fuer diesen Zyklus ausgesetzt");
}
@@ -180,9 +191,62 @@
return "Grad gegen Norden: " . round(rad2deg($azimuth)) . "; Grad ueber Horizont: " . round(rad2deg($elevation));
-####################################
+############################################
+# Prüft ob der Rolladen gefahren werden muss
+############################################
+sub positionChanged {
+ my ($rolladen, $newPosition) = @_;
+
+ # Ermittle die aktuelle Position
+ my $lastPosition = ladeRolladenParameter($rolladen, "position");
+
+ my $testAbendDaemmerung = ($elevation < deg2rad($daemmerung) && $lastElevation > deg2rad($daemmerung)) || 0;
+ my $testMorgenDaemmerung = ($elevation > deg2rad($daemmerung) && $lastElevation < deg2rad($daemmerung)) || 0;
+
+
+ my $newPositionValue = $newPosition;
+ if ($newPosition =~ m/((\d+|\*));Position:(\d+)/) {
+ $newPositionValue = $1;
+ }
+ my $lastPositionValue = $lastPosition;
+ if ($lastPosition =~ m/((\d+|\*));Position:(\d+)/) {
+ $lastPositionValue = $1;
+ }
+
+ if ((defined $rolladen->{pruefePositionSonnenAufUnter} && $rolladen->{pruefePositionSonnenAufUnter} == 1
+ && ($testAbendDaemmerung || $testMorgenDaemmerung))
+ || (($lastPosition ne $newPosition) && ($lastPositionValue eq "*"))) {
+ if (defined $rolladen->{GAistPos}) {
+ $lastPositionValue = knx_read($rolladen->{GAistPos}, 0, 5.001);
+ $lastPositionValue = sprintf("%d", $lastPositionValue);
+ if (defined $rolladen->{debug} && $rolladen->{debug}) {
+ plugin_log($plugname,"Name: " . $rolladen->{name} . "; Rollladen meldete Position: " . $lastPosition);
+ }
+ } else {
+ plugin_log($plugname,"Name: " . $rolladen->{name} . "; Konfiguration benötigt GAistPos für diesen Rollladen");
+ }
+ }
+
+ if ($newPosition == 1) {
+ $newPosition = 100;
+ }
+ if ($newPositionValue == 1) {
+ $newPositionValue = 100;
+ }
+ if (defined $rolladen->{debug} && $rolladen->{debug}) {
+ plugin_log($plugname,"Name: " . $rolladen->{name} . "; Last-Pos: " . $lastPosition . "; Pos: " . $newPosition);
+ plugin_log($plugname,"Name: " . $rolladen->{name} . "; Last-Pos-Value: " . $lastPositionValue . "; Pos-Value: " . $newPositionValue);
+ }
+ if (($lastPosition ne $newPosition) || ($newPositionValue <= ($lastPositionValue - 1)) || ($newPositionValue >= ($lastPositionValue + 1))) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+###################################
# Berechne Parameter eines Rolladen
-####################################
+###################################
sub berechneRolladenParameter {
my ($rolladen, $counter) = @_;
if ($counter > 20) {
@@ -238,7 +302,7 @@
my $testAktuellBeschienen = ($azimuth > $winkel1 && $azimuth < $winkel2) || 0;
my $testVoherBeschienen = ($lastAzimuth > $winkel1 && $lastAzimuth < $winkel2) || 0;
- # Test ob Nach oder Daemmerung
+ # Test ob Nacht oder Daemmerung
my $testAbendDaemmerung = ($elevation < deg2rad($daemmerung) && $lastElevation > deg2rad($daemmerung)) || 0;
my $testMorgenDaemmerung = ($elevation > deg2rad($daemmerung) && $lastElevation < deg2rad($daemmerung)) || 0;
my $testNacht = ($elevation < deg2rad($daemmerung)) || 0;
@@ -397,16 +461,22 @@
my ($rolladen, $richtung) = @_;
my $GA = $rolladen->{GAfahren};
+ if (defined $rolladen->{debug} && $rolladen->{debug}) {
+ plugin_log($plugname, "Name: " . $rolladen->{name} . "; Fahre Rolladen Position: " . $richtung);
+ }
+
if ($richtung == 0 || $richtung == 1) {
# Auf/Zu fahren
knx_write($GA,$richtung,3);
- }
- else {
+ } else {
# Position anfahren
knx_write($GA,$richtung,5);
}
# Position speichern
+ if ($richtung == 1) {
+ $richtung = 100;
+ }
speichereRolladenParameter($rolladen, "position", $richtung);
# kurze Pause, falls das benutzte Interface das braucht...
@@ -415,7 +485,31 @@
}
}
+####################################################
+# Aufruf mit fahreRollladen($richtung, $GA);
+####################################################
+sub ladeRollladenPosition {
+ my ($rolladen, $wert, $position) = @_;
+ if (! defined $rolladen->{GAladePos}) {
+ plugin_log($plugname,"Name: " . $rolladen->{name} . "; Wert für GAladePos ist nicht definiert!");
+ return;
+ }
+
+ if (defined $rolladen->{debug} && $rolladen->{debug}) {
+ plugin_log($plugname, "Name: " . $rolladen->{name} . "; Fahre zur gespeicherten Position: " . $position);
+ }
+
+ knx_write($rolladen->{GAladePos}, $position, 1.001);
+
+ speichereRolladenParameter($rolladen, "position", $wert);
+
+ # kurze Pause, falls das benutzte Interface das braucht...
+ if ($bugfixSlowInterface) {
+ usleep(20000);
+ }
+}
+
########################################
# Parameter für einen Rolladen speichern
########################################
Modified: wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample 2014-05-17 21:37:24 UTC (rev 2191)
+++ wiregate/plugin/generic/conf.d/RollladenAutomatik.conf_sample 2014-05-24 10:10:24 UTC (rev 2192)
@@ -73,6 +73,10 @@
# GAfahren => "0/0/126"
# GA um die Automatik dieses einen Rollladen zu sperren
# GAsperre=> "0/0/129"
+# GA für die aktuelle Position des Rollladen
+# GAistPos => "0/0/130"
+# GA für das Laden einer Position des Rollladen (für Aktoren welche gespeicherte Positionen unterstützen)
+# GAladePos => "0/0/131"
# Rolladen soll aufgrund der Raumtemperatur gesteuert werden
# tempGesteuert => 1
# Hysterese für Regelung aufgrund der Raumtemperatur (in °C)
@@ -89,6 +93,15 @@
# minAussenTemp => -15
# Hysterese für Regelung aufgrund der Außentemperatur (in °C)
# aussenTempHysterese => 2
+# Prüft die Position vor dem Fahren bei Sonnenauf und Untergang (boolean)
+# pruefePositionSonnenAufUnter => 1
+# Debugging für Rolladen einschalten
+# debug => 1
+
+# Format für im Aktor gespeicherte Positionen:
+# "44;Position:0" bezeichnet die im Aktor gespeicherte Position 0. Der Wert 44 dient lediglich zur Kontrolle.
+
+
push @AlleRolllaeden, { name => "default", istVorlage => 1, wertZuBesch => 1, wertAufBesch => 0,
wertZuNacht => 1, wertAufNacht => 0, sonnenAufUnter => 1, raumSollTemp => 23,
tempGesteuert => 1, tempHysterese => 0.5, maxWindGeschw => 80,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|