mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-02-27 20:34:52 +00:00
CUL_WS angepasst fuer zukuenftige WS300 sensoren
Logging nicht mehr hardcoded git-svn-id: https://svn.fhem.de/fhem/trunk@249 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
1bfbcb322e
commit
02886dd9c5
fhem/FHEM
@ -31,7 +31,7 @@ sub CUL_Read($);
|
||||
sub CUL_ReadAnswer($$);
|
||||
sub CUL_Ready($$);
|
||||
|
||||
my $initstr = "X21";
|
||||
my $initstr = "X01"; # Only translated messages, no RSSI
|
||||
my %msghist; # Used when more than one CUL is attached
|
||||
my $msgcount = 0;
|
||||
my %gets = (
|
||||
@ -150,9 +150,11 @@ CUL_Set($@)
|
||||
return "Unknown argument $a[1], choose one of " . join(" ", sort keys %sets)
|
||||
if(!defined($sets{$a[1]}));
|
||||
|
||||
my $arg = ($a[2] ? $a[2] : "");
|
||||
my $name = shift @a;
|
||||
my $type = shift @a;
|
||||
my $arg = join("", @a);
|
||||
|
||||
if($a[1] eq "freq") { # MHz
|
||||
if($type eq "freq") { # MHz
|
||||
|
||||
my $f = $arg/26*65536;
|
||||
|
||||
@ -162,19 +164,19 @@ CUL_Set($@)
|
||||
$arg = sprintf("%.3f", (hex($f2)*65536+hex($f1)*256+hex($f0))/65536*26);
|
||||
my $msg =
|
||||
"Setting FREQ2..0 (0D,0E,0F) to $f2 $f1 $f0 = $arg MHz, verbose to 01";
|
||||
Log 1, $msg;
|
||||
Log GetLogLevel($name,4), $msg;
|
||||
CUL_SimpleWrite($hash, "W0D$f2"); # Will reprogram the CC1101
|
||||
CUL_SimpleWrite($hash, "W0E$f1");
|
||||
CUL_SimpleWrite($hash, "W0F$f0");
|
||||
CUL_SimpleWrite($hash, $initstr);
|
||||
return $msg;
|
||||
|
||||
} elsif($a[1] eq "bandwidth") { # KHz
|
||||
} elsif($type eq "bandwidth") { # KHz
|
||||
|
||||
my $ob = 5;
|
||||
if(!IsDummy($hash->{NAME})) {
|
||||
CUL_SimpleWrite($hash, "C10");
|
||||
$ob = CUL_ReadAnswer($hash, $a[1]);
|
||||
$ob = CUL_ReadAnswer($hash, $type);
|
||||
return "Can't get old MDMCFG4 value" if($ob !~ m,/ (.*)\r,);
|
||||
$ob = $1 & 0x0f;
|
||||
}
|
||||
@ -190,15 +192,18 @@ CUL_Set($@)
|
||||
GOTBW:
|
||||
$ob = sprintf("%02x", $ob+$bits);
|
||||
my $msg = "Setting MDMCFG4 (10) to $ob = $bw KHz, verbose to 01";
|
||||
Log 1, $msg;
|
||||
|
||||
Log GetLogLevel($name,4), $msg;
|
||||
CUL_SimpleWrite($hash, "W10$ob");
|
||||
CUL_SimpleWrite($hash, $initstr);
|
||||
return $msg;
|
||||
|
||||
} else {
|
||||
|
||||
Log 1, "set @a";
|
||||
CUL_Write($hash, $sets{$a[1]}, $arg);
|
||||
return "Expecting a 0-padded hex number" if((length($arg)&1) == 1);
|
||||
$initstr = "X$arg" if($type eq "verbose");
|
||||
Log GetLogLevel($name,4), "set $name $type $arg";
|
||||
CUL_Write($hash, $sets{$type}, $arg);
|
||||
|
||||
}
|
||||
return undef;
|
||||
@ -343,9 +348,9 @@ CUL_XmitLimitCheck($$)
|
||||
|
||||
if(@b > 163) { # Maximum nr of transmissions per hour (unconfirmed).
|
||||
|
||||
my $me = $hash->{NAME};
|
||||
Log GetLogLevel($me,2), "CUL TRANSMIT LIMIT EXCEEDED";
|
||||
DoTrigger($me, "TRANSMIT LIMIT EXCEEDED");
|
||||
my $name = $hash->{NAME};
|
||||
Log GetLogLevel($name,2), "CUL TRANSMIT LIMIT EXCEEDED";
|
||||
DoTrigger($name, "TRANSMIT LIMIT EXCEEDED");
|
||||
|
||||
} else {
|
||||
|
||||
@ -371,9 +376,10 @@ CUL_Write($$$)
|
||||
my ($hash,$fn,$msg) = @_;
|
||||
|
||||
if(!$hash || !defined($hash->{PortObj})) {
|
||||
Log 5, "CUL device $hash->{NAME} is not active, cannot send";
|
||||
Log 5, "CUL device is not active, cannot send";
|
||||
return;
|
||||
}
|
||||
my $name = $hash->{NAME};
|
||||
|
||||
###################
|
||||
# Rewrite message from FHZ -> CUL
|
||||
@ -382,7 +388,7 @@ CUL_Write($$$)
|
||||
$fn = "F";
|
||||
$msg = substr($msg,6);
|
||||
} else {
|
||||
Log 1, "CUL cannot translate $fn $msg";
|
||||
Log GetLogLevel($name,2), "CUL cannot translate $fn $msg";
|
||||
return;
|
||||
}
|
||||
|
||||
@ -515,50 +521,52 @@ CUL_Read($)
|
||||
$msghist{$msgcount}{MSG} = $dmsg;
|
||||
$msgcount++;
|
||||
|
||||
if($initstr eq "X21") {
|
||||
if($initstr =~ m/X2/) { # RSSI
|
||||
my $l = length($dmsg);
|
||||
my $rssi = hex(substr($dmsg, $l-2, 2));
|
||||
$dmsg = substr($dmsg, 0, $l-2);
|
||||
$rssi = ($rssi>=128 ? (($rssi-256)/2-74) : ($rssi/2-74));
|
||||
Log 1, "CUL: $dmsg $rssi";
|
||||
Log GetLogLevel($name,4), "CUL: $dmsg $rssi";
|
||||
} else {
|
||||
Log 1, "CUL: $dmsg";
|
||||
Log GetLogLevel($name,4), "CUL: $dmsg";
|
||||
}
|
||||
|
||||
###########################################
|
||||
#Translate Message from CUL to FHZ
|
||||
my $fn = substr($dmsg,0,1);
|
||||
if($fn eq "F") { # FS20
|
||||
my $len = length($dmsg);
|
||||
|
||||
if($fn eq "F") { # Reformat for 10_FS20.pm
|
||||
|
||||
$dmsg = sprintf("81%02x04xx0101a001%s00%s",
|
||||
length($dmsg)/2+5,
|
||||
substr($dmsg,1,6), substr($dmsg,7));
|
||||
$len/2+5, substr($dmsg,1,6), substr($dmsg,7));
|
||||
$dmsg = lc($dmsg);
|
||||
|
||||
} elsif($fn eq "T") { # FHT
|
||||
|
||||
$dmsg =~ s/([1-4]\d)79(..)$/${1}69$2/; # should be done in the FHT
|
||||
} elsif($fn eq "T") { # Reformat for 11_FHT.pm
|
||||
|
||||
$dmsg = sprintf("81%02x04xx0909a001%s00%s",
|
||||
length($dmsg)/2+5,
|
||||
substr($dmsg,1,6), substr($dmsg,7));
|
||||
$len/2+5, substr($dmsg,1,6), substr($dmsg,7));
|
||||
$dmsg = lc($dmsg);
|
||||
|
||||
} elsif($fn eq "K" && length($dmsg) == 15) { # KS300
|
||||
} elsif($fn eq "K") {
|
||||
|
||||
# K17815254024C82 -> 810d04f94027a0011718254520C428
|
||||
my $n = "";
|
||||
my @a = split("", $dmsg);
|
||||
for(my $i = 0; $i < 14; $i+=2) { # Swap nibbles.
|
||||
$n .= $a[$i+2] . $a[$i+1];
|
||||
if($len == 15) { # Reformat for 13_KS300.pm
|
||||
my @a = split("", $dmsg);
|
||||
$dmsg = sprintf("81%02x04xx4027a001", $len/2+6);
|
||||
for(my $i = 0; $i < 14; $i+=2) { # Swap nibbles.
|
||||
$dmsg .= $a[$i+2] . $a[$i+1];
|
||||
}
|
||||
|
||||
} elsif($len==9 || $len==13) { # CUL_WS / Native
|
||||
;
|
||||
} else {
|
||||
Log GetLogLevel($name,4), "CUL: unknown message $dmsg";
|
||||
goto NEXTMSG;
|
||||
}
|
||||
$dmsg = sprintf("81%02x04xx4027a001%s", length($dmsg)/2+6, $n);
|
||||
|
||||
} elsif($fn eq "K" && length($dmsg) == 9) { # CUL_WS / Native
|
||||
;
|
||||
} elsif($fn eq "E") { # CUL_EM / Native
|
||||
;
|
||||
} else {
|
||||
Log 4, "CUL: unknown message $dmsg";
|
||||
Log GetLogLevel($name,4), "CUL: unknown message $dmsg";
|
||||
goto NEXTMSG;
|
||||
}
|
||||
|
||||
@ -579,7 +587,7 @@ CUL_Read($)
|
||||
last if(int(@found));
|
||||
}
|
||||
if(!int(@found)) {
|
||||
Log 1, "Unknown code $dmsg, help me!";
|
||||
Log GetLogLevel($name,3), "Unknown code $dmsg, help me!";
|
||||
goto NEXTMSG;
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,7 @@ CUL_WS_Initialize($)
|
||||
# Message is like
|
||||
# K41350270
|
||||
|
||||
$hash->{Match} = "^K........\$";
|
||||
$hash->{Match} = "^K(........|............)\$";
|
||||
$hash->{DefFn} = "CUL_WS_Define";
|
||||
$hash->{UndefFn} = "CUL_WS_Undef";
|
||||
$hash->{ParseFn} = "CUL_WS_Parse";
|
||||
@ -57,38 +57,48 @@ sub
|
||||
CUL_WS_Parse($$)
|
||||
{
|
||||
my ($hash,$msg) = @_;
|
||||
my %tlist = ("2"=>"rain","3"=>"wind","4"=>"temp/hum/press","5"=>"brightness");
|
||||
|
||||
# 012345678
|
||||
# K41505268 -> Code 5, T: 25.0 H: 68.5
|
||||
# 0123456789012
|
||||
# K41505268 -> Code (4+1) 5, T: 25.0 H: 68.5
|
||||
# K............
|
||||
|
||||
my @a = split("", $msg);
|
||||
my $firstbyte = hex($a[1]);
|
||||
my $cde = ($firstbyte&7) + 1;
|
||||
my $sgn = (($a[1]+0)&8) ? -1 : 1;
|
||||
my $tmp = $sgn * ($a[6].$a[3].".".$a[4]);
|
||||
my $hum = $a[7].$a[8].".".$a[5];
|
||||
my $val = "T: $tmp H: $hum";
|
||||
|
||||
if($defptr{$cde}) {
|
||||
my $type = "Temp/Hum";
|
||||
if(@a == 13) {
|
||||
$type = $tlist{$a[2]} ? $tlist{$a[2]} : "unknown";
|
||||
}
|
||||
|
||||
if(!$defptr{$cde}) {
|
||||
Log 1, "CUL_WS UNDEFINED $type sensor detected, code $cde";
|
||||
return "UNDEFINED CUL_WS: $cde";
|
||||
}
|
||||
|
||||
if(@a == 9) {
|
||||
|
||||
$hash = $defptr{$cde};
|
||||
$tmp += $hash->{corr1};
|
||||
$hum += $hash->{corr2};
|
||||
$val = "T: $tmp H: $hum";
|
||||
my $n = $hash->{NAME};
|
||||
Log GetLogLevel($n,1), "CUL_WS $n: $val";
|
||||
$hash->{STATE} = $val;
|
||||
my $name = $hash->{NAME};
|
||||
|
||||
$hash->{CHANGED}[0] = $val;
|
||||
$hash->{STATE} = $val;
|
||||
$hash->{READINGS}{state}{TIME} = TimeNow();
|
||||
my $sgn = ($firstbyte&8) ? -1 : 1;
|
||||
my $tmp = $sgn * ($a[6].$a[3].".".$a[4]) + $hash->{corr1};
|
||||
my $hum = ($a[7].$a[8].".".$a[5]) + $hash->{corr2};
|
||||
my $val = "T: $tmp H: $hum";
|
||||
|
||||
Log GetLogLevel($name,4), "CUL_WS $name: $val";
|
||||
|
||||
$hash->{STATE} = $val; # List overview
|
||||
$hash->{READINGS}{state}{TIME} = TimeNow(); # For list
|
||||
$hash->{READINGS}{state}{VAL} = $val;
|
||||
|
||||
return $hash->{NAME};
|
||||
$hash->{CHANGED}[0] = $val; # For notify
|
||||
|
||||
return $name;
|
||||
|
||||
} else {
|
||||
|
||||
Log 1, "CUL_WS detected, Code $cde $val";
|
||||
|
||||
}
|
||||
|
||||
return "";
|
||||
|
Loading…
x
Reference in New Issue
Block a user