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
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
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?!
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.
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
Moin,
bist Du sicher das in 3D_Strom_Sw im STATE wirklich "on" steht?
Vielleicht musst Du 3D_Strom_Sw:state nehmen?
Gruß Otto
Mit nur "wait 600" und kein "do resetwait" sollte es gehen.
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.
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.
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.
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.
Keine Ahnung. hatte das ganze mal so hier im Forum gefunden und es funktioniert.
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.
: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
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.
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.
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