[gelöst] Innerhalb einer DoIf-Modul nochmals eine DoIf

Begonnen von AnBad, 17 August 2021, 12:02:24

Vorheriges Thema - Nächstes Thema

AnBad

Hallo,
ich habe folgende kleines DoIf-Modul:

define doif_Strommesser_Betrieb DOIF
([dev_Zwischenschalter3:state] eq "on")
((get dev_Zwischenschalter3 measurement 0 power)\
(setreading dev_Zwischenschalter3 B_Aktuell {ReadingsTimestamp("dev_Zwischenschalter3","power0",0)})\
(get dev_Zwischenschalter3 measurement 0 energy)\
(set DBLogging addLog dev_Zwischenschalter3:(F_Stromverbrauch_kWh_Gesamt|energy0|power0) !useExcludes)\
(setreading dev_Zwischenschalter3 1C_Zeitdauer {((ReadingsNum("dev_Zwischenschalter3","1C_Zeitdauer",0))+AttrNum("doif_Strommesser_Betrieb", "repeatcmd", 0))})


Ich möchte jedoch abhängig von der power, welche in Zeile 3 aktualisiert wird, die Zeitdauer in 1C_Zeitdauer oder 2C_Zeitdauer einfügen nach dem Motto,
aktualisieren power und dann:

if power <=1 then
(setreading dev_Zwischenschalter3 1C_Zeitdauer {((ReadingsNum("dev_Zwischenschalter3","1C_Zeitdauer",0))+AttrNum("doif_Strommesser_Betrieb", "repeatcmd", 0))})
ggf. weitere setreadings
else
(setreading dev_Zwischenschalter3 2C_Zeitdauer {((ReadingsNum("dev_Zwischenschalter3","1C_Zeitdauer",0))+AttrNum("doif_Strommesser_Betrieb", "repeatcmd", 0))})
ggf. weitere setreadings


Wo sollte die Schleife innerhalb des Moduls DoIf eingefügt werden? Es ist ja das Problem, dass bevor der Wert "power" durch die Schleife geprüft wird, muss er vorher aktualisiert werden. Sonst würde ich ja ganz einfach in die erste Zeile eine zweite Bedingung einfügen.

Vielen Dank.

PS: Ich bekomme das mit der Klammersetzung einfach nicht wirklich geregelt. Wann geschweift, wann normale Klammer. Wann Perl-Modus und wann FHEM usw. Immer wenn ich mich einlese, vergesse ich es nach ein, zwei Monaten, wenn ich wieder davor sitze und etwas programmieren muss. Sorry.

Damian

Du kannst innerhalb des DOIF-Moduls im Ausführungsteil entweder den IF-Befehl nutzen https://fhem.de/commandref_DE.html#IF oder den Perlbefehl if. Beim Perl-if musst du natürlich alles in Perl formulieren insbesondere Reading mit ReadingsVal-Funktion abfragen.

Die Syntax ist dann

DOIF/DOELSEIF (<Bedingung>) (IF (...) (....))

oder

DOIF/DOELSEIF (<Bedingung>)  {if (...) {...}}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

AnBad

Hey, vielen Dank.
Nach drei, vier Stunden rumtesten, habe ich es irgendwie hinbekommen. Was ich nicht verstehe, ich habe ja jetzt den Perl-Befehlt "if" in Zeile 6 genutzt. Aber ohne Schweifklammern, was doch Voraussetzung für einen Perl-Befehl anscheinend ist. Also, wenn das mit den Klammern nicht wäre, dann wäre das Programmieren 10 Minuten Arbeit gewesen. Leider beherrsche ich nur MS-VBA Programmierung. Die Umsetzung auf PERL mit Beimischung FHEM bringt mich zum Verzweifeln.

([dev_Zwischenschalter3:state] eq "on")
(
(get dev_Zwischenschalter3 measurement 0 power)
(setreading dev_Zwischenschalter3 B_Aktuell {ReadingsTimestamp("dev_Zwischenschalter3","power0",0)})
(get dev_Zwischenschalter3 measurement 0 energy)
(if (ReadingsNum("dev_Zwischenschalter3","power0",0) < 6)
(
setreading dev_Zwischenschalter3 2_1_Off_Zeitdauer {((ReadingsNum("dev_Zwischenschalter3","2_1_Off_Zeitdauer",0))+AttrNum("doif_Strommesser_Betrieb", "repeatcmd", 0))},
setreading dev_Zwischenschalter3 1_1_LetzterZustand 0,
setreading dev_Zwischenschalter3 2_2_Off_Verbrauch {((ReadingsNum("dev_Zwischenschalter3","2_2_Off_Verbrauch",0))+ReadingsNum("dev_Zwischenschalter3", "energy0", 0)-ReadingsNum("dev_Zwischenschalter3", "1_2_LetzterEnergy0", 0))}
)
)
(if (ReadingsNum("dev_Zwischenschalter3","power0",0) > 5)
(
setreading dev_Zwischenschalter3 3_1_On_Zeitdauer {((ReadingsNum("dev_Zwischenschalter3","3_1_On_Zeitdauer",0))+AttrNum("doif_Strommesser_Betrieb", "repeatcmd", 0))},
setreading dev_Zwischenschalter3 1_1_LetzterZustand 0,
setreading dev_Zwischenschalter3 3_2_Off_Verbrauch {((ReadingsNum("dev_Zwischenschalter3","3_2_Off_Verbrauch",0))+ReadingsNum("dev_Zwischenschalter3", "energy0", 0)-ReadingsNum("dev_Zwischenschalter3", "1_2_LetzterEnergy0", 0))}
)
)
(setreading dev_Zwischenschalter3 1_2_LetzterEnergy0 {(ReadingsVal("dev_Zwischenschalter3","energy0",0))})
)

Damian

Zitat von: AnBad am 18 August 2021, 20:15:48
Hey, vielen Dank.
Nach drei, vier Stunden rumtesten, habe ich es irgendwie hinbekommen. Was ich nicht verstehe, ich habe ja jetzt den Perl-Befehlt "if" in Zeile 6 genutzt. Aber ohne Schweifklammern, was doch Voraussetzung für einen Perl-Befehl anscheinend ist. Also, wenn das mit den Klammern nicht wäre, dann wäre das Programmieren 10 Minuten Arbeit gewesen. Leider beherrsche ich nur MS-VBA Programmierung. Die Umsetzung auf PERL mit Beimischung FHEM bringt mich zum Verzweifeln.

([dev_Zwischenschalter3:state] eq "on")
(
(get dev_Zwischenschalter3 measurement 0 power)
(setreading dev_Zwischenschalter3 B_Aktuell {ReadingsTimestamp("dev_Zwischenschalter3","power0",0)})
(get dev_Zwischenschalter3 measurement 0 energy)
(if (ReadingsNum("dev_Zwischenschalter3","power0",0) < 6)
(
setreading dev_Zwischenschalter3 2_1_Off_Zeitdauer {((ReadingsNum("dev_Zwischenschalter3","2_1_Off_Zeitdauer",0))+AttrNum("doif_Strommesser_Betrieb", "repeatcmd", 0))},
setreading dev_Zwischenschalter3 1_1_LetzterZustand 0,
setreading dev_Zwischenschalter3 2_2_Off_Verbrauch {((ReadingsNum("dev_Zwischenschalter3","2_2_Off_Verbrauch",0))+ReadingsNum("dev_Zwischenschalter3", "energy0", 0)-ReadingsNum("dev_Zwischenschalter3", "1_2_LetzterEnergy0", 0))}
)
)
(if (ReadingsNum("dev_Zwischenschalter3","power0",0) > 5)
(
setreading dev_Zwischenschalter3 3_1_On_Zeitdauer {((ReadingsNum("dev_Zwischenschalter3","3_1_On_Zeitdauer",0))+AttrNum("doif_Strommesser_Betrieb", "repeatcmd", 0))},
setreading dev_Zwischenschalter3 1_1_LetzterZustand 0,
setreading dev_Zwischenschalter3 3_2_Off_Verbrauch {((ReadingsNum("dev_Zwischenschalter3","3_2_Off_Verbrauch",0))+ReadingsNum("dev_Zwischenschalter3", "energy0", 0)-ReadingsNum("dev_Zwischenschalter3", "1_2_LetzterEnergy0", 0))}
)
)
(setreading dev_Zwischenschalter3 1_2_LetzterEnergy0 {(ReadingsVal("dev_Zwischenschalter3","energy0",0))})
)


In Wirklichkeit hast du den FHEM-Befehl IF benutzt, FHEM unterscheidet leider nicht zwischen Groß- und Kleinschreibung. Dein Code mit "if" würde in Perl so nicht funktionieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

AnBad

Danke,
ich habe mich heute Mittag nochmals mit den Klammern, Perl usw. beschäftigt. Ich denke, ich habe einiges, bei weitem nicht Alles begriffen. Gleich noch eine Frage entstanden, die ich aber in einem separaten Thread stellen werde.
Vielen Dank soweit.!!