From 5ce53d7f0aa2d131848c219a8f54a735cf71b7ed Mon Sep 17 00:00:00 2001 From: jpawlowski Date: Fri, 21 Apr 2017 21:30:54 +0000 Subject: [PATCH] RESIDENTS: also send global notification after module has finished initialization git-svn-id: https://svn.fhem.de/fhem/trunk@14064 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/10_RESIDENTS.pm | 2 +- fhem/FHEM/20_GUEST.pm | 2 +- fhem/FHEM/20_ROOMMATE.pm | 2 +- fhem/FHEM/RESIDENTStk.pm | 58 ++++++++++++++++++++++++++++----------- 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/fhem/FHEM/10_RESIDENTS.pm b/fhem/FHEM/10_RESIDENTS.pm index 2f433486d..93d894397 100644 --- a/fhem/FHEM/10_RESIDENTS.pm +++ b/fhem/FHEM/10_RESIDENTS.pm @@ -18,7 +18,7 @@ sub RESIDENTS_Initialize($) { $hash->{AttrFn} = "RESIDENTStk_Attr"; $hash->{NotifyFn} = "RESIDENTStk_Notify"; - $hash->{'.READY'} = 0; + $hash->{READY} = 0; $hash->{NotifyOrderPrefix} = "45-"; $hash->{AttrList} = "disable:1,0 disabledForIntervals do_not_notify:1,0 " diff --git a/fhem/FHEM/20_GUEST.pm b/fhem/FHEM/20_GUEST.pm index 08586c317..fb3d6cf2b 100644 --- a/fhem/FHEM/20_GUEST.pm +++ b/fhem/FHEM/20_GUEST.pm @@ -19,7 +19,7 @@ sub GUEST_Initialize($) { $hash->{AttrFn} = "RESIDENTStk_Attr"; $hash->{NotifyFn} = "RESIDENTStk_Notify"; - $hash->{'.READY'} = 0; + $hash->{READY} = 0; $hash->{NotifyOrderPrefix} = "35-"; $hash->{AttrList} = "disable:1,0 disabledForIntervals do_not_notify:1,0 " diff --git a/fhem/FHEM/20_ROOMMATE.pm b/fhem/FHEM/20_ROOMMATE.pm index 1bbeba319..69c2f5302 100644 --- a/fhem/FHEM/20_ROOMMATE.pm +++ b/fhem/FHEM/20_ROOMMATE.pm @@ -19,7 +19,7 @@ sub ROOMMATE_Initialize($) { $hash->{AttrFn} = "RESIDENTStk_Attr"; $hash->{NotifyFn} = "RESIDENTStk_Notify"; - $hash->{'.READY'} = 0; + $hash->{READY} = 0; $hash->{NotifyOrderPrefix} = "40-"; $hash->{AttrList} = "disable:1,0 disabledForIntervals do_not_notify:1,0 " diff --git a/fhem/FHEM/RESIDENTStk.pm b/fhem/FHEM/RESIDENTStk.pm index 1f80f9e5f..09dad8106 100644 --- a/fhem/FHEM/RESIDENTStk.pm +++ b/fhem/FHEM/RESIDENTStk.pm @@ -54,7 +54,8 @@ sub RESIDENTStk_Define($$) { || $a[2] =~ /^[A-Za-z\d._]+(?:,[A-Za-z\d._]*)*$/ ); $modules{$TYPE}{defptr}{$name} = \$hash; - $hash->{NOTIFYDEV} = "global"; + $hash->{'.READY'} = 0; + $hash->{NOTIFYDEV} = "global"; $hash->{RESIDENTGROUPS} = $a[2] if ( defined( $a[2] ) ); # set default settings on first define @@ -114,6 +115,7 @@ sub RESIDENTStk_Undefine($$) { my ( $hash, $name ) = @_; RESIDENTStk_StopInternalTimers($hash); + return undef unless ($init_done); # update parent residents if ( defined( $hash->{RESIDENTGROUPS} ) ) { @@ -1077,20 +1079,41 @@ sub RESIDENTStk_Notify($$) { my $devType = GetType($devName); if ( $devName eq "global" ) { + delete $dev->{CHANGEDWITHSTATE}; my $events = deviceEvents( $dev, 0 ); return "" unless ($events); foreach ( @{$events} ) { + # module internal notifications + if ( $_ =~ m/^$TYPE(?:\s+(.*))?$/ ) { + + # internal init completed by all defined devices + if ( $1 && $1 eq "INITIALIZED" && !$hash->{'.READY'} ) { + $hash->{'.READY'} = 1; + DoTrigger( "global", "INITIALIZED $name", 1 ); + } + } + # init RESIDENTS, ROOMMATE or GUEST devices after boot - if ( $_ =~ + elsif ( $_ =~ m/^(INITIALIZED|REREADCFG|DEFINED|MODIFIED|RENAMED|DELETED)(?:\s+(.*))?$/ ) { - RESIDENTStk_findResidentSlaves($hash) - if ( $TYPE eq "RESIDENTS" ); - RESIDENTStk_findDummySlaves($name) - if ( $TYPE ne "RESIDENTS" && $TYPE ne "dummy" ); + next if ( $1 eq "INITIALIZED" && $2 ); + next if ( $2 && $2 eq $name ); + + if ( $1 eq "REREADCFG" ) { + next unless ( $modules{$TYPE}{READY} ); + $modules{$TYPE}{READY} = 0; + } + + if ( $TYPE eq "RESIDENTS" ) { + RESIDENTStk_findResidentSlaves($hash); + } + else { + RESIDENTStk_findDummySlaves($name); + } } # only process attribute events @@ -3454,8 +3477,8 @@ sub RESIDENTStk_StopInternalTimers($) { RESIDENTStk_RemoveInternalTimer( "DurationTimer", $hash ); } -sub RESIDENTStk_findResidentSlaves($;$) { - my ( $hash, $rgr_wakeupDevice ) = @_; +sub RESIDENTStk_findResidentSlaves($) { + my ($hash) = @_; return unless ( ref($hash) eq "HASH" && defined( $hash->{NAME} ) ); @@ -3497,8 +3520,6 @@ sub RESIDENTStk_findDummySlaves($) { my $TYPE = GetType($name); my $prefix = RESIDENTStk_GetPrefixFromType($name); - return undef unless ($init_done); - my $wakeupDevice = AttrVal( $name, $prefix . "wakeupDevice", undef ); my $presenceDevices = AttrVal( $name, $prefix . "presenceDevices", undef ); @@ -3530,14 +3551,19 @@ sub RESIDENTStk_findDummySlaves($) { } } - # finish initialization - if ( $hash->{'.READY'} ) { - DoTrigger( "global", "MODIFIED $name", 1 ); + # finish module initialization + if ( $modules{$TYPE}{READY} == 0 ) { + Log 1, "DEBUG+++ module $TYPE INITIALIZED"; + $modules{$TYPE}{READY} = 1; + DoTrigger( "global", "$TYPE INITIALIZED", 1 ); } - else { - $hash->{'.READY'} = 1; - DoTrigger( "global", "INITIALIZED $name", 1 ); + + # internal modification + elsif ( $hash->{'.READY'} ) { + Log 1, "DEBUG+++ $name CHANGED_CONFIG"; + DoTrigger( "global", "CHANGED_CONFIG $name", 1 ); } + return ""; }