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