Spülmaschine überwachen

Begonnen von drhirn, 16 Dezember 2015, 09:52:39

Vorheriges Thema - Nächstes Thema

drhirn

Tja, die fehlenden eckigen Klammern waren's ;). Und danke für's Hellsehen und den Hinweis mit "steps", das hat mich nämlich auch gequält.

Ellert

Ich würde sagen, das DOIF müsste funktionieren, für das "Anspringen" am Ende gibt es Werte.

Die "20" kannst Du auch kleiner machen.
Ob Du mit "300" (5 Minuten) für die Zwischenpausen auskommst kann ich nicht sehen, könntest Du vorsichtshalber auf 600 stellen.

drhirn

Ja. Wird auf jeden Fall ausprobiert. Dauert halt bei einem 2-Personen-Haushalt immer länger, bis die Spülmaschine das nächste Mal läuft ;).
Ich melde mich dann wieder.

Danke einstweilen!

drhirn

Ich habe versprchen, dass ich mich wieder melde. Von einem Jahr später hab ich nichts gesagt ;)

Auf jeden Fall hab ich's noch immer nicht kapiert.

Spiele noch immer mit dem Beispiel von Ellert herum und die erste Frage dazu wäre, warum da die Ausführung des ersten Befehls verzögert wird?
Eigentlich möchte ich ja überprüfen, ob Power länger als 300s kleiner 10 bleibt. Nach meiner Logik müsste ja da eigentlich der Wait-Counter auf den zweiten Befehl, oder? Dummerweise bleibt dann aber der Counter aktiv, auch wenn der Power-Wert wieder steigt. Nützt mir also gar nichts.

Hätte da noch jemand eine Möglichkeit, mich vom Schlauch runter zu holen?

Danke!
Stefan

Ellert

Hier mal das aktuell bei mir laufende Geschirrspüler DOIF.

define Geschirrspu_di DOIF ## 1
([Geschirrspueler_Pwr:power] > 20 and ([?$SELF] eq "cmd_6" or [?$SELF] eq "initialized"))
   ({Log 3, "Geschirrspueler: Programmstart"},
   setreading $SELF energy_start [Geschirrspueler_Pwr:energy],
   set SagEs1 tts Der Geschirrspüler wurde eingeschaltet,
   set SagEs1Pi2 tts Der Geschirrspüler wurde eingeschaltet)
## 2
DOELSEIF ([Geschirrspueler_Pwr:power] > 20 and [?$SELF] eq "cmd_1")
   ({Log 3, "Geschirrspueler: Spülende"})
## 3
DOELSEIF ([Geschirrspueler_Pwr:power] < 1 and [?$SELF] eq "cmd_2")
   ({Log 3, "Geschirrspueler: Troknen"})
## 4
DOELSEIF ([Geschirrspueler_Pwr:power] > 40 and [?$SELF] eq "cmd_3")
   ({Log 3, "Geschirrspueler: Abpumpen"})
## 5
DOELSEIF ([Geschirrspueler_Pwr:power] < 1 and [?$SELF] eq "cmd_4")
   ({Log 3, "Geschirrspueler: Programmende"},
   setreading $SELF energy {(int([Geschirrspueler_Pwr:energy] - [$SELF:energy_start]))},
   set SagEs1 tts Das Geschirr ist gespült,
   set SagEs1Pi2 tts Das Geschirr ist gespült)
## 6
DOELSEIF ([Geschirrspueler_Pwr:power] < 0.1)
   ({Log 3, "Geschirrspueler: ausgeschaltet"},
   setreading $SELF energy {(int([Geschirrspueler_Pwr:energy] - [$SELF:energy_start]))})
   (set SagEs1 tts Das Geschirr ist abgekühlt,
   set SagEs1Pi2 tts Das Geschirr ist abgekühlt)## Schalter aus

attr Geschirrspu_di do resetwait
attr Geschirrspu_di notexist "0"
attr Geschirrspu_di repeatcmd 0:0:0:0:300:0
attr Geschirrspu_di wait 0:300:0:0:0:0,900


Zweig 1 wird ausgeführt, wenn power das erste Mal über 20 ist.
power wird regelmässig aktualisiert.
Zweig 2 wird ausgeführt, wenn power nicht innerhalb von 300s > 20 liegt und Zweig 1 ausgeführt wurde
Zu Deiner Frage: Die 300s Pause werden benötigt , damit das Spülende erkannt wird. Das geschieht dadurch, das der Timer zurückgesetzt wird (do resetwait), wenn innerhalb von 300s power mit über 20 aktualisiert wird (Spülphase).
Zweig 3 wird ausgeführt, wenn nach der Spülphase power < 1 also die große Pause stattfindet.
Zweig 4 wird ausgeführt, wenn nach der großen Pause power > 40 aktualisiert wird, dann wird abgepumpt.
Zweig 5 wird ausgeführt, wenn abgepumpt wurde und power wieder < 1 liegt, die Befehle (Ansage) werden alle 5 min. wiederholt (repeatcmd 300) bis
Zweig 6 ausgeführt wird, weil der Geschirrspüler ausgeschaltet und die Tür geöffnet wurde und power dadurch unter 0.1 liegt, die Ansage, dass das Geschirr abgekühlt ist erfolgt einmalig eine viertel Stunde später (wait 900) zur Erinnerung zum Ausräumen.

Mit and [?$SELF] eq "cmd_x" wird sichergestellt, dass ein Zweig nach dem anderen ausgeführt wird.

drhirn

Ich glaub, ich hab vor kurzem auch ein funktionierendes DoIf herbekommen. Während ich mich über Civilization VI geärgert habe ;).
Geschirrspüler rennt gerade, ich werde dann berichten.

Die Sache mit dem "repeatcmd" habe ich mir auch überlegt, aber mir war nicht klar, wie genau ich das einbaue.

Wie gesagt, melde mich in 2h wieder.

Danke Ellert!

drhirn

Ich erlaube mir, den uralt-Thread wieder aufzuwärmen.
Hab's dank eurer Hilfe dann irgendwann geschafft, ein funktionierendes DOIF herzubekommen. Aber wie's so ist, hatte ich natürlich kein Backup davon. Und mich in dem Thread schändlicherweise nicht mehr gemeldet.
Auf jeden Fall habe ich am DOIF etwas geändert und seit damals (ca. 1 Jahr) bekomme ich das nicht mehr zum Laufen. Ganz egal, was ich auch versuche. Kann mich aber natürlich auch nicht mehr erinnern, was ich geändert habe.
Auf jeden Fall bitte ich nochmal um eure Mithilfe.

Im Anhang ein Plot des Stromverbrauches und das vollständige Log des Zwischensteckers.

Je nachdem, was ich am DOIF ändere, bleibt es bei "cleaning" (cmd_2) oder "drying" (cmd_3) hängen und macht nicht mehr weiter. Aktuell bei cmd_2.


defmod diSpuelmaschine2 DOIF ([enoAcSpuelmaschine:power] == 1 and ([?$SELF] =~ "initialized|off|initialize"))({Log 3,"diSpuelmaschine2 Spüli ein"})\
DOELSEIF ([enoAcSpuelmaschine:power] > 1 and ([?$SELF] eq "on"))({Log 3,"diSpuelmaschine2 Spüli gestartet"})\
DOELSEIF ([enoAcSpuelmaschine:power] >= 1 and ([?$SELF] eq "started"))({Log 3,"diSpuelmaschine2 Spüli spült"})\
DOELSEIF ([enoAcSpuelmaschine:power] == 1 and ([?$SELF] eq "cleaning"))({Log 3,"diSpuelmaschine2 Spüli trocknet"})\
DOELSEIF ([enoAcSpuelmaschine:power] > 1 and ([?$SELF] eq "drying"))({Log 3,"diSpuelmaschine2 Spüli läßt Wasser ab"})\
DOELSEIF ([enoAcSpuelmaschine:power] == 1 and [?$SELF] eq "draining")\
({Log 3,"diSpuelmaschine2 Spüli fertig"},\
set TV:FILTER=STATE=on screenMsg Spuelmaschine ist fertig,\
msg Spülmaschine fertig)\
DOELSEIF ([enoAcSpuelmaschine:power] == 0 and [?$SELF] eq "finished")({Log 3,"diSpuelmaschine2 Spüli aus"})
attr diSpuelmaschine2 cmdState on|started|cleaning|drying|draining|finished|off
attr diSpuelmaschine2 do resetwait
attr diSpuelmaschine2 group Haushaltsgeräte
attr diSpuelmaschine2 room DoIf,Haushaltsgeraete
attr diSpuelmaschine2 wait 0:0:720:0:0:0:0


Für den Zwischenstecker - falls das relevant ist - habe ich angegeben:

attr enoAcSpuelmaschine event-min-interval power:600
attr enoAcSpuelmaschine event-on-change-reading power,state


Und jetzt die Frage: Was habe ich übersehen, dass das DOIF den kurzen Verbrauchsanstieg am Ende nicht mehr erkennt und dementsprechend weiterschaltet?

Danke vielmalst für jede Hilfestellung! Mich bringt das jetzt langsam zur Verzweiflung ;).