Hauptmenü

rechnen im DOIF

Begonnen von eckhard scholz, 12 März 2025, 08:18:02

Vorheriges Thema - Nächstes Thema

eckhard scholz

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
F!B,RPi-Fhem,RaspberryMatic,Cuno,Cul,S7-300,LOGO,HMIP,HM,FS20,

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

eckhard scholz

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?
F!B,RPi-Fhem,RaspberryMatic,Cuno,Cul,S7-300,LOGO,HMIP,HM,FS20,

Damian

Dann mach eine Klammer um -1, also (-1)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

eckhard scholz

Hallo Damian,
das hab ich schon versucht - leider ohne Erfolg
F!B,RPi-Fhem,RaspberryMatic,Cuno,Cul,S7-300,LOGO,HMIP,HM,FS20,

eckhard scholz

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.
F!B,RPi-Fhem,RaspberryMatic,Cuno,Cul,S7-300,LOGO,HMIP,HM,FS20,

eckhard scholz

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.
F!B,RPi-Fhem,RaspberryMatic,Cuno,Cul,S7-300,LOGO,HMIP,HM,FS20,

Damian

Bist du sicher, dass es die Readings tatsächlich gibt und dass eine Zahl drin steht?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

eckhard scholz

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
F!B,RPi-Fhem,RaspberryMatic,Cuno,Cul,S7-300,LOGO,HMIP,HM,FS20,

eckhard scholz

#9
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?
F!B,RPi-Fhem,RaspberryMatic,Cuno,Cul,S7-300,LOGO,HMIP,HM,FS20,

eckhard scholz

#10
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.

F!B,RPi-Fhem,RaspberryMatic,Cuno,Cul,S7-300,LOGO,HMIP,HM,FS20,

tobi01001

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?
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.

Otto123

#12
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

eckhard scholz

#13
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.
F!B,RPi-Fhem,RaspberryMatic,Cuno,Cul,S7-300,LOGO,HMIP,HM,FS20,

tobi01001

#14
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.
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.

eckhard scholz

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
F!B,RPi-Fhem,RaspberryMatic,Cuno,Cul,S7-300,LOGO,HMIP,HM,FS20,

satprofi

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
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram