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($$);
|
||||
|
||||
#-- 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")) ){
|
||||
@ -735,44 +813,6 @@ sub Shelly_Set ($@) {
|
||||
}
|
||||
}
|
||||
|
||||
#-- 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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user