2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 06:39:11 +00:00

CUL_EM / CUL_WS added

git-svn-id: https://svn.fhem.de/fhem/trunk@234 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2008-08-30 14:55:55 +00:00
parent 056de54f88
commit 9365b0238b
5 changed files with 238 additions and 21 deletions

View File

@ -34,8 +34,17 @@ sub CUL_Ready($$);
my %msghist; # Used when more than one CUL is attached
my $msgcount = 0;
my %gets = (
"ccreg" => "C",
"version" => "V",
"ccreg" => "C",
"readeeprom" => "R",
"version" => "V",
"time" => "t",
);
my %sets = (
"writeeeprom" => "W",
"sendrawFS20" => "F",
"sendrawFHT" => "T",
"verbose" => "X",
);
sub
@ -46,7 +55,7 @@ CUL_Initialize($)
# Provider
$hash->{ReadFn} = "CUL_Read";
$hash->{WriteFn} = "CUL_Write";
$hash->{Clients} = ":CUL:FS20:FHT:";
$hash->{Clients} = ":FS20:FHT:KS300:CUL_EM:CUL_WS:";
$hash->{ReadyFn} = "CUL_Ready" if ($^O eq 'MSWin32');
# Normal devices
@ -127,7 +136,14 @@ sub
CUL_Set($@)
{
my ($hash, @a) = @_;
return "NYI";
return "\"set CUL\" needs at least one parameter" if(@a < 2);
return "Unknown argument $a[1], choose one of " . join(",", sort keys %sets)
if(!defined($sets{$a[1]}));
my $arg = ($a[2] ? $a[2] : "");
CUL_Write($hash, $sets{$a[1]}, $arg) if(!IsDummy($hash->{NAME}));
return undef;
}
#####################################
@ -136,7 +152,7 @@ CUL_Get($@)
{
my ($hash, @a) = @_;
return "\"get CUL\" needs at leass one parameter" if(@a < 2);
return "\"get CUL\" needs at least one parameter" if(@a < 2);
return "Unknown argument $a[1], choose one of " . join(",", sort keys %gets)
if(!defined($gets{$a[1]}));
@ -149,7 +165,6 @@ CUL_Get($@)
$hash->{READINGS}{$a[1]}{TIME} = TimeNow();
return "$a[0] $a[1] => $msg";
return "NYI"
}
#####################################
@ -157,7 +172,7 @@ sub
CUL_SetState($$$$)
{
my ($hash, $tim, $vt, $val) = @_;
return "NYI";
return undef;
}
#####################################
@ -183,7 +198,7 @@ CUL_DoInit($)
Log 1, $msg;
return $msg;
}
$hash->{PortObj}->write("XFE\n"); # Enable message reporting
$hash->{PortObj}->write("X01\n"); # Enable message reporting
# Reset the counter
delete($hash->{XMIT_TIME});
@ -276,7 +291,6 @@ CUL_Write($$$)
return;
}
###############
# insert value into the msghist. At the moment this only makes sense for FS20
# devices. As the transmitted value differs from the received one, we have to
@ -407,6 +421,7 @@ CUL_Read($)
$msgcount++;
Log 1, "CUL: $dmsg";
###########################################
#Translate Message from CUL to FHZ
my $fn = substr($dmsg,0,1);
if($fn eq "F") { # FS20
@ -424,8 +439,22 @@ Log 1, "CUL: $dmsg";
substr($dmsg,1,6), substr($dmsg,7));
$dmsg = lc($dmsg);
} elsif($fn eq "K" && length($dmsg) == 15) { # KS300
# 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];
}
$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 5, "CUL: unknown message $dmsg";
Log 4, "CUL: unknown message $dmsg";
goto NEXTMSG;
}

View File

@ -7,9 +7,6 @@ use warnings;
my %defptr;
my $negcount = 0;
######################
# Note: this is just an empty hull.
#####################################
sub
KS300_Initialize($)
@ -20,7 +17,7 @@ KS300_Initialize($)
# 810d04f94027a00171212730000008
# 81 0d 04 f9 4027a00171 212730000008
$hash->{Match} = "^810.04..402.a001";
$hash->{Match} = "^810d04..4027a001";
$hash->{DefFn} = "KS300_Define";
$hash->{UndefFn} = "KS300_Undef";
$hash->{ParseFn} = "KS300_Parse";
@ -67,11 +64,6 @@ KS300_Parse($$)
{
my ($hash,$msg) = @_;
if($msg !~ m/^810d04..4027a001/) {
Log 4, "KS300 unknown message $msg";
return "";
}
###############################
# 1 2
#0123456789012345 67890123456789

96
fhem/FHEM/14_CUL_WS.pm Executable file
View File

@ -0,0 +1,96 @@
##############################################
package main;
use strict;
use warnings;
my %defptr;
#####################################
sub
CUL_WS_Initialize($)
{
my ($hash) = @_;
# Message is like
# K41350270
$hash->{Match} = "^K........\$";
$hash->{DefFn} = "CUL_WS_Define";
$hash->{UndefFn} = "CUL_WS_Undef";
$hash->{ParseFn} = "CUL_WS_Parse";
$hash->{AttrList} = "do_not_notify:0,1 showtime:0,1 model:S300TH loglevel";
}
#####################################
sub
CUL_WS_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
return "wrong syntax: define <name> CUL_WS <code> [corr1 [corr2]]"
if(int(@a) < 3 || int(@a) > 5);
$a[2] = lc($a[2]);
return "Define $a[0]: wrong CODE format: valid is 1-7"
if($a[2] !~ m/^[1-7]$/);
$hash->{CODE} = $a[2];
$hash->{corr1} = ((int(@a) > 3) ? $a[3] : 0);
$hash->{corr2} = ((int(@a) > 4) ? $a[4] : 0);
$defptr{$a[2]} = $hash;
return undef;
}
#####################################
sub
CUL_WS_Undef($$)
{
my ($hash, $name) = @_;
delete($defptr{$hash->{CODE}});
return undef;
}
#####################################
sub
CUL_WS_Parse($$)
{
my ($hash,$msg) = @_;
# 012345678
# K41505268 -> Code 5, T: 25.0 H: 68.5
my @a = split("", $msg);
my $cde = (($a[1]+0)&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}) {
$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;
$hash->{CHANGED}[0] = $val;
$hash->{STATE} = $val;
$hash->{READINGS}{state}{TIME} = TimeNow();
$hash->{READINGS}{state}{VAL} = $val;
return $hash->{NAME};
} else {
Log 1, "CUL_WS detected, Code $cde $val";
}
return "";
}
1;

98
fhem/FHEM/15_CUL_EM.pm Executable file
View File

@ -0,0 +1,98 @@
##############################################
package main;
use strict;
use warnings;
my %defptr;
#####################################
sub
CUL_EM_Initialize($)
{
my ($hash) = @_;
# Message is like
# K41350270
$hash->{Match} = "^E0.................\$";
$hash->{DefFn} = "CUL_EM_Define";
$hash->{UndefFn} = "CUL_EM_Undef";
$hash->{ParseFn} = "CUL_EM_Parse";
$hash->{AttrList} = "do_not_notify:0,1 showtime:0,1 model:S300TH loglevel";
}
#####################################
sub
CUL_EM_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
return "wrong syntax: define <name> CUL_EM <code> [corr]"
if(int(@a) < 3 || int(@a) > 4);
$a[2] = lc($a[2]);
return "Define $a[0]: wrong CODE format: valid is 1-12"
if($a[2] !~ m/^\d$/ || $a[2] < 1 || $a[2] > 12);
$hash->{CODE} = $a[2];
$hash->{corr} = ((int(@a) > 3) ? $a[3] : 1);
$defptr{$a[2]} = $hash;
return undef;
}
#####################################
sub
CUL_EM_Undef($$)
{
my ($hash, $name) = @_;
delete($defptr{$hash->{CODE}});
return undef;
}
#####################################
sub
CUL_EM_Parse($$)
{
my ($hash,$msg) = @_;
# 0123456789012345678
# E01012471B80100B80B -> Type 01, Code 01, Cnt 10
my @a = split("", $msg);
my $tpe = ($a[1].$a[2])+0;
my $cde = ($a[3].$a[4])+0;
my $cnt = hex($a[5].$a[6]);
my $cum = hex($a[ 7].$a[ 8].$a[ 9].$a[10]);
my $lst = hex($a[11].$a[12].$a[13].$a[14]);
my $top = hex($a[15].$a[16].$a[17].$a[18]);
my $val = sprintf("CUM: %d 5MIN: %d TOP: %d", $cum, $lst, $top);
if($defptr{$cde}) {
$hash = $defptr{$cde};
my $corr = $hash->{corr};
$cum *= $corr;
$lst *= $corr;
$top *= $corr;
$val = sprintf("CUM: %d 5MIN: %d TOP: %d", $cum, $lst, $top);
my $n = $hash->{NAME};
Log GetLogLevel($n,1), "CUL_EM $n: $val";
$hash->{STATE} = $val;
$hash->{CHANGED}[0] = $val;
$hash->{STATE} = $val;
$hash->{READINGS}{state}{TIME} = TimeNow();
$hash->{READINGS}{state}{VAL} = $val;
return $hash->{NAME};
} else {
Log 1, "CUL_EM detected, Code $cde $val";
}
return "";
}
1;

View File

@ -68,6 +68,7 @@ at_Define($$)
InternalTimer($nt, "at_Exec", $name, 0);
$hash->{STATE} = "Next: " . FmtTime($nt);
if(!($attr{$name} && $attr{$name}{disable}));
return undef;
}
@ -79,11 +80,12 @@ at_Exec($)
my ($skip, $disable);
if(defined($attr{$name})) {
$skip = 1 if(defined($attr{$name}{skip_next}));
$disable = 1 if(defined($attr{$name}{disable}));
$skip = 1 if($attr{$name} && $attr{$name}{skip_next});
$disable = 1 if($attr{$name} && $attr{$name}{disable});
}
delete $attr{$name}{skip_next} if($skip);
return if(!$defs{$name}{DEF}); # Just deleted
my (undef, $command) = split("[ \t]+", $defs{$name}{DEF}, 2);
$command = SemicolonEscape($command);
AnalyzeCommandChain(undef, $command) if(!$skip && !$disable);