diff --git a/FHEM/45_TRX.pm b/FHEM/45_TRX.pm index 43be6905d..852e2f0c7 100755 --- a/FHEM/45_TRX.pm +++ b/FHEM/45_TRX.pm @@ -5,7 +5,7 @@ # # 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 # 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_time = 1; +my $trx_rssi = 0; sub TRX_Clear($); sub TRX_Read($); @@ -53,10 +54,10 @@ TRX_Initialize($) $hash->{Clients} = ":TRX_WEATHER:TRX_SECURITY:TRX_LIGHT:TRX_ELSE:"; 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).*", "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; @@ -67,7 +68,7 @@ TRX_Initialize($) $hash->{UndefFn} = "TRX_Undef"; $hash->{GetFn} = "TRX_Get"; $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"; } @@ -101,8 +102,7 @@ TRX_Define($$) return "wrong syntax: define TRX devicename [noinit]" } } - - + $hash->{DeviceName} = $dev; my $ret = DevIo_OpenDev($hash, 0, "TRX_DoInit"); return $ret; @@ -485,6 +485,16 @@ attr RFXTRXUSB longids BTHR918N # Will generate devices names like TX3_T_07, TX3_T_01 ,TX3_H_07. attr RFXTRXUSB longids TX3_T,TX3_H
+
  • rssi
    + 1: enable RSSI logging, 0: disable RSSI logging
    +Default is no RSSI logging. +

    + Examples:
    +# Do log rssi values (this is default):
    +attr RFXCOMUSB rssi 0
    +# Enable rssi logging for devices:
    +attr RFXCOMUSB rssi 1
    +    


  • diff --git a/FHEM/46_TRX_ELSE.pm b/FHEM/46_TRX_ELSE.pm index bda3bbdea..cbbc5d993 100755 --- a/FHEM/46_TRX_ELSE.pm +++ b/FHEM/46_TRX_ELSE.pm @@ -44,7 +44,7 @@ TRX_ELSE_Initialize($) { 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->{UndefFn} = "TRX_ELSE_Undef"; $hash->{ParseFn} = "TRX_ELSE_Parse"; diff --git a/FHEM/46_TRX_SECURITY.pm b/FHEM/46_TRX_SECURITY.pm index d3168a81b..c54ba4f4f 100755 --- a/FHEM/46_TRX_SECURITY.pm +++ b/FHEM/46_TRX_SECURITY.pm @@ -4,7 +4,7 @@ # 46_TRX_SECURITY.pm # FHEM module for X10, KD101, Visonic # -# Copyright (C) 2012 Willi Herzig +# Copyright (C) 2012/2013 Willi Herzig # # This file is part of fhem. # @@ -37,6 +37,7 @@ use warnings; my $TRX_SECURITY_debug = 0; my $time_old = 0; +my $trx_rssi; my $TRX_SECURITY_type_default = "ds10a"; @@ -395,6 +396,7 @@ sub TRX_SECURITY_parse_X10Sec { my $type = ""; my $delay = ""; my $battery = ""; + my $rssi = ""; my $option = ""; my @res; 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 = ""; 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); } + if ($rssi ne "") { + $sensor = "rssi"; + readingsBulkUpdate($def, $sensor, $rssi); + } + + if ($delay ne '') { $sensor = "delay"; $current = "Error"; @@ -516,6 +529,12 @@ TRX_SECURITY_Parse($$) { 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(); # convert to binary my $msg = pack('H*', $hexline); diff --git a/FHEM/46_TRX_WEATHER.pm b/FHEM/46_TRX_WEATHER.pm index bb39ea1b7..2539896b6 100755 --- a/FHEM/46_TRX_WEATHER.pm +++ b/FHEM/46_TRX_WEATHER.pm @@ -57,6 +57,9 @@ # "UVN800" is Oregon UVN800 # "TFA_UV" is TFA_UV-Sensor # +# Date/Time Sensors: +# * "RTGR328_DATE" is RTGR328N +# # Energy Sensors: # * "CM160" is OWL CM119, CM160 # * "CM180" is OWL CM180 @@ -100,13 +103,14 @@ use warnings; my $TRX_HEX_debug = 0; my $time_old = 0; +my $trx_rssi; sub TRX_WEATHER_Initialize($) { 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->{UndefFn} = "TRX_WEATHER_Undef"; $hash->{ParseFn} = "TRX_WEATHER_Parse"; @@ -176,6 +180,8 @@ my %types = 0x5610 => { part => 'WIND', method => \&TRX_WEATHER_common_anemometer, }, # UV 0x5709 => { part => 'UV', method => \&TRX_WEATHER_common_uv, }, + # Date/Time sensors + 0x580D => { part => 'DATE', method => \&TRX_WEATHER_common_datetime, }, # Energy usage sensors 0x5A11 => { part => 'ENERGY', method => \&TRX_WEATHER_common_energy, }, # WEIGHT @@ -281,6 +287,17 @@ sub TRX_WEATHER_simple_battery { type => '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 { @@ -301,6 +318,17 @@ sub TRX_WEATHER_battery { type => '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; } + # ------------------------------------------------------------ # sub TRX_WEATHER_common_anemometer { @@ -752,6 +781,63 @@ sub TRX_WEATHER_common_uv { 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 { @@ -829,6 +915,7 @@ sub TRX_WEATHER_common_energy { return @res; } + # ------------------------------------------------------------ # sub TRX_WEATHER_common_weight { @@ -904,6 +991,12 @@ TRX_WEATHER_Parse($$) #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(); # convert to binary my $msg = pack('H*', $hexline); @@ -1106,6 +1199,20 @@ TRX_WEATHER_Parse($$) $sensor = "hexline"; 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 { print "\nTRX_WEATHER: Unknown: "; print "Type: ".$i->{type}.", ";