Klärungsbedarf bei einem UserReading

Begonnen von Marko1976, 04 März 2026, 18:48:34

Vorheriges Thema - Nächstes Thema

Marko1976

Hallo, es dürfte wohl inzwischen allgemein Bekannt sein, dass Perl und Regex nicht mein Freund ist. Nun habe ich aber eine Sache, die ich mir gar nicht erklären kann und hoffe jemand kann mir erklären warum das so ist wie es ist.

Ich erstelle mit Hilfe des statistics-Moduls einen Delta für den Gesamtstromverbrauch. Dadurch erhalte ich ein Reading wie folgt:
Hour: 0.2 Day: 0.2 Month: 0.2 Year: 0.2 (since: 2026-03-04_18:18:58 )
Jetzt würde ich gerne die einzelnen Zeitbereiche in Einzelreadings trennen und habe mir dazu mit Hilfe des Forums und allgemeinen Internets folgendes UserReading gebastelt:
statEnergy_kWh_Month { ReadingsVal("$name","statEnergy_kWh","") =~ /Month\":\"([^\"]*)\"/; return $1 }
Interessanterweise wird das Reading "statEnergy_kWh_Month" jetzt aber mit dem Device-Namen des SmartMeter-Devices befüllt, nämlich:
FBDECT_Fritzbox_Actors_15282_0919488_1
Frage die ich nicht verstehe ist nun, wo kommt der Devicename her? In dem Reading das ich auftrenne kommt er ja überhaupt nicht vor, also wo hohlt das UserReading ihn her?

Hier noch das List des Device:
Internals:
  DEF        Fritzbox_Actors:15282_0919488_1 powerMeter
  FUUID      68eb9223-f33f-7706-ca1c-9d07c3148480fb8a
  FVERSION  10_FBDECT.pm:0.290260/2024-07-15
  Fritzbox_Actors_MSGCNT 880
  Fritzbox_Actors_TIME 2026-03-04 18:44:58
  IODev      Fritzbox_Actors
  LASTInputDev Fritzbox_Actors
  MSGCNT    880
  NAME      FBDECT_Fritzbox_Actors_15282_0919488_1
  NR        541
  STATE      534 W (1231.7 kWh)
  TYPE      FBDECT
  eventCount 880
  id        15282_0919488_1
  props      HANFUNUnit,powerMeter
  OLDREADINGS:
  READINGS:
    2026-03-04 18:44:58  AIN            15282 0919488-1
    2026-03-04 18:44:58  FBNAME          Bezug
    2026-03-04 18:44:58  FBPROP          HANFUNUnit,powerMeter
    2026-03-04 18:44:58  FBTYPE          FRITZ!Smart Energy 250
    2026-03-04 18:44:58  ID              2000
    2026-03-04 11:24:37  IODev          Fritzbox_Actors
    2026-02-17 01:27:08  battery        70 %
    2025-12-20 09:21:41  batteryLabel    SmartMeter am Stromzähler
    2026-02-17 01:27:08  batteryPercent  70
    2026-03-04 18:44:58  batteryState    ok
    2026-02-17 01:27:08  batterylow      0
    2025-12-20 09:22:15  batterytyp      2xMignon (AA)
    2026-03-04 18:44:58  energy          1231731 Wh
    2026-03-04 18:44:58  energy_kWh      1231.7
    2026-03-04 18:44:58  etsideviceid    20
    2026-03-04 18:44:58  fwversion      0.0
    2026-03-04 18:44:58  power          534.00 W
    2026-03-04 18:44:58  power_round    534
    2026-03-04 18:44:58  present        yes
    2026-03-04 18:44:58  statEnergy_kWh  Hour: 0.2 Day: 0.2 Month: 0.2 Year: 0.2 (since: 2026-03-04_18:18:58 )
    2026-03-04 18:44:58  statEnergy_kWh_Month FBDECT_Fritzbox_Actors_15282_0919488_1
    2026-03-04 18:44:58  statEnergy_kWh_Year FBDECT_Fritzbox_Actors_15282_0919488_1
    2026-03-04 18:44:58  statPower_roundDay Min: 449 Avg: 493 Max: 607 (since: 2026-03-04_18:19:28 )
    2026-03-04 18:44:58  statPower_roundHour Min: 449 Avg: 493 Max: 607 (since: 2026-03-04_18:19:28 )
    2026-03-04 18:44:58  statPower_roundMonth Min: 449 Avg: 493 Max: 607 (since: 2026-03-04_18:19:28 )
    2026-03-04 18:44:58  statPower_roundYear Min: 449 Avg: 493 Max: 607 (since: 2026-03-04_18:19:28 )
    2026-03-04 18:44:58  unittype        65281
    2026-02-17 01:27:08  voltage        0.000 V
  helper:
    _98_statistics statistics_SmartMeter
Attributes:
  alias      Sensor SmartMeter
  event-min-interval power:60,energy:300
  group      Batteriebetrieb,Sensor
  icon      gasmeter1
  room      FBDECT,Wohnung->Keller
  stateFormat power_round W (energy_kWh kWh)
  userReadings batteryState {if(ReadingsVal("$name","batteryPercent",'') >= 25) {return "ok"} elsif (ReadingsVal("$name","batteryPercent",'') => 10) {return "low"} else {return "dead"}},
energy_kWh {round(ReadingsNum("$name","energy",'') / 1000 ,1)},
power_round {round(ReadingsNum("$name","power",'') ,0 )},
statEnergy_kWh_Month { ReadingsVal("$name","statEnergy_kWh","") =~ /Month\":\"([^\"]*)\"/; return $1 },
statEnergy_kWh_Year { ReadingsVal("$name","statEnergy_kWh","") =~ /Year\":\"([^\"]*)\"/; return $1 },

Wie gesagt es geht mir augenblicklich nur um die Frage woher das Userreading den Devicenamen zieht wenn er kein Bestandteil des Readings ist.

betateilchen

#1
Tipp: wenn man mit regex nicht klarkommt, kann man auch darüber nachdenken, ob es andere - einfachere - Möglichkeiten gibt, zum Ergebnis zu kommen.

Beispielsweise so:

my @val = split(/ /,"Hour: 0.2 Day: 0.2 Month: 0.2 Year: 0.2 (since: 2026-03-04_18:18:58 )");
Das ergibt ein Array, aus dem Du die gesuchten Werte einfach entnehmen kannst:

$val[1] liefert den Wert für hour
$val[3] liefert den Wert für day
$val[5] liefert den Wert für month
$val[7] liefert den Wert für year
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#2
Deine regex verstehe ich grundsätzlich nicht.

Wenn ich den Zahlenwert nach "Month:" haben möchte, verwende ich:

/Month:.([\d.]+)/
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Jetzt habe ich tatsächlich versucht, das mal so nachzubauen, wie Du es eingangs beschrieben hast.
Bei mir kommt dabei ein leeres userReading raus.

Du hast in Deinem Attribut userReadings vor allem das Problem, dass sinnvolle Trigger für die Anlage der einzelnen userReadings fehlen. Bei JEDEM beliebigen Event in diesem device versucht es, ALLE userReadings neu zu ermitteln.

Das führt dazu, dass Du gar nicht erkennen kannst, aus welchem Event das userReading erzeugt wird, das dann mit dem Namen gefüttert wird. Höchstwahrscheinlich wird das gar nicht aus der Zeile erzeugt, die Du als problematisch vermutest.

Verwende sinnvolle Trigger, zum Beispiel wird das userReading statEnergy_kWh_Month aus statEnergy_kWh erzeugt. Dann kannst Du auch auf das reading triggern:

statEnergy_kWh_Month:statEnergy_kWh.* {<irgendeinPerlCode>}
(ob es sinnvoll ist, den Namen des userReadings so zu wählen, dass der Name des Ursprungsreadings darin 1:1 vorkommt, lasse ich jetzt unbetrachtet)

Das erleichtert zum einen die Fehlersuche und zum anderen reduziert es die FHEM-interne Last durch unnötige Durchläufe bei jedem event.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Prof. Dr. Peter Henning

Zitat von: Marko1976 am 04 März 2026, 18:48:34Bekannt sein, dass Perl und Regex nicht mein Freund ist
Dann würde ich doch statt des "Forums" und des "allgemeinen Internet" einfach mal die CommandRef zum statistics-Modul lesen, die ist weder "Perl" noch "Regex", sondern "deutsch". Da steht nämlich schwarz auf weiß drin, dass man solche Klimmzüge gar nicht machen muss, sondern einfach das Attribut

singularReadings

setzen kann, um statt der komplexen Zeile Einzelreadings zu bekommen.

LG

pah

RalfRog

Wollte Marko1976 ja ausdrücklich nicht wissen.

ZitatWie gesagt es geht mir augenblicklich nur um die Frage woher das Userreading den Devicenamen zieht wenn er kein Bestandteil des Readings ist.

Inwieweit das Sinn macht,wenn es durch das Modul bereit gestellt wird...



FHEM VM Debian13 (trixie) auf Proxmox VE9  (Futro S740) - nanoCUL, HM-MOD-RPI-PCB und MAX!Cube über LAN
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder sowie Shelly 3EM, 1PM, PlugS und IT Schaltsteckdosen

Marko1976

Zitat von: betateilchen am 04 März 2026, 19:00:49Tipp: wenn man mit regex nicht klarkommt, kann man auch darüber nachdenken, ob es andere - einfachere - Möglichkeiten gibt, zum Ergebnis zu kommen.
Klar das mag sein, diese Möglichkeit habe ich auch bereits selbst gefunden. Doch es hat ja nichts damit zu tun das ich nicht erkenne woher das Ergebnis in meiner Konstellation stammt und somit NIEMALS ohne Hilfe verstehen und lernen kann warum es so wie es ist nicht funktioniert bzw. das fehlerhafte Ergebnis kommt.
Zitat/Month:.([\d.]+)/
Und genau so etwas verstehe ich nicht, darum lasse ich nach möglichkeit die Finger davon. Diese Symbolik und Bedeutung der einzelnen Platzhalter will einfach nicht in meinen Schädel rein - zumindest nicht dauerhaft zum behalten.
Zitat von: betateilchen am 05 März 2026, 08:34:45Du hast in Deinem Attribut userReadings vor allem das Problem, dass sinnvolle Trigger für die Anlage der einzelnen userReadings fehlen. Bei JEDEM beliebigen Event in diesem device versucht es, ALLE userReadings neu zu ermitteln.
Das ist doch nach meinem Verständnis auch Sinn eines UserReadings. Ein UserReading soll soweit ich es verstehe bestehnde Readings manipulieren, verändern oder daraus ableitende Berechnungen vornehmen. Wenn das nicht bei jedem Trigger passiert, sind die hälfte der Werte doch ständig veraltet.
Zitat von: betateilchen am 05 März 2026, 08:34:45Das führt dazu, dass Du gar nicht erkennen kannst, aus welchem Event das userReading erzeugt wird, das dann mit dem Namen gefüttert wird. Höchstwahrscheinlich wird das gar nicht aus der Zeile erzeugt, die Du als problematisch vermutest.
Es wird doch mit
statEnergy_kWh_Month { ReadingsVal("$name","statEnergy_kWh","") =~ /Month\":\"([^\"]*)\"/; return $1 }explizit das Reading "statEnergy_kWh" des Device ausgelesen und (ich nenne es mal) kastriert. In diesem Reading steht aber  folgendes drin:
Hour: 0.4 Day: 4.2 Month: 40.6 Year: 40.6 (since: 2026-03-05 )Es spielt doch gar keine Rolle wann oder wodurch die Berechnung ausgelöst wird, sondern NUR was berechnet wird, nämlich der Inhalt dieses spezifischen Readings. Wenn dieses Reading aber den Device-Namen gar nicht enthält, wie kann dann das UserReading diesen als Ergebnis ausspucken - das ist die Frage.
Das ist gerade so als wenn ich sagen würde: "Ich habe meine Mutter lieb" und das Ergebnis lautet "Vater". Darum hatte ich ja bewusst dabei geschrieben, dass es mir nicht um eine Lösung des eigentlichen Problems geht sondern in dem Fall EINZIG um das Verständnis warum, wieso, weshalb das Ergebnis hier so lautet.
Zitat von: betateilchen am 05 März 2026, 08:34:45(ob es sinnvoll ist, den Namen des userReadings so zu wählen, dass der Name des Ursprungsreadings darin 1:1 vorkommt, lasse ich jetzt unbetrachtet)
Das erleichtert zum einen die Fehlersuche und zum anderen reduziert es die FHEM-interne Last durch unnötige Durchläufe bei jedem event.
Verstehe ich nicht, da ganau das es ist was ich mache. Mein UserReading hat den gleichen Namen wie das Ursrungsreading + eine Erweiterung.

Tipp & Frage zugleich:
In deinen Beiträgen sind Codezeilen immer nicht lesbar, da sie von der Höhe zu klein dargestellt werden. Keine Ahnung ob das gewollt ist oder nicht, aber es macht das lesen deiner Beiträge enorm schwer, da man den Code immer erstmal kopieren und irgendwo einfügen muss um zu sehen was darin steht. Keine Ahnung ob das bei Mehrzeilern auch so ist, hier sind es ja alles immer nur Einzeiler.

Zitat von: Prof. Dr. Peter Henning am 07 März 2026, 12:15:53singularReadings
Habe ich exakt wie in der commandRef beschrieben benutzt was sofort zu einem Overflow geführt hat der mir den kompletten Server für einen halben Tag lahmgelegt hat. Sorry, aber nein Danke - das Risiko ist mir zu unüberschaubar.

Zitat von: RalfRog am 08 März 2026, 09:18:12Inwieweit das Sinn macht,wenn es durch das Modul bereit gestellt wird...
Ich verstehe leider nicht den Kontext in dem dein Kommentar steht.

betateilchen

2/3 Deiner Antwort beruhen wieder einmal auf falschen Annahmen und fehlendem Verständnis auf Deiner Seite, dieses Mal, wenn es darum geht, was userReadings sind und wozu sie wie benutzt werden.

Bevor ich jetzt aber anfange, Dir das alles aufzudröseln und wir dann am Ende sowieso wieder bei einem von Dir geäußerten "alle sind doof, nur Marko1976 nicht" landen (wie wir es in der Vergangenheit am Ende IMMER hatten), genieße ich lieber den schönen Sonntag.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Prof. Dr. Peter Henning

Zitat von: betateilchen am 08 März 2026, 11:52:542/3 Deiner Antwort beruhen wieder einmal auf falschen Annahmen und fehlendem Verständnis auf Deiner Seite,
Ich denke, eher 150 Prozent...

Zitat von: Marko1976 am 08 März 2026, 11:11:09Habe ich exakt wie in der commandRef beschrieben benutzt was sofort zu einem Overflow geführt hat der mir den kompletten Server für einen halben Tag lahmgelegt hat. Sorry, aber nein Danke - das Risiko ist mir zu unüberschaubar.
Das halte ich für granatenmäßigen Unsinn. Wenn man etwas "exakt wie in der CommandRef beschrieben" verwendet, gibt es mit SICHERHEIT keinen Overflow. Das Risiko sitzt jedenfalls nicht _im_ Computer.

Zitat von: Marko1976 am 08 März 2026, 11:11:09Tipp & Frage zugleich:
In deinen Beiträgen sind Codezeilen immer nicht lesbar, da sie von der Höhe zu klein dargestellt werden. Keine Ahnung ob das gewollt ist oder nicht, aber es macht das lesen deiner Beiträge enorm schwer, da man den Code immer erstmal kopieren und irgendwo einfügen muss um zu sehen was darin steht. Keine Ahnung ob das bei Mehrzeilern auch so ist, hier sind es ja alles immer nur Einzeiler.
::)  ::)
Brr. Schon mal die Scrollbalken auf der rechten Seite des Feldes gesehen???

Zitat von: Marko1976 am 08 März 2026, 11:11:09Es spielt doch gar keine Rolle wann oder wodurch die Berechnung ausgelöst wird, sondern NUR was berechnet wird,
Auch das ist einfach Unsinn, denn genau darin liegt die Ursache des Fehlers.

Ich finde das nervig: Der TE weigert sich, die Dinge einfach und korrekt zu machen und verlangt von uns, dass wir seine krummen Umwege nachvollziehen, am Besten noch ausbessern. Werde mich jetzt betateilchen anschließen und diesen Unsinn hier ignorieren.

pah

passibe

Zitat von: Marko1976 am 08 März 2026, 11:11:09Und genau so etwas verstehe ich nicht, darum lasse ich nach möglichkeit die Finger davon. Diese Symbolik und Bedeutung der einzelnen Platzhalter will einfach nicht in meinen Schädel rein - zumindest nicht dauerhaft zum behalten.
Baller das doch einfach in das LLM deiner Wahl und lass es dir erklären ...

Die Dinger können übrigens auch sehr gut RegEx erstellen.

mE ist es keine Schande, im Jahr 2026 solche Werkzeuge zu benutzen, vor allem für solche Aufgaben.

Marko1976

Zitat von: betateilchen am 08 März 2026, 11:52:54Bevor ich jetzt aber anfange, Dir das alles aufzudröseln und wir dann am Ende sowieso wieder bei einem von Dir geäußerten "alle sind doof, nur Marko1976 nicht" landen (wie wir es in der Vergangenheit am Ende IMMER hatten), genieße ich lieber den schönen Sonntag.
Und genau das ist es warum es immer so endet - JEDES Mal wenn es um echte Erklärungen geht ziehst du mit irgendwelchen Ausreden den Schwanz ein und wunderst dich warum gerade deine Forderung "man solle doch lernen" NIE erfüllt werden kann obwohl man es will.

Das Problem liegt nicht bie mir, sondern bei dir - einmal vernünftig erklärt und gut wäre es. Statt dessen wenn überhaupt nur Andeutungen oder halbkryptisch Sätze oder gar solche Ausflüchte. Langsam habe ich den Verdacht das du es nicht kannst.

@Prof. Dr. Peter Henning
Beitrag ist wie jeder persönliche Angriff bei den Anmins gemeldet. Darüber hinaus reicht es mir jetzt und ich werde polizeilich gegen Sie vorgehen! Ihr Verhalten ist nicht grenzwertig sondern eindeutig Mobbing und Verleumdung und das ist in Deutschland strafbar.
Zitat von: passibe am 08 März 2026, 13:25:45Baller das doch einfach in das LLM deiner Wahl und lass es dir erklären
Und was soll ein LLM sein? Ist es in Deutschland mitlerweile Verpönt mal normale ganze Wörter zu benutzen? Das bringt mich genauso weit wie gar nichts zu sagen.



Aber da das hier wieder einmal nur in Verarsche ausartet beende ich dieses Thema hier jetzt und werden die angesprochenen Schritte einleiten.