FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: goerdi am 29 Januar 2016, 13:58:45

Titel: DOIF führt nur einmal den Befehl aus
Beitrag von: goerdi am 29 Januar 2016, 13:58:45
Hallo !

ich habe einen DOIF + DOIFELSE  um meine Heizungsregler auszuschalten (die Tage wars wieder mal warm genug das die Tags reagieren SOLLTEN :) (und das haben sie nicht wie gewünscht)

DOIF ([05:25-23:30] and [Aussensensor:temperature] < 13.0) (set hz.regler.*_clima controlMode auto, set hz.thermostat.*_climate controlMode auto) DOELSEIF ([05:25-23:30] and [Aussensensor:temperature] > 13.3) (set hz.regler.*_clima controlManu off,set hz.thermostat.*_climate controlManu off)

Also um das mal zu erklaeren...
Hier sollte im angegeben Zeitrahmen der Aussensensor ausgewertet werden und entsprechend der Temperatur die Regler auf AUTO oder Manual Off schalten.

Beim initialze führt er diesen Befehl auch aus...
o.g. Befehl wurde zuletzt am 28.01. um 8:32 Uhr ausgeführt zumal er ja zumindest heute morgen um 5:25 ausgeführt werden sollte das es ja kälter als 13 Grad war......

Habe ich da einen Denkfehler ?

Gruss Gerd
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: kumue am 29 Januar 2016, 14:07:43
hast du das Attribut "do always" gesetzt ?

attr <DOIF-NAME> do always
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: turo am 29 Januar 2016, 14:51:40
Ich habe einen leisen Zweifel, dass "do always" hilft. Außerdem gäbe es dann bei jedem Event vom Außensensor die Schaltbefehle.

Wie sieht denn das Reading Aussensensor:temperature aus? Wirklich numerisch und mit "." als Dezimaltrenner?
Und erzeugt der Aussensensor auch brav seine Trigger (Event Monitor) - da müsste ja  bei jeder Änderung was kommen?
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: goerdi am 29 Januar 2016, 15:20:16
Hallo !

Jetzt isses drin :)
der Dezimaltrenner ist ein komma (ist der normale HM Aussensensor)
Und im Reading aendert sich die temperatur....

Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: turo am 29 Januar 2016, 15:52:37
Zitatder Dezimaltrenner ist ein komma (ist der normale HM Aussensensor)
Echt? Das müsste man natürlich umsetzen, bevor der numerische Vergleich in Perl richtig funktioniert. Ich habe zwar keinen "normalen HM Aussensensor", aber mal kurz im WIKI gestöbert und da finde ich 2 Feuchte-/Temperatursensoren, die beide "." als Trenner liefern. Kannst Du vielleicht kurz ein Reading posten - nur zu meiner Beruhigung?

(Leider hilft das nur bei Deinem Problem nicht sofort weiter, denn es war heute morgen < 13.0 Grad - ob mit oder ohne Nachkommastellen.)

Wenn es immer noch nicht geht, dann wäre ein list von dem DOIF und dem Aussensensor hilfreich. (Und ich bin immer noch besorgt, dass mit dem "do always" jetzt die Regler und Thermostate mit unnötigen Schaltbefehlen belästigt werden.)
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: kumue am 29 Januar 2016, 16:02:58
Der Trigger soll ja der Sensor sein und nicht die Zeit.
Somit würde ich ein "?" vor die Uhrzeit setzen wie hier beschrieben:

http://fhem.de/commandref_DE.html#DOIF_Zeitintervalle_Readings_und_Stati_ohne_Trigger (http://fhem.de/commandref_DE.html#DOIF_Zeitintervalle_Readings_und_Stati_ohne_Trigger)
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: goerdi am 29 Januar 2016, 17:19:19
Hi

Hatte mich verschrieben... Trenner ist ein Punkt :)

Gruss Gerd
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: goerdi am 29 Januar 2016, 17:24:26
Hi !

OK und dann wird es nur einmal ausgefuehrt wenn die Temperatur erstamlig unter den Wert faellt ?
Oder bei jedem Durchlauf ?

Gruss Gerd
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: turo am 29 Januar 2016, 17:58:49
Probier doch den Vorschlag von kumue aus!

Meine Prognose: Mit "do always" bei jedem Event vom Außensensor. Ohne "do always" nur beim Statuswechsel. Aber nicht genau um 05:25 (sondern erst, wenn danach ein Event vom Außensensor kommt.)

(Du hälst uns aber hier etwas knapp mit Detailinfos. Ist das eine militärische Einrichtung oder sonst was geheimes? ;-))
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: goerdi am 31 Januar 2016, 12:37:58
Hi !

Ich hab jetzt mal das mit dem "?" davor getestet... kann aber erst wieder was dazu sagen wenn die Temperatur steigt.

BTW: Ja klar ne Rakenetnbasis ist das hier nicht :)

BTW2: Ich schalte je nach Aussetemperatur meine Heizkoerper zu und weg, wie es die Therme auch macht bzw. diese sich ausschaltet.. ich hab die Aussenttmperatur beobachtet und die Schwellwerte des Aussensensors angepasst. Ich mach das nur weil ich auf die Schnelle nicht unbedingt im Regelkreis der Therme rumpfuschen will.  Die Therme ist 16 Jahre alt, sprich irgendwann loest sich das Problem von alleine :) sprich es gibt ne neue Therme (oder haöt was anderes)

Gruss Gerd
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: goerdi am 01 Februar 2016, 11:43:37
Hi !

So heute Morgen wars dann soweit.... geht nicht :(

Mit der Einstellung oben haette das DOIF das Kommando 1 absetzen muessen (hats aber nicht getan) :(
Kann es sein das dies cmd nicht abgesetzt wird weil er "denkt" er muesste nicht ?
Der State steht weiterhin auf state
   
Device   Aussensensor        2016-02-01 10:02:59
cmd_event     Aussensensor         2016-01-29 17:25:10
cmd_nr    1                                    2016-01-29 17:25:10
e_Aussensensor_temperature        11.2    2016-02-01 10:02:59
state            cmd_1                       2016-01-29 17:25:10
timer_1_c1    02.02.2016 05:25:00       2016-02-01 05:25:00
timer_2_c1    01.02.2016 23:30:00        2016-01-31 23:30:00
timer_3_c2    02.02.2016 05:25:00        2016-02-01 05:25:00
timer_4_c2    01.02.2016 23:30:00        2016-01-31 23:30:00



Gruss Gerd
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: turo am 01 Februar 2016, 13:04:07
Na dann mal die Ärmel hochgekrempelt und Gehirn auf Leistung!

Welches DOIF hast Du denn jetzt implementiert? (kumue und ich hatten da ja durchaus konkurrierende Vorschläge ;-).

Und eine Info fehlt auch noch: Was soll eigentlich nachts passieren? Keine Änderung des aktuellen Zustands? (In der letzten Nacht, war es abends um
23:30 < 13.3 Grad und heute morgen um 05:25 auch, also hat sich der Zustand des DOIF nicht geändert und es gab kein neues Kommando.) Ein leeres DOELSE brauchen wir evtl. noch, damit der Zustand nachts auf cmd_3 geht.

Und: Gibt es noch andere DOIFs oder so, die an dem controlMode rumfummeln? (Also eigentlich die Frage: Muss um 05:25 auf jeden Fall der controlMode neu gesetzt werden, weil ihn etwas anderes verstellt hat.)

Spannend wäre auch der Zustand des Moduls _vor_ 05:25 gewesen - wenn Du nicht so früh aufstehen willst, wäre ein Logging mal prima (Code bei Ellert schamlos abgeschaut):
define spuernase notify Aussensensor|<doifname> {Log 1, "Spürnase: $NAME: $EVENT"}
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: goerdi am 01 Februar 2016, 13:26:51
Hi !

Ja jetzt leuchtet es mir ein, ich habe praktisch den Pedant dazu (heizung nachts), ich muesste also quasi beide in eines reinpacken um sicherzugehen das ich nix verliere...
beim Nacht Pedant hat das ja geklappt weil es nach 23:31 wärmer als 7.x Grad war hat er alle Regler ausgeschaltet.
Ich nagel mal eines fuer den kompletten Zeitraum zusammen und probiers aus.

Gruss Gerd
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: goerdi am 02 Februar 2016, 09:20:40
Hi

also so scheints zu funktionieren... oder hat einer noch nen Verbesserungsvorschlag ?
DOIF (([?05:25-23:30] and [Aussensensor:temperature] < 13.0 or [?23:31-05:24] and [Aussensensor:temperature]) < 7.7)
(set hz.regler.*_clima controlMode auto, set hz.thermostat.*_climate controlMode auto)
DOELSEIF (([?05:25-23:30] and [Aussensensor:temperature] > 13.3 or [?23:31-05:24] and [Aussensensor:temperature] > 8.3))
(set hz.regler.*_clima controlManu off,set hz.thermostat.*_climate controlManu off)


Gruss Gerd
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: turo am 02 Februar 2016, 10:02:10
Die vorletzte Klammer in der ersten Zeile ist etwas deplaziert: Die kann weg und die allererste auch. In der dritten Zeile könnte man auch auf ein Klammerpaar verzichten.

Ich persönlich würde das noch etwas anders formulieren:
DOIF ([Aussensensor:temperature] < ([?05:25-23:30] ? 13.0 : 7.7))
(set hz.regler.*_clima controlMode auto, set hz.thermostat.*_climate controlMode auto)
DOELSEIF ([Aussensensor:temperature] > ([?05:25-23:30] ? 13.3 : 8.3))
(set hz.regler.*_clima controlManu off,set hz.thermostat.*_climate controlManu off)

Aber das ist "personal taste", weil ich meine, dass man so die Logik (Vergleich mit einem zeitabhängigen Grenzwert) schneller erkennt. Aber Du musst das ja später pflegen, nicht ich ;-).

Eine kleine Sache noch: Jetzt triggert das Ganze wirklich nur nach dem Aussensensor und nicht unbedingt um 05:25. Aber das dürfte nicht stören, weil der Außensensor vermutlich regelmäßig sendet.

Gruss,
turo
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: Ellert am 02 Februar 2016, 10:17:03
Zitat([?05:25-23:30] ? 13.0 : 7.7)
Ich finde, das ist eine interessante Idee.
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: Damian am 02 Februar 2016, 10:44:59
Zitat von: Ellert am 02 Februar 2016, 10:17:03
Ich finde, das ist eine interessante Idee.
ja, es ergeben sich immer wieder neue Möglichkeiten, die ich selbst noch nicht bedacht habe :)

Damian
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: goerdi am 02 Februar 2016, 10:48:32
Hi !

Ich werd dein Anpassungen mal reinmachen... war halt als blutiger Anfänger lt. Commandref zusammengenagelt :)
und ob das Ganze jetzt genau um 5:25 getriggert wird oder erst um 5:27:30 ist mir eigentlich egal.... es sollte halt um den Dreh passieren...
Es ist ja nicht zwingend die Uhrzeit, es kann ja je nach Temperatur Tagsüber auch ausschalten ... aber das werd ich sehn...
Ja der Aussensensor sendet regelmäßig... wird auch ein Plot dazu erstellt...

Gruss Gerd
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: turo am 02 Februar 2016, 10:56:32
Ich mag den " ? :  " Operator! Etwas ungewohnt am Anfang, aber er erlaubt schön kurze Konstrukte, die auch übersichtlich sind (wenn man es nicht übertreibt).

Gruss,
turo
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: goerdi am 02 Februar 2016, 13:15:24
Hi !

So einfach ist das ja nicht ...... :)
ich habe 2 Verschiedene Zeitrahmen und in jedem 2 Kommandos.... (auto und manuell)
so wie du das geschrieben hast habe ich fuer jedes Kommando nur einen Zeitrahmen...

Gruss Gerd
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: l2r am 02 Februar 2016, 14:13:25
@turo: den " ? :  " Operator kannte ich bisher noch gar nicht und hab jetzt auf Anhieb nix dazu gefunden... Gibt's dafür ne Doku oder sowas?
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: turo am 02 Februar 2016, 14:55:05
@i2r: Das ist ein ganz normaler Perl Operator, siehe http://perldoc.perl.org/perlop.html#Conditional-Operator

@goerdi: Also wenn ich nicht total auf dem Schlauch stehe, ist mein Code zu Deinem funktional äquivalent.

Gruss,
turo
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: l2r am 02 Februar 2016, 15:05:14
ahh verstanden und ich glaube ich werde deine Begeisterung dafür teilen :-)

danke
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: goerdi am 02 Februar 2016, 16:05:30
Hi !

Zitat von: turo am 02 Februar 2016, 14:55:05
@goerdi: Also wenn ich nicht total auf dem Schlauch stehe, ist mein Code zu Deinem funktional äquivalent.

Gruss,
turo

Ich habs mal nachgeprüft (zu Not kann ich dir 2 screenshots machen)..
Zur Funktion:
vom Prinzip habe ich zwei "Befehle"
(1. alle Regler auf auto und 2.l alle Regler manual off)
Befehl 1 soll ausgefuehrt werden wenn die Aussentemperatur zwischen 5:25 und 23:30 unter 13 grad foder zwischen 23:31 und 5:24 unter 7.7 Grad faellt
Befehl 2 soll ausgefuehrt werden wenn die Aussentemperatur zwischen 5:25 und 23:30 über 13.3  grad oder zwischen 23:31 und 5:24 über 8.3 Grad steigt


Gruss Gerd
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: turo am 02 Februar 2016, 16:17:23
Zitatvom Prinzip habe ich zwei "Befehle"
(1. alle Regler auf auto und 2.l alle Regler manual off)
Befehl 1 soll ausgefuehrt werden wenn die Aussentemperatur zwischen 5:25 und 23:30 unter 13 grad foder zwischen 23:31 und 5:24 unter 7.7 Grad faellt
Befehl 2 soll ausgefuehrt werden wenn die Aussentemperatur zwischen 5:25 und 23:30 über 13.3  grad oder zwischen 23:31 und 5:24 über 8.3 Grad steigt
Ja, das machen Dein Code und meiner. (Wobei man korrekterweise noch dazwischenfügen muss: "und wenn nicht, dann") Und wo ist jetzt das Problem? (Problem = Abweichung des beobachteten Systemverhaltens vom erwarteten Systemverhalten)

Gruss,
turo
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: goerdi am 02 Februar 2016, 16:22:41
Hi !
Ok ich werde dem mal glauben schenken :)
Aber kannst du mir erklaeren wo dein "script" die zweit Zeitangabe hernimmt ? Wenn ich es in Fhem "einpflege" steht das im Status

timer_1_c1 03.02.2016 05:25:00   2016-02-02 16:20:45
timer_2_c1 02.02.2016 23:30:00   2016-02-02 16:20:45
timer_3_c2 03.02.2016 05:25:00    2016-02-02 16:20:45
timer_4_c2 02.02.2016 23:30:00    2016-02-02 16:20:45


Gruss Gerd
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: turo am 02 Februar 2016, 16:38:22
ZitatOk ich werde dem mal glauben schenken :)
Das könnte man schon formal beweisen  ;D, aber das habe ich schon ewig nicht mehr gemacht.

Deine 2. Zeitangabe taucht bei mir nicht auf, weil sie die Negation der 1. ist: Wenn es nicht 05:25-23:30 ist,
dann ist es 23:31-05:24.

Da die Zeiten ja nicht triggern, braucht es auch keine timer dazu. Ehrlich gesagt wundert es mich sogar, dass das DOIF in diesem Fall überhaupt Timer aufzieht.
EDIT: Jetzt nicht mehr: Ich habe mal in den Code gespickt: Die Zeiten werden natürlich für den Vergleich ausgerechnet, aber es werden keine Timer gesetzt - das sieht man auch bei einem list unter "Timers:"

Gruss,
turo
Titel: Antw:DOIF führt nur einmal den Befehl aus
Beitrag von: Damian am 02 Februar 2016, 17:49:52
Zitat von: turo am 02 Februar 2016, 16:38:22

EDIT: Jetzt nicht mehr: Ich habe mal in den Code gespickt: Die Zeiten werden natürlich für den Vergleich ausgerechnet, aber es werden keine Timer gesetzt - das sieht man auch bei einem list unter "Timers:"

Gut beobachtet ;)

Gruß

Damian