[Gelöst] Kaffee fertig DOIF treibt mich in den wahnsinn

Begonnen von DasQ, 01 Januar 2024, 12:29:14

Vorheriges Thema - Nächstes Thema

DasQ

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 :)
Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

Adimarantis

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.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

DasQ

#2
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.
Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

Adimarantis

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.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

DasQ

ahhh übersehen ... wird umgehend getestet, ergibt klar sinn.
Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

Per

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

DasQ

#6
@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
Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

Adimarantis

Zitat von: Per am 01 Januar 2024, 14:40:25
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
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.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Adimarantis

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.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Per

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

DasQ

#10
Ich verlink hier 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
Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

DasQ

#11
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
Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org