mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +00:00
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:
parent
b65bc596bd
commit
8590b6e75e
@ -39,7 +39,7 @@ use vars qw{%attr %defs};
|
|||||||
sub Log($$);
|
sub Log($$);
|
||||||
|
|
||||||
#-- globals on start
|
#-- globals on start
|
||||||
my $version = "2.13";
|
my $version = "2.19";
|
||||||
|
|
||||||
#-- these we may get on request
|
#-- these we may get on request
|
||||||
my %gets = (
|
my %gets = (
|
||||||
@ -93,7 +93,7 @@ my %setsrgbwc = (
|
|||||||
"rgbw" => "A",
|
"rgbw" => "A",
|
||||||
"hsv" => "H",
|
"hsv" => "H",
|
||||||
"rgb:colorpicker,HSV" => "R",
|
"rgb:colorpicker,HSV" => "R",
|
||||||
"white:slider,0,1,100" => "W"
|
"white:slider,0,1,255" => "W"
|
||||||
);
|
);
|
||||||
|
|
||||||
my %shelly_models = (
|
my %shelly_models = (
|
||||||
@ -131,11 +131,11 @@ sub Shelly_Initialize ($) {
|
|||||||
|
|
||||||
$hash->{DefFn} = "Shelly_Define";
|
$hash->{DefFn} = "Shelly_Define";
|
||||||
$hash->{UndefFn} = "Shelly_Undef";
|
$hash->{UndefFn} = "Shelly_Undef";
|
||||||
|
$hash->{DeleteFn} = "Shelly_Delete";
|
||||||
$hash->{AttrFn} = "Shelly_Attr";
|
$hash->{AttrFn} = "Shelly_Attr";
|
||||||
$hash->{GetFn} = "Shelly_Get";
|
$hash->{GetFn} = "Shelly_Get";
|
||||||
$hash->{SetFn} = "Shelly_Set";
|
$hash->{SetFn} = "Shelly_Set";
|
||||||
#$hash->{NotifyFn} = "Shelly_Notify";
|
$hash->{RenameFn} = "Shelly_Rename";
|
||||||
#$hash->{InitFn} = "Shelly_Init";
|
|
||||||
|
|
||||||
$hash->{AttrList}= "verbose model:".join(",",(keys %shelly_models))." mode:relay,roller,white,color defchannel maxtime maxpower interval pct100:open,closed shellyuser ".
|
$hash->{AttrList}= "verbose model:".join(",",(keys %shelly_models))." mode:relay,roller,white,color defchannel maxtime maxpower interval pct100:open,closed shellyuser ".
|
||||||
$readingFnAttributes;
|
$readingFnAttributes;
|
||||||
@ -189,6 +189,21 @@ sub Shelly_Define($$) {
|
|||||||
return undef;
|
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
|
# Shelly_Undef - Implements UndefFn function
|
||||||
@ -202,7 +217,28 @@ sub Shelly_Undef ($) {
|
|||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
delete($modules{Shelly}{defptr}{NAME});
|
delete($modules{Shelly}{defptr}{NAME});
|
||||||
RemoveInternalTimer($hash);
|
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;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,7 +427,7 @@ sub Shelly_Get ($@) {
|
|||||||
if( ($model =~ /shelly2.*/) && ($mode eq "roller") ){
|
if( ($model =~ /shelly2.*/) && ($mode eq "roller") ){
|
||||||
$txt = "roller";
|
$txt = "roller";
|
||||||
}elsif( $model eq "shellydimmer" ){
|
}elsif( $model eq "shellydimmer" ){
|
||||||
$txt = "lights";
|
$txt = "light";
|
||||||
}elsif( ($model eq "shellyrgbw") && ($mode eq "white") ){
|
}elsif( ($model eq "shellyrgbw") && ($mode eq "white") ){
|
||||||
$txt = "white";
|
$txt = "white";
|
||||||
}elsif( ($model eq "shellyrgbw") && ($mode eq "color") ){
|
}elsif( ($model eq "shellyrgbw") && ($mode eq "color") ){
|
||||||
@ -419,7 +455,7 @@ sub Shelly_Get ($@) {
|
|||||||
if( ($model =~ /shelly2.*/) && ($mode eq "roller") ){
|
if( ($model =~ /shelly2.*/) && ($mode eq "roller") ){
|
||||||
$pre .= "roller/0?";
|
$pre .= "roller/0?";
|
||||||
}elsif( $model eq "shellydimmer" ){
|
}elsif( $model eq "shellydimmer" ){
|
||||||
$pre .= "lights/0?";
|
$pre .= "light/0?";
|
||||||
}elsif( ($model eq "shellyrgbw") && ($mode eq "white") ){
|
}elsif( ($model eq "shellyrgbw") && ($mode eq "white") ){
|
||||||
$pre .= "white/0?";
|
$pre .= "white/0?";
|
||||||
}elsif( ($model eq "shellyrgbw") && ($mode eq "color") ){
|
}elsif( ($model eq "shellyrgbw") && ($mode eq "color") ){
|
||||||
@ -464,6 +500,48 @@ sub Shelly_Set ($@) {
|
|||||||
my $mode = AttrVal($name,"mode","");
|
my $mode = AttrVal($name,"mode","");
|
||||||
my ($channel,$time);
|
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
|
#-- we have a Shelly 1,4 or ShellyPlug switch type device
|
||||||
#-- or we have a Shelly 2 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")) ){
|
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);
|
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;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1008,13 +1048,14 @@ sub Shelly_pwd($){
|
|||||||
$ison =~ s/0|(false)/off/;
|
$ison =~ s/0|(false)/off/;
|
||||||
$ison =~ s/1|(true)/on/;
|
$ison =~ s/1|(true)/on/;
|
||||||
my $bri = $jhash->{'lights'}[$i]{'brightness'};
|
my $bri = $jhash->{'lights'}[$i]{'brightness'};
|
||||||
$power = $jhash->{'lights'}[$i]{'power'};
|
|
||||||
$overpower = $jhash->{'lights'}[$i]{'overpower'};
|
$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,"state".$subs,$ison);
|
||||||
readingsBulkUpdateIfChanged($hash,"pct".$subs,$bri);
|
readingsBulkUpdateIfChanged($hash,"pct".$subs,$bri);
|
||||||
readingsBulkUpdateIfChanged($hash,"power".$subs,$power);
|
|
||||||
readingsBulkUpdateIfChanged($hash,"overpower".$subs,$overpower);
|
readingsBulkUpdateIfChanged($hash,"overpower".$subs,$overpower);
|
||||||
|
readingsBulkUpdateIfChanged($hash,"power".$subs,$power);
|
||||||
|
readingsBulkUpdateIfChanged($hash,"energy".$subs,$energy);
|
||||||
}
|
}
|
||||||
readingsBulkUpdateIfChanged($hash,"state","OK")
|
readingsBulkUpdateIfChanged($hash,"state","OK")
|
||||||
if ($dimmers > 1);
|
if ($dimmers > 1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user