36_Shelly.pm: Neue Version, Bugfix für Shelly Dimmer

git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@23271 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
phenning 2020-12-01 19:32:53 +00:00
parent b65bc596bd
commit 8590b6e75e

View File

@ -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);