From f862ac4b363fdff58cec808bfc27815b12a82288 Mon Sep 17 00:00:00 2001 From: jpawlowski Date: Sun, 5 Mar 2017 18:35:47 +0000 Subject: [PATCH] 10_RESIDENTS: add language helper; new attribute rgr_lang git-svn-id: https://svn.fhem.de/fhem/trunk@13614 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/10_RESIDENTS.pm | 153 +++++++++++++++++++++++++++++--------- 1 file changed, 119 insertions(+), 34 deletions(-) diff --git a/fhem/FHEM/10_RESIDENTS.pm b/fhem/FHEM/10_RESIDENTS.pm index da3f8fc39..35473cd06 100644 --- a/fhem/FHEM/10_RESIDENTS.pm +++ b/fhem/FHEM/10_RESIDENTS.pm @@ -35,6 +35,7 @@ require RESIDENTStk; sub RESIDENTS_Set($@); sub RESIDENTS_Define($$); sub RESIDENTS_Notify($$); +sub RESIDENTS_Attr(@); sub RESIDENTS_Undefine($$); ################################### @@ -46,9 +47,10 @@ sub RESIDENTS_Initialize($) { $hash->{SetFn} = "RESIDENTS_Set"; $hash->{DefFn} = "RESIDENTS_Define"; $hash->{NotifyFn} = "RESIDENTS_Notify"; + $hash->{AttrFn} = "RESIDENTS_Attr"; $hash->{UndefFn} = "RESIDENTS_Undefine"; $hash->{AttrList} = -"rgr_showAllStates:0,1 rgr_states:multiple-strict,home,gotosleep,asleep,awoken,absent,gone rgr_wakeupDevice " +"disable:1,0 rgr_showAllStates:0,1 rgr_states:multiple-strict,home,gotosleep,asleep,awoken,absent,gone rgr_lang:EN,DE rgr_wakeupDevice " . $readingFnAttributes; } @@ -64,10 +66,7 @@ sub RESIDENTS_Define($$) { # set default settings on first define if ( $init_done && !defined( $hash->{OLDDEF} ) ) { - $attr{$name}{alias} = "Residents"; - $attr{$name}{devStateIcon} = -'.*home:status_available:absent .*absent:status_away_1:home .*gone:status_standby:home .*none:control_building_empty .*gotosleep:status_night:asleep .*asleep:status_night:awoken .*awoken:status_available:home .*:user_unknown:home'; - $attr{$name}{group} = "Home State"; + RESIDENTS_Attr( "init", $name, "rgr_lang" ); $attr{$name}{icon} = "control_building_filled"; $attr{$name}{room} = "Residents"; $attr{$name}{webCmd} = "state"; @@ -85,6 +84,69 @@ sub RESIDENTS_Define($$) { return undef; } +################################### +sub RESIDENTS_Attr(@) { + my ( $cmd, $name, $attribute, $value ) = @_; + my $hash = $defs{$name}; + my $prefix = "rgr_"; + return unless ($init_done); + + Log3 $name, 5, "RESIDENTS $name: called function RESIDENTS_Attr()"; + + if ( $attribute eq "disable" ) { + $hash->{STATE} = "disabled" + if ( $value and $value == 1 ); + evalStateFormat($hash) + if ( $cmd eq "del" or !$value ); + } + + elsif ( $attribute eq $prefix . "lang" ) { + my $lang = + $cmd eq "set" ? uc($value) : AttrVal( "global", "language", "EN" ); + + # for initial define, ensure fallback to EN + $lang = "EN" + if ( $cmd eq "init" && $lang !~ /^EN|DE$/i ); + + if ( $lang eq "DE" ) { + $attr{$name}{alias} = "Bewohner" + if ( !defined( $attr{$name}{alias} ) + || $attr{$name}{alias} eq "Residents" ); + $attr{$name}{group} = "Haus Status" + 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'; + $attr{$name}{eventMap} = +"home:anwesend absent:abwesend gone:verreist none:keine gotosleep:bettfertig asleep:schläft awoken:aufgestanden"; + $attr{$name}{widgetOverride} = + "state:anwesend,bettfertig,abwesend,verreist"; + } + elsif ( $lang eq "EN" ) { + $attr{$name}{alias} = "Residents" + if ( !defined( $attr{$name}{alias} ) + || $attr{$name}{alias} eq "Bewohner" ); + $attr{$name}{group} = "Home State" + if ( !defined( $attr{$name}{group} ) + || $attr{$name}{group} eq "Haus Status" ); + $attr{$name}{devStateIcon} = +'.*home:status_available:absent .*absent:status_away_1:home .*gone:status_standby:home .*none:control_building_empty .*gotosleep:status_night:asleep .*asleep:status_night:awoken .*awoken:status_available:home .*:user_unknown:home'; + delete $attr{$name}{eventMap} + if ( defined( $attr{$name}{eventMap} ) ); + delete $attr{$name}{widgetOverride} + if ( defined( $attr{$name}{widgetOverride} ) ); + } + else { + return "Unsupported language $lang"; + } + + evalStateFormat($hash); + } + + return if ( IsDisabled($name) ); + return; +} + ################################### sub RESIDENTS_Undefine($$) { my ( $hash, $name ) = @_; @@ -126,10 +188,11 @@ sub RESIDENTS_Notify($$) { my $devName = $dev->{NAME}; my $hashName = $hash->{NAME}; 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)$/ ); + && $defs{$devName}{TYPE} =~ /^(ROOMMATE|GUEST|dummy)$/i ); my @registeredRoommates = split( /,/, $hash->{ROOMMATES} ) @@ -254,6 +317,8 @@ sub RESIDENTS_Set($@) { my $roommates = ( $hash->{ROOMMATES} ? $hash->{ROOMMATES} : "" ); my $guests = ( $hash->{GUESTS} ? $hash->{GUESTS} : "" ); + return if ( IsDisabled($name) ); + Log3 $name, 5, "RESIDENTS $name: called function RESIDENTS_Set()"; return "No Argument given" if ( !defined( $a[1] ) ); @@ -363,7 +428,7 @@ sub RESIDENTS_Set($@) { } # addRoommate - elsif ( $a[1] eq "addRoommate" ) { + elsif ( lc( $a[1] ) eq "addroommate" ) { Log3 $name, 2, "RESIDENTS set $name " . $a[1] . " " . $a[2] if ( defined( $a[2] ) ); @@ -371,21 +436,28 @@ sub RESIDENTS_Set($@) { my $rr_name_attr; if ( $a[2] ne "" ) { - $rr_name = "rr_" . $a[2]; + $rr_name = "rr_" unless ( $a[2] =~ /^rr_/ ); + $rr_name .= $a[2]; # define roommate - if ( !defined( $defs{$rr_name} ) ) { - fhem( "define " . $rr_name . " ROOMMATE " . $name ); - if ( defined( $defs{$rr_name} ) ) { - fhem "set $rr_name silentSet state home"; - Log3 $name, 3, - "RESIDENTS $name: created new device $rr_name"; - } - } - else { - return "Can't create, device $rr_name already existing."; - } + fhem( "define " . $rr_name . " ROOMMATE " . $name ) + unless ( defined( $defs{$rr_name} ) ); + if ( defined( $defs{$rr_name} ) ) { + return "Can't create, device $rr_name already existing." + unless ( $defs{$rr_name}{TYPE} eq "ROOMMATE" ); + + fhem( "attr " . $rr_name . "rr_lang" . uc( $a[3] ) ) + if ( defined( $a[3] ) + && AttrVal( $rr_name, "rr_lang", "EN" ) ne uc( $a[3] ) ); + + $attr{$rr_name}{comment} = "Auto-created by $name" + unless ( defined( $attr{$rr_name}{comment} ) + && $attr{$rr_name}{comment} eq "Auto-created by $name" ); + + fhem "set $rr_name silentSet state home"; + Log3 $name, 3, "RESIDENTS $name: created new device $rr_name"; + } } else { return "No Argument given, choose one of name "; @@ -393,7 +465,7 @@ sub RESIDENTS_Set($@) { } # removeRoommate - elsif ( $a[1] eq "removeRoommate" ) { + elsif ( lc( $a[1] ) eq "removeroommate" ) { Log3 $name, 2, "RESIDENTS set $name " . $a[1] . " " . $a[2] if ( defined( $a[2] ) ); @@ -412,7 +484,7 @@ sub RESIDENTS_Set($@) { } # addGuest - elsif ( $a[1] eq "addGuest" ) { + elsif ( lc( $a[1] ) eq "addguest" ) { Log3 $name, 2, "RESIDENTS set $name " . $a[1] . " " . $a[2] if ( defined( $a[2] ) ); @@ -420,21 +492,28 @@ sub RESIDENTS_Set($@) { my $rg_name_attr; if ( $a[2] ne "" ) { - $rg_name = "rg_" . $a[2]; + $rg_name = "rg_" unless ( $a[2] =~ /^rg_/ ); + $rg_name .= $a[2]; # define guest - if ( !defined( $defs{$rg_name} ) ) { - fhem( "define " . $rg_name . " GUEST " . $name ); - if ( defined( $defs{$rg_name} ) ) { - fhem "set $rg_name silentSet state none"; - Log3 $name, 3, - "RESIDENTS $name: created new device $rg_name"; - } - } - else { - return "Can't create, device $rg_name already existing."; - } + fhem( "define " . $rg_name . " GUEST " . $name ) + unless ( defined( $defs{$rg_name} ) ); + if ( defined( $defs{$rg_name} ) ) { + return "Can't create, device $rg_name already existing." + unless ( $defs{$rg_name}{TYPE} eq "GUEST" ); + + fhem( "attr " . $rg_name . "rg_lang" . uc( $a[3] ) ) + if ( defined( $a[3] ) + && AttrVal( $rg_name, "rg_lang", "EN" ) ne uc( $a[3] ) ); + + $attr{$rg_name}{comment} = "Auto-created by $name" + unless ( defined( $attr{$rg_name}{comment} ) + && $attr{$rg_name}{comment} eq "Auto-created by $name" ); + + fhem "set $rg_name silentSet state home"; + Log3 $name, 3, "RESIDENTS $name: created new device $rg_name"; + } } else { return "No Argument given, choose one of name "; @@ -442,7 +521,7 @@ sub RESIDENTS_Set($@) { } # removeGuest - elsif ( $a[1] eq "removeGuest" ) { + elsif ( lc( $a[1] ) eq "removeguest" ) { Log3 $name, 2, "RESIDENTS set $name " . $a[1] . " " . $a[2] if ( defined( $a[2] ) ); @@ -1574,6 +1653,9 @@ sub RESIDENTS_UpdateReadings (@) { Attributes