EnOcean: if there is an 'attr' 'subId' use it for sending data to an Actuator

There is no subType 'dimmer' and 'dimmctrl' anymore these are replaced by 'eltakoDimmer'.
 The commands supported are 'dimto' and 'teach'
 The readings which will be set are 'state' and 'value'
This commit is contained in:
Marc Hoppe
2012-01-17 22:39:59 +01:00
committed by Marc Hoppe
parent 6b5345e8bb
commit b422b35553

View File

@@ -10,6 +10,7 @@ sub EnOcean_Initialize($);
sub EnOcean_Parse($$); sub EnOcean_Parse($$);
sub EnOcean_Set($@); sub EnOcean_Set($@);
sub EnOcean_MD15Cmd($$$); sub EnOcean_MD15Cmd($$$);
sub EnOcean_GetMyDeviceId($);
my %rorgname = ("F6"=>"switch", # RPS my %rorgname = ("F6"=>"switch", # RPS
"D5"=>"contact", # 1BS "D5"=>"contact", # 1BS
@@ -66,8 +67,8 @@ EnOcean_Initialize($)
$hash->{SetFn} = "EnOcean_Set"; $hash->{SetFn} = "EnOcean_Set";
$hash->{AttrList} = "IODev do_not_notify:1,0 ignore:0,1 " . $hash->{AttrList} = "IODev do_not_notify:1,0 ignore:0,1 " .
"showtime:1,0 loglevel:0,1,2,3,4,5,6 model " . "showtime:1,0 loglevel:0,1,2,3,4,5,6 model " .
"subType:switch,contact,sensor,windowHandle,SR04,MD15,PM101,". "subType:switch,contact,sensor,windowHandle,SR04,MD15,".
"dimmer,dimmCtrl actualTemp"; "eltakoDimmer subId actualTemp";
for(my $i=0; $i<@ptm200btn;$i++) { for(my $i=0; $i<@ptm200btn;$i++) {
$ptm200btn{$ptm200btn[$i]} = "$i:30"; $ptm200btn{$ptm200btn[$i]} = "$i:30";
@@ -140,14 +141,15 @@ EnOcean_Set($@)
$hash->{READINGS}{$cmd}{TIME} = $tn; $hash->{READINGS}{$cmd}{TIME} = $tn;
$hash->{READINGS}{$cmd}{VAL} = $arg; $hash->{READINGS}{$cmd}{VAL} = $arg;
} elsif($st eq "dimmCtrl") { # Tested for Eltako-Dimmer } elsif($st eq "eltakoDimmer") {
if($cmd eq "teach") { if($cmd eq "teach") {
my $data=sprintf("A502000000%s00", $hash->{DEF}); my $idSrc=EnOcean_GetMyDeviceId($hash);
Log $ll2, "dimmCtrl.Teach: " . $data; my $data=sprintf("A502000000%s00", $idSrc);
Log $ll2, "$st.Teach: " . $data;
IOWrite($hash, "000A0001", $data); # len:000a optlen:00 pakettype:1(radio) IOWrite($hash, "000A0001", $data); # len:000a optlen:00 pakettype:1(radio)
} elsif($cmd eq "dimm") { } elsif($cmd eq "dimto") {
return "Usage: dimm percent [time 01-FF FF:slowest] [on/off]" if(@a<2); return "Usage: $cmd percent [time 01-FF FF:slowest] [on/off]" if(@a<2);
my $time=0; my $time=0;
my $onoff=1; my $onoff=1;
# for eltako relative (0-100) (but not compliant to EEP because DB0.2 is 0) # for eltako relative (0-100) (but not compliant to EEP because DB0.2 is 0)
@@ -156,12 +158,14 @@ EnOcean_Set($@)
if(defined($a[1])) { $time=$a[1]; shift(@a); } if(defined($a[1])) { $time=$a[1]; shift(@a); }
if(defined($a[1])) { $onoff=($a[1] eq "off") ? 0 : 1; shift(@a); } if(defined($a[1])) { $onoff=($a[1] eq "off") ? 0 : 1; shift(@a); }
# EEP: A5/38/08 Central Command ->Typ 0x02: Dimming # EEP: A5/38/08 Central Command ->Typ 0x02: Dimming
my $data=sprintf("A502%02X%02X%02X%s00", $dimVal, $time, $onoff|0x08, $hash->{DEF}); my $idSrc=EnOcean_GetMyDeviceId($hash);
#my $data=sprintf("A502%02X%02X%02X%s00", $dimVal, $time, $onoff|0x08, $hash->{DEF});
my $data=sprintf("A502%02X%02X%02X%s00", $dimVal, $time, $onoff|0x08, $idSrc);
IOWrite($hash, "000A0001", $data); IOWrite($hash, "000A0001", $data);
Log $ll2, "dimmCtrl.dimm: " . $data; Log $ll2, "$st.$cnd: " . $data;
} else { } else {
return "Unknown argument $cmd, choose one of: teach, dimm" return "Unknown argument $cmd, choose one of: teach, dimto"
} }
@@ -303,7 +307,7 @@ EnOcean_Parse($$)
if("$fn.$tp" eq "20.01" && $iohash->{pair}) { # MD15 if("$fn.$tp" eq "20.01" && $iohash->{pair}) { # MD15
select(undef, undef, undef, 0.1); # max 10 Seconds select(undef, undef, undef, 0.1); # max 10 Seconds
EnOcean_A5Cmd($hash, "800800F0", "00000000"); EnOcean_A5Cmd($hash, "800800F0", EnOcean_GetMyDeviceId($hash));
select(undef, undef, undef, 0.5); select(undef, undef, undef, 0.5);
EnOcean_MD15Cmd($hash, $name, 128); # 128 == 20 degree C EnOcean_MD15Cmd($hash, $name, 128); # 128 == 20 degree C
} }
@@ -355,9 +359,7 @@ EnOcean_Parse($$)
push @event, "3:channel1:" . ($db_0 & 0x01 ? "off" : "on"); push @event, "3:channel1:" . ($db_0 & 0x01 ? "off" : "on");
push @event, "3:channel2:" . ($db_0 & 0x02 ? "off" : "on"); push @event, "3:channel2:" . ($db_0 & 0x02 ? "off" : "on");
} elsif($st eq "dimmer") { } elsif($st eq "eltakoDimmer") {
# todo: create a more general solution for the central-command responses
# response command from (Eltako-)Actor ( Central-Command:A5/38/08 ) # response command from (Eltako-)Actor ( Central-Command:A5/38/08 )
if($db_3 eq 0x01) { # switch if($db_3 eq 0x01) { # switch
push @event, "3:state:" . (($db_0 & 0x01) ? "on": "off"); push @event, "3:state:" . (($db_0 & 0x01) ? "on": "off");
@@ -366,7 +368,7 @@ EnOcean_Parse($$)
} elsif($db_3 eq 0x02) { # dimm } elsif($db_3 eq 0x02) { # dimm
push @event, "3:state:" . (($db_0 & 0x01) ? "on": "off"); push @event, "3:state:" . (($db_0 & 0x01) ? "on": "off");
push @event, "3:dimmValue:$db_2"; push @event, "3:value:$db_2";
} elsif($db_3 eq 0x03) { # setpoint-switch, todo } elsif($db_3 eq 0x03) { # setpoint-switch, todo
} elsif($db_3 eq 0x04) { # basic setpoint, todo } elsif($db_3 eq 0x04) { # basic setpoint, todo
@@ -440,7 +442,7 @@ EnOcean_MD15Cmd($$$)
if($msg) { if($msg) {
select(undef, undef, undef, 0.2); select(undef, undef, undef, 0.2);
EnOcean_A5Cmd($hash, $msg, "00000000"); EnOcean_A5Cmd($hash, $msg, EnOcean_GetMyDeviceId($hash));
if($cmd eq "initialize") { if($cmd eq "initialize") {
delete($defs{$name}{READINGS}{CMD}); delete($defs{$name}{READINGS}{CMD});
delete($defs{$name}{READINGS}{$cmd}); delete($defs{$name}{READINGS}{$cmd});
@@ -458,4 +460,23 @@ EnOcean_A5Cmd($$$)
# type=A5 msg:4 senderId:4 status=00 subTelNum=01 destId:4 dBm=FF Security=00 # type=A5 msg:4 senderId:4 status=00 subTelNum=01 destId:4 dBm=FF Security=00
} }
# ---------------------------------------------
#
# compose the Src-Id for a command to send
#
sub EnOcean_GetMyDeviceId($)
{
my ($hash) = @_;
my $myId=0; # default: use Device-ID of EUL
my $baseId=hex($hash->{IODev}{BASEID});
my $subId = AttrVal($name, "subId", "");
if(defined $baseId and defined $subId) {
# if there is a base-id an a subid -> use this combination
$myId=sprintf("%08X", $baseId | $subId);
}
return $myId;
}
1; 1;