Skip to content

Commit

Permalink
Add generic battery metrics
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
jayme-github committed Feb 9, 2022
1 parent fd94c43 commit a5f4ad7
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 3 deletions.
31 changes: 28 additions & 3 deletions collector.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ var (
type fritzCollector struct {
Info *prometheus.Desc
Present *prometheus.Desc
BatteryChargeLevel *prometheus.Desc
BatteryLow *prometheus.Desc
Temperature *prometheus.Desc
TemperatureOffset *prometheus.Desc
Humidity *prometheus.Desc
Expand All @@ -39,6 +41,8 @@ type fritzCollector struct {
func (fc *fritzCollector) Describe(ch chan<- *prometheus.Desc) {
ch <- fc.Info
ch <- fc.Present
ch <- fc.BatteryChargeLevel
ch <- fc.BatteryLow
ch <- fc.Temperature
ch <- fc.TemperatureOffset
ch <- fc.Humidity
Expand Down Expand Up @@ -81,6 +85,8 @@ func (fc *fritzCollector) Collect(ch chan<- prometheus.Metric) {
log.Println("Unable to collect data:", err)
ch <- prometheus.NewInvalidMetric(fc.Info, err)
ch <- prometheus.NewInvalidMetric(fc.Present, err)
ch <- prometheus.NewInvalidMetric(fc.BatteryChargeLevel, err)
ch <- prometheus.NewInvalidMetric(fc.BatteryLow, err)
ch <- prometheus.NewInvalidMetric(fc.Temperature, err)
ch <- prometheus.NewInvalidMetric(fc.TemperatureOffset, err)
ch <- prometheus.NewInvalidMetric(fc.Humidity, err)
Expand Down Expand Up @@ -127,7 +133,6 @@ func (fc *fritzCollector) Collect(ch chan<- prometheus.Metric) {
if err := mustStringToFloatMetric(ch, fc.Temperature, dev.Temperature.FmtCelsius(), &dev); err != nil {
log.Printf("Unable to parse temperature data of \"%s\" : %v\n", dev.Name, err)
}

if err := mustStringToFloatMetric(ch, fc.TemperatureOffset, dev.Temperature.FmtOffset(), &dev); err != nil {
log.Printf("Unable to parse temperature offset data of \"%s\" : %v\n", dev.Name, err)
}
Expand All @@ -137,23 +142,31 @@ func (fc *fritzCollector) Collect(ch chan<- prometheus.Metric) {
if err := mustStringToFloatMetric(ch, fc.EnergyWh, dev.Powermeter.FmtEnergyWh(), &dev); err != nil {
log.Printf("Unable to parse energy data of \"%s\" : %v\n", dev.Name, err)
}

if err := mustStringToFloatMetric(ch, fc.PowerW, dev.Powermeter.FmtPowerW(), &dev); err != nil {
log.Printf("Unable to parse power data of \"%s\" : %v\n", dev.Name, err)
}
}

if dev.Present == 1 && dev.CanMeasureHumidity() {
if err := mustStringToFloatMetric(ch, fc.Humidity, dev.Humidity.FmtRelativeHumidity(), &dev); err != nil {
log.Printf("Unable to parse humidity data of \"%s\" : %v\n", dev.Name, err)
}
}

if dev.Present == 1 && dev.IsBatteryPowered() {
if err := mustStringToFloatMetric(ch, fc.BatteryChargeLevel, dev.BatteryChargeLevel, &dev); err != nil {
log.Printf("Unable to parse battery charge level of \"%s\" : %v\n", dev.Name, err)
}
if err := mustStringToFloatMetric(ch, fc.BatteryLow, dev.BatteryLow, &dev); err != nil {
log.Printf("Unable to parse battery low state of \"%s\" : %v\n", dev.Name, err)
}
}

if dev.IsThermostat() {
// Battery charge level is optional
if err := canStringToFloatMetric(ch, fc.ThermostatBatteryChargeLevel, dev.Thermostat.BatteryChargeLevel, &dev); err != nil {
log.Printf("Unable to parse battery charge level of \"%s\" : %v\n", dev.Name, err)
}

if err := mustStringToFloatMetric(ch, fc.ThermostatBatteryLow, dev.Thermostat.BatteryLow, &dev); err != nil {
log.Printf("Unable to parse battery low state of \"%s\" : %v\n", dev.Name, err)
}
Expand Down Expand Up @@ -217,6 +230,18 @@ func NewFritzCollector() *fritzCollector {
genericLabels,
prometheus.Labels{},
),
BatteryChargeLevel: prometheus.NewDesc(
"fritzbox_battery_charge_level",
"Battery charge level in percent",
genericLabels,
prometheus.Labels{},
),
BatteryLow: prometheus.NewDesc(
"fritzbox_batterylow",
"0 if the battery is OK, 1 if it is running low on capacity (this seems to be very unreliable)",
genericLabels,
prometheus.Labels{},
),
Temperature: prometheus.NewDesc(
"fritzbox_temperature",
"Temperature measured at the device sensor in units of 0.1 °C",
Expand Down
14 changes: 14 additions & 0 deletions test/devicelist_729.metrics
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
# HELP fritzbox_battery_charge_level Battery charge level in percent
# TYPE fritzbox_battery_charge_level gauge
fritzbox_battery_charge_level{device_id="12345 0000002",device_name="HKR_1",device_type="Comet DECT"} 70
fritzbox_battery_charge_level{device_id="12345 0000003",device_name="HKR_2",device_type="Comet DECT"} 100
fritzbox_battery_charge_level{device_id="12345 0000004",device_name="HKR_3",device_type="Comet DECT"} 20
fritzbox_battery_charge_level{device_id="12345 0000005",device_name="HKR_4",device_type="Comet DECT"} 1
fritzbox_battery_charge_level{device_id="12345 0000007",device_name="BUTTON_1",device_type="FRITZ!DECT 440"} 100
# HELP fritzbox_batterylow 0 if the battery is OK, 1 if it is running low on capacity (this seems to be very unreliable)
# TYPE fritzbox_batterylow gauge
fritzbox_batterylow{device_id="12345 0000002",device_name="HKR_1",device_type="Comet DECT"} 0
fritzbox_batterylow{device_id="12345 0000003",device_name="HKR_2",device_type="Comet DECT"} 0
fritzbox_batterylow{device_id="12345 0000004",device_name="HKR_3",device_type="Comet DECT"} 0
fritzbox_batterylow{device_id="12345 0000005",device_name="HKR_4",device_type="Comet DECT"} 0
fritzbox_batterylow{device_id="12345 0000007",device_name="BUTTON_1",device_type="FRITZ!DECT 440"} 0
# HELP fritzbox_device_info Device information
# TYPE fritzbox_device_info gauge
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
Expand Down

0 comments on commit a5f4ad7

Please sign in to comment.