Hallo zusammen,
wie kann ich mir z.B at's alle 5/2 min automatisch in Abhängigkeit von Dummywerten erzeugen lassen?
Habe
- dummy startzeit -> "9"
- dummy endzeit -> "18"
- dummy action -> "on"
Sofern action = on ist und es zwischen 9 - 18 Uhr ist, sollte ein at automatisch erzeugt werden.
Momentan habe ich immer die at's im system unabhängig von den dummywerten.
Vielleicht hat da jemand eine Idee für mich?
Kann man eigentlich ein notify auf $hour setzen?
Oder könnte man disabledForIntervals mit den dummywerte setzen?
Grüße
Thomas
Hi,
ich fange mal von hinten an:
ZitatIf parts of the attribute value are enclosed in {}, they are evaluated:
{sunset_abs()}-24 {sunrise_abs()}-08
könnte also so gehen, ich habe es nicht getestet
attr DeinAt disabledForIntervals {ReadingsVal("DeinDummy","Startzeit","09")}-{ReadingsVal("DeinDummy","Endzeit","18")}
Ein Notify reagiert auf einen Event. $hour ist kein Event. Sicher kannst Du irgendwie einen Event erzeugen wenn die Stunde wechselt, darauf könnte ein notify reagieren.
Zu Deiner einleitenden Frage habe ich keinen Ansatz, bzw. habe ich es nicht ganz verstanden.
Es wird sicher mit Dummy, notify und at ziemlich komplex. Ich würde da eher eine Lösung mit DOIF angehen.
Gruß Otto
Wenn Du nicht auf at fixiert bist, versuche DOIF.
Dann benötigst Du keine extra Dummys, sondern die Widgets sind im DOIF integriert.
Für den Import mit Raw definition
defmod IntervallTimer DOIF ([[$SELF:startzeit]-[$SELF:endezeit],+[$SELF:intervall]] and [$SELF:action] eq "on") {Log3 "$SELF", 1, "$SELF: Intervall"}
attr IntervallTimer do always
attr IntervallTimer readingList startzeit endezeit action intervall
attr IntervallTimer room 0_Test
attr IntervallTimer setList startzeit:time endezeit:time action:on,off intervall:300,150
attr IntervallTimer webCmd startzeit:endezeit:action:intervall
attr IntervallTimer webCmdLabel Start\
:Ende\
:Action\
:Intervall
setstate IntervallTimer initialized
setstate IntervallTimer 2019-05-04 19:48:45 action on
setstate IntervallTimer 2019-05-04 19:53:28 cmd 0
setstate IntervallTimer 2019-05-04 19:34:59 endezeit 20:00
setstate IntervallTimer 2019-05-04 19:48:32 intervall 150
setstate IntervallTimer 2019-05-04 19:53:28 mode enabled
setstate IntervallTimer 2019-05-04 19:30:31 startzeit 12:00
setstate IntervallTimer 2019-05-04 19:53:28 state initialized
Im Frontend kann es aussehen, wie in der Anlage dargestellt.
Zitatattr DeinAt disabledForIntervals {ReadingsVal("DeinDummy","Startzeit","09")}-{ReadingsVal("DeinDummy","Endzeit","18")}
Danke Otto, habe die Zeiten umgedreht, da es im Intervall nicht pausiert werden soll. Hat aber leider bei mir mit
attr poolsolarpumpe_anschalten disabledForIntervals {ReadingsVal("solarpumpe_zeit_bis","state",0)}-{ReadingsVal("solarpumpe_zeit_ab","state",0)}
nicht geklappt
@Ellert: Danke für den Code. Werde ich mir anschauen und versuchen zu verstehen :-)
EDIT:Nach dem Import bekomme ich diese Meldungen zu Readings:
setstate IntervallTimer 2019-05-04 20:52:46 timer_01_c01 error: Wrong timespec : either HH:MM:SS or {perlcode}
setstate IntervallTimer 2019-05-04 20:52:46 timer_02_c01 error: Wrong timespec : either HH:MM:SS or {perlcode}
Ja klar, das mit den Zeiten habe ich dann mal falsch angesetzt. ::)
Ich liebe solche Aussagen: "Es hat nicht geklappt..." Was ist das für eine Fehlerbeschreibung? :'(
Du hast noch selbstständig ein bisschen in der Doku gelesen?
ZitatTo specify an interval spawning midnight, you have to specify two intervals, e.g.:
23:00-24:00 00:00-01:00
Also dann so:
attr poolsolarpumpe_anschalten disabledForIntervals {ReadingsVal("solarpumpe_zeit_bis","state",0)}-24 00-{ReadingsVal("solarpumpe_zeit_ab","state",0)}
Gruß Otto
Hi Otto,
das Problem lag bei mir darin, dass in solarpumpe_zeit_* jeweils nur 9 bzw. 18 und nicht 09:00 bzw. 18:00 Uhr drinstehen
Zitatch liebe solche Aussagen: "Es hat nicht geklappt..." Was ist das für eine Fehlerbeschreibung?
--> Das at wurde halt nicht deaktiviert. ;)
Ok - in der Doku steht aber nicht, dass das Format 12:00 sein muss sondern das es 00 sein muss.
Hast Du anstatt 9 mal 09 probiert?
Du könntest es so mit einer führenden Null erzeugen:
{sprintf("%02.0f", ReadingsVal("solarpumpe_zeit_bis","state",0))}
Zitat von: tklein am 04 Mai 2019, 20:49:27
Danke Otto, habe die Zeiten umgedreht, da es im Intervall nicht pausiert werden soll. Hat aber leider bei mir mit
attr poolsolarpumpe_anschalten disabledForIntervals {ReadingsVal("solarpumpe_zeit_bis","state",0)}-{ReadingsVal("solarpumpe_zeit_ab","state",0)}
nicht geklappt
@Ellert: Danke für den Code. Werde ich mir anschauen und versuchen zu verstehen :-)
EDIT:
Nach dem Import bekomme ich diese Meldungen zu Readings:
setstate IntervallTimer 2019-05-04 20:52:46 timer_01_c01 error: Wrong timespec : either HH:MM:SS or {perlcode}
setstate IntervallTimer 2019-05-04 20:52:46 timer_02_c01 error: Wrong timespec : either HH:MM:SS or {perlcode}
Dann setze die Parameter übers Frontend neu oder Du hast eine alte DOIF Version.
Hi Ellert,
habe aktuell $Id: 98_DOIF.pm 18890 2019-03-13 18:56:41Z Damian $
SO wie es aussieht, habe ich die Initialisierung nicht richtig hinbekommen.
@Otto
Ich werde die Werte im Dummy mit der führenden 0 anlegen (08,09...) sonst habe ich mit der sprintf variante glaube ich ein problem wenn ich auf 10 + wechsel.
@all: Vielen Dank für eure erneuten schnellen und wertvollen Tips.
Nein hast Du nicht. Probier es in der FHEM Kommandozeile einfach aus: ;)
{sprintf("%02.0f", "12")}
du hast mal wieder recht. :-)
Hätte ich ja auch mal selber probieren können. Da erkennt man den "Wochenend-Fhemler".
Besten Dank
mhmm
...
attr Dachpumpe_aus disable 0
attr Dachpumpe_aus disabledForIntervals {sprintf("%02.0f", ReadingsVal("dachpumpe_zeit_bis","state",0))}-24 00-{sprintf("%02.0f", ReadingsVal("dachpumpe_zeit_ab","state",0))
attr Dachpumpe_aus room Pool,Zeitsteuerung
setstate Dachpumpe_aus disabled
setstate Dachpumpe_aus 2019-05-05 12:34:22 state disabled
jetzt habe ich da ein state disable drin, obwohl das at aktiv sein sollte nachdem ich ein "execNow" ausgeführt hatte
Was bekommst Du denn zurück, wenn Du das in der FHEM Kommandozeile testest?
{sprintf("%02.0f", ReadingsVal("dachpumpe_zeit_bis","state",0))}
Sehe gerade, da fehlte die letzte }
attr Dachpumpe_aus disabledForIntervals {sprintf("%02.0f", ReadingsVal("dachpumpe_zeit_bis","state",0))}-24 00-{sprintf("%02.0f", ReadingsVal("dachpumpe_zeit_ab","state",0))}
die fehlende Klammer habe ich ergänzt, leider ohne Änderung.
Die jeweiligen Werte 09 und 19 werden mit
{sprintf("%02.0f", ReadingsVal("dachpumpe_zeit_bis","state",0))}
bzw.
{sprintf("%02.0f", ReadingsVal("dachpumpe_zeit_ab","state",0))}
ausgegeben.
Bei Eingabe von {foo()} in der Kommandozeile liefert meine Testfunktion
sub foo() {
return {sprintf("%02.0f", ReadingsVal("dachpumpe_zeit_bis","state",0))} . "-24 00-" . {sprintf("%02.0f", ReadingsVal("dachpumpe_zeit_ab","state",0))};
}
folgendes: HASH(0x90e7d20)-24 00-HASH(0x8a13058)
komplett verwirrt..
um die Verwirrung zu toppen kann ich jetzt sagen, dass das at nun ausgeführt wird ?!?
setstate Dachpumpe_aus Next: 13:14:22
setstate Dachpumpe_aus 2019-05-05 13:12:22 state Next: 13:14:22
Werde das mal genau beobachten und erstmal in die anderen at einbauen.
Deine Funktion müsstest Du so machen
{return sprintf("%02.0f", "9") . "-24 00-" . sprintf("%02.0f", "19")}
:)
d. h, dass ich im sprintf kein ReadingsVal() ausführen kann. Eine Variable $dachpumpe_zeit_bis ging auch nicht anstelle "19"-
Nein Sorry, war mein kurzer Test: Du darfst keine {} um die sprintf() machen.
Also {return sprintf()} und nicht {return {sprintf()}}
Im sprintf ist der zweite Ausdruck deine Perlfunktion ReadingsVal(). In meinem Beispiel ist der String "19" die Perlfunktion - anstatt ReadingsVal().
Ich habe ja Deine Readings nicht und war zu faul das nachzubauen. ;)