Hallo,
wenn ich bei mir ein Fenster öffne, wird ein timer gestartet, der nach 10 Minuten Alarm gibt, um das Fenster wieder zu schließen. Diese Zeit soll jedoch verändert werden, je nach Außentemperatur. Dazu habe ich mir einen Dummy angelegt, in der die zu ändernde Zeit steht. Das soll ein modify erledigen. Ja bloß wie? Modify erwartet leider ein Zeitangabe, keinen dummy(variable).
fensterkontakt_Fenster:opened
delete kontakt_Fenster_timer;
define kontakt_Fenster_timer at +00:00:10 set test_lamp on;
modify kontakt_Fenster_timer +test_time;
Das ist wahrscheinlich wieder mal ganz einfach, bloß ich komme nicht drauf.
Viele Grüße matt_matt
Mit ReadingsVal() bzw. Value() kannsr du den Wert des Dummies auslesen (Perl specials in der commandref)
Hi,
Zitat von: matt_matt am 17 April 2017, 18:53:35
wenn ich bei mir ein Fenster öffne... Alarm , je nach Außentemperatur.
ich mache es genau andersrum, da interessiert weder die Außentemp, noch die Zeit.
Wenn ich ein Fenster öffne und die Innentemperatur sinkt unter 17 Grad, dann gibt es einen Alarm.
Gruß
Hi,
angenommen, test_time ist ein Dummy und das Reading state enthält die Zeit im richtigen Format, dann könnte das hier klappen:
fensterkontakt_Fenster:opened defmod kontakt_Fenster_timer at +[test_time:state] set test_lamp on
Gruß,
Thorsten
Hallo,
mit Value() klappt es. Da habe ich mal wieder ewig rumgemurkelt, dabei war die Lösung so einfach. Es sieht jetzt so aus:
fensterkontakt_Fenster:opened
delete kontakt_Fenster_timer;
define kontakt_Fenster_timer at +00:00:50 set test_lamp on;
modify kontakt_Fenster_timer +{Value("test_time")};
Gruß matt_matt
Hallo,
habe gerade die Variante mit defmod getestet. Das geht nicht, im Logfile steht "Wrong timespec [test_time:state]: either HH:MM:SS or {perlcode}".
Eine mir wohlbekannte Fehlermeldung. :(
Gruß matt_matt
Hi,
ah, dann funktioniert diese Art der Ersetzung nicht an dieser Stelle. Ist Dein FHEM auf dem neusten Stand? D.h. wann war Dein letztes update?
Ansonsten halt so:
fensterkontakt_Fenster:opened defmod kontakt_Fenster_timer at +{Value("test_time")} set test_lamp on
...wobei mir das Value() immer etwas suspekt ist. Genau genommen macht es glaube ich etwas anderes, als die meisten glauben. Sauberer ist meiner Meinung nach so:
fensterkontakt_Fenster:opened defmod kontakt_Fenster_timer at +{ReadingsVal("test_time","state","00:10:00")} set test_lamp on
Gruß,
Thorsten
Bin gerade unterwegs. Schau mal ob Du damit was anfangen kannst. Ich verwende eine 99_myUtils mit dem hier im Forum bekannten Code und dieser Erweiterung
#Holen von weiteren Attributen, sofern vorhanden:
my $waittime;
my $devtimer2;
if( ReadingsVal("TempFeuchtSensorAussen","temperature","-1") > 5 ) {
#Zeit, nach der die Meldung ausgegeben werden soll
#Default sind 10 Minuten, falls nicht angegeben
$waittime = AttrVal($dev,'winOpenTimer','00:20:00');
#Zeit für die Folge-Meldungen, sofern abweichend angegeben
#Default ist die normale Zeit, die oben schon ermittelt wurde
$devtimer2 = AttrVal($dev,'winOpenTimer2',$waittime);
}
elsif( ReadingsVal("TempFeuchtSensorAussen","temperature","-1") > -3 ) {
$waittime = sec2time(time2sec(AttrVal($dev,'winOpenTimer','00:20:00')) /2 );
$devtimer2 = sec2time(time2sec(AttrVal($dev,'winOpenTimer2',$waittime)) /2 );
} else {
$waittime = sec2time(time2sec(AttrVal($dev,'winOpenTimer','00:20:00')) /3 );
$devtimer2 = sec2time(time2sec(AttrVal($dev,'winOpenTimer2',$waittime)) /3 );
}
#Ein eventuell definierter "schöner" Name für das Device, der in der Meldung ausgegeben werden soll.
#Ist der nicht angegeben, wird das Device-Alias genommen, fehlt auch das, wir einfach der
#device-Name genommen.
Bin gerade Unterwegs daher kurz.
Das ganze ist in Abhängigkeit der Aussentemperatur.
Zitat von: Thorsten Pferdekaemper am 18 April 2017, 15:38:13
...wobei mir das Value() immer etwas suspekt ist. Genau genommen macht es glaube ich etwas anderes, als die moisten glauben.
Value liest STATE aus, also das Internal. Dieses kann man ja auch mit einem Attribut manipulieren.
Zitat von: CoolTux am 18 April 2017, 15:45:37
Value liest STATE aus, also das Internal. Dieses kann man ja auch mit einem Attribut manipulieren.
Ja, das hatte ich gemeint. Für mich ist STATE kein "Wert des Devices" oder so etwas, sondern nur ein Internal, der zur Anzeige verwendet wird.
Gruß,
Thorsten
Hallo,
FHEM ist noch nicht auf dem neusten Stand, werde ich am Wochenende nachholen. Werde erst mal ReadingsVal() testen. Das Beispiel mit 99_myUtils scheint Interressant, aber erst mal einfache Lösungen. (Ich muss das ja auch verstehen :-\)
Grüße matt_matt
Hallo,
habe grade die Version mit ReadingsVal() getestet, sie funktioniert. Warum schreibt ihr defmod statt define? Die Erklärung aus der Referenz habe ich nicht verstanden. Ich muß mich jetzt mal schlau machen.
Grüße matt_matt
Die Antwort auf Deine Frage findest Du hier
https://fhem.de/commandref_DE.html#define
einmal define durchlesen und dann gleich darunter defmode
Ganz kurz gesagt: defmod erledigt Dein delete/define/modify in einem.
Gruß,
Thorsten