[<Device>:<Reading>:sec] wenn Device in der Bedingung / Hysterese - Dämpfung

Begonnen von holle75, 28 Dezember 2019, 16:35:49

Vorheriges Thema - Nächstes Thema

holle75

... schwer zu formulieren... ich möchte vermeiden, dass der Boiler gegen Abend alle 2 (4) Minuten an und aus geschaltet wird. Da die Batterien unter Last einknicken (wenn nicht mehr genug Strom produziert wird), wird wieder cmd_2 aktiv. Danach, wenn wieder keine Last, cmd_1. Tagsüber möchte ich die 2 Minuten nicht erhöhen, sonst geht viel "Warmwasser" verloren ;)

Idee war ein

and [?ZirkusOben_BOILER_Stauraum:state:sec] > 600

in cmd_1. Da aber das zu schaltende Device auch in der Bedingung vorzufinden ist, funktioniert das so nicht.


define Container_XTENDER_Schalter_BoilerAnAusDOIF DOIF ([XtenderReadout:Volt_Batt] > 27
        and [XtenderReadout:Charge_Discharge_W] > 0
        and [Astro:SunAz] > 105
        and [Astro:SunAz] < 235
        and [Xtender_AC_out:Power__W:d] < 1200)
(set ZirkusOben_BOILER_Stauraum on)
DOELSE
(set ZirkusOben_BOILER_Stauraum off) )
attr Container_XTENDER_Schalter_BoilerAnAusDOIF wait 120:120



jemand eine Idee?

amenomade

Muss wirklich Volt_Batt in der Bedingung als Trigger sein?
Wenn nicht, pack es im Befehl mit IF
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

holle75

Volt_Batt und Charge_Discharge_W sind halt die beiden spannenden Werte. Auch wenn ich Volt_Batt rausnehme und nur auf Charge_Discharge_W trigger ... selbes (leicht anderes, zeitverschobenes) Phänomen da wenn der Boiler läuft der Wert ins Minus geht und sobald der Boiler aus ist, wieder im Plus.

Du meinst

(IF ([ZirkusOben_BOILER_Stauraum:state:sec] > 600) (set ZirkusOben_BOILER_Stauraum on) )

?

Gute Idee... muß ich nur mal durchüberlegen, was Statuswechsel in cmd_1 ohne wirklich geschaltet zu haben für Folgen haben könnte ...

EDIT: würde leider auch zB bei einer Wolke tagsüber, wenn in den 10 minuten liegend, dann für den Rest des Tages, weil weiterhin cmd_1, Totalausfall Boiler bis zum Abend bedeuten, denke ich?


holle75

... lässt sich wait mit einem IF berechnen??

attr xxx wait (IF ([ZirkusOben_BOILER_Stauraum:state:sec] < 600 SyntaxkeineAhnung):120


amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus


Damian

Man kann in einem DOIF eigene Readings setzen und diese als indirekte Angabe beim wait-Attribut angeben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

holle75

in der Theorie würde ich dann so genau das erreichen, was ich möchte? Das wait als Verzögerung/Eliminierung der Schaltung und das Reading als Dämpfer.

define Container_XTENDER_Schalter_BoilerAnAusDOIF DOIF (
        [$SELF:LetzteSchaltung]
        and [XtenderReadout:Volt_Batt] > 27
        and [XtenderReadout:Charge_Discharge_W] > 0
        and [Astro:SunAz] > 105
        and [Astro:SunAz] < 235
        and [Xtender_AC_out:Power__W:d] < 1200)
(set ZirkusOben_BOILER_Stauraum on)
DOELSE
(set ZirkusOben_BOILER_Stauraum off) )

attr Container_XTENDER_Schalter_BoilerAnAusDOIF DOIF_Readings LetzteSchaltung:([ZirkusOben_BOILER_Stauraum:state:sec] > 600)
attr Container_XTENDER_Schalter_BoilerAnAusDOIF wait 120:120


holle75

Mmh, LetzteSchaltung scheint keinerlei Werte/Infos zu liefern. cmd_1 wird nie aktiv.

Mir fällt gerade auch auf, dass Damian wohl was ganz anderes gemeint hat. Wobei ich nicht verstehe, wie eine Umsetzung aussehen würde.

holle75

... neuer Anlauf:

defmod Container_XTENDER_Schalter_BoilerAnAusDOIF DOIF (
       [XtenderReadout:Volt_Batt] > 27
       and [XtenderReadout:Charge_Discharge_W] > 0
       and [Astro:SunAz] > 105 and [Astro:SunAz] < 235
       and [Xtender_AC_out:Power__W:d] < 1200)
(set ZirkusOben_BOILER_Stauraum on, set Container_XTENDER_Schalter_BoilerAnAusDOIF_Daempfung Marker on) \
DOELSE (set ZirkusOben_BOILER_Stauraum off))

attr Container_XTENDER_Schalter_BoilerAnAusDOIF wait [Container_XTENDER_Schalter_BoilerAnAusDOIF_Daempfung:WaitValue]:120


plus:

defmod Container_XTENDER_Schalter_BoilerAnAusDOIF_Daempfung DOIF (
        [$SELF:Marker:sec] < 600) (set $SELF WaitValue 1200) \
DOELSEIF ([$SELF:Marker:sec] > 600) (set $SELF WaitValue 60)

attr Container_XTENDER_Schalter_BoilerAnAusDOIF_Daempfung readingList WaitValue Marker
attr Container_XTENDER_Schalter_BoilerAnAusDOIF_Daempfung waitsame 1200:0


Morgen soll gutes Wetter sein. Mal schauen, ob ich hier mal irgendwie weiterkomme ;)

Per

Zitat von: holle75 am 29 Dezember 2019, 10:20:24
... lässt sich wait mit einem IF berechnen??

attr xxx wait (IF ([ZirkusOben_BOILER_Stauraum:state:sec] < 600 SyntaxkeineAhnung):120
nein, aber mit ?:
attr xxx wait (([ZirkusOben_BOILER_Stauraum:state:sec] < 600) ? 1200 : 60)
sollte es gehen.

holle75

Oh Per, jetzt du wieder in galant.

So

define Container_XTENDER_Schalter_BoilerAnAusDOIF DOIF ([XtenderReadout:Volt_Batt] > 27 and [XtenderReadout:Charge_Discharge_W] > 0 and [Astro:SunAz] > 105 and [Astro:SunAz] < 235 and [Xtender_AC_out:Power__W:d] < 1200) (set ZirkusOben_BOILER_Stauraum on, set $SELF Marker on) \
DOELSE  (set ZirkusOben_BOILER_Stauraum off))
attr Container_XTENDER_Schalter_BoilerAnAusDOIF readingList Marker
attr Container_XTENDER_Schalter_BoilerAnAusDOIF wait [Container_XTENDER_Schalter_BoilerAnAusDOIF_Daempfung:WaitValue]:120

define Container_XTENDER_Schalter_BoilerAnAusDOIF_Daempfung DOIF ([Container_XTENDER_Schalter_BoilerAnAusDOIF:Marker:sec] < 600) (set $SELF WaitValue 1200) \
DOELSEIF ([Container_XTENDER_Schalter_BoilerAnAusDOIF:Marker:sec] > 600) (set $SELF WaitValue 60) \
DOELSEIF ([03:00]) (set $SELF WaitValue 60)
attr Container_XTENDER_Schalter_BoilerAnAusDOIF_Daempfung readingList WaitValue
attr Container_XTENDER_Schalter_BoilerAnAusDOIF_Daempfung waitsame 1200:0:0


hat es auf den ersten Blick jetzt auch bei mir funktioniert. Aber natürlich werde ich jetzt auch deine Variante probieren.

Dankeschön.

Edit: müßte dann der Ordung halber noch ein :120 hintendran?
attr xxx wait (([ZirkusOben_BOILER_Stauraum:state:sec] < 600) ? 1200 : 60):120


holle75

doch mal wieder viel komplizierter als gedacht. Es funktioniert nicht. Ich vermute, da der Boiler in dem ganzen Konglomerat ja auch immer geschaltet wird, ist die Prüfung auf die Laufzeit für die Katz. Ich dachte, :sec misst die Zeit seit der letzten Schaltung (tuts ja auch, nur in meinem Kopf wars die "letzte" Schaltung ... also die Zeit davor). Wohl nicht.

Neuer Erguss, der morgen getestet wird.

define Container_XTENDER_Schalter_BoilerAnAusDOIF DOIF (
[XtenderReadout:Volt_Batt] > 27 and
[XtenderReadout:Charge_Discharge_W] > 0 and
[Astro:SunAz] > 105 and
[Astro:SunAz] < 235 and
[Xtender_AC_out:Power__W:d] < 1200)
          (set ZirkusOben_BOILER_Stauraum on, set $SELF Marker on) \
DOELSE (set ZirkusOben_BOILER_Stauraum off)

attr Container_XTENDER_Schalter_BoilerAnAusDOIF readingList Marker
attr Container_XTENDER_Schalter_BoilerAnAusDOIF wait [Container_XTENDER_Schalter_BoilerAnAusDOIF_Daempfung:WaitValue]:120

define Container_XTENDER_Schalter_BoilerAnAusDOIF_Daempfung DOIF (
[Container_XTENDER_Schalter_BoilerAnAusDOIF:state] eq "cmd_2" and
[?Container_XTENDER_Schalter_BoilerAnAusDOIF:Marker:sec] < 600)
        (set $SELF WaitValue 1200) \
DOELSEIF (
[Container_XTENDER_Schalter_BoilerAnAusDOIF:state] eq "cmd_2" and
[?Container_XTENDER_Schalter_BoilerAnAusDOIF:Marker:sec] > 600)
         (set $SELF WaitValue 60) \
DOELSEIF ([03:00]) (set $SELF WaitValue 60)

attr Container_XTENDER_Schalter_BoilerAnAusDOIF_Daempfung readingList WaitValue
attr Container_XTENDER_Schalter_BoilerAnAusDOIF_Daempfung waitsame 1200:0:0


... und ich denke die ganze Zeit, dass es so kompliziert einfach nicht sein kann.