Moin Leude, ;)
Der Threadtitel sagt eigentlich schon alles, meine Kaffeemaschine und im Speziellen die Gosund Steckdosenleiste dahinter bringt mich zur Verzweiflung.
Eigentlich dachte ich, DOIF zu durchsteigen, aber die Kombinationen der Attribute lässt mich dran zweifeln.
Also die Kaffeemaschine hängt an einer "Smartmeter" Steckdosenleiste. Darüber lese ich den verbrauch der Kaffeemaschine aus. Auf der Steckdose läuft Tasmote mit einem Script das erkennt, wenn an dem Steckdosenplatz Strom verbraucht wird, der über eine gewisse Schwelle geht. Dadurch feuert dann eine via MQTT gesendete variable (VAR1) 10 sekündlich die werte raus. (normal sende die Steckdose nur alle 10 Minuten)
So nun zum DOIF (und ihr wisst gar nicht wie mir der Kopf steht, ich hab das Ding in den letzten Monaten so oft verändert, das ich euch gar nicht sagen kann, wie genau es sich jetzt verhält, weil ich es erst gerade eben wieder verändert hab. (ich weiß dämlich).
Ich hatte das mehrfach bis auf winzige kleinigkeiten am laufen.
seis wies ist, ich hätte ja gern ein wenig was erklärt bekommen wie es sich nun mit den verschieden attributen von DOIF verhält. da sind ja einige dabie die für mich in ihrer kombination eine vielfalt von unerwünschten effekten erzeugt. (frag mich jetzt nicht im speziellen, mir schwirrt der kopf, ich hab se glaub alle in jeder kombination versucht, ich steig nimma durch)
list
Internals:
DEF ([GOSUND_P1_4:POWER1] eq "on" and [?$SELF] =~ "cmd_5|initialize") (setreading DoIfKaffeeStatus Var0 [GOSUND_P1_4:Var1],{Log 3, "Kaffeemaschine wurde eingeschalten"})
DOELSEIF ([GOSUND_P1_4:Var1] > 950 and [?$SELF] eq "cmd_1") (setreading DoIfKaffeeStatus Var2 [GOSUND_P1_4:Var1], {Log 3, "Kaffeemaschine läuft"})
DOELSEIF ([GOSUND_P1_4:Var1] <= ([DoIfKaffeeStatus:Var2] - [DoIfKaffeeStatus:Var0]) and [?$SELF] eq "cmd_2") ({Log 3, "Kaffeemaschine ist bald fertig"})
DOELSEIF ([GOSUND_P1_4:Var1] <= ([DoIfKaffeeStatus:Var2] - [DoIfKaffeeStatus:Var0]) and [?$SELF] eq "cmd_3") (set telebot message @#Zuhause Kaffee: Fertig)
DOELSEIF ([GOSUND_P1_4:Var1] <= ([DoIfKaffeeStatus:Var2] - [DoIfKaffeeStatus:Var0]) and [?$SELF] eq "cmd_4") ({Log 3, "schalte Kaffeemaschine jetzt aus"}, set GOSUND_P1_4 POWER1 off)
FUUID 65193c23-f33f-5aff-8684-1981d5f858c5096c
MODEL FHEM
NAME DoIfKaffeeStatus
NOTIFYDEV DoIfKaffeeStatus,GOSUND_P1_4,global
NR 258
NTFY_ORDER 50-DoIfKaffeeStatus
STATE cmd_5
TYPE DOIF
VERSION 27740 2023-07-10 09:31:11
eventCount 2005
READINGS:
2024-01-01 12:03:01 Device GOSUND_P1_4
2024-01-01 09:54:52 Var0 0
2024-01-01 09:55:00 Var2 1023
2024-01-01 10:13:47 cmd 5
2024-01-01 10:13:47 cmd_event GOSUND_P1_4
2024-01-01 10:13:47 cmd_nr 5
2024-01-01 12:01:52 e_GOSUND_P1_4_POWER1 off
2024-01-01 12:03:01 e_GOSUND_P1_4_Var1 0
2023-12-31 05:37:04 mode enabled
2024-01-01 10:13:47 state cmd_5
2024-01-01 10:13:47 wait_timer no timer
Regex:
accu:
bar:
barAvg:
collect:
cond:
DoIfKaffeeStatus:
2:
Var0 ^DoIfKaffeeStatus$:^Var0:
Var2 ^DoIfKaffeeStatus$:^Var2:
3:
Var0 ^DoIfKaffeeStatus$:^Var0:
Var2 ^DoIfKaffeeStatus$:^Var2:
4:
Var0 ^DoIfKaffeeStatus$:^Var0:
Var2 ^DoIfKaffeeStatus$:^Var2:
GOSUND_P1_4:
0:
POWER1 ^GOSUND_P1_4$:^POWER1:
1:
Var1 ^GOSUND_P1_4$:^Var1:
2:
Var1 ^GOSUND_P1_4$:^Var1:
3:
Var1 ^GOSUND_P1_4$:^Var1:
4:
Var1 ^GOSUND_P1_4$:^Var1:
attr:
cmdState:
cmdpause:
repeatcmd:
repeatsame:
wait:
0:
1:
5
0
2:
30
3:
30
4:
900
900
waitdel:
waitsame:
condition:
0 ::ReadingValDoIf($hash,'GOSUND_P1_4','POWER1') eq "on" and ::InternalDoIf($hash,'DoIfKaffeeStatus','STATE') =~ "cmd_5|initialize"
1 ::ReadingValDoIf($hash,'GOSUND_P1_4','Var1') > 950 and ::InternalDoIf($hash,'DoIfKaffeeStatus','STATE') eq "cmd_1"
2 ::ReadingValDoIf($hash,'GOSUND_P1_4','Var1') <= (::ReadingValDoIf($hash,'DoIfKaffeeStatus','Var2') - ::ReadingValDoIf($hash,'DoIfKaffeeStatus','Var0')) and ::InternalDoIf($hash,'DoIfKaffeeStatus','STATE') eq "cmd_2"
3 ::ReadingValDoIf($hash,'GOSUND_P1_4','Var1') <= (::ReadingValDoIf($hash,'DoIfKaffeeStatus','Var2') - ::ReadingValDoIf($hash,'DoIfKaffeeStatus','Var0')) and ::InternalDoIf($hash,'DoIfKaffeeStatus','STATE') eq "cmd_3"
4 ::ReadingValDoIf($hash,'GOSUND_P1_4','Var1') <= (::ReadingValDoIf($hash,'DoIfKaffeeStatus','Var2') - ::ReadingValDoIf($hash,'DoIfKaffeeStatus','Var0')) and ::InternalDoIf($hash,'DoIfKaffeeStatus','STATE') eq "cmd_4"
do:
0:
0 setreading DoIfKaffeeStatus Var0 [GOSUND_P1_4:Var1],{Log 3, "Kaffeemaschine wurde eingeschalten"}
1:
0 setreading DoIfKaffeeStatus Var2 [GOSUND_P1_4:Var1], {Log 3, "Kaffeemaschine läuft"}
2:
0 {Log 3, "Kaffeemaschine ist bald fertig"}
3:
0 set telebot message @#Zuhause Kaffee: Fertig
4:
0 {Log 3, "schalte Kaffeemaschine jetzt aus"}, set GOSUND_P1_4 POWER1 off
5:
helper:
NOTIFYDEV DoIfKaffeeStatus,GOSUND_P1_4,global
event Var1: 0
globalinit 1
last_timer 0
sleepdevice GOSUND_P1_4
sleepsubtimer -1
sleeptimer -1
timerdev GOSUND_P1_4
timerevent Var1: 0
triggerDev GOSUND_P1_4
timerevents:
Var1: 0
timereventsState:
Var1: 0
triggerEvents:
Var1: 0
triggerEventsState:
Var1: 0
internals:
all DoIfKaffeeStatus:STATE
readings:
all GOSUND_P1_4:POWER1 GOSUND_P1_4:Var1 DoIfKaffeeStatus:Var2 DoIfKaffeeStatus:Var0
trigger:
uiState:
uiTable:
Attributes:
DbLogExclude .*
do always
group Gosund
room Kueche
sortby 4
timerWithWait 1
wait :5,0:30:30:900,900
Klar ist da ein zweig "doppelt drin, aber ich dachte ich könnte da mit den atributen besser selektieren. aber ich glaub ich hab ein attributknoten rein gemacht. also in meim kopf fühlt es sich so an. ihr wisst garnicht wie oft ich mir gesagt hab, jetzt hab ichs, es muss klappen. bis mir dann am drauf folgenden tag wiedermal einer bewies was ich alles übersehen hatte.
dinge wie da hängen ja mehrer verbrauche dran oder was ist wenn vorher ausgeschaltet wird. ständig kommt ein neuer fallstrick dazu.
Hab dann zwei temporär variablen gebaut, womit ich mir das IST vor einschalten, das nach einschalten, weg sicher um damit im späteren zu arbeiten.
Screenshot zeigt wie sich die Kaffeemaschine an der Gosung verhält. Der Bimetalschalter in der Kaffemaschine, trennt ca jede minute, ergo kein verbrauch. Da das takten je nach Füllung mal etwas länger dauert.
ich sag gleichmal danke vorab :)
Das Erste was mir auffällt ist "do always" - das triggert dir möglicherweise ständig Zustände.
Ich denke ich habe einen ganz ähnlich gearteten Anwendungsfall:
Unsere Waschmaschine hängt an einem HMIP Strommesser und ich "errate" anhand des Verbrauchs in welchem Zustand sie sich befindet.
Der Code schaut so aus (es sind keine weiteren Attribute gesetzt):
([HMIP_PSM_0001D9285849CB:6.POWER]>1500)
(set Miele_Waschmaschine Heizen)
DOELSEIF
([Miele_Waschmaschine] eq "Heizen" and [HMIP_PSM_0001D9285849CB:6.POWER]<500)
(set Miele_Waschmaschine Laeuft)
DOELSEIF
([Miele_Waschmaschine] eq "Laeuft" and [HMIP_PSM_0001D9285849CB:6.POWER]>220 and [HMIP_PSM_0001D9285849CB:6.POWER]<1500)
(set Miele_Waschmaschine Schleudern)
DOELSEIF
([Miele_Waschmaschine] eq "Schleudern" and [HMIP_PSM_0001D9285849CB:6.POWER:avg2]<2.5)
(set Miele_Waschmaschine Fertig)
DOELSEIF
([HMIP_PSM_0001D9285849CB:6.CURRENT]==0.0)
(set Miele_Waschmaschine Bereit)
Dazu kommt dann noch ein Dummy "Miele_Waschmaschine" welches zum Speichern des Zustands verwendet wird.
Vielleicht hilfts.
Der Verbrauchswert allein bringt mich da nicht weiter. ich hab fast das gleiche Doif wie du, für Waschmaschine/Trockner/Spülmaschine am laufen. Dort funktioniert das wunderbar, weil der verbrauch nie auf 0 runter geht.
Nur macht mir der Bimetalschalter der kaffemaschine, da nenn strich durch die rechnung.
wärends des brühens, schaltet der alle minute, einfach die kaffeemaschine "aus".(null verbrauch nicht aus, siehe bild)
dann dachte ich ok das zählen wir einfach, allerdings vareiert die menge in der maschine (mal 5 tassen mal 7 mal 11 usw.) und die maschine arbeitet je nach verkalkung unterschiedlich schnell.
ich weis, alles super dämlich, aber ich bin mir sicher das des geht, nur hab ich nenn knoten im kopf.
Und wenn du mit avg den Durchschnitt nimmst um diese kurzen "0" Phasen auszublenden?
Siehe auch meine Waschmaschine - um zu erkennen ob sie fertig ist bilde ich "avg2<2.5" da es gerade am Schluss noch starke Schwankungen gibt, wenn der Motor immer nochmal 1-2 Umdrehungen macht, bis er dann ganz aufhört.
ahhh übersehen ... wird umgehend getestet, ergibt klar sinn.
Zitat von: Adimarantis am 01 Januar 2024, 13:58:34Dazu kommt dann noch ein Dummy "Miele_Waschmaschine" welches zum Speichern des Zustands verwendet wird.
Dafür gibt es attr cmdState
@Per mach ich in dem ich einfach readings schreib. kein plan ob das so falscher ist.
@Adimarantis
nach kurzzeitigem hirnvakuum hier mal das vorläufige ergebniss.
(ich kann leider nicht so viel testen, das macht meine pumpe nimmer mit) ;D
do always is rausgeflogen
und wenn ich dich recht verstanden hab, sind die zeiten, für die der durchschnitt gilt, die zeiten von wait und timerwithwait.
([GOSUND_P1_4:POWER1] eq "on" and [?$SELF] =~ "cmd_5|initialize") (setreading DoIfKaffeeStatus Var0 [GOSUND_P1_4:Var1],{Log 3, "Kaffeemaschine wurde eingeschalten"})
DOELSEIF ([GOSUND_P1_4:Var1:avg2] > 950 and [?$SELF] eq "cmd_1") (setreading DoIfKaffeeStatus Var2 [GOSUND_P1_4:Var1], {Log 3, "Kaffeemaschine läuft"})
DOELSEIF ([GOSUND_P1_4:Var1:avg2] <= ([DoIfKaffeeStatus:Var2] - [DoIfKaffeeStatus:Var0]) and [?$SELF] eq "cmd_2") ({Log 3, "Kaffeemaschine ist bald fertig"})
DOELSEIF ([GOSUND_P1_4:Var1:avg2] <= ([DoIfKaffeeStatus:Var2] - [DoIfKaffeeStatus:Var0]) and [?$SELF] eq "cmd_3") (set telebot message @#Zuhause Kaffee: Fertig)
DOELSEIF ([GOSUND_P1_4:Var1:avg2] <= ([DoIfKaffeeStatus:Var2] - [DoIfKaffeeStatus:Var0]) and [?$SELF] eq "cmd_4") ({Log 3, "schalte Kaffeemaschine jetzt aus"}, set GOSUND_P1_4 POWER1 off)
und klar werd ichs später noch etwas einkürzen, aber wenn ich nimmer durchsteig versuch ich es zumindest auszuformulieren. liest sich einfacher und schöner
Zitat von: Per am 01 Januar 2024, 14:40:25Zitat von: Adimarantis am 01 Januar 2024, 13:58:34Dazu kommt dann noch ein Dummy "Miele_Waschmaschine" welches zum Speichern des Zustands verwendet wird.
Dafür gibt es attr cmdState
Stimmt. Wenn es nur um die Zustandsübergänge ginge, dann würde das reichen (an die Möglichkeit hatte ich noch gar nicht gedacht). Ich verwende das Dummy aber auch gleich als Zustandsanzeige in FTUI.
Zitat von: DasQ am 01 Januar 2024, 14:45:45und wenn ich dich recht verstanden hab, sind die zeiten, für die der durchschnitt gilt, die zeiten von wait und timerwithwait.
avg2 ist der Durchschnitt der letzten 2 Werte - wenn jetzt dein 10 Sekunden Rythmus auch mal zwei "Nuller" erwischen könnte, dann musst du das evtl. erhöhen, so dass sicher ein Wert>0 dabei ist.
Jeder höhere Wert verzögert natürlich dann deine "Kaffee Fertig" Meldung um weitere 10 Sekunden.
Zitat von: Adimarantis am 01 Januar 2024, 14:50:44Ich verwende das Dummy aber auch gleich als Zustandsanzeige in FTUI.
Auch dafür geht das. Du musst dem DOIF nur den Namen des Dummys geben (und den Dummy weglassen).
Ich verlink hier (https://forum.fhem.de/index.php/topic,95759.0.html) mal einfach den Ursprung zu dem ,,avg"
Die 2 hat noch nicht gereicht. Ich erhöhe den Wert mal in den einzelnen doif Zweigen.
Ganz am Rand ist mir aufgefallen, das ich in der tasmota rule Mist gebaut hab.
So ist das, da sucht man einen Fehler und baut drei neue ein.
******************edit**************
Also auch avg klappt noch nicht.
Ich muß dazu sagen, tasmota feuert während des Brühen deutlich öfters (so alle 1-5 Sekunden und nur wenn 0 verbraucht wird, minütlich.)
Ich Fummel heut erstmal an der tasmota Rules, das muß sauberer und weniger spamend gehen (180k Datenbank Einträge ...)
Ich meld mich wieder
da ich ja auch inzwischen in dem alter bin, wo man richtig faul wird, hab ich delegiert ::) ;)
ja nö, also ich bin gerade dabei, mein 3 jungs das ganze hier (und das leben) etwas näher zu bringen und so hab ich den mittleren(23) damit beschäftigt das ganze in tasmotascript zu lösen und wie ich finde, hat er da bis jetzt ganze arbeit geleistet.
das (sein) vorläufiges ergebniss möchte ich euch aber nicht vorenthalten.
das tasmota mit scripting aktiviert muß man selber bauen. hatte ich ihm bereits vorbereitet kompiliert.
(für den fall, das will einer nachvollziehen, kann ich gern auch das esp8266/85 image/bin uppen)
so und hier nun das script
>D
tmp=0
tmp2=0
alt=0
M:mit=0 30
i:count=0
verb=0
sta=0
>T
;Analogwert in INT(2/4/7/10) umwandeln
tmp=int(Analog#A0/100)
;aktu Verbrauch einlesen
verb=Energy#Power
if alt!=tmp
then
;print alter Wert %alt%
;print neuer Wert %tmp%
switch tmp
case 2
print Dose1
if pwr[3]==1
then =>power3 0
else =>power3 1
endif
case 4
print Dose2
if pwr[2]==1
then =>power2 0
else =>power2 1
endif
case 7
print Dose3
if pwr[1]==1
then =>power1 0
else =>power1 1
endif
ends
endif
alt=tmp
>S
if pwr[1]==1
and verb>=90.0
and sta==0
then
sta=1
print ---------START Count res----------
=>Publish tele/%topic%/SENSOR {"Kaffee":"Start"}
count=0
endif
if sta==1
then
print Verbrauch: %verb%
mit=verb
print Mittelwert: %mit%
endif
if count>=30.00
then
print Vergleich
;print Count: %count%
if mit<=50.0
and sta==1
then
print -----------KAFFE Fertig-------------
=>Publish tele/%topic%/SENSOR {"Kaffee":"Fertig"}
sta=0
=>power1 0
endif
count=0
endif