Thermokon SRC-AO V - Analog Aktor

Begonnen von JF Mennedy, 23 Oktober 2022, 14:48:41

Vorheriges Thema - Nächstes Thema

JF Mennedy

Hallo,

wie schon im dem Thread 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

klaus.schauer

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.


JF Mennedy

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

klaus.schauer

Die Erweiterung inkl. der Skalierung steht als Update zur Verfügung.

JF Mennedy

Danke, funktioniert wie gewünscht :-)

Gruss Jan