From ca0beb85a1e2794d9a02367c8d84106d4c69b9d6 Mon Sep 17 00:00:00 2001 From: daggelpop Date: Sun, 30 Sep 2018 21:46:49 +0200 Subject: [PATCH] Send heating and fan speed orders --- DysonPureLinkPlugin/dyson_pure_link_device.py | 36 +++++++++++++++++-- DysonPureLinkPlugin/value_types.py | 12 +++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/DysonPureLinkPlugin/dyson_pure_link_device.py b/DysonPureLinkPlugin/dyson_pure_link_device.py index 88160a6..b68bbb2 100644 --- a/DysonPureLinkPlugin/dyson_pure_link_device.py +++ b/DysonPureLinkPlugin/dyson_pure_link_device.py @@ -167,10 +167,40 @@ def connect_device(self): self.client = None return False - def set_fan_mode(self, mode): - """Changes fan mode: ON|OFF|AUTO""" + def set_fan_mode(self, mode, speed=0): + """ + Changes fan mode: FAN|OFF|AUTO + Change fan speed: 1 - 10 + """ + data = {'fmod': mode} + if 1 <= speed <= 10: + data['fnsp'] = '{:04d}'.format(speed) + + if self._is_connected: + self._change_state(data) + + def set_heating_mode(self, mode, max_temperature=None): + """ + Changes heating mode: HEAT|OFF + Change max temperature: 274K - 310K, 1C - 37C, ??F - ??F + """ + + data = {'hmod': mode} + + if max_temperature: + temperature, unit = int(max_temperature[:-1]), max_temperature[-1] + converters = { + 'C': SensorsData.celsius_to_kelvin, + 'F': SensorsData.fahrenheit_to_kelvin, + 'K': lambda x: x, + } + func = converters.get(unit, lambda x: -1) + kelvins = func(temperature) + if 274 <= kelvins <= 310: + data['hmax'] = '{:04d}'.format(int(kelvins) * 10) + if self._is_connected: - self._change_state({'fmod': mode}) + self._change_state(data) def set_standby_monitoring(self, mode): """Changes standby monitoring: ON|OFF""" diff --git a/DysonPureLinkPlugin/value_types.py b/DysonPureLinkPlugin/value_types.py index 082b9ab..3a04676 100644 --- a/DysonPureLinkPlugin/value_types.py +++ b/DysonPureLinkPlugin/value_types.py @@ -93,6 +93,14 @@ def kelvin_to_fahrenheit(kelvin_value): def kelvin_to_celsius(kelvin_value): return kelvin_value - 273.15 + @staticmethod + def fahrenheit_to_kelvin(fahrenheit_value): + return (fahrenheit_value + 459.67) * 5 / 9 + + @staticmethod + def celsius_to_kelvin(celsius_value): + return celsius_value + 273.15 + @property def humidex(self): return self.temperature + 0.5555 * \ @@ -110,7 +118,11 @@ def __init__(self, message): data = message['product-state'] self.fan_mode = self._get_field_value(data['fmod']) + self.fan_speed = self._get_field_value(data['fnsp']) self.fan_state = self._get_field_value(data['fnst']) + self.heating_mode = self._get_field_value(data['hmod']) + self.heating_max_temp = self._get_field_value(data['hmax']) + self.heating_state = self._get_field_value(data['hsta']) self.night_mode = self._get_field_value(data['nmod']) self.speed = self._get_field_value(data['fnsp']) self.oscillation = self._get_field_value(data['oson'])