FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: docb am 12 August 2018, 15:32:53

Titel: Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: docb am 12 August 2018, 15:32:53
Grüß Euch, ich versuche gerade meinen 3D Drucker im Leerlauf auszuschalten. Dazu habe ich ein kleies Doif gebastelt:
([3D_Strom_Pwr:power] < 8 and [?3D_Strom_Sw] eq "on") (msg mail Schalte drucker ab)
Dazu ein do resetwait und ein wait 600, denn Ziel soll es sein, dass er wenn er 10 Minuten im Leerlauf ist (<8 Watt), dass er dann abgeschaltet wird. Aber eben keinesfalls, wenn der Verbrauch wieder hoch geht (weil ich eben einen neuen Druck angestoßen habe). Allerdings funktioniert das so nicht, er triggert zwar brav auf den Stromverbrauch, setzt das Doif aber nicht zurück, wenn der Stromverbrauch wieder höher geht. Soweit ich die Commandref verstanden habe, sollte das doch mit resetwait gehen?
Viele Grüße
doc
Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: sash.sc am 12 August 2018, 15:42:22
Dann versuche mal


Attr wait 600:20



Das besagt das dein leistungslevel für 600 Sekunden unter 8 Watt sein muss, dann wird der Drucker abgeschaltet.
Wenn der Drucker über 8 Watt ist, und das für 20 Sekunden in diesen Fall, dann bleibt der Drucker an.

Gruß Sascha

Gesendet von meinem E6653 mit Tapatalk

Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: docb am 12 August 2018, 18:43:16
Hm, das scheint nicht zu  klappen - das gleiche wie vorher, er schickt die Nachricht los, obwohl der Drucker schon wieder druckt - im Ernstfall hätte er einfach den Druck abgebrochen ;-)
Ich glaube ich mache es einfach klassisch wie früher... mit einem notify ein at +00:05:00 anlegen und dann mit if fragen, ob der Verbrauch immer noch so niedrig ist... aber das müsste Doif doch auch können also ohne ein at zu definieren?!
Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: Damian am 12 August 2018, 21:18:05
Zitat von: docb am 12 August 2018, 18:43:16
Hm, das scheint nicht zu  klappen - das gleiche wie vorher, er schickt die Nachricht los, obwohl der Drucker schon wieder druckt - im Ernstfall hätte er einfach den Druck abgebrochen ;-)
Ich glaube ich mache es einfach klassisch wie früher... mit einem notify ein at +00:05:00 anlegen und dann mit if fragen, ob der Verbrauch immer noch so niedrig ist... aber das müsste Doif doch auch können also ohne ein at zu definieren?!

Poste mal Ausgabe von list deines DOIFs.
Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: docb am 13 August 2018, 08:24:59
Guten Morgen,
das hier wäre der List - der Drucker läuft gerade ;-)

Internals:
   DEF        ([3D_Strom_Pwr:power] < 8 and [?3D_Strom_Sw] eq "on") (msg mail Schalte drucker ab)
   MODEL      FHEM
   NAME       do3D_Ruhe_aus
   NR         1236
   NTFY_ORDER 50-do3D_Ruhe_aus
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2018-08-13 08:21:59   Device          3D_Strom_Pwr
     2018-08-12 21:12:06   cmd             1
     2018-08-12 21:12:06   cmd_event       3D_Strom_Pwr
     2018-08-12 21:12:06   cmd_nr          1
     2018-08-13 08:21:59   e_3D_Strom_Pwr_power 149.32
     2018-08-12 13:26:12   mode            enabled
     2018-08-12 21:12:06   state           cmd_1
     2018-08-12 21:12:04   wait_timer      no timer
   Regex:
   attr:
     cmdState:
     wait:
       0:
         300
       1:
         20
     waitdel:
   condition:
     0          ReadingValDoIf($hash,'3D_Strom_Pwr','power') < 8 and InternalDoIf($hash,'3D_Strom_Sw','STATE') eq "on"
   devices:
     0           3D_Strom_Pwr
     all         3D_Strom_Pwr
   do:
     0:
       0          msg mail Schalte drucker ab
     1:
   helper:
     event      boot: off,current: 1092,eState: E: 275.2 P: 149.32 I: 1092 U: 228.2 f: 49.99,energy: 275.2,energyCalc: 7892.5,frequency: 49.99,power: 149.32,275.2,voltage: 228.2,zaehler: 7882.10000000034
     globalinit 1
     last_timer 0
     sleepdevice 3D_Strom_Pwr
     sleepsubtimer -1
     sleeptimer -1
     timerdev   3D_Strom_Pwr
     timerevent boot: off,current: 69,eState: E: 270.9 P: 7.26 I: 69 U: 230.3 f: 49.99,energy: 270.9,energyCalc: 7888.2,frequency: 49.99,power: 7.26,270.9,voltage: 230.3,zaehler: 7877.80000000034
     triggerDev 3D_Strom_Pwr
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: 3D_Strom_Pwr
       state: cmd_1
     timerevents:
       boot: off
       current: 69
       eState: E: 270.9 P: 7.26 I: 69 U: 230.3 f: 49.99
       energy: 270.9
       energyCalc: 7888.2
       frequency: 49.99
       power: 7.26
       270.9
       voltage: 230.3
       zaehler: 7877.80000000034
     timereventsState:
       boot: off
       current: 69
       eState: E: 270.9 P: 7.26 I: 69 U: 230.3 f: 49.99
       energy: 270.9
       energyCalc: 7888.2
       frequency: 49.99
       power: 7.26
       state: 270.9
       voltage: 230.3
       zaehler: 7877.80000000034
     triggerEvents:
       boot: off
       current: 1092
       eState: E: 275.2 P: 149.32 I: 1092 U: 228.2 f: 49.99
       energy: 275.2
       energyCalc: 7892.5
       frequency: 49.99
       power: 149.32
       275.2
       voltage: 228.2
       zaehler: 7882.10000000034
     triggerEventsState:
       boot: off
       current: 1092
       eState: E: 275.2 P: 149.32 I: 1092 U: 228.2 f: 49.99
       energy: 275.2
       energyCalc: 7892.5
       frequency: 49.99
       power: 149.32
       state: 275.2
       voltage: 228.2
       zaehler: 7882.10000000034
   internals:
     0           3D_Strom_Sw:STATE
     all         3D_Strom_Sw:STATE
   itimer:
   readings:
     0           3D_Strom_Pwr:power
     all         3D_Strom_Pwr:power
   trigger:
   uiState:
   uiTable:
Attributes:
   do         resetwait
   wait       300:20
Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: Otto123 am 13 August 2018, 08:58:22
Moin,

bist Du sicher das in 3D_Strom_Sw im STATE wirklich "on" steht?

Vielleicht musst Du 3D_Strom_Sw:state nehmen?

Gruß Otto
Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: amenomade am 13 August 2018, 09:43:18
Mit nur "wait 600" und kein "do resetwait" sollte es gehen.
Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: amenomade am 13 August 2018, 10:06:37
ZitatAllerdings funktioniert das so nicht, er triggert zwar brav auf den Stromverbrauch, setzt das Doif aber nicht zurück, wenn der Stromverbrauch wieder höher geht. Soweit ich die Commandref verstanden habe, sollte das doch mit resetwait gehen?

Da hast Du die Commandref falsch verstanden. Wenn der Stromverbrauch wieder höher geht, ändert sich der Zustand deines DOIFs auf cmd_2. Dein resetwait führt nur dazu, dass bei jedem neuen Event pwr, wo pwr < 8, er wiederum von 0 zählt.
Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: gloob am 13 August 2018, 11:53:37
So überwache ich meine Waschmaschine und meinen Drucker.

defmod Waschmaschine_Fertig DOIF ([HM_325D5B_Pwr:power] > 5 and [?Waschmaschine_Fertig] =~ "cmd_4|initialized")(set teleBot message "Waschmaschine ist an.")\
DOELSEIF ([HM_325D5B_Pwr:power] > 20 and [?Waschmaschine_Fertig] eq "cmd_1")(set teleBot message "Waschmaschine läuft.")\
DOELSEIF ([HM_325D5B_Pwr:power] > 20 and [?Waschmaschine_Fertig] eq "cmd_2")(set teleBot message "Waschmaschine ist fertig.")\
DOELSEIF ([HM_325D5B_Pwr:power] < 5 and [?Waschmaschine_Fertig] =~ "cmd_3|cmd_1")(set teleBot message "Waschmaschine ist aus.",set HM_325D5B_Sw off)
attr Waschmaschine_Fertig do resetwait
attr Waschmaschine_Fertig room Bad
attr Waschmaschine_Fertig wait 0:0:300:0


Über den Wait befehl kannst du die Wartezeiten einstellen, wann in einen neuen Status gewechselt wird. Bei mir muss der Verbrauchswert für 6 Minuten unter 20 Watt liegen, damit abgeschaltet wird bzw ich eine Message bekomme.
Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: Per am 13 August 2018, 12:28:09
Zäum das Pferd andersrum auf:

([3D_Strom_Pwr:power] < 8) (msg mail Schalte drucker ab)DOELSE
+ wait 600:0

Mit Resetwait startet du den Timer ja jedesmal neu, das willst du doch gar nicht.
Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: Damian am 13 August 2018, 14:28:34
Zitat von: gloob am 13 August 2018, 11:53:37
So überwache ich meine Waschmaschine und meinen Drucker.

defmod Waschmaschine_Fertig DOIF ([HM_325D5B_Pwr:power] > 5 and [?Waschmaschine_Fertig] =~ "cmd_4|initialized")(set teleBot message "Waschmaschine ist an.")\
DOELSEIF ([HM_325D5B_Pwr:power] > 20 and [?Waschmaschine_Fertig] eq "cmd_1")(set teleBot message "Waschmaschine läuft.")\
DOELSEIF ([HM_325D5B_Pwr:power] > 20 and [?Waschmaschine_Fertig] eq "cmd_2")(set teleBot message "Waschmaschine ist fertig.")\
DOELSEIF ([HM_325D5B_Pwr:power] < 5 and [?Waschmaschine_Fertig] =~ "cmd_3|cmd_1")(set teleBot message "Waschmaschine ist aus.",set HM_325D5B_Sw off)
attr Waschmaschine_Fertig do resetwait
attr Waschmaschine_Fertig room Bad
attr Waschmaschine_Fertig wait 0:0:300:0


Über den Wait befehl kannst du die Wartezeiten einstellen, wann in einen neuen Status gewechselt wird. Bei mir muss der Verbrauchswert für 6 Minuten unter 20 Watt liegen, damit abgeschaltet wird bzw ich eine Message bekomme.
Was soll resetwait hier bewirken? Es funktioniert mit resetwait hier nur deswegen, weil das Sendeintervall von HM_325D5B_Pwr über 6 Minuten liegt, ansonsten würde der Timer nie zum tragen kommen.
Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: gloob am 13 August 2018, 14:48:07
Keine Ahnung. hatte das ganze mal so hier im Forum gefunden und es funktioniert.
Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: Damian am 13 August 2018, 14:54:30
Zitat von: gloob am 13 August 2018, 14:48:07
Keine Ahnung. hatte das ganze mal so hier im Forum gefunden und es funktioniert.
ja, es wäre allerdings logischer do always zu verwenden (Wiederholungen werden durch Zustandsabfragen in der Definition mit cmd... unterbunden) damit es auch dann funktioniert, wenn die Wartezeit länger ist als das Sendeintervall vom Device.
Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: docb am 13 August 2018, 20:25:00
 :D Vielen Dank für die ganzen Antworten.
@Otto: Danke, sowohl state als auch STATE sind on, das habe ich geprüft
@per und amenomade: ich versuche jetzt Eure Variante. Rein logisch (ich versuche immer gerne zu verstehen, was ich so treibe) läuft dann folgendes ab: Wert unter 8 Watter -> triggert (und prüft noch ob der Drucker an ist) dann geht der Waittimer los. Wenn die Werte unter 8 Watt bleiben -> Drucker aus. Wenn nicht, springt Doif ins cmd2 (was es ja nicht gibt -> also passiert nix). Wenn wieder unter 8 Watt beginnt der Kreislauf von Neuem. Habe ich das richtig gecheckt?
Viele Grüße
doc
Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: amenomade am 13 August 2018, 20:40:59
Zitat von: docb am 13 August 2018, 20:25:00
:D Vielen Dank für die ganzen Antworten.
@Otto: Danke, sowohl state als auch STATE sind on, das habe ich geprüft
@per und amenomade: ich versuche jetzt Eure Variante. Rein logisch (ich versuche immer gerne zu verstehen, was ich so treibe) läuft dann folgendes ab: Wert unter 8 Watter -> triggert (und prüft noch ob der Drucker an ist) dann geht der Waittimer los. Wenn die Werte unter 8 Watt bleiben -> Drucker aus. Wenn nicht, springt Doif ins cmd2 (was es ja nicht gibt -> also passiert nix). Wenn wieder unter 8 Watt beginnt der Kreislauf von Neuem. Habe ich das richtig gecheckt?
Viele Grüße
doc
Richtig. cmd2 gibt es aber implizit. Das ist der Zustand wenn pwr über 8 ist. Das DOELSE ist implizit (Per hat es geschrieben, ist aber nicht nötig) und das Kommando ist leer => macht nichts.

DOIF (Bedingung1) (Kommando1)
ist gleich wie
DOIF (Bedingung1) (Kommando1) DOELSE (mach nix)
so lange "do always" o.ä. nicht benutzt wird.
Titel: Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: Brad Majors am 28 Mai 2020, 13:37:23
Hey, würde das auch gerne so umsetzen. Hat jemand zufällig ein "gut" arbeitendes DOIF griffbereit? Würde mir sehr helfen. Danke schön.
Titel: Antw:Nach Stromverbrauch schalten / Waittimer zurücksetzen
Beitrag von: docb am 28 Mai 2020, 17:16:55
Logo, funzt mittlerweile einwandfrei:

Internals:
   DEF        ([3D_Strom_Pwr:power] < 25 and [?OctoPrint:temperature_tool0_actual] < 50 and [?3D_Strom_Sw] eq "on") (set OctoPrint powermode shutdown; defmod at3D_Strom_Sw_aus_doif at +00:02:00 set 3D_Strom_Sw off;)

   NAME       do3D_Ruhe_aus

Attributes:
   alias      3D Strom nach 10 Minuten ohne Verbrauch abschalten
   group      Logik
   icon       it_printer
   room       Strom/Geräte
   wait       600

Viele Grüße
doc