PWMR und Aktoren via ModbusAttr Device

Begonnen von Mike73, 01 Februar 2018, 16:35:32

Vorheriges Thema - Nächstes Thema

Mike73

Hallo zusammen,

ich habe gerade erfolgreich die ersten Heizkreise meiner Fußbodenheizung mit den Modulen PWM / PWMR konfiguriert. Nach leichten Startschwierigkeiten und viel Wiki und commandref läuft das jetzt schon gut.
Ich habe aber einige Heizkreise, deren Aktoren über Modbus ( ModbusAttr ) angebunden sind. Hier funktioniert die Steuerung leider nicht durch einfaches Zuweisen des Devices, auf das dann zum Schalten ein "set <device> on" gemacht werden könnte. Man muss zusätzlich das zu setzende Reading angeben. Korrekt heißt das dann in meinem Falle "set HKVEG1 HK1 on". 

ModbusAttr-Device für den Heizkreisverteiler // nur den HK1 beispielshalber

defmod HKVEG1 ModbusAttr 7 10 192.168.3.14:502 TCP
attr HKVEG1 dev-c-combine 8
attr HKVEG1 dev-c-defPoll 1

attr HKVEG1 obj-c8-reading HK1
attr HKVEG1 obj-c8-map 0:off,1:on



Ich habe das Modul ergänzt, so dass die Angabe eines Readings zum Aktor möglich ist.

Das Reading wird durch # getrennt direkt nach dem Aktor, ggf. vor dem :<a_regexp_on> , angegeben. Über das Trennzeichen kann man sich streiten, vielleicht gibts noch was Geeigneteres.

In den Funktionen PWMR_Define und PWMR_SetRoom funktioniert das unabhängig vom Typ des Aktor-Devices.  In PWMR_ReadRoom muss auf den Device-Typ abgestellt werden, um den korrekten State-Wert zu bekommen.

Das Define lautet dann in meinem Beispiel :
define myPWMR PWMR fh 1 T_EG_KUE HKVEG1#HK1 dummy




diff C3wB C:/Documents and Settings/Mike/My Documents/temp_fhem/93_PWMR.pm.orig C:/Documents and Settings/Mike/My Documents/temp_fhem/93_PWMR.pm
*** C:/Documents and Settings/Mike/My Documents/temp_fhem/93_PWMR.pm.orig Thu Feb 01 16:03:04 2018
--- C:/Documents and Settings/Mike/My Documents/temp_fhem/93_PWMR.pm Thu Feb 01 15:30:10 2018
***************
*** 46,51 ****
--- 46,52 ----
  # 14.12.16 GA add implement get previousTemps
  # 01.08.17 GA add documentation for attribute disable
  # 27.12.17 GA add handle "off" as c_tempFrostProtect and "on" as c_tempC in getDesiredTempFrom (valid form Homematic)
+ # 01.02.18 mwue added support for ModbusAttr actors
 
 
  # module for PWM (Pulse Width Modulation) calculation
***************
*** 531,537 ****
 
    my $name = $hash->{NAME};
 
!   return "syntax: define <name> PWMR <IODev> <factor[,offset]> <tsensor[:reading[:t_regexp]]> <actor>[:<a_regexp_on>] [<window|dummy>[,<window>][:<w_regexp>]] ".
           "[<usePID=0>]|".
           "[<usePID=1>:<PFactor>:<IFactor>[,<ILookBackCnt>]:<DFactor>[,<DLookBackCnt>]]|".
           "[<usePID=2>:<PFactor>:<IFactor>:<DFactor>[,<DLookBackCnt>]]"
--- 532,538 ----
 
    my $name = $hash->{NAME};
 
!   return "syntax: define <name> PWMR <IODev> <factor[,offset]> <tsensor[:reading[:t_regexp]]> <actor>[#areading][:<a_regexp_on>] [<window|dummy>[,<window>][:<w_regexp>]] ".
           "[<usePID=0>]|".
           "[<usePID=1>:<PFactor>:<IFactor>[,<ILookBackCnt>]:<DFactor>[,<DLookBackCnt>]]|".
           "[<usePID=2>:<PFactor>:<IFactor>:<DFactor>[,<DLookBackCnt>]]"
***************
*** 786,791 ****
--- 787,795 ----
    # check actor
 
    my ($tactor, $a_regexp_on) = split (":", $actor, 2);
+   my $areading;
+   ($tactor, $areading) = split ("#", $tactor, 2);
+   
   
    $a_regexp_on = "on" unless defined ($a_regexp_on);
 
***************
*** 799,804 ****
--- 803,809 ----
    }
 
    $hash->{actor}       = $tactor;
+   $hash->{areading}    = $areading;
    $hash->{a_regexp_on} = $a_regexp_on;
    #$hash->{actorState}  = "unknown";
 
***************
*** 888,896 ****
 
    if ($room->{actor})
    {
!     my $ret = fhem sprintf ("set %s %s", $room->{actor}, $newState);
      if (!defined($ret)) {    # sucessfull
!       Log3 ($room, 2, "PWMR_SetRoom $room->{NAME}: set $room->{actor} $newState");
         
        #$room->{actorState}                 = $newState;
 
--- 893,902 ----
 
    if ($room->{actor})
    {
! my $act_reading = ($room->{areading})?$room->{areading}:"";
!     my $ret = fhem sprintf ("set %s %s %s", $room->{actor}, $act_reading, $newState);
      if (!defined($ret)) {    # sucessfull
!       Log3 ($room, 2, "PWMR_SetRoom $room->{NAME}: set $room->{actor} $act_reading $newState");
         
        #$room->{actorState}                 = $newState;
 
***************
*** 902,908 ****
        DoTrigger($name, undef);
 
      } else {
!       Log3 ($room, 2, "PWMR_SetRoom $name: set $room->{actor} $newState failed ($ret)");
      }
 
    }
--- 908,914 ----
        DoTrigger($name, undef);
 
      } else {
!       Log3 ($room, 2, "PWMR_SetRoom $name: set $room->{actor} $act_reading $newState failed ($ret)");
      }
 
    }
***************
*** 953,958 ****
--- 959,966 ----
      # starting from 26.01.2013 -> try to read act status .. (may also be invalid if struct)
      if ($defs{$room->{actor}}->{TYPE} eq "RBRelais") {
        $actorV =  $defs{$room->{actor}}->{STATE};
+ } elsif ( $room->{areading} && $defs{$room->{actor}}->{TYPE} eq "ModbusAttr") {
+   $actorV =  $defs{$room->{actor}}->{READINGS}{$room->{areading}}{VAL};
      } elsif (defined($defs{$room->{actor}}->{STATE})) {
        $actorV =  $defs{$room->{actor}}->{STATE};
      } else {


Was haltet ihr davon? Ist das allgemein ne brauchbare Ergänzung?


Grüße

Mike