From 084246e5760205d984e07b0502816c003911346e Mon Sep 17 00:00:00 2001 From: klaus-schauer <> Date: Sat, 13 Aug 2016 16:11:03 +0000 Subject: [PATCH] 10_EnOcean: subType manufProfile changed git-svn-id: https://svn.fhem.de/fhem/trunk@11956 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/10_EnOcean.pm | 52 ++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/fhem/FHEM/10_EnOcean.pm b/fhem/FHEM/10_EnOcean.pm index 93310ad63..e9ae9fe17 100755 --- a/fhem/FHEM/10_EnOcean.pm +++ b/fhem/FHEM/10_EnOcean.pm @@ -352,7 +352,7 @@ my %EnO_eepConfig = ( "G5.38.08" => {attr => {subType => "gateway", eep => "A5-38-08", gwCmd => "dimming", manufID => "00D", webCmd => "on:off:dim"}, GPLOT => "EnO_dim4:Dim,"}, "H5.38.08" => {attr => {subType => "gateway", comMode => "confirm", eep => "A5-38-08", gwCmd => "dimming", manufID => "00D", model => "TF", teachMethod => "confirm", webCmd => "on:off:dim"}, GPLOT => "EnO_dim4:Dim,"}, "G5.3F.7F" => {attr => {subType => "manufProfile", eep => "A5-3F-7F", manufID => "00D", webCmd => "opens:stop:closes"}}, - "H5.3F.7F" => {attr => {subType => "manufProfile", comMode => "confirm", eep => "A5-3F-7F", manufID => "00D", model => "TF", sensorMode => 'pushbutton', teachMethod => "confirm", webCmd => "opens:stop:closes"}}, + "H5.3F.7F" => {attr => {subType => "manufProfile", comMode => "confirm", eep => "A5-3F-7F", manufID => "00D", model => "TF", sensorMode => 'pushbutton', settingAccuracy => "high", teachMethod => "confirm", webCmd => "opens:stop:closes"}}, "M5.38.08" => {attr => {subType => "gateway", eep => "A5-38-08", gwCmd => "switching", manufID => "00D", webCmd => "on:off"}}, "N5.38.08" => {attr => {subType => "gateway", comMode => "confirm", eep => "A5-38-08", gwCmd => "switching", manufID => "00D", model => "TF", teachMethod => "confirm", webCmd => "on:off"}}, "G5.ZZ.ZZ" => {attr => {subType => "PM101", manufID => "005"}, GPLOT => "EnO_motion:Motion,EnO_brightness4:Brightness,"}, @@ -665,7 +665,8 @@ EnOcean_Initialize($) "reposition:directly,opens,closes rltRepeat:16,32,64,128,256 rltType:1BS,4BS " . "scaleDecimals:0,1,2,3,4,5,6,7,8,9 scaleMax scaleMin secMode:rcv,snd,bidir " . "secLevel:encapsulation,encryption,off sendDevStatus:no,yes sensorMode:switch,pushbutton " . - "serviceOn:no,yes setpointRefDev setpointSummerMode:slider,0,5,100 setpointTempRefDev shutTime shutTimeCloses subDef " . + "serviceOn:no,yes settingAccuracy:high,low setpointRefDev setpointSummerMode:slider,0,5,100 " . + "setpointTempRefDev shutTime shutTimeCloses subDef " . "subDef0 subDefI subDefA subDefB subDefC subDefD subDefH subDefW " . "subType:$subTypeList subTypeSet:$subTypeList subTypeReading:$subTypeList " . "summerMode:off,on switchMode:switch,pushbutton " . @@ -3917,6 +3918,12 @@ sub EnOcean_Set($@) my $angleTime = AttrVal($name, "angleTime", 0); my $position = ReadingsVal($name, "position", undef); my $positionStart; + my $setCmd = 8; + my $settingAccuracy = 1; + if (AttrVal($name, 'settingAccuracy', 'low') eq 'high') { + $setCmd = 0x0A; + $settingAccuracy = 10; + } if ($cmd eq "?" || $cmd eq "stop") { } else { @@ -4038,7 +4045,7 @@ sub EnOcean_Set($@) } elsif ($cmd eq "down") { # down if (defined $a[1]) { - if ($a[1] =~ m/^[+-]?\d+$/ && $a[1] >= 0 && $a[1] < 255) { + if ($a[1] =~ m/^[+-]?\d+$/ && $a[1] >= 0 && $a[1] <= 255) { $position = $positionStart + $a[1] / $shutTime * 100; if ($angleTime) { $anglePos = $anglePosStart + ($angleMax - $angleMin) * $a[1] / $angleTime; @@ -4097,8 +4104,8 @@ sub EnOcean_Set($@) $angleTime = $angleTime * ($angleMax - $anglePos) / ($angleMax - $angleMin); $shutTime = $shutTime * ($a[1] - $positionStart) / 100 + $angleTime; # round up - $angleTime = int($angleTime) + 1 if ($angleTime > int($angleTime)); - $shutTime = int($shutTime) + 1 if ($shutTime > int($shutTime)); + $angleTime = int($angleTime) + 1 if ($settingAccuracy == 1 && $angleTime > int($angleTime)); + $shutTime = int($shutTime) + 1 if ($settingAccuracy == 1 && $shutTime > int($shutTime)); $position = $a[1] + $angleTime / $shutTimeSet * 100; if ($position >= 100) { $position = 100; @@ -4114,8 +4121,8 @@ sub EnOcean_Set($@) $angleTime = $angleTime * ($anglePos - $angleMin) /($angleMax - $angleMin); $shutTime = $shutTime * ($positionStart - $a[1]) / 100 + $angleTime; # round up - $angleTime = int($angleTime) + 1 if ($angleTime > int($angleTime)); - $shutTime = int($shutTime) + 1 if ($shutTime > int($shutTime)); + $angleTime = int($angleTime) + 1 if ($settingAccuracy == 1 && $angleTime > int($angleTime)); + $shutTime = int($shutTime) + 1 if ($settingAccuracy == 1 && $shutTime > int($shutTime)); $position = $a[1] - $angleTime / $shutTimeSet * 100; if ($position <= 0) { $position = 0; @@ -4132,13 +4139,13 @@ sub EnOcean_Set($@) # up >> reduce slats angle $shutTime = $angleTime * ($anglePosStart - $anglePos)/($angleMax - $angleMin); # round up - $shutTime = int($shutTime) + 1 if ($shutTime > int($shutTime)); + $shutTime = int($shutTime) + 1 if ($settingAccuracy == 1 && $shutTime > int($shutTime)); $shutCmd = 1; } elsif ($anglePosStart < $anglePos) { # down >> enlarge slats angle $shutTime = $angleTime * ($anglePos - $anglePosStart) /($angleMax - $angleMin); # round up - $shutTime = int($shutTime) + 1 if ($shutTime > int($shutTime)); + $shutTime = int($shutTime) + 1 if ($settingAccuracy == 1 && $shutTime > int($shutTime)); $shutCmd = 2; } else { # position and slats angle ok @@ -4178,13 +4185,13 @@ sub EnOcean_Set($@) # up >> reduce slats angle $shutTime = $angleTime * ($anglePosStart - $anglePos)/($angleMax - $angleMin); # round up - $shutTime = int($shutTime) + 1 if ($shutTime > int($shutTime)); + $shutTime = int($shutTime) + 1 if ($settingAccuracy == 1 && $shutTime > int($shutTime)); $shutCmd = 1; } elsif ($anglePosStart < $anglePos) { # down >> enlarge slats angle $shutTime = $angleTime * ($anglePos - $anglePosStart) /($angleMax - $angleMin); # round up - $shutTime = int($shutTime) + 1 if ($shutTime > int($shutTime)); + $shutTime = int($shutTime) + 1 if ($settingAccuracy == 1 && $shutTime > int($shutTime)); $shutCmd = 2; } else { # slats angle ok @@ -4201,7 +4208,6 @@ sub EnOcean_Set($@) } } } elsif ($cmd eq "local") { - my $setCmd = 8; if ($a[1]) { return "Usage: $cmd [learn]" if ($a[1] ne "learn"); if ($a[1] eq "learn") { @@ -4210,14 +4216,14 @@ sub EnOcean_Set($@) shift(@a); } $updateState = 0; - $data = sprintf "%02X%02X%02X%02X", 0, $shutTime, $shutCmd, $setCmd; + $data = sprintf "%04X%02X%02X", int($shutTime * $settingAccuracy), $shutCmd, $setCmd; } else { return "Unknown argument " . $cmd . ", choose one of " . $cmdList . "position:slider,0,5,100 anglePos:slider,-180,5,180 closes:noArg down local:learn opens:noArg stop:noArg teach:noArg up" } if ($shutCmd || $cmd eq "stop") { #$updateState = 0; - $data = sprintf "%02X%02X%02X%02X", 0, $shutTime, $shutCmd, 8; + $data = sprintf "%04X%02X%02X", int($shutTime * $settingAccuracy), $shutCmd, $setCmd; } Log3 $name, 3, "EnOcean set $name $cmd"; } @@ -16966,7 +16972,7 @@ EnOcean_Delete($$)
  • up tu/s
    issue roll up command

  • - Runtime Range: tu|td = 1 s ... 255 s
    + Run-time Range: tu|td = 1 s ... 255 s
    Position Range: position = 0 % ... 100 %
    Slat Angle Range: α = -180 ° ... 180 °
    Angle Time Range: ta = 0 s ... 6 s
    @@ -16974,8 +16980,8 @@ EnOcean_Delete($$) angleMin, angleTime, shutTime and shutTimeCloses, are set correctly. - Set attr subType to manufProfile, manufID to 00D and attr model to - FSB14|FSB61|FSB70 manually.
    + If settingAccuracy is set to high, the run-time is sent in 1/10 increments.
    + Set attr subType to manufProfile, manufID to 00D and attr model to FSB14|FSB61|FSB70|TF manually.
    Use the sensor type "Szenentaster/PC" for Eltako devices.

    @@ -17946,15 +17952,15 @@ EnOcean_Delete($$)
  • sendDevStatus no|yes, [sendDevStatus] = no is default.
    Send new status of the device.
  • -
  • serviceOn no|yes, - [serviceOn] = no is default.
    - Device in Service Mode. -
  • sensorMode switch|pushbutton, [sensorMode] = switch is default.
    The status "released" will be shown in the reading state if the attribute is set to "pushbutton".
  • +
  • serviceOn no|yes, + [serviceOn] = no is default.
    + Device in Service Mode. +
  • setCmdTrigger man|refDev, [setCmdTrigger] = man is default.
    Operation mode to send set commands
    If the attribute is set to "refDev", a device-specific set command is sent when the reference device is updated. @@ -17973,6 +17979,10 @@ EnOcean_Delete($$) Name of the device whose reference value is read. The reference values is the reading setpointTemp.
  • +
  • settingAccuracy high|low, + [settingAccuracy] = low is default.
    + set setting accurancy. +
  • showtime
  • shutTime t/s
    subType blindsCtrl.00: [shutTime] = 5 ... 300, 300 is default.