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.
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
Deine regex verstehe ich grundsätzlich nicht.
Wenn ich den Zahlenwert nach "Month:" haben möchte, verwende ich:
/Month:.([\d.]+)/
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.
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
singularReadingssetzen kann, um statt der komplexen Zeile Einzelreadings zu bekommen.
LG
pah
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...
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.
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.
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
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.
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.