Hallo,
wie schon im dem Thread https://forum.fhem.de/index.php/topic,14211.0.html (https://forum.fhem.de/index.php/topic,14211.0.html) beschrieben, habe ich mich mit dem Analog Aktor SRC-AO von Thermokon auseinandergesetzt und nun in der 10_EnOcean.pm eine Erweiterung dafür eingepflegt.
Ich konnte diesem Aktor nicht wirklich einem EEP zuordnen. In meiner Umgebung läuft er als D2-01-15 (war als Aktor die nächste freie Stelle) unidirektionel, der nicht in FHEM eingelernt wird, sondern FHEM wird als Setter in den Aktor eingelernt.
Hier die Erweiterung in der 10_EnOcean.pm Zeile 390:
"D2.01.15" => {attr => {subType => "analogActuator.01"}},
und ab Zeile 3529:
} elsif ($st eq "analogActuator.01") {
# Analog Actor Unit (EEP ???)
# [Thermokon SRC-AO*,]
# $db[3] is unused
# $db[2] is unused
# $db[1] is the setpoint where 0x00 = min ... 0xFF = max
# $db[0] is unused
$rorg = "A5";
my $setCmd = 8;
my $setpoint = ReadingsVal($name, "setpoint", 128);
my $setpointScaled = ReadingsVal($name, "setpointScaled", undef);
if ($cmd eq "teach") {
$data = "4017FF80";
CommandDeleteReading(undef, "$name .*");
readingsSingleUpdate($hash, "teach", "4BS teach-in sent", 1);
$updateState = 0;
($err, $subDef) = EnOcean_AssignSenderID(undef, $hash, "subDef", "confirm");
} elsif ($cmd eq "setpoint") {
#
if (defined $a[1]) {
if (($a[1] =~ m/^[+-]?\d+(\.\d+)?$/) && ($a[1] >= 0) && ($a[1] <= 255)) {
$setpoint = $a[1];
shift(@a);
if (defined $setpointScaled) {
$setpointScaled = EnOcean_ReadingScaled($hash, $setpoint, 0, 255);
}
} else {
return "Usage: $a[1] is not numeric or out of range";
}
}
readingsSingleUpdate($hash, "setpointScaled", $setpointScaled, 1) if (defined $setpointScaled);
readingsSingleUpdate($hash, "setpoint", $setpoint, 1);
readingsSingleUpdate($hash, "state", "SP: $setpoint", 1);
$updateState = 0;
$data = sprintf "0000%02X00", $setpoint;
} elsif ($cmd eq "setpointScaled") {
if (defined $a[1]) {
my $scaleMin = AttrVal($name, "scaleMin", undef);
my $scaleMax = AttrVal($name, "scaleMax", undef);
my ($rangeMin, $rangeMax);
if (defined $scaleMax && defined $scaleMin &&
$scaleMax =~ m/^[+-]?\d+(\.\d+)?$/ && $scaleMin =~ m/^[+-]?\d+(\.\d+)?$/) {
if ($scaleMin > $scaleMax) {
($rangeMin, $rangeMax)= ($scaleMax, $scaleMin);
} else {
($rangeMin, $rangeMax)= ($scaleMin, $scaleMax);
}
} else {
return "Usage: Attributes scaleMin and/or scaleMax not defined or not numeric.";
}
if ($a[1] =~ m/^[+-]?\d+(\.\d+)?$/ && $a[1] >= $rangeMin && $a[1] <= $rangeMax) {
$setpointScaled = $a[1];
shift(@a);
$setpoint = sprintf "%d", 255 * $scaleMin/($scaleMin-$scaleMax) - 255/($scaleMin-$scaleMax) * $setpointScaled;
} else {
return "Usage: $a[1] is not numeric or out of range";
}
}
readingsSingleUpdate($hash, "setpointScaled", $setpointScaled, 1);
readingsSingleUpdate($hash, "setpoint", $setpoint, 1);
readingsSingleUpdate($hash, "state", "SP: $setpoint", 1);
$updateState = 0;
$data = sprintf "0000%02X00", $setpoint;
} else {
if (AttrVal($name, 'devMode', 'master') eq 'master') {
return "Unknown argument " . $cmd . ", choose one of " . $cmdList . "setpoint:slider,0,1,255 setpointScaled teach:noArg"
}
else {
return undef;
}
}
Log3 $name, 3, "EnOcean set $name $cmd";
}
Hier noch das LIST vom Device:
Internals:
DEF FFA2FF15
FUUID 63516371-f33f-8cc0-9e6d-8162c894856d04fa
FVERSION 10_EnOcean.pm:0.259470/2022-04-11
IODev USB300
NAME fl_Luefterdrehzahl
NR 1114
NTFY_ORDER 50-Luefterstufe
STATE 50%
TYPE EnOcean
eventCount 310
OLDREADINGS:
READINGS:
2022-10-23 14:40:18 setpoint 127
2022-10-23 14:40:18 setpointScaled 50
2022-10-23 14:40:18 state SP: 127
helper:
actorErrorAction freeze
actorErrorPos 0
actorInterval 10
actorKeepAlive 100
actorLimitLower 0
actorLimitUpper 100
actorThreshold 1
actorTimestamp 2022-10-21 17:05:27
actorValueDecPlaces 0
calcInterval 100
deltaGradient 0
deltaOld
deltaOldTS 2022-10-21 17:31:57
deltaTreshold 0
factor_D 0
factor_I 0.25
factor_P 25
reverseAction 0
sensorTimeout 1200
stopped 1
updateInterval 100
calcPID:
undef
HASH(0x55eb747d6248)
stop
undef
temperature
setpoint
Temp
Attributes:
DbLogExclude .*
IODev USB300
alias Lüfterdrehzahl Flur
comMode uniDir
event-on-change-reading .*
group Lüftung
icon vent_ventilation_control
manufID 002
room 00_Haus,53_Enocean,62_Lueftung
scaleDecimals 0
scaleMax 100
scaleMin 0
stateFormat setpointScaled%
subType analogActuator.01
verbose 5
webCmd setpointScaled
widgetOverride setpointScaled:slider,0,10,100
Vielleicht lässt sich das ja in die offizielle Version des Modules einbauen, sonst muss ich das bei einem Update immer wieder nachpflegen..
Gruss Jan
Es gab im EnOcean-Modul bereits ein herstellerspezifisches Sensorprofil für Thermokon SR65 3AI. Der Sensor hat max. drei analoge Kanäle mit einem Wertebereich von 0 V bis 10 V. Weshalb sich Thermokon kein EEP dafür hat reservieren lassen, ist mir unverständlich. Ich habe das Sensorprofil mit den Attributen subtype = manufProfile und manufID = 002 nun auch als Aktorprofil bereitgestellt. Einfach ein Device mit
define <name> EnOcean J5-3F-7F
einrichten.
Die Testversion des Moduls 10_EnOcean steht mit den Ergänzungen nun zur Verfügung, siehe Anhang.
Hallo und Danke für die Umsetzung... Das funktioniert soweit mit 0-10V. Wäre es möglich scaleMin und scaleMax da noch mit unterzubringen, um eine Ansteuerung von 0-100 % zu ermöglichen?
Gruss Jan
Die Erweiterung inkl. der Skalierung steht als Update zur Verfügung.
Danke, funktioniert wie gewünscht :-)
Gruss Jan