FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: satprofi am 08 August 2016, 09:34:06

Titel: Was ist da falsch?
Beitrag von: satprofi am 08 August 2016, 09:34:06
Sollte nicht die erste Bedingung heute zutreffen?


([07:44-17:00] and $mday==8 and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)
DOELSEIF (($month >10 or $month <3) and [Ladestatus] < 2 and [Ueberschuss:state:d] > 100 and [07:45-19:00] and [Absorbtionsphase] eq "Closed" and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)
DOELSEIF (($month >10 or $month <3) and [Ladestatus] < 3 and [Ueberschuss:state:d] > 200 and [07:45-18:00] and [Absorbtionsphase] eq "Closed" and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)
DOELSEIF (($month >10 or $month <3) and [Ladestatus] < 4 and [Ueberschuss:state:d] > 300 and [07:45-18:00] and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)
DOELSEIF (($month >10 or $month <3) and [Ladestatus] < 5 and [Ueberschuss:state:d] > 400 and [07:45-18:00] and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)
DOELSEIF (($month >10 or $month <3) and [Ladestatus] >= 5 and [Ueberschuss:state:d] > 500 and [07:45-18:00] and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)
DOELSEIF (($month <11 and $month >2) and [Ladestatus] < 2 and [Ueberschuss:state:d] > 200 and [07:45-19:00] and [Absorbtionsphase] eq "Closed" and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)
DOELSEIF (($month <11 and $month >2) and [Ladestatus] < 3 and [Ueberschuss:state:d] > 400 and [07:45-18:00] and [Absorbtionsphase] eq "Closed" and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)
DOELSEIF (($month <11 and $month >2) and [Ladestatus] < 4 and [Ueberschuss:state:d] > 600 and [07:45-18:00] and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)
DOELSEIF (($month <11 and $month >2) and [Ladestatus] < 5 and [Ueberschuss:state:d] > 800 and [07:45-18:00] and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)
DOELSEIF (($month <11 and $month >2) and [Ladestatus] >= 5 and [Ueberschuss:state:d] > 1000 and [07:45-18:00] and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)
DOELSEIF ([Ueberschuss:state:d] <1 or [Netz_Schuetz_aus] eq "on") (set Batterielader_aus off)



Es schaltet aber cmd11

send from OP3
Titel: Antw:Was ist da falsch?
Beitrag von: igami am 08 August 2016, 12:37:40
Ich würde ja versuchen zu helfen, aber nur, wenn du ein paar Zeilenumbrüche einbaust. Ist mir so zu unübersichtlich.
Titel: Antw:Was ist da falsch?
Beitrag von: satprofi am 08 August 2016, 12:41:30
Hallo. Habe doch Code gesetzt. Kack tapatalk

send from OP3

Titel: Antw:Was ist da falsch?
Beitrag von: Ellert am 08 August 2016, 12:56:41
2 Zeilenumbrüche sind noch zu wenig, sonst würde ich mir das DOIF auch ansehen.

Du könntest das DOIF mal mitloggen, dann hast Du alle Infos kompakt vorliegen und kannst das Verhalten selbst analysieren und dem Problem auf die Spur kommen.

define LogDOIF DOIF ([<Name des zu analysierenden DOIF>:""] or [<Gerät 1>:"<Reading>:"] or [<Gerät 2>:"<Reading>:"] ...)
   ({Log 1, "$SELF --> Device: $DEVICE, Events: $EVENTS"})
attr LogDOIF do always

Titel: Antw:Was ist da falsch?
Beitrag von: automatisierer am 08 August 2016, 14:04:27
cmd1 triggert um 7.44, die anderen um 7.45

Wenn du die Zeiten alle auf 7.45 setzt, dann wird das erste zutreffende CMD ausgeführt.

So wird erst um 7.44 das cmd1 getriggert und wenn wahr ausgeführt - und um 7.45 die ganzen DOELSEIF Zweige und der erste der wahr wird, wird ausgeführt.
Titel: Antw:Was ist da falsch?
Beitrag von: satprofi am 08 August 2016, 14:23:55
Hallo.
Sollte nicht der 8. eines Monates Vorrang haben? Oder muss ich den Rest am 8. verbieten?
Titel: Antw:Was ist da falsch?
Beitrag von: automatisierer am 08 August 2016, 14:38:47
wieso hat der 8.Tag Vorrang? Hat der liebe Gott da das DOIF erschaffen?

Nix verbieten, nur alle Timer auf 7.45 stellen, dann wird das erste passende CMD ausgeführt und dann bleibts auch dabei. So wie du es aktuell hast, wird eine Minute nachdem CMD1 wahr geworden ist, also um 7.45 CMD2-CMD123 überprüft und davon dann das erst zutreffende CMD ausgeführt, auch wenn CMD1 in der Zeit noch wahr ist.
Titel: Antw:Was ist da falsch?
Beitrag von: igami am 08 August 2016, 15:13:36
Ich war mal so frei... jetzt kann man wenigstens was erkennen.

([07:44-17:00] and
$mday==8 and
[Netz_Schuetz_aus] eq "off"
)(
  set Batterielader_aus off
)
DOELSEIF
(($month >10 or
  $month <3
) and
[Ladestatus] < 2 and
[Ueberschuss:state:d] > 100 and
[07:45-19:00] and
[Absorbtionsphase] eq "Closed" and
[Netz_Schuetz_aus] eq "off"
)(
  set Batterielader_aus off
)
DOELSEIF
(($month >10 or
  $month <3
) and
[Ladestatus] < 3 and
[Ueberschuss:state:d] > 200 and
[07:45-18:00] and
[Absorbtionsphase] eq "Closed" and
[Netz_Schuetz_aus] eq "off"
)(
  set Batterielader_aus off
)
DOELSEIF
(($month >10 or
  $month <3
) and
[Ladestatus] < 4 and
[Ueberschuss:state:d] > 300 and
[07:45-18:00] and
[Netz_Schuetz_aus] eq "off"
)(
  set Batterielader_aus off
)
DOELSEIF
(($month >10 or
  $month <3
) and
[Ladestatus] < 5 and
[Ueberschuss:state:d] > 400 and
[07:45-18:00] and
[Netz_Schuetz_aus] eq "off"
)(
  set Batterielader_aus off
)
DOELSEIF
(($month >10 or
  $month <3
) and
[Ladestatus] >= 5 and
[Ueberschuss:state:d] > 500 and
[07:45-18:00] and
[Netz_Schuetz_aus] eq "off"
)(
  set Batterielader_aus off
)
DOELSEIF
(($month <11 and
  $month >2
) and
[Ladestatus] < 2 and
[Ueberschuss:state:d] > 200 and
[07:45-19:00] and
[Absorbtionsphase] eq "Closed" and
[Netz_Schuetz_aus] eq "off"
)(
  set Batterielader_aus off
)
DOELSEIF
(($month <11 and
  $month >2
) and
[Ladestatus] < 3 and
[Ueberschuss:state:d] > 400 and
[07:45-18:00] and
[Absorbtionsphase] eq "Closed" and
[Netz_Schuetz_aus] eq "off"
)(
  set Batterielader_aus off
)
DOELSEIF
(($month <11 and
  $month >2
) and
[Ladestatus] < 4 and
[Ueberschuss:state:d] > 600 and
[07:45-18:00] and
[Netz_Schuetz_aus] eq "off"
)(
  set Batterielader_aus off
)
DOELSEIF
(($month <11 and
  $month >2
) and
[Ladestatus] < 5 and
[Ueberschuss:state:d] > 800 and
[07:45-18:00] and
[Netz_Schuetz_aus] eq "off"
)(
  set Batterielader_aus off
)
DOELSEIF
(($month <11 and
  $month >2
) and
[Ladestatus] >= 5 and
[Ueberschuss:state:d] > 1000 and
[07:45-18:00] and
[Netz_Schuetz_aus] eq "off"
)(
  set Batterielader_aus off
)
DOELSEIF
([Ueberschuss:state:d] <1 or
[Netz_Schuetz_aus] eq "on"
)

Ich würde versuchen alle Bedingungen zusammen zu fassen, sodass du nur cmd1 und cmd2 hast.
Titel: Antw:Was ist da falsch?
Beitrag von: satprofi am 08 August 2016, 16:08:02
Ok, verstanden. Danke.
ich war der Meinung das perl von oben nach unten abfragt, und was zuerst zutrifft, sticht.

Alles in nur 2 cmd bedeutet das ich mit or arbeiten muss.
Titel: Antw:Was ist da falsch?
Beitrag von: satprofi am 08 August 2016, 18:52:45
So, habe es einmal gekürzt.
mal sehen obs passt.


([07:45-17:00] and $mday==9 and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)
DOELSEIF ((($month >10 or $month <3) and $mday!=9 and [07:45-17:00] and [Netz_Schuetz_aus] eq "off") and ([Ladestatus] < 2 and [Ueberschuss:state:d] > 100 and [Absorbtionsphase] eq "Closed") or ([Ladestatus] < 3 and [Ueberschuss:state:d] > 200 and [Absorbtionsphase] eq "Closed") or ([Ladestatus] < 4 and [Ueberschuss:state:d] > 300) or ([Ladestatus] < 5 and [Ueberschuss:state:d] > 400) or ([Ladestatus] >= 5 and [Ueberschuss:state:d] > 500)) (set Batterielader_aus off)
DOELSEIF ((($month <11 and $month >2) and $mday!=9 and [07:45-18:00] and [Netz_Schuetz_aus] eq "off") and ([Ladestatus] < 2 and [Ueberschuss:state:d] > 200 and [Absorbtionsphase] eq "Closed") or ([Ladestatus] < 3 and [Ueberschuss:state:d] > 400 and [Absorbtionsphase] eq "Closed") or ([Ladestatus] < 4 and [Ueberschuss:state:d] > 600) or ([Ladestatus] < 5 and [Ueberschuss:state:d] > 800) or ([Ladestatus] >= 5 and [Ueberschuss:state:d] > 1000)) (set Batterielader_aus off)
DOELSEIF ([Ueberschuss:state:d] <1 or [Netz_Schuetz_aus] eq "on") (set Batterielader_aus on)
Titel: Antw:Was ist da falsch?
Beitrag von: satprofi am 09 August 2016, 10:50:40
Verstehe ich nicht. Trotz 9. Des Monats wird cmd2 ausgeführt.
Why?

send from OP3

Titel: Antw:Was ist da falsch?
Beitrag von: automatisierer am 09 August 2016, 11:34:39
ist noch was unübersichtlich mit den vielen bedingungen. Aber ich sage mal, dass du das $mday mit den klammern und einem 'or' ausgehebelt hast
Titel: Antw:Was ist da falsch?
Beitrag von: satprofi am 09 August 2016, 17:41:36
Ok, vielleicht klappts so:

(([07:45-17:00] and $mday==10) and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)
Titel: Antw:Was ist da falsch?
Beitrag von: satprofi am 09 August 2016, 18:23:46
Zitat von: automatisierer am 08 August 2016, 14:38:47
wieso hat der 8.Tag Vorrang? Hat der liebe Gott da das DOIF erschaffen?

Nix verbieten, nur alle Timer auf 7.45 stellen, dann wird das erste passende CMD ausgeführt und dann bleibts auch dabei. So wie du es aktuell hast, wird eine Minute nachdem CMD1 wahr geworden ist, also um 7.45 CMD2-CMD123 überprüft und davon dann das erst zutreffende CMD ausgeführt, auch wenn CMD1 in der Zeit noch wahr ist.

Hallo.
vestehe ich nicht ganz. Wenn ich explizit den 8. eines Monats ausklammere, kann doch der zeitpunkt egal sein? Der dürfte doch später , also um 7:45 gar nicht zum zug kommen?
Titel: Antw:Was ist da falsch?
Beitrag von: automatisierer am 09 August 2016, 21:14:51
Zitat von: satprofi am 09 August 2016, 18:23:46
Wenn ich explizit den 8. eines Monats ausklammere, kann doch der zeitpunkt egal sein? Der dürfte doch später , also um 7:45 gar nicht zum zug kommen?
richtig, das geht - aber den hattest du ja durch ein or gekillt.

und das hatte nix damit zu tun:
(([07:45-17:00] and $mday==10) and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)

sondern damit:

(
(($month >10 or $month <3) and $mday!=9 and [07:45-17:00] and [Netz_Schuetz_aus] eq "off")
and
([Ladestatus] < 2 and [Ueberschuss:state:d] > 100 and [Absorbtionsphase] eq "Closed")
or
([Ladestatus] < 3 and [Ueberschuss:state:d] > 200 and [Absorbtionsphase] eq "Closed")
or
([Ladestatus] < 4 and [Ueberschuss:state:d] > 300)
or
([Ladestatus] < 5 and [Ueberschuss:state:d] > 400)
or
([Ladestatus] >= 5 and [Ueberschuss:state:d] > 500)
)
(set Batterielader_aus off)


was übersetzt bedeutet, wahr wenn:


(($month >10 or $month <3) and $mday!=9 and [07:45-17:00] and [Netz_Schuetz_aus] eq "off")
and
([Ladestatus] < 2 and [Ueberschuss:state:d] > 100 and [Absorbtionsphase] eq "Closed")


oder


([Ladestatus] < 3 and [Ueberschuss:state:d] > 200 and [Absorbtionsphase] eq "Closed")


oder


([Ladestatus] < 4 and [Ueberschuss:state:d] > 300)


oder


([Ladestatus] < 5 and [Ueberschuss:state:d] > 400)


oder


([Ladestatus] >= 5 and [Ueberschuss:state:d] > 500)


somit wird dein '$mday!=9' ausgehebelt, weil es durch deine Klammersetzung und das or ausreicht, wenn z.B. '[Ladestatus] < 3 and [Ueberschuss:state:d] > 200 and [Absorbtionsphase] eq "Closed"' wahr wird um den Zweig auszulösen. Da brauchts das '$mday...' dann nicht mehr für.

Wenn innerhalb der von dir angegebenen Zeitfenstern eine der Bedingungen in den anderen Zweigen triggert, dann kann dadurch natürlich auch ein anderer Zweig wahr werden.


Ich habe keinen Plan was du genau mit deinem DOIF erreichen willst. Vielleicht kannst du das mal mit ein paar Worten erklären, dann kann man dir auch evtl. sagen wie es besser funktioniert.
Titel: Antw:Was ist da falsch?
Beitrag von: satprofi am 09 August 2016, 21:20:17
Kurze Info:
Mit ladestatus überwache ich die Stromaufnahme des Akkus, Überschuss den Überschuss der PV Anlage. Wenn der Akku leer und am meisten Strom zieht muss 1000w übrig bleiben um den Ladevorgang zu starten, usw. Zusätzlich soll am 10. jedes Monats ,egal was die PV liefert,der Akku geladen werden.

send from OP3

Titel: Antw:Was ist da falsch?
Beitrag von: satprofi am 09 August 2016, 21:27:51
Am besten wäre den erstzustand herzustellen und bei jedem DOELSEIF den Tag hinzuzufügen.

send from OP3

Titel: Antw:Was ist da falsch?
Beitrag von: automatisierer am 09 August 2016, 21:51:58
Habe mal die Klammern so gesetzt wie ich es nachdem was ich verstanden habe für sinvoll erachte. Teste es morgen mal...


([07:45-17:00] and $mday==10 and [Netz_Schuetz_aus] eq "off") (set Batterielader_aus off)
DOELSEIF ((($month >10 or $month <3) and $mday!=10 and [07:45-17:00] and [Netz_Schuetz_aus] eq "off") and (([Ladestatus] < 2 and [Ueberschuss:state:d] > 100 and [Absorbtionsphase] eq "Closed") or ([Ladestatus] < 3 and [Ueberschuss:state:d] > 200 and [Absorbtionsphase] eq "Closed") or ([Ladestatus] < 4 and [Ueberschuss:state:d] > 300) or ([Ladestatus] < 5 and [Ueberschuss:state:d] > 400) or ([Ladestatus] >= 5 and [Ueberschuss:state:d] > 500))) (set Batterielader_aus off)
DOELSEIF ((($month <11 and $month >2) and $mday!=10 and [07:45-18:00] and [Netz_Schuetz_aus] eq "off") and (([Ladestatus] < 2 and [Ueberschuss:state:d] > 200 and [Absorbtionsphase] eq "Closed") or ([Ladestatus] < 3 and [Ueberschuss:state:d] > 400 and [Absorbtionsphase] eq "Closed") or ([Ladestatus] < 4 and [Ueberschuss:state:d] > 600) or ([Ladestatus] < 5 and [Ueberschuss:state:d] > 800) or ([Ladestatus] >= 5 and [Ueberschuss:state:d] > 1000))) (set Batterielader_aus off)
DOELSEIF ([Ueberschuss:state:d] <1 or [Netz_Schuetz_aus] eq "on") (set Batterielader_aus on)


da die ganzen or Bedingungen ja nur in Verbindung mit (($month >10 or $month <3) and $mday!=9 and [07:45-17:00] and [Netz_Schuetz_aus] eq "off") wahr werden sollen musst du diese zusammen klammern s.O..

Ich verstehe das ganze nun so:
Zweig 1: Einmal im Monat wird auf jeden Fall geladen
Zweig 2: Wenn die Bedingungen innerhalb des angegebenen Zeitfenster wahr werden, oder es zu Beginn schon sind, möchtest du den Ladevorgang starten.
Zweig 3: dito
Zweig 4: Wenn diese Bedingungen wahr werden wird der Ladevorgang gestoppt.

richtig?
Titel: Antw:Was ist da falsch?
Beitrag von: satprofi am 10 August 2016, 05:29:44
ja genau.
Aber ich habe DOIF vom ersten Beitrag, das bisher klappte, mit dem Tag zusätzlich verbunden, trotzdem wird cmd zum Abschalten des Laders ausgeführt (heutiger Tag). Irgendwie dürfte der Tag nicht abgefragt werden.
Ich werde dein Beispiel testen.
thx.

[edit]
So dürfte es klappen, zumindest cmd1 ausgeführt, und next timer cmd5


([06:00] and $mday==10) (set Netz_Schuetz_aus off,set load_kWh_daily 0,define step2 at +00:00:05 set Batterielader_aus off,set Ladestatus 6)
DOELSEIF ((($month >10 or $month <3) and $mday!=10 and [Netz_Schuetz_aus] eq "off") and (([Ladestatus] < 2 and [Ueberschuss:state:d] > 100 and [Absorbtionsphase] eq "Closed") or ([Ladestatus] < 3 and [Ueberschuss:state:d] > 200 and [Absorbtionsphase] eq "Closed") or ([Ladestatus] < 4 and [Ueberschuss:state:d] > 300) or ([Ladestatus] < 5 and [Ueberschuss:state:d] > 400) or ([Ladestatus] >= 5 and [Ueberschuss:state:d] > 500))) (set Batterielader_aus off)
DOELSEIF ((($month <11 and $month >2) and $mday!=10 and [Netz_Schuetz_aus] eq "off") and (([Ladestatus] < 2 and [Ueberschuss:state:d] > 200 and [Absorbtionsphase] eq "Closed") or ([Ladestatus] < 3 and [Ueberschuss:state:d] > 400 and [Absorbtionsphase] eq "Closed") or ([Ladestatus] < 4 and [Ueberschuss:state:d] > 600) or ([Ladestatus] < 5 and [Ueberschuss:state:d] > 800) or ([Ladestatus] >= 5 and [Ueberschuss:state:d] > 1000))) (set Batterielader_aus off)
DOELSEIF ($mday!=10 and [Ueberschuss:state:d] <1 or [Netz_Schuetz_aus] eq "on") (set Batterielader_aus on)
DOELSEIF ([18:00] and $mday==10) (set Batterielader_aus on)


ich benötigte noch zusätzlich bei cmd4 den tag, sonst hätte die ladung wieder abgebrochen bzgl. des Überschuss