Device_Interval und Attribute_Interval

Begonnen von wollik, 05 Dezember 2024, 16:35:10

Vorheriges Thema - Nächstes Thema

wollik

Zitat von: tobi01001 am 07 Dezember 2024, 18:07:13
Zitat von: wollik am 07 Dezember 2024, 17:01:00Also würde mir doch:
L1:(LP1_A1).* {sprintf("%.0f", (\[/b] genügen wenn ich die kleinen Änderungen an LP1_V1,2,3 ignorieren möchte oder?
Ja, dann kannst du auch einfach L1:LP1_A1.* machen.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Hallo Tobi,
derzeit wird mein Userreading L1 immer gesetzt wenn sich der Wert von L1_A1 ändert: L1:(LP1_A1).*
Bitte wie müßte die Syntax aussehen wenn ich das Userreading L1: beim nächsten Interval nur setzen will, wenn  das Reading: LP1_Charge_Active  auf "1" steht?
L1: ([LP1_Charge_Active] == 1 )

Ich bekomme keinen Syntaxfehler, aber bin mir nicht sicher ob das so funktioniert.
Bitte wie siehst Du das, oder wie würdes Du das realisieren?

Viele Grüße
wollik

tobi01001

Hi,

keine Ahung ob die eckigen Klammern für den Wert in dem Fall funktionieren (glaubs nicht). Aber du würdest ohnehin nur auf Events von Charge_Active triggern und rechnen. Damit ist die Berechnung im Zweifel arg statisch bzw. nutzlos.

Du kannst aber im userreading selbst Abfragen ob Charge_Active 1 ist und andernfalls 0 zurückgeben. In etwa so:
attr OpenWB userReadings L1:LP1_A1.* \
{\
if(ReadingsNum("OpenWB", "LP1_Charge_Active", 0) == 1) {\
sprintf("%.0f", (ReadingsNum("OpenWB","LP1_V1", 0) * ReadingsNum("OpenWB","LP1_A1", 0)));; \
} else {\
0;;\
}\
}, ...
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.

wollik

Hallo Tobias,
DANKE für die schnelle Antwort,
aber ich möchte für dieses userReading nichts ausrechnen (für andere schon), sondern nur den Wert setzen wenn LP1_Active_Charge == 1
Hier mein Versuch zum Setzen des userReadings Total_Active_Energy:

Total_Active_Energy:(LP1_Charge_Active).*  {\
   if(ReadingsNum("OpenWB", "LP1_Charge_Active", 0) == 1)\
        {sprintf("%.0f",(qx( ..... )));;}

Nur wenn LP1_Charge_Active == 1 dann soll ein Shell Befehl mittels qx ausgeführt und der Rückgabewert in das userReading geschrieben werden.

Wenn LP1_Charge_Active != 1 ist, soll das userReading nicht überschrieben werden.

Könnte das so funktionieren ? Ich kann es erst Testen wenn genug PV-Leistung für meine WB zur Verfügung steht.

Viele Grüße
wollik





tobi01001

Testen kann man immer... - zur Not mit Dummy's.

Ob du rechnest oder nicht, ändert an der Logik auch nichts.
Wenn du aber nur auf LP1_Charge_Active triggerst, wirst du deinen Wert nur bekommen, wenn Charge_Active auch ein Event auslöst. Wenn dann z.B. event-on-change-reading gesetzt sind, kommt der Wert einmal beim Wechsel von x auf 1, ansonsten bei jedem Event (was du im Eventmonitor beobachten kannst).

D.h. dein userreading braucht einen trigger falls es sich tatsächlich dynamisch in Abhängigkeit von ? ändern soll. Ich verstehe den Use-Case nicht bzw kann mir nicht vorstellen was dein eigentliches Ziel ist.

Total_Active_Energy soll was sein und bekommt welchen Wert? Klingt nach einem Anwendungsfall für "monotonic" ggf. in Kombination mit "LP1_Charge_Active".
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.

wollik

Hallo Tobi,
also ich habe ein Device: OpenWB.
Tagsüber werden je nach Verbindungsstatus (LP1_Plugged_Status == 1) entweder alle 30 Minuten oder alle 5 Minuten) die Devicewerte abgefragt.
Das ist der Trigger für das Lesen der Readings also alle 5 oder 30 Minuten.
Leider gibt es bei der OpenWB kein Modbus Register über das man/frau sich den Wert des Energymeters auslesen kann, weßhalb ich mir ein userReading Total_Active_Energy angelegt habe, das mit einem Shellbefehl beschrieben wird.

Bei jedem Lesen der Device Readings, wird auch mein userReading Total_Active_Energy über den Shellbefehl gesetzt.

Ich suche nach einer Möglichkeit dieses userReading nur zu setzen und einen Logeintrag zu machen, wenn das Auto läd, dann steht nämlich das Reading: LP1_Charge_Active auf 1. Wenn das Auto nicht läd, soll mein userReading nicht überschrieben werden und ich möchte keinen Logeintrag mit dem alten Wert.

Vielen Dank für Deine Unterstützung bei diesem wilden Konstrukt.
wollik

betateilchen

Zitat von: wollik am 06 Februar 2025, 16:03:02Wenn das Auto nicht läd, soll mein userReading nicht überschrieben werden und ich möchte keinen Logeintrag mit dem alten Wert.

Dann musst Du dafür sorgen, dass in diesem Fall der Rückgabewert für das userReading 'undef' (ohne Anführungszeichen) ist.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

wollik

Hallo Betateilchen,
also ich müßte einen else Zweig einbauen der mir undef zurück gibt, wie könnte das für dieses userReading dann aussehen?
Total_Active_Energy:(LP1_Charge_Active).*  {\
   if(ReadingsNum("OpenWB", "LP1_Charge_Active", 0) == 1) \
        sprintf("%.0f",(qx( ..... )));;\
   }\
   else { \
        ? \
   }
DANKE und viele Grüße
wollik


betateilchen

Verwende bitte endlich code tags in Deinen postings. Danke.

Zitat von: wollik am 08 Februar 2025, 16:17:10also ich müßte einen else Zweig einbauen der mir undef zurück gibt, wie könnte das für dieses userReading dann aussehen?

Zum Beispiel so:

Total_Active_Energy[/b]:(LP1_Charge_Active).* { ReadingsNum("OpenWB","LP1_Charge_Active",0)?sprintf("%.0f",(qx( ..... ))):undef }

Es gibt mehrere Lösungsansätze. Grundsätzlich bin ich kein Freund von qx() in solchen Konstrukten, aber das wollte ich jetzt nicht auch noch ändern.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!