Hallo Wiregate-Freunde,
EXPERIMENTAL!
Hier ein Patch für den wiregated.pl (PL30), mit dem knx_write auch Datum/Uhrzeit (DPT 11.001 und 10.001) schreiben kann. Diese DPTs werden bisher ignoriert, obwohl knx_read sie lesen kann.
Vorweg: KNOW WHAT YOU DO - wer seinen wiregated.pl patcht, sollte auch wissen, wie er wieder zurückkommt, wenn was schiefgeht.
Das Format, in dem der gepatchte knx_write die Werte für Datum/Zeit erwartet, ist kompatibel zu knx_read, also "Mo 12:34:23" für Zeiten (Wochentag und Sekunden dürfen entfallen, ist aber ungetestet) und "2012-04-15" für Daten.
Daher sollten folgende Dinge alle funktionieren (bei mir klappt's):
...und hier der wiregated.pl-Patch, anzuwenden auf /usr/sbin/wiregated.pl.
Vor dem Patch: Backup machen.
Nach dem Patch: /etc/init.d/wiregated restart
Have fun,
Grüße,
Fry
PS. Die Geschichte ist natürlich auch kompatibel zur Ansage von Datum/Uhrzeit mit dem Plugin Ansagen.pl, das ich letzte Woche ins SVN gestellt habe.
EXPERIMENTAL!
Hier ein Patch für den wiregated.pl (PL30), mit dem knx_write auch Datum/Uhrzeit (DPT 11.001 und 10.001) schreiben kann. Diese DPTs werden bisher ignoriert, obwohl knx_read sie lesen kann.
Vorweg: KNOW WHAT YOU DO - wer seinen wiregated.pl patcht, sollte auch wissen, wie er wieder zurückkommt, wenn was schiefgeht.
Das Format, in dem der gepatchte knx_write die Werte für Datum/Zeit erwartet, ist kompatibel zu knx_read, also "Mo 12:34:23" für Zeiten (Wochentag und Sekunden dürfen entfallen, ist aber ungetestet) und "2012-04-15" für Daten.
Daher sollten folgende Dinge alle funktionieren (bei mir klappt's):
Code:
use POSIX qw(strftime);
$datum1=knx_read('0/7/12',300,11.001);
$datum2=strftime "%F", time();
$datum3=`/bin/date +"%F"`;
knx_write('0/1/2',$datum1,11.001);
knx_write('0/1/2',$datum2,11.001);
knx_write('0/1/2',$datum3,11.001);
$zeit1=knx_read('0/7/13',300,10.001); # lesen zB von der Wetterstation
$zeit2=strftime "%a %X", time(),0,2,0,0,70,0,0; # Sommerzeit (1 statt 2 für Winterzeit)
$zeit3=`/bin/date +"%a %X"`; # Zeitzone des WG
knx_write('0/1/3',$zeit1,10.001);
knx_write('0/1/3',$zeit2,10.001);
knx_write('0/1/3',$zeit3,10.001);
Vor dem Patch: Backup machen.
Nach dem Patch: /etc/init.d/wiregated restart
Code:
@@ -416,6 +416,26 @@
when (/^16/) { $bytes = pack ("CCa14", 0, $apci, $value); }
when (/^17/) { $bytes = pack ("CCC", 0, $apci, $value & 0x3F); }
when (/^20/) { $bytes = pack ("CCC", 0, $apci, $value); }
+ when (/^10/)
+ {
+ my %wd=(Mo=>1, Di=>2, Mi=>3, Do=>4, Fr=>5, Sa=>6, So=>7);
+ my $wdpat=join('|',keys %wd);
+ my ($w,$h,$m,$s);
+ return unless ($w,$h,$m,$s)=($value=~/^($wdpat)?\s*([0-2][0-9])\:([0-5][0-9])\:?([0-5][0-9])?\s*/si);
+ return unless defined $h && defined $m;
+ $w=$wd{$w} if defined $wd{$w};
+ $h+=($w<<5) if $w;
+ $s=0 unless $s;
+ $bytes=pack("CCCCC",0,$apci,$h,$m,$s);
+ }
+ when (/^11/)
+ {
+ my ($y,$m,$d);
+ return unless ($y,$m,$d)=($value=~/^([1-2][0-9][0-9][0-9])\-([0-1][0-9])\-([0-3][0-9])\s*/si);
+ return if $y<1990 || $y>=2090;
+ $y%=100;
+ $bytes=pack("CCCCC",0,$apci,$d,$m,$y);
+ }
when (/^\d\d/) { return; } # other DPT XX 10,11,15 are unhandled
when (/^[1,2,3]/) { $bytes = pack ("CC", 0, $apci | ($value & 0x3f)); } #send 6bit small
when (/^[4]/) { $bytes = pack ("CCc", 0, $apci, ord($value)); }
Grüße,
Fry
PS. Die Geschichte ist natürlich auch kompatibel zur Ansage von Datum/Uhrzeit mit dem Plugin Ansagen.pl, das ich letzte Woche ins SVN gestellt habe.




Kommentar