FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: tklein am 04 Mai 2019, 18:35:31

Titel: [gelöst] Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: tklein am 04 Mai 2019, 18:35:31
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
Titel: Antw:Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: Otto123 am 04 Mai 2019, 19:40:35
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
Titel: Antw:Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: Ellert am 04 Mai 2019, 19:58:21
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.
Titel: Antw:Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: tklein am 04 Mai 2019, 20:49:27
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}
Titel: Antw:Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: Otto123 am 04 Mai 2019, 21:09:09
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
Titel: Antw:Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: tklein am 04 Mai 2019, 21:21:51
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.  ;)
Titel: Antw:Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: Otto123 am 04 Mai 2019, 22:25:18
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))}
Titel: Antw:Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: Ellert am 04 Mai 2019, 23:13:06
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.
Titel: Antw:Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: tklein am 04 Mai 2019, 23:46:53
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.
Titel: Antw:[gelöst] Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: Otto123 am 05 Mai 2019, 00:11:13
Nein hast Du nicht. Probier es in der FHEM Kommandozeile einfach aus:  ;)
{sprintf("%02.0f", "12")}
Titel: Antw:[gelöst] Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: tklein am 05 Mai 2019, 11:35:29
du hast mal wieder recht. :-)

Hätte ich ja auch mal selber probieren können. Da erkennt man den "Wochenend-Fhemler".

Besten Dank
Titel: Antw:[gelöst] Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: tklein am 05 Mai 2019, 12:40:06
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
Titel: Antw:[gelöst] Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: Otto123 am 05 Mai 2019, 12:46:57
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))}
Titel: Antw:[gelöst] Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: tklein am 05 Mai 2019, 13:08:45
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..
Titel: Antw:[gelöst] Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: tklein am 05 Mai 2019, 13:14:10
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.
Titel: Antw:[gelöst] Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: Otto123 am 05 Mai 2019, 13:17:54
Deine Funktion müsstest Du so machen
{return sprintf("%02.0f", "9") . "-24 00-" . sprintf("%02.0f", "19")}:)
Titel: Antw:[gelöst] Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: tklein am 05 Mai 2019, 13:48:43
d. h, dass ich im sprintf kein ReadingsVal() ausführen kann. Eine Variable $dachpumpe_zeit_bis ging auch nicht anstelle "19"-
Titel: Antw:[gelöst] Automatisch at-Erzeugung je nach dummywert wie möglich?
Beitrag von: Otto123 am 05 Mai 2019, 14:07:43
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. ;)