mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-19 00:26:03 +00:00
Added support for UVN800 and UV138. Changed checksum for RGR918.
git-svn-id: https://svn.fhem.de/fhem/trunk@791 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
7ef817d93e
commit
fc7b34986c
@ -1,6 +1,6 @@
|
|||||||
#################################################################################
|
#################################################################################
|
||||||
# 41_OREGON.pm
|
# 41_OREGON.pm
|
||||||
# Modul for FHEM
|
# Module for FHEM to decode Oregon sensor messages
|
||||||
#
|
#
|
||||||
# derived from 18_CUL-HOERMANN.pm
|
# derived from 18_CUL-HOERMANN.pm
|
||||||
#
|
#
|
||||||
@ -51,7 +51,8 @@ OREGON_Initialize($)
|
|||||||
{
|
{
|
||||||
my ($hash) = @_;
|
my ($hash) = @_;
|
||||||
|
|
||||||
$hash->{Match} = ".*";
|
#$hash->{Match} = "^[\x38-\x78].*";
|
||||||
|
$hash->{Match} = "^[^\x30]";
|
||||||
$hash->{DefFn} = "OREGON_Define";
|
$hash->{DefFn} = "OREGON_Define";
|
||||||
$hash->{UndefFn} = "OREGON_Undef";
|
$hash->{UndefFn} = "OREGON_Undef";
|
||||||
$hash->{ParseFn} = "OREGON_Parse";
|
$hash->{ParseFn} = "OREGON_Parse";
|
||||||
@ -145,6 +146,14 @@ my %types =
|
|||||||
{
|
{
|
||||||
part => 'WGR800', checksum => \&checksum4, method => \&wtgr800_anemometer,
|
part => 'WGR800', checksum => \&checksum4, method => \&wtgr800_anemometer,
|
||||||
},
|
},
|
||||||
|
type_length_key(0xda78, 72) =>
|
||||||
|
{
|
||||||
|
part => 'UVN800', checksun => \&checksum7, method => \&uvn800,
|
||||||
|
},
|
||||||
|
type_length_key(0xea7c, 120) =>
|
||||||
|
{
|
||||||
|
part => 'UV138', checksum => \&checksum1, method => \&uv138,
|
||||||
|
},
|
||||||
type_length_key(0xea4c, 80) =>
|
type_length_key(0xea4c, 80) =>
|
||||||
{
|
{
|
||||||
part => 'THWR288A', checksum => \&checksum1, method => \&common_temp,
|
part => 'THWR288A', checksum => \&checksum1, method => \&common_temp,
|
||||||
@ -197,7 +206,7 @@ my %types =
|
|||||||
# RGR126, RGR682, RGR918:
|
# RGR126, RGR682, RGR918:
|
||||||
type_length_key(0x2a1d, 84) =>
|
type_length_key(0x2a1d, 84) =>
|
||||||
{
|
{
|
||||||
part => 'RGR918', checksum => \&checksum6, method => \&common_rain,
|
part => 'RGR918', checksum => \&checksum6plus, method => \&common_rain,
|
||||||
},
|
},
|
||||||
#
|
#
|
||||||
type_length_key(0x0a4d, 80) =>
|
type_length_key(0x0a4d, 80) =>
|
||||||
@ -234,7 +243,7 @@ my $DOT = q{_};
|
|||||||
|
|
||||||
# --------------------------------------------
|
# --------------------------------------------
|
||||||
# The following functions are changed:
|
# The following functions are changed:
|
||||||
# - seome parameter like "parent" and others are removed
|
# - some parameter like "parent" and others are removed
|
||||||
# - @res array return the values directly (no usage of xPL::Message)
|
# - @res array return the values directly (no usage of xPL::Message)
|
||||||
|
|
||||||
sub temperature {
|
sub temperature {
|
||||||
@ -308,8 +317,77 @@ sub percentage_battery {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my @uv_str =
|
||||||
|
(
|
||||||
|
qw/low low low/, # 0 - 2
|
||||||
|
qw/medium medium medium/, # 3 - 5
|
||||||
|
qw/high high/, # 6 - 7
|
||||||
|
'very high', 'very high', 'very high', # 8 - 10
|
||||||
|
);
|
||||||
|
|
||||||
|
sub uv_string {
|
||||||
|
$uv_str[$_[0]] || 'dangerous';
|
||||||
|
}
|
||||||
|
|
||||||
|
sub uv {
|
||||||
|
my ($bytes, $dev, $res) = @_;
|
||||||
|
my $uv = lo_nibble($bytes->[5])*10 + hi_nibble($bytes->[4]);
|
||||||
|
my $risk = uv_string($uv);
|
||||||
|
|
||||||
|
push @$res, {
|
||||||
|
device => $dev,
|
||||||
|
type => 'uv',
|
||||||
|
current => $uv,
|
||||||
|
risk => $risk,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub uv2 {
|
||||||
|
my ($bytes, $dev, $res) = @_;
|
||||||
|
my $uv = hi_nibble($bytes->[4]);
|
||||||
|
my $risk = uv_string($uv);
|
||||||
|
|
||||||
|
push @$res, {
|
||||||
|
device => $dev,
|
||||||
|
type => 'uv',
|
||||||
|
current => $uv,
|
||||||
|
risk => $risk,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# --------------------------------------------------------
|
# --------------------------------------------------------
|
||||||
|
|
||||||
|
sub uv138 {
|
||||||
|
my $type = shift;
|
||||||
|
my $bytes = shift;
|
||||||
|
|
||||||
|
my $device = sprintf "%02x", $bytes->[3];
|
||||||
|
my $dev_str = $type.$DOT.$device;
|
||||||
|
|
||||||
|
my @res = ();
|
||||||
|
|
||||||
|
uv($bytes, $dev_str, \@res);
|
||||||
|
simple_battery($bytes, $dev_str, \@res);
|
||||||
|
|
||||||
|
return @res;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub uvn800 {
|
||||||
|
my $type = shift;
|
||||||
|
my $bytes = shift;
|
||||||
|
|
||||||
|
my $device = sprintf "%02x", $bytes->[3];
|
||||||
|
my $dev_str = $type.$DOT.$device;
|
||||||
|
|
||||||
|
my @res = ();
|
||||||
|
|
||||||
|
uv2($bytes, $dev_str, \@res);
|
||||||
|
percentage_battery($bytes, $dev_str, \@res);
|
||||||
|
|
||||||
|
return @res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
sub wgr918_anemometer {
|
sub wgr918_anemometer {
|
||||||
my $type = shift;
|
my $type = shift;
|
||||||
my $bytes = shift;
|
my $bytes = shift;
|
||||||
@ -319,7 +397,6 @@ sub wgr918_anemometer {
|
|||||||
|
|
||||||
my @res = ();
|
my @res = ();
|
||||||
|
|
||||||
|
|
||||||
my $dir = sprintf("%02x",$bytes->[5])*10 + hi_nibble($bytes->[4]);
|
my $dir = sprintf("%02x",$bytes->[5])*10 + hi_nibble($bytes->[4]);
|
||||||
my $speed = lo_nibble($bytes->[7]) * 10 + sprintf("%02x",$bytes->[6])/10;
|
my $speed = lo_nibble($bytes->[7]) * 10 + sprintf("%02x",$bytes->[6])/10;
|
||||||
my $avspeed = sprintf("%02x",$bytes->[8]) + hi_nibble($bytes->[7]) / 10;
|
my $avspeed = sprintf("%02x",$bytes->[8]) + hi_nibble($bytes->[7]) / 10;
|
||||||
@ -581,8 +658,6 @@ sub rain_PCR800 {
|
|||||||
return @res;
|
return @res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
# CHECKSUM METHODS
|
# CHECKSUM METHODS
|
||||||
|
|
||||||
@ -613,6 +688,12 @@ sub checksum6 {
|
|||||||
((nibble_sum(8,$_[0]) - 0xa) & 0xff);
|
((nibble_sum(8,$_[0]) - 0xa) & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub checksum6plus {
|
||||||
|
my $c = hi_nibble($_[0]->[8]) + (lo_nibble($_[0]->[9]) << 4);
|
||||||
|
my $s = (((nibble_sum(8,$_[0]) + (($_[0]->[8] & 0x0f) - 0x00)) - 0xa) & 0xff);
|
||||||
|
$s == $c;
|
||||||
|
}
|
||||||
|
|
||||||
sub checksum7 {
|
sub checksum7 {
|
||||||
$_[0]->[7] == ((nibble_sum(7,$_[0]) - 0xa) & 0xff);
|
$_[0]->[7] == ((nibble_sum(7,$_[0]) - 0xa) & 0xff);
|
||||||
}
|
}
|
||||||
@ -798,6 +879,20 @@ OREGON_Parse($$)
|
|||||||
$def->{READINGS}{$sensor}{VAL} = $i->{current};
|
$def->{READINGS}{$sensor}{VAL} = $i->{current};
|
||||||
$def->{CHANGED}[$n++] = $sensor . ": " . $i->{current};;
|
$def->{CHANGED}[$n++] = $sensor . ": " . $i->{current};;
|
||||||
}
|
}
|
||||||
|
case "uv" {
|
||||||
|
$val .= "UV: ".$i->{current}." ";
|
||||||
|
$val .= "UVR: ".$i->{risk}." ";
|
||||||
|
|
||||||
|
$sensor = "uv_val";
|
||||||
|
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||||
|
$def->{READINGS}{$sensor}{VAL} = $i->{current};
|
||||||
|
$def->{CHANGED}[$n++] = $sensor . ": " . $i->{current};;
|
||||||
|
|
||||||
|
$sensor = "uv_risk";
|
||||||
|
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||||
|
$def->{READINGS}{$sensor}{VAL} = $i->{risk};
|
||||||
|
$def->{CHANGED}[$n++] = $sensor . ": " . $i->{risk};;
|
||||||
|
}
|
||||||
case "hexline" {
|
case "hexline" {
|
||||||
$sensor = "hexline";
|
$sensor = "hexline";
|
||||||
$def->{READINGS}{$sensor}{TIME} = $tm;
|
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user