From 25285ef6a7bdcdcc8d57cd6ad96f6f4b7ca8510e Mon Sep 17 00:00:00 2001 From: cgtobi Date: Tue, 16 Jul 2019 04:27:28 +0200 Subject: [PATCH] Fix Netatmo climate battery level (#25165) * Interpolate battery level * Sort list --- homeassistant/components/netatmo/climate.py | 48 +++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index b58599a124c..38c625af173 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -470,13 +470,55 @@ class ThermostatData: .get("battery_level")) if batterylevel: + batterypct = interpolate( + batterylevel, roomstatus["module_type"]) if roomstatus.get("battery_level") is None: - roomstatus["battery_level"] = batterylevel - elif batterylevel < roomstatus["battery_level"]: - roomstatus["battery_level"] = batterylevel + roomstatus["battery_level"] = batterypct + elif batterypct < roomstatus["battery_level"]: + roomstatus["battery_level"] = batterypct self.room_status[room] = roomstatus except KeyError as err: _LOGGER.error("Update of room %s failed. Error: %s", room, err) self.away_temperature = self.homestatus.getAwaytemp(self.home) self.hg_temperature = self.homestatus.getHgtemp(self.home) self.setpoint_duration = self.homedata.setpoint_duration[self.home] + + +def interpolate(batterylevel, module_type): + """Interpolate battery level depending on device type.""" + na_battery_levels = { + NA_THERM: { + 'full': 4100, + 'high': 3600, + 'medium': 3300, + 'low': 3000, + 'empty': 2800}, + NA_VALVE: { + 'full': 3200, + 'high': 2700, + 'medium': 2400, + 'low': 2200, + 'empty': 2200}, + } + + levels = sorted(na_battery_levels[module_type].values()) + steps = [20, 50, 80, 100] + + na_battery_level = na_battery_levels[module_type] + if batterylevel >= na_battery_level['full']: + return 100 + if batterylevel >= na_battery_level['high']: + i = 3 + elif batterylevel >= na_battery_level['medium']: + i = 2 + elif batterylevel >= na_battery_level['low']: + i = 1 + else: + return 0 + + pct = steps[i-1] + ( + (steps[i] - steps[i-1]) * + (batterylevel - levels[i]) / + (levels[i+1] - levels[i]) + ) + return int(pct)