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