2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-27 22:53:29 +00:00

FHT: Internal changes as I understand the protocol better.

WS2000: Changes from Peter
CUL_WS: Sign changes from some strange 433MHz devices.


git-svn-id: https://svn.fhem.de/fhem/trunk@243 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2008-09-21 17:55:28 +00:00
parent 95cccf4dd6
commit 2ffb9b2f15
3 changed files with 107 additions and 118 deletions

View File

@ -10,88 +10,87 @@ sub getFhtMin($);
sub getFhtBuffer($); sub getFhtBuffer($);
my %codes = ( my %codes = (
"0000.." => "actuator", "00" => "actuator",
"0100.." => "actuator1", "01" => "actuator1",
"0200.." => "actuator2", "02" => "actuator2",
"0300.." => "actuator3", "03" => "actuator3",
"0400.." => "actuator4", "04" => "actuator4",
"0500.." => "actuator5", "05" => "actuator5",
"0600.." => "actuator6", "06" => "actuator6",
"0700.." => "actuator7", "07" => "actuator7",
"0800.." => "actuator8", "08" => "actuator8",
"140069" => "mon-from1", "14" => "mon-from1",
"150069" => "mon-to1", "15" => "mon-to1",
"160069" => "mon-from2", "16" => "mon-from2",
"170069" => "mon-to2", "17" => "mon-to2",
"180069" => "tue-from1", "18" => "tue-from1",
"190069" => "tue-to1", "19" => "tue-to1",
"1a0069" => "tue-from2", "1a" => "tue-from2",
"1b0069" => "tue-to2", "1b" => "tue-to2",
"1c0069" => "wed-from1", "1c" => "wed-from1",
"1d0069" => "wed-to1", "1d" => "wed-to1",
"1e0069" => "wed-from2", "1e" => "wed-from2",
"1f0069" => "wed-to2", "1f" => "wed-to2",
"200069" => "thu-from1", "20" => "thu-from1",
"210069" => "thu-to1", "21" => "thu-to1",
"220069" => "thu-from2", "22" => "thu-from2",
"230069" => "thu-to2", "23" => "thu-to2",
"240069" => "fri-from1", "24" => "fri-from1",
"250069" => "fri-to1", "25" => "fri-to1",
"260069" => "fri-from2", "26" => "fri-from2",
"270069" => "fri-to2", "27" => "fri-to2",
"280069" => "sat-from1", "28" => "sat-from1",
"290069" => "sat-to1", "29" => "sat-to1",
"2a0069" => "sat-from2", "2a" => "sat-from2",
"2b0069" => "sat-to2", "2b" => "sat-to2",
"2c0069" => "sun-from1", "2c" => "sun-from1",
"2d0069" => "sun-to1", "2d" => "sun-to1",
"2e0069" => "sun-from2", "2e" => "sun-from2",
"2f0069" => "sun-to2", "2f" => "sun-to2",
"3e0069" => "mode", "3e" => "mode",
"3f0069" => "holiday1", # Not verified "3f" => "holiday1", # Not verified
"400069" => "holiday2", # Not verified "40" => "holiday2", # Not verified
"410069" => "desired-temp", "41" => "desired-temp",
"XX0069" => "measured-temp", # sum of next. two, never really sent "XX" => "measured-temp", # sum of next. two, never really sent
"420069" => "measured-low", "42" => "measured-low",
"430069" => "measured-high", "43" => "measured-high",
"440069" => "warnings", "44" => "warnings",
"450069" => "manu-temp", # No clue what it does. "45" => "manu-temp", # No clue what it does.
"..0067" => "repeat1", # repeat the last data (?) "4b" => "ack",
"..0077" => "repeat2", "53" => "can-xmit",
"54" => "can-rcv",
"600069" => "year", "60" => "year",
"610069" => "month", "61" => "month",
"620069" => "day", "62" => "day",
"630069" => "hour", "63" => "hour",
"640069" => "minute", "64" => "minute",
"650069" => "report1", "65" => "report1",
"660069" => "report2", "66" => "report2",
"820069" => "day-temp", "7d" => "start-xmit",
"840069" => "night-temp", "7e" => "end-xmit",
"850069" => "lowtemp-offset", # Alarm-Temp.-Differenz
"8a0069" => "windowopen-temp", "82" => "day-temp",
"84" => "night-temp",
"85" => "lowtemp-offset", # Alarm-Temp.-Differenz
"8a" => "windowopen-temp",
); );
my %cantset = ( my %cantset = (
"actuators" => 1, "ack" => 1,
"actuator1" => 1, "can-xmit" => 1,
"actuator2" => 1, "can-rcv" => 1,
"actuator3" => 1, "start-xmit" => 1,
"actuator4" => 1, "end-xmit" => 1,
"actuator5" => 1,
"actuator6" => 1,
"actuator7" => 1,
"actuator8" => 1,
"measured-temp" => 1, "measured-temp" => 1,
"measured-high" => 1, "measured-high" => 1,
"measured-low" => 1, "measured-low" => 1,
"warnings" => 1, "warnings" => 1,
"repeat1" => 1,
"repeat2" => 1,
); );
@ -109,7 +108,6 @@ my %priority = (
my %c2m = (0 => "auto", 1 => "manual", 2 => "holiday", 3 => "holiday_short"); my %c2m = (0 => "auto", 1 => "manual", 2 => "holiday", 3 => "holiday_short");
my %m2c; # Reverse c2m my %m2c; # Reverse c2m
my %c2b; # command->button hash (reverse of codes) my %c2b; # command->button hash (reverse of codes)
my %c2bset; # Setteable values
my %defptr; my %defptr;
my $defmin = 0; # min fhtbuf free bytes before sending commands my $defmin = 0; # min fhtbuf free bytes before sending commands
@ -125,7 +123,6 @@ FHT_Initialize($)
foreach my $k (keys %codes) { foreach my $k (keys %codes) {
my $v = $codes{$k}; my $v = $codes{$k};
$c2b{$v} = $k; $c2b{$v} = $k;
$c2bset{$v} = substr($k, 0, 2) if(!defined($cantset{$v}));
} }
foreach my $k (keys %c2m) { foreach my $k (keys %c2m) {
$m2c{$c2m{$k}} = $k; $m2c{$c2m{$k}} = $k;
@ -172,13 +169,15 @@ FHT_Set($@)
$allcmd .=" " if($allcmd); $allcmd .=" " if($allcmd);
$allcmd .= $cmd; $allcmd .= $cmd;
return "Unknown argument $cmd, choose one of " . join(" ",sort keys %c2bset) return "Unknown argument $cmd, choose one of " . join(" ",sort keys %c2b)
if(!defined($c2bset{$cmd})); if(!defined($c2b{$cmd}));
return "\"set $name\" needs a parameter" return "Readonly parameter $cmd"
if(defined($cantset{$cmd}));
return "\"set $name $cmd\" needs a parameter"
if(@a < 1); if(@a < 1);
$ncmd++; $ncmd++;
$val = shift(@a); $val = shift(@a);
$arg .= $c2bset{$cmd}; $arg .= $c2b{$cmd};
if ($cmd =~ m/-temp/) { if ($cmd =~ m/-temp/) {
@ -302,8 +301,9 @@ FHT_Parse($$)
{ {
my ($hash, $msg) = @_; my ($hash, $msg) = @_;
$msg = lc($msg);
my $dev = substr($msg, 16, 4); my $dev = substr($msg, 16, 4);
my $cde = substr($msg, 20, 6); my $cde = substr($msg, 20, 2);
my $val = substr($msg, 26, 2) if(length($msg) > 26); my $val = substr($msg, 26, 2) if(length($msg) > 26);
my $confirm = 0; my $confirm = 0;
@ -315,35 +315,17 @@ FHT_Parse($$)
my $def = $defptr{$dev}; my $def = $defptr{$dev};
my $name = $def->{NAME}; my $name = $def->{NAME};
# Unknown, but don't want report it. Should come with c409c401 if(!$val || $cde eq "65" || $cde eq "66") {
return "" if($cde eq "00");
if(length($cde) < 6) {
Log GetLogLevel($name,2), "FHT Unknown code from $name : $cde";
$def->{CHANGED}[0] = "unknown_$cde";
return $name;
}
my $scmd = substr($cde, 0, 2);
if(!$val || $scmd eq "65" || $scmd eq "66") {
# This is a confirmation message. We reformat it so that # This is a confirmation message. We reformat it so that
# it looks like a real message, and let the rest parse it # it looks like a real message, and let the rest parse it
Log 4, "FHT $name confirmation: $cde"; Log 4, "FHT $name confirmation: $cde";
$val = substr($cde, 2, 2); $val = substr($msg, 22, 2);
$cde = $scmd . "0069";
$confirm = 1; $confirm = 1;
} }
my $cmd;
foreach my $c (keys %codes) {
if($cde =~ m/$c/) {
$cmd = $codes{$c};
last;
}
}
$val = hex($val); $val = hex($val);
my $cmd = $codes{$cde};
if(!$cmd) { if(!$cmd) {
Log 4, "FHT $name (Unknown: $cde => $val)"; Log 4, "FHT $name (Unknown: $cde => $val)";
$def->{CHANGED}[0] = "unknown_$cde: $val"; $def->{CHANGED}[0] = "unknown_$cde: $val";
@ -371,7 +353,7 @@ FHT_Parse($$)
} elsif($cmd =~ m/^actuator/) { } elsif($cmd =~ m/^actuator/) {
my $sval = substr($cde, 4, 2); my $sval = substr($msg,24,2);
my $fv = sprintf("%d%%", int(100*$val/255+0.5)); my $fv = sprintf("%d%%", int(100*$val/255+0.5));
if($sval =~ m/.6/) { $val = "$fv" } if($sval =~ m/.6/) { $val = "$fv" }
@ -412,6 +394,8 @@ FHT_Parse($$)
} }
$cmd = "FHZ:$cmd" if(substr($msg,24,1) eq "7");
$def->{READINGS}{$cmd}{TIME} = $tn; $def->{READINGS}{$cmd}{TIME} = $tn;
$def->{READINGS}{$cmd}{VAL} = $val; $def->{READINGS}{$cmd}{VAL} = $val;
$def->{CHANGED}[0] = "$cmd: $val"; $def->{CHANGED}[0] = "$cmd: $val";

View File

@ -62,7 +62,8 @@ CUL_WS_Parse($$)
# K41505268 -> Code 5, T: 25.0 H: 68.5 # K41505268 -> Code 5, T: 25.0 H: 68.5
my @a = split("", $msg); my @a = split("", $msg);
my $cde = (($a[1]+0)&7) + 1; my $firstbyte = hex($a[1]);
my $cde = ($firstbyte&7) + 1;
my $sgn = (($a[1]+0)&8) ? -1 : 1; my $sgn = (($a[1]+0)&8) ? -1 : 1;
my $tmp = $sgn * ($a[6].$a[3].".".$a[4]); my $tmp = $sgn * ($a[6].$a[3].".".$a[4]);
my $hum = $a[7].$a[8].".".$a[5]; my $hum = $a[7].$a[8].".".$a[5];

View File

@ -4,7 +4,8 @@ package main;
# Modul for FHEM # Modul for FHEM
# #
# contributed by thomas dressler 2008 # contributed by thomas dressler 2008
# $Id: 87_WS2000.pm,v 1.4 2008-09-06 08:33:25 rudolfkoenig Exp $ # $Id: 87_WS2000.pm,v 1.5 2008-09-21 17:55:28 rudolfkoenig Exp $
# corr. negativ temps / peterp
########################### ###########################
use strict; use strict;
use Switch; use Switch;
@ -81,7 +82,7 @@ WS2000_Define($$)
return "Can't open Device $PortName: $^E\n"; return "Can't open Device $PortName: $^E\n";
} }
#$hash->{FD}=$PortObj->{_HANDLE}; #$hash->{FD}=$PortObj->{_HANDLE};
$readyfnlist{"$a[0].$a[2]"} = $hash; # $readyfnlist{"$a[0].$a[2]"} = $hash;
} else { } else {
eval ("use Device::SerialPort;"); eval ("use Device::SerialPort;");
if ($@) { if ($@) {
@ -96,7 +97,7 @@ WS2000_Define($$)
return "Can't open Device $PortName: $^E\n"; return "Can't open Device $PortName: $^E\n";
} }
$hash->{FD}=$PortObj->FILENO; $hash->{FD}=$PortObj->FILENO;
$selectlist{"$a[0].$a[2]"} = $hash; # $selectlist{"$a[0].$a[2]"} = $hash;
} }
#Parameter 19200,8,2,Odd,None #Parameter 19200,8,2,Odd,None
$PortObj->baudrate(19200); $PortObj->baudrate(19200);
@ -127,7 +128,7 @@ WS2000_Define($$)
} }
$xport->autoflush(1); $xport->autoflush(1);
$hash->{FD}=$xport->fileno; $hash->{FD}=$xport->fileno;
$selectlist{"$a[0].$a[2]"} = $hash; # $selectlist{"$a[0].$a[2]"} = $hash;
$hash->{socket}=$xport; $hash->{socket}=$xport;
@ -345,11 +346,12 @@ WS2000_Parse($$) {
$snr -= 8; $snr -= 8;
$sensor = "Temperatursensor V1.2(" .$snr. ")"; $sensor = "Temperatursensor V1.2(" .$snr. ")";
} }
if ($w1 >= 64) { $daten1 = (($w1 * 128 + $w2) );
$daten1 = ((255 - $w1 - $w2) / 10) * (-1); if ($daten1 >= 16085)
}else{ {
$daten1 = (($w1 * 128 + $w2) / 10); $daten1 = $daten1 - 16384;
} }
$daten1 = $daten1 / 10;
$shortname='TX'.$snr; $shortname='TX'.$snr;
$einheit1 = " C"; $einheit1 = " C";
$result = $shortname . " => T:" . $daten1 . $einheit1; $result = $shortname . " => T:" . $daten1 . $einheit1;
@ -362,11 +364,12 @@ WS2000_Parse($$) {
$snr -= 8; $snr -= 8;
$sensor = "Temperatursensor mit Feuchte V1.2(" . $snr . ")"; $sensor = "Temperatursensor mit Feuchte V1.2(" . $snr . ")";
} }
if ($w1 >= 64) { $daten1 = (($w1 * 128 + $w2) );
$daten1 = ((255 - $w1 - $w2) / 10) * (-1); if ($daten1 >= 16085)
}else{ {
$daten1 = (($w1 * 128 + $w2) / 10); $daten1 = $daten1 - 16384;
} }
$daten1 = $daten1 / 10;
$shortname='TH'.$snr; $shortname='TH'.$snr;
$einheit1 = " C"; $einheit1 = " C";
$daten2 = $w3; $daten2 = $w3;
@ -449,11 +452,12 @@ WS2000_Parse($$) {
$snr -= 8; $snr -= 8;
$sensor = "Innensensor V1.2(" . $snr . ")"; $sensor = "Innensensor V1.2(" . $snr . ")";
} }
if ($w1 >= 64) { $daten1 = (($w1 * 128 + $w2) );
$daten1 = ((255 - $w1 - $w2) / 10) * (-1); if ($daten1 >= 16085)
}else{ {
$daten1 = (($w1 * 128 + $w2) / 10); $daten1 = $daten1 - 16384;
} }
$daten1 = $daten1 / 10;
$shortname='I'.$snr; $shortname='I'.$snr;
$daten2 = $w3; $daten2 = $w3;
$daten3 = $w4 * 128 + $w5; $daten3 = $w4 * 128 + $w5;