[Beta] Waschmaschinenstatus

Begonnen von traxanos, 27 Juli 2015, 23:50:40

Vorheriges Thema - Nächstes Thema

traxanos

Ich möchte euch heute mein Waschmaschinenstatus vorstellen. Das Ganze gilt erstmal als Beta, da noch paar Anpassungen im DOIF fehlen. Außerdem möchte ich noch etwas länger testen bevor ich sagen kann, dass alles läuft.




Zuerst definieren wir einen Dummy. Auf diesem werden per Syncscript alle Werte von
einer Steckdose mit Leistungsmessung übertragen sowie der Status der Waschmaschine gespeichert.

define Waschmaschine.Status dummy
attr Waschmaschine.Status userattr configPowerOff configWaitOff configPowerDone configWaitDone configTimerAutoOff
attr Waschmaschine.Status configPowerDone 3
attr Waschmaschine.Status configPowerOff 1
attr Waschmaschine.Status configTimerAutoOff 900
attr Waschmaschine.Status configWaitDone 60
attr Waschmaschine.Status configWaitOff 5
attr Waschmaschine.Status event-on-change-reading state, energy
attr Waschmaschine.Status event-on-update-reading power
attr Waschmaschine.Status stateFormat { my $state = ReadingsVal($name, "state", "");; my $power = ReadingsVal($name, "power", "");; if($state eq 'on') { "An" } elsif($state eq "done") { "Fertig" } elsif($state eq "running") { "Läuft ($power W)" } else { "Aus" } }


Folgende Readings existieren:

  • state Aktueller Zustand der Waschmaschine (on, off, done, running)
  • switch Aktueller Zustand der Steckdose (on, off)
  • energy Aktueller Energiezähler
  • power Aktueller Verbrauch
  • preEnergy Energiezähler vor dem Waschgang
  • lastEngery Verbrauch des letzten Waschgangs

Folgende Attribute können angepasst werden:

  • configPowerOff Angabe in Watt. Bei Unterschreitung ändert sicht der Status zu "Aus" unter Beachtung des configWaitOff
  • configPowerDone Angabe in Watt. Bei Unterschreitung ändert sicht der Status zu "Fertig" unter Beachtung des configWaitDone
  • configWaitOff Angabe in Sekunden. Wie lange muss der Wert configPowerOff unterschritten sein, damit sich der Status auf "Aus" ändert (! Wir noch nicht beachtet da eine anpassung im DOIF fehlt.)
  • configWaitDone Angabe in Sekunden. Wie lange muss der Wert configPowerDone unterschritten sein, damit sich der Status auf "Fertig" ändert (! Wir noch nicht beachtet da eine anpassung im DOIF fehlt.)




Dann definieren wir ein Syncscript, welches eine Steckdose an den Waschmaschinenstatus anbindet.
Dieses Script muss entsprechend der eigenen Steckdose mit Leistungsmessung angepasst werden.
Ansonsten existeren keine Abhängigkeiten zur Steckdose.

define Programm.Waschmaschine.Sync DOIF ([Waschmaschine_Pwr:power] or [Waschmaschine_Pwr:energy] or [Waschmaschine_Sw:state]) (\
  setreading Waschmaschine.Status power [Waschmaschine_Pwr:power],\
  setreading Waschmaschine.Status energy [Waschmaschine_Pwr:energy],\
  setreading Waschmaschine.Status switch [Waschmaschine_Sw:state]\
)
attr Programm.Waschmaschine.Sync do always





Hier habe ich das Herzstück, die Statusermittlung.

define Programm.Waschmaschine.Status DOIF ([Waschmaschine.Status:power] < AttrVal("Waschmaschine.Status", "configPowerOff", 1)) (\
  \
  set Waschmaschine.Status off,\
  setreading Waschmaschine.Status preEnergy 0\
\
) DOELSEIF ([Waschmaschine.Status:power] >= AttrVal("Waschmaschine.Status", "configPowerOff", 1) and [Waschmaschine.Status:state] eq 'off') (\
\
  set Waschmaschine.Status on,\
  setreading Waschmaschine.Status preEnergy [Waschmaschine.Status:energy]\
\
) DOELSEIF ([Waschmaschine.Status:power] >= AttrVal("Waschmaschine.Status", "configPowerDone", 3)) (\
\
  set Waschmaschine.Status running\
\
) DOELSEIF ([Waschmaschine.Status:power] < AttrVal("Waschmaschine.Status", "configPowerDone", 3) and [Waschmaschine.Status:state] eq 'running') (\
\
  set Waschmaschine.Status done,\
  setreading Waschmaschine.Status lastEnergy {([Waschmaschine.Status:energy]-[Waschmaschine.Status:preEnergy])},\
  setreading Waschmaschine.Status totalEnergy {([Waschmaschine.Status:totalEnergy]+[Waschmaschine.Status:lastEnergy])},\
  setreading Waschmaschine.Status lastCost {([Waschmaschine.Status:lastEnergy]/1000*0.25)},\
  setreading Waschmaschine.Status totalCost {([Waschmaschine.Status:totalEnergy]/1000*0.25)},\
  setreading Waschmaschine.Status preEnergy [Waschmaschine.Status:energy]\
\
)
attr Programm.Waschmaschine.Status wait 5:0:0:60


Hier muss leider der Wait-Wert configWaitOff (Spalte 1) und configWaitDone (Spalte 4) noch manuell gepflegt werden.
Sobald Damian sein DOIF gefixt hat, werden diese Werte aus der entsprechenden Konfiguration (Attribute) ausgelesen.

Außerdem muss man den totalEnergy Wert auf 0 setzten. Das kann man immer wieder wiederholen um den Zähler zu resetten.

setreading Waschmaschine.Status totalEnergy 0




Nun können wir eine Benachrichtigung auf den Status "Fertig" einrichten. Wie Ihr Benachrichtig werden wollt, müsst Ihr selber entscheiden.
Ich schicke in dieser Vorlage z.B. eine Nachricht per Pushover auf das Handy und per Enigma2 auf den TV. Das Ganze ist natürlich Optional.

define Programm.Waschmaschine.Benachrichtigung DOIF ([Waschmaschine.Status:state] eq 'done') (\
  set Wohnzimmer.PVR showText Die Waschmaschine ist fertig,\
  set Pushover msg 'FHEM' 'Die Waschmaschine ist fertig'\
)





Das letzte DOIF soll die Steckdose automatisch nach X Minuten abschalten, wenn die Waschmaschine nicht läuft.
Hier muss ebenfalls das Device für das set_off angepasst werden. Wielange gewartet wird, ist abhängig vom Wait-Wert der in Sekunden arbeitet. Das ist ebenfalls optional.

define Programm.Waschmaschine.AutoOff DOIF ([Waschmaschine.Status:state] ne "running" and [Waschmaschine.Status:switch] eq "on") (set Waschmaschine_Sw off)
attr Programm.Waschmaschine.AutoOff wait 900
attr Programm.Waschmaschine.AutoOff do always





Ich hoffe euch gefällt das Ganze! Übrigens, das ganze geht natürlich auch bei einer Spülmaschine oder einem Trockner :D
Im Einsatz:
FHEM: Latest auf RPi2
HM: vCCU, HMLAN, HMUSB2, HM-CC-RD-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-ES-PMWs1-Pl, HM-LC-Sw1PBU-FM, HM-PB-2-WM55-2, HM-RC-8, HM-BP-6-WM55
CUL: ESA2000, Intertechno

traxanos

So habe eine kleine Anpassung am AutoOff vorgenommen. Die Waschmaschine soll nicht automatisch abgeschaltet werden, wenn sie nur eingeschaltet wurde. Das ist notwendig, damit einer Timer der Waschmaschine nicht unterbrochen wird.
Im Einsatz:
FHEM: Latest auf RPi2
HM: vCCU, HMLAN, HMUSB2, HM-CC-RD-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-ES-PMWs1-Pl, HM-LC-Sw1PBU-FM, HM-PB-2-WM55-2, HM-RC-8, HM-BP-6-WM55
CUL: ESA2000, Intertechno

spilu

schau mal hier: http://www.meintechblog.de/2014/01/homematic-funk-steckdose-mit-leistungsmessung-deine-waschmaschine-ist-fertig/

das dürfte doch in etwa das sein, was du gebaut hast? In den Kommentaren findest du auch die Variante mit DOIF. Ansonsten ist auch
http://www.meintechblog.de/2014/02/homematic-funk-steckdose-mit-leistungsmessung-dein-trockner-ist-fertig-0-31-eur/ sicher einen Blick wert.

Lief bei mir hervorragend :-)

Viele Grüße
spilu

traxanos

Ja das kannte ich schon und das hat mich überhaupt auf die Idee gebracht. Aber die Umsetzung hat mir nicht gefallen.

Zum Beispiel möchte ich über Attribute das Verhalten kontrollieren. Auch möchte ich über einen DOIF die Readings auf den Status kopiert werden um so die Abhäningkeiten zu reduzieren.
Im Einsatz:
FHEM: Latest auf RPi2
HM: vCCU, HMLAN, HMUSB2, HM-CC-RD-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-ES-PMWs1-Pl, HM-LC-Sw1PBU-FM, HM-PB-2-WM55-2, HM-RC-8, HM-BP-6-WM55
CUL: ESA2000, Intertechno

harway2007

wo wird das den eingebaut ?
Das letzte DOIF soll die Steckdose automatisch nach X Minuten abschalten, wenn die Waschmaschine nicht läuft.
Hier muss ebenfalls das Device für das set_off angepasst werden. Wielange gewartet wird, ist abhängig vom Wait-Wert der in Sekunden arbeitet. Das ist ebenfalls optional.

Code: [Auswählen]
([Waschmaschine.Status:state] ne "running" and [Waschmaschine.Status:state] ne "on" and [Waschmaschine.Status:switch] ne "off") (set Waschmaschine_Sw off)
attr Programm.Waschmaschine.AutoOff wait 900
attr Programm.Waschmaschine.AutoOff do always

andiw

ich lasse mich regelmäßig erinnern dass die Wäsche fertig gewaschen ist, solange bis ich die Maschine ausgeschaltet habe:

([WaschmaschineStatus] eq "ready" or ([+900] and [WaschmaschineStatus:?ready])) (set PushAndreasJasmin msg 'Waschmaschine' 'Wäsche fertig!' '' 0 'tugboat')

traxanos

@harway2007

Hab die Schreibweise mit dem DOIF ergänzt. Ist beim letzten aktualisieren verloren gegangen.
Im Einsatz:
FHEM: Latest auf RPi2
HM: vCCU, HMLAN, HMUSB2, HM-CC-RD-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-ES-PMWs1-Pl, HM-LC-Sw1PBU-FM, HM-PB-2-WM55-2, HM-RC-8, HM-BP-6-WM55
CUL: ESA2000, Intertechno

traxanos

Zitat von: andiw am 01 August 2015, 11:03:26
ich lasse mich regelmäßig erinnern dass die Wäsche fertig gewaschen ist, solange bis ich die Maschine ausgeschaltet habe:

([WaschmaschineStatus] eq "ready" or ([+900] and [WaschmaschineStatus:?ready])) (set PushAndreasJasmin msg 'Waschmaschine' 'Wäsche fertig!' '' 0 'tugboat')

Hatte ich auch mal überleg brauche ich für mich nicht. Aber gut umgesetzt!
Im Einsatz:
FHEM: Latest auf RPi2
HM: vCCU, HMLAN, HMUSB2, HM-CC-RD-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-ES-PMWs1-Pl, HM-LC-Sw1PBU-FM, HM-PB-2-WM55-2, HM-RC-8, HM-BP-6-WM55
CUL: ESA2000, Intertechno

Damian

Zitat von: andiw am 01 August 2015, 11:03:26


([+900] and [WaschmaschineStatus:?ready])
kann eigentlich nicht sinnvoll sein, denn der Timer und das Ereignis können nie zum gleichen Zeitpunkt wahr sein.

Du meinst wahrscheinlich eine Statusabfrage ohne Trigger:

([+900] and [?WaschmaschineStatus] eq "ready")

Gruß

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

andiw

@Damian: jetzt wo du es sagst ... ;-) aber es hat bisher trotzdem funktioniert, nur die erste zyklische Meldung kam nicht unbedingt 15min nach der aller ersten ...

Damian

Zitat von: andiw am 01 August 2015, 20:00:32
@Damian: jetzt wo du es sagst ... ;-) aber es hat bisher trotzdem funktioniert, nur die erste zyklische Meldung kam nicht unbedingt 15min nach der aller ersten ...

ja, dann kannst du auch gleich schreiben:

([WaschmaschineStatus] eq "ready" or ![+900]) (set PushAndreasJasmin msg 'Waschmaschine' 'Wäsche fertig!' '' 0 'tugboat')

Gruß

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

andiw

OK, danke! das sieht noch eleganter aus ;-)

Damian

Zitat von: andiw am 01 August 2015, 21:04:26
OK, danke! das sieht noch eleganter aus ;-)
wenn einem die Wiederholung zuviel wird, kann man auch

attr <di_modul> reapeatsame 5

setzen.

Gruß

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

inesa394

Hi

Ein zusätzliches reading wie
DOELSEIF ([Trockner.Status:power] < AttrVal("Trockner.Status", "configPowerDone", 3) and [Trockner.Status:state] eq 'running') (

  set Trockner.Status done,
  setreading Trockner.Status lastEnergy {([Trockner.Status:energy]-[Trockner.Status:preEnergy])},
  setreading Trockner.Status lastEeuro {([Trockner.Status:energy]-[Trockner.Status:preEnergy] /1000 *0,312)},
  setreading Trockner.Status GesamtEuro {([Trockner.Status:energy] /1000 *0,312)},
  setreading Trockner.Status preEnergy [Trockner.Status:energy]

)

schluckt dein dummy nicht. Wollte mir noch zum Energieverbrauch die Kosten in euro anzeigen lassen.

cu

traxanos

Da bin ich aktuell auch noch dran. Ich will global einen Preis definieren. Und dann überall verwenden. Sobald ich das fertig habe, aktualisiere ich das noch.
Im Einsatz:
FHEM: Latest auf RPi2
HM: vCCU, HMLAN, HMUSB2, HM-CC-RD-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-ES-PMWs1-Pl, HM-LC-Sw1PBU-FM, HM-PB-2-WM55-2, HM-RC-8, HM-BP-6-WM55
CUL: ESA2000, Intertechno