(gelöst) Logikproblem mit if else und mehreren Bedingungen

Begonnen von uron, 11 März 2023, 13:18:58

Vorheriges Thema - Nächstes Thema

Stephan27

Zitat von: Damian am 12 März 2023, 09:21:09
Zitat von: uron am 12 März 2023, 09:01:50OK, stimmt mit dem minütlichen Schalten des Aktors, darauf hatte ich bislang noch keine Augenmerk gerichtet.
Nun habe ich dies Problem dann doch wieder mit einer if-Abfrage in der Ausführungsanweisung gelöst. Lt. Eventmonitor ist die Schalthäufigkeit nun auf das Minimum reduziert.

Hiermit teste ich nun unter den verschiedensten Bedingungen und werde zu gegebener Zeit berichten:
{if ((Value("powerfox2.0.devices.XXXXXXXX.currentFeedIn") > 1100) || ((Value("powerfox2.0.devices.XXXXXXXX.currentFeedIn") > 20) && (ReadingsVal("LeistungsmesserShellyPlugS", "state", "n.a.") eq "on"))) {if (ReadingsVal("LeistungsmesserShellyPlugS", "state", "n.a.") eq "off") {fhem ("set LeistungsmesserShellyPlugS on")}} else {if (ReadingsVal("LeistungsmesserShellyPlugS", "state", "n.a.") eq "on"){fhem ("set LeistungsmesserShellyPlugS off")}}}

Ich mache sowas etwas kürzer:

define di_shelly DOIF ([powerfox2.0.devices.XXXXXXXX.currentFeedIn] > 1100 or [powerfox2.0.devices.XXXXXXXXXX.currentFeedIn] > 20) (set LeistungsmesserShellyPlugS on) DOELSE (set LeistungsmesserShellyPlugS off)
Ach ja, hier wird nur einmal geschaltet, ein weiteres if kann man sich sparen ;)

Hallo Damian,

vielen Dank für diesen Einwurf.
Ich versuche gerade was ähnliches wie der TE und bin da eher an deinem Ansatz interessiert.

"DOELSE (set LeistungsmesserShellyPlugS off)" ist ein "Trigger" auf den "State" eines Device oder kann ich damit einen beliebigen "Setter" ansprechen?
Bei mir wäre das Device z.B. "vitoconnect" und das bringt den Set "ww_einmaliges_aufladen" (active/ deactive) mit. Könnte ich also einfach "set ww_einmaliges_aufladen active" machen?
Was mache ich wenn Readings, "Getter oder Setter" nicht eindeutig sind? Also wenn ich z.B. Vitoconnect1 und Vitoconnect2 haben und beide haben den SET für ww_einmaliges_aufladen?

Damian

Zitat von: Stephan27 am 12 Juni 2023, 15:33:05Hallo Damian,

vielen Dank für diesen Einwurf.
Ich versuche gerade was ähnliches wie der TE und bin da eher an deinem Ansatz interessiert.

"DOELSE (set LeistungsmesserShellyPlugS off)" ist ein "Trigger" auf den "State" eines Device oder kann ich damit einen beliebigen "Setter" ansprechen?
Bei mir wäre das Device z.B. "vitoconnect" und das bringt den Set "ww_einmaliges_aufladen" (active/ deactive) mit. Könnte ich also einfach "set ww_einmaliges_aufladen active" machen?
Was mache ich wenn Readings, "Getter oder Setter" nicht eindeutig sind? Also wenn ich z.B. Vitoconnect1 und Vitoconnect2 haben und beide haben den SET für ww_einmaliges_aufladen?


Du kannst einen beliebigen FHEM-Befehl angeben, der auch in der in der Kommandozeile funktioniert, das muss noch nicht mal ein set-Befehl sein. Sollte es ein Perl-Befehl sein, dann musst du statt runder Klammern geschweifte nehmen. In der Commandref zu DOIF findest du unzählige Beispiele.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stephan27

#17
Zitat von: Damian am 12 Juni 2023, 16:42:02
Zitat von: Stephan27 am 12 Juni 2023, 15:33:05...

Perfekt, Dankeschön.
Ich hatte es im Prinzip richtig adaptiert "set <device> <"SETTER"> activate" und wenn man am Ende den Status noch richtig schreibt, dann klappt es nicht nur mit dem Nachbarn, sondern auch mit der bedingungsabhängigen Steuerung von Geräten im FHEM. :-) 

Welche boolsche Logik-Operatoren kennt FHEM denn? Im commandref und auch google hilft mir gerade nicht.
|| (or) und && (and) ist ja schon verwendete. Ich denke XOR (^^ ?)  und AND NOT (!& ?) wäre vlt. noch ganz nützlich.


Edit2:
Kann man das mit den Klammer so machen?

(([MQTT_HAUS_XXX:SML_Power_act] < -3000 and [vitoconnect:WW-Isttemperatur] < 48) or ([MQTT_HAUS_XXX:SML_Power_act] < -100 and [vitoconnect:WW-einmaliges_Aufladen] == 1)) (set vitoconnect WW-einmaliges_Aufladen activate) DOELSE (set vitoconnect WW-einmaliges_Aufladen deactivate)(steht jetzt so im DEF von meinem DOIF)

Also
Wenn der Hauszähler mehr als 3kw Ausspeisung meldet UND die WW-Temperatur kleiner 48°c ODER wenn der Zähler mehr als 100 Watt Ausspeisung meldet und WW aktiv ist dann soll er WW machen, sonst soll er ausschalten.

P.S.: rein logisch würde mir das Einschaltsignal reichen und dann kann er einmal durchackern, ich möchte aber auch verhindern dass er in den Netzbezug geht. Normalerweise brauche ich meinen Speicher nicht so "heiß", aber der PV-Überschuss soll halt doch irgendwo noch sinnvoll genutzt werden.

Es scheint erstmal zu funktionieren.
Ob das mit den Bedingungen so passt sehe ich aber wahrscheinlich erst Morgen.

Damian

Die Bedingung wird vom Perl-Interpreter ausgewertet, daher ist alles möglich, was Perl kennt und das ist schon sehr viel. Auch die Reihenfolge der Auswertung ist festgelegt, siehe z. B. :

http://perl-seiten.privat.t-online.de/html/perl_op.html
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stephan27

#19
Zitat von: Damian am 12 Juni 2023, 22:32:44Die Bedingung wird vom Perl-Interpreter ausgewertet, daher ist alles möglich, was Perl kennt und das ist schon sehr viel. Auch die Reihenfolge der Auswertung ist festgelegt, siehe z. B. :

http://perl-seiten.privat.t-online.de/html/perl_op.html


Besten Dank.

Mein DOIF scheint zu funktionieren, wobei er zu schnell hin und her "prellt" und ständig ein und aus schaltet.
Ich habe jetzt mal das Attribut cmdpause mit 300:300 gesetzt in der Hoffnung, dass damit beide Befehle/ Bedingungen für 5 Minuten nicht überprüft werden.
Sollte passen?

Und vlt. gerade noch dazu.
Auf wieviele Werte bezieht sich denn die Funktion des Median? Ich überlege gerade ob ich einen Average z.B. über 30 Sekunden/ Werte einsetze oder ich den Median nutzen kann? (geht um Momentanverbrauch des Stromzähler)

Damian

Zitat von: Stephan27 am 14 Juni 2023, 10:16:58
Zitat von: Damian am 12 Juni 2023, 22:32:44Die Bedingung wird vom Perl-Interpreter ausgewertet, daher ist alles möglich, was Perl kennt und das ist schon sehr viel. Auch die Reihenfolge der Auswertung ist festgelegt, siehe z. B. :

http://perl-seiten.privat.t-online.de/html/perl_op.html


Die Anzahl der ausgewerteten Werte wird hinter avg bzw. med angegeben, so steht des in der Commandref.

Besten Dank.
Mein DOIF scheint zu funktionieren, wobei er zu schnell hin und her "prellt" und ständig ein und aus schaltet.
Ich habe jetzt mal das Attribut cmdpause mit 300:300 gesetzt in der Hoffnung, dass damit beide Befehle/ Bedingungen für 5 Minuten nicht überprüft werden.

Und vlt. gerade noch dazu. Auf wieviele Werte bezieht sich denn die Funktion des Median? Ich überlege gerade ob ich einen Average z.B. über 30 Sekunden/ Werte einsetze oder ich den Median nutzen kann. (geht um Momentanverbrauch des Stromzähler)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stephan27

Ahh okay,
da habe ich mich durch das Beispiel vom Median in der Commandref ablenken lassen und dachte der funktioniert anders als der Average.