1818type 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 {
3941func (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" ,
0 commit comments