From 38dafd4f9347324841a19f19e5e50e9313d3df07 Mon Sep 17 00:00:00 2001 From: jpawlowski Date: Sat, 1 Apr 2017 16:17:46 +0000 Subject: [PATCH] 10_RESIDENTS,20_ROOMMATE,20_GUEST: prevent "has no TYPE" messages git-svn-id: https://svn.fhem.de/fhem/trunk@13870 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/10_RESIDENTS.pm | 31 ++++++++++++++----------------- fhem/FHEM/20_GUEST.pm | 29 +++++++++++------------------ fhem/FHEM/20_ROOMMATE.pm | 29 +++++++++++------------------ 3 files changed, 36 insertions(+), 53 deletions(-) diff --git a/fhem/FHEM/10_RESIDENTS.pm b/fhem/FHEM/10_RESIDENTS.pm index 98490679a..eee0d1219 100644 --- a/fhem/FHEM/10_RESIDENTS.pm +++ b/fhem/FHEM/10_RESIDENTS.pm @@ -137,9 +137,9 @@ sub RESIDENTS_Attr(@) { if ( !defined( $attr{$name}{group} ) || $attr{$name}{group} eq "Home State" ); $attr{$name}{devStateIcon} = -'.*anwesend:status_available:absent .*abwesend:status_away_1:home .*verreist:status_standby:home .*keine:control_building_empty .*bettfertig:status_night:asleep .*schläft:status_night:awoken .*aufgestanden:status_available:home .*:user_unknown:home'; +'.*anwesend:status_available:absent .*abwesend:status_away_1:home .*verreist:status_standby:home .*keine:control_building_empty .*bettfertig:status_night:asleep .*schlaeft:status_night:awoken .*aufgestanden:status_available:home .*:user_unknown:home'; $attr{$name}{eventMap} = -"home:anwesend absent:abwesend gone:verreist none:keine gotosleep:bettfertig asleep:schläft awoken:aufgestanden"; +"home:anwesend absent:abwesend gone:verreist none:keine gotosleep:bettfertig asleep:schlaeft awoken:aufgestanden"; $attr{$name}{widgetOverride} = "state:anwesend,bettfertig,abwesend,verreist"; } @@ -212,9 +212,7 @@ sub RESIDENTS_Notify($$) { return unless ( $devName ne $hashName ); # only foreign events return if ( IsDisabled($hashName) or IsDisabled($devName) ); return - unless ( defined( $defs{$devName} ) - && defined( $defs{$devName}{TYPE} ) - && $defs{$devName}{TYPE} =~ /^(ROOMMATE|GUEST|dummy)$/i ); + unless ( RESIDENTStk_GetType( $devName, "ROOMMATE|GUEST|dummy" ) ); my @registeredRoommates = split( /,/, $hash->{ROOMMATES} ) @@ -463,11 +461,11 @@ sub RESIDENTS_Set($@) { # define roommate fhem( "define " . $rr_name . " ROOMMATE " . $name ) - unless ( defined( $defs{$rr_name} ) ); + unless ( RESIDENTStk_IsDevice($rr_name) ); - if ( defined( $defs{$rr_name} ) ) { + if ( RESIDENTStk_IsDevice($rr_name) ) { return "Can't create, device $rr_name already existing." - unless ( $defs{$rr_name}{TYPE} eq "ROOMMATE" ); + unless ( RESIDENTStk_IsDevice( $rr_name, "ROOMMATE" ) ); my $lang = $a[3] @@ -499,7 +497,7 @@ sub RESIDENTS_Set($@) { my $rr_name = $a[2]; # delete roommate - if ( defined( $defs{$rr_name} ) ) { + if ( RESIDENTStk_IsDevice($rr_name) ) { Log3 $name, 3, "RESIDENTS $name: deleted device $rr_name" if fhem( "delete " . $rr_name ); } @@ -523,11 +521,11 @@ sub RESIDENTS_Set($@) { # define guest fhem( "define " . $rg_name . " GUEST " . $name ) - unless ( defined( $defs{$rg_name} ) ); + unless ( RESIDENTStk_IsDevice($rg_name) ); - if ( defined( $defs{$rg_name} ) ) { + if ( RESIDENTStk_IsDevice($rg_name) ) { return "Can't create, device $rg_name already existing." - unless ( $defs{$rg_name}{TYPE} eq "GUEST" ); + unless ( RESIDENTStk_IsDevice( $rg_name, "GUEST" ) ); my $lang = $a[3] @@ -559,7 +557,7 @@ sub RESIDENTS_Set($@) { my $rg_name = $a[2]; # delete guest - if ( defined( $defs{$rg_name} ) ) { + if ( RESIDENTStk_IsDevice($rg_name) ) { Log3 $name, 3, "RESIDENTS $name: deleted device $rg_name" if fhem( "delete " . $rg_name ); } @@ -577,7 +575,7 @@ sub RESIDENTS_Set($@) { my $created = 0; until ($created) { - if ( defined( $defs{$wakeuptimerName} ) ) { + if ( RESIDENTStk_IsDevice($wakeuptimerName) ) { $i++; $wakeuptimerName = $name . "_wakeuptimer" . $i; } @@ -1416,9 +1414,8 @@ sub RESIDENTS_UpdateReadings (@) { for my $wakeupDevice ( split /,/, $wakeupDeviceList ) { next if !$wakeupDevice; - if ( defined( $defs{$wakeupDevice} ) - && $defs{$wakeupDevice}{TYPE} eq "dummy" ) - { + if ( RESIDENTStk_GetType($wakeupDevice) eq "dummy" ) { + # forced-stop only if resident is not present anymore if ( $newpresence eq "present" ) { fhem "set $wakeupDevice:FILTER=running!=0 end"; diff --git a/fhem/FHEM/20_GUEST.pm b/fhem/FHEM/20_GUEST.pm index 135cfdc72..4916b320f 100644 --- a/fhem/FHEM/20_GUEST.pm +++ b/fhem/FHEM/20_GUEST.pm @@ -73,7 +73,7 @@ sub GUEST_Define($$) { if ( defined( $hash->{RESIDENTGROUPS} ) ) { foreach ( split( /,/, $hash->{RESIDENTGROUPS} ) ) { RESIDENTStk_findResidentSlaves( $defs{$_} ) - if ( defined( $defs{$_} ) ); + if ( RESIDENTStk_IsDevice( $_, "RESIDENTS" ) ); } } @@ -177,9 +177,9 @@ sub GUEST_Attr(@) { if ( $lang eq "DE" ) { $attr{$name}{devStateIcon} = -'.*anwesend:user_available:absent .*abwesend:user_away:home .*keiner:control_building_empty:home .*bettfertig:scene_toilet:asleep .*schläft:scene_sleeping:awoken .*aufgestanden:scene_sleeping_alternat:home .*:user_unknown:home'; +'.*anwesend:user_available:absent .*abwesend:user_away:home .*keiner:control_building_empty:home .*bettfertig:scene_toilet:asleep .*schlaeft:scene_sleeping:awoken .*aufgestanden:scene_sleeping_alternat:home .*:user_unknown:home'; $attr{$name}{eventMap} = -"home:anwesend absent:abwesend none:keiner gotosleep:bettfertig asleep:schläft awoken:aufgestanden"; +"home:anwesend absent:abwesend none:keiner gotosleep:bettfertig asleep:schlaeft awoken:aufgestanden"; $attr{$name}{widgetOverride} = "state:anwesend,bettfertig,abwesend,keiner"; } @@ -213,7 +213,7 @@ sub GUEST_Undefine($$) { delete $hash->{RESIDENTGROUPS}; foreach ( split( /,/, $old ) ) { RESIDENTStk_findResidentSlaves( $defs{$_} ) - if ( defined( $defs{$_} ) ); + if ( RESIDENTStk_IsDevice( $_, "RESIDENTS" ) ); } } @@ -247,8 +247,7 @@ sub GUEST_Notify($$) { # make sure computeAfterInit is set at at-device # and re-calculate on our own this time - if ( defined( $defs{$wakeupAtdevice} ) - && $defs{$wakeupAtdevice}{TYPE} eq "at" + if ( RESIDENTStk_IsDevice( $wakeupAtdevice, "at" ) && AttrVal( $wakeupAtdevice, "computeAfterInit", 0 ) ne "1" ) { @@ -579,9 +578,8 @@ sub GUEST_Set($@) { for my $wakeupDevice ( split /,/, $wakeupDeviceList ) { next if !$wakeupDevice; - if ( defined( $defs{$wakeupDevice} ) - && $defs{$wakeupDevice}{TYPE} eq "dummy" ) - { + if ( RESIDENTStk_IsDevice( $wakeupDevice, "dummy" ) ) { + # forced-stop only if resident is not present anymore if ( $newpresence eq "present" ) { Log3 $name, 4, @@ -696,15 +694,10 @@ sub GUEST_Set($@) { split( ' ', $attr{$name}{"rg_passPresenceTo"} ); foreach my $object (@linkedObjects) { - if ( - defined( $defs{$object} ) + if ( RESIDENTStk_IsDevice( $object, "ROOMMATE|GUEST" ) && $defs{$object} ne $name - && defined( $defs{$object}{TYPE} ) - && ( $defs{$object}{TYPE} eq "ROOMMATE" - || $defs{$object}{TYPE} eq "GUEST" ) && ReadingsVal( $object, "state", "" ) ne "gone" - && ReadingsVal( $object, "state", "" ) ne "none" - ) + && ReadingsVal( $object, "state", "" ) ne "none" ) { fhem("set $object $newstate"); } @@ -874,7 +867,7 @@ sub GUEST_Set($@) { my $created = 0; until ($created) { - if ( defined( $defs{$wakeuptimerName} ) ) { + if ( RESIDENTStk_IsDevice($wakeuptimerName) ) { $i++; $wakeuptimerName = $name . "_wakeuptimer" . $i; } @@ -927,7 +920,7 @@ sub GUEST_Set($@) { elsif ( lc( $a[2] ) eq "locationmap" ) { my $locationmapName = $name . "_map"; - if ( defined( $defs{$locationmapName} ) ) { + if ( RESIDENTStk_IsDevice($locationmapName) ) { return "Device $locationmapName existing already, delete it first to have it re-created."; } diff --git a/fhem/FHEM/20_ROOMMATE.pm b/fhem/FHEM/20_ROOMMATE.pm index acf924617..d679c0c86 100644 --- a/fhem/FHEM/20_ROOMMATE.pm +++ b/fhem/FHEM/20_ROOMMATE.pm @@ -74,7 +74,7 @@ sub ROOMMATE_Define($$) { if ( defined( $hash->{RESIDENTGROUPS} ) ) { foreach ( split( /,/, $hash->{RESIDENTGROUPS} ) ) { RESIDENTStk_findResidentSlaves( $defs{$_} ) - if ( defined( $defs{$_} ) ); + if ( RESIDENTStk_IsDevice( $_, "RESIDENTS" ) ); } } @@ -180,9 +180,9 @@ sub ROOMMATE_Attr(@) { if ( $lang eq "DE" ) { $attr{$name}{devStateIcon} = -'.*anwesend:user_available:absent .*abwesend:user_away:home .*verreist:user_ext_away:home .*bettfertig:scene_toilet:asleep .*schläft:scene_sleeping:awoken .*aufgestanden:scene_sleeping_alternat:home .*:user_unknown:home'; +'.*anwesend:user_available:absent .*abwesend:user_away:home .*verreist:user_ext_away:home .*bettfertig:scene_toilet:asleep .*schlaeft:scene_sleeping:awoken .*aufgestanden:scene_sleeping_alternat:home .*:user_unknown:home'; $attr{$name}{eventMap} = -"home:anwesend absent:abwesend gone:verreist gotosleep:bettfertig asleep:schläft awoken:aufgestanden"; +"home:anwesend absent:abwesend gone:verreist gotosleep:bettfertig asleep:schlaeft awoken:aufgestanden"; $attr{$name}{widgetOverride} = "state:anwesend,bettfertig,abwesend,verreist"; } @@ -216,7 +216,7 @@ sub ROOMMATE_Undefine($$) { delete $hash->{RESIDENTGROUPS}; foreach ( split( /,/, $old ) ) { RESIDENTStk_findResidentSlaves( $defs{$_} ) - if ( defined( $defs{$_} ) ); + if ( RESIDENTStk_IsDevice( $_, "RESIDENTS" ) ); } } @@ -250,8 +250,7 @@ sub ROOMMATE_Notify($$) { # make sure computeAfterInit is set at at-device # and re-calculate on our own this time - if ( defined( $defs{$wakeupAtdevice} ) - && $defs{$wakeupAtdevice}{TYPE} eq "at" + if ( RESIDENTStk_IsDevice( $wakeupAtdevice, "at" ) && AttrVal( $wakeupAtdevice, "computeAfterInit", 0 ) ne "1" ) { @@ -581,9 +580,8 @@ sub ROOMMATE_Set($@) { for my $wakeupDevice ( split /,/, $wakeupDeviceList ) { next if !$wakeupDevice; - if ( defined( $defs{$wakeupDevice} ) - && $defs{$wakeupDevice}{TYPE} eq "dummy" ) - { + if ( RESIDENTStk_IsDevice( $wakeupDevice, "dummy" ) ) { + # forced-stop only if resident is not present anymore if ( $newpresence eq "present" ) { Log3 $name, 4, @@ -698,15 +696,10 @@ sub ROOMMATE_Set($@) { split( ' ', $attr{$name}{"rr_passPresenceTo"} ); foreach my $object (@linkedObjects) { - if ( - defined( $defs{$object} ) + if ( RESIDENTStk_IsDevice( $object, "ROOMMATE|GUEST" ) && $defs{$object} ne $name - && defined( $defs{$object}{TYPE} ) - && ( $defs{$object}{TYPE} eq "ROOMMATE" - || $defs{$object}{TYPE} eq "GUEST" ) && ReadingsVal( $object, "state", "" ) ne "gone" - && ReadingsVal( $object, "state", "" ) ne "none" - ) + && ReadingsVal( $object, "state", "" ) ne "none" ) { fhem("set $object $newstate"); } @@ -856,7 +849,7 @@ sub ROOMMATE_Set($@) { my $created = 0; until ($created) { - if ( defined( $defs{$wakeuptimerName} ) ) { + if ( RESIDENTStk_IsDevice($wakeuptimerName) ) { $i++; $wakeuptimerName = $name . "_wakeuptimer" . $i; } @@ -909,7 +902,7 @@ sub ROOMMATE_Set($@) { elsif ( lc( $a[2] ) eq "locationmap" ) { my $locationmapName = $name . "_map"; - if ( defined( $defs{$locationmapName} ) ) { + if ( RESIDENTStk_IsDevice($locationmapName) ) { return "Device $locationmapName existing already, delete it first to have it re-created."; }