FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: eckhard scholz am 12 März 2025, 08:18:02

Titel: rechnen im DOIF
Beitrag von: eckhard scholz am 12 März 2025, 08:18:02
Hallo in die Runde,

seit ein paar Tagen veruche ich im DOIF eine kleine Rechnung(Vorzeichenumkehr) zu machen, leider funktioniert es nicht wie ich will.
Was mache ich falsch?
define Current_L3 DOIF ([MQTT2_Growatt_0_CD20691C:EM_PowerFactor_L3] <0)
(set Current_L3_A {([MQTT_Growatt_0_CD20691C:EM_Current_L3_A]) * -1})
DOELSE
(set Current_L3_A {([MQTT_Growatt_0_CD20691C:EM_Current_L3_A]) * 1})

Bis dahin hat es noch funktioniert, es wird -1 und 1 angezeigt
define Current_L3 DOIF ([MQTT2_Growatt_0_CD20691C:EM_PowerFactor_L3] <0)
(set Current_L3_A -1) DOELSE (set Current_L3_A 1)

Gruß
Eckhard
Titel: Aw: rechnen im DOIF
Beitrag von: Otto123 am 12 März 2025, 08:24:22
Moin,

das ist set magic und da müssen zus. Klammern stehen, die um das Reading sind zu viel - also eine Klammer verschieben: :D
set Current_L3_A {([MQTT_Growatt_0_CD20691C:EM_Current_L3_A] * 1)}
Gruß Otto
Titel: Aw: rechnen im DOIF
Beitrag von: eckhard scholz am 12 März 2025, 11:46:09
Hallo Otto,
gesundes neues Jahr noch  :)

Leider funktioniert es so auch nicht.
define Current_L3 DOIF ([MQTT2_Growatt_0_CD20691C:EM_PowerFactor_L3] <0)
(set Current_L3_A {([MQTT_Growatt_0_CD20691C:EM_Current_L3_A] * -1)}) DOELSE
set (Current_L3_A {([MQTT_Growatt_0_CD20691C:EM_Current_L3_A] * 1)})
Die Variante ohne runde Klammern funktioniert auch nicht.
define Current_L3 DOIF [MQTT2_Growatt_0_CD20691C:EM_PowerFactor_L3] <0
set Current_L3_A {([MQTT_Growatt_0_CD20691C:EM_Current_L3_A] * -1)} DOELSE
set Current_L3_A {([MQTT_Growatt_0_CD20691C:EM_Current_L3_A] * 1)}

Im LOG-File steht diese Meldung
ZitatPERL WARNING: Number found where operator expected at (eval 31771) line 1, near "* -1"
Kann es sein das er das "-" als Rechenoperation sieht?
Titel: Aw: rechnen im DOIF
Beitrag von: Damian am 12 März 2025, 11:53:53
Dann mach eine Klammer um -1, also (-1)
Titel: Aw: rechnen im DOIF
Beitrag von: eckhard scholz am 12 März 2025, 12:07:54
Hallo Damian,
das hab ich schon versucht - leider ohne Erfolg
Titel: Aw: rechnen im DOIF
Beitrag von: eckhard scholz am 12 März 2025, 12:31:54
Ich hab das jetzt mal versucht
define Current_L3 DOIF [MQTT2_Growatt_0_CD20691C:EM_PowerFactor_L3] <0
set Current_L3_A {([MQTT_Growatt_0_CD20691C:EM_Current_L3_A] * 2)} DOELSE
set Current_L3_A {([MQTT_Growatt_0_CD20691C:EM_Current_L3_A] * 1)}

In der Variable steht dann sowas
ZitatCurrent_L3_A        *main::2

Das Teil will nicht rechnen.
Titel: Aw: rechnen im DOIF
Beitrag von: eckhard scholz am 12 März 2025, 12:45:03
Hallo Eisman,

defmod Current_L3 DOIF ([MQTT2_Growatt_0_CD20691C:EM_PowerFactor_L3] <0)
(set Current_L3_A {([MQTT_Growatt_0_CD20691C:EM_Current_L3_A] * 2)}) DOELSE
(set Current_L3_A {([MQTT_Growatt_0_CD20691C:EM_Current_L3_A] * 1)})

so wird "Current_L3_A" gar nicht mehr beschrieben.
Titel: Aw: rechnen im DOIF
Beitrag von: Damian am 12 März 2025, 12:55:51
Bist du sicher, dass es die Readings tatsächlich gibt und dass eine Zahl drin steht?
Titel: Aw: rechnen im DOIF
Beitrag von: eckhard scholz am 12 März 2025, 13:18:27
Dann muss was mit den Readings nicht stimmen.
Der Vergleich haut aber so hin. Das Reading zeigt diese Werte.
Zitate_MQTT2_Growatt_0_CD20691C_EM_PowerFactor_L3   -0.39
e_MQTT2_Growatt_0_CD20691C_EM_PowerFactor_L3    0.05

Komisch finde ich das im DOIF die Variable so aussieht
ZitatMQTT2_Growatt_0_CD20691C:EM_PowerFactor_L3
Titel: Aw: rechnen im DOIF
Beitrag von: eckhard scholz am 12 März 2025, 14:00:05
Sag mal wie kommt man auf so eine Variante ...

Aber das haut hin
Im LOG File steht jetzt

2025.03.12 13:56:03 1: 0.60//-0.20

Kannst du das in Kurzform beschreiben was das Teil macht?

Kann es auch einfacher gehen?
Titel: Aw: rechnen im DOIF
Beitrag von: eckhard scholz am 12 März 2025, 14:25:31
Die Variablennamen kommen von Wechselrichter Growatt über MQTT
Ich wollte da noch nicht viel ändern da das Gateway Growatt Wechselrichter-MQTT-Fhem auch noch in Arbeit ist und sich ständig verändert.

Ich verstehe in deinem Programm noch nicht alles, deshalb die Frage nach der Kurzerklärung.
Aber wenn ich es richtig verstehe, hast du nur eine Anzeige im LOG dazu gebaut, wie so funktioniert das nun alles?

Und das " Log3 "$SELF" " braucht man vermutlich nicht unbedingt, nur zum Test.

Titel: Aw: rechnen im DOIF
Beitrag von: tobi01001 am 12 März 2025, 15:22:25
Zitat von: eckhard scholz am 12 März 2025, 12:45:03Current_L3_A
Was ist denn Current_L3_A?

Nach deinem Befehl im Doif
set Current_L3_A ...ist das ein Device und dur schriebst in den state (beim Dummy z.B.). Wenn du ein Reading (aus einer Readingslist z.B.) schreiben möchtest, braucht es ein
set DEVICE Current_L3_A ...Oder hab ich was übersehen?
Titel: Aw: rechnen im DOIF
Beitrag von: Otto123 am 12 März 2025, 15:37:42
Also ich würde das erstmal ohne DOIF ausprobieren, die Ursprungsfrage hatte an sich nichts mit DOIF zu tun (kann aber sein DOIF macht etwas anders)!
Bei mir funktioniert das in der FHEM Kommandozeile einwandfrei:
set dummy1 {([Fenster_BadL:userR] * -1)}Im Fenster_BaL Reading userR steht eine 4 im dummy1 steht anschließend -4
Titel: Aw: rechnen im DOIF
Beitrag von: eckhard scholz am 12 März 2025, 15:48:11
Otto,

du hast recht, dass funktioniert
set Current_L3_A {([MQTT2_Growatt_0_CD20691C:EM_Current_L3_A] * -1)}
es wird sauber gerechnet, je nach dem welche Zahl ich eingebe.

Wie oft wird ein DOIF abgearbeitet?
Komisch ist das DOIF diesen Wert nur einmal überscheibt, genau dann wenn ich DOIF ohne Änderung neu speichere.
Titel: Aw: rechnen im DOIF
Beitrag von: tobi01001 am 12 März 2025, 17:06:17
Zitat von: eckhard scholz am 12 März 2025, 15:48:11Otto,

du hast recht, dass funktioniert
set Current_L3_A {([MQTT2_Growatt_0_CD20691C:EM_Current_L3_A] * -1)}
es wird sauber gerechnet, je nach dem welche Zahl ich eingebe.

Wie oft wird ein DOIF abgearbeitet?
Komisch ist das DOIF diesen Wert nur einmal überscheibt, genau dann wenn ich DOIF ohne Änderung neu speichere.

Das DOIF arbeitet "Zustandsbasiert" und dieser ändert sich bei dir nur beim "nulldurchgang" ;-). Bedeutet: wenn der Wert negativ ist,  wird einmal der Zweig für den negativen Wert durchlaufen und erst wenn der Wert positiv wird (oder 0), wird der andere Zweig einmalig durchlaufen. Solange der Wert allerdings stabil negativ oder positiv bleibt, ändert sich im DOIF nichts.
Dazu müsstest du das Attribut do always setzen.

Nachtrag: das ist eigentlich ein typischer Fall für ein userreading. Dann brauchts gar kein DOIF:
attr MQTT2_Growatt_0_CD20691C userReadings Current_L3_A:EM_PowerFactor_L3.* { ReadingsNum($name, "EM_PowerFactor_L3", 0)<0?ReadingsNum($name, "EM_Current_L3_A", 0)*-1:ReadingsNum($name, "EM_Current_L3_A", 0)}
Damit landet (ungetestet) ein Reading (vorzeichenbehaftet) Current_L3_A im Device MQTT2_Growatt_0_CD20691C.
Titel: Aw: rechnen im DOIF
Beitrag von: eckhard scholz am 12 März 2025, 17:23:37
Jaaa,
so funktioniert das jetzt.
Letzteres war wohl wieder mal was für Anfängerfragen.

Ich danke euch Beiden für die tatkräftige Unterstützung.
Ein Profi werde ich wohl nicht mehr.

define Current_L3 DOIF ([MQTT2_Growatt_0_CD20691C:EM_PowerFactor_L3] < 0)
(set Current_L3_A {([MQTT2_Growatt_0_CD20691C:EM_Current_L3_A] * -1)}) DOELSE
(set Current_L3_A {([MQTT2_Growatt_0_CD20691C:EM_Current_L3_A] * 1)})
attr Current_L3 do always
Titel: Aw: rechnen im DOIF
Beitrag von: satprofi am 13 März 2025, 12:13:44
Hallo.
Darf ich mich dranhängen?

Folgendes Problem:
{set_Reading("kw",[#sum:"^US2000":packCapacityRemain]*48/1000)}  ergibt bei mir Summe mit 6 kommastellen.
Wie schaffe ich es das nur 1 Kommastelle angezeigt wird?

mit sprintf oder stateformat komme ich nicht weiter