From eaebc6567a4bf1c77ecb8ad009a22ca860b75620 Mon Sep 17 00:00:00 2001 From: Risiko <> Date: Sat, 5 Jan 2019 13:21:41 +0000 Subject: [PATCH] 98_weekprofile: delay between sending profile data to the same type of device. Attr send_delay git-svn-id: https://svn.fhem.de/fhem/trunk@18143 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 2 ++ fhem/FHEM/98_weekprofile.pm | 58 +++++++++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 9deae20dd..4dc5633d5 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: 98_weekprofile: delay between sending profile data to the + same type of device. Attr send_delay - bugfix: 88_HMCCU: Bug fixes - change: 10_MYSENSORS_DEVICE: make OTA feature available, change battery name convention, diff --git a/fhem/FHEM/98_weekprofile.pm b/fhem/FHEM/98_weekprofile.pm index 3bc493ac6..9d5b035f8 100644 --- a/fhem/FHEM/98_weekprofile.pm +++ b/fhem/FHEM/98_weekprofile.pm @@ -13,7 +13,7 @@ use warnings; use JSON; #libjson-perl use Data::Dumper; - +use Time::HiRes qw(gettimeofday); use Storable qw(dclone); use vars qw(%defs); @@ -24,6 +24,8 @@ use vars qw($init_done); my @shortDays = ("Mon","Tue","Wed","Thu","Fri","Sat","Sun"); +my %LAST_SEND; + my @DEVLIST_SEND = ("MAX","CUL_HM","HMCCUDEV","weekprofile","dummy"); my $CONFIG_VERSION = "1.1"; @@ -402,10 +404,44 @@ sub weekprofile_sendDevProfile(@) } my $ret = undef; if ($cmd) { - $cmd =~ s/^\s+|\s+$//g; - Log3 $me, 4, "$me(sendDevProfile): $cmd"; - $ret = fhem($cmd,1); - DoTrigger($me,"PROFILE_TRANSFERED $device",1); + $cmd =~ s/^\s+|\s+$//g; + + #transfer profil data delayed e.q. to avoid messages like "queue is full, dropping packet" by HM devices + my $snd_delay = AttrVal($me,"send_delay",0); + if ($snd_delay>0) { + + my $datetimenow = gettimeofday(); + + my $last_profile_send = $LAST_SEND{$type}; + if (!($last_profile_send)) { + $last_profile_send = $datetimenow - $snd_delay; + } else { + my $last_profile_send_fmt = FmtDateTime($last_profile_send); + Log3 $me, 4, "$me(sendDevProfile): last profile to device type $type wars or will be at ($last_profile_send_fmt)"; + } + + if ($last_profile_send <= $datetimenow - $snd_delay) { + $last_profile_send = $datetimenow - $snd_delay; + } + + $last_profile_send = $last_profile_send + $snd_delay; + + my $last_profile_send_fmt = FmtDateTime($last_profile_send); + my $sleepTime = $last_profile_send - $datetimenow; + + Log3 $me, 4, "$me(sendDevProfile): profile data to $device ($type) will be sent $sleepTime seconds delayed at ($last_profile_send_fmt)"; + + $LAST_SEND{$type} = $last_profile_send; + + $cmd=$cmd.";trigger $me PROFILE_TRANSFERED $device"; + Log3 $me, 4, "$me(sendDevProfile): sleep $sleepTime; $cmd"; + $ret = fhem("sleep $sleepTime; $cmd",1); + } + else { + Log3 $me, 4, "$me(sendDevProfile): $cmd"; + $ret = fhem($cmd,1); + DoTrigger($me,"PROFILE_TRANSFERED $device",1); + } } return $ret; } @@ -531,7 +567,8 @@ sub weekprofile_Initialize($) $hash->{StateFn} = "weekprofile_State"; $hash->{NotifyFn} = "weekprofile_Notify"; $hash->{AttrFn} = "weekprofile_Attr"; - $hash->{AttrList} = "useTopics:0,1 widgetTranslations widgetWeekdays widgetEditOnNewPage:0,1 widgetEditDaysInRow:1,2,3,4,5,6,7 tempON tempOFF configFile ".$readingFnAttributes; + $hash->{AttrList} = "useTopics:0,1 widgetTranslations widgetWeekdays widgetEditOnNewPage:0,1 widgetEditDaysInRow:1,2,3,4,5,6,7 \ + send_delay tempON tempOFF configFile ".$readingFnAttributes; $hash->{FW_summaryFn} = "weekprofile_SummaryFn"; @@ -562,6 +599,7 @@ sub weekprofile_Define($$) my @profiles = (); my @sendDevList = (); my @topics = (); + $hash->{PROFILES} = \@profiles; $hash->{SNDDEVLIST} = \@sendDevList; @@ -1498,6 +1536,10 @@ sub weekprofile_getEditLNK_MasterDev($$)
  • tempOFF
    Temperature for 'off'. e.g. 4
  • +
  • send_delay
    + Delay in seconds between sending profile data the same type of device. + This is usefull to avoid messages like "queue is full, dropping packet" by HM devices +
  • @@ -1657,6 +1699,10 @@ sub weekprofile_getEditLNK_MasterDev($$)
  • tempOFF
    Temperature für 'off'. z.B. 4
  • +
  • send_delay
    + Verzögerungszweit in Sekunden zwischen dem Senden von Profildaten an ein Thermostat gleichen Typs. + Hilfreich zur Vermeidung von Meldungen wie "queue is full, dropping packet". +