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