You can subscribe to this list here.
| 2010 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
(121) |
Dec
(58) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2011 |
Jan
(38) |
Feb
(36) |
Mar
(7) |
Apr
(2) |
May
(32) |
Jun
(24) |
Jul
(16) |
Aug
(21) |
Sep
(17) |
Oct
(62) |
Nov
(60) |
Dec
(70) |
| 2012 |
Jan
(54) |
Feb
(41) |
Mar
(21) |
Apr
(38) |
May
(76) |
Jun
(47) |
Jul
(25) |
Aug
(72) |
Sep
(29) |
Oct
(64) |
Nov
(93) |
Dec
(97) |
| 2013 |
Jan
(100) |
Feb
(168) |
Mar
(115) |
Apr
(59) |
May
(37) |
Jun
(32) |
Jul
(45) |
Aug
(42) |
Sep
(24) |
Oct
(73) |
Nov
(64) |
Dec
(4) |
| 2014 |
Jan
(14) |
Feb
(57) |
Mar
(58) |
Apr
(10) |
May
(18) |
Jun
(12) |
Jul
(7) |
Aug
(12) |
Sep
(15) |
Oct
(6) |
Nov
(32) |
Dec
(17) |
| 2015 |
Jan
(50) |
Feb
(5) |
Mar
(1) |
Apr
(26) |
May
(10) |
Jun
(3) |
Jul
(3) |
Aug
(2) |
Sep
(3) |
Oct
(18) |
Nov
(18) |
Dec
(8) |
| 2016 |
Jan
(33) |
Feb
(35) |
Mar
(50) |
Apr
(20) |
May
(25) |
Jun
(17) |
Jul
(8) |
Aug
(73) |
Sep
(64) |
Oct
(51) |
Nov
(20) |
Dec
(14) |
| 2017 |
Jan
(41) |
Feb
(57) |
Mar
(44) |
Apr
(136) |
May
(32) |
Jun
(39) |
Jul
(2) |
Aug
(12) |
Sep
(32) |
Oct
(103) |
Nov
(12) |
Dec
(4) |
| 2018 |
Jan
(9) |
Feb
(1) |
Mar
(60) |
Apr
(24) |
May
(15) |
Jun
(1) |
Jul
(2) |
Aug
(23) |
Sep
(15) |
Oct
(57) |
Nov
(21) |
Dec
(77) |
| 2019 |
Jan
(62) |
Feb
(99) |
Mar
(98) |
Apr
(49) |
May
(6) |
Jun
(3) |
Jul
(6) |
Aug
(18) |
Sep
(9) |
Oct
(15) |
Nov
(30) |
Dec
(6) |
| 2020 |
Jan
(14) |
Feb
(2) |
Mar
(22) |
Apr
(33) |
May
(47) |
Jun
(12) |
Jul
|
Aug
|
Sep
(4) |
Oct
(2) |
Nov
(5) |
Dec
(5) |
| 2021 |
Jan
(4) |
Feb
(101) |
Mar
(13) |
Apr
(32) |
May
(40) |
Jun
|
Jul
(3) |
Aug
|
Sep
|
Oct
(25) |
Nov
(12) |
Dec
|
| 2022 |
Jan
(154) |
Feb
(82) |
Mar
(63) |
Apr
(27) |
May
(26) |
Jun
(5) |
Jul
(12) |
Aug
(23) |
Sep
(17) |
Oct
(37) |
Nov
(13) |
Dec
(21) |
| 2023 |
Jan
(43) |
Feb
(43) |
Mar
(15) |
Apr
(8) |
May
(3) |
Jun
(25) |
Jul
(6) |
Aug
(38) |
Sep
(5) |
Oct
(20) |
Nov
(9) |
Dec
(28) |
| 2024 |
Jan
(15) |
Feb
(2) |
Mar
(12) |
Apr
(2) |
May
(8) |
Jun
(10) |
Jul
(10) |
Aug
(2) |
Sep
(3) |
Oct
(15) |
Nov
(6) |
Dec
(20) |
| 2025 |
Jan
|
Feb
(2) |
Mar
(6) |
Apr
(2) |
May
(2) |
Jun
|
Jul
|
Aug
(1) |
Sep
(1) |
Oct
(11) |
Nov
(2) |
Dec
|
|
From: <ma...@us...> - 2011-10-30 11:50:23
|
Revision: 480
http://openautomation.svn.sourceforge.net/openautomation/?rev=480&view=rev
Author: mayerch
Date: 2011-10-30 11:50:17 +0000 (Sun, 30 Oct 2011)
Log Message:
-----------
Remove Log-Message - no place for it in a release
Modified Paths:
--------------
CometVisu/trunk/visu/plugins/diagram/structure_plugin.js
Modified: CometVisu/trunk/visu/plugins/diagram/structure_plugin.js
===================================================================
--- CometVisu/trunk/visu/plugins/diagram/structure_plugin.js 2011-10-26 19:40:12 UTC (rev 479)
+++ CometVisu/trunk/visu/plugins/diagram/structure_plugin.js 2011-10-30 11:50:17 UTC (rev 480)
@@ -255,7 +255,7 @@
data[j][1] = parseFloat( data[j][1][0] );
}
p = $.plot(diagram, [{color: color, data: data}], options);
- console.log( p, p.width(), p.height(), p.getPlotOffset() );
+ //console.log( p, p.width(), p.height(), p.getPlotOffset() );
}
});
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-26 19:40:18
|
Revision: 479
http://openautomation.svn.sourceforge.net/openautomation/?rev=479&view=rev
Author: mayerch
Date: 2011-10-26 19:40:12 +0000 (Wed, 26 Oct 2011)
Log Message:
-----------
Bug fix slipped through :( - Fix
Modified Paths:
--------------
wiregate/plugin/generic/Multi-RTR.pl
Modified: wiregate/plugin/generic/Multi-RTR.pl
===================================================================
--- wiregate/plugin/generic/Multi-RTR.pl 2011-10-26 19:24:20 UTC (rev 478)
+++ wiregate/plugin/generic/Multi-RTR.pl 2011-10-26 19:40:12 UTC (rev 479)
@@ -1,6 +1,6 @@
#############################################################################
# Plugin: Multi RTR
-# V0.5 2011-09-18
+# V0.6 2011-09-18
# Copyright: Christian Mayer (mail at ChristianMayer.de)
# License: GPL (v3)
#
@@ -40,7 +40,7 @@
my %default = (
'SetPointDPT' => 9.001,
'SensorDPT' => 9.001,
- 'ActuratorDPT' => 5,
+ 'ActuatorDPT' => 5,
'DisableDPT' => 1,
'SetPointInit' => 21.0,
'SetPointLFlag' => 1, # true
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <j-...@us...> - 2011-10-26 19:24:26
|
Revision: 478
http://openautomation.svn.sourceforge.net/openautomation/?rev=478&view=rev
Author: j-n-k
Date: 2011-10-26 19:24:20 +0000 (Wed, 26 Oct 2011)
Log Message:
-----------
added missing open bracket
Modified Paths:
--------------
CometVisu/trunk/visu/lib/templateengine.js
Modified: CometVisu/trunk/visu/lib/templateengine.js
===================================================================
--- CometVisu/trunk/visu/lib/templateengine.js 2011-10-26 19:13:48 UTC (rev 477)
+++ CometVisu/trunk/visu/lib/templateengine.js 2011-10-26 19:24:20 UTC (rev 478)
@@ -118,7 +118,7 @@
var basetrans = transformation.split('.')[0];
return transformation in Transform ?
Transform[ transformation ].decode( value ) :
- basetrans in Transform ? Transform[ basetrans ].decode( value ) : value);
+ (basetrans in Transform ? Transform[ basetrans ].decode( value ) : value);
}
function map( value, element )
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-26 19:13:54
|
Revision: 477
http://openautomation.svn.sourceforge.net/openautomation/?rev=477&view=rev
Author: mayerch
Date: 2011-10-26 19:13:48 +0000 (Wed, 26 Oct 2011)
Log Message:
-----------
Version 0.6:
* Bug fix for setups where the WireGate didn't know the ActuatorGA
* Force sending of actuator after x seconds/minutes so that the watchdog in the actuator doesn't time out
Modified Paths:
--------------
wiregate/plugin/generic/Multi-RTR.pl
Modified: wiregate/plugin/generic/Multi-RTR.pl
===================================================================
--- wiregate/plugin/generic/Multi-RTR.pl 2011-10-26 18:28:41 UTC (rev 476)
+++ wiregate/plugin/generic/Multi-RTR.pl 2011-10-26 19:13:48 UTC (rev 477)
@@ -45,6 +45,7 @@
'SetPointInit' => 21.0,
'SetPointLFlag' => 1, # true
'ActuatorLFlag' => 1, # true
+ 'MinUpdateRate' => 5 * 60, # 5 minutes
);
my $GlobalDisableGA = '14/5/50';
@@ -211,9 +212,11 @@
#$plugin_info{ $prefix . '_Actuator' } = round( $plugin_info{ $prefix . '_Actuator' } );
# If a GA is defined, send the new actuator value
- if( defined $this_controller{ 'ActuatorGA' } and ($old ne $plugin_info{ $prefix . '_Actuator' }) )
+ if( defined $this_controller{ 'ActuatorGA' } and (
+ ($old ne $plugin_info{ $prefix . '_Actuator' }) or (time() - $plugin_info{ $prefix . '_lastSent' } > $this_controller{'MinUpdateRate'} )) )
{
knx_write( $this_controller{ 'ActuatorGA' }, $plugin_info{ $prefix . '_Actuator' }, $this_controller{ 'ActuatorDPT' } );
+ $plugin_info{ $prefix . '_lastSent' } = time();
}
if( defined $this_controller{ 'SetPointRRD' } )
@@ -236,8 +239,11 @@
# Version history:
# ================
#
+# 0.6:
+# * Bug fix for setups where the WireGate didn't know the ActuatorGA
+# * Force sending of actuator after x seconds/minutes so that the watchdog in
+# the actuator doesn't time out
# 0.5:
-# ------
# * initial release
#
#############################################################################
@@ -245,8 +251,8 @@
# =====
# * Limit bus traffic by sending actuator values after a change that is bigger
# than x%
-# * Force sending of actuator after x seconds/minutes so that the watchdog in
-# the actuator doesn't time out
# * Add GA for sending delta values for the setpoint
# * External Config
+# * Actuator overwrite ("Zwangsstellung")
+# * Hard temperature limit (min, max)
#############################################################################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <j-...@us...> - 2011-10-26 18:28:47
|
Revision: 476
http://openautomation.svn.sourceforge.net/openautomation/?rev=476&view=rev
Author: j-n-k
Date: 2011-10-26 18:28:41 +0000 (Wed, 26 Oct 2011)
Log Message:
-----------
Fixing bug #3424149
Modified Paths:
--------------
CometVisu/trunk/visu/lib/templateengine.js
Modified: CometVisu/trunk/visu/lib/templateengine.js
===================================================================
--- CometVisu/trunk/visu/lib/templateengine.js 2011-10-26 17:03:47 UTC (rev 475)
+++ CometVisu/trunk/visu/lib/templateengine.js 2011-10-26 18:28:41 UTC (rev 476)
@@ -106,16 +106,19 @@
function transformEncode( transformation, value )
{
+ var basetrans = transformation.split('.')[0];
return transformation in Transform ?
- Transform[ transformation ].encode( value ) :
- value;
+ Transform[ transformation ].encode( value ) :
+ (basetrans in Transform ? Transform[ basetrans ].encode( value ) : value);
+
}
function transformDecode( transformation, value )
{
+ var basetrans = transformation.split('.')[0];
return transformation in Transform ?
- Transform[ transformation ].decode( value ) :
- value;
+ Transform[ transformation ].decode( value ) :
+ basetrans in Transform ? Transform[ basetrans ].decode( value ) : value);
}
function map( value, element )
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <j-...@us...> - 2011-10-26 17:03:53
|
Revision: 475
http://openautomation.svn.sourceforge.net/openautomation/?rev=475&view=rev
Author: j-n-k
Date: 2011-10-26 17:03:47 +0000 (Wed, 26 Oct 2011)
Log Message:
-----------
Fixes rendering problem 3423019 and unreported rendering problem with infotrigger in discreet_slim design
Modified Paths:
--------------
CometVisu/trunk/visu/designs/discreet_slim/basic.css
CometVisu/trunk/visu/designs/structure_pure.js
Modified: CometVisu/trunk/visu/designs/discreet_slim/basic.css
===================================================================
--- CometVisu/trunk/visu/designs/discreet_slim/basic.css 2011-10-26 11:18:59 UTC (rev 474)
+++ CometVisu/trunk/visu/designs/discreet_slim/basic.css 2011-10-26 17:03:47 UTC (rev 475)
@@ -84,7 +84,7 @@
border-color: #020202;
border-style: solid;
border-width: 1px 0px 0px 1px;
- min-height: 2em;
+ min-height: 2.1em;
background-color: #101010;
}
@@ -215,6 +215,19 @@
margin-top: -1px;
}
+.switchInvisible
+{
+ border: none;
+ padding: 1px;
+}
+
+.switchInvisible div
+{
+ border: none;
+ padding: 5px;
+ width: 5em;
+ float: left;
+}
.ui-slider { position: relative; text-align: left; }
.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.6em; height: 1.6em; cursor: default; }
.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
Modified: CometVisu/trunk/visu/designs/structure_pure.js
===================================================================
--- CometVisu/trunk/visu/designs/structure_pure.js 2011-10-26 11:18:59 UTC (rev 474)
+++ CometVisu/trunk/visu/designs/structure_pure.js 2011-10-26 17:03:47 UTC (rev 475)
@@ -768,7 +768,10 @@
'type' : 'switch'
} ).bind( 'click', this.action );
- var actorinfo = '<div class="actor switchInvisible"><div class="value">-</div></div>';
+ var actorinfo = '<div class="actor switchInvisible" ';
+ if ( $p.attr( 'align' ) )
+ actorinfo += 'style="text-align: '+$p.attr( 'align' )+'" ';
+ actorinfo += '" ><div class="value">-</div></div>';
var $actorinfo = $(actorinfo).data({
'address' : addrread,
'format' : $p.attr('format'),
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <vl...@us...> - 2011-10-26 11:19:05
|
Revision: 474
http://openautomation.svn.sourceforge.net/openautomation/?rev=474&view=rev
Author: vlamers
Date: 2011-10-26 11:18:59 +0000 (Wed, 26 Oct 2011)
Log Message:
-----------
Fixed Bug of looping the recorded message
Modified Paths:
--------------
wiregate/plugin/generic/I-Button.pl
Modified: wiregate/plugin/generic/I-Button.pl
===================================================================
--- wiregate/plugin/generic/I-Button.pl 2011-10-26 11:14:43 UTC (rev 473)
+++ wiregate/plugin/generic/I-Button.pl 2011-10-26 11:18:59 UTC (rev 474)
@@ -16,6 +16,7 @@
my $gelb= '13/2/4';
my $rot = '13/2/3';
my $Anwesenheit = '13/2/0';
+my $verstaerker = '13/1/2';
# mpd
my $IP = "192.168.178.33";
@@ -34,10 +35,10 @@
# merker => merker GA des jeweiligen I-Buttons um die Telegram Wiederholung abzufangen
# besitzer => Name der mp3 (Begruessung) ohne Dateiendung
my @AlleButtons;
-push @AlleButtons, {besitzer => "Elisa", name => "rot", GA => "13/2/3", merker => "13/2/8"};
+push @AlleButtons, {besitzer => "Elisa", name => "rot", GA => "13/2/3", merker => "13/2/7"};
push @AlleButtons, {besitzer => "Volker", name => "schwarz", GA => "13/2/1", merker => "13/2/10"};
push @AlleButtons, {besitzer => "Samuel", name => "blau", GA => "13/2/2", merker => "13/2/9"};
-push @AlleButtons, {besitzer => "Christina", name => "gelb", GA => "13/2/4", merker => "13/2/7"};
+push @AlleButtons, {besitzer => "Christina", name => "gelb", GA => "13/2/4", merker => "13/2/8"};
#################################################################
# do not change anything below, all config stays above
@@ -46,7 +47,8 @@
# Plugin f\xFCr jedes oben definiertes Element ausf\xFChren
foreach my $element (@AlleButtons) {
#nur ausf\xFChren wenn das Ziel die definierte GA ist und das Telegram ein Write Telegram ist und kein Read oder Response Telegram. Der Status der Elemente wird unten im Plugin "gemerkt"
- if ($msg{'dst'} eq ($element->{GA}) && ($msg{'apci'} eq 'A_GroupValue_Write') && knx_read($msg{'dst'},0,1) != $plugin_info{$plugname.'_' . ($element->{name}) })
+ if ($msg{'dst'} eq ($element->{GA}) && ($msg{'apci'} eq 'A_GroupValue_Write') )
+ # && knx_read($msg{'dst'},0,1) != $plugin_info{$plugname.'_' . ($element->{name}) })
{
## Status der GA\xB4s holen
my $status = knx_read($Anwesenheit ,0,1);
@@ -54,30 +56,31 @@
my $schwarz_stat = knx_read($schwarz,0,1);
my $gelb_stat = knx_read($gelb,0,1);
my $blau_stat = knx_read($blau,0,1);
- my $stat = knx_read($element->{merker},0,1);
+
## definierte if else anweisung die ausgef\xFChrt werden soll nach bestimmten zust\xE4nden
- if (($msg{'value'} == 01) && ($status == 00)) {
+ if (($msg{'value'} == 1) && (knx_read($Anwesenheit ,0,1) == 0)) {
knx_write($Anwesenheit ,1,1);
plugin_log($plugname,"name: " . $status);
}
- if (($msg{'value'} == 01) && ($stat == 00)) {
+ if (($msg{'value'} == 1) && (knx_read($element->{merker} ,0,1) == 0)) {
+ knx_write($verstaerker, 1,1);
knx_write($element->{merker}, 1,1);
my $debug = `MPD_HOST=$IP MPD_PORT=$Port mpc clear && MPD_HOST=$IP MPD_PORT=$Port mpc add $element->{besitzer}.mp3 && MPD_HOST=$IP MPD_PORT=$Port mpc volume $Lautstaerke && MPD_HOST=$IP MPD_PORT=$Port mpc play`;
}
- if (($msg{'value'} == 00) && ($stat == 01)) {
+ if (($msg{'value'} == 0) && (knx_read($element->{merker} ,0,1) == 1)) {
knx_write($element->{merker}, 0,1);
}
- elsif (($msg{'value'} == 00) && ($rot_stat == 00) && ($gelb_stat == 00) && ($schwarz_stat == 00) && ($blau_stat == 00)) {
+ elsif (($msg{'value'} == 0) && ($rot_stat == 0) && ($gelb_stat == 0) && ($schwarz_stat == 0) && ($blau_stat == 0)) {
knx_write($Anwesenheit ,0,1);
plugin_log($plugname,"name: " . $element->{name} . "; aus: ");
}
#merken der Zust\xE4nde:
- $plugin_info{$plugname.'_' . ($element->{name}) } = knx_read($element->{GA} ,0,1);
+ # $plugin_info{$plugname.'_' . ($element->{name}) } = knx_read($element->{GA} ,0,1);
$plugin_info{$plugname.'_' . ($Anwesenheit) } = knx_read($Anwesenheit ,0,1);
- $plugin_info{$plugname.'_' . ($element->{merker}) } = knx_read($element->{merker} ,0,1);
+ # $plugin_info{$plugname.'_' . ($element->{merker}) } = knx_read($element->{merker} ,0,1);
}
# wenn keine der oben genannten bedingungen zutrifft dann das n\xE4chste Element abarbbeiten
else {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <vl...@us...> - 2011-10-26 11:14:49
|
Revision: 473
http://openautomation.svn.sourceforge.net/openautomation/?rev=473&view=rev
Author: vlamers
Date: 2011-10-26 11:14:43 +0000 (Wed, 26 Oct 2011)
Log Message:
-----------
Fixed Bugs
Modified Paths:
--------------
wiregate/plugin/generic/mpd_Player2.pl
Modified: wiregate/plugin/generic/mpd_Player2.pl
===================================================================
--- wiregate/plugin/generic/mpd_Player2.pl 2011-10-23 16:34:01 UTC (rev 472)
+++ wiregate/plugin/generic/mpd_Player2.pl 2011-10-26 11:14:43 UTC (rev 473)
@@ -17,31 +17,40 @@
my $volkanal2 = "40%"; # The volume of the 2nd Speaker
my $cardnum = "1"; # Hardware Number of the Sound card
my $Speaker = "Speaker,1"; # Name of the output ( My soundcard is defined as following: Speaker,1 Front; Speaker,1 Rear
+
## mpd
my $mpdname = "mpd2"; # the name of the mpd instance
my $IP = "192.168.178.33"; # The IP where the mpd Instanz is running
my $Port = "6601"; # Port of the mpd Instanz
my $volume_anfang = "35"; # This Volume will be set for mpd
+
# Aus wenn Fernseher an
my $Fernseher = '3/0/0'; # Fernseher
+
# Verstaerker
my $verstaerker = '13/1/2'; # Verstaerker on/off GA
+
#Radio GA
my $knx_addr_player2 = '13/1/0';# mpd Player on/off GA
+
#Volume
## Vol Receive
my $Vol_addr = '13/1/7'; # knx_address for volume up/down (receive)
my $volumestep = "3"; # The stepsize for volume
my $vol_up_data = "9"; # Data that ETS Busmonitor shows when you send a telegram from a switch to this GA
my $vol_down_data = "1";
+
#Vol send (brightness-value / helligkeitswert)
my $knx_addr_vol = '13/1/22'; # The Volume will be send here from the plugin
my $laut_GA = '13/1/23'; #the volume can be send here as brightness-value
+
# GA for recorded message
my $info_wz = '3/1/2'; # Info Switch wz
+
# Partymodus
my $Partymodus = '13/1/21'; # GA for Partymodus
my $vol_party = "100%"; # With % Symbol
+
# Quellen
my $kueche = '13/1/5'; # k\xFCche enable/disable
my $kueche_nr = "1"; # mpd output number
@@ -49,8 +58,10 @@
my $wohnz_nr = "3"; # number of mpd output
my $Bad = '13/1/15'; # enable/disable bathroom output
my $Bad_nr = "2"; # mpd output number
+
# Prev / next
my $addr_pn= '13/1/14'; # Prev / Next
+
# Playlist
my $playlist = '13/1/24'; # the playlist number will be send here (value 1 - 255)
my $playlist1 = "Antenne";
@@ -92,7 +103,7 @@
my $debug = `/etc/init.d/$mpdname restart`;
my $debug = `amixer -c $cardnum set $Speaker $Kanal $vol_alsa && amixer -c $cardnum set $Speaker $Kanal2 $volkanal2`;
knx_write($playlist,1,1);
- knx_write($knx_addr_vol ,$volume_anfang,5);
+ knx_write($laut_GA ,$volume_anfang,5);
return "Player 2 l\xE4uft";
}
if ($msg{'value'} == 00) {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-23 16:34:08
|
Revision: 472
http://openautomation.svn.sourceforge.net/openautomation/?rev=472&view=rev
Author: makki1
Date: 2011-10-23 16:34:01 +0000 (Sun, 23 Oct 2011)
Log Message:
-----------
wiregate-plugins: MinMaxRRD2GA, RolladenLuetung, HHK
Added Paths:
-----------
wiregate/plugin/generic/Handtuchtrockner.pl
wiregate/plugin/generic/MinMaxValueFromRRDtoGA.pl
wiregate/plugin/generic/RolladenLueftungsPos.pl
Added: wiregate/plugin/generic/Handtuchtrockner.pl
===================================================================
--- wiregate/plugin/generic/Handtuchtrockner.pl (rev 0)
+++ wiregate/plugin/generic/Handtuchtrockner.pl 2011-10-23 16:34:01 UTC (rev 472)
@@ -0,0 +1,71 @@
+# Plugin zur Steuerung eines Handtuchtrockners
+# http://knx-user-forum.de/wiregate/16209-plugin-zur-steuerung-eines-handtuchtrockners-2.html
+# Sommer > Heizen über E-Patrone
+# Winter > Heizen über WW-Heizung
+### Definitionen
+my $hk_ga = '4/2/100'; # Gruppenadresse zur Steuerung Handtuchtrockner (An/Aus)
+my $sommer_ga = '4/0/0'; # Gruppenadresse Sommerbetrieb (An/Aus)
+my $patrone_ga = '4/2/110'; # Gruppenadresse E-Heizpatrone (An/Aus)
+my $stellantrieb_ga = '4/2/105'; # Gruppenadresse Stellantrieb (%-Wert)
+my $stellantrieb_auf = 100; # Wert für Stellantrieb offen (%-Wert)
+my $stellantrieb_zu = 0; # Wert für Stellantrieb geschlossen (%-Wert)
+my $modus_hk = '1'; # Konnex Betriebsmudus RTR wenn Handtuchtrockner läuft
+my $modus_ga = '4/2/91'; # Zwangsbetriebsmodus RTR Bad
+my $zwang_fbh_ga = '4/2/97'; # Zwangsmodus für Stellantrieb FBH offen
+my $laufzeit = 60*60*2; # Laufzeit bis Auto Aus in sek.
+### Ende Definitionen
+# Eigenen Aufruf-Zyklus auf 0 Sekunden setzen
+$plugin_info{$plugname.'_cycle'} = 0;
+# Plugin an Gruppenadresse "anmelden"
+$plugin_subscribe{$hk_ga}{$plugname} = 1;
+
+#Prüfung, ob GA durch Schreibtransaktion angesprochen wurde
+if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $hk_ga ) {
+ #Wert für Handtuchtrockner lesen
+ my $hk_wert = knx_read($hk_ga,300,1);
+ #Ausführungszeit setzen
+ $plugin_info{$plugname.'_last'} = time();
+
+ #Wert für Sommerbetrieb lesen
+ my $sommer_wert = knx_read($sommer_ga,300,1);
+ #Kenner Laufzeit gestartet und Aufrufintervall des Plugin setzen
+ if ($hk_wert == 1) {
+ $plugin_info{$plugname.'_sema'} = 1;
+ $plugin_info{$plugname.'_cycle'} = $laufzeit;
+ }
+ if ($sommer_wert == 1) {
+ if ($hk_wert == 1) {
+ knx_write($patrone_ga, 1, 1); ##Heizpatrone einschalten
+ knx_write($stellantrieb_ga, $stellantrieb_zu, 5.001); ##Stellantrieb für HK schließen
+ return "E-Patrone An";
+ }
+ else {
+ knx_write($patrone_ga,0,1); ##Heizpatrone ausschalten
+ knx_write($stellantrieb_ga, $stellantrieb_auf, 5.001); ##Stellantrieb für HK öffnen
+ return "E-Patrone Aus";
+ }
+ }
+ else {
+ knx_write($patrone_ga,0,1);
+ if ($hk_wert == 1) {
+ knx_write($stellantrieb_ga, $stellantrieb_auf, 5.001); ##Stellantrieb für HK öffnen
+ knx_write($modus_ga, $modus_hk, 5.010); ##Betriebsmodus auf Anwesend zwingen
+ knx_write($zwang_fbh_ga, 1, 1); ##Stellanrieb zwingen 100% öffnen
+ return "WW-Heizung An";
+ }
+ else {
+ knx_write($stellantrieb_ga, $stellantrieb_zu, 5.001); ##Stellantrieb für HK schließen
+ knx_write($modus_ga, 0, 5.010); ##Betriebsmodus Zwang zurücksetzen
+ knx_write($zwang_fbh_ga, 0, 1); ##Stellanrieb Zwang zurücksetzen
+ return "WW-Heizung Aus";
+ }
+ }
+ }
+#Ausführung wenn Aufrufintervall/Laufzeit abgelaufen ist
+elsif ($plugin_info{$plugname.'_sema'} == 1) {
+ #Heizkörper ausschalten,Kenner Laufzeit gestartet und Aufrufintervall des Plugin zurücksetzen
+ $plugin_info{$plugname.'_sema'} = 0;
+ $plugin_info{$plugname.'_cycle'} = 0;
+ knx_write($hk_ga,0,1);
+ }
+return "Warte auf Telegramm";
Added: wiregate/plugin/generic/MinMaxValueFromRRDtoGA.pl
===================================================================
--- wiregate/plugin/generic/MinMaxValueFromRRDtoGA.pl (rev 0)
+++ wiregate/plugin/generic/MinMaxValueFromRRDtoGA.pl 2011-10-23 16:34:01 UTC (rev 472)
@@ -0,0 +1,46 @@
+### Plugin Min/Max values from RRD auf den Bus
+my $RRDName = "28.7FD4EB010000_temp";
+my $ds = "MIN"; # Datasource: MIN AVERAGE MAX - egal bei Werten <180h
+my $start = "now-20h"; # AT-STYLE TIME SPECIFICATION
+my $end = "now";
+$plugin_info{$plugname.'_cycle'} = 3600; # alle x sekunden
+my $debug = 0;
+my $gamin = '11/2/20'; # DPT9.001 leer um Versand zu unterbinden-> ''
+my $gamax = '11/2/21'; # leer um Versand zu unterbinden-> ''
+### ENDE Definitionen
+
+# return early on write/response (telegram from myself!)
+if ($msg{'apci'} && $msg{'apci'} ne "A_GroupValue_Read") {
+ return;
+}
+
+my ($min,$max) = (0,0);
+my ($dbstart, $step, $names, $data) =
+ RRDs::fetch('/var/www/rrd/'.$RRDName.'.rrd', "--start=$start","--end=$end", $ds);
+
+foreach my $line (@$data) {
+ foreach my $val (@$line) {
+ next unless defined $val;
+ $min = $val if $val < $min;
+ $max = $val if $val > $max;
+ }
+}
+
+if ($msg{'apci'} eq "A_GroupValue_Read" and $msg{'dst'} eq $gamin) {
+ knx_write($gamin,$min,9,1);
+ return;
+} elsif ($msg{'apci'} eq "A_GroupValue_Read" and $msg{'dst'} eq $gamax) {
+ knx_write($gamax,$max,9,1);
+ return;
+}
+
+if ($gamin) {
+ knx_write($gamin,$min,9);
+ $plugin_subscribe{$gamin}{$plugname} = 1;
+}
+if ($gamax) {
+ knx_write($gamax,$max,9);
+ $plugin_subscribe{$gamax}{$plugname} = 1;
+}
+return("Min $min Max $max in $start") if $debug;
+return;
Added: wiregate/plugin/generic/RolladenLueftungsPos.pl
===================================================================
--- wiregate/plugin/generic/RolladenLueftungsPos.pl (rev 0)
+++ wiregate/plugin/generic/RolladenLueftungsPos.pl 2011-10-23 16:34:01 UTC (rev 472)
@@ -0,0 +1,77 @@
+## Dieses Plugin steuert die Rolläden
+# http://knx-user-forum.de/wiregate/16384-plugin-rolladen-lueftungsposition.html
+## Rolladen unten + Fenster auf >> Rolladen in Lüftungsposition fahren
+## Globale Definitionen ##
+my $zustand_geschlossen = 00; # Wert Fensterstatus geschlossen
+my $zustand_offen = 01; # Wert Fensterstatus geöffnet
+my $GA_Gesamt_SperreAuto = '3/0/4'; # Gruppenadresse, die die Lüftungsautomatik sperrt
+#Definition aller Rolläden über ein Array von Hashes, wobei jeder Hash ein Rollladen/Fenster ist.
+my @AlleRolllaeden;
+# Name = Name des Rolladen
+# GA_Fensterstatus = Gruppenadresse für Öffnungsüberwachung des Fensters
+# GA_RolloUnten = Gruppenadresse für Meldung, daß Rolladen ganz runter gefahren wurde
+# GA_RolloPos = Gruppenadresse zum Anfahren einer Position
+# GA_RolloAufAb = Gruppenadresse zu Auf/Abfahren des Rollos
+# GA_RolloPosInfo = Gruppenadresse auf der die Rückmeldung der Position erfolgt
+# PosRolloLuft = Position des Rolladen im % für Lüftungsposition
+push @AlleRolllaeden, { Name => "Schlafzimmer", GA_Fensterstatus => "6/2/50", GA_RolloUnten => "3/2/57", GA_RolloPos => "3/2/52",
+ GA_RolloAufAb => "3/2/50", GA_RolloPosInfo => "3/2/55", PosRolloLuft => 70};
+push @AlleRolllaeden, { Name => "Bad", GA_Fensterstatus => "6/2/90", GA_RolloUnten => "3/2/97", GA_RolloPos => "3/2/92",
+ GA_RolloAufAb => "3/2/90", GA_RolloPosInfo => "3/2/95", PosRolloLuft => 85};
+push @AlleRolllaeden, { Name => "Kind A", GA_Fensterstatus => "6/2/130", GA_RolloUnten => "3/2/137", GA_RolloPos => "3/2/132",
+ GA_RolloAufAb => "3/2/130", GA_RolloPosInfo => "3/2/135", PosRolloLuft => 85};
+push @AlleRolllaeden, { Name => "Kind B", GA_Fensterstatus => "6/2/170", GA_RolloUnten => "3/2/177", GA_RolloPos => "3/2/172",
+ GA_RolloAufAb => "3/2/170", GA_RolloPosInfo => "3/2/175", PosRolloLuft => 96};
+push @AlleRolllaeden, { Name => "Arbeitszimmer Fenster", GA_Fensterstatus => "6/2/220", GA_RolloUnten => "3/2/227", GA_RolloPos => "3/2/222",
+ GA_RolloAufAb => "3/2/220", GA_RolloPosInfo => "3/2/225", PosRolloLuft => 70};
+push @AlleRolllaeden, { Name => "Arbeitszimmer Tuer", GA_Fensterstatus => "6/2/230", GA_RolloUnten => "3/2/237", GA_RolloPos => "3/2/232",
+ GA_RolloAufAb => "3/2/230", GA_RolloPosInfo => "3/2/235", PosRolloLuft => 80};
+
+## Plugin nur bei Telegramm aufrufen
+$plugin_info{$plugname.'_cycle'} = 0; # nur bei Telegramm aufrufen
+
+## Rolladensperre beachten
+#Anmeldung an Gruppenadresse für Rolladensperre
+$plugin_subscribe{$GA_Gesamt_SperreAuto}{$plugname} = 1;
+#Sperrkennzeichen setzen, wenn Telegramm eintrifft
+if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $GA_Gesamt_SperreAuto) {
+ $plugin_info{$plugname.'_sperre'} = knx_read($GA_Gesamt_SperreAuto,0,1);
+ }
+#Wenn Sperrkennzeichen gesetzt ist, dann soll der Code beendet werden
+if ($plugin_info{$plugname.'_sperre'} == 1) {
+ return "Sperre";
+ }
+
+##Ausführen des Codes je definiereten Rolladen
+foreach my $element (@AlleRolllaeden) {
+
+ #Anmeldung an Gruppenadresse für Fensterstatus
+ $plugin_subscribe{$element->{GA_Fensterstatus}}{$plugname} = 1;
+
+ #Anmeldung an Gruppenadresse für Status, daß Rolladen unten
+ $plugin_subscribe{$element->{GA_RolloUnten}}{$plugname} = 1;
+
+ #Wenn Telegramm für Fensterstatus, Rollo unten oder Sperre eintrifft, dann soll das Rollo ggf. bewegt werden
+ if ($msg{'apci'} eq "A_GroupValue_Write" and
+ ($msg{'dst'} eq $element->{GA_Fensterstatus} or $msg{'dst'} eq $element->{GA_RolloUnten}) or $msg{'dst'} eq $GA_Gesamt_SperreAuto) {
+
+ my $Fensterstatus = knx_read($element->{GA_Fensterstatus}, 300, 1); #Lesen Fensterstatus
+ my $RolloUnten = knx_read($element->{GA_RolloUnten} ,300, 1); #Lesen ob Rolladen unten
+ my $RolloPosInfo = knx_read($element->{GA_RolloPosInfo}, 300, 5.001); #Lesen der aktuellen Rolladenpositon in %
+
+ #Wenn Fenster=zu und Rolladen innerhalb Lüftung, dann soll der Rollo komplett runter gefahren werden
+ if (($Fensterstatus==$zustand_geschlossen ) && ($RolloPosInfo >= $element->{PosRolloLuft}) && ($msg{'dst'} eq $element->{GA_Fensterstatus} )) {
+ knx_write($element->{GA_RolloAufAb} , 1, 1);
+ return "Ab";
+ }
+
+ #Wenn Fenster=offen und Rolladen komplet unten, dann soll der Rollo in die Lüftungsposition gefahren werden
+ if (($Fensterstatus==$zustand_offen) && ($RolloUnten==1)) {
+ knx_write($element->{GA_RolloPos}, $element->{PosRolloLuft}, 5.001);
+ return "Lüftung";
+ }
+ }
+ }
+
+#Rückgabewert falls noch kein Telegramm eingetroffen ist
+return "Warte";
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <e....@us...> - 2011-10-23 13:30:34
|
Revision: 471
http://openautomation.svn.sourceforge.net/openautomation/?rev=471&view=rev
Author: e.max
Date: 2011-10-23 13:30:28 +0000 (Sun, 23 Oct 2011)
Log Message:
-----------
Konfigurationsverzeichnis fuer Plugins, die externe Konfigurationen nutzen
Added Paths:
-----------
wiregate/plugin/generic/conf.d/
wiregate/plugin/generic/conf.d/emx_cleanup.conf_sample
wiregate/plugin/generic/conf.d/emx_dcode.conf_sample
wiregate/plugin/generic/conf.d/emx_sonne.conf_sample
wiregate/plugin/generic/conf.d/emx_uhr.conf.sample
Added: wiregate/plugin/generic/conf.d/emx_cleanup.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/emx_cleanup.conf_sample (rev 0)
+++ wiregate/plugin/generic/conf.d/emx_cleanup.conf_sample 2011-10-23 13:30:28 UTC (rev 471)
@@ -0,0 +1,49 @@
+#
+# $Id$
+#
+#-----------------------------------------------------------------------------
+# Einstellungen: Alle zu loeschenden Schluessel aus %plugin_info
+# Vorsicht: man kann leicht alles loeschen, da es sich um regulaere Ausdruecke
+# handelt. Ein Punkt zum Beispiel entspricht einem beliebigen
+# Zeichen. Ohne die Zeichen '^' und '$' sind dabei auch Teilvergleiche
+# gueltig:
+#
+# 'abc' loescht alles, was 'abc' _enthaelt_ !!
+# '^abc' loescht alles, was mit 'abc' _beginnt_ !!
+# 'abc$' loescht alles, was mit 'abc' _endet_ !!
+#
+# Wer nicht sicher ist, sollte im Forum fragen, auf jeden Fall aber
+# die Variable $Loeschen erst mal nicht auf 'Y' setzen.
+#
+# Nur wenn $Loeschen auf 'Y' steht, wird auch wirklich geloescht,
+# ansonsten wird nur ein Logeintrag geschrieben: '... matches /$key/'
+#
+# Wenn $Loeschen auf 'Y' gesetzt wird, loescht das Beispiel alle
+# Eintraege, die mit einem '#' beginnen oder eine Tilde enthalten.
+# Das sind die typischen Editor-Arbeitsdateien des 'emacs' Editors,
+# die bei der Aenderung eines Plugins entstehen und vom wiregated
+# wie Plugins behandelt werden, und dann im %plugin_info hash
+# auftauchen (und da natuerlich auch wieder raus sollten).
+#
+# Es empfiehlt sich, das Script nach der Bereinigung zu loeschen,
+# und nur bei Bedarf wieder einzustellen, da es natuerlich
+# Ressourcen verbraucht.
+#
+# Wer auf die Ausfuehrung nicht warten moechte, bis die naechste
+# Zykluszeit abgelaufen ist, kann die sofortige Ausfuehrung per
+# Kommandozeilen-Eingabe mit einem 'touch emx_cleanup.pl' erzwingen.
+#-----------------------------------------------------------------------------
+
+$cycleTime = 24*3600;
+$Loeschen = 'N';
+@Keys = ('^#', '~');
+
+#-----------------------------------------------------------------------------
+# ENDE Einstellungen
+#-----------------------------------------------------------------------------
+1;
+
+# emacs setting
+# ;;; Local Variables: ***
+# ;;; mode:perl ***
+# ;;; End: ***
Property changes on: wiregate/plugin/generic/conf.d/emx_cleanup.conf_sample
___________________________________________________________________
Added: svn:keywords
+ Id
Added: wiregate/plugin/generic/conf.d/emx_dcode.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/emx_dcode.conf_sample (rev 0)
+++ wiregate/plugin/generic/conf.d/emx_dcode.conf_sample 2011-10-23 13:30:28 UTC (rev 471)
@@ -0,0 +1,41 @@
+#
+# $Id$
+#
+#-----------------------------------------------------------------------------
+# ACHTUNG: Variablen duerfen nur (und muessen) im Plugin
+# mit 'my' definiert werden,
+# 'my' hier nicht verwenden!
+#-----------------------------------------------------------------------------
+
+#------------------------
+# Konfigurierbare Werte
+#------------------------
+
+$pauseSec = 1.0; # Pausenzeit, nach der eine Ziffer komplett ist
+$completeAfter = 4; # Wartezeit in Sekunden, nach der der Code ausgewertet wird
+$maxFails = 3; # Anzahl Fehlversuche
+$blockPeriod = 30; # anfaengliche Blockadezeit in Sekunden.
+$maxBlockPeriod = 3600; # maximale Blockadezeit
+
+#-----------------------------------------------------------------------------
+# - Es koennen beliebig viele Eintraege fuer ein und den selben Code gemacht
+# werden, sie werden alle ausgefuehrt.
+# - Wird ein 'FromPA' Wert angegeben, wird der Code nur von dieser PA akzeptiert.
+# - 'FromGA' und 'ToGA' duerfen nicht identisch sein.
+# - Der Code darf nur aus Ziffern bestehen, muss aber in Hochkommas angegeben
+# werden. So gehen auch fuehrende Nullen. Zehn Tastendruecke sind eine Null.
+#-----------------------------------------------------------------------------
+@Codes =
+ (
+ { Active=>1, Code=>'123',FromGA=>'1/1/121', FromPA=>undef, Value=>'1', DPT=>'1', ToGA=>'1/1/123', Log=>'1' },
+ { Active=>1, Code=>'123',FromGA=>'1/1/121', FromPA=>undef, Value=>'1', DPT=>'1', ToGA=>'3/2/1', Log=>'1' },
+ { Active=>1, Code=>'321',FromGA=>'1/1/121', FromPA=>undef, Value=>'0', DPT=>'1', ToGA=>'1/1/123', Log=>'1' },
+ { Active=>1, Code=>'456',FromGA=>'1/1/121', FromPA=>undef, Value=>'1', DPT=>'1', ToGA=>'1/1/121', Log=>'1' },
+ );
+
+1;
+
+# emacs setting
+# ;;; Local Variables: ***
+# ;;; mode:perl ***
+# ;;; End: ***
Property changes on: wiregate/plugin/generic/conf.d/emx_dcode.conf_sample
___________________________________________________________________
Added: svn:keywords
+ Id
Added: wiregate/plugin/generic/conf.d/emx_sonne.conf_sample
===================================================================
--- wiregate/plugin/generic/conf.d/emx_sonne.conf_sample (rev 0)
+++ wiregate/plugin/generic/conf.d/emx_sonne.conf_sample 2011-10-23 13:30:28 UTC (rev 471)
@@ -0,0 +1,18 @@
+#
+# $Id$
+#
+#-----------------------------------------------------------------------------
+# Einstellungen: Laengen- und Breitengrad
+#-----------------------------------------------------------------------------
+$Breite = 50.0;
+$Laenge = 8.03;
+
+#-----------------------------------------------------------------------------
+# ENDE Einstellungen
+#-----------------------------------------------------------------------------
+1;
+
+# emacs setting
+# ;;; Local Variables: ***
+# ;;; mode:perl ***
+# ;;; End: ***
Property changes on: wiregate/plugin/generic/conf.d/emx_sonne.conf_sample
___________________________________________________________________
Added: svn:keywords
+ Id
Added: wiregate/plugin/generic/conf.d/emx_uhr.conf.sample
===================================================================
--- wiregate/plugin/generic/conf.d/emx_uhr.conf.sample (rev 0)
+++ wiregate/plugin/generic/conf.d/emx_uhr.conf.sample 2011-10-23 13:30:28 UTC (rev 471)
@@ -0,0 +1,30 @@
+#
+# $Id$
+#
+#-----------------------------------------------------------------------------
+# ACHTUNG: Variablen duerfen nur im Plugin mit 'my' definiert werden,
+# 'my' hier nicht verwenden!
+#-----------------------------------------------------------------------------
+
+#------------------------
+# Konfigurierbare Werte
+#------------------------
+
+@Zeiten =
+ (
+ # Aussenlicht und Aussensteckdosen zyklisch ausschalten
+ { Name=>'ELW_Terrassenlicht', Aktiv=>'1', Min=>'0-59', Wert=>'0', DPT=>'1', GA=>'1/5/92', Log=>'1' },
+ );
+
+#-----------------------------------------------------------------
+# $slotEnd definiert die Sekunde, ab der neu synchronisiert wird
+# ACHTUNG: Sollte nicht kleiner als 1 Sekunde sein.
+#-----------------------------------------------------------------
+$slotEnd = 3;
+
+1;
+
+# emacs setting
+# ;;; Local Variables: ***
+# ;;; mode:perl ***
+# ;;; End: ***
Property changes on: wiregate/plugin/generic/conf.d/emx_uhr.conf.sample
___________________________________________________________________
Added: svn:keywords
+ Id
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <e....@us...> - 2011-10-23 13:25:49
|
Revision: 470
http://openautomation.svn.sourceforge.net/openautomation/?rev=470&view=rev
Author: e.max
Date: 2011-10-23 13:25:43 +0000 (Sun, 23 Oct 2011)
Log Message:
-----------
Sonnenauf/untergangs-Berechnung und Speicherung in %plugin_info, erste Version
Added Paths:
-----------
wiregate/plugin/generic/emx_sonne.pl
Added: wiregate/plugin/generic/emx_sonne.pl
===================================================================
--- wiregate/plugin/generic/emx_sonne.pl (rev 0)
+++ wiregate/plugin/generic/emx_sonne.pl 2011-10-23 13:25:43 UTC (rev 470)
@@ -0,0 +1,98 @@
+# Plugin zur Berechnung von Sonnenauf- und -untergang.
+# Die Berechnungsgrundlagen stammen nach einer Anregung aus dem
+# knx-user-forum.de von der Seite:
+# http://austernkommunikation.wordpress.com/2008/05/31/sonnenaufgang-berechnen-mit-perl/
+#
+# Die Werte werden in %plugin_info abgelegt:
+# $plugin_info{emx_sonne.pl.auf} : Sonnenaufgang dezimal, z.B: 5,8 Uhr = 5:48 Uhr
+# $plugin_info{emx_sonne.pl.unt} : Sonnenuntergang dezimal, dto.
+# $plugin_info{emx_sonne.pl.aufHH} : Sonnenaufgang, Stunde, z.B. 5
+# $plugin_info{emx_sonne.pl.aufMM} : Sonnenaufgang, Minute, z.B. 48
+# $plugin_info{emx_sonne.pl.untHH} : Sonnenuntergang, Stunde dto.
+# $plugin_info{emx_sonne.pl.untMM} : Sonnenuntergang, Minute dto.
+#
+# Die ...HH und ..MM Zeiten dienen zur Verwendung im emx_uhr.pl Plugin.
+#
+# Die Ausfuehrung erfolgt beim der ersten Ausfuehrung sofort, danach immer
+# einmal taeglich gegen 1:00 Uhr morgens.
+#
+# $Id$
+#
+# Copyright: Edgar (emax) Hermanns, forum at hermanns punkt net
+#--------------------------------------------------------------------
+# CHANGE LOG:
+# ## who yyyymmdd bug# description
+# -- --- -------- ----- ----------------------------------------
+# . ... ........ ..... vorlage
+# 0 edh 20111023 ----- erste Version
+
+use Math::Trig;
+use POSIX;
+
+# Default: Berlin
+my $Breite = 52.5167;
+my $Laenge = 13.4;
+
+sub calculateSun()
+{
+ my ($yddd, $timezone) = @_;
+ ++$yddd;
+
+ my $RAD = pi/180.0;
+ my $B = $Breite * $RAD;
+ my $zeitgleichung = -0.171 * sin(0.0337 * $yddd + 0.465) - 0.1299 * sin(0.01787 * $yddd - 0.168);
+ my $deklination = 0.4095 * sin(0.016906 * ($yddd - 80.086));
+ my $timediff = 12* acos( (sin(-0.0145) - (sin($B) * sin($deklination))) / (cos($B) * cos($deklination)) )/pi;
+ my $sAuf = 12 - $timediff - $zeitgleichung + (15-$Laenge)*4/60 + $timezone;
+ my $sUnt = 12 + $timediff - $zeitgleichung + (15-$Laenge)*4/60 + $timezone;
+ my $sAufHH = int($sAuf);
+ my $sUntHH = int($sUnt);
+
+ $plugin_info{"$plugname.tag"} = $yddd-1;
+ $plugin_info{"$plugname.laenge"} = $Laenge;
+ $plugin_info{"$plugname.breite"} = $Breite;
+ $plugin_info{"$plugname.auf"} = $sAuf;
+ $plugin_info{"$plugname.unt"} = $sUnt;
+ $plugin_info{"$plugname.aufHH"} = $sAufHH;
+ $plugin_info{"$plugname.aufMM"} = int(($sAuf - $sAufHH) * 60);
+ $plugin_info{"$plugname.untHH"} = $sUntHH;
+ $plugin_info{"$plugname.untMM"} = int(($sUnt - $sUntHH) * 60);
+ plugin_log($plugname, " calculated sunrise[$sAuf], sunset[$sUnt], LAT[$Breite], LON[$Laenge]");
+}
+
+sub readConf
+{
+ my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
+ if (! -f $confFile)
+ {
+ plugin_log($plugname, " no conf file [$confFile] found.");
+ }
+ else
+ {
+ plugin_log($plugname, " reading conf file [$confFile].");
+ open(CONF, $confFile);
+ my @lines = <CONF>;
+ close($confFile);
+ my $result = eval("@lines");
+ ($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
+ if ($@)
+ {
+ plugin_log($plugname, " conf file [$confFile] returned:");
+ my @parts = split(/\n/, $@);
+ plugin_log($plugname, " --> $_") foreach (@parts);
+ }
+ }
+} # readConf
+
+# 0 1 2 3 4 5 6 7 8
+my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$timezone) = localtime(time);
+&readConf();
+
+(!defined $plugin_info{"$plugname.tag"}) and $plugin_info{"$plugname.tag"} = -1;
+
+($plugin_info{"$plugname.tag"} != $yday ||
+ $plugin_info{"$plugname.laenge"} != $Laenge ||
+ $plugin_info{"$plugname.breite"} != $Breite) and &calculateSun($yday, $timezone);
+
+# bis 1:00:27 Uhr warten, dann neu rechnen (ungerade Zeit zur Vermeidung von Plugin-Staus)
+$plugin_info{$plugname.'_cycle'} = (25-$hour) * 3600 - $min*60 - $sec + 27;
Property changes on: wiregate/plugin/generic/emx_sonne.pl
___________________________________________________________________
Added: svn:keywords
+ Id
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <e....@us...> - 2011-10-23 13:24:40
|
Revision: 469
http://openautomation.svn.sourceforge.net/openautomation/?rev=469&view=rev
Author: e.max
Date: 2011-10-23 13:24:34 +0000 (Sun, 23 Oct 2011)
Log Message:
-----------
knx-Decoder, erste Version
Added Paths:
-----------
wiregate/plugin/generic/emx_dcode.pl
Added: wiregate/plugin/generic/emx_dcode.pl
===================================================================
--- wiregate/plugin/generic/emx_dcode.pl (rev 0)
+++ wiregate/plugin/generic/emx_dcode.pl 2011-10-23 13:24:34 UTC (rev 469)
@@ -0,0 +1,495 @@
+# Plugin zur Erkennung eines Tastencodes
+# License: GPL (v2)
+# version von emax
+#
+# $Id$
+#
+# Das Plugin analysiert die Ereignisse einer gegebenen GA, und wertet die
+# Zeitabstaende zwischen den Telegrammen aus. Je nach erkanntem Muster wird
+# eine vorgegebene Funktion ausgefuehrt.
+#
+# Das Plugin ist z.B. als Notbehelf im Falle einer zugefallen Haustuer
+# gedacht.
+#
+# Funktionsweise:
+# ---------------
+# Mit jedem erkannten Tastendruck wird ein Zaehler inkrementiert, sofern der
+# letzte Tastendruck der betreffenden GA nicht laenger her ist als eine Sekunde
+# (einstellbar). Wird eine Pause von mehr als einer Sekunde erkannt, wird
+# der Wert des Zaehlers gespeichert, und der Zaehler auf Null gesetzt.
+# Entsprechen die so gesammelten Werte einem bestimmten Code, wird eine
+# vorgegebene Funktion ausgefuehrt.
+#
+# Auf diese Weise laesst sich jeder Lichtschalter z.B. als Tueroeffner
+# verwenden, wenn er in einem bestimmten Muster gedrueckt wird.
+#
+# Beispiel:
+# - Taster wird drei mal kurz hintereinander gedrueckt
+# - ueber eine Sekunde Pause
+# - Taster wird vier mal kurz hintereinander gedrueckt
+# - ueber eine Sekunde Pause
+# - Taster wird fuenf mal kurz hintereinander gedrueckt
+# - ueber eine Sekunde Pause
+#
+# wird dekodiert zu '345'. 10 Tastendruecke entsprechen einer '0', mehr als 10
+# Tastendruecke werden als Falscheingabe gewertet.
+#
+# Wird eine Pause von mehr als vier (einstellbar) Sekunden gemacht, wird der
+# Code als vollstaendig angesehen und ausgewertet. Nach der Auswertung werden
+# alle Zaehler wieder auf Null gesetzt, und von vorne begonnen.
+#
+# Nach drei Falscheingaben (einstellbar) wird die Auswertung fuer eine Minute
+# (einstellbar) blockiert. Nach jeder weiteren Falscheingabe verdoppelt sich
+# die Blockadezeit.
+#
+# Die GA kann weiterhin fuer andere Aufgaben verwendet werden, da das Script
+# nur zusammenhaengenede Eingaben auswertet, und Einzeleingaben ignoriert.
+#
+# Copyright: Edgar (emax) Hermanns, forum at hermanns punkt net
+#--------------------------------------------------------------------
+# CHANGE LOG:
+# ## who yyyymmdd bug# description
+# -- --- -------- ----- ----------------------------------------
+# . ... ........ ..... vorlage
+# 0 edh 20111023 ----- erste Version
+
+use POSIX;
+
+#-----------------------------------------------------------------------------
+# Defaults fuer konfigurierbare Werte, siehe conf.d/emx_dcode.conf
+#-----------------------------------------------------------------------------
+
+my $pauseSec = 1.0; # Pausenzeit, nach der eine Ziffer komplett ist
+my $completeAfter = 4; # Wartezeit in Sekunden, nach der der Code ausgewertet wird
+my $maxFails = 3; # Anzahl Fehlversuche
+my $blockPeriod = 30; # anfaengliche Blockadezeit in Sekunden.
+my $maxBlockPeriod = 3600; # maximale Blockadezeit
+
+my @Codes = ();
+
+#-----------------------------------------------------------------------------
+# ENDE Einstellungen
+#-----------------------------------------------------------------------------
+
+#-----------------------------------------------------------------------------
+# ACHTUNG: die Versionsnummer IMMER veraendern, wenn das script geaendert wurde.
+# Der Wert muss numerisch sein, egal ob hoeher oder niedriger als die
+# Vorversion. Es ist auch egal, ob die Version bereits verwendet wurde,
+# es kommt nur darauf an, das der Wert sich AENDERT.
+#-----------------------------------------------------------------------------
+my $version = 3;
+my $oneDay = (24 * 3600);
+
+use POSIX;
+my $dbg = ''; # :dJ:'; # ':ALL:dSS:dWS:dBS:state:code:cycle:counter:msg:cC:dJ:'; # ALL:alles,
+my %varInit = (initialized=>1, lastRun=>0, blockEnd=>0, curBlockPeriod=>0, curCode=>'', fails=>0, state=>'sleeping');
+my ($seconds, $uSec, $tStamp, $state, $lastRun, $dTime, $piPrefix, $minCodeLength);
+
+
+sub debug()
+{
+ my ($tag, $text) = (@_);
+ my $caller = (caller(1))[3];
+ ($dbg =~ /:ALL:|$tag/) and plugin_log($plugname, "DBG$tag$caller:"."$text");
+ return 1;
+} # debug()
+
+sub readConf
+{
+ my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
+ if (! -f $confFile)
+ {
+ plugin_log($plugname, " no conf file [$confFile] found.");
+ }
+ else
+ {
+ plugin_log($plugname, " reading conf file [$confFile].");
+ open(CONF, $confFile);
+ my @lines = <CONF>;
+ close($confFile);
+ my $result = eval("@lines");
+ ($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
+ if ($@)
+ {
+ plugin_log($plugname, "conf file [$confFile] returned:");
+ my @parts = split(/\n/, $@);
+ plugin_log($plugname, "--> $_") foreach (@parts);
+ }
+ }
+} # readConf
+
+sub doInit
+{
+ &debug(':DFR:', 'entering');
+
+ # Kontrollierte Startkonditionen setzen
+ # Die Funktion wird aufgerufen, wenn es der erste Lauf einer Plugin-Version
+ # ist. Es werden alle Werte aus alten Versionen aus %plugin_info geloescht.
+ # "$plugname.$version.initialized" wird gesetzt, und auch alle anderen
+ # kuenftig verwendeten plugin_info-Variablen angelegt.
+
+ plugin_log($plugname, "Starting plugin version $version.");
+
+ # obsolete Versionen von $plugin_info bereinigen
+ foreach (keys %plugin_info)
+ {
+ if (/^$plugname\.\d+\./)
+ {
+ delete $plugin_info{$_};
+ plugin_log($plugname, "deleted obsolete plugin_info[$_]");
+ }
+ }
+
+ # Variablen zuruecksetzen
+ &reset();
+
+ # Die minimale Codelaenge wird unten ermittelt.
+ # Kuerzere Codes werden verworfen.
+ $minCodeLength = 999;
+
+ foreach my $code (@Codes)
+ {
+ if (defined $code->{FromGA})
+ {
+ if (defined $code->{FromGA} && defined $code->{ToGA} &&
+ $code->{FromGA} eq $code->{ToGA})
+ {
+ plugin_log($plugname, "ERROR: source GA[$code->{FromGA}] and destination GA[$code->{FromGA}] are the same, entry ignored.");
+ next;
+ }
+
+ my $GA = $code->{FromGA};
+
+ if (defined $code->{Active} &&
+ $code->{Active} == 1)
+ {
+ plugin_log($plugname, "subscribing to GA[$GA]");
+ $plugin_subscribe{$GA}{$plugname} = 1;
+
+ # Ermitteln der minimalen Code-laenge.
+ # Alle codes, die kuerzer sind, werden ignoriert,
+ # und fuehren auch nicht zu Fehlern.
+ (length($code->{Code}) < $minCodeLength) and $minCodeLength = length($code->{Code});
+ }
+ elsif (exists $plugin_subscribe{$GA}{$plugname})
+ {
+ plugin_log($plugname, "deleting obsolete subscription to GA[$GA]");
+ delete $plugin_subscribe{$GA}{$plugname};
+ }
+ } # defined FromGA
+ } # each $code
+
+ $plugin_info{"$piPrefix.minCodeLength"} = $minCodeLength;
+
+ # debug
+ if ($dbg =~/:ALL:|:dFR:/)
+ {
+ foreach (keys %plugin_subscribe)
+ {
+ &debug(':DFR:', "pluginSubscribeKey[$_]");
+ }
+ } # debug
+ $plugin_info{$plugname.'_cycle'} = $oneDay;
+} # doFirstFRun
+
+sub setBlockingPeriod()
+{
+ &debug(":sBT:", "entering");
+ my $fails = $plugin_info{"$piPrefix.fails"} + 1;
+ plugin_log($plugname, "invalid code #[$fails]");
+ $plugin_info{"$piPrefix.fails"} = $fails;
+ if ($fails >= $maxFails)
+ {
+ my $curBlockPeriod = $plugin_info{"$piPrefix.curBlockPeriod"};
+ my $newBlockPeriod = ($curBlockPeriod == 0) ? $blockPeriod : $curBlockPeriod + $curBlockPeriod;
+ ($newBlockPeriod > $maxBlockPeriod) and $newBlockPeriod = $maxBlockPeriod;
+ plugin_log($plugname, "setting blocking period for GA[".$plugin_info{"$piPrefix.GA"}.
+ " from [$curBlockPeriod] sec to [$newBlockPeriod] sec");
+ $plugin_info{"$piPrefix.curBlockPeriod"} = $newBlockPeriod;
+ $plugin_info{"$piPrefix.blockEnd"} = $tStamp + $newBlockPeriod;
+ $plugin_info{"$piPrefix.state"} = 'blocked';
+ ($plugin_info{"$plugname".'_cycle'} < $newBlockPeriod) and $plugin_info{"$plugname".'_cycle'} = $newBlockPeriod;
+ }
+ else
+ {
+ # Wenn die maximale Anzahl Fehleingaben noch nicht erreicht wurde,
+ # werden diese Variablen zurueckgesetzt.
+ $plugin_info{"$piPrefix.curCode"} = '';
+ $plugin_info{"$piPrefix.state"} = 'sleeping';
+ $plugin_info{"$plugname".'_cycle'} = $oneDay;
+ }
+} # setBlockingPeriod
+
+sub checkCode()
+{
+ &debug(':cC:', 'entering');
+ # Es werden alle %Codes Eintraege auf einen passenden code ueberprueft.
+ # Da meherere Codes je GA verarbeitet werden koennen, ist der Eintrag
+ # abhaengig von
+ # - sendender GA
+ # - ermitteltem Code
+ # Wenn diese beiden Werte uebereinstimmen, wird der %Codes-Eintrag zurueckgegeben.
+ # Stimmt kein Eintrag ueberein, wird 'undef' zurueckgegeben.
+
+ my $curCode = $plugin_info{"$piPrefix.curCode"};
+ &debug(':cC:', "curCode[$curCode]");
+ my $idx = -1;
+ foreach my $code (@Codes)
+ {
+ ++$idx;
+ if (defined $code->{FromGA} && defined $code->{ToGA} &&
+ $code->{FromGA} eq $code->{ToGA})
+ {
+ plugin_log($plugname, "ERROR: source GA[$code->{FromGA}]and destination GA[$code->{FromGA}] are the same, entry ignored.");
+ next;
+ }
+
+ (!defined $code->{Active} || !$code->{Active}) and
+ &debug("cC:", "not Active") and next;
+ (!defined $code->{Code} || $code->{Code} ne $plugin_info{"$piPrefix.curCode"})
+ and &debug("cC:", "no Code") and next;
+ (!defined $code->{FromGA} || $code->{FromGA} ne $plugin_info{"$piPrefix.GA"})
+ and &debug("cC:", "not FromGA")and next;
+ (defined $code->{FromPA} && $code->{FromPA} ne $plugin_info{"$piPrefix.PA"})
+ and &debug("cC:", "not FromPA")and next;
+ &debug(':cC:', "found Code[$curCode]");
+ return $idx;
+ }
+ return undef;
+}
+
+sub doJob()
+{
+ &debug(':dJ:', 'entering');
+ my $codeIdx = shift;
+ my $codeCount = @Codes;
+
+ &debug(":dJ:", "codeCount[$codeCount]");
+
+ # Hier werden alle %Codes ausgefuehrt, die den aktuellen parametern entsprechen.
+ # Es koennen hinterainander mehrere Kommandos fuer den gleichen Code ausfuehrt
+ # werden. Ebenso unterschiedliche Kommandos vom gleichenm Taster, je nach Code.
+
+ for (; $codeIdx < $codeCount; ++$codeIdx)
+ {
+ # es werden alle Eintraege verarbeitet, die dem Filter entsprechen
+ my $code = $Codes[$codeIdx];
+ (!defined $code->{Active} || !$code->{Active}) and next;
+ (!defined $code->{Code} || $code->{Code} ne $plugin_info{"$piPrefix.curCode"}) and next;
+ (!defined $code->{FromGA} || $code->{FromGA} ne $plugin_info{"$piPrefix.GA"}) and next;
+ (defined $code->{FromPA} && $code->{FromPA} ne $plugin_info{"$piPrefix.PA"}) and next;
+ (defined $code->{Log} && $code->{Log}) and
+ plugin_log($plugname, 'executing from PA['.$plugin_info{"$piPrefix.PA"}.
+ '] From GA['.$plugin_info{"$piPrefix.GA"}.
+ '], sending ['.$code->{Value}.
+ '] to ['.$code->{ToGA}.'].');
+ knx_write($code->{ToGA},$code->{Value}, $code->{DPT});
+ }
+} # doJob
+
+sub reset()
+{
+ &debug(':RES:', 'entering');
+ # Alle Variablen und '$state' zuruecksetzen
+ foreach (keys %varInit)
+ {
+ &debug(':RES:',"(re)setting [$piPrefix.$_] to [$varInit{$_}]");
+ $plugin_info{"$piPrefix.$_"} = $varInit{$_}
+ }
+
+ $plugin_info{"$plugname".'_cycle'} = $oneDay;
+} # reset()
+
+sub doSleepingState()
+{
+ &debug(':dSS:', 'entering');
+ $plugin_info{"$piPrefix.lastRun"} = $tStamp;
+
+ # Wird ausgefuehrt, wenn das Plugin das erste Mal getriggert wird nach
+ # - der Initialisierung
+ # - einem vollstaendigen Code oder
+ # - dem Status 'blocked'
+
+ # Wenn keine GA geliefert wurde, geschah der Aufruf aufgrund eines _cycle Timeouts.
+ # Dann ist nichts weiter zu tun.
+ if (!defined $msg{'dst'})
+ {
+ # refresh _cycle
+ $plugin_info{"$plugname".'_cycle'} = $oneDay;
+ return;
+ };
+
+ &debug(':dSS:', 'setting GA/PA filters');
+
+ # GA & PA merken.
+ # Bis der Code vollstaendig ist, werden nur noch Telegramme dieser GA und von
+ # dieser PA ausgwertet. Alle anderen telegramme werden so lange ingnoriert.
+ $plugin_info{"$piPrefix.GA"} = $msg{'dst'};
+ $plugin_info{"$piPrefix.PA"} = $msg{'src'};
+ $plugin_info{"$piPrefix.counter"} = 1;
+ $plugin_info{"$piPrefix.curCode"} = '';
+ $plugin_info{"$plugname".'_cycle'} = $completeAfter;
+ $plugin_info{"$piPrefix.state"} = 'waiting';
+} # doSleepingState
+
+sub doWaitingState()
+{
+ &debug(':dWS:', 'entering');
+
+ # errechne abgelaufene Zeit
+ $lastRun = $plugin_info{"$piPrefix.lastRun"};
+ $dTime = $tStamp - $lastRun;
+ &debug(':dWS:', "dTime[$dTime]");
+
+ if (!defined $msg{'dst'})
+ {
+ &debug(':dWS:', 'no GA');
+ if ($dTime < $pauseSec)
+ {
+ # Aus einem mir unbekannten Grunde passiert es, dass
+ # das Script aufgerufen wird, ohne das eine GA geliefert wird,
+ # obwohl kein _cycle Timeout stattfand.
+ # Solche Ereignisse werden ignoriert.
+ return;
+ }
+
+ $plugin_info{"$piPrefix.lastRun"} = $tStamp;
+
+ # Keine GA, aber _cycle Timeout
+ # Wenn zwischenzeitlich Tastendruecke gezaehlt wurden,
+ # diese zum Code hinzufuegen.
+ if ($plugin_info{"$piPrefix.counter"})
+ {
+ ($plugin_info{"$piPrefix.counter"} == 10) and $plugin_info{"$piPrefix.counter"} = 0;
+ $plugin_info{"$piPrefix.curCode"} .= $plugin_info{"$piPrefix.counter"};
+ $plugin_info{"$piPrefix.counter"} = 0;
+ plugin_log($plugname, 'current code['.$plugin_info{"$piPrefix.curCode"}.']');
+ }
+
+ &debug(':dWS:', "curCode[".$plugin_info{"$piPrefix.curCode"}.']');
+ if (length($plugin_info{"$piPrefix.curCode"} < $minCodeLength))
+ {
+ plugin_log($plugname, 'code too short, discarded.');
+ &reset();
+ return;
+ }
+
+ my $codeIdx = &checkCode();
+ if (defined $codeIdx)
+ {
+ plugin_log($plugname, 'code accepted.');
+ &doJob($codeIdx);
+ &reset();
+ }
+ else
+ {
+ plugin_log($plugname, 'code rejected.');
+ &setBlockingPeriod();
+ }
+ return;
+ } # ... no GA
+
+ $plugin_info{"$piPrefix.lastRun"} = $tStamp;
+
+ # Ein GA-Event
+ # Ausfiltern, sofern nicht die aktuelle GA oder nicht von der gleichen PA
+ if ($msg{'dst'} ne $plugin_info{"$piPrefix.GA"} ||
+ $msg{'src'} ne $plugin_info{"$piPrefix.PA"})
+ {
+ # Das Event wird ignoriert.
+ # Verwerfen und neue _cycle zeit ausrechnen, damit der naechste
+ # Aufruf zum (halbwegs) richtigen Zeitpunkt stattfindet.
+ $plugin_info{$plugname.'_cycle'} = $completeAfter - $dTime;
+ return;
+ }
+
+ # Das Ereignis kam von 'unserer' Quelle und ist fuer 'unsere' Zieladresse.
+ if ($dTime < $pauseSec)
+ {
+ if ($plugin_info{"$piPrefix.counter"} == 10)
+ {
+ # error
+ &debug(':dWS:', "counter too big[".$plugin_info{"$piPrefix.counter"}.']');
+ &setBlockingPeriod();
+ }
+ else
+ {
+ ++$plugin_info{"$piPrefix.counter"};
+ }
+ return;
+ }
+ else # Pause entdeckt
+ {
+ &debug(':dWS:', 'pause detected, counter is '.$plugin_info{"$piPrefix.counter"});
+ # sofern zwischenzeitlich Ereignisse gezaehlt wurde, diese dem Code
+ # hinzufuegen und den Zaehler zuruecksetzen.
+ if ($plugin_info{"$piPrefix.counter"})
+ {
+ &debug(':dWS:', "assembling code");
+ ($plugin_info{"$piPrefix.counter"} == 10) and $plugin_info{"$piPrefix.counter"} = 0;
+ $plugin_info{"$piPrefix.curCode"} .= $plugin_info{"$piPrefix.counter"};
+ plugin_log($plugname, 'current code['.$plugin_info{"$piPrefix.curCode"}.']');
+ }
+ $plugin_info{"$piPrefix.counter"} = 1;
+ &debug(':dWS:', "after pause curCode[".$plugin_info{"$piPrefix.curCode"}.']');
+ }
+} # doWaitingState
+
+sub doBlockedState()
+{
+ &debug(':dBS:', 'entering');
+ $plugin_info{"$piPrefix.lastRun"} = $tStamp;
+
+ if ($tStamp >= $plugin_info{"$piPrefix.blockEnd"})
+ {
+ plugin_log($plugname, 'blocking time expired, going to sleep');
+ &debug(':dBS:', 'blocking time expired, resetting block');
+ $plugin_info{"$piPrefix.curCode"} = '';
+ $plugin_info{"$piPrefix.state"} = 'sleeping';
+ $plugin_info{"$plugname".'_cycle'} = $oneDay;
+ }
+} # doBlockedState
+
+#=============================================================================
+# main()
+#=============================================================================
+
+&readConf();
+
+($seconds,$uSec) = gettimeofday();
+$tStamp = $seconds + $uSec/1000000;
+$lastRun = 0;
+$piPrefix = "$plugname.$version";
+
+my $oldCycleTime = $plugin_info{"$plugname".'_cycle'};
+$minCodeLength = $plugin_info{"$piPrefix.minCodeLength"};
+
+# ggf. neue Version initialiseren
+if (!defined $plugin_info{"$piPrefix.initialized"})
+{
+ &doInit();
+ return;
+}
+
+$state = $plugin_info{"$piPrefix.state"};
+&debug(':state:', "on entry state[$state]");
+
+&debug(':msg:', "msg debug -------------");
+&debug(':msg:', "msg[$_]=$msg{$_}") foreach (keys %msg);
+&debug(':msg:', "/msg debug ------------");
+
+if ($state eq 'sleeping') { &doSleepingState(); }
+elsif ($state eq 'waiting') { &doWaitingState(); }
+elsif ($state eq 'blocked') { &doBlockedState(); }
+else {
+ plugin_log($plugname, "FATAL: unknown state[$state], resetting");
+ &doInit();
+}
+
+&debug(':state:', "on exit state[".$plugin_info{"$piPrefix.state"}.']');
+&debug(':counter:', "on exit counter[".$plugin_info{"$piPrefix.counter"}.']');
+&debug(':code:', "on exit code[".$plugin_info{"$piPrefix.curCode"}.']');
+&debug(':cycle:', "on exit cycle[".$plugin_info{"$plugname".'_cycle'}.']');
+
+($oldCycleTime != $plugin_info{"$plugname".'_cycle'}) and
+ plugin_log($plugname, 'cycle time set to '.$plugin_info{"$plugname".'_cycle'}.' seconds');
Property changes on: wiregate/plugin/generic/emx_dcode.pl
___________________________________________________________________
Added: svn:keywords
+ Id
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <e....@us...> - 2011-10-23 13:23:51
|
Revision: 468
http://openautomation.svn.sourceforge.net/openautomation/?rev=468&view=rev
Author: e.max
Date: 2011-10-23 13:23:44 +0000 (Sun, 23 Oct 2011)
Log Message:
-----------
umstellung auf conf.d Verzeichnis
Modified Paths:
--------------
wiregate/plugin/generic/emx_uhr.pl
Modified: wiregate/plugin/generic/emx_uhr.pl
===================================================================
--- wiregate/plugin/generic/emx_uhr.pl 2011-10-23 12:12:22 UTC (rev 467)
+++ wiregate/plugin/generic/emx_uhr.pl 2011-10-23 13:23:44 UTC (rev 468)
@@ -1,19 +1,20 @@
# Plugin zum Zeitabhaengigen Schalten von GA's (Schaltuhr)
# License: GPL (v2)
# version von emax
-
-# Plugin zum Zeitabhaengigen Schalten von GA's (Schaltuhr)
-# License: GPL (v2)
-# version von emax
#
# $Id$
#
-# Copyright: Edgar (emax) Hermanns, emax at berlios Punkt de
+# Copyright: Edgar (emax) Hermanns, forum at hermanns punkt net
#--------------------------------------------------------------------
# CHANGE LOG:
# ## who yyyymmdd bug# description
# -- --- -------- ----- ----------------------------------------
# . ... ........ ..... vorlage
+# 5 edh 20111023 ..... conf.d Verzeichnis eingefuehrt. Alle
+# Einstellungen werden kuenftig ueber
+# ueber eine entsprechende Konfigura-
+# tionsdatei conf.d/plugin.conf vorge-
+# nommen, Einzelheiten siehe dort.
# 4 edh 20111010 ..... - Null-Werte wurden falsch verarbeitet
# - Zyklusberechnung konnte wg. Rundung
# in underruns (Minuten-Unterschreitung)
@@ -34,46 +35,28 @@
# 1 edh 20110807 ----- wg. utf-8 Zirkus Umlaute in ae/ue/oe geaendert
# 0 edh 20110708 ----- erste Version
-#-----------------------------------------------------------------------------
-# Einstellungen
-#-----------------------------------------------------------------------------
+use POSIX;
-
-my @Zeiten =
- (
- # Beispiele
- { Name=>'Test', Aktiv=>'0', Std=>undef, Min=>undef, MTag=>undef, Mon=>undef, WTag=>undef, Wert=>'1', DPT=>'1', GA=>'1/1/30', Log=>'1' },
- { Name=>'Bewaesserung', Aktiv=>'0', Std=>'7', Min=> '0', MTag=>'3', Mon=>'4-9', WTag=>'1-5', Wert=>'1', DPT=>'1', GA=>'1/1/30' },
- { Name=>'AussenlichtEin', Aktiv=>'0', Std=>'19', Min=>'30', MTag=>'4', Mon=>undef, WTag=>'1,3,5', Wert=>'1', DPT=>'1', GA=>'1/2/40' },
- { Name=>'AussenlichtAus', Aktiv=>'0', Std=>'7', Min=> '0', MTag=>undef, Mon=>undef, WTag=>'2,4,6', Wert=>'0', DPT=>'1', GA=>'1/2/40' }
- );
-
#-----------------------------------------------------------------------------
-# ENDE Einstellungen
+# konfigurierbare Werte, siehe conf.d/emx_uhr.conf
#-----------------------------------------------------------------------------
+my @Zeiten = ();
+my $slotEnd = 3;
-use POSIX;
-
#-----------------------------------------------------------------------------
-# Eigenen Aufruf-Zyklus setzen
+# Aufruf-Zyklus setzen
# Das script verarbeitet keine Sekunden, weshalb die kleinste
-# Granulaitaet ohne zusaetzlioche Statusverarbeitung eine Minute ist.
+# Granularitaet ohne zusaetzlioche Statusverarbeitung eine Minute ist.
#-----------------------------------------------------------------------------
my $cycleTime = 60;
#-----------------------------------------------------------------------------
-# definiert die Sekunde, ab der neu synchronisiert wird
-# ACHTUNG: Sollte nicht kleiner als 1 Sekunde sein.
-#-----------------------------------------------------------------------------
-my $slotEnd = 1;
-
-#-----------------------------------------------------------------------------
# Die Versionsnummer is Teil des plugin_info hashes und dient
-# dazu, dass das script definierte anfangskonditionen findet
+# dazu, dass das script definierte Anfangskonditionen findet
# auch ohne den wiregated neu starten zu muessen. Die Nummer
# einfach nach einer Aenderung des scripts um eins erhoehen.
#-----------------------------------------------------------------------------
-my $version = 8;
+my $version = 9;
#-----------------------------------------------------------------------------
# Numerischen string als Zahl zurückgeben
@@ -90,7 +73,6 @@
return $value;
} # toNumber
-
#-----------------------------------------------------------------------------
# Auswertung von Bereichs und Listenvergleichen
# Prueft, ob ein Wert zu einer Liste oder in einen Bereich passt
@@ -112,13 +94,13 @@
} # matches
#-----------------------------------------------------------------------------
-# Zykluszeit setzen
+# Zykluszeit berechnen und neu setzen
#-----------------------------------------------------------------------------
sub setCycle
{
my ($seconds,$uSec) = gettimeofday();
my $curSec = $seconds%60;
- if ( $curSec >= $slotEnd)
+ if ($curSec >= $slotEnd)
{
$plugin_info{$plugname.'_cycle'} = $cycleTime - $curSec - $uSec/1000000 + 0.1; # avoid rounding underruns
plugin_log($plugname, "cycle time set to $plugin_info{$plugname.'_cycle'} second");
@@ -129,12 +111,37 @@
}
}
+sub readConf
+{
+ my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
+ if (! -f $confFile)
+ {
+ plugin_log($plugname, " no conf file [$confFile] found.");
+ }
+ else
+ {
+ plugin_log($plugname, " reading conf file [$confFile].");
+ open(CONF, $confFile);
+ my @lines = <CONF>;
+ close($confFile);
+ my $result = eval("@lines");
+ ($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
+ if ($@)
+ {
+ plugin_log($plugname, "conf file [$confFile] returned:");
+ my @parts = split(/\n/, $@);
+ plugin_log($plugname, "--> $_") foreach (@parts);
+ }
+ }
+} # readConf
+
#=============================================================================
# main()
#=============================================================================
my ($curSec,$curMin,$curStu,$curMTag,$curMon,$curJahr,$curWTag,$curJTag,$isdst) = localtime(time);
$curJahr += 1900;
+&readConf();
# kontrollierte Startkonditionen setzen
if (!defined $plugin_info{"$plugname.$version.firstRun"})
@@ -148,12 +155,12 @@
delete $plugin_info{$_};
plugin_log($plugname, "deleted plugin_info[$_]");
}
- }
+ }
$plugin_info{"$plugname.$version.firstRun"} = 1;
&setCycle();
}
-# beim ersten mal nur ausfuehren, wenn inmnerhalb des slots
+# beim ersten Mal nur ausfuehren, wenn innerhalb des slots
($curSec >= $slotEnd && $plugin_info{"$plugname.$version.firstRun"} == 1) and return;
# pruefen, ob in dieser Minute bereits ausgefuehrt
@@ -165,23 +172,20 @@
foreach my $Zeit (@Zeiten)
{
- (defined $Zeit->{Aktiv} && !$Zeit->{Aktiv}) and next;
-
- (defined $Zeit->{Min} && !&matches($curMin, $Zeit->{Min})) and next;
- (defined $Zeit->{Std} && !&matches($curStu, $Zeit->{Std})) and next;
- (defined $Zeit->{MTag} && !&matches($curMTag, $Zeit->{MTag})) and next;
- (defined $Zeit->{Mon} && !&matches($curMon, $Zeit->{Mon})) and next;
- (defined $Zeit->{WTag} && !&matches($curWTag, $Zeit->{WTag})) and next;
- (defined $Zeit->{Log} && $Zeit->{Log} eq '1') and
+ (defined $Zeit->{Aktiv} && !$Zeit->{Aktiv}) and next;
+ (defined $Zeit->{Min} && !&matches($curMin, $Zeit->{Min})) and next;
+ (defined $Zeit->{Std} && !&matches($curStu, $Zeit->{Std})) and next;
+ (defined $Zeit->{MTag} && !&matches($curMTag, $Zeit->{MTag})) and next;
+ (defined $Zeit->{Mon} && !&matches($curMon, $Zeit->{Mon})) and next;
+ (defined $Zeit->{WTag} && !&matches($curWTag, $Zeit->{WTag})) and next;
+ (defined $Zeit->{Log} && $Zeit->{Log} eq '1') and
plugin_log($plugname, "Sending Value[$Zeit->{Wert}] to GA[$Zeit->{GA}], $Zeit->{Name}");
knx_write($Zeit->{GA},$Zeit->{Wert}, $Zeit->{DPT});
-}
+} # foreach (@Zeiten)
$plugin_info{"$plugname.$version.lastMinute"} = $curMin;
# ggf. Zykluszeit korrigieren
&setCycle();
$plugin_info{"$plugname.$version.firstRun"} = 0;
-
-
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-23 12:12:28
|
Revision: 467
http://openautomation.svn.sourceforge.net/openautomation/?rev=467&view=rev
Author: mayerch
Date: 2011-10-23 12:12:22 +0000 (Sun, 23 Oct 2011)
Log Message:
-----------
Initial upload of the Multi RTR plugin (version 0.5)
Added Paths:
-----------
wiregate/plugin/generic/Multi-RTR.pl
Added: wiregate/plugin/generic/Multi-RTR.pl
===================================================================
--- wiregate/plugin/generic/Multi-RTR.pl (rev 0)
+++ wiregate/plugin/generic/Multi-RTR.pl 2011-10-23 12:12:22 UTC (rev 467)
@@ -0,0 +1,252 @@
+#############################################################################
+# Plugin: Multi RTR
+# V0.5 2011-09-18
+# Copyright: Christian Mayer (mail at ChristianMayer.de)
+# License: GPL (v3)
+#
+# Plugin for multiple RTR (room temperature controllers) by using a PI
+# controller
+#
+# Suggested settings:
+# ===================
+# floor heating: ProportionalGain = 5 K, IntegralTime = 240 min (*)
+# hot water heating: ProportionalGain = 5 K, IntegralTime = 150 min (*)
+#
+# Uebersetzungshilfe:
+# ===================
+# ProportionalGain = Proportionalbereich in Kelvin
+# IntegralTime = Nachstellzeit in Minuten
+#
+# ---------
+# (*): GIRA manual for TS2+ with RTR 1052-00 / 1055-00, 01/06, page 71
+#############################################################################
+
+#############################################################################
+# Configuration:
+my %controllers = (
+ '130_Hobby1_HK' => {
+ 'SetPointGA' => '3/3/130', 'SetPointRRD' => '130_Hobby1_HK_Sollwert',
+ 'SensorGA' => '4/0/130',
+ 'ActuatorGA' => '3/0/130', 'ActuatorRRD' => '130_Hobby1_HK_Regelung',
+ 'ProportionalGain' => 5, 'IntegralTime' => 150
+ },
+ '140_Hobby2_HK' => {
+ 'SetPointGA' => '3/3/140', 'SetPointRRD' => '140_Hobby2_HK_Sollwert',
+ 'SensorGA' => '4/0/140',
+ 'ActuatorGA' => '3/0/140', 'ActuatorRRD' => '140_Hobby2_HK_Regelung',
+ 'ProportionalGain' => 5, 'IntegralTime' => 240
+ },
+);
+my %default = (
+ 'SetPointDPT' => 9.001,
+ 'SensorDPT' => 9.001,
+ 'ActuratorDPT' => 5,
+ 'DisableDPT' => 1,
+ 'SetPointInit' => 21.0,
+ 'SetPointLFlag' => 1, # true
+ 'ActuatorLFlag' => 1, # true
+);
+
+my $GlobalDisableGA = '14/5/50';
+
+my $reset = 0; # set to 1 to reset the states, run script and change to 0 again
+my $show_debug = 1; # switches debug information that will be shown in the log
+
+#############################################################################
+# Do NOT change anything below!
+#############################################################################
+my $busActive = !(!keys %msg); # true if script was called due to bus traffic
+
+my $ret_val = '';
+#############################################################################
+# Initialisation
+if( !$busActive ) # unnecesary during bus traffic
+{
+ for my $this_controller_name ( keys %controllers )
+ {
+ my %this_controller = (%{$controllers{ $this_controller_name }}, %default);
+
+ # Initialise controller state variables
+ if( $reset or not exists $plugin_info{ $plugname . '_' . $this_controller_name . '_Actuator' } )
+ {
+ $plugin_info{ $plugname . '_' . $this_controller_name . '_SetPoint' } = $this_controller{ 'SetPointInit' };
+ $plugin_info{ $plugname . '_' . $this_controller_name . '_Integral' } = 0;
+ $plugin_info{ $plugname . '_' . $this_controller_name . '_Actuator' } = 0; # Reset
+ if( defined $this_controller{ 'SetPointGA' } and defined $this_controller{ 'SetPointDPT' } )
+ {
+ knx_write( $this_controller{ 'SetPointGA' }, $this_controller{ 'SetPointInit' }, $this_controller{ 'SetPointDPT' } ); # send initial value
+ }
+ # The ActuatorGA doesn't need to be sent here as !$busActive will also
+ # cause the first round of controller calculations
+ }
+
+ # subscribe SetPointGA
+ if( defined $this_controller{ 'SetPointGA' } )
+ {
+ $plugin_subscribe{ $this_controller{ 'SetPointGA' } }{ $plugname } = 1;
+ }
+ # subscribe SensorGA
+ if( defined $this_controller{ 'SensorGA' } )
+ {
+ $plugin_subscribe{ $this_controller{ 'SensorGA' } }{ $plugname } = 1;
+ }
+ # subscribe ActuatorGA
+ if( defined $this_controller{ 'ActuatorGA' } )
+ {
+ $plugin_subscribe{ $this_controller{ 'ActuatorGA' } }{ $plugname } = 1;
+ }
+ # subscribe DisableGA
+ if( defined $this_controller{ 'DisableGA' } )
+ {
+ $plugin_subscribe{ $this_controller{ 'DisableGA' } }{ $plugname } = 1;
+
+ $ret_val .= $this_controller_name . ' disabled?';
+ my $active = knx_read( $this_controller{ 'DisableGA' } ) || 1; # active if unreadable
+ if ( !int($active) and defined $this_controller{ 'ActuatorGA' } ) {
+ if (knx_read( $this_controller{ 'ActuatorGA' } ) ne 0) { # only if not already 0
+ knx_write( $this_controller{ 'ActuatorGA' }, 0, $this_controller{ 'ActuatorDPT' } );
+ }
+ $plugin_info{ $plugname . '_' . $this_controller_name . '_Integral' } = 0;
+ $plugin_info{ $plugname . '_' . $this_controller_name . '_Actuator' } = 0; # Reset
+ $ret_val .= ' yes';
+ } else {
+ $ret_val .= ' no';
+ }
+ }
+ }
+}
+
+# Set the update cycle to one minute
+$plugin_info{$plugname.'_cycle'} = 60;
+
+#############################################################################
+# Handle the bus traffic
+my $SetPointChange = 0;
+if( $busActive )
+{
+ # Early exit during a response messeage - it's usually from us...
+ if( $msg{'apci'} eq 'A_GroupValue_Response' )
+ {
+ return;
+ }
+
+ # a linear search isn't smart but OK for only a few states:
+ for my $this_controller_name ( keys %controllers )
+ {
+ my %this_controller = (%{$controllers{ $this_controller_name }}, %default);
+ if( $msg{'apci'} eq 'A_GroupValue_Read' )
+ {
+ if( $msg{'dst'} eq $this_controller{ 'SetPointGA' } and $this_controller{ 'SetPointLFlag' })
+ {
+ # A read request for this GA was sent on the bus and the L-flag is set
+ my $value = $plugin_info{ $plugname . '_' . $this_controller_name . '_SetPoint' };
+ my $DPT = $this_controller{ 'SetPointDPT' };
+ knx_write( $msg{'dst'}, $value, $DPT, 1 ); # send response
+ $ret_val .= 'read(' . $msg{'dst'} . '=' . $this_controller_name . ') SetPoint -> ' . $value;
+ } elsif( $msg{'dst'} eq $this_controller{ 'ActuatorGA' } and $this_controller{ 'ActuatorLFlag' })
+ {
+ # A read request for this GA was sent on the bus and the L-flag is set
+ my $value = $plugin_info{ $plugname . '_' . $this_controller_name . '_Actuator' };
+ my $DPT = $this_controller{ 'ActuatorDPT' };
+ knx_write( $msg{'dst'}, $value, $DPT, 1 ); # send response
+ $ret_val .= 'read(' . $msg{'dst'} . '=' . $this_controller_name . ') Actuator -> ' . $value;
+ }
+ }
+ elsif($msg{'apci'} eq 'A_GroupValue_Write')
+ {
+ if( $msg{'dst'} eq $this_controller{ 'SetPointGA' } )
+ {
+ # A new(?) setpoint was sent on the bus => update internal state
+ # read from eibd cache, so we'll get the cast for free:
+ my $value = knx_read( $msg{'dst'}, 0, $this_controller{ 'SetPointDPT' } );
+ $plugin_info{ $plugname . '_' . $this_controller_name . '_SetPoint' } = $value;
+ $SetPointChange = 1;
+ $ret_val .= 'write(' . $msg{'dst'} . '=' . $this_controller_name . ') ' . $value . ' -> SetPoint';
+ }
+ }
+ }
+} # if( $busActive )
+
+#############################################################################
+# Update the controllers
+if( !$busActive or $SetPointChange ) # only at init, cycle or set point change
+{
+ my $dt = time() - $plugin_info{ $plugname . '_tlast' };
+ $plugin_info{ $plugname . '_tlast' } = time();
+ $ret_val .= 'dt: ' . $dt . '; ';
+
+ for my $this_controller_name ( keys %controllers )
+ {
+ my %this_controller = (%{$controllers{ $this_controller_name }}, %default);
+ my $prefix = $plugname . '_' . $this_controller_name;
+
+ my $Sensor = knx_read( $this_controller{ 'SensorGA' }, 0, $this_controller{ 'SensorDPT' } );
+ my $SetPoint = $plugin_info{ $prefix . '_SetPoint' };
+ my $old = $plugin_info{ $prefix . '_Actuator' };
+
+ my $kp = 1.0 / $this_controller{ 'ProportionalGain' };
+ my $error = $SetPoint - $Sensor;
+
+ # caclulate the I part of the PI controller:
+ $plugin_info{ $prefix . '_Integral' } = $plugin_info{ $prefix . '_Integral' } + $error * $dt;
+ my $integral = $plugin_info{ $prefix . '_Integral' } / (60.0 * $this_controller{ 'IntegralTime' });
+
+ # put together the PI controller:
+ $plugin_info{ $prefix . '_Actuator' } = 100.0 * $kp * ($error + $integral);
+
+ # clip at maximum to avoid windup:
+ if( $plugin_info{ $prefix . '_Actuator' } > 100 )
+ {
+ $ret_val .= '[>]';
+ $plugin_info{ $prefix . '_Actuator' } = 100;
+ $plugin_info{ $prefix . '_Integral' } = (1.0 / $kp) * 60.0 * $this_controller{ 'IntegralTime' };
+ }
+ # clip at minimum
+ if( $plugin_info{ $prefix . '_Actuator' } < 0 or $plugin_info{ $prefix . '_Integral' } < 0 )
+ {
+ $ret_val .= '[<]';
+ $plugin_info{ $prefix . '_Actuator' } = 0 if $plugin_info{ $prefix . '_Actuator' } < 0;
+ $plugin_info{ $prefix . '_Integral' } = 0;
+ }
+ #$plugin_info{ $prefix . '_Actuator' } = round( $plugin_info{ $prefix . '_Actuator' } );
+
+ # If a GA is defined, send the new actuator value
+ if( defined $this_controller{ 'ActuatorGA' } and ($old ne $plugin_info{ $prefix . '_Actuator' }) )
+ {
+ knx_write( $this_controller{ 'ActuatorGA' }, $plugin_info{ $prefix . '_Actuator' }, $this_controller{ 'ActuatorDPT' } );
+ }
+
+ if( defined $this_controller{ 'SetPointRRD' } )
+ {
+ update_rrd( $this_controller{ 'SetPointRRD' }, '', $SetPoint );
+ }
+ if( defined $this_controller{ 'ActuatorRRD' } )
+ {
+ update_rrd( $this_controller{ 'ActuatorRRD' }, '', $plugin_info{ $prefix . '_Actuator' } );
+ }
+
+ $ret_val .= $this_controller_name . ': ' . $SetPoint . '<>' . $Sensor . '=>' . $plugin_info{ $prefix . '_Actuator' } . ' [' . ($error*$kp) . '/' . $integral*$kp . ']; ';
+ }
+}
+
+if( $show_debug ) { return $ret_val; }
+return;
+
+#############################################################################
+# Version history:
+# ================
+#
+# 0.5:
+# ------
+# * initial release
+#
+#############################################################################
+# ToDo:
+# =====
+# * Limit bus traffic by sending actuator values after a change that is bigger
+# than x%
+# * Force sending of actuator after x seconds/minutes so that the watchdog in
+# the actuator doesn't time out
+# * Add GA for sending delta values for the setpoint
+# * External Config
+#############################################################################
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-22 20:57:50
|
Revision: 466
http://openautomation.svn.sourceforge.net/openautomation/?rev=466&view=rev
Author: mayerch
Date: 2011-10-22 20:57:43 +0000 (Sat, 22 Oct 2011)
Log Message:
-----------
Cleaned up relative (i.e. sending the delta values) and absolute (i.e. sending the resulting new value)
Modified Paths:
--------------
CometVisu/trunk/visu/designs/structure_pure.js
Modified: CometVisu/trunk/visu/designs/structure_pure.js
===================================================================
--- CometVisu/trunk/visu/designs/structure_pure.js 2011-10-22 20:16:45 UTC (rev 465)
+++ CometVisu/trunk/visu/designs/structure_pure.js 2011-10-22 20:57:43 UTC (rev 466)
@@ -744,7 +744,7 @@
'styling' : $p.attr('styling'),
'value' : $p.attr('downvalue') || 0,
'align' : $p.attr('align'),
- 'change' : $p.attr('change') || 'absolute',
+ 'change' : $p.attr('change') || 'relative',
'min' : parseFloat($p.attr('min')) || 0,
'max' : parseFloat($p.attr('max')) || 255,
'type' : 'switch'
@@ -762,7 +762,7 @@
'styling' : $p.attr('styling'),
'value' : $p.attr('upvalue') || 1,
'align' : $p.attr('align'),
- 'change' : $p.attr('change') || 'absolute',
+ 'change' : $p.attr('change') || 'relative',
'min' : parseFloat($p.attr('min')) || 0,
'max' : parseFloat($p.attr('max')) || 255,
'type' : 'switch'
@@ -804,14 +804,14 @@
action: function() {
var data = $(this).data();
var value = parseFloat($(this).parent().find('.switchInvisible').data('basicvalue'));
- var relativevalue = value + parseFloat(data.value);
+ var absoluteValue = value + parseFloat(data.value);
for( var addr in data.address )
{
if( data.address[addr][1] == true ) continue; // skip read only
- if( data.change == 'relative' )
+ if( data.change == 'absolute' )
{
- if (relativevalue < data.min || relativevalue > data.max) continue; // check min/max
- visu.write( addr.substr(1), transformEncode( data.address[addr][0], relativevalue ) );
+ if (absoluteValue < data.min || data.max < absoluteValue) continue; // check min/max
+ visu.write( addr.substr(1), transformEncode( data.address[addr][0], absoluteValue ) );
} else {
visu.write( addr.substr(1), transformEncode( data.address[addr][0], data.value ) );
}
@@ -827,7 +827,7 @@
align: { type: 'string' , required: false },
infoposition: { type: 'list' , required: true , list: {0: 'Info/Down/Up', 1: 'Down/Info/Up', 2: 'Down/Up/Info'} },
format: { type: 'string' , required: false },
- change: { type: 'list' , required: false , list: {'relative': 'relative', 'absolute': 'absolute'} },
+ change: { type: 'list' , required: false , list: {'relative': 'Send relative/delta values', 'absolute': 'Send absolute values'} },
min: { type: 'numeric' , required: false },
max: { type: 'numeric' , required: false }
},
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-22 20:16:52
|
Revision: 465
http://openautomation.svn.sourceforge.net/openautomation/?rev=465&view=rev
Author: mayerch
Date: 2011-10-22 20:16:45 +0000 (Sat, 22 Oct 2011)
Log Message:
-----------
Added inital JSON output when the URI parameter "j" is set
Modified Paths:
--------------
tools/rsslog/rsslog.php
Modified: tools/rsslog/rsslog.php
===================================================================
--- tools/rsslog/rsslog.php 2011-10-22 19:10:59 UTC (rev 464)
+++ tools/rsslog/rsslog.php 2011-10-22 20:16:45 UTC (rev 465)
@@ -18,6 +18,8 @@
// 4. Remove old content:
// URL parameter "r": the timestamp (seconds since 1970) of the oldest log
// line to keep
+// 5. Get content as JSON:
+// URL parameter "j"
// create database connection
$db = sqlite_open('rsslog.db', 0666, $error);
@@ -60,6 +62,41 @@
{
$timestamp = $_GET['r'] ? $_GET['r'] : '';
delete( $db, $timestamp );
+} else if( isset($_GET['j']) )
+{
+ ?>
+{
+ "responseData" : {
+ "feed" : {
+ "feedUrl": "<?php echo 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']; ?>",
+ "title": "RSS supplied logs",
+ "link": "<?php echo 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']; ?>",
+ "author": "",
+ "description": "RSS supplied logs",
+ "type": "rss20",
+ "entries": [
+<?php
+ $result = retrieve( $db, $log_filter );
+ $first = true;
+ while( sqlite_has_more($result) )
+ {
+ $row = sqlite_fetch_array($result, SQLITE_ASSOC );
+ if( !$first ) echo ",\n";
+ echo '{';
+ echo '"title": "' . $row['content'] . '",';
+ echo '"content": "' . $row['content'] . '",';
+ echo '"publishedDate": "' . date( DATE_RFC822, $row['t'] ) . '"';
+ echo '}';
+ $first = false;
+ }
+?>
+ ]
+ }
+ },
+ "responseDetails" : null,
+ "responseStatus" : 200
+}
+ <?php
} else {
// send logs
$log_filter = $_GET['f'] ? $_GET['f'] : '';
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-22 19:11:05
|
Revision: 464
http://openautomation.svn.sourceforge.net/openautomation/?rev=464&view=rev
Author: mayerch
Date: 2011-10-22 19:10:59 +0000 (Sat, 22 Oct 2011)
Log Message:
-----------
Fix timezone troubles.
(On a German WireGate the sent back dates were two hours off...)
Modified Paths:
--------------
tools/rsslog/rsslog.php
Modified: tools/rsslog/rsslog.php
===================================================================
--- tools/rsslog/rsslog.php 2011-10-22 16:33:02 UTC (rev 463)
+++ tools/rsslog/rsslog.php 2011-10-22 19:10:59 UTC (rev 464)
@@ -48,6 +48,7 @@
$row = sqlite_fetch_array($result, SQLITE_ASSOC );
echo '<tr>';
echo '<td>' . date( DATE_RFC822, $row['t'] ) . '</td>';
+ echo '<td>' . $row['t'] . '</td>';
echo '<td>' . $row['content'] . '</td>';
echo "</tr>\n";
}
@@ -119,7 +120,8 @@
// store a new log line
$q = 'INSERT INTO Logs(content, t) VALUES( ' .
" '" . sqlite_escape_string( $content ) . "'," .
- " datetime('now','localtime')" .
+// " datetime('now','localtime')" .
+ " datetime('now')" .
')';
$ok = sqlite_exec($db, $q, $error);
@@ -131,14 +133,16 @@
// return a handle to all the data
function retrieve( $db, $filter )
{
- $q = "SELECT content, strftime('%s', t, 'localtime') AS t FROM Logs";
+// $q = "SELECT content, strftime('%s', t, 'localtime') AS t FROM Logs";
+ $q = "SELECT content, strftime('%s', t) AS t FROM Logs";
return sqlite_query( $db, $q, SQLITE_ASSOC );
}
// delete all log lines older than the timestamp
function delete( $db, $timestamp )
{
- $q = "DELETE from Logs WHERE t < datetime($timestamp, 'unixepoch', 'localtime')";
+ //$q = "DELETE from Logs WHERE t < datetime($timestamp, 'unixepoch', 'localtime')";
+ $q = "DELETE from Logs WHERE t < datetime($timestamp, 'unixepoch')";
$ok = sqlite_exec($db, $q, $error);
if (!$ok)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-22 16:33:08
|
Revision: 463
http://openautomation.svn.sourceforge.net/openautomation/?rev=463&view=rev
Author: mayerch
Date: 2011-10-22 16:33:02 +0000 (Sat, 22 Oct 2011)
Log Message:
-----------
Creating tag / branch for post 0.6.0 work
Added Paths:
-----------
CometVisu/tags/post_0.6.0/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-21 20:50:36
|
Revision: 462
http://openautomation.svn.sourceforge.net/openautomation/?rev=462&view=rev
Author: makki1
Date: 2011-10-21 20:50:30 +0000 (Fri, 21 Oct 2011)
Log Message:
-----------
CometVisu: jqclock - a clock widget with statusbar-support
Added Paths:
-----------
CometVisu/trunk/visu/plugins/jqclock/
CometVisu/trunk/visu/plugins/jqclock/jqclock.css
CometVisu/trunk/visu/plugins/jqclock/jqclock.min.js
CometVisu/trunk/visu/plugins/jqclock/structure_plugin.js
Added: CometVisu/trunk/visu/plugins/jqclock/jqclock.css
===================================================================
--- CometVisu/trunk/visu/plugins/jqclock/jqclock.css (rev 0)
+++ CometVisu/trunk/visu/plugins/jqclock/jqclock.css 2011-10-21 20:50:30 UTC (rev 462)
@@ -0,0 +1,36 @@
+.jqclock {
+ float:right;
+ white-space: nowrap;
+/*
+ text-align:center;
+ background: LightYellow;
+ border: 1px Black solid;
+ padding: 10px;
+ margin:20px;
+*/
+}
+.clockdate {
+ white-space: nowrap;
+/*
+ color: DarkRed;
+ margin-bottom: 10px;
+ font-size: 18px;
+ display: block;
+*/
+}
+.clocktime {
+ white-space: nowrap;
+/*
+ border: 2px
+ inset White;
+ background: Black;
+ padding: 5px;
+ font-size: 14px;
+ font-family: "Courier";
+ color: LightGreen;
+ display: block;
+*/
+ margin: 10px;
+}
+
+
Added: CometVisu/trunk/visu/plugins/jqclock/jqclock.min.js
===================================================================
--- CometVisu/trunk/visu/plugins/jqclock/jqclock.min.js (rev 0)
+++ CometVisu/trunk/visu/plugins/jqclock/jqclock.min.js 2011-10-21 20:50:30 UTC (rev 462)
@@ -0,0 +1 @@
+(function($){$.clock={version:"2.0.1",locale:{}};t=[];$.fn.clock=function(d){var c={it:{weekdays:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],months:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"]},en:{weekdays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],months:["January","February","March","April","May","June","July","August","September","October","November","December"]},es:{weekdays:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],months:["Enero","Febrero","Marzo","Abril","May","junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"]},de:{weekdays:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],months:["Januar","Februar","März","April","könnte","Juni","Juli","August","September","Oktober","November","Dezember"]},fr:{weekdays:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],months:["Janvier","Février","Mars","Avril","May","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"]},ru:{weekdays:["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],months:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"]}};return this.each(function(){$.extend(c,$.clock.locale);d=d||{};d.timestamp=d.timestamp||"z";y=new Date().getTime();d.sysdiff=0;if(d.timestamp!="z"){d.sysdiff=d.timestamp-y}d.langSet=d.langSet||"en";d.format=d.format||((d.langSet!="en")?"24":"12");d.calendar=d.calendar||"true";if(!$(this).hasClass("jqclock")){$(this).addClass("jqclock")}var e=function(g){if(g<10){g="0"+g}return g},f=function(j,n){var r=$(j).attr("id");if(n=="destroy"){clearTimeout(t[r])}else{m=new Date(new Date().getTime()+n.sysdiff);var p=m.getHours(),l=m.getMinutes(),v=m.getSeconds(),u=m.getDay(),i=m.getDate(),k=m.getMonth(),q=m.getFullYear(),o="",z="",w=n.langSet;if(n.format=="12"){o=" AM";if(p>11){o=" PM"}if(p>12){p=p-12}if(p==0){p=12}}p=e(p);l=e(l);v=e(v);if(n.calendar!="false"){z=((w=="en")?"<span class='clockdate'>"+c[w].weekdays[u]+", "+c[w].months[k]+" "+i+", "+q+"</span>":"<span class='clockdate'>"+c[w].weekdays[u]+", "+i+" "+c[w].months[k]+" "+q+"</span>")}$(j).html(z+"<span class='clocktime'>"+p+":"+l+":"+v+o+"</span>");t[r]=setTimeout(function(){f($(j),n)},1000)}};f($(this),d)})};return this})(jQuery);
Added: CometVisu/trunk/visu/plugins/jqclock/structure_plugin.js
===================================================================
--- CometVisu/trunk/visu/plugins/jqclock/structure_plugin.js (rev 0)
+++ CometVisu/trunk/visu/plugins/jqclock/structure_plugin.js 2011-10-21 20:50:30 UTC (rev 462)
@@ -0,0 +1,67 @@
+/* structure_plugin.js (c) 2011 by Michael Markstaller [de...@wi...]
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+*/
+
+/**
+ * This plugins integrates date/clock into CometVisu.
+ */
+
+$('head').append('<script type=\"text/javascript\" src=\"plugins/jqclock/jqclock.min.js\" charset=\"UTF-8\"></script>');
+$('head').append('<link rel="stylesheet" href="plugins/jqclock/jqclock.css" type="text/css" />');
+
+VisuDesign_Custom.prototype.addCreator("jqclock", {
+ create: function( page, path ) {
+ var $p = $(page);
+ function uniqid() {
+ var newDate = new Date;
+ return newDate.getTime();
+ }
+ var id = "jqclock_" + uniqid();
+
+ var ret_val = $('<div class="widget" />');
+ ret_val.addClass( 'jqclock' );
+ var label = '<div class="label">' + page.textContent + '</div>';
+ var actor = $("<div class=\"actor\"><div class=\"jqclock_inline\" id=\"" + id + "\"></div></div>");
+ var jqclock = $("#"+id,actor);
+
+ if ($p.attr("width")) {
+ jqclock.css("width", $p.attr("width"));
+ }
+ if ($p.attr("height")) {
+ jqclock.css("height", $p.attr("height"));
+ }
+
+ //start the clock in statusbar - if any
+ $("div#jqclock_status").clock({"langSet":$("div#jqclock_status").attr('lang'),"calendar":$("div#jqclock_status").attr('date')});
+
+ window.setTimeout(function() {
+ //start myself after 1 sec? a quirk?
+ $("#"+id).clock({"langSet":$p.attr("lang"), "calendar":$p.attr("date")});
+ }, 1000);
+
+ ret_val.append(label).append(actor);
+ return ret_val;
+ },
+ attributes: {
+ width: {type: "string", required: false},
+ height: {type: "string", required: false},
+ //refresh: {type: "numeric", required: false},
+ lang: {type: "list", required: true, list: {'de':'Deutsch','en':'English','es':'Espanol','fr':'Francais','it':'Italiano','ru':'Ruski'}},
+ date: {type: "list", required: false, list: {'true': "yes", 'false': "no"}}
+ },
+ content: {type: "string", required: false}
+});
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-21 18:45:52
|
Revision: 461
http://openautomation.svn.sourceforge.net/openautomation/?rev=461&view=rev
Author: makki1
Date: 2011-10-21 18:45:46 +0000 (Fri, 21 Oct 2011)
Log Message:
-----------
infotrigger - restore default behaviour, add XSD; add toogle-widget (a switch toggling multiple values based on mapping)
Modified Paths:
--------------
CometVisu/trunk/visu/designs/structure_pure.js
CometVisu/trunk/visu/visu_config.xsd
Modified: CometVisu/trunk/visu/designs/structure_pure.js
===================================================================
--- CometVisu/trunk/visu/designs/structure_pure.js 2011-10-20 23:41:50 UTC (rev 460)
+++ CometVisu/trunk/visu/designs/structure_pure.js 2011-10-21 18:45:46 UTC (rev 461)
@@ -364,6 +364,70 @@
content: false
});
+ this.addCreator('toggle', {
+ create: function( page, path ) {
+ var $p = $(page);
+ var ret_val = $('<div class="widget toggle" />');
+ var labelElement = $p.find('label')[0];
+ var label = labelElement ? '<div class="label">' + labelElement.textContent + '</div>' : '';
+ var address = {};
+ $p.find('address').each( function(){
+ var src = this.textContent;
+ var transform = this.getAttribute('transform');
+ var readonly = this.getAttribute('readonly');
+ ga_list.push( src )
+ address[ '_' + src ] = [ transform, readonly=='true' ];
+ });
+ var actor = '<div class="actor switchUnpressed"><div class="value">-</div></div>';
+ var $actor = $(actor).data( {
+ 'address' : address,
+ 'mapping' : $p.attr('mapping'),
+ 'styling' : $p.attr('styling'),
+ 'align' : $p.attr('align'),
+ 'type' : 'switch'
+ } ).bind( 'click', this.action );
+ for( var addr in address ) $actor.bind( addr, this.update );
+ ret_val.append( label ).append( $actor );
+ return ret_val;
+ },
+ update: function(e,d) {
+ var element = $(this);
+ var value = defaultUpdate( e, d, element );
+ element.addClass('switchUnpressed');
+ },
+ action: function() {
+ var data = $(this).data();
+ var element_count = 0;
+ var next_element;
+ var first_element;
+ for(var e in mappings[data.mapping])
+ if(mappings[data.mapping].hasOwnProperty(e))
+ {
+ element_count++;
+ if (e > data.value && !next_element)
+ next_element = e;
+ if (!first_element)
+ first_element = e;
+ }
+ sendValue = (next_element) ? next_element : first_element;
+ for( var addr in data.address )
+ {
+ if( data.address[addr][1] == true ) continue; // skip read only
+ visu.write( addr.substr(1), transformEncode( data.address[addr][0], sendValue ) );
+ }
+ },
+ attributes: {
+ mapping: { type: 'mapping' , required: false },
+ styling: { type: 'styling' , required: false },
+ align: { type: 'string' , required: false }
+ },
+ elements: {
+ label: { type: 'string', required: true, multi: false },
+ address: { type: 'address', required: true, multi: true }
+ },
+ content: false
+ });
+
this.addCreator('multitrigger', {
create: function( page, path ) {
var $p = $(page);
@@ -680,7 +744,9 @@
'styling' : $p.attr('styling'),
'value' : $p.attr('downvalue') || 0,
'align' : $p.attr('align'),
- 'change' : $p.attr('change'),
+ 'change' : $p.attr('change') || 'absolute',
+ 'min' : parseFloat($p.attr('min')) || 0,
+ 'max' : parseFloat($p.attr('max')) || 255,
'type' : 'switch'
} ).bind( 'click', this.action );
@@ -696,7 +762,9 @@
'styling' : $p.attr('styling'),
'value' : $p.attr('upvalue') || 1,
'align' : $p.attr('align'),
- 'change' : $p.attr('change'),
+ 'change' : $p.attr('change') || 'absolute',
+ 'min' : parseFloat($p.attr('min')) || 0,
+ 'max' : parseFloat($p.attr('max')) || 255,
'type' : 'switch'
} ).bind( 'click', this.action );
@@ -736,12 +804,14 @@
action: function() {
var data = $(this).data();
var value = parseFloat($(this).parent().find('.switchInvisible').data('basicvalue'));
+ var relativevalue = value + parseFloat(data.value);
for( var addr in data.address )
{
if( data.address[addr][1] == true ) continue; // skip read only
if( data.change == 'relative' )
{
- visu.write( addr.substr(1), transformEncode( data.address[addr][0], value + parseFloat(data.value) ) );
+ if (relativevalue < data.min || relativevalue > data.max) continue; // check min/max
+ visu.write( addr.substr(1), transformEncode( data.address[addr][0], relativevalue ) );
} else {
visu.write( addr.substr(1), transformEncode( data.address[addr][0], data.value ) );
}
@@ -757,7 +827,9 @@
align: { type: 'string' , required: false },
infoposition: { type: 'list' , required: true , list: {0: 'Info/Down/Up', 1: 'Down/Info/Up', 2: 'Down/Up/Info'} },
format: { type: 'string' , required: false },
- change: { type: 'list' , required: true , list: {'relative': 'relative', 'absolute': 'absolute'} }
+ change: { type: 'list' , required: false , list: {'relative': 'relative', 'absolute': 'absolute'} },
+ min: { type: 'numeric' , required: false },
+ max: { type: 'numeric' , required: false }
},
elements: {
label: { type: 'string', required: false, multi: false },
Modified: CometVisu/trunk/visu/visu_config.xsd
===================================================================
--- CometVisu/trunk/visu/visu_config.xsd 2011-10-20 23:41:50 UTC (rev 460)
+++ CometVisu/trunk/visu/visu_config.xsd 2011-10-21 18:45:46 UTC (rev 461)
@@ -241,6 +241,16 @@
<xsd:attribute ref="align" use="optional" />
</xsd:complexType>
+<xsd:complexType name="toogle">
+ <xsd:choice maxOccurs="unbounded" minOccurs="1">
+ <xsd:element name="label" type="xsd:string" />
+ <xsd:element name="address" type="address" minOccurs="1" />
+ </xsd:choice>
+ <xsd:attribute ref="styling" use="optional" />
+ <xsd:attribute ref="mapping" use="optional" />
+ <xsd:attribute ref="align" use="optional" />
+</xsd:complexType>
+
<xsd:complexType name="trigger">
<xsd:choice maxOccurs="unbounded" minOccurs="1">
<xsd:element name="label" type="xsd:string" />
@@ -260,6 +270,9 @@
<xsd:attribute name="downvalue" type="xsd:string" use="optional"/>
<xsd:attribute name="uplabel" type="xsd:string" use="optional"/>
<xsd:attribute name="downlabel" type="xsd:string" use="optional"/>
+ <xsd:attribute name="change" type="xsd:string" use="optional"/>
+ <xsd:attribute ref="min" />
+ <xsd:attribute ref="max" />
<xsd:attribute ref="mapping" use="optional"/>
<xsd:attribute ref="styling" use="optional"/>
<xsd:attribute ref="align" use="optional" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-20 23:41:56
|
Revision: 460
http://openautomation.svn.sourceforge.net/openautomation/?rev=460&view=rev
Author: makki1
Date: 2011-10-20 23:41:50 +0000 (Thu, 20 Oct 2011)
Log Message:
-----------
prepared autoconf-option without-eib; added keypad-id for C5; fixed sendOnStartUp; withdraw .tar.gz - this will go under sf/oa../files; Note: OpenWRT-Makefile will also be withdrawn here once settled&committed to upstream
Modified Paths:
--------------
tools/russconnectd/trunk/README
tools/russconnectd/trunk/configure.ac
tools/russconnectd/trunk/debian/changelog
tools/russconnectd/trunk/debian/files
tools/russconnectd/trunk/src/main.c
Removed Paths:
-------------
tools/russconnectd/release/
Modified: tools/russconnectd/trunk/README
===================================================================
--- tools/russconnectd/trunk/README 2011-10-20 23:12:13 UTC (rev 459)
+++ tools/russconnectd/trunk/README 2011-10-20 23:41:50 UTC (rev 460)
@@ -1,14 +1,16 @@
*** Russound RNET(R) to EIB/KNX bridge
- eibd is needed for KNX communication, either locally or remote
+(subject to get optional when TCP-Server/lirc-interface is implemented)
- uses mainly native Russound-Values
-TODO: document various values for Volume, bass,.. better
- controllers and zone-numbers are zero based!
- use socat or Moxa to get serial-data from/to UDP:
19200 8N1, No flowctrl, no special stop chars needed
*** INSTALL
-- needs pthread and libeibclient from bcusdk/eibd
+- needs pthread and libeibclient from bcusdk/eibd, but autotools etc. should
+work for release.tar.gz with
+./configure; make; make install
*** Group address structure:
- given a start-address the next 256 GA are used per 6 Zones, currently pretty hardcoded
@@ -19,23 +21,20 @@
10/1/2 WO Actuator powering the controllers (not yet)
10/1/10 W Zone 1 Power on/off 0/1
-... see .ods
+... -> see ga_list.ods for an example
-W = GA writeable
-RS = GA readable/sends status updates on change
-
*** TODO:
- see various TODO/FIXME in source
- reconnection/error-handling if network-problems occur (mainly eibd?)
-- prettify code / split main.c
-- fix dependency on uclibc++ (?) in OpenWRT Makefile
-- change russ UDP-socket to be shared for send/receive with listening (-l) sourceport for outgoing
- (makes usage with socat udp-recvfrom easier)
+- prettify code / split up main.c
+- fix dependency on uclibcxx (!?) in OpenWRT Makefile
- supply examples for socat
- directly connect serialport
*** Outlook
- *maybe* make much more modular and other interfaces (simple UDP/TCP server like C0 Z1 VolUp?)
-> implement RIO protocal partially
+-> connect to lirc directly?
- don't depend on libeibclient then
- *maybe* add outgoing interfaces for KNX-> mpd,vdr,.. to stick multiroom togehter
+- add at least a KNX-address to switch on/off to avoid ext. logic here
Modified: tools/russconnectd/trunk/configure.ac
===================================================================
--- tools/russconnectd/trunk/configure.ac 2011-10-20 23:12:13 UTC (rev 459)
+++ tools/russconnectd/trunk/configure.ac 2011-10-20 23:41:50 UTC (rev 460)
@@ -27,10 +27,13 @@
AM_PROG_LIBTOOL
+dnl **********
+dnl with ....
+dnl ''''''''''
+AC_ARG_WITH(eib, [ --without-eib build without EIB/KNX support])
+dnl not yet..
-
-
AC_OUTPUT([
Makefile
src/Makefile
Modified: tools/russconnectd/trunk/debian/changelog
===================================================================
--- tools/russconnectd/trunk/debian/changelog 2011-10-20 23:12:13 UTC (rev 459)
+++ tools/russconnectd/trunk/debian/changelog 2011-10-20 23:41:50 UTC (rev 460)
@@ -1,3 +1,9 @@
+russconnectd (0.2-ubuntu1) oneiric; urgency=low
+
+ * new upstream
+
+ -- Michael Markstaller <de...@wi...> Wed, 19 Oct 2011 20:36:42 +0200
+
russconnectd (0.1) unstable; urgency=low
* Initial Release.
Modified: tools/russconnectd/trunk/debian/files
===================================================================
--- tools/russconnectd/trunk/debian/files 2011-10-20 23:12:13 UTC (rev 459)
+++ tools/russconnectd/trunk/debian/files 2011-10-20 23:41:50 UTC (rev 460)
@@ -1 +1 @@
-russconnectd_0.1_i386.deb unknown extra
+russconnectd_0.2-ubuntu1_i386.deb unknown extra
Modified: tools/russconnectd/trunk/src/main.c
===================================================================
--- tools/russconnectd/trunk/src/main.c 2011-10-20 23:12:13 UTC (rev 459)
+++ tools/russconnectd/trunk/src/main.c 2011-10-20 23:41:50 UTC (rev 460)
@@ -26,7 +26,7 @@
#include <syslog.h>
#include <string.h>
#include <signal.h>
-#include <assert.h>
+//#include <assert.h>
#include <arpa/inet.h>
#include <netinet/in.h>
@@ -38,14 +38,13 @@
#define DEBUG 1
#define DAEMON_NAME "russconnectd"
-#define USAGESTRING "\n\t-d\tRun as daemon/No debug output\n\t-p <pidfile>\tPID-filename\n\t-i <ip:port>\tIP-Address:Port to send UDP-packets to russound\n\t-l <UDP-port>\tUDP port to listen on\n\t-a <KNX address>\tKNX start-address (see README)\n\t-z <number>\tNumber of Zones to support\n\t-u <eib url>\tURL to conatct eibd like localo:/tmp/eib or ip:192.168.0.101\n\t-s\t(Optional) send all values to KNX on startup of daemon\n"
-#define NUM_THREADS 2
+#define USAGESTRING "\n\t-d\tRun as daemon/No debug output\n\t-p <pidfile>\tPID-filename\n\t-i <ip:port>\tIP-Address:Port to send UDP-packets to russound\n\t-l <UDP-port>\tUDP port to listen on\n\t-a <KNX address>\tKNX start-address (see README)\n\t-z <number>\tNumber of Zones to support\n\t-u <eib url>\tURL to conatct eibd like localo:/tmp/eib or ip:192.168.0.101\n\t-s\t(Optional) send all values to KNX on startup of daemon\n\t-k 0x71\t(Optional) Keypad ID - defaults to 0x70 for CAx - use 0x71 for C5"
+#define NUM_THREADS 3
#define MAX_ZONES 31
#define RETRY_TIME 5
#define BUFLEN 1024
#define POLLING_INTERVAL 10
#define ZONES_PER_CONTROLLER 6
-#define RUSS_KEYPAD_ID 0x70
pthread_mutex_t zonelock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t initlock = PTHREAD_MUTEX_INITIALIZER;
@@ -81,6 +80,7 @@
int pidFilehandle;
char *pidfilename = "/var/run/russconnectd.pid";
int sendOnStart = 0;
+long int keypadid = 0x70;
//FIXME: also handle serial-port directly?
struct sockaddr_in si_me, si_other;
@@ -140,7 +140,7 @@
void *sendrussPolling(unsigned char zone) {
syslog(LOG_DEBUG, "polling zone %d",zone);
pthread_mutex_trylock(&standbylock);
- char buf_onvol[25] = { 0xF0, 0, 0, 0x7F, 0, 0, RUSS_KEYPAD_ID, 0x01, 0x05, 0x02, 0, 0, 0, 0x04, 0, 0, 0, 0xF7 };
+ char buf_onvol[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x01, 0x05, 0x02, 0, 0, 0, 0x04, 0, 0, 0, 0xF7 };
buf_onvol[1] = zone/ZONES_PER_CONTROLLER;
buf_onvol[11] = zone%ZONES_PER_CONTROLLER;
buf_onvol[16] = (int) russChecksum (buf_onvol,18-2);
@@ -148,7 +148,7 @@
syslog(LOG_WARNING,"sendto failed!");
usleep(20*1000); //FIXME: throttle a little (20ms)
- char buf_getzone[25] = { 0xF0, 0, 0, 0x7F, 0, 0, RUSS_KEYPAD_ID, 0x01, 0x04, 0x02, 0, 0, 0x07, 0, 0, 0, 0xF7 };
+ char buf_getzone[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x01, 0x04, 0x02, 0, 0, 0x07, 0, 0, 0, 0xF7 };
buf_getzone[1] = zone/ZONES_PER_CONTROLLER;
buf_getzone[11] = zone%ZONES_PER_CONTROLLER;
buf_getzone[15] = (int) russChecksum (buf_getzone,17-2);
@@ -167,10 +167,10 @@
//block here until something is received from russound (it's turned off)
pthread_mutex_lock(&standbylock);
pthread_mutex_unlock(&standbylock);
- char buf_msg1[25] = { 0, 0, 0, 0x7F, 0, 0, RUSS_KEYPAD_ID, 0x05, 0x02, 0x02, 0, 0, 0xF1, 0x23, 0, 0, 0, 0, 0, 0x01, 0, 0xF7 };
+ char buf_msg1[25] = { 0, 0, 0, 0x7F, 0, 0, keypadid, 0x05, 0x02, 0x02, 0, 0, 0xF1, 0x23, 0, 0, 0, 0, 0, 0x01, 0, 0xF7 };
buf_msg1[1] = controller;
buf_msg1[17] = zone;
- char buf_msg2[25] = { 0, 0, 0, 0x7F, 0, 0, RUSS_KEYPAD_ID, 0, 0x05, 0x02, 0, 0, 0, 0, 0, 0, 0, 0x01, 0, 0x01, 0, 0, 0, 0xF7 };
+ char buf_msg2[25] = { 0, 0, 0, 0x7F, 0, 0, keypadid, 0, 0x05, 0x02, 0, 0, 0, 0, 0, 0, 0, 0x01, 0, 0x01, 0, 0, 0, 0xF7 };
buf_msg2[1] = controller;
buf_msg2[11] = zone;
@@ -497,22 +497,22 @@
switch (func) {
case 1:
zones[num].zonepower =val;
- if (zones[num].inited)
+ if (zones[num].inited || sendOnStart)
sendKNXdgram (0x80,1,(knxstartaddress+30)+(zone*40)+(controller*256),val);
break;
case 2:
zones[num].srcid =val;
- if (zones[num].inited)
+ if (zones[num].inited || sendOnStart)
sendKNXdgram (0x80,51,(knxstartaddress+31)+(zone*40)+(controller*256),val);
break;
case 3:
zones[num].volume =val;
- if (zones[num].inited)
+ if (zones[num].inited || sendOnStart)
sendKNXdgram (0x80,5,(knxstartaddress+32)+(zone*40)+(controller*256),val*2);
break;
case 4:
zones[num].bass =val;
- if (zones[num].inited) {
+ if (zones[num].inited || sendOnStart) {
if (val<10)
sendKNXdgram (0x80,51,(knxstartaddress+33)+(zone*40)+(controller*256),val-10+256);
else
@@ -521,7 +521,7 @@
break;
case 5:
zones[num].treble =val;
- if (zones[num].inited) {
+ if (zones[num].inited || sendOnStart) {
if (val<10)
sendKNXdgram (0x80,51,(knxstartaddress+34)+(zone*40)+(controller*256),val-10+256);
else
@@ -530,12 +530,12 @@
break;
case 6:
zones[num].loudness =val;
- if (zones[num].inited)
+ if (zones[num].inited || sendOnStart)
sendKNXdgram (0x80,1,(knxstartaddress+35)+(zone*40)+(controller*256),val);
break;
case 7:
zones[num].balance =val;
- if (zones[num].inited) {
+ if (zones[num].inited || sendOnStart) {
if (val<10)
sendKNXdgram (0x80,51,(knxstartaddress+36)+(zone*40)+(controller*256),val-10+256);
else
@@ -544,17 +544,17 @@
break;
case 8:
zones[num].partymode =val;
- if (zones[num].inited)
+ if (zones[num].inited || sendOnStart)
sendKNXdgram (0x80,1,(knxstartaddress+37)+(zone*40)+(controller*256),val);
break;
case 9:
zones[num].dnd =val;
- if (zones[num].inited)
+ if (zones[num].inited || sendOnStart)
sendKNXdgram (0x80,1,(knxstartaddress+38)+(zone*40)+(controller*256),val);
break;
case 10:
zones[num].onvolume =val;
- if (zones[num].inited)
+ if (zones[num].inited || sendOnStart)
sendKNXdgram (0x80,5,(knxstartaddress+39)+(zone*40)+(controller*256),val*2);
break;
default:
@@ -570,26 +570,24 @@
syslog(LOG_DEBUG,"russ Controller:%d Zone:%d Status:%d src:%d vol:%d bass:%d treb:%d loud:%d bal:%d sys:%d shrsrc:%d party:%d,DnD:%d\n",
buf[4],buf[12],buf[20],buf[21],buf[22],buf[23],buf[24],buf[25],buf[26],buf[27],buf[28],buf[29],buf[30]);
buf[12] = (buf[4]*ZONES_PER_CONTROLLER)+buf[12]; //controller + zonenumber
- if (sendOnStart)
- zones[buf[12]].inited = 1;
- if (buf[20] != zones[buf[12]].zonepower)
+ if (buf[20] != zones[buf[12]].zonepower || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[20],1);
- if (buf[21] != zones[buf[12]].srcid)
+ if (buf[21] != zones[buf[12]].srcid || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[21],2);
- if (buf[22] != zones[buf[12]].volume)
+ if (buf[22] != zones[buf[12]].volume || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[22],3);
- if (buf[23] != zones[buf[12]].bass)
+ if (buf[23] != zones[buf[12]].bass || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[23],4);
- if (buf[24] != zones[buf[12]].treble)
+ if (buf[24] != zones[buf[12]].treble || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[24],5);
- if (buf[25] != zones[buf[12]].loudness)
+ if (buf[25] != zones[buf[12]].loudness || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[25],6);
- if (buf[26] != zones[buf[12]].balance)
+ if (buf[26] != zones[buf[12]].balance || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[26],7);
- if (buf[29] != zones[buf[12]].partymode)
+ if (buf[29] != zones[buf[12]].partymode || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[29],8);
- if (buf[30] != zones[buf[12]].dnd)
+ if (buf[30] != zones[buf[12]].dnd || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[30],9);
zones[buf[12]].inited = 1;
} else if ((len==24) && (buf[0]==0xF0) && (buf[9]==0x05) && (buf[13]==0x00)) { //zone turn-on volume
@@ -597,7 +595,7 @@
syslog(LOG_DEBUG,"russ Controller:%d Zone:%d TurnOnVolume:%d",
buf[4],buf[12],buf[21]);
buf[12] = (buf[4]*ZONES_PER_CONTROLLER)+buf[12]; //controller + zonenumber
- if (buf[21] != zones[buf[12]].onvolume)
+ if (buf[21] != zones[buf[12]].onvolume || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[21],10);
} else {
//FIXME: just for debugging
@@ -740,7 +738,7 @@
char *p;
char pidstr[255];
- while ((c = getopt (argc, argv, "dp:i:l:a:z:u:s")) != -1)
+ while ((c = getopt (argc, argv, "dp:i:l:a:z:u:sk:")) != -1)
switch (c) {
case 'd':
daemonize = 1;
@@ -754,8 +752,8 @@
case 'i':
p = strtok(optarg,":");
russipaddr = p;
- p = strtok (NULL, ":");
- russport = atoi(p);
+ if ((p = strtok (NULL, ":")))
+ russport = atoi(p);
break;
case 'l':
listenport = atoi(optarg);
@@ -769,6 +767,9 @@
case 'u':
eibd_url = optarg;
break;
+ case 'k':
+ keypadid = strtol(optarg,NULL,16);
+ break;
case '?':
//FIXME: check arguments better, print_usage
fprintf (stderr, "Unknown option `-%c'.\nUsage: %s %s", optopt, argv[0], USAGESTRING);
@@ -786,8 +787,8 @@
if (!daemonize) {
setlogmask(LOG_UPTO(LOG_DEBUG));
openlog(DAEMON_NAME, LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
- syslog(LOG_DEBUG, "startup with debug; Russ-IP: %s:%d, listenport %d, pidfile: %s, start address: %d, number of zones: %d, eibd: %s",
- russipaddr, russport, listenport, pidfilename, knxstartaddress, numzones, eibd_url);
+ syslog(LOG_DEBUG, "startup with debug; Russ-IP: %s:%d, listenport %d, pidfile: %s, start address: %d, number of zones: %d, eibd: %s SendonStartup: %d KeypadID: %d",
+ russipaddr, russport, listenport, pidfilename, knxstartaddress, numzones, eibd_url, sendOnStart, keypadid);
} else {
setlogmask(LOG_UPTO(LOG_INFO));
openlog(DAEMON_NAME, LOG_CONS, LOG_USER);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-20 23:12:19
|
Revision: 459
http://openautomation.svn.sourceforge.net/openautomation/?rev=459&view=rev
Author: makki1
Date: 2011-10-20 23:12:13 +0000 (Thu, 20 Oct 2011)
Log Message:
-----------
small fixes on infotrigger with realtive values
Modified Paths:
--------------
CometVisu/trunk/visu/designs/structure_pure.js
Modified: CometVisu/trunk/visu/designs/structure_pure.js
===================================================================
--- CometVisu/trunk/visu/designs/structure_pure.js 2011-10-20 21:06:30 UTC (rev 458)
+++ CometVisu/trunk/visu/designs/structure_pure.js 2011-10-20 23:12:13 UTC (rev 459)
@@ -680,6 +680,7 @@
'styling' : $p.attr('styling'),
'value' : $p.attr('downvalue') || 0,
'align' : $p.attr('align'),
+ 'change' : $p.attr('change'),
'type' : 'switch'
} ).bind( 'click', this.action );
@@ -695,6 +696,7 @@
'styling' : $p.attr('styling'),
'value' : $p.attr('upvalue') || 1,
'align' : $p.attr('align'),
+ 'change' : $p.attr('change'),
'type' : 'switch'
} ).bind( 'click', this.action );
@@ -733,13 +735,13 @@
},
action: function() {
var data = $(this).data();
- var value = $(this).parent().find('.switchInvisible').data('basicvalue');
+ var value = parseFloat($(this).parent().find('.switchInvisible').data('basicvalue'));
for( var addr in data.address )
{
if( data.address[addr][1] == true ) continue; // skip read only
- if( data.change == 'absolute' )
+ if( data.change == 'relative' )
{
- visu.write( addr.substr(1), transformEncode( data.address[addr][0], value + data.value ) );
+ visu.write( addr.substr(1), transformEncode( data.address[addr][0], value + parseFloat(data.value) ) );
} else {
visu.write( addr.substr(1), transformEncode( data.address[addr][0], data.value ) );
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-20 21:06:36
|
Revision: 458
http://openautomation.svn.sourceforge.net/openautomation/?rev=458&view=rev
Author: mayerch
Date: 2011-10-20 21:06:30 +0000 (Thu, 20 Oct 2011)
Log Message:
-----------
Initial implementation of absolute value change for infotrigger. Highly untested!!!
Modified Paths:
--------------
CometVisu/trunk/visu/designs/structure_pure.js
Modified: CometVisu/trunk/visu/designs/structure_pure.js
===================================================================
--- CometVisu/trunk/visu/designs/structure_pure.js 2011-10-20 20:57:33 UTC (rev 457)
+++ CometVisu/trunk/visu/designs/structure_pure.js 2011-10-20 21:06:30 UTC (rev 458)
@@ -733,10 +733,16 @@
},
action: function() {
var data = $(this).data();
+ var value = $(this).parent().find('.switchInvisible').data('basicvalue');
for( var addr in data.address )
{
if( data.address[addr][1] == true ) continue; // skip read only
- visu.write( addr.substr(1), transformEncode( data.address[addr][0], data.value ) );
+ if( data.change == 'absolute' )
+ {
+ visu.write( addr.substr(1), transformEncode( data.address[addr][0], value + data.value ) );
+ } else {
+ visu.write( addr.substr(1), transformEncode( data.address[addr][0], data.value ) );
+ }
}
},
attributes: {
@@ -970,6 +976,7 @@
if( element.data( 'align' ) )
element.addClass(element.data( 'align' ) );
+ element.data( 'basicvalue', value );
if( element.data( 'precision' ) )
value = Number( value ).toPrecision( element.data( 'precision' ) );
if( element.data( 'format' ) )
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-20 20:57:40
|
Revision: 457
http://openautomation.svn.sourceforge.net/openautomation/?rev=457&view=rev
Author: makki1
Date: 2011-10-20 20:57:33 +0000 (Thu, 20 Oct 2011)
Log Message:
-----------
prepare DPT-based mappings
Modified Paths:
--------------
CometVisu/trunk/visu/edit/dpt_list.csv
Modified: CometVisu/trunk/visu/edit/dpt_list.csv
===================================================================
--- CometVisu/trunk/visu/edit/dpt_list.csv 2011-10-20 20:47:31 UTC (rev 456)
+++ CometVisu/trunk/visu/edit/dpt_list.csv 2011-10-20 20:57:33 UTC (rev 457)
@@ -1,327 +1,327 @@
-"dpt","name"
-"1.001","DPT_Switch"
-"1.002","DPT_Bool"
-"1.003","DPT_Enable"
-"1.004","DPT_Ramp"
-"1.005","DPT_Alarm"
-"1.006","DPT_BinaryValue"
-"1.007","DPT_Step"
-"1.008","DPT_UpDown"
-"1.009","DPT_OpenClose"
-"1.010","DPT_Start"
-"1.011","DPT_State"
-"1.012","DPT_Invert"
-"1.013","DPT_DimSendStyle"
-"1.014","DPT_InputSource"
-"1.015","DPT_Reset"
-"1.016","DPT_Ack"
-"1.017","DPT_Trigger"
-"1.018","DPT_Occupancy"
-"1.019","DPT_Window_Door"
-"1.021","DPT_LogicalFunction"
-"1.022","DPT_Scene_AB"
-"1.023","DPT_ShutterBlinds_Mode"
-"1.100","DPT_Heat/Cool"
-"2.001","DPT_Switch_Control"
-"2.002","DPT_Bool_Control"
-"2.003","DPT_Enable_Control"
-"2.004","DPT_Ramp_Control"
-"2.005","DPT_Alarm_Control"
-"2.006","DPT_BinaryValue_Control"
-"2.007","DPT_Step_Control"
-"2.008","DPT_Direction1_Control"
-"2.009","DPT_Direction2_Control"
-"2.010","DPT_Start_Control"
-"2.011","DPT_State_Control"
-"2.012","DPT_Invert_Control"
-"3.007","DPT_Control_Dimming"
-"3.008","DPT_Control_Blinds"
-"4.001","DPT_Char_ASCII"
-"4.002","DPT_Char_8859_1"
-"5.001","DPT_Scaling"
-"5.003","DPT_Angle"
-"5.004","DPT_Percent_U8"
-"5.005","DPT_DecimalFactor"
-"5.006","DPT_Tariff"
-"5.010","DPT_Value_1_Ucount"
-"6.001","DPT_Percent_V8"
-"6.010","DPT_Value_1_Count"
-"6.020","DPT_Status_Mode3"
-"7.001","DPT_Value_2_Ucount"
-"7.002","DPT_TimePeriodMsec"
-"7.003","DPT_TimePeriod10MSec"
-"7.004","DPT_TimePeriod100MSec"
-"7.005","DPT_TimePeriodSec"
-"7.006","DPT_TimePeriodMin"
-"7.007","DPT_TimePeriodHrs"
-"7.010","DPT_PropDataType"
-"7.011","DPT_Length_mm"
-"7.012","DPT_UElCurrentmA"
-"7.013","DPT_Brightness"
-"8.001","DPT_Value_2_Count"
-"8.002","DPT_DeltaTimeMsec"
-"8.003","DPT_DeltaTime10MSec"
-"8.004","DPT_DeltaTime100MSec"
-"8.005","DPT_DeltaTimeSec"
-"8.006","DPT_DeltaTimeMin"
-"8.007","DPT_DeltaTimeHrs"
-"8.010","DPT_Percent_V16"
-"8.011","DPT_Rotation_Angle"
-"9.001","DPT_Value_Temp"
-"9.002","DPT_Value_Tempd"
-"9.003","DPT_Value_Tempa"
-"9.004","DPT_Value_Lux"
-"9.005","DPT_Value_Wsp"
-"9.006","DPT_Value_Pres"
-"9.007","DPT_Value_Humidity"
-"9.008","DPT_Value_AirQuality"
-"9.010","DPT_Value_Time1"
-"9.011","DPT_Value_Time2"
-"9.020","DPT_Value_Volt"
-"9.021","DPT_Value_Curr"
-"9.022","DPT_PowerDensity"
-"9.023","DPT_KelvinPerPercent"
-"9.024","DPT_Power"
-"9.025","DPT_Value_Volume_Flow"
-"9.026","DPT_Rain_Amount"
-"9.027","DPT_Value_Temp_F"
-"9.028","DPT_Value_Wsp_kmh"
-"10.001","DPT_TimeOfDay"
-"11.001","DPT_Date"
-"12.001","DPT_Value_4_Ucount"
-"13.001","DPT_Value_4_Count"
-"13.010","DPT_ActiveEnergy"
-"13.011","DPT_ApparantEnergy"
-"13.012","DPT_ReactiveEnergy"
-"13.013","DPT_ActiveEnergy_kWh"
-"13.014","DPT_ApparantEnergy_kVAh"
-"13.015","DPT_ReactiveEnergy_kVARh"
-"13.100","DPT_LongDeltaTimeSec"
-"14.000","DPT_Value_Acceleration"
-"14.001","DPT_Value_Acceleration_Angular"
-"14.002","DPT_Value_Activation_Energy"
-"14.003","DPT_Value_Activity"
-"14.004","DPT_Value_Mol"
-"14.005","DPT_Value_Amplitude"
-"14.006","DPT_Value_AngleRad"
-"14.007","DPT_Value_AngleDeg"
-"14.008","DPT_Value_Angular_Momentum"
-"14.009","DPT_Value_Angular_Velocity"
-"14.010","DPT_Value_Area"
-"14.011","DPT_Value_Capacitance"
-"14.012","DPT_Value_Charge_DensitySurface"
-"14.013","DPT_Value_Charge_DensityVolume"
-"14.014","DPT_Value_Compressibility"
-"14.015","DPT_Value_Conductance"
-"14.016","DPT_Value_Electrical_Conductivity"
-"14.017","DPT_Value_Density"
-"14.018","DPT_Value_Electric_Charge"
-"14.019","DPT_Value_Electric_Current"
-"14.020","DPT_Value_Electric_CurrentDensity"
-"14.021","DPT_Value_Electric_DipoleMoment"
-"14.022","DPT_Value_Electric_Displacement"
-"14.023","DPT_Value_Electric_FieldStrength"
-"14.024","DPT_Value_Electric_Flux"
-"14.025","DPT_Value_Electric_FluxDensity"
-"14.026","DPT_Value_Electric_Polarization"
-"14.027","DPT_Value_Electric_Potential"
-"14.028","DPT_Value_Electric_PotentialDifference"
-"14.029","DPT_Value_ElectromagneticMoment"
-"14.030","DPT_Value_Electromotive_Force"
-"14.031","DPT_Value_Energy"
-"14.032","DPT_Value_Force"
-"14.033","DPT_Value_Frequency"
-"14.034","DPT_Value_Angular_Frequency"
-"14.035","DPT_Value_Heat_Capacity"
-"14.036","DPT_Value_Heat_FlowRate"
-"14.037","DPT_Value_Heat_Quantity"
-"14.038","DPT_Value_Impedance"
-"14.039","DPT_Value_Length"
-"14.040","DPT_Value_Light_Quantity"
-"14.041","DPT_Value_Luminance"
-"14.042","DPT_Value_Luminous_Flux"
-"14.043","DPT_Value_Luminous_Intensity"
-"14.044","DPT_Value_Magnetic_FieldStrength"
-"14.045","DPT_Value_Magnetic_Flux"
-"14.046","DPT_Value_Magnetic_FluxDensity"
-"14.047","DPT_Value_Magnetic_Moment"
-"14.048","DPT_Value_Magnetic_Polarization"
-"14.049","DPT_Value_Magnetization"
-"14.050","DPT_Value_MagnetomotiveForce"
-"14.051","DPT_Value_Mass"
-"14.052","DPT_Value_MassFlux"
-"14.053","DPT_Value_Momentum"
-"14.054","DPT_Value_Phase_AngleRad"
-"14.055","DPT_Value_Phase_AngleDeg"
-"14.056","DPT_Value_Power"
-"14.057","DPT_Value_Power_Factor"
-"14.058","DPT_Value_Pressure"
-"14.059","DPT_Value_Reactance"
-"14.060","DPT_Value_Resistance"
-"14.061","DPT_Value_Resistivity"
-"14.062","DPT_Value_SelfInductance"
-"14.063","DPT_Value_SolidAngle"
-"14.064","DPT_Value_Sound_Intensity"
-"14.065","DPT_Value_Speed"
-"14.066","DPT_Value_Stress"
-"14.067","DPT_Value_Surface_Tension"
-"14.068","DPT_Value_Common_Temperature"
-"14.069","DPT_Value_Absolute_Temperature"
-"14.070","DPT_Value_TemperatureDifference"
-"14.071","DPT_Value_Thermal_Capacity"
-"14.072","DPT_Value_Thermal_Conductivity"
-"14.073","DPT_Value_ThermoelectricPower"
-"14.074","DPT_Value_Time"
-"14.075","DPT_Value_Torque"
-"14.076","DPT_Value_Volume"
-"14.077","DPT_Value_Volume_Flux"
-"14.078","DPT_Value_Weight"
-"14.079","DPT_Value_Work"
-"15.000","DPT_Access_Data"
-"16.000","DPT_String_ASCII"
-"16.001","DPT_String_8859_1"
-"17.001","DPT_SceneNumber"
-"18.001","DPT_SceneControl"
-"19.001","DPT_DateTime"
-"20.001","DPT_SCLOMode"
-"20.002","DPT_BuildingMode"
-"20.003","DPT_OccMode"
-"20.004","DPT_Priority"
-"20.005","DPT_LightApplicationMode"
-"20.006","DPT_ApplicationArea"
-"20.007","DPT_AlarmClassType"
-"20.008","DPT_PSUMode"
-"20.011","DPT_ErrorClass_System"
-"20.012","DPT_ErrorClass_HVAC"
-"20.013","DPT_Time_Delay"
-"20.014","DPT_Beaufort_Wind_Force_Scale"
-"20.017","DPT_SensorSelect"
-"20.100","DPT_FuelType"
-"20.101","DPT_BurnerType"
-"20.102","DPT_HVACMode"
-"20.103","DPT_DHWMode"
-"20.104","DPT_LoadPriority"
-"20.105","DPT_HVACContrMode"
-"20.106","DPT_HVACEmergMode"
-"20.107","DPT_ChangeoverMode"
-"20.108","DPT_ValveMode"
-"20.109","DPT_DamperMode"
-"20.110","DPT_HeaterMode"
-"20.111","DPT_FanMode"
-"20.112","DPT_MasterSlaveMode"
-"20.113","DPT_StatusRoomSetp"
-"20.600","DPT_Behaviour_Lock_Unlock"
-"20.601","DPT_Behaviour_Bus_Power_Up_Down"
-"20.1000","DPT_CommMode"
-"20.1001","DPT_AddInfoTypes"
-"20.1002","DPT_RF_ModeSelect"
-"20.1003","DPT_RF_FilterSelect"
-"21.001","DPT_StatusGen"
-"21.002","DPT_Device_Control"
-"21.100","DPT_ForceSign"
-"21.101","DPT_ForceSignCool"
-"21.102","DPT_StatusRHC"
-"21.103","DPT_StatusSDHWC"
-"21.104","DPT_FuelTypeSet"
-"21.105","DPT_StatusRCC"
-"21.106","DPT_StatusAHU"
-"21.1000","DPT_RF_ModeInfo"
-"21.1001","DPT_RF_FilterInfo"
-"21.1010","DPT_Channel_Activation_8"
-"22.100","DPT_StatusDHWC"
-"22.101","DPT_StatusRHCC"
-"22.1000","DPT_Media"
-"22.1010","DPT_Channel_Activation_16"
-"23.001","DPT_OnOff_Action"
-"23.002","DPT_Alarm_Reaction"
-"23.003","DPT_UpDown_Action"
-"23.102","DPT_HVAC_PB_Action"
-"24.001","DPT_VarString_8859_1"
-"25.1000","DPT_DoubleNibble"
-"26.001","DPT_SceneInfo"
-"27.001","DPT_CombinedInfoOnOff"
-"28.001","DPT_UTF-8"
-"29.010","DPT_ActiveEnergy_V64"
-"29.011","DPT_ApparantEnergy_V64"
-"29.012","DPT_ReactiveEnergy_V64"
-"30.1010","DPT_Channel_Activation_24"
-"31.101","DPT_PB_Action_HVAC_Extended"
-"200.100","DPT_Heat/Cool_Z"
-"200.101","DPT_BinaryValue_Z"
-"201.100","DPT_HVACMode_Z"
-"201.102","DPT_DHWMode_Z"
-"201.104","DPT_HVACContrMode_Z"
-"201.105","DPT_EnablH/Cstage_Z"
-"201.107","DPT_BuildingMode_Z"
-"201.108","DPT_OccMode_Z"
-"201.109","DPT_HVACEmergMode_Z"
-"202.001","DPT_RelValue_Z"
-"202.002","DPT_UCountValue8_Z"
-"203.002","DPT_TimePeriodMsec_Z"
-"203.003","DPT_TimePeriod10Msec_Z"
-"203.004","DPT_TimePeriod100Msec_Z"
-"203.005","DPT_TimePeriodSec_Z"
-"203.006","DPT_TimePeriodMin_Z"
-"203.007","DPT_TimePeriodHrs_Z"
-"203.011","DPT_UFlowRateLiter/h_Z"
-"203.012","DPT_UCountValue16_Z"
-"203.013","DPT_UElCurrent?A_Z"
-"203.014","DPT_PowerKW_Z"
-"203.015","DPT_AtmPressureAbs_Z"
-"203.017","DPT_PercentU16_Z"
-"203.100","DPT_HVACAirQual_Z"
-"203.101","DPT_WindSpeed_Z"
-"203.102","DPT_SunIntensity_Z"
-"203.104","DPT_HVACAirFlowAbs_Z"
-"204.001","DPT_RelSignedValue_Z"
-"205.002","DPT_DeltaTimeMsec_Z"
-"205.003","DPT_DeltaTime10Msec_Z"
-"205.004","DPT_DeltaTime100Msec_Z"
-"205.005","DPT_DeltaTimeSec_Z"
-"205.006","DPT_DeltaTimeMin_Z"
-"205.007","DPT_DeltaTimeHrs_Z"
-"205.100","DPT_TempHVACAbs_Z"
-"205.101","DPT_TempHVACRel_Z"
-"205.102","DPT_HVACAirFlowRel_Z"
-"206.100","DPT_HVACModeNext"
-"206.102","DPT_DHWModeNext"
-"206.104","DPT_OccModeNext"
-"206.105","DPT_BuildingModeNext"
-"207.100","DPT_StatusBUC"
-"207.101","DPT_LockSign"
-"207.102","DPT_ValueDemBOC"
-"207.104","DPT_ActPosDemAbs"
-"207.105","DPT_StatusAct"
-"209.100","DPT_StatusHPM"
-"209.101","DPT_TempRoomDemAbs"
-"209.102","DPT_StatusCPM"
-"209.103","DPT_StatusWTC"
-"210.100","DPT_TempFlowWaterDemAbs"
-"211.100","DPT_EnergyDemWater"
-"212.100","DPT_TempRoomSetpSetShift[3]"
-"212.101","DPT_TempRoomSetpSet[3]"
-"213.100","DPT_TempRoomSetpSet[4]"
-"213.101","DPT_TempDHWSetpSet[4]"
-"213.102","DPT_TempRoomSetpSetShift[4]"
-"214.100","DPT_PowerFlowWaterDemHPM"
-"214.101","DPT_PowerFlowWaterDemCPM"
-"215.100","DPT_StatusBOC"
-"215.101","DPT_StatusCC"
-"216.100","DPT_SpecHeatProd"
-"217.001","DPT_Version"
-"218.001","DPT_VolumeLiter_Z"
-"219.001","DPT_AlarmInfo"
-"220.100","DPT_TempHVACAbsNext"
-"221.001","DPT_SerNum"
-"222.100","DPT_TempRoomSetpSetF16[3]"
-"222.101","DPT_TempRoomSetpSetShiftF16[3]"
-"223.100","DPT_EnergyDemAir"
-"224.100","DPT_TempSupply"
-"225.001","DPT_ScalingSpeed"
-"225.002","DPT_Scaling_Step_Time"
-"229.001","DPT_MeteringValue"
-"230.1000","DPT_MBus_Address"
-"231.001","DPT_Locale_ASCII"
-"232.600","DPT_Colour_RGB"
-"234.001","DPT_LanguageCodeAlpha2_ASCII"
-"234.002","DPT_RegionCodeAlpha2_ASCII"
+"dpt","name","mapping","mapping-de"
+"1.001","DPT_Switch","Off;On","Aus;An"
+"1.002","DPT_Bool","False;True","Nein;Ja"
+"1.003","DPT_Enable","Enabled;Disabled","Deaktiviert;Aktiviert"
+"1.004","DPT_Ramp",,
+"1.005","DPT_Alarm",,
+"1.006","DPT_BinaryValue","0;1","0;1"
+"1.007","DPT_Step",,
+"1.008","DPT_UpDown","Up;Down","Oben;Unten"
+"1.009","DPT_OpenClose","Open;Closed","Offen;Geschlossen"
+"1.010","DPT_Start",,
+"1.011","DPT_State",,
+"1.012","DPT_Invert",,
+"1.013","DPT_DimSendStyle",,
+"1.014","DPT_InputSource",,
+"1.015","DPT_Reset",,
+"1.016","DPT_Ack",,
+"1.017","DPT_Trigger",,
+"1.018","DPT_Occupancy",,
+"1.019","DPT_Window_Door","Closed;Open","Geschlossen;Offen"
+"1.021","DPT_LogicalFunction",,
+"1.022","DPT_Scene_AB",,
+"1.023","DPT_ShutterBlinds_Mode",,
+"1.100","DPT_Heat/Cool",,
+"2.001","DPT_Switch_Control",,
+"2.002","DPT_Bool_Control",,
+"2.003","DPT_Enable_Control",,
+"2.004","DPT_Ramp_Control",,
+"2.005","DPT_Alarm_Control",,
+"2.006","DPT_BinaryValue_Control",,
+"2.007","DPT_Step_Control",,
+"2.008","DPT_Direction1_Control",,
+"2.009","DPT_Direction2_Control",,
+"2.010","DPT_Start_Control",,
+"2.011","DPT_State_Control",,
+"2.012","DPT_Invert_Control",,
+"3.007","DPT_Control_Dimming",,
+"3.008","DPT_Control_Blinds",,
+"4.001","DPT_Char_ASCII",,
+"4.002","DPT_Char_8859_1",,
+"5.001","DPT_Scaling","%","%"
+"5.003","DPT_Angle","°","°"
+"5.004","DPT_Percent_U8","%","%"
+"5.005","DPT_DecimalFactor",,
+"5.006","DPT_Tariff",,
+"5.010","DPT_Value_1_Ucount",,
+"6.001","DPT_Percent_V8","%","%"
+"6.010","DPT_Value_1_Count",,
+"6.020","DPT_Status_Mode3",,
+"7.001","DPT_Value_2_Ucount",,
+"7.002","DPT_TimePeriodMsec","ms","ms"
+"7.003","DPT_TimePeriod10MSec","ms","ms"
+"7.004","DPT_TimePeriod100MSec","ms","ms"
+"7.005","DPT_TimePeriodSec","s","s"
+"7.006","DPT_TimePeriodMin","m","m"
+"7.007","DPT_TimePeriodHrs","h","h"
+"7.010","DPT_PropDataType",,
+"7.011","DPT_Length_mm","mm","mm"
+"7.012","DPT_UElCurrentmA","mA","mA"
+"7.013","DPT_Brightness","lux","lux"
+"8.001","DPT_Value_2_Count",,
+"8.002","DPT_DeltaTimeMsec","ms","ms"
+"8.003","DPT_DeltaTime10MSec","ms","ms"
+"8.004","DPT_DeltaTime100MSec","ms","ms"
+"8.005","DPT_DeltaTimeSec","s","s"
+"8.006","DPT_DeltaTimeMin","m","m"
+"8.007","DPT_DeltaTimeHrs","h","h"
+"8.010","DPT_Percent_V16","%","%"
+"8.011","DPT_Rotation_Angle","°","°"
+"9.001","DPT_Value_Temp","°C","°C"
+"9.002","DPT_Value_Tempd","K","K"
+"9.003","DPT_Value_Tempa","K/h","K/h"
+"9.004","DPT_Value_Lux","lux","lux"
+"9.005","DPT_Value_Wsp","m/s","m/s"
+"9.006","DPT_Value_Pres","Pa","Pa"
+"9.007","DPT_Value_Humidity","%","%"
+"9.008","DPT_Value_AirQuality","ppm","ppm"
+"9.010","DPT_Value_Time1","s","s"
+"9.011","DPT_Value_Time2","ms","ms"
+"9.020","DPT_Value_Volt","mV","mV"
+"9.021","DPT_Value_Curr","mA","mA"
+"9.022","DPT_PowerDensity","W/m²","W/m²"
+"9.023","DPT_KelvinPerPercent","K/%","K/%"
+"9.024","DPT_Power","kW","kW"
+"9.025","DPT_Value_Volume_Flow","l/h","l/h"
+"9.026","DPT_Rain_Amount","l/m²","l/m²"
+"9.027","DPT_Value_Temp_F","°F","°F"
+"9.028","DPT_Value_Wsp_kmh","km/h","km/h"
+"10.001","DPT_TimeOfDay",,
+"11.001","DPT_Date",,
+"12.001","DPT_Value_4_Ucount",,
+"13.001","DPT_Value_4_Count",,
+"13.010","DPT_ActiveEnergy","Wh","Wh"
+"13.011","DPT_ApparantEnergy","VAh","VAh"
+"13.012","DPT_ReactiveEnergy","VARh","VARh"
+"13.013","DPT_ActiveEnergy_kWh","kWh","kWh"
+"13.014","DPT_ApparantEnergy_kVAh","kVAh","kVAh"
+"13.015","DPT_ReactiveEnergy_kVARh","kVARh","kVARh"
+"13.100","DPT_LongDeltaTimeSec","s","s"
+"14.000","DPT_Value_Acceleration","m/s","m/s"
+"14.001","DPT_Value_Acceleration_Angular","rad/s","rad/s"
+"14.002","DPT_Value_Activation_Energy","J","J"
+"14.003","DPT_Value_Activity","sievert","sievert"
+"14.004","DPT_Value_Mol","mol","mol"
+"14.005","DPT_Value_Amplitude",,
+"14.006","DPT_Value_AngleRad","rad","rad"
+"14.007","DPT_Value_AngleDeg","°","°"
+"14.008","DPT_Value_Angular_Momentum","Js","Js"
+"14.009","DPT_Value_Angular_Velocity","rad s","rad s"
+"14.010","DPT_Value_Area","m²","m²"
+"14.011","DPT_Value_Capacitance","F","F"
+"14.012","DPT_Value_Charge_DensitySurface","C/m²","C/m²"
+"14.013","DPT_Value_Charge_DensityVolume","C/m³","C/m³"
+"14.014","DPT_Value_Compressibility",,
+"14.015","DPT_Value_Conductance","Ohm","Ohm"
+"14.016","DPT_Value_Electrical_Conductivity",,
+"14.017","DPT_Value_Density","kg/m³","kg/m³"
+"14.018","DPT_Value_Electric_Charge","C","C"
+"14.019","DPT_Value_Electric_Current","A","A"
+"14.020","DPT_Value_Electric_CurrentDensity","A/m²","A/m²"
+"14.021","DPT_Value_Electric_DipoleMoment",,
+"14.022","DPT_Value_Electric_Displacement",,
+"14.023","DPT_Value_Electric_FieldStrength",,
+"14.024","DPT_Value_Electric_Flux",,
+"14.025","DPT_Value_Electric_FluxDensity",,
+"14.026","DPT_Value_Electric_Polarization",,
+"14.027","DPT_Value_Electric_Potential","V","V"
+"14.028","DPT_Value_Electric_PotentialDifference","V","V"
+"14.029","DPT_Value_ElectromagneticMoment",,
+"14.030","DPT_Value_Electromotive_Force",,
+"14.031","DPT_Value_Energy","J","J"
+"14.032","DPT_Value_Force","N","N"
+"14.033","DPT_Value_Frequency","Hz","Hz"
+"14.034","DPT_Value_Angular_Frequency",,
+"14.035","DPT_Value_Heat_Capacity",,
+"14.036","DPT_Value_Heat_FlowRate","W","W"
+"14.037","DPT_Value_Heat_Quantity","J","J"
+"14.038","DPT_Value_Impedance","Ohm","Ohm"
+"14.039","DPT_Value_Length","m","m"
+"14.040","DPT_Value_Light_Quantity","J (lm/s)","J (lm/s)"
+"14.041","DPT_Value_Luminance","cd/m²","cd/m²"
+"14.042","DPT_Value_Luminous_Flux","lm","lm"
+"14.043","DPT_Value_Luminous_Intensity","cd","cd"
+"14.044","DPT_Value_Magnetic_FieldStrength",,
+"14.045","DPT_Value_Magnetic_Flux","Wb","Wb"
+"14.046","DPT_Value_Magnetic_FluxDensity",,
+"14.047","DPT_Value_Magnetic_Moment",,
+"14.048","DPT_Value_Magnetic_Polarization",,
+"14.049","DPT_Value_Magnetization",,
+"14.050","DPT_Value_MagnetomotiveForce",,
+"14.051","DPT_Value_Mass","kg","kg"
+"14.052","DPT_Value_MassFlux","kg/s","kg/s"
+"14.053","DPT_Value_Momentum","N/s","N/s"
+"14.054","DPT_Value_Phase_AngleRad","rad","rad"
+"14.055","DPT_Value_Phase_AngleDeg","°","°"
+"14.056","DPT_Value_Power","W","W"
+"14.057","DPT_Value_Power_Factor","cos Φ ","cos Φ "
+"14.058","DPT_Value_Pressure","Pa","Pa"
+"14.059","DPT_Value_Reactance","Ω ","Ω "
+"14.060","DPT_Value_Resistance","Ω ","Ω "
+"14.061","DPT_Value_Resistivity","Ω/m","Ω/m"
+"14.062","DPT_Value_SelfInductance","H","H"
+"14.063","DPT_Value_SolidAngle","sr","sr"
+"14.064","DPT_Value_Sound_Intensity","W/m²","W/m²"
+"14.065","DPT_Value_Speed","m/s","m/s"
+"14.066","DPT_Value_Stress","Pa/m²","Pa/m²"
+"14.067","DPT_Value_Surface_Tension","Nm","Nm"
+"14.068","DPT_Value_Common_Temperature","°C","°C"
+"14.069","DPT_Value_Absolute_Temperature","K","K"
+"14.070","DPT_Value_TemperatureDifference","K","K"
+"14.071","DPT_Value_Thermal_Capacity","JK","JK"
+"14.072","DPT_Value_Thermal_Conductivity","W/m²","W/m²"
+"14.073","DPT_Value_ThermoelectricPower","V/K","V/K"
+"14.074","DPT_Value_Time","s","s"
+"14.075","DPT_Value_Torque","Nm","Nm"
+"14.076","DPT_Value_Volume","m³","m³"
+"14.077","DPT_Value_Volume_Flux","m³/s","m³/s"
+"14.078","DPT_Value_Weight","N","N"
+"14.079","DPT_Value_Work","J","J"
+"15.000","DPT_Access_Data",,
+"16.000","DPT_String_ASCII",,
+"16.001","DPT_String_8859_1",,
+"17.001","DPT_SceneNumber",,
+"18.001","DPT_SceneControl",,
+"19.001","DPT_DateTime",,
+"20.001","DPT_SCLOMode","autonom;slave;master","autonom;slave;master"
+"20.002","DPT_BuildingMode","used;notused;protection","used;notused;protection"
+"20.003","DPT_OccMode","occupied;standby;not occupied","occupied;standby;not occupied"
+"20.004","DPT_Priority","High;Medium;Low;void","High;Medium;Low;void"
+"20.005","DPT_LightApplicationMode","Normal;Simulation;Night","Normal;Simulation;Night"
+"20.006","DPT_ApplicationArea",,
+"20.007","DPT_AlarmClassType","reserved;simple alarm;basic alarm;ext alarm","reserved;simple alarm;basic alarm;ext alarm"
+"20.008","DPT_PSUMode","disabled;enabled;auto","disabled;enabled;auto"
+"20.011","DPT_ErrorClass_System",,
+"20.012","DPT_ErrorClass_HVAC",,
+"20.013","DPT_Time_Delay",,
+"20.014","DPT_Beaufort_Wind_Force_Scale",,
+"20.017","DPT_SensorSelect",,
+"20.100","DPT_FuelType",,
+"20.101","DPT_BurnerType",,
+"20.102","DPT_HVACMode","Auto;Comfort;Standby;Economy;Building protection","Auto;Comfort;Standby;Economy;Building protection"
+"20.103","DPT_DHWMode",,
+"20.104","DPT_LoadPriority",,
+"20.105","DPT_HVACContrMode",,
+"20.106","DPT_HVACEmergMode",,
+"20.107","DPT_ChangeoverMode",,
+"20.108","DPT_ValveMode",,
+"20.109","DPT_DamperMode",,
+"20.110","DPT_HeaterMode",,
+"20.111","DPT_FanMode",,
+"20.112","DPT_MasterSlaveMode",,
+"20.113","DPT_StatusRoomSetp",,
+"20.600","DPT_Behaviour_Lock_Unlock",,
+"20.601","DPT_Behaviour_Bus_Power_Up_Down",,
+"20.1000","DPT_CommMode",,
+"20.1001","DPT_AddInfoTypes",,
+"20.1002","DPT_RF_ModeSelect",,
+"20.1003","DPT_RF_FilterSelect",,
+"21.001","DPT_StatusGen",,
+"21.002","DPT_Device_Control",,
+"21.100","DPT_ForceSign",,
+"21.101","DPT_ForceSignCool",,
+"21.102","DPT_StatusRHC",,
+"21.103","DPT_StatusSDHWC",,
+"21.104","DPT_FuelTypeSet",,
+"21.105","DPT_StatusRCC",,
+"21.106","DPT_StatusAHU",,
+"21.1000","DPT_RF_ModeInfo",,
+"21.1001","DPT_RF_FilterInfo",,
+"21.1010","DPT_Channel_Activation_8",,
+"22.100","DPT_StatusDHWC",,
+"22.101","DPT_StatusRHCC",,
+"22.1000","DPT_Media",,
+"22.1010","DPT_Channel_Activation_16",,
+"23.001","DPT_OnOff_Action",,
+"23.002","DPT_Alarm_Reaction",,
+"23.003","DPT_UpDown_Action",,
+"23.102","DPT_HVAC_PB_Action",,
+"24.001","DPT_VarString_8859_1",,
+"25.1000","DPT_DoubleNibble",,
+"26.001","DPT_SceneInfo",,
+"27.001","DPT_CombinedInfoOnOff",,
+"28.001","DPT_UTF-8",,
+"29.010","DPT_ActiveEnergy_V64",,
+"29.011","DPT_ApparantEnergy_V64",,
+"29.012","DPT_ReactiveEnergy_V64",,
+"30.1010","DPT_Channel_Activation_24",,
+"31.101","DPT_PB_Action_HVAC_Extended",,
+"200.100","DPT_Heat/Cool_Z",,
+"200.101","DPT_BinaryValue_Z",,
+"201.100","DPT_HVACMode_Z",,
+"201.102","DPT_DHWMode_Z",,
+"201.104","DPT_HVACContrMode_Z",,
+"201.105","DPT_EnablH/Cstage_Z",,
+"201.107","DPT_BuildingMode_Z",,
+"201.108","DPT_OccMode_Z",,
+"201.109","DPT_HVACEmergMode_Z",,
+"202.001","DPT_RelValue_Z",,
+"202.002","DPT_UCountValue8_Z",,
+"203.002","DPT_TimePeriodMsec_Z",,
+"203.003","DPT_TimePeriod10Msec_Z",,
+"203.004","DPT_TimePeriod100Msec_Z",,
+"203.005","DPT_TimePeriodSec_Z",,
+"203.006","DPT_TimePeriodMin_Z",,
+"203.007","DPT_TimePeriodHrs_Z",,
+"203.011","DPT_UFlowRateLiter/h_Z",,
+"203.012","DPT_UCountValue16_Z",,
+"203.013","DPT_UElCurrent?A_Z",,
+"203.014","DPT_PowerKW_Z",,
+"203.015","DPT_AtmPressureAbs_Z",,
+"203.017","DPT_PercentU16_Z",,
+"203.100","DPT_HVACAirQual_Z",,
+"203.101","DPT_WindSpeed_Z",,
+"203.102","DPT_SunIntensity_Z",,
+"203.104","DPT_HVACAirFlowAbs_Z",,
+"204.001","DPT_RelSignedValue_Z",,
+"205.002","DPT_DeltaTimeMsec_Z",,
+"205.003","DPT_DeltaTime10Msec_Z",,
+"205.004","DPT_DeltaTime100Msec_Z",,
+"205.005","DPT_DeltaTimeSec_Z",,
+"205.006","DPT_DeltaTimeMin_Z",,
+"205.007","DPT_DeltaTimeHrs_Z",,
+"205.100","DPT_TempHVACAbs_Z",,
+"205.101","DPT_TempHVACRel_Z",,
+"205.102","DPT_HVACAirFlowRel_Z",,
+"206.100","DPT_HVACModeNext",,
+"206.102","DPT_DHWModeNext",,
+"206.104","DPT_OccModeNext",,
+"206.105","DPT_BuildingModeNext",,
+"207.100","DPT_StatusBUC",,
+"207.101","DPT_LockSign",,
+"207.102","DPT_ValueDemBOC",,
+"207.104","DPT_ActPosDemAbs",,
+"207.105","DPT_StatusAct",,
+"209.100","DPT_StatusHPM",,
+"209.101","DPT_TempRoomDemAbs",,
+"209.102","DPT_StatusCPM",,
+"209.103","DPT_StatusWTC",,
+"210.100","DPT_TempFlowWaterDemAbs",,
+"211.100","DPT_EnergyDemWater",,
+"212.100","DPT_TempRoomSetpSetShift[3]",,
+"212.101","DPT_TempRoomSetpSet[3]",,
+"213.100","DPT_TempRoomSetpSet[4]",,
+"213.101","DPT_TempDHWSetpSet[4]",,
+"213.102","DPT_TempRoomSetpSetShift[4]",,
+"214.100","DPT_PowerFlowWaterDemHPM",,
+"214.101","DPT_PowerFlowWaterDemCPM",,
+"215.100","DPT_StatusBOC",,
+"215.101","DPT_StatusCC",,
+"216.100","DPT_SpecHeatProd",,
+"217.001","DPT_Version",,
+"218.001","DPT_VolumeLiter_Z",,
+"219.001","DPT_AlarmInfo",,
+"220.100","DPT_TempHVACAbsNext",,
+"221.001","DPT_SerNum",,
+"222.100","DPT_TempRoomSetpSetF16[3]",,
+"222.101","DPT_TempRoomSetpSetShiftF16[3]",,
+"223.100","DPT_EnergyDemAir",,
+"224.100","DPT_TempSupply",,
+"225.001","DPT_ScalingSpeed",,
+"225.002","DPT_Scaling_Step_Time",,
+"229.001","DPT_MeteringValue",,
+"230.1000","DPT_MBus_Address",,
+"231.001","DPT_Locale_ASCII",,
+"232.600","DPT_Colour_RGB",,
+"234.001","DPT_LanguageCodeAlpha2_ASCII",,
+"234.002","DPT_RegionCodeAlpha2_ASCII",,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2011-10-20 20:47:37
|
Revision: 456
http://openautomation.svn.sourceforge.net/openautomation/?rev=456&view=rev
Author: mayerch
Date: 2011-10-20 20:47:31 +0000 (Thu, 20 Oct 2011)
Log Message:
-----------
Selection list for multitrigger layout and preparation for relative mode
Modified Paths:
--------------
CometVisu/trunk/visu/designs/structure_pure.js
Modified: CometVisu/trunk/visu/designs/structure_pure.js
===================================================================
--- CometVisu/trunk/visu/designs/structure_pure.js 2011-10-19 15:24:07 UTC (rev 455)
+++ CometVisu/trunk/visu/designs/structure_pure.js 2011-10-20 20:47:31 UTC (rev 456)
@@ -747,8 +747,9 @@
mapping: { type: 'mapping' , required: false },
styling: { type: 'styling' , required: false },
align: { type: 'string' , required: false },
- infoposition: { type: 'numeric' , required: false },
- format: { type: 'string' , required: false }
+ infoposition: { type: 'list' , required: true , list: {0: 'Info/Down/Up', 1: 'Down/Info/Up', 2: 'Down/Up/Info'} },
+ format: { type: 'string' , required: false },
+ change: { type: 'list' , required: true , list: {'relative': 'relative', 'absolute': 'absolute'} }
},
elements: {
label: { type: 'string', required: false, multi: false },
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|