From 4870eddaa9bf0df4b03a0e1ef24c7ad86a20e58b Mon Sep 17 00:00:00 2001 From: martinp876 Date: Sun, 7 Nov 2021 17:28:16 +0000 Subject: [PATCH] HMLAN:updates git-svn-id: https://svn.fhem.de/fhem/trunk@25201 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/00_HMLAN.pm | 116 +++++++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 53 deletions(-) diff --git a/fhem/FHEM/00_HMLAN.pm b/fhem/FHEM/00_HMLAN.pm index 28dc313ab..d6a4cf64d 100755 --- a/fhem/FHEM/00_HMLAN.pm +++ b/fhem/FHEM/00_HMLAN.pm @@ -5,6 +5,7 @@ package main; use strict; use warnings; +use DevIo; use Time::HiRes qw(gettimeofday time); use Digest::MD5 qw(md5); @@ -51,8 +52,8 @@ my $HMmlSlice = 12; # number of messageload slices per hour (10 = 6min) sub HMLAN_Initialize($) { my ($hash) = @_; + use DevIo; - require "$attr{global}{modpath}/FHEM/DevIo.pm"; # Provider $hash->{ReadFn} = "HMLAN_Read"; @@ -82,6 +83,8 @@ sub HMLAN_Initialize($) { "wdTimer:5,10,15,20,25 ". "logIDs:multiple,sys,all,broadcast ". $readingFnAttributes; + $hash->{NotifyOrderPrefix} = "47-"; #make sure, HMLAN_DoInit is called once prior to CUL_HM initialisation + return; } sub HMLAN_Define($$) {######################################################### my ($hash, $def) = @_; @@ -89,7 +92,7 @@ sub HMLAN_Define($$) {######################################################### if(@a != 3) { my $msg = "wrong syntax: define HMLAN ip[:port]"; - Log3 $hash, 2, $msg; + Log3 $a[0], 2, $msg; return $msg; } DevIo_CloseDev($hash); @@ -99,7 +102,7 @@ sub HMLAN_Define($$) {######################################################### $dev .= ":1000" if($dev !~ m/:/ && $dev ne "none" && $dev !~ m/\@/); if($dev eq "none") { - Log3 $hash, 1, "$name device is none, commands will be echoed only"; + Log3 $name, 1, "$name device is none, commands will be echoed only"; $attr{$name}{dummy} = 1; return undef; } @@ -118,6 +121,7 @@ sub HMLAN_Define($$) {######################################################### @{$hash->{helper}{q}{apIDs}} = \@arr; $hash->{helper}{q}{scnt} = 0; + $hash->{helper}{q}{sending} = 0; $hash->{helper}{q}{loadNo} = 0; $hash->{helper}{q}{loadLastMax} = 0; # max load in last slice my @ald = ("0") x $HMmlSlice; @@ -136,9 +140,10 @@ sub HMLAN_Define($$) {######################################################### readingsSingleUpdate($hash,"state","disconnected",1); $hash->{owner} = ""; HMLAN_Attr("delete",$name,"loadLevel"); + $hash->{Clients} = ":CUL_HM:"; - my $ret = DevIo_OpenDev($hash, 0, "HMLAN_DoInit"); - return $ret; + return DevIo_OpenDev($hash, 0, "HMLAN_DoInit") if $init_done; + return; } sub HMLAN_Undef($$) {########################################################## my ($hash, $arg) = @_; @@ -165,12 +170,13 @@ sub HMLAN_RemoveHMPair($) {#################################################### } sub HMLAN_Notify(@) {########################################################## my ($hash,$dev) = @_; - if ($dev->{NAME} eq "global" && grep (m/^INITIALIZED$/,@{$dev->{CHANGED}})){ + if ($dev->{NAME} eq "global" && grep (m/^INITIALIZED|REREADCFG$/,@{$dev->{CHANGED}})){ if ($hash->{helper}{attrPend}){ my $aVal = AttrVal($hash->{NAME},"logIDs",""); HMLAN_Attr("set",$hash->{NAME},"logIDs",$aVal) if($aVal); delete $hash->{helper}{attrPend}; } + DevIo_OpenDev($hash, 0, "HMLAN_DoInit"); HMLAN_writeAesKey($hash->{NAME}); } elsif ($dev->{NAME} eq $hash->{NAME}){ @@ -641,6 +647,7 @@ sub HMLAN_Parse($$) {########################################################## my @mFld = split(',', $rmsg); my $letter = substr($mFld[0],0,1); # get leading char + $hash->{helper}{q}{sending} = 0 if ($letter eq "R"); if ($letter =~ m/^[ER]/){#@mFld=($src, $status, $msec, $d2, $rssi, $msg) # max speed for devices is 100ms after receive - example:TC my ($mNo,$flg,$type,$src,$dst,$p) = unpack('A2A2A2A6A6A*',$mFld[5]); @@ -936,6 +943,7 @@ sub HMLAN_DoInit($) {########################################################## $hash->{helper}{q}{keepAliveRec} = 1; # ok for first time $hash->{helper}{q}{keepAliveRpt} = 0; # ok for first time + $hash->{helper}{q}{sending} = 0; my $tn = gettimeofday(); my $wdTimer = AttrVal($name,"wdTimer",25); @@ -986,11 +994,16 @@ sub HMLAN_KeepAlive($) {####################################################### my($in ) = shift; my(undef,$name) = split(':',$in); my $hash = $defs{$name}; + my $tn = gettimeofday(); + if ($hash->{helper}{q}{sending}) { #Currently sending, reschedule KeepAlive + RemoveInternalTimer( "keepAlive:".$name);# avoid duplicate timer + InternalTimer($tn+0.1,"HMLAN_KeepAlive", "keepAlive:".$name, 1); + return; + } $hash->{helper}{q}{keepAliveRec} = 0; # reset indicator return if(!$hash->{FD}); - my $tn = gettimeofday(); my $wdTimer = AttrVal($name,"wdTimer",25); my $rht = int($tn)>>15 ; if( $rht != $hash->{helper}{setTime}){# reset HMLAN watch about each 10h @@ -1156,13 +1169,15 @@ sub HMLAN_getVerbLvl ($$$$){#get verboseLevel for message 1; +__END__ + =pod =item device =item summary IO device for wireless homematic =item summary_DE IO device für funkgesteuerte Homematic Devices =begin html - +

HMLAN



- Define +

Define



- Set +

Set

- Get +

Get



- Attributes +

Attributes


- parameter +

parameter


- parameter and readings +

parameter and readings