Waschmaschine, Trockner und Spülmaschine Fertigmeldung

Begonnen von Torxgewinde, 16 Dezember 2018, 19:09:54

Vorheriges Thema - Nächstes Thema

Torxgewinde

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!

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Torxgewinde

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.

saschae

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 .....

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Torxgewinde

Das Glätten von Werten ist eine gute neue Möglichkeit um den Codeschnipsel kürzer zu gestalten, danke!

gent

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
fhem auf rPi3 mit USB boot und M2, cul866 (hm), homebridge, FlowerSens, Shelly, Harmony, WemosD1, Sonoff/Tasmota, grafana, mqtt/mosquitto

Damian

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!
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

gent

fhem auf rPi3 mit USB boot und M2, cul866 (hm), homebridge, FlowerSens, Shelly, Harmony, WemosD1, Sonoff/Tasmota, grafana, mqtt/mosquitto