Skip to content
This repository was archived by the owner on Feb 18, 2026. It is now read-only.

Commit a5f4ad7

Browse files
committed
Add generic battery metrics
At some point, AVM exposed generic battery metrics (not just in the hkr elements for thermostats). This change adds two new metrics for devices running on battery power: * fritzbox_battery_charge_level * fritzbox_batterylow The thermostat specific battery metrics `fritzbox_thermostat_battery_charge_level` and `fritzbox_thermostat_batterylow` will be kept around, but should be considered deprecated.
1 parent fd94c43 commit a5f4ad7

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed

collector.go

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ var (
1818
type fritzCollector struct {
1919
Info *prometheus.Desc
2020
Present *prometheus.Desc
21+
BatteryChargeLevel *prometheus.Desc
22+
BatteryLow *prometheus.Desc
2123
Temperature *prometheus.Desc
2224
TemperatureOffset *prometheus.Desc
2325
Humidity *prometheus.Desc
@@ -39,6 +41,8 @@ type fritzCollector struct {
3941
func (fc *fritzCollector) Describe(ch chan<- *prometheus.Desc) {
4042
ch <- fc.Info
4143
ch <- fc.Present
44+
ch <- fc.BatteryChargeLevel
45+
ch <- fc.BatteryLow
4246
ch <- fc.Temperature
4347
ch <- fc.TemperatureOffset
4448
ch <- fc.Humidity
@@ -81,6 +85,8 @@ func (fc *fritzCollector) Collect(ch chan<- prometheus.Metric) {
8185
log.Println("Unable to collect data:", err)
8286
ch <- prometheus.NewInvalidMetric(fc.Info, err)
8387
ch <- prometheus.NewInvalidMetric(fc.Present, err)
88+
ch <- prometheus.NewInvalidMetric(fc.BatteryChargeLevel, err)
89+
ch <- prometheus.NewInvalidMetric(fc.BatteryLow, err)
8490
ch <- prometheus.NewInvalidMetric(fc.Temperature, err)
8591
ch <- prometheus.NewInvalidMetric(fc.TemperatureOffset, err)
8692
ch <- prometheus.NewInvalidMetric(fc.Humidity, err)
@@ -127,7 +133,6 @@ func (fc *fritzCollector) Collect(ch chan<- prometheus.Metric) {
127133
if err := mustStringToFloatMetric(ch, fc.Temperature, dev.Temperature.FmtCelsius(), &dev); err != nil {
128134
log.Printf("Unable to parse temperature data of \"%s\" : %v\n", dev.Name, err)
129135
}
130-
131136
if err := mustStringToFloatMetric(ch, fc.TemperatureOffset, dev.Temperature.FmtOffset(), &dev); err != nil {
132137
log.Printf("Unable to parse temperature offset data of \"%s\" : %v\n", dev.Name, err)
133138
}
@@ -137,23 +142,31 @@ func (fc *fritzCollector) Collect(ch chan<- prometheus.Metric) {
137142
if err := mustStringToFloatMetric(ch, fc.EnergyWh, dev.Powermeter.FmtEnergyWh(), &dev); err != nil {
138143
log.Printf("Unable to parse energy data of \"%s\" : %v\n", dev.Name, err)
139144
}
140-
141145
if err := mustStringToFloatMetric(ch, fc.PowerW, dev.Powermeter.FmtPowerW(), &dev); err != nil {
142146
log.Printf("Unable to parse power data of \"%s\" : %v\n", dev.Name, err)
143147
}
144148
}
149+
145150
if dev.Present == 1 && dev.CanMeasureHumidity() {
146151
if err := mustStringToFloatMetric(ch, fc.Humidity, dev.Humidity.FmtRelativeHumidity(), &dev); err != nil {
147152
log.Printf("Unable to parse humidity data of \"%s\" : %v\n", dev.Name, err)
148153
}
149154
}
150155

156+
if dev.Present == 1 && dev.IsBatteryPowered() {
157+
if err := mustStringToFloatMetric(ch, fc.BatteryChargeLevel, dev.BatteryChargeLevel, &dev); err != nil {
158+
log.Printf("Unable to parse battery charge level of \"%s\" : %v\n", dev.Name, err)
159+
}
160+
if err := mustStringToFloatMetric(ch, fc.BatteryLow, dev.BatteryLow, &dev); err != nil {
161+
log.Printf("Unable to parse battery low state of \"%s\" : %v\n", dev.Name, err)
162+
}
163+
}
164+
151165
if dev.IsThermostat() {
152166
// Battery charge level is optional
153167
if err := canStringToFloatMetric(ch, fc.ThermostatBatteryChargeLevel, dev.Thermostat.BatteryChargeLevel, &dev); err != nil {
154168
log.Printf("Unable to parse battery charge level of \"%s\" : %v\n", dev.Name, err)
155169
}
156-
157170
if err := mustStringToFloatMetric(ch, fc.ThermostatBatteryLow, dev.Thermostat.BatteryLow, &dev); err != nil {
158171
log.Printf("Unable to parse battery low state of \"%s\" : %v\n", dev.Name, err)
159172
}
@@ -217,6 +230,18 @@ func NewFritzCollector() *fritzCollector {
217230
genericLabels,
218231
prometheus.Labels{},
219232
),
233+
BatteryChargeLevel: prometheus.NewDesc(
234+
"fritzbox_battery_charge_level",
235+
"Battery charge level in percent",
236+
genericLabels,
237+
prometheus.Labels{},
238+
),
239+
BatteryLow: prometheus.NewDesc(
240+
"fritzbox_batterylow",
241+
"0 if the battery is OK, 1 if it is running low on capacity (this seems to be very unreliable)",
242+
genericLabels,
243+
prometheus.Labels{},
244+
),
220245
Temperature: prometheus.NewDesc(
221246
"fritzbox_temperature",
222247
"Temperature measured at the device sensor in units of 0.1 °C",

test/devicelist_729.metrics

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
# HELP fritzbox_battery_charge_level Battery charge level in percent
2+
# TYPE fritzbox_battery_charge_level gauge
3+
fritzbox_battery_charge_level{device_id="12345 0000002",device_name="HKR_1",device_type="Comet DECT"} 70
4+
fritzbox_battery_charge_level{device_id="12345 0000003",device_name="HKR_2",device_type="Comet DECT"} 100
5+
fritzbox_battery_charge_level{device_id="12345 0000004",device_name="HKR_3",device_type="Comet DECT"} 20
6+
fritzbox_battery_charge_level{device_id="12345 0000005",device_name="HKR_4",device_type="Comet DECT"} 1
7+
fritzbox_battery_charge_level{device_id="12345 0000007",device_name="BUTTON_1",device_type="FRITZ!DECT 440"} 100
8+
# HELP fritzbox_batterylow 0 if the battery is OK, 1 if it is running low on capacity (this seems to be very unreliable)
9+
# TYPE fritzbox_batterylow gauge
10+
fritzbox_batterylow{device_id="12345 0000002",device_name="HKR_1",device_type="Comet DECT"} 0
11+
fritzbox_batterylow{device_id="12345 0000003",device_name="HKR_2",device_type="Comet DECT"} 0
12+
fritzbox_batterylow{device_id="12345 0000004",device_name="HKR_3",device_type="Comet DECT"} 0
13+
fritzbox_batterylow{device_id="12345 0000005",device_name="HKR_4",device_type="Comet DECT"} 0
14+
fritzbox_batterylow{device_id="12345 0000007",device_name="BUTTON_1",device_type="FRITZ!DECT 440"} 0
115
# HELP fritzbox_device_info Device information
216
# TYPE fritzbox_device_info gauge
317
fritzbox_device_info{device_id="12345 0000001",device_name="SW_1",device_type="FRITZ!DECT 200",functionbitmask="35712",fw_version="04.16",internal_id="16",manufacturer="AVM"} 1

0 commit comments

Comments
 (0)