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

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

Vorheriges Thema - Nächstes Thema

uron

Hallo Gemeinde,
ich bastele nun seit Stunden an einer Schaltlogik und bekomme sie nicht ans Laufen.

Die gewünschte Schaltlogik ist folgende, ich beschreibe sie zunächst mal mit meinen Worten:
wenn ((Wert der Variablen a >1100) oder (Wert der Variablen a > 20 und Wert der Variablen b >500))
dann (wenn Variable c < 23 schalte ShellyPlugS on, sonst schalte ShellyPlugS off)

Variable a = Value("powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn")
Variable b = Value("LeistungsmesserShellyPlugS:KW:.*")
Variable c = Value("controme.0.14.actualTemperature")

Fehler: Wenn Wert der Variablen a < 20 und Variable b > 500, schaltet ShellyPlugS nicht wieder auf off

Meine nicht funktionierende Syntax lautet wie folgt:
define PVLuefterONOFF notify powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn {if ((Value("powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn") > 1100) || ((Value("powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn") > 20) && (Value("LeistungsmesserShellyPlugS:KW:.*") > 500))) {if(Value("controme.0.14.actualTemperature") <23) {fhem ("set LeistungsmesserShellyPlugS on")} else {fhem ("set LeistungsmesserShellyPlugS off")}}}

Fehlen da Klammern, sind sie falsch gesetzt oder was mache ich falsch? Könnt ihr mir helfen?

Update1:
Ich habe meine Befehlsfolge nochmals ein wenig umgebaut, ohne dass sie nun funktioniert - Hintergrund ist nun die Abfrage in der UND-Bedingung, ob ShellyPlugS bereits eingeschaltet ist:
powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn {if ((Value("powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn") > 1100) || ((Value("powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn") > 20) && (ReadingsVal("LeistungsmesserShellyPlugS", "state", "n.a.") eq "on"))) {if(Value("controme.0.14.actualTemperature") <23) {fhem ("set LeistungsmesserShellyPlugS on")} else {fhem ("set LeistungsmesserShellyPlugS off")}}}

Fehlerbeschreibung neu:
Fehler: Wenn Wert der Variablen a < 20 und ShellyPlugS = on, schaltet ShellyPlugS nicht wieder auf off

Update2:
Ich habe meine Befehlsfolge erneut geändert und die Temperatur-Abfrage vor dem "set ...... on" weggelassen.
Im Moment schaltet die Befehlsfolge den ShellyPlugS korrekt aus, wenn die Bedingungen entsprechend erfüllt sind. Morgen führe ich weitere Tests durch und gebe hoffentlich das finale OK:
{if ((Value("powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn") > 1100) || ((Value("powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn") > 20) && (ReadingsVal("LeistungsmesserShellyPlugS", "state", "n.a.") eq "on"))) {fhem ("set LeistungsmesserShellyPlugS on")} else {fhem ("set LeistungsmesserShellyPlugS off")}}

Raspberry Pi  fhem  FHEMobile  CUL  FS20-, HM-, Intertechno-, AVM- und Shelly-Aktoren, Vitoconnect 100, Vitocal 200-S, Optolink, FTUI auf iPad, FTUI auf iPhone, Stromzähler von Powerfox, Wechselrichter Growatt MIN 4600 TL-XH, RasPi ioBroker

Damian

#1
Wie oft triggert bei dir powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

uron

#2
alle 60 Sekunden!

Ich könnte die Temperaturabfrage Value("controme.0.14.actualTemperature") natürlich auch 2x in die if-Abfrage bei jedem ODER einbauen - das sollte gelingen - aber ich sehe es sportlich und wollte diese Temperaturbedingung nur einmal "einbauen".

Die eigentliche Frage ist ja die: kann ich in der Ausführungsanweisung noch ein "if" unterbringen. Wenn JA, wie?
Raspberry Pi  fhem  FHEMobile  CUL  FS20-, HM-, Intertechno-, AVM- und Shelly-Aktoren, Vitoconnect 100, Vitocal 200-S, Optolink, FTUI auf iPad, FTUI auf iPhone, Stromzähler von Powerfox, Wechselrichter Growatt MIN 4600 TL-XH, RasPi ioBroker

Damian

Zitat von: uron am 12 März 2023, 06:06:52
alle 60 Sekunden!
Dir ist bewusst, dass du ggf. alle 60 Sekunden deinen Aktor schaltest?
Zitat
Die eigentliche Frage ist ja die: kann ich in der Ausführungsanweisung noch ein "if" unterbringen. Wenn JA, wie?

genauso, wie du den if schon verwendet hast: if (...) {...}


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

uron

#4
OK, 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.XXXXXXXXXXXX.currentFeedIn") > 1100) || ((Value("powerfox2.0.devices.XXXXXXXXXXXX.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")}}}

Raspberry Pi  fhem  FHEMobile  CUL  FS20-, HM-, Intertechno-, AVM- und Shelly-Aktoren, Vitoconnect 100, Vitocal 200-S, Optolink, FTUI auf iPad, FTUI auf iPhone, Stromzähler von Powerfox, Wechselrichter Growatt MIN 4600 TL-XH, RasPi ioBroker

MadMax-FHEM

#5
Mal unabhängig vom bislang geführten Gespräch:

Wie soll das funktionieren?

(Value("LeistungsmesserShellyPlugS:KW:.*")


EDIT: RegEx bei Value (ebenso wie ReadingsVal, ReadingsNum, AttrVal usw.) wäre mir neu, dass das ginge...

Zusätzlich: Value() "frägt" STATE ab also ein Internal kein Reading!
Besser ReadingsVal() bzw. ReadingsNum()

EDIT: bzgl. Value() https://forum.fhem.de/index.php/topic,132625.msg1267426.html#msg1267426

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Damian

#6
Zitat von: uron am 12 März 2023, 09:01:50
OK, 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 ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

uron

Zitat von: MadMax-FHEM am 12 März 2023, 09:09:31
Mal unabhängig vom bislang geführten Gespräch:

Wie soll das funktionieren?

(Value("LeistungsmesserShellyPlugS:KW:.*")


EDIT: RegEx bei Value (ebenso wie ReadingsVal, ReadingsNum, AttrVal usw.) wäre mir neu, dass das ginge...

Zusätzlich: Value() "frägt" STATE ab also ein Internal kein Reading!
Besser ReadingsVal() bzw. ReadingsNum()

EDIT: bzgl. Value() https://forum.fhem.de/index.php/topic,132625.msg1267426.html#msg1267426

Gruß, Joachim
Oh Danke, ich glaubte, mit ReadingsVal () könnte ich auch Readings abfragen - wieder mal etwas gelernt!
Raspberry Pi  fhem  FHEMobile  CUL  FS20-, HM-, Intertechno-, AVM- und Shelly-Aktoren, Vitoconnect 100, Vitocal 200-S, Optolink, FTUI auf iPad, FTUI auf iPhone, Stromzähler von Powerfox, Wechselrichter Growatt MIN 4600 TL-XH, RasPi ioBroker

uron

#8
Zitat von: Damian am 12 März 2023, 09:21:09
Ich mache sowas etwas kürzer:

define di_shelly DOIF ([powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn] > 1100 or [powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn] > 20) (set LeistungsmesserShellyPlugS on) DOELSE (set LeistungsmesserShellyPlugS off)

Ach ja, hier wird nur einmal geschaltet, ein weiteres if kann man sich sparen ;)

Klingt einfacher, allerdings fehlt mir bei der Bedingung "[powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn] > 20" das und "LeistungsmesserShellyPlugS = on" oder lese ich das nicht richtig?
Nachteil: da powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn alle 60s getriggert wird, schalte ich das Device auch alle 60s, oder?
Raspberry Pi  fhem  FHEMobile  CUL  FS20-, HM-, Intertechno-, AVM- und Shelly-Aktoren, Vitoconnect 100, Vitocal 200-S, Optolink, FTUI auf iPad, FTUI auf iPhone, Stromzähler von Powerfox, Wechselrichter Growatt MIN 4600 TL-XH, RasPi ioBroker

MadMax-FHEM

Zitat von: uron am 12 März 2023, 15:02:35
Oh Danke, ich glaubte, mit ReadingsVal () könnte ich auch Readings abfragen - wieder mal etwas gelernt!

Natürlich, wie der Name sagt ;)

Aber auch hier gilt: es muss ein Devicename und ein Readingname sein! Kein RegEx!

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

RalfRog

Zitat von: uron am 12 März 2023, 15:02:35
Oh Danke, ich glaubte, mit ReadingsVal () könnte ich auch Readings abfragen - wieder mal etwas gelernt!

Wie MadMAx geschrieben hat sollte man sich den ReadingsNum auch merken, der hat manchmal durchaus auch Vorteile. Ich vergess den auch immer wieder.
=> ReadingsNum(<devicename>,<reading>, <defaultvalue>,<round>)

Gruß Ralf
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

uron

an alle: ihr seid so gut, meine Defizite auszumerzen  ;)
Raspberry Pi  fhem  FHEMobile  CUL  FS20-, HM-, Intertechno-, AVM- und Shelly-Aktoren, Vitoconnect 100, Vitocal 200-S, Optolink, FTUI auf iPad, FTUI auf iPhone, Stromzähler von Powerfox, Wechselrichter Growatt MIN 4600 TL-XH, RasPi ioBroker

Damian

#12
Zitat von: uron am 12 März 2023, 15:05:06
Klingt einfacher, allerdings fehlt mir bei der Bedingung "[powerfox2.0.devices.XXXXXXXX.currentFeedIn] > 20" das und "LeistungsmesserShellyPlugS = on" oder lese ich das nicht richtig?

Du möchtest LeistungsmesserShellyPlugS auf on schalten wenn es schon on ist? Da musst du deine Logik noch mal überdenken. ;)

Zitat
Nachteil: da powerfox2.0.devices.XXXXXXXX.currentFeedIn alle 60s getriggert wird, schalte ich das Device auch alle 60s, oder?

oder! ;)

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

uron

#13
Zitat von: Damian am 12 März 2023, 16:49:09
Du möchtest LeistungsmesserShellyPlugS auf on schalten wenn es schon on ist? Da musst du deine Logik noch mal überdenken. ;)

oder! ;)
Du liegst richtig, die Logik kam ursprünglich aus dem Gedanken, immer wenn getriggert wird (alle 60s), schalte ich den Sollstatus (Schalter) neu - das kann man besser machen, da gebe ich dir Recht.

Die eigentliche Problemstellung ist die, dass ich einen 1000W-Verbraucher dann einschalten will, wenn meine PV-Anlage mindestens 1100W Überschuss produziert.
Wenn der 1000W-Verbraucher aber eingeschaltet ist, sollte der Überschuss 20W nicht unterschreiten - über die Grenzwerte kann man streiten.

Eine elegantere Logik wäre sicher die: Wenn 1100W PV-Überschuss, dann soll der Verbraucher eingeschaltet werden wenn er aus ist. Ist der PV-Überschuss < 20W ist und der Verbraucher eingeschaltet, soll er ausgeschaltet werden.
Raspberry Pi  fhem  FHEMobile  CUL  FS20-, HM-, Intertechno-, AVM- und Shelly-Aktoren, Vitoconnect 100, Vitocal 200-S, Optolink, FTUI auf iPad, FTUI auf iPhone, Stromzähler von Powerfox, Wechselrichter Growatt MIN 4600 TL-XH, RasPi ioBroker

uron

So, nach einigen erfolgreichen Tests unter Realbedingungen gebe ich hier nun meinen Lösung bekannt und kennzeichne demgemäß auch das Thema als solches - vielleicht interessiert es ja einmal jemanden.
define PVLuefterONOFF notify powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn {if ((Value("powerfox2.0.devices.XXXXXXXXXXXX.currentFeedIn") > 1100) || ((Value("powerfox2.0.devices.XXXXXXXXXXXX.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")}}}

Danke für die Unterstützung im Forum auf dem Weg zur Lösung auch wenn ich vielleicht einen komplizierteren Weg gegangen bin.
Raspberry Pi  fhem  FHEMobile  CUL  FS20-, HM-, Intertechno-, AVM- und Shelly-Aktoren, Vitoconnect 100, Vitocal 200-S, Optolink, FTUI auf iPad, FTUI auf iPhone, Stromzähler von Powerfox, Wechselrichter Growatt MIN 4600 TL-XH, RasPi ioBroker