timer mit modify verändern

Begonnen von matt_matt, 17 April 2017, 18:53:35

Vorheriges Thema - Nächstes Thema

matt_matt

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




KernSani

Mit ReadingsVal() bzw. Value() kannsr du den Wert des Dummies auslesen (Perl specials in der commandref)
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

bergadler

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ß
aktuelles FHEM auf Raspberry B+, FHEM von fhem.de V.5.7, CUL868 V1.57, (6x FHT80B+ FHTTK, div. IT,div. FS20,Harmony Hub)

Thorsten Pferdekaemper

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
FUIP

matt_matt

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

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

Thorsten Pferdekaemper

#6
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
FUIP

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Thorsten Pferdekaemper

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
FUIP

matt_matt

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

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

CoolTux

Die Antwort auf Deine Frage findest Du hier

https://fhem.de/commandref_DE.html#define

einmal define durchlesen und dann gleich darunter defmode
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Thorsten Pferdekaemper

Ganz kurz gesagt: defmod erledigt Dein delete/define/modify in einem.
Gruß,
   Thorsten
FUIP