Hallo ,
Wie und was muss ich machen wenn ich die ventilpositionen von mehreren max Thermostaten abfragen möchte . Das wenn ein Thermostat aufmacht die Pumpe anläuft .
Wer kann mir helfen ?
Gruß
Wendelin
Das Regexp passend wählen.
Du willst mehr Hilfe?
Dann liefer mehr Infos.
Edith: Oder anders gesagt - du definierst dir ein notify (oder DOIF) das als Regexp die Ventilposition aller deiner Thermostate beinhaltet und somit auf diese triggert.
Im weiteren Code legst du dann fest was wann passieren soll.
Beispiel von meiner FHT und HM-Mischung:
.*_Heizung:actuator.* {
Die Geräte mit der relevanten Ventilposition heissen alle irgendwas_Heizung und das Reading heisst actuator.
Edith1: Um das notify nicht immer zu triggern wenn die Ventilposition gesendet wird habe ich an jedem Thermostaten (resp. Channel bei HM) das attribut event-on-change-reading passend gesetzt.
So wird das notify nur getriggert wenn sich die Ventilposition ändert.
Weiters stelle ich das notify mit dem Attribut disable auf 1 wenn ich "das Haus" in den Sommermodus setze.
Ergänzend sagt meine Glaskugel noch:
Evtl. könnte auch das Modul Valves für Dich interessant sein; das macht aus allen eine virtuelle Zusammenfassung, wobei Du die Gewichtung beinflussen kannst.
Kommt aber auf den usecase an, ansonsten ist die regex-Frage vorrangig zu bearbeiten...
Gruß, Beta-User
Hab jetzt folgendes eingestellt, aber irgendwie funktioniert das nicht so richtig
defmod Pumpe_A DOIF (["^MAX:^valveposition"]> 0 ) (set HMW_IO_12_Sw7_DR_LEQ0117043_19 on) DOELSE (set HMW_IO_12_Sw7_DR_LEQ0117043_19 off)
Zitat von: wendeling am 05 Mai 2017, 23:03:42
Hab jetzt folgendes eingestellt, aber irgendwie funktioniert das nicht so richtig
defmod Pumpe_A DOIF (["^MAX:^valveposition"]> 0 ) (set HMW_IO_12_Sw7_DR_LEQ0117043_19 on) DOELSE (set HMW_IO_12_Sw7_DR_LEQ0117043_19 off)
defmod Pumpe_A DOIF (["^MAX:^valveposition",0]> 0 ) (set HMW_IO_12_Sw7_DR_LEQ0117043_19 on) DOELSE (set HMW_IO_12_Sw7_DR_LEQ0117043_19 off)
In welchen Zyklen wird Doif ausgeführt ?
Wenn die Bedingung nicht erfüllt ist wird doch doelse ausgeführt , oder ?
Aber das funktioniert nicht !
Zitat von: wendeling am 05 Mai 2017, 23:21:43
In welchen Zyklen wird Doif ausgeführt ?
Wenn die Bedingung nicht erfüllt ist wird doch doelse ausgeführt , oder ?
Aber das funktioniert nicht !
DOIF arbeitet nicht mit Zyklen, sondern ereignisgesteuert. Dein DOELSE-Fall sollte kommen, wenn das passende Event kommt und die Angabe hinter dem Doppelpunkt Null ist.
Zitat von: Damian am 05 Mai 2017, 23:19:49
defmod Pumpe_A DOIF (["^MAX:^valveposition",0]> 0 ) (set HMW_IO_12_Sw7_DR_LEQ0117043_19 on) DOELSE (set HMW_IO_12_Sw7_DR_LEQ0117043_19 off)
Würde das nicht die Pumpe abschalten, sobald auch nur ein Ventil zugeht? Ich glaube nicht, dass es so gewünscht ist.
Gruß,
Thorsten
Zitat von: Thorsten Pferdekaemper am 06 Mai 2017, 08:02:56
Würde das nicht die Pumpe abschalten, sobald auch nur ein Ventil zugeht? Ich glaube nicht, dass es so gewünscht ist.
Gruß,
Thorsten
ja, dafür gibt es neuerdings die Aggregationsfunktion, siehe https://fhem.de/commandref_DE.html#DOIF_aggregation
hier also:
defmod Pumpe_A DOIF ([#"^MAX:^valveposition":valveposition:$number >0] > 0 ) (set HMW_IO_12_Sw7_DR_LEQ0117043_19 on) DOELSE (set HMW_IO_12_Sw7_DR_LEQ0117043_19 off)
Übersetzt heißt das, wenn das passende Event zu "^MAX:^valveposition" kommt, werden alle Devices im System gezählt, die zu "^Max" passen und im Reading "valveposition" ein Wert größer 0 haben. Wenn deren Anzahl größer Null ist, wird auf on geschaltet ansonsten auf off.
Das widerspricht jetzt aber Deiner eigenen Doku. MAX sollte den Maximalwert und nicht die Anzahl zurückgeben, oder?
Gruß,
Thorsten
Zitat von: Thorsten Pferdekaemper am 06 Mai 2017, 09:17:41
Das widerspricht jetzt aber Deiner eigenen Doku. MAX sollte den Maximalwert und nicht die Anzahl zurückgeben, oder?
Gruß,
Thorsten
Dann hast du nicht genau gelesen.
Du meinst die Aggregationsfunktion
#max, hier ist aber nur die Zählfunktion
# angegeben. In Anführungszeichen wird die Regex für das Device angegeben und hier waren offenbar die Max-Devices "^Max" gewünscht. ;)
Aaaaargh...
Funktioniert leider nicht 😪
DeviceOverview
Pumpe_HK
initialized
Pumpe_HK Internals
CFGFN
DEF
NAME
Pumpe_HK
NR
65367
NTFY_ORDER
50-Pumpe_A1
STATE
initialized
TYPE
DOIF
Readings
cmd
0
2017-05-06 18:43:41
state
initialized
2017-05-06 18:43:41
timer_01_c01
error: Wrong timespec #"^MAX:^valveposition":valveposition:$number>0: either HH:MM:SS or {perlcode}
Hast du auch die aktuelle Version von DOIF?
Wie überprüfe ich das und wie hole ich mir die neue ?
Gruß
Wendelin
Per FHEM-Update hat man sie automatisch.
mit "Version DOIF.pm" in der Kommandozeile siehst du deine Version.
Die aktuelle lautet:
# $Id: 98_DOIF.pm 14112 2017-04-26 16:09:48Z Damian $#
Habe jetzt letzte Version , aber dennoch das gleiche Problem
Zitat von: wendeling am 06 Mai 2017, 22:00:51
Habe jetzt letzte Version , aber dennoch das gleiche Problem
tja, dann machst du wohl etwas falsch.
ich kann bei mir das Beispiel:
defmod Pumpe_A DOIF ([#"^MAX:^valveposition":valveposition:$number >0] > 0 ) (set HMW_IO_12_Sw7_DR_LEQ0117043_19 on) DOELSE (set HMW_IO_12_Sw7_DR_LEQ0117043_19 off)
mit copy und paste über die Kommandozeile ohne Probleme definieren.
Hab ich gemacht , gleiche Problem!
Was ist das mit der Zeit ?
error: Wrong timespec #"^MAX:^valveposition":valveposition:$number>0: either HH:MM:SS or {perlcode}
Hi,
zeig am Besten mal ein list Deines DOIF.
Gruß,
Thorsten
Internals:
CFGFN
DEF ([#"^MAX:^valveposition":valveposition:$number >0] > 0 ) (set HMW_IO_12_Sw7_DR_LEQ0117043_19 on) DOELSE (set HMW_IO_12_Sw7_DR_LEQ0117043_19 off)
NAME Pumpe_A
NR 75266
NTFY_ORDER 50-Pumpe_A
STATE initialized
TYPE DOIF
Readings:
2017-05-06 22:58:34 cmd 0
2017-05-06 22:58:34 state initialized
2017-05-06 22:58:34 timer_01_c01 error: Wrong timespec #"^MAX:^valveposition":valveposition:$number>0: either HH:MM:SS or {perlcode}
Condition:
0 DOIF_time_once($hash,0,$wday) > 0
Devices:
Do:
0:
0 set HMW_IO_12_Sw7_DR_LEQ0117043_19 on
1:
0 set HMW_IO_12_Sw7_DR_LEQ0117043_19 off
Helper:
globalinit 1
last_timer 1
sleeptimer -1
Itimer:
Localtime:
Regexp:
State:
Time:
0 #"^MAX:^valveposition":valveposition:$number>0
Timecond:
0 0
Timer:
0 0
Timers:
0 0
Attributes:
room KG Heizung
und jetzt noch mal Output von "Version DOIF.pm"
98_DOIF.pm 14112 2017-04-26 16:09:48Z Damian
Zitat von: wendeling am 07 Mai 2017, 08:19:16
98_DOIF.pm 14112 2017-04-26 16:09:48Z Damian
Hast du das System durchgestartet? So verhält sich eigentlich nur das alte Modul. So sieht bei mir die Definition mit der obigen Version aus:
Internals:
CFGFN
DEF ([#"^MAX:^valveposition":valveposition:$number >0] > 0 ) (set HMW_IO_12_Sw7_DR_LEQ0117043_19 on) DOELSE (set HMW_IO_12_Sw7_DR_LEQ0117043_19 off)
NAME Pumpe_A
NR 501
NTFY_ORDER 50-Pumpe_A
STATE initialized
TYPE DOIF
Readings:
2017-05-07 08:28:21 cmd 0
2017-05-07 08:28:21 state initialized
Condition:
0 AggregateDoIf($hash,'#','^MAX','valveposition','$number >0') > 0
Devices:
Do:
0:
0 set HMW_IO_12_Sw7_DR_LEQ0117043_19 on
1:
0 set HMW_IO_12_Sw7_DR_LEQ0117043_19 off
Helper:
globalinit 1
last_timer 0
sleeptimer -1
Itimer:
Regexp:
0:
0 ^MAX:^valveposition
All:
0 ^MAX:^valveposition
State:
State:
Attributes:
Unter "Condition" ist die neue Aggregationsfunktion zu sehen.
!!!! Genau das war mein Fehler !!!!!
Jetzt funktioniert es super !
Vielen lieben Dank an die Spezialisten !!
Danke
Gruß
Wendelin
Zitat von: wendeling am 07 Mai 2017, 13:49:30
!!!! Genau das war mein Fehler !!!!!
Jetzt funktioniert es super !
Vielen lieben Dank an die Spezialisten !!
Danke
Gruß
Wendelin
Dann teste es ausgiebig. Dieser Fall ist ein typischer Anwendungsfall für die Steuerung einer Umwälzpumpe abhängig der Ventil-Öffnungen. Wenn es sich bewährt, werde ich es als Beispiel in die Commandref zu DOIF aufnehmen. Jede andere Lösung des Problems dürfte mehr als eine Definitionszeile brauchen ;)
Mach ich , und Danke noch einmal .
Habe jetzt sogar ein zweites mit alias Name , und das funktioniert genauso
Gut
Gruß
Wendelin