Hallo,
Um zu melden das die Waschmaschine, der Trockner, oder die Spülmaschine fertig sind, dient diese Lösung. Die "Fertig"-Meldung kann zum Beispiel mit einer Push-Nachricht auf das Handy erfolgen. Was die Maschine gerade macht, kann man anhand der aktuellen Leistung bestimmen.
Das Beispiel ist eine Spülmaschine deren Leistungswerte folgende Phasen durchläuft:
- Läuft: Pumpen, Heizen und Spülen (Leistung ist deutlich größer als 10 Watt)
- Läuft: Spülen, Pumpen (Leistung ist deutlich größer als 10 Watt)
- Läuft: Spülen,Pumpen, Heizen (Leistung ist deutlich größer als 10 Watt)
- Warten: sporadische Pausen (Leistung wechselt zwischen 0W für einige Minuten und 20-40W)
- Warten: Lange Pause (0 Watt)
- Beenden: Eine letzte Phase der Aktivität (Leistung deutlich größer als 10 Watt)
- Fertig: Alles beendet, hierfür soll einmal eine Push-Nachricht gesendet werden.
Zur Veranschaulichung ist diesem Post ein Graph der Leistungsaufnahme angefügt.
Zur Leistungsmessung wird zum Beispiel ein Zwischenstecker (FRITZ!DECT 200, SONOFF, Blitzwolf BWSHP2, oder ähnliches) verwendet. Was genau zur Messung verwendet wird, ist eigentlich nicht so relevant, Hauptsache die aktuelle Leistungaufnahme ist mit einem Reading auswertbar. Hier lautet das Reading für die Leistungsaufnahme
Spuelmaschine:power.
defmod Spuelmaschine_di DOIF ## Status 1\
([Spuelmaschine:power:d] > 10 and [?$SELF:Zyklus] =~ "Fertig|Init|Läuft" )\
(setreading $SELF Zyklus Läuft )\
\
## Status 2\
DOELSEIF ([Spuelmaschine:power:d] < 10 and [?$SELF:Zyklus] =~ "Läuft|Warten")\
(IF ([Spuelmaschine:power:d] < 10)\
(setreading $SELF Zyklus Warten) )\
\
## Status 3\
DOELSEIF ([Spuelmaschine:power:d] > 10 and [?$SELF:Zyklus] =~ "Warten|Beenden")\
(setreading $SELF Zyklus Beenden)\
\
## Status 4\
DOELSEIF ([Spuelmaschine:power:d] < 10 and [?$SELF:Zyklus] =~ "Beenden")\
(setreading $SELF Zyklus Fertig)\
({system("curl -s -F 'token=<GEHEIM>' -F 'user=<GEHEIM>' -F 'message=Die Spuelmaschine ist fertig' -F 'sound=gamelan' https://api.pushover.net/1/messages.json")})\
\
## Status 5\
DOELSEIF ([Spuelmaschine:power:d] < 10 and [?$SELF:Zyklus] =~ "Fertig")\
(setreading $SELF Zyklus Fertig)\
\
## Status 6\
DOELSE\
(setreading $SELF Zyklus Init)
attr Spuelmaschine_di do always
attr Spuelmaschine_di startup setreading $SELF Zyklus Init
attr Spuelmaschine_di wait 0:300:0:0:0:0
Es wird DOIF genutzt um einen Zustandsautomaten aufzubauen. Das Reading
Zyklus bildet den Zustand der Spülmaschine ab. Für den Zustandswechsel von
Läuft auf Warten wird 5 Minuten abgewartet, ob nicht doch noch Strom verbraucht wird. Das war erforderlich, da diese spezielle Spülmaschine manchmal in der Zeit noch aktiv wurde, oder auch nicht. Die Wartezeit wird mit dem Attribut
wait für jeden Zustand des DOIF angegeben, in dem Beispiel war die Verzögerung nur für den zweiten Zustand erforderlich.
Als Schwellwert für Aktiv oder nicht, ist ein Wert von 10 Watt verwendet worden. Die Angabe ":d" hinter dem Reading
Spuelmaschine:power für Leistung filtert Zeichen, die keine Zahlen sind einfach weg. Dies macht das DOIF ein wenig toleranter für die Leistungsangaben. Durch Verwendung der Variable
$SELF muss man nicht den Namen des DOIF an die eigenen Bedürfnisse anpassen, das erledigt DOIF für einen. Um eine PushOver Nachricht abzusenden kann man entweder einen Konsolenbefehl absetzten, oder aber das passende Modul nutzen; hier ist es eben ein Aufruf des Programms
curl.
Viel Erfolg beim Tüfteln!
Das ist ja nicht die erste Lösung zu diesem Thema. :)
Wichtig ist es, so wie du es zuvor gemacht hast, den Stromverbrauch zunächst aufzuzeichnen, um sich einen Überblick über den Stromverbrauch seiner Maschine zu verschaffen.
Den aktuellen Zustand kannst du einfacher im Status des Moduls unterbringen, dann brauchst du kein setreading zu verwenden. Stattdessen das Attribut cmdState nutzen.
Den aktuellen Zustand kann man dann direkt in der Device-Übersicht sehen.
Hallo Damian,
Das stimmt, es gibt zig Posts zu dem Thema :) Danke übrigens an dieser Stelle für DOIF, es ist ein sehr nützliches Modul!
Den Status mit DOIF direkt abzubilden hatte ich als erstes versucht, aber der "Flatterstatus" von Läuft auf Warten führte dann immer wieder zu Problemen wenn ich es "nur" mit DOIFs eigenem Status lösen wollte. Wichtig bei der Lösung hier war, dass es wirklich zurückspringt auf den Zustand "Läuft" falls die Maschine doch nochmal loslegt und es noch nicht die "lange" Pause war.
Den Hinweis mit cmdstate kann man also so aufgreifen: attr Spuelmaschine_di cmdState Läuft|Warten|Beenden|Fertig|Fertig|Init
Das sieht dann wirklich noch hübscher in den Übersichten aus.
Da die Maschinen oftmals auch unter 10 W fallen brauch man eine
https://forum.fhem.de/index.php?topic=73336.0
da ist eigentlich alles schon vorhanden .....
Ggf. kann ein neues Feature die Sache etwas einfacher machen: https://forum.fhem.de/index.php/topic,95759.msg886621.html#msg886621
Das Glätten von Werten ist eine gute neue Möglichkeit um den Codeschnipsel kürzer zu gestalten, danke!
Ich möchte nur zum Verständnis kurz nachfragen:
Wenn ich cmdState verwende, dann brauche ich kein Reading Zyklus und kann bei den Bedingungen ?$SELF:State verwenden?
Viele Grüße vom Gent
Zitat von: gent am 26 August 2019, 21:05:05
Ich möchte nur zum Verständnis kurz nachfragen:
Wenn ich cmdState verwende, dann brauche ich kein Reading Zyklus und kann bei den Bedingungen ?$SELF:State verwenden?
Viele Grüße vom Gent
ja!
Vielen Dank.