mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-03 16:56:54 +00:00
New module for handling X10 security and X10 light messages
git-svn-id: https://svn.fhem.de/fhem/trunk@829 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
154403a07f
commit
db42f33b1a
565
fhem/FHEM/43_RFXX10REC.pm
Executable file
565
fhem/FHEM/43_RFXX10REC.pm
Executable file
@ -0,0 +1,565 @@
|
||||
#################################################################################
|
||||
# 44_RFXX10REC.pm
|
||||
# Modul for FHEM for unkown RFXCOM X11security
|
||||
#
|
||||
# - X10 security messages for
|
||||
# - ds10a: X10 Door / Window Sensor or compatible devices
|
||||
# - ss10a: X10 motion sensor
|
||||
# - sd90: Marmitek smoke detector
|
||||
# - kr18: X10 remote control
|
||||
# - X10 light messages for
|
||||
# - ms14a: motion sensor
|
||||
# - x10: generic X10 sensor
|
||||
#
|
||||
# This script is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
#
|
||||
##################################
|
||||
#
|
||||
# Special thanks to RFXCOM, http://www.rfxcom.com/, for their
|
||||
# help. I own an USB-RFXCOM-Receiver (433.92MHz, USB, order code 80002)
|
||||
# and highly recommend it.
|
||||
#
|
||||
##################################
|
||||
#
|
||||
# Some code from X10security code is derived from http://www.xpl-perl.org.uk/.
|
||||
# xpl-perl/lib/xPL/RF/X10Security.pm:
|
||||
# Thanks a lot to Mark Hindess who wrote xPL.
|
||||
#
|
||||
#SEE ALSO
|
||||
# Project website: http://www.xpl-perl.org.uk/
|
||||
# AUTHOR: Mark Hindess, soft-xpl-perl@temporalanomaly.com
|
||||
#
|
||||
#Copyright (C) 2007, 2009 by Mark Hindess
|
||||
#
|
||||
#This library is free software; you can redistribute it and/or modify
|
||||
#it under the same terms as Perl itself, either Perl version 5.8.7 or,
|
||||
#at your option, any later version of Perl 5 you may have available.
|
||||
#
|
||||
##################################
|
||||
#
|
||||
# values for "set global verbose"
|
||||
# 4: log unknown protocols
|
||||
# 5: log decoding hexlines for debugging
|
||||
#
|
||||
package main;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Switch;
|
||||
|
||||
# Debug this module? YES = 1, NO = 0
|
||||
my $RFXX10REC_debug = 0;
|
||||
|
||||
my $time_old = 0;
|
||||
|
||||
my $RFXX10REC_type_default = "ds10a";
|
||||
my $RFXX10REC_X10_type_default = "x10";
|
||||
|
||||
my $DOT = q{_};
|
||||
|
||||
sub
|
||||
RFXX10REC_Initialize($)
|
||||
{
|
||||
my ($hash) = @_;
|
||||
|
||||
#$hash->{Match} = "^\\).*"; # 0x29
|
||||
$hash->{Match} = "^(\\ |\\)).*"; # 0x20 or 0x29
|
||||
$hash->{DefFn} = "RFXX10REC_Define";
|
||||
$hash->{UndefFn} = "RFXX10REC_Undef";
|
||||
$hash->{ParseFn} = "RFXX10REC_Parse";
|
||||
$hash->{AttrList} = "IODev do_not_notify:1,0 loglevel:0,1,2,3,4,5,6";
|
||||
#Log 1, "RFXX10REC: Initialize";
|
||||
|
||||
}
|
||||
|
||||
#####################################
|
||||
sub
|
||||
RFXX10REC_Define($$)
|
||||
{
|
||||
my ($hash, $def) = @_;
|
||||
my @a = split("[ \t][ \t]*", $def);
|
||||
|
||||
my $a = int(@a);
|
||||
|
||||
if(int(@a) != 5 && int(@a) != 7) {
|
||||
Log 1,"RFXX10REC wrong syntax '@a'. \nCorrect syntax is 'define <name> RFXX10REC <type> <deviceid> <devicelog> [<deviceid2> <devicelog2>]'";
|
||||
return "wrong syntax: define <name> RFXX10REC <type> <deviceid> <devicelog> [<deviceid2> <devicelog2>]";
|
||||
}
|
||||
|
||||
|
||||
my $name = $a[0];
|
||||
|
||||
my $type = lc($a[2]);
|
||||
my $deviceid = $a[3];
|
||||
my $devicelog = $a[4];
|
||||
|
||||
|
||||
my $device_name = "RFXX10REC".$DOT.$deviceid;
|
||||
|
||||
if ($type ne "ds10a" && $type ne "sd90" && $type ne "x10" && $type ne "ms10a" && $type ne "ms14a" && $type ne "kr18") {
|
||||
Log 1,"RFX10SEC define: wrong type: $type";
|
||||
return "RFX10SEC: wrong type: $type";
|
||||
}
|
||||
|
||||
$hash->{RFXX10REC_deviceid} = $deviceid;
|
||||
$hash->{RFXX10REC_devicelog} = $devicelog;
|
||||
$hash->{RFXX10REC_type} = $type;
|
||||
#$hash->{RFXX10REC_CODE} = $deviceid;
|
||||
$modules{RFXX10REC}{defptr}{$device_name} = $hash;
|
||||
|
||||
|
||||
if (int(@a) == 7) {
|
||||
# there is a second deviceid:
|
||||
#
|
||||
my $deviceid2 = $a[5];
|
||||
my $devicelog2 = $a[6];
|
||||
|
||||
my $device_name2 = "RFXX10REC".$DOT.$deviceid2;
|
||||
|
||||
$hash->{RFXX10REC_deviceid2} = $deviceid2;
|
||||
$hash->{RFXX10REC_devicelog2} = $devicelog2;
|
||||
#$hash->{RFXX10REC_CODE2} = $deviceid2;
|
||||
$modules{RFXX10REC}{defptr2}{$device_name2} = $hash;
|
||||
}
|
||||
|
||||
AssignIoPort($hash);
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
#####################################
|
||||
sub
|
||||
RFXX10REC_Undef($$)
|
||||
{
|
||||
my ($hash, $name) = @_;
|
||||
delete($modules{RFXX10REC}{defptr}{$name});
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
||||
#####################################
|
||||
sub RFXX10REC_parse_X10 {
|
||||
my $bytes = shift;
|
||||
|
||||
|
||||
# checksum test
|
||||
(($bytes->[0]^0xff) == $bytes->[1] && ($bytes->[2]^0xff) == $bytes->[3])
|
||||
or return "";
|
||||
|
||||
#RFXX10REC_reverse_bits($bytes);
|
||||
|
||||
my %x10_devname =
|
||||
(
|
||||
0x60 => "A",
|
||||
0x70 => "B",
|
||||
0x40 => "C",
|
||||
0x50 => "D",
|
||||
0x80 => "E",
|
||||
0x90 => "F",
|
||||
0xA0 => "G",
|
||||
0xB0 => "H",
|
||||
0xE0 => "I",
|
||||
0xF0 => "J",
|
||||
0xC0 => "K",
|
||||
0xD0 => "L",
|
||||
0x00 => "M",
|
||||
0x10 => "N",
|
||||
0x20 => "O",
|
||||
0x30 => "P",
|
||||
);
|
||||
|
||||
my $dev_first = "?";
|
||||
|
||||
my $devnr = $bytes->[0] & 0xf0;
|
||||
if (exists $x10_devname{$devnr}) {
|
||||
$dev_first = $x10_devname{$devnr};
|
||||
}
|
||||
|
||||
my $unit_bit0 = ($bytes->[2] & 0x10) ? 1 : 0;
|
||||
my $unit_bit1 = ($bytes->[2] & 0x08) ? 1 : 0;
|
||||
my $unit_bit2 = ($bytes->[2] & 0x40) ? 1 : 0;
|
||||
my $unit_bit3 = ($bytes->[0] & 0x04) ? 1 : 0;
|
||||
my $unit = $unit_bit0 * 1 + $unit_bit1 * 2 + $unit_bit2 * 4 +$unit_bit3 * 8 + 1;
|
||||
|
||||
my $device = sprintf '%s%0d', $dev_first, $unit;
|
||||
|
||||
my $data = $bytes->[2];
|
||||
my $hexdata = sprintf '%02x', $bytes->[2];
|
||||
my $error;
|
||||
if ($data == 0x98) {
|
||||
$error = "RFXX10REC: X10 command 'Dim' not implemented, device=".$dev_first;
|
||||
Log 1,$error;
|
||||
return $error;
|
||||
} elsif ($data == 0x88) {
|
||||
$error = "RFXX10REC: X10 command 'Bright' not implemented, device=".$dev_first;
|
||||
Log 1,$error;
|
||||
return $error;
|
||||
} elsif ($data == 0x90) {
|
||||
$error = "RFXX10REC: X10 command 'All Lights on' not implemented, device=".$dev_first;
|
||||
Log 1,$error;
|
||||
return $error;
|
||||
} elsif ($data == 0x80) {
|
||||
$error = "RFXX10REC: X10 command 'All Lights off' not implemented, device=".$dev_first;
|
||||
Log 1,$error;
|
||||
return $error;
|
||||
}
|
||||
my $command;
|
||||
if ($data & 0x20) {
|
||||
$command = "off";
|
||||
} else {
|
||||
$command = "on";
|
||||
}
|
||||
|
||||
my @res;
|
||||
my $current = "";
|
||||
|
||||
#--------------
|
||||
my $device_name = "RFXX10REC".$DOT.$device;
|
||||
#Log 1, "RFXX10REC: device_name=$device_name command=$command" if ($RFXX10REC_debug == 1);
|
||||
|
||||
my $firstdevice = 1;
|
||||
my $def = $modules{RFXX10REC}{defptr}{$device_name};
|
||||
if(!$def) {
|
||||
#Log 1, "-1- not device_name=$device_name";
|
||||
$firstdevice = 0;
|
||||
$def = $modules{RFXX10REC}{defptr2}{$device_name};
|
||||
if (!$def) {
|
||||
#Log 1, "-2- not device_name=$device_name";
|
||||
Log 3, "RFXX10REC: RFXX10REC Unknown device $device_name, please define it";
|
||||
return "UNDEFINED $device_name RFXX10REC $RFXX10REC_X10_type_default $device Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
# Use $def->{NAME}, because the device may be renamed:
|
||||
my $name = $def->{NAME};
|
||||
|
||||
Log 1, "RFXX10REC: $name devn=$device_name first=$firstdevice type=$command, cmd=$hexdata" if ($RFXX10REC_debug == 1);
|
||||
|
||||
my $n = 0;
|
||||
my $tm = TimeNow();
|
||||
my $val = "";
|
||||
|
||||
my $device_type = $def->{RFXX10REC_type};
|
||||
#Log 1,"device_name=$device_name name=$name, type=$type";
|
||||
|
||||
my $sensor = "";
|
||||
|
||||
if ($device_type eq "ms14a") {
|
||||
# for ms14a behave like x11, but flip second deviceid
|
||||
$device_type = "x10";
|
||||
if ($firstdevice == 1) {
|
||||
$command = ($command eq "on") ? "alert" : "normal" ;
|
||||
} else {
|
||||
$command = ($command eq "on") ? "off" : "on" ;
|
||||
}
|
||||
}
|
||||
|
||||
if ($device_type eq "x10") {
|
||||
|
||||
$current = $command;
|
||||
|
||||
$sensor = $firstdevice == 1 ? $def->{RFXX10REC_devicelog} : $def->{RFXX10REC_devicelog2};
|
||||
$val .= $current;
|
||||
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||
$def->{READINGS}{$sensor}{VAL} = $current;
|
||||
$def->{CHANGED}[$n++] = $sensor . ": " . $current;
|
||||
} else {
|
||||
Log 1, "RFXX10REC: X10 error unknown sensor type=$device_type $name devn=$device_name first=$firstdevice type=$command, user=$device (hex $hexdata)";
|
||||
return "RFXX10REC X10 error unknown sensor type=$device_type for $device_name device=$device";
|
||||
}
|
||||
|
||||
if (($firstdevice == 1) && $val) {
|
||||
$def->{STATE} = $val;
|
||||
$def->{TIME} = $tm;
|
||||
$def->{CHANGED}[$n++] = $val;
|
||||
}
|
||||
|
||||
DoTrigger($name, undef);
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
#####################################
|
||||
sub RFXX10REC_parse_X10Sec {
|
||||
my $bytes = shift;
|
||||
|
||||
|
||||
# checksum test
|
||||
(($bytes->[0]^0x0f) == $bytes->[1] && ($bytes->[2]^0xff) == $bytes->[3])
|
||||
or return "";
|
||||
|
||||
#RFXX10REC_reverse_bits($bytes);
|
||||
|
||||
#my $device = sprintf 'x10sec%02x', $bytes->[0];
|
||||
my $device = sprintf '%02x%02x', $bytes->[4], $bytes->[0];
|
||||
#Log 1, "X10Sec device-nr=$device";
|
||||
my $short_device = $bytes->[0];
|
||||
my $data = $bytes->[2];
|
||||
|
||||
my $hexdata = sprintf '%02x', $bytes->[2];
|
||||
#Log 1, "X10Sec data=$hexdata";
|
||||
|
||||
my %x10_security =
|
||||
(
|
||||
0x00 => ['X10Sec', 'alert', 'max_delay', 'batt_ok'],
|
||||
0x01 => ['X10Sec', 'alert', 'max_delay', 'batt_low'],
|
||||
0x04 => ['X10Sec', 'alert', 'min_delay', 'batt_ok'],
|
||||
0x05 => ['X10Sec', 'alert', 'min_delay', 'batt_low'],
|
||||
0x80 => ['X10Sec', 'normal', 'max_delay', 'batt_ok'],
|
||||
0x81 => ['X10Sec', 'normal', 'max_delay', 'batt_low'],
|
||||
0x84 => ['X10Sec', 'normal', 'min_delay', 'batt_ok'],
|
||||
0x85 => ['X10Sec', 'normal', 'min_delay', 'batt_low'],
|
||||
0x26 => ['X10Sec', 'alert', '', ''],
|
||||
#
|
||||
0x0c => ['X10Sec', 'alert', '', 'batt_ok'], # MS10a
|
||||
0x0d => ['X10Sec', 'alert', '', 'batt_low'], # MS10a
|
||||
0x8c => ['X10Sec', 'normal', '', 'batt_ok'], # MS10a
|
||||
0x8d => ['X10Sec', 'normal', '', 'batt_low'], # MS10a
|
||||
#
|
||||
0x06 => ['X10Sec', 'Security-Arm', '', ''], # kr18
|
||||
0x86 => ['X10Sec', 'Security-Disarm', '', ''], # kr18
|
||||
0x42 => ['X10Sec', 'ButtonA-on', '', ''], # kr18
|
||||
0xc2 => ['X10Sec', 'ButtonA-off', '', ''], # kr18
|
||||
0x46 => ['X10Sec', 'ButtonB-on', '', ''], # kr18
|
||||
0xc6 => ['X10Sec', 'ButtonB-off', '', ''], # kr18
|
||||
|
||||
);
|
||||
|
||||
my $command = "";
|
||||
my $type = "";
|
||||
my $delay = "";
|
||||
my $battery = "";
|
||||
|
||||
my @res;
|
||||
my %args;
|
||||
if (exists $x10_security{$data}) {
|
||||
|
||||
my $rec = $x10_security{$data};
|
||||
if (ref $rec) {
|
||||
($type, $command, $delay, $battery) = @$rec;
|
||||
} else {
|
||||
$command = $rec;
|
||||
}
|
||||
|
||||
} else {
|
||||
Log 1, "RFXX10REC undefined command cmd=$data device-nr=$device, hex=$hexdata";
|
||||
return "RFXX10REC undefined command";
|
||||
}
|
||||
|
||||
my $current = "";
|
||||
|
||||
#--------------
|
||||
my $device_name = "RFXX10REC".$DOT.$device;
|
||||
#Log 1, "device_name=$device_name";
|
||||
Log 4, "device_name=$device_name";
|
||||
|
||||
|
||||
my $firstdevice = 1;
|
||||
my $def = $modules{RFXX10REC}{defptr}{$device_name};
|
||||
if(!$def) {
|
||||
#Log 1, "-1- not device_name=$device_name";
|
||||
$firstdevice = 0;
|
||||
$def = $modules{RFXX10REC}{defptr2}{$device_name};
|
||||
if (!$def) {
|
||||
#Log 1, "-2- not device_name=$device_name";
|
||||
Log 3, "RFXX10REC: RFXX10REC Unknown device $device_name, please define it";
|
||||
return "UNDEFINED $device_name RFXX10REC $RFXX10REC_type_default $device Window";
|
||||
}
|
||||
}
|
||||
|
||||
# Use $def->{NAME}, because the device may be renamed:
|
||||
my $name = $def->{NAME};
|
||||
#Log 1, "name=$new_name";
|
||||
|
||||
Log 1, "RFXX10REC: $name devn=$device_name first=$firstdevice type=$command, delay=$delay, batt=$battery cmd=$hexdata" if ($RFXX10REC_debug == 1);
|
||||
|
||||
my $n = 0;
|
||||
my $tm = TimeNow();
|
||||
my $val = "";
|
||||
|
||||
my $device_type = $def->{RFXX10REC_type};
|
||||
#Log 1,"device_name=$device_name name=$name, type=$type";
|
||||
|
||||
my $sensor = "";
|
||||
|
||||
if ($device_type eq "ds10a") {
|
||||
|
||||
|
||||
$current = "Error";
|
||||
$current = "Open" if ($command eq "alert");
|
||||
$current = "Closed" if ($command eq "normal");
|
||||
|
||||
$sensor = $def->{RFXX10REC_devicelog};
|
||||
$val .= $current;
|
||||
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||
$def->{READINGS}{$sensor}{VAL} = $current;
|
||||
$def->{CHANGED}[$n++] = $sensor . ": " . $current;
|
||||
|
||||
if (($def->{STATE} ne $val)) {
|
||||
$sensor = "statechange";
|
||||
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||
$def->{READINGS}{$sensor}{VAL} = $current;
|
||||
$def->{CHANGED}[$n++] = $sensor . ": " . $current;
|
||||
}
|
||||
|
||||
if ($battery ne '') {
|
||||
$sensor = "battery";
|
||||
$current = "Error";
|
||||
$current = "ok" if ($battery eq "batt_ok");
|
||||
$current = "low" if ($battery eq "batt_low");
|
||||
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||
$def->{READINGS}{$sensor}{VAL} = $current;
|
||||
$def->{CHANGED}[$n++] = $sensor . ": " . $current;
|
||||
}
|
||||
|
||||
if ($delay ne '') {
|
||||
$sensor = "delay";
|
||||
$current = "Error";
|
||||
$current = "min" if ($delay eq "min_delay");
|
||||
$current = "max" if ($delay eq "max_delay");
|
||||
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||
$def->{READINGS}{$sensor}{VAL} = $current;
|
||||
$def->{CHANGED}[$n++] = $sensor . ": " . $current;
|
||||
}
|
||||
|
||||
} elsif ($device_type eq "sd90") {
|
||||
|
||||
|
||||
$sensor = $firstdevice == 1 ? $def->{RFXX10REC_devicelog} : $def->{RFXX10REC_devicelog2};
|
||||
|
||||
$current = $command;
|
||||
|
||||
if ($firstdevice == 1) {
|
||||
$val .= $current;
|
||||
}
|
||||
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||
$def->{READINGS}{$sensor}{VAL} = $current;
|
||||
$def->{CHANGED}[$n++] = $sensor . ": " . $current;
|
||||
|
||||
if ($battery) {
|
||||
$sensor = "battery";
|
||||
$current = "Error";
|
||||
$current = "ok" if ($battery eq "batt_ok");
|
||||
$current = "low" if ($battery eq "bat_low");
|
||||
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||
$def->{READINGS}{$sensor}{VAL} = $current;
|
||||
$def->{CHANGED}[$n++] = $sensor . ": " . $current;
|
||||
}
|
||||
|
||||
# sd90 does not have a delay switch
|
||||
if (0 && $delay) {
|
||||
$sensor = "delay";
|
||||
$current = "Error";
|
||||
$current = "min" if ($delay eq "min_delay");
|
||||
$current = "max" if ($delay eq "max_delay");
|
||||
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||
$def->{READINGS}{$sensor}{VAL} = $current;
|
||||
$def->{CHANGED}[$n++] = $sensor . ": " . $current;
|
||||
}
|
||||
|
||||
} elsif ($device_type eq "ms10a") {
|
||||
|
||||
$current = $command;
|
||||
|
||||
$sensor = $def->{RFXX10REC_devicelog};
|
||||
$val .= $current;
|
||||
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||
$def->{READINGS}{$sensor}{VAL} = $current;
|
||||
$def->{CHANGED}[$n++] = $sensor . ": " . $current;
|
||||
|
||||
if (($def->{STATE} ne $val)) {
|
||||
$sensor = "statechange";
|
||||
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||
$def->{READINGS}{$sensor}{VAL} = $current;
|
||||
$def->{CHANGED}[$n++] = $sensor . ": " . $current;
|
||||
}
|
||||
|
||||
if ($battery ne '') {
|
||||
$sensor = "battery";
|
||||
$current = "Error";
|
||||
$current = "ok" if ($battery eq "batt_ok");
|
||||
$current = "low" if ($battery eq "batt_low");
|
||||
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||
$def->{READINGS}{$sensor}{VAL} = $current;
|
||||
$def->{CHANGED}[$n++] = $sensor . ": " . $current;
|
||||
}
|
||||
|
||||
} elsif ($device_type eq "kr18") {
|
||||
|
||||
$current = $command;
|
||||
|
||||
#$sensor = $def->{RFXX10REC_devicelog};
|
||||
$val = $current;
|
||||
#$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||
#$def->{READINGS}{$sensor}{VAL} = $current;
|
||||
#$def->{CHANGED}[$n++] = $sensor . ": " . $current;
|
||||
|
||||
my @cmd_split = split(/-/, $command);
|
||||
$sensor = $cmd_split[0];
|
||||
$current = $cmd_split[1];
|
||||
$def->{READINGS}{$sensor}{TIME} = $tm;
|
||||
$def->{READINGS}{$sensor}{VAL} = $current;
|
||||
$def->{CHANGED}[$n++] = $sensor . ": " . $current;
|
||||
|
||||
} else {
|
||||
Log 1, "RFXX10REC: error unknown sensor type=$device_type $name devn=$device_name first=$firstdevice type=$command, user=$device, delay=$delay, batt=$battery (hex $hexdata)";
|
||||
return "RFXX10REC error unknown sensor type=$device_type for $device_name device=$device";
|
||||
}
|
||||
|
||||
if (($firstdevice == 1) && $val) {
|
||||
$def->{STATE} = $val;
|
||||
$def->{TIME} = $tm;
|
||||
$def->{CHANGED}[$n++] = $val;
|
||||
}
|
||||
|
||||
DoTrigger($name, undef);
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
sub
|
||||
RFXX10REC_Parse($$)
|
||||
{
|
||||
my ($hash, $msg) = @_;
|
||||
|
||||
my $time = time();
|
||||
my $hexline = unpack('H*', $msg);
|
||||
if ($time_old ==0) {
|
||||
Log 5, "RFXX10REC: decoding delay=0 hex=$hexline";
|
||||
} else {
|
||||
my $time_diff = $time - $time_old ;
|
||||
Log 5, "RFXX10REC: decoding delay=$time_diff hex=$hexline";
|
||||
}
|
||||
$time_old = $time;
|
||||
|
||||
# convert string to array of bytes. Skip length byte
|
||||
my @rfxcom_data_array = ();
|
||||
foreach (split(//, substr($msg,1))) {
|
||||
push (@rfxcom_data_array, ord($_) );
|
||||
}
|
||||
|
||||
my $bits = ord($msg);
|
||||
my $num_bytes = $bits >> 3; if (($bits & 0x7) != 0) { $num_bytes++; }
|
||||
|
||||
my $res = "";
|
||||
if ($bits == 41) {
|
||||
Log 1, "RFXX10REC: bits=$bits num_bytes=$num_bytes hex=$hexline" if ($RFXX10REC_debug == 1);
|
||||
$res = RFXX10REC_parse_X10Sec(\@rfxcom_data_array);
|
||||
Log 1, "RFXX10REC: unsupported hex=$hexline" if ($res ne "" && $res !~ /^UNDEFINED.*/);
|
||||
return $res;
|
||||
} elsif ($bits == 32) {
|
||||
Log 1, "RFXX10REC: bits=$bits num_bytes=$num_bytes hex=$hexline" if ($RFXX10REC_debug == 1);
|
||||
$res = RFXX10REC_parse_X10(\@rfxcom_data_array);
|
||||
Log 1, "RFXX10REC: unsupported hex=$hexline" if ($res ne "" && $res !~ /^UNDEFINED.*/);
|
||||
return $res;
|
||||
} else {
|
||||
Log 0, "RFXX10REC: bits=$bits num_bytes=$num_bytes hex=$hexline";
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
1;
|
Loading…
x
Reference in New Issue
Block a user