From 95d43fceb4f0d0c3cc4b0331a7d4febcbb93beac Mon Sep 17 00:00:00 2001 From: dev0 Date: Tue, 30 May 2017 10:54:48 +0000 Subject: [PATCH] 34_ESPEasy.pm: removed trailing white spaces git-svn-id: https://svn.fhem.de/fhem/trunk@14415 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/34_ESPEasy.pm | 418 ++++++++++++++++++++-------------------- 1 file changed, 206 insertions(+), 212 deletions(-) diff --git a/fhem/FHEM/34_ESPEasy.pm b/fhem/FHEM/34_ESPEasy.pm index 09e6df60d..266cb1f4c 100644 --- a/fhem/FHEM/34_ESPEasy.pm +++ b/fhem/FHEM/34_ESPEasy.pm @@ -3,7 +3,7 @@ # # 34_ESPEasy.pm is a FHEM Perl module to control ESP8266 /w ESPEasy # -# Copyright 2017 by dev0 +# Copyright 2017 by dev0 # FHEM forum: https://forum.fhem.de/index.php?action=profile;u=7465 # # This file is part of FHEM. @@ -77,7 +77,7 @@ my %ESPEasy_setCmds = ( "reboot" => "0", "erase" => "0", "reset" => "0", - "statusrequest" => "0", + "statusrequest" => "0", "clearreadings" => "0", "help" => "1", "lights" => "1", @@ -155,8 +155,8 @@ my %ESPEasy_setBridgeCmdsUsage = ( # pin names can be used instead of gpio numbers. # ------------------------------------------------------------------------------ my %ESPEasy_pinMap = ( - "D0" => 16, - "D1" => 5, + "D0" => 16, + "D1" => 5, "D2" => 4, "D3" => 0, "D4" => 2, @@ -206,13 +206,13 @@ sub ESPEasy_Initialize($) #provider $hash->{ReadFn} = "ESPEasy_Read"; #ESP http request will be parsed here $hash->{WriteFn} = "ESPEasy_Write"; #called from logical module's IOWrite - $hash->{Clients} = ":ESPEasy:"; #used by dispatch,$hash->{TYPE} of receiver + $hash->{Clients} = ":ESPEasy:"; #used by dispatch,$hash->{TYPE} of receiver my %matchList = ( "1:ESPEasy" => ".*" ); $hash->{MatchList} = \%matchList; #consumer $hash->{ParseFn} = "ESPEasy_dispatchParse"; - $hash->{Match} = ".+"; + $hash->{Match} = ".+"; $hash->{AttrList} = "allowedIPs " ."authentication:1,0 " @@ -284,7 +284,7 @@ sub ESPEasy_Define($$) # only called when defined, not on reload. return "ERROR: fhem.pl is too old to use $type module." ." Version 11000/2016-03-05 is required at least." if (not(defined $1) || $1 < 11000); - + $hash->{PORT} = $port if defined $port; $hash->{IDENT} = $ident if defined $ident; $hash->{VERSION} = $module_version; @@ -311,7 +311,7 @@ sub ESPEasy_Define($$) # only called when defined, not on reload. $hash->{MAX_QUEUE_SIZE} = $d_maxQueueSize; ESPEasy_removeGit($hash); - } + } #--- DEVICE ------------------------------------------------- else { @@ -367,9 +367,9 @@ sub ESPEasy_Get($@) foreach my $reading (sort keys %{$hash->{READINGS}}) { $ret .= " $reading:noArg"; } - - return ($hash->{SUBTYPE} eq "bridge") - ? $ret . " user:noArg pass:noArg queueSize:noArg" + + return ($hash->{SUBTYPE} eq "bridge") + ? $ret . " user:noArg pass:noArg queueSize:noArg" : $ret . " pinMap:noArg"; } } @@ -391,7 +391,7 @@ sub ESPEasy_Set($$@) if ($hash->{SUBTYPE} eq "bridge") { # are there all required argumets? - if($ESPEasy_setBridgeCmds{$cmd} + if($ESPEasy_setBridgeCmds{$cmd} && scalar @params < $ESPEasy_setBridgeCmds{$cmd}) { Log3 $name, 2, "$type $name: Missing argument: 'set $name $cmd " .join(" ",@params)."'"; @@ -399,7 +399,7 @@ sub ESPEasy_Set($$@) ."$ESPEasy_setBridgeCmds{$cmd} parameter(s)\n" ."Usage: 'set $name $ESPEasy_setBridgeCmdsUsage{$cmd}'"; } - + # handle unknown cmds if(!exists $ESPEasy_setBridgeCmds{$cmd}) { my @cList = sort keys %ESPEasy_setBridgeCmds; @@ -440,7 +440,6 @@ sub ESPEasy_Set($$@) "parameter(s)\n"."Usage: 'set $name $ESPEasy_setCmdsUsage{$cmd}'"; } - #Lights Plugin if (defined AttrVal($name,"mapLightCmds",undef) && $cmd =~ m/^(ct|pct|rgb|on|off|toggle)$/i) { unshift @params, $cmd; @@ -470,15 +469,15 @@ sub ESPEasy_Set($$@) $clist =~ s/rgb/rgb:colorpicker,$cp/; # add colorPicker if rgb cmd is available # expand ct my $ct = "ct:colorpicker,CT," - .AttrVal($name,"ctWW_reducedRange",AttrVal($name,"colorpickerCTww",$d_colorpickerCTww)) + .AttrVal($name,"ctWW_reducedRange",AttrVal($name,"colorpickerCTww",$d_colorpickerCTww)) .",10," .AttrVal($name,"ctCW_reducedRange",AttrVal($name,"colorpickerCTcw",$d_colorpickerCTcw)); $clist =~ s/ct /$ct /; # expand pct my $pct = "pct:colorpicker,BRI,0,1,100"; $clist =~ s/pct /$pct /; - # expand help - $clist =~ s/help/help:$hlist/; + # expand help + $clist =~ s/help/help:$hlist/; Log3 $name, 2, "$type $name: Unknown set command $cmd" if $cmd ne "?"; return "Unknown argument $cmd, choose one of ". $clist; } @@ -506,7 +505,7 @@ sub ESPEasy_Set($$@) } else { Log3 $name, 2, "$type $name: $cmd ".join(" ",@params)." => unknown argument: '$params[$pp-1]'"; - return undef; + return undef; } Log3 $name, 5, "$type $name: onOff mapping ". $params[$pp-1]." => $state"; $params[$pp-1] = $state; @@ -561,7 +560,7 @@ sub ESPEasy_Read($) { } # use received IP instead of configured one (NAT/PAT could have modified) - my $peer = $hash->{PEER}; + my $peer = $hash->{PEER}; # Read 1024 byte of data my $buf; @@ -585,10 +584,10 @@ sub ESPEasy_Read($) { return; } Log3 $bname, 4, "$btype $name: Peer address accepted"; - + my @data = split( '\R\R', $buf ); my $header = ESPEasy_header2Hash($data[0]); - + # mask password in authorization header with **** my $logHeader = { %$header }; $logHeader->{Authorization} =~ s/Basic\s.*\s/Basic ***** / if defined $logHeader->{Authorization}; @@ -598,7 +597,7 @@ sub ESPEasy_Read($) { Log3 $bname, 5, "$btype $name: Received content: $data[1]" if defined $data[1]; # Check content length if defined - if (defined $header->{'Content-Length'} + if (defined $header->{'Content-Length'} && $header->{'Content-Length'} != length($data[1])) { Log3 $bname, 2, "$btype $name: Invalid content length ". "($header->{'Content-Length'} != ".length($data[1]).")"; @@ -643,7 +642,7 @@ sub ESPEasy_Read($) { # should never happen, but who knows what some JSON module versions do... $json->{data}{ESP}{name} = "" if !defined $json->{data}{ESP}{name}; $json->{data}{SENSOR}{0}{deviceName} = "" if !defined $json->{data}{SENSOR}{0}{deviceName}; - + # remove illegal chars from ESP name for further processing and assign to new var (my $espName = $json->{data}{ESP}{name}) =~ s/[^A-Za-z\d_\.]/_/g; (my $espDevName = $json->{data}{SENSOR}{0}{deviceName}) =~ s/[^A-Za-z\d_\.]/_/g; @@ -670,7 +669,7 @@ sub ESPEasy_Read($) { # push sensor value in @values foreach my $vKey (keys %{$json->{data}{SENSOR}}) { - if(ref $json->{data}{SENSOR}{$vKey} eq ref {} + if(ref $json->{data}{SENSOR}{$vKey} eq ref {} && exists $json->{data}{SENSOR}{$vKey}{value}) { # remove illegal chars $json->{data}{SENSOR}{$vKey}{valueName} =~ s/[^A-Za-z\d_\.\-\/]/_/g; @@ -687,7 +686,7 @@ sub ESPEasy_Read($) { } } - ESPEasy_dispatch($hash,$ident,$peer,@values); + ESPEasy_dispatch($hash,$ident,$peer,@values); } #$data[1] =~ m/"module":"ESPEasy"/ @@ -697,7 +696,7 @@ sub ESPEasy_Read($) { Log3 $bname, 2, "$btype $name: WARNING: ESPEasy version R" .$minEEBuild." or later required."; } - + # session will not be close immediately if ESP goes to sleep after http send # needs further investigation? if ($hash->{TEMPORARY} && $json->{data}{ESP}{sleep}) { @@ -762,7 +761,7 @@ sub ESPEasy_Notify($$) elsif (defined $4 && $4 eq "0") { $hash->{INTERVAL} = "disabled"; ESPEasy_resetTimer($hash,"stop"); - CommandDeleteReading(undef, "$name presence") + CommandDeleteReading(undef, "$name presence") if defined $hash->{READINGS}{presence}; } else { # Interval > 0 @@ -779,9 +778,9 @@ sub ESPEasy_Notify($$) CommandSetReading(undef,"$name state opened"); } } - + else { - #Log 5, "$type $name: Attribute $3 not handeled by NotifyFn "; + #Log 5, "$type $name: Attribute $3 not handeled by NotifyFn "; } } #main if @@ -789,29 +788,29 @@ sub ESPEasy_Notify($$) #Log 5, "$type $name: WARNING: unexpected event received by NotifyFn: $_"; } } - + return undef; } # ------------------------------------------------------------------------------ sub ESPEasy_Rename() { - my ($new,$old) = @_; + my ($new,$old) = @_; my $i = 0; - my $type = $defs{"$new"}->{TYPE}; - my $name = $defs{"$new"}->{NAME}; - my $subtype = $defs{"$new"}->{SUBTYPE}; + my $type = $defs{"$new"}->{TYPE}; + my $name = $defs{"$new"}->{NAME}; + my $subtype = $defs{"$new"}->{SUBTYPE}; my @am; # copy values from old to new device - setKeyValue($type."_".$new."-user",getKeyValue($type."_".$old."-user")); - setKeyValue($type."_".$new."-pass",getKeyValue($type."_".$old."-pass")); - setKeyValue($type."_".$new."-firstrun",getKeyValue($type."_".$old."-firstrun")); + setKeyValue($type."_".$new."-user",getKeyValue($type."_".$old."-user")); + setKeyValue($type."_".$new."-pass",getKeyValue($type."_".$old."-pass")); + setKeyValue($type."_".$new."-firstrun",getKeyValue($type."_".$old."-firstrun")); # delete old entries - setKeyValue($type."_".$old."-user",undef); - setKeyValue($type."_".$old."-pass",undef); - setKeyValue($type."_".$old."-firstrun",undef); + setKeyValue($type."_".$old."-user",undef); + setKeyValue($type."_".$old."-pass",undef); + setKeyValue($type."_".$old."-firstrun",undef); # replace IDENT in devices if bridge name changed if ($subtype eq "bridge") { @@ -845,7 +844,7 @@ sub ESPEasy_Rename() { ."Don't forget to save chages."; } - return undef; + return undef; } @@ -861,16 +860,16 @@ sub ESPEasy_Attr(@) Log3 $name, 2, "$type $name: attr $name $aName '': value must not be empty"; return "$name: attr $aName: value must not be empty"; } - + # device attributes - if (defined $hash->{SUBTYPE} && $hash->{SUBTYPE} eq "bridge" + if (defined $hash->{SUBTYPE} && $hash->{SUBTYPE} eq "bridge" && ($aName =~ m/^(Interval|pollGPIOs|IODev|setState|readingSwitchText)$/ || $aName =~ m/^(readingPrefixGPIO|readingSuffixGPIOState|adjustValue)$/ || $aName =~ m/^(displayTextEncode|displayTextWidth)$/ || $aName =~ m/^(presenceCheck|parseCmdResponse|rgbGPIOs|colorpicker)$/ || $aName =~ m/^(wwcwGPIOs|colorpickerCTww|colorpickerCTcw|mapLightCmds)$/)) { Log3 $name, 2, "$type $name: Attribut '$aName' can not be used by bridge"; - return "$type: attribut '$aName' cannot be used by bridge device"; + return "$type: attribut '$aName' cannot be used by bridge device"; } # bridge attributes elsif (defined $hash->{SUBTYPE} && $hash->{SUBTYPE} eq "device" @@ -888,41 +887,41 @@ sub ESPEasy_Attr(@) $ret = "0,1" if ($cmd eq "set" && not $aVal =~ m/^(0|1)$/)} elsif ($aName eq "combineDevices") { - $ret = "0 | 1 | ESPname | ip[/netmask][,ip[/netmask]][,...]" + $ret = "0 | 1 | ESPname | ip[/netmask][,ip[/netmask]][,...]" if $cmd eq "set" && !(ESPEasy_isAttrCombineDevices($aVal) || $aVal =~ m/^[01]$/ )} - + elsif ($aName =~ m/^(allowedIPs|deniedIPs)$/) { - $ret = "ip[/netmask][,ip[/netmask]][,...]" + $ret = "ip[/netmask][,ip[/netmask]][,...]" if $cmd eq "set" && !ESPEasy_isIPv64Range($aVal)} - + elsif ($aName =~ m/^(pollGPIOs|rgbGPIOs|wwcwGPIOs)$/) { $ret = "GPIO_No[,GPIO_No][...]" if $cmd eq "set" && $aVal !~ m/^[a-zA-Z]{0,2}[0-9]+(,[a-zA-Z]{0,2}[0-9]+)*$/} elsif ($aName eq "colorpicker") { - $ret = "RGB | HSV | HSVp" + $ret = "RGB | HSV | HSVp" if ($cmd eq "set" && not $aVal =~ m/^(RGB|HSV|HSVp)$/)} elsif ($aName =~ m/^(colorpickerCTww|colorpickerCTcw)$/) { $ret = "1000..10000" if $cmd eq "set" && ($aVal < 1000 || $aVal > 10000)} - + elsif ($aName eq "parseCmdResponse") { my $cmds = lc join("|",keys %ESPEasy_setCmdsUsage); - $ret = "cmd[,cmd][...]" + $ret = "cmd[,cmd][...]" if $cmd eq "set" && lc($aVal) !~ m/^($cmds){1}(,($cmds))*$/} elsif ($aName eq "mapLightCmds") { my $cmds = lc join("|",keys %ESPEasy_setCmdsUsage); - $ret = "ESPEasy cmd" + $ret = "ESPEasy cmd" if $cmd eq "set" && lc($aVal) !~ m/^($cmds){1}(,($cmds))*$/} elsif ($aName eq "setState") { - $ret = "integer" + $ret = "integer" if ($cmd eq "set" && not $aVal =~ m/^(\d+)$/)} elsif ($aName eq "displayTextWidth") { - $ret = "number of charaters per line" + $ret = "number of charaters per line" if ($cmd eq "set" && not $aVal =~ m/^(\d+)$/)} elsif ($aName eq "readingPrefixGPIO") { @@ -943,14 +942,14 @@ sub ESPEasy_Attr(@) : ($hash->{MAX_HTTP_SESSIONS} = $aVal); if ($cmd eq "del") {$hash->{MAX_HTTP_SESSIONS} = $d_maxHttpSessions} } - + elsif ($aName eq "maxQueueSize") { ($cmd eq "set" && ($aVal !~ m/^[1-9][0-9]+$/)) ? ($ret = ">=10 (default: $d_maxQueueSize)") : ($hash->{MAX_QUEUE_SIZE} = $aVal); if ($cmd eq "del") {$hash->{MAX_QUEUE_SIZE} = $d_maxQueueSize} } - + elsif ($aName eq "Interval") { ($cmd eq "set" && ($aVal !~ m/^(\d)+$/ || $aVal <10 && $aVal !=0)) ? ($ret = "0 or >=10") @@ -984,14 +983,14 @@ sub ESPEasy_Undef($$) my $bhash = $modules{ESPEasy}{defptr}{BRIDGE}; Log3 $bhash->{NAME}, 4, "$type $name: Closing tcp session."; TcpServer_Close($hash); - return undef + return undef }; HttpUtils_Close($hash); RemoveInternalTimer($hash); - + if($hash->{SUBTYPE} && $hash->{SUBTYPE} eq "bridge") { - delete $modules{ESPEasy}{defptr}{BRIDGE} + delete $modules{ESPEasy}{defptr}{BRIDGE} if(defined($modules{ESPEasy}{defptr}{BRIDGE})); TcpServer_Close( $hash ); Log3 $name, 2, "$type $name: Socket on port tcp/$port closed"; @@ -999,7 +998,7 @@ sub ESPEasy_Undef($$) else { IOWrite($hash, $hash->{HOST}, undef, undef, undef, "cleanup", undef ); } - + return undef; } @@ -1037,7 +1036,7 @@ sub ESPEasy_dispatch($$$@) #called by bridge -> send to logical devices { my($hash,$ident,$host,@values) = @_; my $name = $hash->{NAME}; - return if (IsDisabled $name); + return if (IsDisabled $name); my $type = $hash->{TYPE}; my $bhash = $modules{ESPEasy}{defptr}{BRIDGE}; @@ -1056,7 +1055,7 @@ sub ESPEasy_dispatch($$$@) #called by bridge -> send to logical devices # ------------------------------------------------------------------------------ -sub ESPEasy_dispatchParse($$$) # called by logical device (defined by +sub ESPEasy_dispatchParse($$$) # called by logical device (defined by { # $hash->{ParseFn}) # we are called from dispatch() from the ESPEasy bridge device # we never come here if $msg does not match $hash->{MATCH} in the first place @@ -1071,7 +1070,7 @@ sub ESPEasy_dispatchParse($$$) # called by logical device (defined by my $name; my @v = split("\\|\\|\\|",$v); - + # look in each $defs{$d}{IDENT} for $ident to get device name. foreach my $d (keys %defs) { next if($defs{$d}{TYPE} ne "ESPEasy"); @@ -1085,7 +1084,7 @@ sub ESPEasy_dispatchParse($$$) # called by logical device (defined by if (!($name) && $ac eq "1") { $name = ESPEasy_autocreate($IOhash,$ident,$ip,$as); # cleanup helper - delete $IOhash->{helper}{autocreate}{$ident} + delete $IOhash->{helper}{autocreate}{$ident} if defined $IOhash->{helper}{autocreate}{$ident}; delete $IOhash->{helper}{autocreate} if scalar keys %{$IOhash->{helper}{autocreate}} == 0; @@ -1097,7 +1096,7 @@ sub ESPEasy_dispatchParse($$$) # called by logical device (defined by $IOhash->{helper}{autocreate}{$ident} = "disabled"; return $ident; } - + return $name if (IsDisabled $name); my $hash = $defs{$name}; @@ -1113,14 +1112,14 @@ sub ESPEasy_dispatchParse($$$) # called by logical device (defined by $reading =~ s/^GPIO/$replace/ee; # --- setReading ---------------------------------------------- - if ($cmd eq "r") { + if ($cmd eq "r") { # reading suffix replacement only for setreading $replace = '"'.AttrVal($name,"readingSuffixGPIOState","").'"'; $reading =~ s/_state$/$replace/ee; # map value to on/off if device is a switch - $value = ($value eq "1") ? "on" : "off" - if ($vType == 10 && AttrVal($name,"readingSwitchText",1) && !AttrVal($name,"rgbGPIOs",0) + $value = ($value eq "1") ? "on" : "off" + if ($vType == 10 && AttrVal($name,"readingSwitchText",1) && !AttrVal($name,"rgbGPIOs",0) && $value =~ /^(0|1)$/); # delete ignored reading and helper @@ -1145,10 +1144,10 @@ sub ESPEasy_dispatchParse($$$) # called by logical device (defined by $reading = ".ignored_$reading"; $value = $orgVal; } - + readingsSingleUpdate($hash, $reading, $value, 1); my $adj = ($orgVal ne $value) ? " [adjusted]" : ""; - Log3 $name, 4, "$type $name: $reading: $value".$adj + Log3 $name, 4, "$type $name: $reading: $value".$adj if defined $value && $reading !~ m/^\./; #no leading dot # used for presence detection @@ -1198,7 +1197,7 @@ sub ESPEasy_dispatchParse($$$) # called by logical device (defined by CommandDeleteReading(undef, "$name $reading"); Log3 $name, 4, "$type $name: Reading $reading deleted"; } - + else { Log3 $name, 2, "$type $name: Unknown command received via dispatch"; } @@ -1215,7 +1214,7 @@ sub ESPEasy_dispatchParse($$$) # called by logical device (defined by else { #autocreate failed Log3 undef, 2, "ESPEasy: Device $name not defined"; } - + return $name; # must be != undef. else msg will processed further -> help me! } @@ -1242,7 +1241,7 @@ sub ESPEasy_autocreate($$$$) if (AttrVal($IOname,"autosave",AttrVal("global","autosave",1))) { CommandSave(undef,undef); Log3 undef, 2, "$IOtype $IOname: Structural changes saved."; - } + } else { Log3 undef, 2, "$IOtype $IOname: Autosave is disabled: " ."Do not forget to save changes."; @@ -1251,7 +1250,7 @@ sub ESPEasy_autocreate($$$$) else { Log3 undef, 1, "$IOtype $IOname: WARNING: an error occurred " ."while creating device for $ident: $cmdret"; - } + } return $devname; } @@ -1283,7 +1282,7 @@ sub ESPEasy_httpReq($$$$$$@) my $path = ($cmd =~ m/(reboot|reset|erase)/i) ? "/?cmd=" : "/control?cmd="; my $url = "http://".$host.":".$port.$path.$cmd.$plist; - + # there is already a log entry with verbose 3 from device Log3 $name, 4, "$type $name: Send $cmd$plist to $host for ident $ident" if ($cmd !~ m/^(status)/); @@ -1318,7 +1317,7 @@ sub ESPEasy_httpReqParse($$$) my $hash = $param->{hash}; my ($name,$type) = ($hash->{NAME},$hash->{TYPE}); my @values; - + # command queue $hash->{helper}{sessions}{$param->{host}}--; @@ -1334,7 +1333,7 @@ sub ESPEasy_httpReqParse($$$) ."'$param->{cmd} $param->{plist}' "; # unshift command back to queue (resend) - if (AttrVal($name,"resendFailedCmd",$d_resendFailedCmd) + if (AttrVal($name,"resendFailedCmd",$d_resendFailedCmd) && $hash->{MAX_HTTP_SESSIONS}) { my @p = ($param->{hash}, $param->{host}, $param->{port}, $param->{ident}, $param->{parseCmd}, $param->{cmd}, $param->{plist}); @@ -1383,8 +1382,7 @@ sub ESPEasy_httpReqParse($$$) # 10 = SENSOR_TYPE_SWITCH my $vType = (defined $res->{plugin} && $res->{plugin} eq "1") ? "10" : "0"; if (defined $res->{plugin} && $res->{plugin} eq "123") { - # Lights plugin -# Log 1, Dumper $res; + # Lights plugin (eq 123) foreach (keys %{ $res }) { push @values, "r||$_||".$res->{$_}."||".$vType if $res->{$_} ne "" && $_ ne "plugin"; @@ -1408,9 +1406,9 @@ sub ESPEasy_httpReqParse($$$) push @values, "r||GPIO".$1."_state||".$data."||0"; } } - } - } # ($data ne "") - + } + } # ($data ne "") + ESPEasy_dispatch($hash,$param->{ident},$param->{host},@values); ESPEasy_httpReqDequeue($hash, $param->{host}); return undef; @@ -1429,13 +1427,13 @@ sub ESPEasy_httpReqQueue(@) # do queueing if max sessions are already in use if ($hash->{helper}{sessions}{$host} >= $hash->{MAX_HTTP_SESSIONS} ) { # max queue size reached - if (!defined $hash->{helper}{queue}{"$host"} + if (!defined $hash->{helper}{queue}{"$host"} || scalar @{$hash->{helper}{queue}{"$host"}} < $hash->{MAX_QUEUE_SIZE}) { push(@{$hash->{helper}{queue}{"$host"}}, \@_); # logqueue Log3 $name, 5, "$type $name: Queuing: $host $ident '$cmd ".join(",",@params)."' (". scalar @{$hash->{helper}{queue}{"$host"}} .")"; return 1; - } + } else { # logqueue Log3 $name, 2, "$type $name: set $cmd ".join(",",@params)." (skipped " @@ -1528,16 +1526,15 @@ sub ESPEasy_resetTimer($;$) $sig = "" if !$sig; if ($init_done == 1) { - #Log3 $name, 5, "$type $name: RemoveInternalTimer ESPEasy_statusRequest"; RemoveInternalTimer($hash, "ESPEasy_statusRequest"); } - + if ($sig eq "stop") { Log3 $name, 5, "$type $name: internalTimer stopped"; return undef; } return undef if AttrVal($name,"Interval",$d_Interval) == 0; - + unless(IsDisabled($name)) { my $s = AttrVal($name,"Interval",$d_Interval) + rand(5); my $ts = $s + gettimeofday(); @@ -1559,7 +1556,7 @@ sub ESPEasy_tcpServerOpen($) { my $ret = TcpServer_Open( $hash, $port, "global" ); exit(1) if ($ret && !$init_done); readingsSingleUpdate ( $hash, "state", "initialized", 1 ); - + return $ret; } @@ -1575,8 +1572,8 @@ sub ESPEasy_header2Hash($) { $value =~ s/^ //; $header{$key} = $value; - } - + } + return \%header; } @@ -1647,10 +1644,10 @@ sub ESPEasy_isParseCmd($$) #called by device sub ESPEasy_sendHttpClose($$$) { my ($hash,$code,$response) = @_; my ($name,$type,$con) = ($hash->{NAME},$hash->{TYPE},$hash->{CD}); - + my $bhash = $modules{ESPEasy}{defptr}{BRIDGE}; my $bname = $bhash->{NAME}; - + print $con "HTTP/1.1 ".$code."\r\n", "Content-Type: text/plain\r\n", "Connection: close\r\n", @@ -1676,14 +1673,14 @@ sub ESPEasy_paramPos($$) } $i++; } - + return $pos; # return 0 if no match, else position } # ------------------------------------------------------------------------------ -sub ESPEasy_paramCount($) -{ +sub ESPEasy_paramCount($) +{ return () = $_[0] =~ m/\s/g # count \s in a string } @@ -1698,7 +1695,7 @@ sub ESPEasy_clearReadings($) my @dr; foreach (keys %{$hash->{READINGS}}) { # next if $_ =~ m/^(presence)$/; - CommandDeleteReading(undef, "$name $_"); + CommandDeleteReading(undef, "$name $_"); # fhem("deletereading $name $_"); push(@dr,$_); } @@ -1728,7 +1725,7 @@ sub ESPEasy_checkVersion($$$$) ."'FHEM HTTP' is too old [$dev: R".$ve." J".$vj."]. ". "Use ESPEasy R$minEEBuild at least."; return 1; - } + } else{ delete $hash->{$ov} if exists $hash->{$ov}; return 0; @@ -1819,7 +1816,7 @@ sub ESPEasy_setRGB($$@) my ($type,$name) = ($hash->{TYPE},$hash->{NAME}); my ($rg,$gg,$bg) = split(",",AttrVal($name,"rgbGPIOs","")); my ($r,$g,$b); - + my $rgb = $p[0] if $cmd =~ m/^rgb$/i; # return undef if !defined $rgb; @@ -1829,10 +1826,10 @@ sub ESPEasy_setRGB($$@) if ($cmd =~ m/^(1|on)$/ || ($cmd =~ m/^rgb$/i && $rgb =~ m/^(1|on)$/)) { $rgb = "FFFFFF" } - elsif ($cmd =~ m/^(0|off)$/ || ($cmd =~ m/^rgb$/i && $rgb =~ m/^(0|off)$/)) { + elsif ($cmd =~ m/^(0|off)$/ || ($cmd =~ m/^rgb$/i && $rgb =~ m/^(0|off)$/)) { $rgb = "000000" } - elsif ($cmd =~ m/^toggle$/i || ($cmd =~ m/^rgb$/i && $rgb =~ m/^toggle$/i)) { - $rgb = ReadingsVal($name,"rgb","000000") ne "000000" ? "000000" : "FFFFFF" + elsif ($cmd =~ m/^toggle$/i || ($cmd =~ m/^rgb$/i && $rgb =~ m/^toggle$/i)) { + $rgb = ReadingsVal($name,"rgb","000000") ne "000000" ? "000000" : "FFFFFF" } if ($rgb =~ m/^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/) { @@ -1869,7 +1866,7 @@ sub ESPEasy_setCT($$@) $gcw = $ESPEasy_pinMap{uc $gcw} if defined $ESPEasy_pinMap{uc $gcw}; readingsSingleUpdate($hash, $cmd, $p[0], 1); - + if ($cmd eq "ct") { $ct = $p[0]; $pct = ReadingsVal($name,"pct",50); @@ -1889,11 +1886,9 @@ sub ESPEasy_setCT($$@) my $wwcwMaxBri = AttrVal($name,"wwcwMaxBri",0); my ($fww,$fcw) = ESPEasy_ct2wwcw($ct, $ctWW, $ctCW, $wwcwMaxBri, $ctWW_lim, $ctCW_lim); - #my ($fww,$fcw) = ESPEasy_ct2wwcw($ct, $ctWW, $ctCW); ESPEasy_Set($hash, $name, "pwm", ($gww, int $pct*10.23*$fww)); ESPEasy_Set($hash, $name, "pwm", ($gcw, int $pct*10.23*$fcw)); - return undef; } @@ -1911,7 +1906,7 @@ sub ESPEasy_ct2wwcw($$$;$$$) $tcw -= $tww; $t -= $tww; - my $fcw = $t / $tcw; + my $fcw = $t / $tcw; my $fww = 1 - $fcw; if ($maxBri // $maxBri) { @@ -1925,7 +1920,7 @@ sub ESPEasy_ct2wwcw($$$;$$$) $tww_ur -= $tww; $tcw_ur -= $tww; my $t = ($tww_ur < $tcw - $tcw_ur) ? $tww_ur : $tcw - $tcw_ur; - my $fcw = $t / $tcw; + my $fcw = $t / $tcw; my $fww = 1 - $fcw; $maxBriFactor = ($fcw > $fww) ? 1/$fcw : 1/$fww; #Log 1, "maxBriFactor: $maxBriFactor (constBri)"; @@ -2024,10 +2019,10 @@ sub ESPEasy_adjustValue($$$) my ($hash,$r,$v) = @_; my $name = $hash->{NAME}; my $type = $hash->{TYPE}; - + my $a = AttrVal($name,"adjustValue",undef); return $v if !defined $a; - + my ($VALUE,$READING,$NAME) = ($v,$r,$name); #capital vars for use in attribute my @a = split(" ",$a); foreach (@a) { @@ -2049,7 +2044,7 @@ sub ESPEasy_adjustValue($$$) #last; #disabled to be able to match multiple readings } } - + return $v; } @@ -2067,15 +2062,14 @@ sub ESPEasy_urlEncodeDisplayText($$@) my $c = scalar @params; # leading parameters - for (my $i=0; $i<$pp-1; $i++) { - push( @p, $params[$i] ) + for (my $i=0; $i<$pp-1; $i++) { + push( @p, $params[$i] ) } # collect all texts parameters - for (my $i=$pp-1; $i<$c; $i++) { - $params[$i] =~ s/,/./g; # comma is http url parameter splitter - #$params[$i] =~ s/[\x00-\x1F\x7F-\xFF]//g; # remove non-printable chrs - push( @t, $params[$i] ) + for (my $i=$pp-1; $i<$c; $i++) { + $params[$i] =~ s/,/./g; # comma is http url parameter splitter + push @t, $params[$i]; } my $text = join(" ", @t); @@ -2086,7 +2080,7 @@ sub ESPEasy_urlEncodeDisplayText($$@) $text = substr($text, 0, $width); $p[1] = 1; } - + push(@p, urlEncode($text)); return @p; } @@ -2108,27 +2102,27 @@ sub ESPEasy_loadRequiredModules($) $hash->{helper}{pm}{$_} = 0; if ($init_done || $hash->{SUBTYPE} eq "bridge") { my ($name,$type) = ($hash->{NAME},$hash->{TYPE}); - Log3 $name, 1, "$type $name: WARNING: Perl module $_ is not installed. " - . "Reduced functionality!"; + Log3 $name, 1, "$type $name: WARNING: Perl module $_ is not installed. " + . "Reduced functionality!"; Log3 $name, 2, "$type $name: $@" if $init_done; } } } - + return undef; } # ------------------------------------------------------------------------------ -sub ESPEasy_isAttrCombineDevices($) +sub ESPEasy_isAttrCombineDevices($) { return 0 if !defined $_[0]; my @ranges = split(/,| /,$_[0]); foreach (@ranges) { if (!($_ =~ m/^([A-Za-z0-9_\.]|[A-Za-z0-9_\.][A-Za-z0-9_\.]*[A-Za-z0-9\._])$/ - || ESPEasy_isIPv64Range($_))) + || ESPEasy_isIPv64Range($_))) { - return 0 + return 0 } } @@ -2144,7 +2138,7 @@ sub ESPEasy_isCombineDevices($$$) { my ($peer,$espName,$allowed) = @_; return $allowed if $allowed =~ m/^[01]$/; - + my @allowed = split(/,| /,$allowed); foreach (@allowed) { return 1 if $espName eq $_ } return 1 if ESPEasy_isPeerAllowed($peer,$allowed); @@ -2161,7 +2155,7 @@ sub ESPEasy_isValidPeer($) return 0 if !defined $addr; my @ranges = split(/,| /,$addr); foreach (@ranges) { - return 0 if !( ESPEasy_isIPv64Range($_) + return 0 if !( ESPEasy_isIPv64Range($_) || ESPEasy_isFqdn($_) || ESPEasy_isHostname($_) ); } @@ -2170,8 +2164,8 @@ sub ESPEasy_isValidPeer($) # ------------------------------------------------------------------------------ -# check if given ip or ip range is guilty -# argument can be: +# check if given ip or ip range is guilty +# argument can be: # - ipv4, ipv4/CIDR, ipv4/dotted, ipv6, ipv6/CIDR # - space or comma separated list of above. # ------------------------------------------------------------------------------ @@ -2183,7 +2177,7 @@ sub ESPEasy_isIPv64Range($) foreach (@ranges) { my ($ip,$nm) = split("/",$_); if (ESPEasy_isIPv4($ip)) { - return 0 if defined $nm && !( ESPEasy_isNmDotted($nm) + return 0 if defined $nm && !( ESPEasy_isNmDotted($nm) || ESPEasy_isNmCIDRv4($nm) ); } elsif (ESPEasy_isIPv6($ip)) { @@ -2247,7 +2241,7 @@ sub ESPEasy_ip2bin($) my $bin = join('', @bin); my $binMask = substr($bin, 0, $mask); - + return $binMask; # return network part of $bin } @@ -2276,8 +2270,8 @@ sub ESPEasy_addrToCIDR($) # no nm specified return (ESPEasy_isIPv4($ip) ? ("$ip/32",$ip,32) : ("$ip/128",$ip,128)) if !defined $mask; # netmask is already in CIDR format and all values are valid - return ("$ip/$mask",$ip,$mask) - if (ESPEasy_isIPv4($ip) && ESPEasy_isNmCIDRv4($mask)) + return ("$ip/$mask",$ip,$mask) + if (ESPEasy_isIPv4($ip) && ESPEasy_isNmCIDRv4($mask)) || (ESPEasy_isIPv6($ip) && ESPEasy_isNmCIDRv6($mask)); $mask = ESPEasy_dottedNmToCIDR($mask); return (undef,undef,undef) if !defined $mask; @@ -2290,7 +2284,7 @@ sub ESPEasy_addrToCIDR($) # convert dotted decimal netmask to CIDR format # return undef if nm is not in dotted decimal format # ------------------------------------------------------------------------------ -sub ESPEasy_dottedNmToCIDR($) +sub ESPEasy_dottedNmToCIDR($) { my ($mask) = @_; return undef if !ESPEasy_isNmDotted($mask); @@ -2306,10 +2300,10 @@ sub ESPEasy_dottedNmToCIDR($) # ------------------------------------------------------------------------------ -sub ESPEasy_isIPv4($) +sub ESPEasy_isIPv4($) { return 0 if !defined $_[0]; - return 1 if($_[0] + return 1 if($_[0] =~ m/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/); return 0; } @@ -2318,7 +2312,7 @@ sub ESPEasy_isIPv4($) sub ESPEasy_isIPv6($) { return 0 if !defined $_[0]; - return 1 if ($_[0] + return 1 if ($_[0] =~ m/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/); return 0; } @@ -2330,12 +2324,12 @@ sub ESPEasy_isIPv64($) return 1 if ESPEasy_isIPv4($_[0]) || ESPEasy_isIPv6($_[0]); return 0; } - + # ------------------------------------------------------------------------------ sub ESPEasy_isNmDotted($) { return 0 if !defined $_[0]; - return 1 if ($_[0] + return 1 if ($_[0] =~ m/^(255|254|252|248|240|224|192|128|0)\.0\.0\.0|255\.(255|254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(255|254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(255|254|252|248|240|224|192|128|0)$/); return 0; } @@ -2360,7 +2354,7 @@ sub ESPEasy_isNmCIDRv6($) sub ESPEasy_isFqdn($) { return 0 if !defined $_[0]; - return 1 if ($_[0] + return 1 if ($_[0] =~ m/^(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?); close(FH); - + if ($ret =~ m/controls_ESPEasy.txt/) { my ($name,$type) = ($hash->{NAME},$hash->{TYPE}); Log3 $name, 1, ""; @@ -2447,7 +2441,7 @@ sub ESPEasy_removeGit($)
  • perl module JSON
    Use "cpan install JSON" or operating system's package manager to install - Perl JSON Modul. Depending on your os the required package is named: + Perl JSON Modul. Depending on your os the required package is named: libjson-perl or perl-JSON.
  • @@ -2456,7 +2450,7 @@ sub ESPEasy_removeGit($) Define (bridge)

    - +