rssi, RTGR328N datetime

git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@3290 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
wherzig 2013-06-15 19:35:07 +00:00
parent ae1f5a2971
commit e159ba6974
4 changed files with 145 additions and 9 deletions

View File

@ -5,7 +5,7 @@
# #
# Derived from 00_CUL.pm: Copyright (C) Rudolf Koenig" # Derived from 00_CUL.pm: Copyright (C) Rudolf Koenig"
# #
# Copyright (C) 2012 Willi Herzig # Copyright (C) 2012/2013 Willi Herzig
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License # modify it under the terms of the GNU General Public License
@ -33,6 +33,7 @@ use Time::HiRes qw(gettimeofday);
my $last_rmsg = "abcd"; my $last_rmsg = "abcd";
my $last_time = 1; my $last_time = 1;
my $trx_rssi = 0;
sub TRX_Clear($); sub TRX_Clear($);
sub TRX_Read($); sub TRX_Read($);
@ -53,10 +54,10 @@ TRX_Initialize($)
$hash->{Clients} = $hash->{Clients} =
":TRX_WEATHER:TRX_SECURITY:TRX_LIGHT:TRX_ELSE:"; ":TRX_WEATHER:TRX_SECURITY:TRX_LIGHT:TRX_ELSE:";
my %mc = ( my %mc = (
"1:TRX_WEATHER" => "^..(50|51|52|54|55|56|57|5a|5d).*", "1:TRX_WEATHER" => "^..(50|51|52|54|55|56|57|58|5a|5d).*",
"2:TRX_SECURITY" => "^..(20).*", "2:TRX_SECURITY" => "^..(20).*",
"3:TRX_LIGHT" => "^..(10|11|12|13|14).*", "3:TRX_LIGHT" => "^..(10|11|12|13|14).*",
"4:TRX_ELSE" => "^..(0[0-f]|1[5-f]|2[1-f]|3[0-f]|4[0-f]|53|58|59|5b|5c|5e|5f|[6-f][0-f]).*", "4:TRX_ELSE" => "^..(0[0-f]|1[5-f]|2[1-f]|3[0-f]|4[0-f]|53|59|5b|5c|5e|5f|[6-f][0-f]).*",
); );
$hash->{MatchList} = \%mc; $hash->{MatchList} = \%mc;
@ -67,7 +68,7 @@ TRX_Initialize($)
$hash->{UndefFn} = "TRX_Undef"; $hash->{UndefFn} = "TRX_Undef";
$hash->{GetFn} = "TRX_Get"; $hash->{GetFn} = "TRX_Get";
$hash->{StateFn} = "TRX_SetState"; $hash->{StateFn} = "TRX_SetState";
$hash->{AttrList}= "do_not_notify:1,0 dummy:1,0 do_not_init:1:0 addvaltrigger:1:0 longids loglevel:0,1,2,3,4,5,6"; $hash->{AttrList}= "do_not_notify:1,0 dummy:1,0 do_not_init:1,0 addvaltrigger:1,0 longids rssi:1,0 loglevel:0,1,2,3,4,5,6";
$hash->{ShutdownFn} = "TRX_Shutdown"; $hash->{ShutdownFn} = "TRX_Shutdown";
} }
@ -101,8 +102,7 @@ TRX_Define($$)
return "wrong syntax: define <name> TRX devicename [noinit]" return "wrong syntax: define <name> TRX devicename [noinit]"
} }
} }
$hash->{DeviceName} = $dev; $hash->{DeviceName} = $dev;
my $ret = DevIo_OpenDev($hash, 0, "TRX_DoInit"); my $ret = DevIo_OpenDev($hash, 0, "TRX_DoInit");
return $ret; return $ret;
@ -485,6 +485,16 @@ attr RFXTRXUSB longids BTHR918N
# Will generate devices names like TX3_T_07, TX3_T_01 ,TX3_H_07. # Will generate devices names like TX3_T_07, TX3_T_01 ,TX3_H_07.
attr RFXTRXUSB longids TX3_T,TX3_H</PRE> attr RFXTRXUSB longids TX3_T,TX3_H</PRE>
</li><br> </li><br>
<li>rssi<br>
1: enable RSSI logging, 0: disable RSSI logging<br>
Default is no RSSI logging.
<br><br>
Examples:<PRE>
# Do log rssi values (this is default):
attr RFXCOMUSB rssi 0
# Enable rssi logging for devices:
attr RFXCOMUSB rssi 1
</li><br>
</ul> </ul>
<br> <br>
</ul> </ul>

View File

@ -44,7 +44,7 @@ TRX_ELSE_Initialize($)
{ {
my ($hash) = @_; my ($hash) = @_;
$hash->{Match} = "^..(0[0-f]|1[5-f]|2[1-f]|3[0-f]|4[0-f]|53|58|59|5b|5c|5e|5f|[6-f][0-f]).*"; $hash->{Match} = "^..(0[0-f]|1[5-f]|2[1-f]|3[0-f]|4[0-f]|53|59|5b|5c|5e|5f|[6-f][0-f]).*";
$hash->{DefFn} = "TRX_ELSE_Define"; $hash->{DefFn} = "TRX_ELSE_Define";
$hash->{UndefFn} = "TRX_ELSE_Undef"; $hash->{UndefFn} = "TRX_ELSE_Undef";
$hash->{ParseFn} = "TRX_ELSE_Parse"; $hash->{ParseFn} = "TRX_ELSE_Parse";

View File

@ -4,7 +4,7 @@
# 46_TRX_SECURITY.pm # 46_TRX_SECURITY.pm
# FHEM module for X10, KD101, Visonic # FHEM module for X10, KD101, Visonic
# #
# Copyright (C) 2012 Willi Herzig # Copyright (C) 2012/2013 Willi Herzig
# #
# This file is part of fhem. # This file is part of fhem.
# #
@ -37,6 +37,7 @@ use warnings;
my $TRX_SECURITY_debug = 0; my $TRX_SECURITY_debug = 0;
my $time_old = 0; my $time_old = 0;
my $trx_rssi;
my $TRX_SECURITY_type_default = "ds10a"; my $TRX_SECURITY_type_default = "ds10a";
@ -395,6 +396,7 @@ sub TRX_SECURITY_parse_X10Sec {
my $type = ""; my $type = "";
my $delay = ""; my $delay = "";
my $battery = ""; my $battery = "";
my $rssi = "";
my $option = ""; my $option = "";
my @res; my @res;
if (exists $x10_security{$data}) { if (exists $x10_security{$data}) {
@ -418,6 +420,11 @@ sub TRX_SECURITY_parse_X10Sec {
} }
} }
if ($trx_rssi == 1) {
$rssi = sprintf("%d", ($bytes->[7] & 0xf0) >> 4);
#Log 1, "TRX_SECURITY: $name devn=$device_name rssi=$rssi";
}
my $current = ""; my $current = "";
Log 1, "TRX_SECURITY: $name devn=$device_name first=$firstdevice subtype=$subtype command=$command, delay=$delay, batt=$battery cmd=$hexdata" if ($TRX_SECURITY_debug == 1); Log 1, "TRX_SECURITY: $name devn=$device_name first=$firstdevice subtype=$subtype command=$command, delay=$delay, batt=$battery cmd=$hexdata" if ($TRX_SECURITY_debug == 1);
@ -489,6 +496,12 @@ sub TRX_SECURITY_parse_X10Sec {
readingsBulkUpdate($def, $sensor, $current); readingsBulkUpdate($def, $sensor, $current);
} }
if ($rssi ne "") {
$sensor = "rssi";
readingsBulkUpdate($def, $sensor, $rssi);
}
if ($delay ne '') { if ($delay ne '') {
$sensor = "delay"; $sensor = "delay";
$current = "Error"; $current = "Error";
@ -516,6 +529,12 @@ TRX_SECURITY_Parse($$)
{ {
my ($iohash, $hexline) = @_; my ($iohash, $hexline) = @_;
$trx_rssi = 0;
if (defined($attr{$iohash->{NAME}}{rssi})) {
$trx_rssi = $attr{$iohash->{NAME}}{rssi};
#Log 1,"TRX_SECURITY_Parse: attr rssi = $trx_rssi";
}
my $time = time(); my $time = time();
# convert to binary # convert to binary
my $msg = pack('H*', $hexline); my $msg = pack('H*', $hexline);

View File

@ -57,6 +57,9 @@
# "UVN800" is Oregon UVN800 # "UVN800" is Oregon UVN800
# "TFA_UV" is TFA_UV-Sensor # "TFA_UV" is TFA_UV-Sensor
# #
# Date/Time Sensors:
# * "RTGR328_DATE" is RTGR328N
#
# Energy Sensors: # Energy Sensors:
# * "CM160" is OWL CM119, CM160 # * "CM160" is OWL CM119, CM160
# * "CM180" is OWL CM180 # * "CM180" is OWL CM180
@ -100,13 +103,14 @@ use warnings;
my $TRX_HEX_debug = 0; my $TRX_HEX_debug = 0;
my $time_old = 0; my $time_old = 0;
my $trx_rssi;
sub sub
TRX_WEATHER_Initialize($) TRX_WEATHER_Initialize($)
{ {
my ($hash) = @_; my ($hash) = @_;
$hash->{Match} = "^..(50|51|52|54|55|56|57|5a|5d).*"; $hash->{Match} = "^..(50|51|52|54|55|56|57|58|5a|5d).*";
$hash->{DefFn} = "TRX_WEATHER_Define"; $hash->{DefFn} = "TRX_WEATHER_Define";
$hash->{UndefFn} = "TRX_WEATHER_Undef"; $hash->{UndefFn} = "TRX_WEATHER_Undef";
$hash->{ParseFn} = "TRX_WEATHER_Parse"; $hash->{ParseFn} = "TRX_WEATHER_Parse";
@ -176,6 +180,8 @@ my %types =
0x5610 => { part => 'WIND', method => \&TRX_WEATHER_common_anemometer, }, 0x5610 => { part => 'WIND', method => \&TRX_WEATHER_common_anemometer, },
# UV # UV
0x5709 => { part => 'UV', method => \&TRX_WEATHER_common_uv, }, 0x5709 => { part => 'UV', method => \&TRX_WEATHER_common_uv, },
# Date/Time sensors
0x580D => { part => 'DATE', method => \&TRX_WEATHER_common_datetime, },
# Energy usage sensors # Energy usage sensors
0x5A11 => { part => 'ENERGY', method => \&TRX_WEATHER_common_energy, }, 0x5A11 => { part => 'ENERGY', method => \&TRX_WEATHER_common_energy, },
# WEIGHT # WEIGHT
@ -281,6 +287,17 @@ sub TRX_WEATHER_simple_battery {
type => 'battery', type => 'battery',
current => $battery, current => $battery,
}; };
my $rssi = ($bytes->[$off] & 0xf0) >> 4;
if ($trx_rssi == 1) {
push @$res, {
device => $dev,
type => 'rssi',
current => sprintf("%d",$rssi),
};
}
} }
sub TRX_WEATHER_battery { sub TRX_WEATHER_battery {
@ -301,6 +318,17 @@ sub TRX_WEATHER_battery {
type => 'battery', type => 'battery',
current => $battery, current => $battery,
}; };
my $rssi = ($bytes->[$off] & 0xf0) >> 4;
if ($trx_rssi == 1) {
push @$res, {
device => $dev,
type => 'rssi',
current => sprintf("%d",$rssi),
};
}
} }
@ -319,6 +347,7 @@ sub TRX_WEATHER_use_longid {
return 0; return 0;
} }
# ------------------------------------------------------------ # ------------------------------------------------------------
# #
sub TRX_WEATHER_common_anemometer { sub TRX_WEATHER_common_anemometer {
@ -752,6 +781,63 @@ sub TRX_WEATHER_common_uv {
return @res; return @res;
} }
# ------------------------------------------------------------
#
sub TRX_WEATHER_common_datetime {
my $type = shift;
my $longids = shift;
my $bytes = shift;
my $subtype = sprintf "%02x", $bytes->[1];
#Log 1,"subtype=$subtype";
my $dev_type;
my %devname =
( # HEXSTRING => "NAME"
0x01 => "RTGR328_DATE", # RTGR328N datetime datagram
);
if (exists $devname{$bytes->[1]}) {
$dev_type = $devname{$bytes->[1]};
} else {
Log 1,"TRX_WEATHER: common_datetime error undefined subtype=$subtype";
my @res = ();
return @res;
}
my $dev_str = $dev_type;
if (TRX_WEATHER_use_longid($longids,$dev_type)) {
$dev_str .= $DOT.sprintf("%02x%02x", $bytes->[3],$bytes->[4]);
}
my @res = ();
# hexline debugging
if ($TRX_HEX_debug) {
my $hexline = ""; for (my $i=0;$i<@$bytes;$i++) { $hexline .= sprintf("%02x",$bytes->[$i]);}
push @res, { device => $dev_str, type => 'hexline', current => $hexline, units => 'hex', };
}
push @res, {
device => $dev_str,
type => 'date',
current => sprintf("%02d-%02d-%02d", $bytes->[5],$bytes->[6],$bytes->[7]),
units => 'yymmdd',
};
push @res, {
device => $dev_str,
type => 'time',
current => sprintf("%02d:%02d:%02d", $bytes->[9],$bytes->[10],$bytes->[11]),
units => 'hhmmss',
};
TRX_WEATHER_simple_battery($bytes, $dev_str, \@res, 12);
return @res;
}
# ------------------------------------------------------------ # ------------------------------------------------------------
# #
sub TRX_WEATHER_common_energy { sub TRX_WEATHER_common_energy {
@ -829,6 +915,7 @@ sub TRX_WEATHER_common_energy {
return @res; return @res;
} }
# ------------------------------------------------------------ # ------------------------------------------------------------
# #
sub TRX_WEATHER_common_weight { sub TRX_WEATHER_common_weight {
@ -904,6 +991,12 @@ TRX_WEATHER_Parse($$)
#Log 1,"0: attr longids = $longids"; #Log 1,"0: attr longids = $longids";
} }
$trx_rssi = 0;
if (defined($attr{$iohash->{NAME}}{rssi})) {
$trx_rssi = $attr{$iohash->{NAME}}{rssi};
#Log 1,"0: attr rssi = $trx_rssi";
}
my $time = time(); my $time = time();
# convert to binary # convert to binary
my $msg = pack('H*', $hexline); my $msg = pack('H*', $hexline);
@ -1106,6 +1199,20 @@ TRX_WEATHER_Parse($$)
$sensor = "hexline"; $sensor = "hexline";
readingsBulkUpdate($def, $sensor, $i->{current}); readingsBulkUpdate($def, $sensor, $i->{current});
} }
elsif ($i->{type} eq "rssi") {
$sensor = "rssi";
readingsBulkUpdate($def, $sensor, $i->{current});
}
elsif ($i->{type} eq "date") {
$val .= $i->{current}." ";
$sensor = "date";
readingsBulkUpdate($def, $sensor, $i->{current});
}
elsif ($i->{type} eq "time") {
$val .= $i->{current}." ";
$sensor = "time";
readingsBulkUpdate($def, $sensor, $i->{current});
}
else { else {
print "\nTRX_WEATHER: Unknown: "; print "\nTRX_WEATHER: Unknown: ";
print "Type: ".$i->{type}.", "; print "Type: ".$i->{type}.", ";