watchdog trigger / retrigger

Begonnen von pjakobs, 31 Dezember 2019, 23:53:12

Vorheriges Thema - Nächstes Thema

pjakobs

Moin zusammen, ich habe meine Espressomaschine (eine schöne, alte, analoge VBM Domobar) hinter einem SONOFF hängen, der sie ein- und ausschaltet und auch den Stromverbrauch messen kann.
Bisher hab ich sie immer nur eingeschaltet und manuell oder wenn ich das Haus verlassen habe wieder ausgeschaltet. Das hat dazu geführt, dass sie, wenn ich daheim war, erst ausgeschaltet wurde, wenn ich zu Bett ging.

Erster Gedanke: ein Watchdog.

SW_Kaffee:ON 01:00 SW_Kaffee:OFF set SW_Kaffee OFF


Funktioniert. Hat aber den Nachteil, dass das Teil fix nach Ablauf der Zeit abgeschaltet wird.

Also zweiter Gedanke: der SONOFF kann mir ja sagen, wieviel Energie die Maschine gerade verbraucht, also am Gerät für die Maschine (SW_Kaffee) folgendes stateFormat konfiguriert:



{
if ( ReadingsVal( "SW_Kaffee", "kaffee", "") eq "OFF" ) {
  return "OFF";
  }
elsif ( ReadingsVal( "SW_Kaffee", "kaffee-energy-current", 0 ) < 0.2) {
  return "READY";
  }
elsif ( ReadingsVal( "SW_Kaffee", "kaffee-energy-factor", 0 ) > 0.95) {
  return "HEATING";
  }
else {
  return "BREWING";
  }
}

jetzt wird der State, wie gewollt, OFF für ausgeschaltet, READY für an und aufgewärmt, BREWING für Kaffeebezug und HEATING wenn die Heizung läuft.

Jetzt mag aber der watchdog nicht mehr, denn der State wird ja nie mehr ON. Klar, ich könnte das auf "HEATING" ändern, aber das würde ja bei jedem mal, dass die Heizung eingeschaltet wird den Watchdog retriggern. Damit wäre seine Funktion dahin.

Das Device hat ein Reading "kaffee", dass ON ist, solange die Maschine an ist.

Was ich mir wünsche ist nun folgendes:

- kaffee ON -> starte Watchdog
- BREWING -> retrigger Watchdog

Wenn ich am Watchdog folgendes konfiguriere, dann triggert er gar nicht mehr:

SW_Kaffee:kaffee:ON 01:00 (SW_Kaffee:OFF|SW_Kaffee:BREWING) set SW_Kaffee OFF


kann mir jemand den rechten Weg weisen?

Grüße und ein tolles neues Jahr

pj

rudolfkoenig

stateFormat hilft hier nicht, weil es nur fuer die Anzeige verwendet wird, kein Event generiert, und watchdog kennt nur Events.
Ich wuerde es mit userReadings versuchen.

pjakobs

so, ich glaub jetzt passt's.
Ich hab folgendes:

mein Device für den Tasmota Switch (SONOFF POW):

define SW_Kaffee TASMOTA_DEVICE kaffee
setuuid SW_Kaffee 5c585f8b-f33f-ae14-ddba-5b9bd9c76d150d2c
attr SW_Kaffee userattr lightSceneParamsToSave lightSceneRestoreOnlyIfChanged:1,0
attr SW_Kaffee IODev MyBroker
attr SW_Kaffee devStateIcon ON:rc_GREEN:OFF OFF:rc_RED:ON
attr SW_Kaffee icon fa_coffee
attr SW_Kaffee lightSceneParamsToSave state
attr SW_Kaffee publishSet ON OFF /cmnd/kaffee/POWER
attr SW_Kaffee room 01-Kueche,80-SONOFF
attr SW_Kaffee subscribeReading_80-Licht /stat/kaffee/POWER
attr SW_Kaffee subscribeReading_Energy /stat/kaffee/ENERGY
attr SW_Kaffee subscribeReading_Sensor /tele/kaffee/SENSOR
attr SW_Kaffee subscribeReading_Status /stat/kaffee/STATUS
attr SW_Kaffee userReadings moreState
attr SW_Kaffee verbose 3
attr SW_Kaffee webCmd ON:OFF


Weil ich mir nicht sicher war, ob ich die Berechnung im userReading machen kann, hab ich ein Notify dafür gebaut:

define NO_Kaffee notify SW_Kaffee:kaffee-energy-current:.*  {\
if ( ReadingsVal( "SW_Kaffee", "kaffee", "") eq "OFF" ) {\
   fhem("setReading SW_Kaffee moreState OFF");;\
   }\
   elsif ( ReadingsVal( "SW_Kaffee", "kaffee-energy-factor", 0 ) > 0.95 && ReadingsVal("SW_Kaffee", "kaffee-energy-current",0) >4){\
   fhem("setReading SW_Kaffee moreState HEATING");;\
   }\
   elsif ( ReadingsVal( "SW_Kaffee", "kaffee-energy-factor",0) > 0.5 && ReadingsVal( "SW_Kaffee", "kaffee-energy-factor",0) < 0.95 && ReadingsVal("SW_Kaffee", "kaffee-energy-current", 0 ) <0.5){\
   fhem("setReading SW_Kaffee moreState  BREWING");;\
   }\
   elsif ( ReadingsVal( "SW_Kaffee", "kaffee-energy-current", 0 ) < 0.2) {\
   fhem("setReading SW_Kaffee moreState READY");;\
   }\
}\

setuuid NO_Kaffee 5e0d277e-f33f-ab0a-bc77-2cea16393e7f16b2
attr NO_Kaffee disabledAfterTrigger 2
attr NO_Kaffee room 01-Kueche

zwei Dinge dazu: erstens habe ich das Notify so konfiguriert, dass es nur auf eines der Readings reagiert, um mehrere Trigger für einen Schaltvorgang zu vermeiden, gleichzeitig habe ich mit "disableAfterTrigger 2" versucht, das ganze ein bisschen zu "debouncen" weil natürlich der gemessene Strom immer ein bisschen schwankt.
Die Schwellen für den Leistungsfaktor (kaffee-energy-factor) und die Stromaufnahme (kaffee-energy-current) sind dabei durch ausprobieren herausgekommen. Die Pumpe ist eine induktive Last während die Heizung eine rein resistive Last ist. Idealerweise ist der Leistungsfaktor beim Heizen immer 1 und beim Pumpen (also wenn man Kaffee macht) immer kleiner 1, in Ruhe null.
Was ich nicht abbilden kann ist der Zustand, wenn gleichzeitig die Heizung und die Pumpe laufen, einfach weil der Strom durch die Heizwindungen ca. 5,4A beträgt, die Pumpe aber nur etwa 5% davon zieht, d.h. der Leistungsfaktor ändert sich so wenig, dass es nicht sicher messbar ist und auch der Strom ist kein guter Indikator. Der Zustand bleibt also außenvor.

Zu guter Letzt der Watchdog:

define WD_Kaffee watchdog (SW_Kaffee:ON|SW_Kaffee:moreState:.BREWING) 01:00 (SW_Kaffee:OFF) set SW_Kaffee OFF
setuuid WD_Kaffee 5e08d99f-f33f-ab0a-3dd7-dc28079462a8e9bf
attr WD_Kaffee autoRestart 1
attr WD_Kaffee room 01-Kueche


der wird getriggert / retriggert von ON und dem moreState BREWING. Mir ist nicht ganz klar geworden, warum der Punkt vor Brewing sein muss, aber das warf das "generate device" aus dem event log aus. Beendet wird der Trigger nur, wenn der Status auf OFF geht, was spätestens eine Stunde nach dem letzten Triggern oder eben extern durch mein HOMEMODE Modul passiert.

Und damit das alles auch noch hübsch wird, kam das hier in's tabletui:

<div class="card lift">
   <header>Kaffee</header>
   <div data-type="switch"
      data-device="SW_Kaffee"
      data-get="moreState"
      data-set-states='["ON","OFF","OFF","OFF"]'
      data-states='["OFF","HEATING","BREWING","READY"]'
      data-colors='["grey","red","navy","#207034"]'
      data-icons='["","fa-coffee","fa-coffee","fa-coffee"]'
      data-background-colors='["dark-grey","saddlebrown","saddlebrown","saddlebrown"]'
      data-color="#505050">
   </div>
</div>


Grüße

pj