Hallo,
ich habe folgende (einwandfrei funktionierende) Definition:
+*00:00:30 {
my $vlist = ReadingsVal("DS18B20_VorlaufHK","temperature","0");
my $hysterese = 1;
my $vlsoll = calcVL();
if ($vlist < $vlsoll-$hysterese)
{
# waermer
fhem "
set HMW_IO_12_Sw7_DR_LEQ0016352_13 off;
set HMW_IO_12_Sw7_DR_LEQ0016352_14 on;
define wiederaus at +00:00:01 set HMW_IO_12_Sw7_DR_LEQ0016352_14 off;
attr wiederaus room Heizung;
set Heizung_VL_Soll $vlsoll;
"
}
elsif ($vlist > $vlsoll+$hysterese)
{
# kaelter
fhem "
set HMW_IO_12_Sw7_DR_LEQ0016352_14 off;
set HMW_IO_12_Sw7_DR_LEQ0016352_13 on;
define wiederaus at +00:00:01 set HMW_IO_12_Sw7_DR_LEQ0016352_13 off;
attr wiederaus room Heizung;
set Heizung_VL_Soll $vlsoll;
"
}
}
die beiden HMW schalten, das at wird angelegt und landet im raum "Heizung" - getestet habe ich das natürlich mit deutlich verlängerten Zeiten :-)
nach dem selben Schema habe ich dann eine zweite Definition angelegt:
+*00:01:00 {
if (ReadingsVal("DS18B20_KesselInSpeicher","temperature","0") < (calcVL())+10)
{
fhem "
set HMW_IO_12_Sw7_DR_LEQ0016352_15 on;
define istwarm at +02:00:00 set HMW_IO_12_Sw7_DR_LEQ0016352_15 off;
attr istwarm room Heizung;
"
}
}
der HMW_*_15 wird auch geschaltet, das at "istwarm" wird aber nicht angelegt. Habe ich einen Denkfehler?
Fhem Version ist Release : 5.7 FeatureLevel: 5.7 , letztes update vor ein paar Minuten.
Grüße
Stephan
und was steht im Logfile?
Auf den ersten Blick würde mich auch "0" stören, hat aber auf die Funktion/Nichtfunktion keine Einfluss.
PS und siehe betateilchen
Hi,
erwischt :-[
Hier ist das Log:
2016.01.07 17:07:36.501 5: exec at command Kessel_frei
2016.01.07 17:07:36.501 5: Cmd: >{
if (ReadingsVal("DS18B20_KesselInSpeicher","temperature","0") < (calcVL())+10)
{
fhem "
set HMW_IO_12_Sw7_DR_LEQ0016352_15 on;
define istwarm at +02:00:00 set HMW_IO_12_Sw7_DR_LEQ0016352_15 off;
attr istwarm room Heizung;
"
}
}<
2016.01.07 17:07:36.502 5: redefine at command Kessel_frei as +*00:01:00 {
if (ReadingsVal("DS18B20_KesselInSpeicher","temperature","0") < (calcVL())+10)
{
fhem "
set HMW_IO_12_Sw7_DR_LEQ0016352_15 on;
define istwarm at +02:00:00 set HMW_IO_12_Sw7_DR_LEQ0016352_15 off;
attr istwarm room Heizung;
"
}
}
2016.01.07 17:07:36.503 5: Triggering Kessel_frei (1 changes)
2016.01.07 17:07:36.503 5: Notify loop for Kessel_frei Next: 17:08:36
2016.01.07 17:07:36.504 5: Notify from Device: Kessel_frei recieved
2016.01.07 17:07:36.505 5: DbLog: logging of Device: Kessel_frei , Type: AT , Event: Next: 17:08:36 , Reading: Next , Value: 17:08:36 , Unit:
und wenn das "0" falsch ist, ändere ich es natürlich ab ...
Grüße
Stephan
und hier das log von dem funktionierenden, ich seh da keinen Unterschied ...
2016.01.07 17:07:59.338 5: exec at command changeVL
2016.01.07 17:07:59.339 5: Cmd: >{
my $vlist = ReadingsVal("DS18B20_VorlaufHK","temperature","0");
my $hysterese = 1;
my $vlsoll = calcVL();
if ($vlist < $vlsoll-$hysterese)
{
# waermer
fhem "
set HMW_IO_12_Sw7_DR_LEQ0016352_13 off;
set HMW_IO_12_Sw7_DR_LEQ0016352_14 on;
define wiederaus at +00:00:01 set HMW_IO_12_Sw7_DR_LEQ0016352_14 off;
attr wiederaus room Heizung;
set Heizung_VL_Soll $vlsoll;
"
}
elsif ($vlist > $vlsoll+$hysterese)
{
# kaelter
fhem "
set HMW_IO_12_Sw7_DR_LEQ0016352_14 off;
set HMW_IO_12_Sw7_DR_LEQ0016352_13 on;
define wiederaus at +00:00:01 set HMW_IO_12_Sw7_DR_LEQ0016352_13 off;
attr wiederaus room Heizung;
set Heizung_VL_Soll $vlsoll;
"
}
}<
2016.01.07 17:07:59.340 5: redefine at command changeVL as +*00:00:30 {
my $vlist = ReadingsVal("DS18B20_VorlaufHK","temperature","0");
my $hysterese = 1;
my $vlsoll = calcVL();
if ($vlist < $vlsoll-$hysterese)
{
# waermer
fhem "
set HMW_IO_12_Sw7_DR_LEQ0016352_13 off;
set HMW_IO_12_Sw7_DR_LEQ0016352_14 on;
define wiederaus at +00:00:01 set HMW_IO_12_Sw7_DR_LEQ0016352_14 off;
attr wiederaus room Heizung;
set Heizung_VL_Soll $vlsoll;
"
}
elsif ($vlist > $vlsoll+$hysterese)
{
# kaelter
fhem "
set HMW_IO_12_Sw7_DR_LEQ0016352_14 off;
set HMW_IO_12_Sw7_DR_LEQ0016352_13 on;
define wiederaus at +00:00:01 set HMW_IO_12_Sw7_DR_LEQ0016352_13 off;
attr wiederaus room Heizung;
set Heizung_VL_Soll $vlsoll;
"
}
}
2016.01.07 17:07:59.341 5: Triggering changeVL (1 changes)
2016.01.07 17:07:59.341 5: Notify loop for changeVL Next: 17:08:29
2016.01.07 17:07:59.342 5: Notify from Device: changeVL recieved
2016.01.07 17:07:59.343 5: DbLog: logging of Device: changeVL , Type: AT , Event: Next: 17:08:29 , Reading: Next , Value: 17:08:29 , Unit:
Leider funktioniert es immer noch nicht, trotz neuem anlegen des at ...
noch jemand eine Idee?
Grüße
Stephan
Die Klammerung ist seltsam:
( ... < (calcVL())+10)
Soll das vielleicht besser so aussehen (die 10 in die Klammer):
( ... < (calcVL()+10) )
Das ganze wird mit defmod sicherer, siehe commandref.
Solchen Code als Funktion in 99_myUtils.pm aufnehmen, dann bekommst du ggf. Übersetzungsfehler des Compilers gemeldet - spart viel Zeit.
@Deudi: Danke, das wars .
@Starkstrombastler: Danke für deinen Vorschlag, aber diese Funktionalität will ich in diesem speziellen Fall genau *nicht*, das AT soll nur ein mal gesetzt werden (und so bleiben), auch wenn die Funktion erneut aufgerufen wird.
@Dietmar: Ich werde deinen Tipp auf jeden Fall testen, dann hilft mir das vielleicht in Zukunft.
Mir ist nur eines nicht ganz klar: ich habe ja extra calcVL bereits ausgelagert. Wie sollte das ganze deiner Meinung nach aussehen, wenn noch mehr ausgelagert wird? Wäre super, wenn du mir ein Beispiel geben könntest, ich bin momentan der Meinung, dass das meine MyUtils mit Millionen Miniprogrammen füllen würde, und kann darin keinen Vorteil entdecken - ausser das mit dem Compilerfehler, natürlich.
Grüße
Stephan