change code

This commit is contained in:
Marko Oldenburg 2020-05-10 14:25:53 +02:00
parent 765a923f46
commit 1cd9dbeb96

View File

@ -36,7 +36,7 @@
package FHEM::XiaomiBTLESens;
my $missingModul = "";
my $missingModul = q{};
use strict;
use warnings;
@ -207,23 +207,23 @@ sub Initialize {
$hash->{UndefFn} = \&Undef;
$hash->{AttrFn} = \&Attr;
$hash->{AttrList} =
"interval "
. "disable:1 "
. "disabledForIntervals "
. "hciDevice:hci0,hci1,hci2 "
. "batteryFirmwareAge:8h,16h,24h,32h,40h,48h "
. "minFertility "
. "maxFertility "
. "minTemp "
. "maxTemp "
. "minMoisture "
. "maxMoisture "
. "minLux "
. "maxLux "
. "sshHost "
. "psCommand "
. "model:flowerSens,thermoHygroSens,clearGrassSens "
. "blockingCallLoglevel:2,3,4,5 "
'interval '
. 'disable:1 '
. 'disabledForIntervals '
. 'hciDevice:hci0,hci1,hci2 '
. 'batteryFirmwareAge:8h,16h,24h,32h,40h,48h '
. 'minFertility '
. 'maxFertility '
. 'minTemp '
. 'maxTemp '
. 'minMoisture '
. 'maxMoisture '
. 'minLux '
. 'maxLux '
. 'sshHost '
. 'psCommand '
. 'model:flowerSens,thermoHygroSens,clearGrassSens '
. 'blockingCallLoglevel:2,3,4,5 '
. $readingFnAttributes;
$hash->{parseParams} = 1;
@ -234,10 +234,10 @@ sub Define {
my $hash = shift;
my $a = shift;
return $@ unless ( FHEM::Meta::SetInternals($hash) );
return $@ if ( !FHEM::Meta::SetInternals($hash) );
use version 0.60; our $VERSION = FHEM::Meta::Get( $hash, 'version' );
return "too few parameters: define <name> XiaomiBTLESens <BTMAC>"
return 'too few parameters: define <name> XiaomiBTLESens <BTMAC>'
if ( scalar( @{$a} ) != 3 );
return
"Cannot define XiaomiBTLESens device. Perl modul ${missingModul}is missing."
@ -251,10 +251,10 @@ sub Define {
$hash->{INTERVAL} = 300;
$hash->{helper}{CallSensDataCounter} = 0;
$hash->{helper}{CallBattery} = 0;
$hash->{NOTIFYDEV} = "global,$name";
$hash->{NOTIFYDEV} = 'global,' . $name;
$hash->{loglevel} = 4;
readingsSingleUpdate( $hash, "state", "initialized", 0 );
readingsSingleUpdate( $hash, 'state', 'initialized', 0 );
CommandAttr( undef, $name . ' room XiaomiBTLESens' )
if ( AttrVal( $name, 'room', 'none' ) eq 'none' );
@ -287,44 +287,44 @@ sub Attr {
my ( $cmd, $name, $attrName, $attrVal ) = @_;
my $hash = $defs{$name};
if ( $attrName eq "disable" ) {
if ( $cmd eq "set" and $attrVal eq "1" ) {
if ( $attrName eq 'disable' ) {
if ( $cmd eq 'set' && $attrVal == 1 ) {
RemoveInternalTimer($hash);
readingsSingleUpdate( $hash, "state", "disabled", 1 );
readingsSingleUpdate( $hash, 'state', 'disabled', 1 );
Log3( $name, 3, "XiaomiBTLESens ($name) - disabled" );
}
elsif ( $cmd eq "del" ) {
elsif ( $cmd eq 'del' ) {
Log3( $name, 3, "XiaomiBTLESens ($name) - enabled" );
}
}
elsif ( $attrName eq "disabledForIntervals" ) {
if ( $cmd eq "set" ) {
elsif ( $attrName eq 'disabledForIntervals' ) {
if ( $cmd eq 'set' ) {
return
"check disabledForIntervals Syntax HH:MM-HH:MM or 'HH:MM-HH:MM HH:MM-HH:MM ...'"
unless ( $attrVal =~ /^((\d{2}:\d{2})-(\d{2}:\d{2})\s?)+$/ );
'check disabledForIntervals Syntax HH:MM-HH:MM or HH:MM-HH:MM HH:MM-HH:MM ...'
if ( $attrVal !~ /^((\d{2}:\d{2})-(\d{2}:\d{2})\s?)+$/ );
Log3( $name, 3, "XiaomiBTLESens ($name) - disabledForIntervals" );
stateRequest($hash);
}
elsif ( $cmd eq "del" ) {
elsif ( $cmd eq 'del' ) {
Log3( $name, 3, "XiaomiBTLESens ($name) - enabled" );
readingsSingleUpdate( $hash, "state", "active", 1 );
readingsSingleUpdate( $hash, 'state', 'active', 1 );
}
}
elsif ( $attrName eq "interval" ) {
elsif ( $attrName eq 'interval' ) {
RemoveInternalTimer($hash);
if ( $cmd eq "set" ) {
if ( $cmd eq 'set' ) {
if ( $attrVal < 120 ) {
Log3( $name, 3,
"XiaomiBTLESens ($name) - interval too small, please use something >= 120 (sec), default is 300 (sec)"
);
return
"interval too small, please use something >= 120 (sec), default is 300 (sec)";
'interval too small, please use something >= 120 (sec), default is 300 (sec)';
}
else {
$hash->{INTERVAL} = $attrVal;
@ -333,22 +333,22 @@ sub Attr {
}
}
elsif ( $cmd eq "del" ) {
elsif ( $cmd eq 'del' ) {
$hash->{INTERVAL} = 300;
Log3( $name, 3,
"XiaomiBTLESens ($name) - set interval to default" );
}
}
elsif ( $attrName eq "blockingCallLoglevel" ) {
if ( $cmd eq "set" ) {
elsif ( $attrName eq 'blockingCallLoglevel' ) {
if ( $cmd eq 'set' ) {
$hash->{loglevel} = $attrVal;
Log3( $name, 3,
"XiaomiBTLESens ($name) - set blockingCallLoglevel to $attrVal"
);
}
elsif ( $cmd eq "del" ) {
elsif ( $cmd eq 'del' ) {
$hash->{loglevel} = 4;
Log3( $name, 3,
"XiaomiBTLESens ($name) - set blockingCallLoglevel to default"
@ -391,13 +391,13 @@ sub Notify {
or grep /^ATTR.$name.interval.[0-9]+/,
@{$events}
)
and $devname eq 'global'
&& $devname eq 'global'
)
or grep /^resetBatteryTimestamp$/,
@{$events}
)
and $init_done
or (
&& $init_done
|| (
(
grep /^INITIALIZED$/,
@{$events}
@ -406,7 +406,7 @@ sub Notify {
or grep /^MODIFIED.$name$/,
@{$events}
)
and $devname eq 'global'
&& $devname eq 'global'
)
);
@ -414,8 +414,8 @@ sub Notify {
$XiaomiModels{ AttrVal( $name, 'model', '' ) }{devicename} )
if (
AttrVal( $name, 'model', 'thermoHygroSens' ) eq 'thermoHygroSens'
and $devname eq $name
and grep /^$name.firmware.+/,
&& $devname eq $name
&& grep /^$name.firmware.+/,
@{$events}
);
@ -429,7 +429,7 @@ sub stateRequest {
my %readings;
if ( AttrVal( $name, 'model', 'none' ) eq 'none' ) {
readingsSingleUpdate( $hash, "state", "set attribute model first", 1 );
readingsSingleUpdate( $hash, 'state', 'set attribute model first', 1 );
}
elsif ( !IsDisabled($name) ) {
@ -446,7 +446,7 @@ sub stateRequest {
);
if ( $hash->{helper}{CallSensDataCounter} < 1
and AttrVal( $name, 'model', '' ) ne 'clearGrassSens' )
&& AttrVal( $name, 'model', '' ) ne 'clearGrassSens' )
{
CreateParamGatttool(
$hash,
@ -459,7 +459,7 @@ sub stateRequest {
}
elsif ( $hash->{helper}{CallSensDataCounter} < 1
and AttrVal( $name, 'model', '' ) eq 'clearGrassSens' )
&& AttrVal( $name, 'model', '' ) eq 'clearGrassSens' )
{
CreateParamGatttool( $hash, 'read',
$XiaomiModels{ AttrVal( $name, 'model', '' ) }{rdata},
@ -482,7 +482,7 @@ sub stateRequest {
}
else {
readingsSingleUpdate( $hash, "state", "disabled", 1 );
readingsSingleUpdate( $hash, 'state', 'disabled', 1 );
}
return;
@ -497,7 +497,7 @@ sub stateRequestTimer {
stateRequest($hash);
InternalTimer( gettimeofday() + $hash->{INTERVAL} + int( rand(300) ),
"XiaomiBTLESens_stateRequestTimer", $hash );
'XiaomiBTLESens_stateRequestTimer', $hash );
Log3( $name, 4,
"XiaomiBTLESens ($name) - stateRequestTimer: Call Request Timer" );
@ -516,7 +516,7 @@ sub Set($$@) {
my $value = 'write';
if ( $cmd eq 'devicename' ) {
return "usage: devicename <name>" if ( scalar( @{$a} ) < 1 );
return 'usage: devicename <name>' if ( scalar( @{$a} ) < 1 );
$mod = 'write';
$handle = $XiaomiModels{ AttrVal( $name, 'model', '' ) }{devicename};
@ -524,20 +524,20 @@ sub Set($$@) {
}
elsif ( $cmd eq 'resetBatteryTimestamp' ) {
return "usage: resetBatteryTimestamp" if ( scalar( @{$a} ) != 0 );
return 'usage: resetBatteryTimestamp' if ( scalar( @{$a} ) != 0 );
$hash->{helper}{updateTimeCallBattery} = 0;
return;
}
else {
my $list = "";
$list .= "resetBatteryTimestamp:noArg"
unless ( AttrVal( $name, 'model', 'none' ) eq 'none' );
$list .= " devicename"
my $list = q{};
$list .= 'resetBatteryTimestamp:noArg'
if ( AttrVal( $name, 'model', 'none' ) ne 'none' );
$list .= ' devicename'
if (
AttrVal( $name, 'model', 'thermoHygroSens' ) eq 'thermoHygroSens'
and AttrVal( $name, 'model', 'none' ) ne 'none' );
&& AttrVal( $name, 'model', 'none' ) ne 'none' );
return "Unknown argument $cmd, choose one of $list";
}
@ -557,13 +557,13 @@ sub Get {
my $handle;
if ( $cmd eq 'sensorData' ) {
return "usage: sensorData" if ( scalar( @{$a} ) != 0 );
return 'usage: sensorData' if ( scalar( @{$a} ) != 0 );
stateRequest($hash);
}
elsif ( $cmd eq 'firmware' ) {
return "usage: firmware" if ( scalar( @{$a} ) != 0 );
return 'usage: firmware' if ( scalar( @{$a} ) != 0 );
$mod = 'read';
$handle = $XiaomiModels{ AttrVal( $name, 'model', '' ) }{firmware};
@ -577,13 +577,13 @@ sub Get {
}
else {
my $list = "";
$list .= "sensorData:noArg firmware:noArg"
unless ( AttrVal( $name, 'model', 'none' ) eq 'none' );
$list .= " devicename:noArg"
my $list = q{};
$list .= 'sensorData:noArg firmware:noArg'
if ( AttrVal( $name, 'model', 'none' ) ne 'none' );
$list .= ' devicename:noArg'
if (
AttrVal( $name, 'model', 'thermoHygroSens' ) eq 'thermoHygroSens'
and AttrVal( $name, 'model', 'none' ) ne 'none' );
&& AttrVal( $name, 'model', 'none' ) ne 'none' );
return "Unknown argument $cmd, choose one of $list";
}
@ -603,15 +603,15 @@ sub CreateParamGatttool {
if ( $mod eq 'read' ) {
$hash->{helper}{RUNNING_PID} = BlockingCall(
"FHEM::XiaomiBTLESens::ExecGatttool_Run",
$name . "|" . $mac . "|" . $mod . "|" . $handle,
"FHEM::XiaomiBTLESens::ExecGatttool_Done",
'FHEM::XiaomiBTLESens::ExecGatttool_Run',
$name . '|' . $mac . '|' . $mod . '|' . $handle,
'FHEM::XiaomiBTLESens::ExecGatttool_Done',
90,
"FHEM::XiaomiBTLESens::ExecGatttool_Aborted",
'FHEM::XiaomiBTLESens::ExecGatttool_Aborted',
$hash
) unless ( exists( $hash->{helper}{RUNNING_PID} ) );
) if ( !exists( $hash->{helper}{RUNNING_PID} ) );
readingsSingleUpdate( $hash, "state", "read sensor data", 1 );
readingsSingleUpdate( $hash, 'state', 'read sensor data', 1 );
Log3( $name, 5,
"XiaomiBTLESens ($name) - Read XiaomiBTLESens_ExecGatttool_Run $name|$mac|$mod|$handle"
@ -620,20 +620,20 @@ sub CreateParamGatttool {
}
elsif ( $mod eq 'write' ) {
$hash->{helper}{RUNNING_PID} = BlockingCall(
"FHEM::XiaomiBTLESens::ExecGatttool_Run",
$name . "|"
. $mac . "|"
. $mod . "|"
. $handle . "|"
. $value . "|"
'FHEM::XiaomiBTLESens::ExecGatttool_Run',
$name . '|'
. $mac . '|'
. $mod . '|'
. $handle . '|'
. $value . '|'
. $XiaomiModels{ AttrVal( $name, 'model', '' ) }{wdatalisten},
"FHEM::XiaomiBTLESens::ExecGatttool_Done",
'FHEM::XiaomiBTLESens::ExecGatttool_Done',
90,
"FHEM::XiaomiBTLESens::ExecGatttool_Aborted",
'FHEM::XiaomiBTLESens::ExecGatttool_Aborted',
$hash
) unless ( exists( $hash->{helper}{RUNNING_PID} ) );
) if ( !exists( $hash->{helper}{RUNNING_PID} ) );
readingsSingleUpdate( $hash, "state", "write sensor data", 1 );
readingsSingleUpdate( $hash, 'state', 'write sensor data', 1 );
Log3( $name, 5,
"XiaomiBTLESens ($name) - Write XiaomiBTLESens_ExecGatttool_Run $name|$mac|$mod|$handle|$value"
@ -652,8 +652,8 @@ sub ExecGatttool_Run {
my $string = shift;
my ( $name, $mac, $gattCmd, $handle, $value, $listen ) =
split( "\\|", $string );
my $sshHost = AttrVal( $name, "sshHost", "none" );
split( '\|', $string );
my $sshHost = AttrVal( $name, 'sshHost', 'none' );
my $gatttool;
my $json_notification;
@ -661,14 +661,14 @@ sub ExecGatttool_Run {
$gatttool = qx(ssh $sshHost 'which gatttool') if ( $sshHost ne 'none' );
chomp $gatttool;
if ( defined($gatttool) and ($gatttool) ) {
if ( defined($gatttool) && ($gatttool) ) {
my $cmd;
my $loop;
my @gtResult;
my $wait = 1;
my $sshHost = AttrVal( $name, "sshHost", "none" );
my $hci = AttrVal( $name, "hciDevice", "hci0" );
my $sshHost = AttrVal( $name, 'sshHost', 'none' );
my $hci = AttrVal( $name, 'hciDevice', 'hci0' );
$cmd .= "ssh $sshHost '" if ( $sshHost ne 'none' );
$cmd .= "timeout 10 " if ($listen);
@ -682,12 +682,11 @@ sub ExecGatttool_Run {
$cmd .= " 2>&1";
$cmd .= "'" if ( $sshHost ne 'none' );
# $cmd = "ssh $sshHost 'gatttool -i $hci -b $mac --char-write-req -a 0x33 -n A01F && gatttool -i $hci -b $mac --char-read -a 0x35 2>&1 /dev/null'"
$cmd =
"ssh $sshHost 'gatttool -i $hci -b $mac --char-write-req -a 0x33 -n A01F && gatttool -i $hci -b $mac --char-read -a 0x35 2>&1 '"
if ( $sshHost ne 'none'
and $gattCmd eq 'write'
and AttrVal( $name, "model", "none" ) eq 'flowerSens' );
&& $gattCmd eq 'write'
&& AttrVal( $name, 'model', 'none' ) eq 'flowerSens' );
while ($wait) {
@ -730,22 +729,20 @@ qx(ssh $sshHost '$psCommand | grep -E "$gatttoolCmdlineStaticEscaped"')
);
( $returnString, $returnCode ) = Gatttool_executeCommand($cmd);
@gtResult = split( ": ", $returnString );
# @gtResult = split( ": ", qx($cmd) );
@gtResult = split( ': ', $returnString );
Log3( $name, 5,
"XiaomiBTLESens ($name) - ExecGatttool_Run: gatttool loop result "
. join( ",", @gtResult ) );
. join( ',', @gtResult ) );
$returnCode = 2
unless ( defined( $gtResult[0] ) );
if ( !defined( $gtResult[0] ) );
$loop++;
} while ( $loop < 5 and ( $returnCode != 0 and $returnCode != 124 ) );
} while ( $loop < 5 && ( $returnCode != 0 && $returnCode != 124 ) );
Log3( $name, 3,
"XiaomiBTLESens ($name) - ExecGatttool_Run: errorcode: \"$returnCode\", ErrorString: \"$returnString\""
) if ( $returnCode != 0 and $returnCode != 124 );
) if ( $returnCode != 0 && $returnCode != 124 );
Log3( $name, 4,
"XiaomiBTLESens ($name) - ExecGatttool_Run: gatttool result "
@ -753,18 +750,18 @@ qx(ssh $sshHost '$psCommand | grep -E "$gatttoolCmdlineStaticEscaped"')
$handle = '0x35'
if ( $sshHost ne 'none'
and $gattCmd eq 'write'
and AttrVal( $name, 'model', 'none' ) eq 'flowerSens' );
&& $gattCmd eq 'write'
&& AttrVal( $name, 'model', 'none' ) eq 'flowerSens' );
$gattCmd = 'read'
if ( $sshHost ne 'none'
and $gattCmd eq 'write'
and AttrVal( $name, 'model', 'none' ) eq 'flowerSens' );
&& $gattCmd eq 'write'
&& AttrVal( $name, 'model', 'none' ) eq 'flowerSens' );
$gtResult[1] = 'no data response'
unless ( defined( $gtResult[1] ) );
if ( !defined( $gtResult[1] ) );
if ( $gtResult[1] ne 'no data response' and $listen ) {
( $gtResult[1] ) = split( "\n", $gtResult[1] );
if ( $gtResult[1] ne 'no data response' && $listen ) {
( $gtResult[1] ) = split( '\n', $gtResult[1] );
$gtResult[1] =~ s/\\n//g;
}
@ -773,7 +770,7 @@ qx(ssh $sshHost '$psCommand | grep -E "$gatttoolCmdlineStaticEscaped"')
if ( $gtResult[1] =~ /^([0-9a-f]{2}(\s?))*$/ ) {
return "$name|$mac|ok|$gattCmd|$handle|$json_notification";
}
elsif ( $returnCode == 0 and $gattCmd eq 'write' ) {
elsif ( $returnCode == 0 && $gattCmd eq 'write' ) {
if ( $sshHost ne 'none' ) {
ExecGatttool_Run( $name . "|" . $mac . "|read|0x35" );
}
@ -799,7 +796,7 @@ sub ExecGatttool_Done {
my $string = shift;
my ( $name, $mac, $respstate, $gattCmd, $handle, $json_notification ) =
split( "\\|", $string );
split( '\|', $string );
my $hash = $defs{$name};
@ -822,8 +819,8 @@ sub ExecGatttool_Done {
}
if ( $respstate eq 'ok'
and $gattCmd eq 'write'
and AttrVal( $name, 'model', 'none' ) eq 'flowerSens' )
&& $gattCmd eq 'write'
&& AttrVal( $name, 'model', 'none' ) eq 'flowerSens' )
{
CreateParamGatttool( $hash, 'read',
$XiaomiModels{ AttrVal( $name, 'model', '' ) }{rdata} );
@ -848,7 +845,7 @@ sub ExecGatttool_Aborted {
my %readings;
delete( $hash->{helper}{RUNNING_PID} );
readingsSingleUpdate( $hash, "state", "unreachable", 1 );
readingsSingleUpdate( $hash, 'state', 'unreachable', 1 );
$readings{'lastGattError'} =
'The BlockingCall Process terminated unexpectedly. Timedout';
@ -921,7 +918,7 @@ sub ProcessingNotification {
return CreateParamGatttool( $hash, 'read',
$XiaomiModels{ AttrVal( $name, 'model', '' ) }{devicename} )
unless ( $gattCmd eq 'read' );
if ( $gattCmd ne 'read' );
$readings = ThermoHygroSensHandle0x3( $hash, $notification );
}
}
@ -957,7 +954,7 @@ sub ProcessingNotification {
return CreateParamGatttool( $hash, 'read',
$XiaomiModels{ AttrVal( $name, 'model', '' ) }{devicename} )
unless ( $gattCmd eq 'read' );
if ( $gattCmd ne 'read' );
$readings = ClearGrassSensHandle0x3( $hash, $notification );
}
}
@ -975,7 +972,7 @@ sub FlowerSensHandle0x38 {
Log3( $name, 4, "XiaomiBTLESens ($name) - FlowerSens Handle0x38" );
my @dataBatFw = split( " ", $notification );
my @dataBatFw = split( /\s/, $notification );
### neue Vereinheitlichung für Batteriereadings Forum #800017
$readings{'batteryPercent'} = hex( "0x" . $dataBatFw[0] );
@ -1003,15 +1000,15 @@ sub FlowerSensHandle0x35 {
Log3( $name, 4, "XiaomiBTLESens ($name) - FlowerSens Handle0x35" );
my @dataSensor = split( " ", $notification );
my @dataSensor = split( /\s/, $notification );
return stateRequest($hash)
unless ( $dataSensor[0] ne "aa"
and $dataSensor[1] ne "bb"
and $dataSensor[2] ne "cc"
and $dataSensor[3] ne "dd"
and $dataSensor[4] ne "ee"
and $dataSensor[5] ne "ff" );
if ( $dataSensor[0] eq "aa"
&& $dataSensor[1] eq "bb"
&& $dataSensor[2] eq "cc"
&& $dataSensor[3] eq "dd"
&& $dataSensor[4] eq "ee"
&& $dataSensor[5] eq "ff" );
if ( $dataSensor[1] eq "ff" ) {
$readings{'temperature'} =
@ -1056,7 +1053,7 @@ sub ThermoHygroSensHandle0x18 {
### neue Vereinheitlichung für Batteriereadings Forum #800017
$readings{'batteryPercent'} = hex( "0x" . $notification );
$readings{'batteryState'} =
( hex( "0x" . $notification ) > 15 ? "ok" : "low" );
( hex( "0x" . $notification ) > 15 ? 'ok' : 'low' );
$hash->{helper}{CallBattery} = 1;
CallBattery_Timestamp($hash);
@ -1075,9 +1072,9 @@ sub ThermoHygroSensHandle0x10 {
Log3( $name, 4, "XiaomiBTLESens ($name) - Thermo/Hygro Sens Handle0x10" );
return stateRequest($hash)
unless ( $notification =~ /^([0-9a-f]{2}(\s?))*$/ );
if ( $notification !~ /^([0-9a-f]{2}(\s?))*$/ );
my @numberOfHex = split( ' ', $notification );
my @numberOfHex = split( /\s/, $notification );
$notification =~ s/\s+//g;
@ -1089,8 +1086,8 @@ sub ThermoHygroSensHandle0x10 {
(
(
scalar(@numberOfHex) == 14
or ( scalar(@numberOfHex) == 13
and $readings{'temperature'} > 9 )
|| ( scalar(@numberOfHex) == 13
&& $readings{'temperature'} > 9 )
) ? 18 : 16
),
8
@ -1156,7 +1153,7 @@ sub ClearGrassSensHandle0x3b {
### neue Vereinheitlichung für Batteriereadings Forum #800017
$readings{'batteryPercent'} = hex( substr( $notification, 14, 2 ) );
$readings{'batteryState'} =
( hex( substr( $notification, 14, 2 ) ) > 15 ? "ok" : "low" );
( hex( substr( $notification, 14, 2 ) ) > 15 ? 'ok' : 'low' );
$hash->{helper}{CallBattery} = 1;
CallBattery_Timestamp($hash);
@ -1175,9 +1172,9 @@ sub ClearGrassSensHandle0x1e {
Log3( $name, 4, "XiaomiBTLESens ($name) - Clear Grass Sens Handle0x1e" );
return stateRequest($hash)
unless ( $notification =~ /^([0-9a-f]{2}(\s?))*$/ );
if ( $notification !~ /^([0-9a-f]{2}(\s?))*$/ );
my @numberOfHex = split( ' ', $notification );
my @numberOfHex = split( /\s/, $notification );
$notification =~ s/\s+//g;
@ -1254,7 +1251,7 @@ sub WriteReadings {
)
)
if ( AttrVal( $name, 'model', 'none' ) eq 'thermoHygroSens'
or AttrVal( $name, 'model', 'none' ) eq 'clearGrassSens' );
|| AttrVal( $name, 'model', 'none' ) eq 'clearGrassSens' );
readingsEndUpdate( $hash, 1 );