diff --git a/FHEM/36_Shelly.pm b/FHEM/36_Shelly.pm index 93e19a952..41d7b477e 100644 --- a/FHEM/36_Shelly.pm +++ b/FHEM/36_Shelly.pm @@ -39,7 +39,7 @@ use vars qw{%attr %defs}; sub Log($$); #-- globals on start -my $version = "2.13"; +my $version = "2.19"; #-- these we may get on request my %gets = ( @@ -93,7 +93,7 @@ my %setsrgbwc = ( "rgbw" => "A", "hsv" => "H", "rgb:colorpicker,HSV" => "R", - "white:slider,0,1,100" => "W" + "white:slider,0,1,255" => "W" ); my %shelly_models = ( @@ -131,11 +131,11 @@ sub Shelly_Initialize ($) { $hash->{DefFn} = "Shelly_Define"; $hash->{UndefFn} = "Shelly_Undef"; + $hash->{DeleteFn} = "Shelly_Delete"; $hash->{AttrFn} = "Shelly_Attr"; $hash->{GetFn} = "Shelly_Get"; $hash->{SetFn} = "Shelly_Set"; - #$hash->{NotifyFn} = "Shelly_Notify"; - #$hash->{InitFn} = "Shelly_Init"; + $hash->{RenameFn} = "Shelly_Rename"; $hash->{AttrList}= "verbose model:".join(",",(keys %shelly_models))." mode:relay,roller,white,color defchannel maxtime maxpower interval pct100:open,closed shellyuser ". $readingFnAttributes; @@ -189,6 +189,21 @@ sub Shelly_Define($$) { return undef; } +####################################################################################### +# +# Shelly_Delete - Implements DeleteFn function +# +# Parameter hash = hash of device addressed +# +####################################################################################### + +sub Shelly_Delete ($) { + my ($hash) = @_; + my $name = $hash->{NAME}; + my ($err, $sh_pw) = setKeyValue("SHELLY_PASSWORD_$name", undef); + return undef; +} + ####################################################################################### # # Shelly_Undef - Implements UndefFn function @@ -202,7 +217,28 @@ sub Shelly_Undef ($) { my $name = $hash->{NAME}; delete($modules{Shelly}{defptr}{NAME}); RemoveInternalTimer($hash); - my ($err, $sh_pw) = setKeyValue("SHELLY_PASSWORD_$name", undef); + return undef; +} + +####################################################################################### +# +# Shelly_Rename - Implements RenameFn function +# +# Parameter hash = hash of device addressed +# +####################################################################################### + +sub Shelly_Rename ($$) { + my ( $new_name, $old_name ) = @_; + + my $old_index = "Module_Shelly_".$old_name."_data"; + my $new_index = "Module_Shelly_".$new_name."_data"; + + my ($err, $old_pwd) = getKeyValue($old_index); + return undef unless(defined($old_pwd)); + + setKeyValue($new_index, $old_pwd); + setKeyValue($old_index, undef); return undef; } @@ -391,7 +427,7 @@ sub Shelly_Get ($@) { if( ($model =~ /shelly2.*/) && ($mode eq "roller") ){ $txt = "roller"; }elsif( $model eq "shellydimmer" ){ - $txt = "lights"; + $txt = "light"; }elsif( ($model eq "shellyrgbw") && ($mode eq "white") ){ $txt = "white"; }elsif( ($model eq "shellyrgbw") && ($mode eq "color") ){ @@ -419,7 +455,7 @@ sub Shelly_Get ($@) { if( ($model =~ /shelly2.*/) && ($mode eq "roller") ){ $pre .= "roller/0?"; }elsif( $model eq "shellydimmer" ){ - $pre .= "lights/0?"; + $pre .= "light/0?"; }elsif( ($model eq "shellyrgbw") && ($mode eq "white") ){ $pre .= "white/0?"; }elsif( ($model eq "shellyrgbw") && ($mode eq "color") ){ @@ -464,6 +500,48 @@ sub Shelly_Set ($@) { my $mode = AttrVal($name,"mode",""); my ($channel,$time); + #-- command password independent of Shelly type + if($cmd eq "password") { + my $user = AttrVal($name, "shellyuser", ''); + if(!$user){ + my $msg = "Error: password can be set only if attribute shellyuser is set"; + Log3 $name,1,"[Shelly_Set] ".$msg; + return $msg; + } + setKeyValue("SHELLY_PASSWORD_$name", $value); + return undef; + } + + #-- command config largely independent of Shelly type + if($cmd eq "config") { + my $reg = $value; + my ($val,$chan); + if( int(@a) == 2 ){ + $chan = $a[1]; + $val = $a[0]; + }elsif( int(@a) == 1 ){ + $chan = 0; + $val = $a[0]; + }else{ + my $msg = "Error: wrong number of parameters"; + Log3 $name,1,"[Shelly_Set] ".$msg; + return $msg; + } + my $pre = "settings/"; + if( ($model =~ /shelly2.*/) && ($mode eq "roller") ){ + $pre .= "roller/0?"; + }elsif( ($model eq "shellyrgbw") && ($mode eq "white") ){ + $pre .= "white/0?"; + }elsif( ($model eq "shellyrgbw") && ($mode eq "color") ){ + $pre .= "color/0?"; + }else{ + $pre .= "relay/$chan?"; + } + $v = Shelly_configure($hash,$pre.$reg."=".$val); + return undef; + } + + #-- commands strongly dependent on Shelly type #-- we have a Shelly 1,4 or ShellyPlug switch type device #-- or we have a Shelly 2 switch type device if( ($model =~ /shelly1.*/) || ($model eq "shelly4") || ($model eq "shellyplug") || (($model =~ /shelly2.*/) && ($mode eq "relay")) ){ @@ -734,45 +812,7 @@ sub Shelly_Set ($@) { Shelly_dim($hash,"color/0","?".$cmd); } } - - #-- configuration register - if($cmd eq "config") { - my $reg = $value; - my ($val,$chan); - if( int(@a) == 2 ){ - $chan = $a[1]; - $val = $a[0]; - }elsif( int(@a) == 1 ){ - $chan = 0; - $val = $a[0]; - }else{ - my $msg = "Error: wrong number of parameters"; - Log3 $name,1,"[Shelly_Set] ".$msg; - return $msg; - } - my $pre = "settings/"; - if( ($model =~ /shelly2.*/) && ($mode eq "roller") ){ - $pre .= "roller/0?"; - }elsif( ($model eq "shellyrgbw") && ($mode eq "white") ){ - $pre .= "white/0?"; - }elsif( ($model eq "shellyrgbw") && ($mode eq "color") ){ - $pre .= "color/0?"; - }else{ - $pre .= "relay/$chan?"; - } - $v = Shelly_configure($hash,$pre.$reg."=".$val); - } - - #-- password - if($cmd eq "password") { - my $user = AttrVal($name, "shellyuser", ''); - if(!$user){ - my $msg = "Error: password can be set only if attribute shellyuser is set"; - Log3 $name,1,"[Shelly_Set] ".$msg; - return $msg; - } - setKeyValue("SHELLY_PASSWORD_$name", $value); - } + return undef; } @@ -1008,13 +1048,14 @@ sub Shelly_pwd($){ $ison =~ s/0|(false)/off/; $ison =~ s/1|(true)/on/; my $bri = $jhash->{'lights'}[$i]{'brightness'}; - $power = $jhash->{'lights'}[$i]{'power'}; $overpower = $jhash->{'lights'}[$i]{'overpower'}; - + $power = $jhash->{'meters'}[$i]{'power'}; + $energy = (defined($jhash->{'meters'}[$i]{'total'}))?int($jhash->{'meters'}[$i]{'total'}/6)/10:"undefined"; readingsBulkUpdateIfChanged($hash,"state".$subs,$ison); readingsBulkUpdateIfChanged($hash,"pct".$subs,$bri); - readingsBulkUpdateIfChanged($hash,"power".$subs,$power); readingsBulkUpdateIfChanged($hash,"overpower".$subs,$overpower); + readingsBulkUpdateIfChanged($hash,"power".$subs,$power); + readingsBulkUpdateIfChanged($hash,"energy".$subs,$energy); } readingsBulkUpdateIfChanged($hash,"state","OK") if ($dimmers > 1);