Skalierungsfaktor in Modbus korrekt einbinden (GELÖST)

Begonnen von pldemon, 01 Juni 2025, 19:12:43

Vorheriges Thema - Nächstes Thema

pldemon

Hallo,

ich binde gerade mit meinem Inverter in FHEM via Modbus ein. Das Ganze funktioniert soweit. Die Anbindung sieht so aus:

define INVERTER ModbusAttr 1 10 inverter_ip:502 TCP
attr INVERTER dev-h-defPoll 1
attr INVERTER dev-h-combine 10

attr INVERTER obj-h40084-reading I_AC_Power_SF
attr INVERTER obj-h40084-type signed short big
attr INVERTER obj-h40083-reading I_AC_Power
attr INVERTER obj-h40083-type signed short big
attr INVERTER obj-h40083-expr myUtils_AdjustDecimal($val, ReadingsVal($name, 'I_AC_Power_SF', 0))

Beschreibung
Der Wert in I_AC_Power muss umgerechnet werden. Dazu liefert I_AC_Power_SF einen Skalierungsfaktor, um wie viel Stellen der Wert von I_AC_Power bewegt werden muss. Steht der Wert auf -2 bedeutet, dass aus einer 1234 der Wert 12,34 gemacht wird. Für die Umrechnung ist die Funktion »myUtils_AdjustDecimal« verantwortlich.

Problem
Während des Polls werden zeitgleich alle Register gelesen. Die Readings enthalten die korrekten Werte. Der Wert, der an myUtils_AdjustDecimal mittels ReadingsVal($name, 'I_AC_Power_SF', 0) übergeben wird, ist aber sehr oft der aus dem vorherigen Poll-Run. Wurde also beim ersten Poll der Skalierungsfaktor -1 gelesen und beim aktuellen Poll der Faktor -2, wird myUtils_AdjustDecimal nicht der neue Wert -2, sondern der alte Wert -1 übergeben. Erst beim nächsten Run wird der korrekte Wert -2 geliefert.

Frage
Wie kann ich sicherstellen, dass zum Zeitpunkt der Parameterübergabe das Reading aktualisiert wurde? Alternativ: Wie kann ich das Handling so umbauen, dass ich für die Berechnung von I_AC_Power immer den aktuellen Wert von I_AC_Power_SF verwende?

Gruß,
Mirko

pldemon

Update:

Für alle, die es interessiert. Irgendwie habe ich obj-[cdih][0-9]+-group übersehen. Bindet man es korrekt ein, funktioniert das Auslesen.