|
From: <ma...@us...> - 2013-02-11 16:47:18
|
Revision: 1471
http://openautomation.svn.sourceforge.net/openautomation/?rev=1471&view=rev
Author: makki1
Date: 2013-02-11 16:47:07 +0000 (Mon, 11 Feb 2013)
Log Message:
-----------
add 8zones for C5, monit, cleanup
Modified Paths:
--------------
tools/russconnectd/trunk/cfgmaker.pl
tools/russconnectd/trunk/configure.ac
tools/russconnectd/trunk/debian/changelog
tools/russconnectd/trunk/debian/files
tools/russconnectd/trunk/russ_galist.ods
tools/russconnectd/trunk/src/main.c
Added Paths:
-----------
tools/russconnectd/trunk/debian/russconnectd.dirs
tools/russconnectd/trunk/debian/russconnectd.install
tools/russconnectd/trunk/debian/russconnectd.monit
tools/russconnectd/trunk/debian/russconnectd.postinst
Modified: tools/russconnectd/trunk/cfgmaker.pl
===================================================================
--- tools/russconnectd/trunk/cfgmaker.pl 2013-02-11 11:53:24 UTC (rev 1470)
+++ tools/russconnectd/trunk/cfgmaker.pl 2013-02-11 16:47:07 UTC (rev 1471)
@@ -11,7 +11,7 @@
### End config - Don't change below ###
#######################################
-my $ZONES_PER_CONTROLLER = 6; #static
+my $zones_per_controller = 6;
my @gfuncnames = qw(SetAllZonesPower WRITEONLYACT NA3 NA4 NA5 AllZonesPowerState);
use File::Copy;
@@ -22,7 +22,13 @@
use XML::Simple;
getopts("a:z:n:f:", \my %opts);
my $conf = Config::Tiny->new;
-
+
+my $ga_per_zone = 40;
+if ($opts{z} % 8 == 0) {
+ $zones_per_controller = 8;
+ $ga_per_zone = 30;
+}
+
my @funcdpts = qw (1.001 5.010 5.001 6.001 6.001 1.001 6.001 1.001 1.001 5.001 5.010 5.010 1.008);
my @funcdpts_sub = qw (DPT_Switch DPT_Value_1_Ucount DPT_Scaling DPT_Percent_V8 DPT_Percent_V8 DPT_Switch DPT_Percent_V8 DPT_Switch DPT_Switch DPT_Scaling DPT_Value_1_Ucount DPT_Value_1_Ucount DPT_UpDown);
my @statedpts = qw(1.001 5.010 5.001 6.001 6.001 1.001 6.001 1.001 1.001 5.001);
@@ -85,11 +91,11 @@
print XML "\t\t<object id=\"$NamePrefix"."_$gfuncnames[0]\" gad=\"" . addr2str($startga+1,1) . "\" type=\"1.001\">$NamePrefix $gfuncnames[0]</object>\n";
for (my $zone=0;$zone<$opts{z};$zone++) {
- #sendKNXdgram (0x80,1,(knxstartaddress+30)+(zone*40)+(controller*256),val);
- my $ctrl = int($zone/$ZONES_PER_CONTROLLER);
- my $czone = int($zone%$ZONES_PER_CONTROLLER);
- my $basega = $startga+10 + ($czone*40) + ($ctrl*256);
+ my $ctrl = int($zone/$zones_per_controller);
+ my $czone = int($zone%$zones_per_controller);
+ my $basega = $startga+10 + ($czone*$ga_per_zone) + ($ctrl*256);
my $basegastr = addr2str($basega,1);
+ $zonenames[$zone] = "Zone " . ($zone+1) unless $zonenames[$zone];
print STDERR "Zone " . ($zone+1) . " is $zonenames[$zone] base: $basegastr\n";
# funcs
for (my $i=0;$i<$#funcnames+1;$i++) {
Modified: tools/russconnectd/trunk/configure.ac
===================================================================
--- tools/russconnectd/trunk/configure.ac 2013-02-11 11:53:24 UTC (rev 1470)
+++ tools/russconnectd/trunk/configure.ac 2013-02-11 16:47:07 UTC (rev 1471)
@@ -1,7 +1,7 @@
dnl Process this file with autoconf to produce a configure script.
dnl Created by Anjuta application wizard.
-AC_INIT(russconnectd, 0.30, de...@wi..., , http://openautomation.sourceforge.net)
+AC_INIT(russconnectd, 0.31, de...@wi..., , http://openautomation.sourceforge.net)
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
Modified: tools/russconnectd/trunk/debian/changelog
===================================================================
--- tools/russconnectd/trunk/debian/changelog 2013-02-11 11:53:24 UTC (rev 1470)
+++ tools/russconnectd/trunk/debian/changelog 2013-02-11 16:47:07 UTC (rev 1471)
@@ -1,3 +1,10 @@
+russconnectd (0.31-1) lenny; urgency=low
+
+ * make zones more flexible, support 8 Zones on C5
+ * add monit
+
+ -- Michael Markstaller <de...@wi...> Mon, 11 Feb 2013 17:37:08 +0100
+
russconnectd (0.30-1) lenny; urgency=low
* adjust RNet for C5 - older models are untestet!
Modified: tools/russconnectd/trunk/debian/files
===================================================================
--- tools/russconnectd/trunk/debian/files 2013-02-11 11:53:24 UTC (rev 1470)
+++ tools/russconnectd/trunk/debian/files 2013-02-11 16:47:07 UTC (rev 1471)
@@ -1 +1 @@
-russconnectd_0.30-1_i386.deb unknown extra
+russconnectd_0.31-1_i386.deb unknown extra
Added: tools/russconnectd/trunk/debian/russconnectd.dirs
===================================================================
--- tools/russconnectd/trunk/debian/russconnectd.dirs (rev 0)
+++ tools/russconnectd/trunk/debian/russconnectd.dirs 2013-02-11 16:47:07 UTC (rev 1471)
@@ -0,0 +1,4 @@
+etc
+usr/bin
+etc/monit/enable
+
Added: tools/russconnectd/trunk/debian/russconnectd.install
===================================================================
--- tools/russconnectd/trunk/debian/russconnectd.install (rev 0)
+++ tools/russconnectd/trunk/debian/russconnectd.install 2013-02-11 16:47:07 UTC (rev 1471)
@@ -0,0 +1,2 @@
+debian/russconnectd.monit etc/monit/enable
+
Added: tools/russconnectd/trunk/debian/russconnectd.monit
===================================================================
--- tools/russconnectd/trunk/debian/russconnectd.monit (rev 0)
+++ tools/russconnectd/trunk/debian/russconnectd.monit 2013-02-11 16:47:07 UTC (rev 1471)
@@ -0,0 +1,6 @@
+check process russconnectd with pidfile /var/run/russconnectd.pid
+ start program = "/etc/init.d/russconnectd start"
+ stop program = "/etc/init.d/russconnectd stop"
+ if cpu > 80% for 5 cycles then alert
+ if totalmem > 2.0 MB for 5 cycles then restart
+
Added: tools/russconnectd/trunk/debian/russconnectd.postinst
===================================================================
--- tools/russconnectd/trunk/debian/russconnectd.postinst (rev 0)
+++ tools/russconnectd/trunk/debian/russconnectd.postinst 2013-02-11 16:47:07 UTC (rev 1471)
@@ -0,0 +1,10 @@
+#!/bin/sh -e
+
+do_monit () {
+ if [ -x /usr/sbin/monit ]; then
+ monit reload
+ fi
+}
+
+do_monit
+
Property changes on: tools/russconnectd/trunk/debian/russconnectd.postinst
___________________________________________________________________
Added: svn:executable
+ *
Modified: tools/russconnectd/trunk/russ_galist.ods
===================================================================
(Binary files differ)
Modified: tools/russconnectd/trunk/src/main.c
===================================================================
--- tools/russconnectd/trunk/src/main.c 2013-02-11 11:53:24 UTC (rev 1470)
+++ tools/russconnectd/trunk/src/main.c 2013-02-11 16:47:07 UTC (rev 1471)
@@ -33,26 +33,26 @@
#include <pthread.h>
#include <eibclient.h>
+#include "../config.h"
-
#define DEBUG 1
-#define DAEMON_NAME "russconnectd"
+#define DAEMON_NAME PACKAGE_NAME " " PACKAGE_VERSION
#define USAGESTRING "\n"\
"\t-d Run as daemon/No debug output\n"\
"\t-p <pidfile> PID-filename\n"\
"\t-i <ip:port> IP-Address:Port to send UDP-packets to russound\n"\
"\t-l <UDP-port> UDP port to listen on\n"\
"\t-a <KNX address> KNX start-address (see README)\n"\
- "\t-z <number> Number of Zones to support\n"\
- "\t-u <eib url> URL to conatct eibd like localo:/tmp/eib or ip:192.168.0.101\n"\
+ "\t-z <number> Number of Zones to support - must be a multiple of 6 or 8\n"\
+ "\t-u <eib url> URL to conatct eibd like local:/tmp/eib or ip:192.168.0.101\n"\
"\t-s (Optional) send all values to KNX on startup of daemon\n"\
- "\t-k 0x71 (Optional) Keypad ID - defaults to 0x70 for CAx - use 0x71 for C5\n"
+ "\t-k 0x71 (Optional) Keypad ID - defaults to 0x70 for CAx - use 0x71 for C3/C5/E5\n"\
+ "\t-v " PACKAGE_NAME " " PACKAGE_VERSION "\n"
#define NUM_THREADS 3
-#define MAX_ZONES 31
+#define MAX_ZONES 47
#define RETRY_TIME 5
#define BUFLEN 1024
#define POLLING_INTERVAL 10
-#define ZONES_PER_CONTROLLER 6
pthread_mutex_t zonelock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t initlock = PTHREAD_MUTEX_INITIALIZER;
@@ -84,7 +84,9 @@
char *eibd_url = "local:/tmp/eib";
int listenport = 16012;
int knxstartaddress = 50000;
-int numzones = ZONES_PER_CONTROLLER;
+int numzones = 6; //default to six
+int zones_per_controller = 6;
+int ga_per_zone = 40;
int pidFilehandle;
char *pidfilename = "/var/run/russconnectd.pid";
int sendOnStart = 0;
@@ -152,49 +154,31 @@
//Send device reset-event to wakeup (at least) E5 *NOT* C3/C5! - untested and most likely useless
if (keypadid == 0x71) {
char buf_devreset[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x05, 0x02, 0x02, 0, 0, 0x55, 0x01, 0x03, 0, 0x35, 0, 0x01, 0, 0xF7 };
- buf_devreset[4] = zone/ZONES_PER_CONTROLLER;
- buf_devreset[5] = zone%ZONES_PER_CONTROLLER;
+ buf_devreset[4] = zone/zones_per_controller;
+ buf_devreset[5] = zone%zones_per_controller;
buf_devreset[19] = (int) russChecksum (buf_devreset,21-2);
if (sendto(udpSocket, buf_devreset, 21, 0, (struct sockaddr *) &si_other, slen)==-1)
syslog(LOG_WARNING,"sendto failed!");
usleep(20*1000); //FIXME: throttle a little
}
- //Get Poweron-Volume
- /* same stuff, cc zz twice
- 8.8.3 Get Turn On Volume
- The current Turn On Volume for a particular zone can be obtained using the following message.
- Byte # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
- Value F0 cc 00 7F cc zz kk 01 05 02 00 zz 00 04 00 00 xx F7
- cc = controller number -1
- zz = zone number -1
- kk = keypad id = 0x70 (0x71 when connected to an ACA-E5).
- xx = checksum */
+ //Get Poweron-Volume 8.8.3 Get Turn On Volume
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[4] = zone/ZONES_PER_CONTROLLER;
- buf_onvol[5] = zone%ZONES_PER_CONTROLLER;
- buf_onvol[11] = zone%ZONES_PER_CONTROLLER;
+ buf_onvol[1] = zone/zones_per_controller;
+ buf_onvol[4] = zone/zones_per_controller;
+ buf_onvol[5] = zone%zones_per_controller;
+ buf_onvol[11] = zone%zones_per_controller;
buf_onvol[16] = (int) russChecksum (buf_onvol,18-2);
if (sendto(udpSocket, buf_onvol, 18, 0, (struct sockaddr *) &si_other, slen)==-1)
syslog(LOG_WARNING,"sendto failed!");
usleep(20*1000); //FIXME: throttle a little (20ms)
- //Get zonestate
+ //Get zonestate in once
char buf_getzone[25] = { 0xF0, 0, 0, 0x7F, 0, 0, keypadid, 0x01, 0x04, 0x02, 0, 0, 0x07, 0, 0, 0, 0xF7 };
- //FIXME: according to RNet 1.004 controller and zone are inserted twice!
- /* This is the Request message for the parameter values of the selected Zone.
- Byte # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
- Value F0 cc 00 7F cc zz kk 01 04 02 00 zz 07 00 00 xx F7
- cc = controller number -1
- zz = zone number -1
- kk = keypad id = 0x70 (0x71 when connected to an ACA-E5).
- xx = checksum
- */
- buf_getzone[1] = zone/ZONES_PER_CONTROLLER;
- buf_getzone[4] = zone/ZONES_PER_CONTROLLER;
- buf_getzone[5] = zone%ZONES_PER_CONTROLLER;
- buf_getzone[11] = zone%ZONES_PER_CONTROLLER;
+ buf_getzone[1] = zone/zones_per_controller;
+ buf_getzone[4] = zone/zones_per_controller;
+ buf_getzone[5] = zone%zones_per_controller;
+ buf_getzone[11] = zone%zones_per_controller;
buf_getzone[15] = (int) russChecksum (buf_getzone,17-2);
if (sendto(udpSocket, buf_getzone, 17, 0, (struct sockaddr *) &si_other, slen)==-1)
syslog(LOG_WARNING,"sendto failed!");
@@ -211,33 +195,13 @@
//block here until something is received from russound (it's turned off)
pthread_mutex_lock(&standbylock);
pthread_mutex_unlock(&standbylock);
- /* The whole stuff in RNET is a little different than it's written for the C5
- Zone and controller are set twice now, CA* understands the old, C5 not:
- 8.1.1 Set State
- Turn a specific Zone ON or OFF using a discrete message.
- Byte # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
- Value F0 cc 00 7F cc zz kk 05 02 02 00 00 F1 23 00 ## 00 zz 00 01 xx F7
- cc = controller number -1
- zz = zone number -1
- kk = 0x70 (0x71 when connected to an ACA-E5).
- xx = checksum
- Byte #16 = 0x00 (off) or 0x01(on)
- */
+ //8.1.1 Set State
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[4] = controller;
buf_msg1[5] = zone;
buf_msg1[17] = zone;
- /* Same stuff here: 8.4.2 Set Bass
- Select the Bass level for a particular zone using a discrete message.
- Byte # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
- Value F0 cc 00 7F cc zz kk 00 05 02 00 zz 00 00 00 00 00 01 00 01 00 ## xx F7
- cc = controller number -1
- zz = zone number -1
- kk = keypad id = 0x70 (0x71 when connected to an ACA-E5).
- xx = checksum
- Byte #22 = Bass level (0x00 = -10 ... 0x0A = Flat ... 0x14 = +10)
- */
+ // 8.4.2 Set Bass
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[4] = controller;
@@ -246,7 +210,7 @@
switch (func) {
case -9: //all zones
- //FIXME: different on C5!
+ //FIXME: All on different on C5!
/* controller 0:
All On F0 7E 00 7F 00 00 71 05 02 02 00 00 F1 22 00 01 00 00 00 01 10 F7
All Off F0 7E 00 7F 00 00 71 05 02 02 00 00 F1 22 00 00 00 00 00 01 0F F7
@@ -350,7 +314,7 @@
syslog(LOG_WARNING,"sendrussfunc sendto failed!");
usleep(20*1000); //FIXME: throttle a little (20ms)
if (buf_msg1[0] || buf_msg2[0])
- sendrussPolling (zone+(controller*ZONES_PER_CONTROLLER)); //fire update of states
+ sendrussPolling (zone+(controller*zones_per_controller)); //fire update of states
return 0;
}
@@ -492,10 +456,10 @@
switch (buf[1] & 0xC0) {
case 0x00:
func = (dest - knxstartaddress)%256;
- zone = (func-10)/40;
- func = (func-10)%40;
+ zone = (func-10)/ga_per_zone;
+ func = (func-10)%ga_per_zone;
controller = (dest - knxstartaddress)/256;
- sendKNXresponse (dest,zone+(controller*ZONES_PER_CONTROLLER),func);
+ sendKNXresponse (dest,zone+(controller*zones_per_controller),func);
break;
case 0x40:
//FIXME: response dunno
@@ -507,8 +471,8 @@
else
val = buf[2];
func = (dest - knxstartaddress)%256;
- zone = (func-10)/40;
- func = (func-10)%40;
+ zone = (func-10)/ga_per_zone;
+ func = (func-10)%ga_per_zone;
controller = (dest - knxstartaddress)/256;
sendrussFunc(controller,zone,func,val);
}
@@ -557,7 +521,7 @@
syslog(LOG_WARNING, "eibd: Unknown APDU from %d to %d",src,dest);
break;
} else {
- if ( dest<knxstartaddress || dest > (knxstartaddress+(numzones/ZONES_PER_CONTROLLER*256)-1) ) //not for us
+ if ( dest<knxstartaddress || dest > (knxstartaddress+(numzones/zones_per_controller*256)-1) ) //not for us
continue;
handleKNXdgram(dest,buf,len);
}
@@ -572,72 +536,72 @@
void *updateZone(unsigned char num, unsigned char val, int func) {
syslog(LOG_DEBUG, "update Zone %d val %d func %d",num,val,func);
- int controller = num/ZONES_PER_CONTROLLER;
- int zone = num%ZONES_PER_CONTROLLER;
+ int controller = num/zones_per_controller;
+ int zone = num%zones_per_controller;
//lock mutex befor updating
pthread_mutex_lock (&zonelock);
switch (func) {
case 1:
zones[num].zonepower =val;
if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,1,(knxstartaddress+30)+(zone*40)+(controller*256),val);
+ sendKNXdgram (0x80,1,(knxstartaddress+30)+(zone*ga_per_zone)+(controller*256),val);
break;
case 2:
zones[num].srcid =val;
if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,51,(knxstartaddress+31)+(zone*40)+(controller*256),val);
+ sendKNXdgram (0x80,51,(knxstartaddress+31)+(zone*ga_per_zone)+(controller*256),val);
break;
case 3:
zones[num].volume =val;
if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,5,(knxstartaddress+32)+(zone*40)+(controller*256),val*2);
+ sendKNXdgram (0x80,5,(knxstartaddress+32)+(zone*ga_per_zone)+(controller*256),val*2);
break;
case 4:
zones[num].bass =val;
if (zones[num].inited || sendOnStart) {
if (val<10)
- sendKNXdgram (0x80,51,(knxstartaddress+33)+(zone*40)+(controller*256),val-10+256);
+ sendKNXdgram (0x80,51,(knxstartaddress+33)+(zone*ga_per_zone)+(controller*256),val-10+256);
else
- sendKNXdgram (0x80,51,(knxstartaddress+33)+(zone*40)+(controller*256),val-10);
+ sendKNXdgram (0x80,51,(knxstartaddress+33)+(zone*ga_per_zone)+(controller*256),val-10);
}
break;
case 5:
zones[num].treble =val;
if (zones[num].inited || sendOnStart) {
if (val<10)
- sendKNXdgram (0x80,51,(knxstartaddress+34)+(zone*40)+(controller*256),val-10+256);
+ sendKNXdgram (0x80,51,(knxstartaddress+34)+(zone*ga_per_zone)+(controller*256),val-10+256);
else
- sendKNXdgram (0x80,51,(knxstartaddress+34)+(zone*40)+(controller*256),val-10);
+ sendKNXdgram (0x80,51,(knxstartaddress+34)+(zone*ga_per_zone)+(controller*256),val-10);
}
break;
case 6:
zones[num].loudness =val;
if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,1,(knxstartaddress+35)+(zone*40)+(controller*256),val);
+ sendKNXdgram (0x80,1,(knxstartaddress+35)+(zone*ga_per_zone)+(controller*256),val);
break;
case 7:
zones[num].balance =val;
if (zones[num].inited || sendOnStart) {
if (val<10)
- sendKNXdgram (0x80,51,(knxstartaddress+36)+(zone*40)+(controller*256),val-10+256);
+ sendKNXdgram (0x80,51,(knxstartaddress+36)+(zone*ga_per_zone)+(controller*256),val-10+256);
else
- sendKNXdgram (0x80,51,(knxstartaddress+36)+(zone*40)+(controller*256),val-10);
+ sendKNXdgram (0x80,51,(knxstartaddress+36)+(zone*ga_per_zone)+(controller*256),val-10);
}
break;
case 8:
zones[num].partymode =val;
if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,1,(knxstartaddress+37)+(zone*40)+(controller*256),val);
+ sendKNXdgram (0x80,1,(knxstartaddress+37)+(zone*ga_per_zone)+(controller*256),val);
break;
case 9:
zones[num].dnd =val;
if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,1,(knxstartaddress+38)+(zone*40)+(controller*256),val);
+ sendKNXdgram (0x80,1,(knxstartaddress+38)+(zone*ga_per_zone)+(controller*256),val);
break;
case 10:
zones[num].onvolume =val;
if (zones[num].inited || sendOnStart)
- sendKNXdgram (0x80,5,(knxstartaddress+39)+(zone*40)+(controller*256),val*2);
+ sendKNXdgram (0x80,5,(knxstartaddress+39)+(zone*ga_per_zone)+(controller*256),val*2);
break;
default:
break;
@@ -651,7 +615,7 @@
if ((len==34) && (buf[0]==0xF0) && (buf[9]==0x04)) { //zone-status
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
+ buf[12] = (buf[4]*zones_per_controller)+buf[12]; //controller + zonenumber
if (buf[20] != zones[buf[12]].zonepower || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[20],1);
@@ -673,10 +637,10 @@
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
- //FIXME: this *might* be wrong andf trigger also on other msgs, as it's written otherwise in the docs, the checked bytes are just a guess!
+ //FIXME: this *might* be wrong and trigger also on other msgs, as it's written otherwise in the docs, the checked bytes are just a guess!
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
+ buf[12] = (buf[4]*zones_per_controller)+buf[12]; //controller + zonenumber
if (buf[21] != zones[buf[12]].onvolume || (sendOnStart && !zones[buf[12]].inited))
updateZone(buf[12],buf[21],10);
} else if ((len==23) && (buf[0]==0xF0) && (buf[7]==0x05)) { //FIXME: C5 sends this periodically
@@ -847,6 +811,20 @@
break;
case 'z':
numzones = atoi(optarg);
+ if (numzones < 6)
+ numzones = 6; //Quirk for CA4, we just use 6
+ if (numzones%6 == 0) {
+ zones_per_controller = 6;
+ ga_per_zone = 40;
+ }
+ else if (numzones%8 == 0) {
+ zones_per_controller = 8;
+ ga_per_zone = 30;
+ }
+ else {
+ fprintf (stderr, "Illegal number of zones: %d \nUsage: %s %s", numzones, argv[0], USAGESTRING);
+ return 1;
+ }
break;
case 'u':
eibd_url = optarg;
@@ -871,8 +849,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 SendonStartup: %d KeypadID: %li",
- russipaddr, russport, listenport, pidfilename, knxstartaddress, numzones, eibd_url, sendOnStart, keypadid);
+ syslog(LOG_DEBUG, "startup with debug; Russ-IP: %s:%d, listenport %d, pidfile: %s, start address: %d, number of zones/per controller/GAs: %d/%d/%d, eibd: %s SendonStartup: %d KeypadID: %li",
+ russipaddr, russport, listenport, pidfilename, knxstartaddress, numzones, zones_per_controller, ga_per_zone, 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.
|