Nik Rolls 6 лет назад
Родитель
Сommit
f06932f8fb

+ 23 - 20
README.md

@@ -2,9 +2,7 @@ Home Assistant Goldair WiFi Climate component
 =============================================
 
 The `goldair_climate` component integrates 
-[Goldair WiFi-enabled heaters](http://www.goldair.co.nz/product-catalogue/heating/wifi-heaters) and
-WiFi-enabled [dehumidifiers](http://www.goldair.co.nz/product-catalogue/heating/dehumidifiers) into Home Assistant,
-enabling control of setting the following parameters via the UI and the following services:
+[Goldair WiFi-enabled heaters](http://www.goldair.co.nz/product-catalogue/heating/wifi-heaters), WiFi-enabled [dehumidifiers](http://www.goldair.co.nz/product-catalogue/heating/dehumidifiers), and WiFi-enabled fans](http://www.goldair.co.nz/product-catalogue/cooling/pedestal-fans/40cm-dc-quiet-fan-with-wifi-and-remote-gcpf315) into Home Assistant, enabling control of setting the following parameters via the UI and the following services:
 
 **Heaters**
 * **power** (on/off)
@@ -21,37 +19,38 @@ Current temperature is also displayed.
 
 Current temperature is displayed, and current humidity is available as a property.
 
+**Fans**
+* **power** (on/off)
+* **mode** (Normal, Eco, Sleep)
+* **fan mode** (`1`-`12`)
+* **swing** (on/off)
+
 **Light**
 * **LED display** (on/off)
 
-**Lock**
+**Lock** (heaters and dehumidifiers)
 * **Child lock** (on/off)
 
-There was previously a sensor option, however this is easily achieved using a
-[template sensor](https://www.home-assistant.io/integrations/template/) and therefore is no longer supported.
+There was previously a sensor option, however this is easily achieved using a [template sensor](https://www.home-assistant.io/integrations/template/) and therefore is no longer supported.
 
 ---
 
 ### Warning
-Please note, this component has currently only been tested with the Goldair GPPH (inverter) and GPDH420 (dehumidifier)
-range, however theoretically it should also work with GEPH and GPCV heater devices, and may work with the GPDH440  
-dehumidifier, and any other Goldair heaters or dehumidifiers based on the Tuya platform.
+Please note, this component has currently only been tested with the Goldair GPPH (inverter), GPDH420 (dehumidifier), and GCPF315 fan, however theoretically it should also work with GEPH and GPCV heater devices, may work with the GPDH440 dehumidifier and any other Goldair heaters, dehumidifiers or fans based on the Tuya platform.
 
 ---
 
 Installation
 ------------
-The preferred installation method is via [HACS](https://hacs.xyz/). Once you have HACS set up, simply follow the
-[instructions for adding a custom repository](https://hacs.xyz/docs/navigation/settings#custom-repositories) and then
-the integration will be available to install like any other.
+The preferred installation method is via [HACS](https://hacs.xyz/). Once you have HACS set up, simply follow the [instructions for adding a custom repository](https://hacs.xyz/docs/navigation/settings#custom-repositories) and then the integration will be available to install like any other.
+
+You can also use [Custom Updater](https://github.com/custom-components/custom_updater). Once Custom Updater is  set up, go to the Developer Tools > Service page and call the `custom_updater.install` service with this service data:
 
-You can also use [Custom Updater](https://github.com/custom-components/custom_updater). Once Custom Updater is  set
-up, go to the Developer Tools > Service page and call the `custom_updater.install` service with this service data:
 ```json
 { "element": "goldair_climate" }
 ```
-Alternatively you can copy the contents of this repository's `custom_components` directory to your 
-`<config>/custom_components` directory, however you will not get automatic updates this way.
+
+Alternatively you can copy the contents of this repository's `custom_components` directory to your `<config>/custom_components` directory, however you will not get automatic updates this way.
 
 Configuration
 -------------
@@ -85,20 +84,20 @@ goldair_climate:
                                               [as per the instructions below](#finding-your-device-id-and-local-key).
 
 #### type
-&nbsp;&nbsp;&nbsp;&nbsp;*(string) (Required)* The type of Goldair device: currently `heater` or `dehumidifier`.
+&nbsp;&nbsp;&nbsp;&nbsp;*(string) (Required)* The type of Goldair device: currently `heater`, `dehumidifier` or `fan`.
 
 #### climate
-&nbsp;&nbsp;&nbsp;&nbsp;*(boolean) (Optional)* Whether to surface this heater as a climate device.
+&nbsp;&nbsp;&nbsp;&nbsp;*(boolean) (Optional)* Whether to surface this appliance as a climate device.
 
 &nbsp;&nbsp;&nbsp;&nbsp;*Default value: true* 
 
 #### display_light
-&nbsp;&nbsp;&nbsp;&nbsp;*(boolean) (Optional)* Whether to surface this heater's LED display control as a light.
+&nbsp;&nbsp;&nbsp;&nbsp;*(boolean) (Optional)* Whether to surface this appliance's LED display control as a light.
 
 &nbsp;&nbsp;&nbsp;&nbsp;*Default value: false* 
 
 #### child_lock
-&nbsp;&nbsp;&nbsp;&nbsp;*(boolean) (Optional)* Whether to surface this heater's child lock as a lock device.
+&nbsp;&nbsp;&nbsp;&nbsp;*(boolean) (Optional)* Whether to surface this appliances's child lock as a lock device (not supported for fans).
 
 &nbsp;&nbsp;&nbsp;&nbsp;*Default value: false* 
 
@@ -121,6 +120,10 @@ something in HA. This can be confusing because it's the same behaviour as when y
 heater's own control panel and the change is rejected due to being locked, however rest assured that the changes *are* 
 taking effect.
 
+Fan gotchas
+-----------
+In my experience, fans don't like to receive a lot of commands in a short period of time. They will emit two fast beeps when accepting a command, and two slow beeps when rejecting one. If you are writing automations for your fan and need to set multiple properties, you may need to put a delay of around 5 seconds or more between each.
+
 Finding your device ID and local key 
 ------------------------------------
 You can find these keys the same way as you would for any Tuya local integration. You'll need the Tuya Smart app rather

+ 3 - 2
custom_components/goldair_climate/__init__.py

@@ -15,7 +15,7 @@ import homeassistant.helpers.config_validation as cv
 from homeassistant.const import (CONF_NAME, CONF_HOST, TEMP_CELSIUS)
 from homeassistant.helpers.discovery import load_platform
 
-VERSION = '0.0.8'
+VERSION = '0.0.9'
 
 _LOGGER = logging.getLogger(__name__)
 
@@ -29,6 +29,7 @@ CONF_LOCAL_KEY = 'local_key'
 CONF_TYPE = 'type'
 CONF_TYPE_HEATER = 'heater'
 CONF_TYPE_DEHUMIDIFIER = 'dehumidifier'
+CONF_TYPE_FAN = 'fan'
 CONF_CLIMATE = 'climate'
 CONF_DISPLAY_LIGHT = 'display_light'
 CONF_CHILD_LOCK = 'child_lock'
@@ -38,7 +39,7 @@ PLATFORM_SCHEMA = vol.Schema({
     vol.Required(CONF_HOST): cv.string,
     vol.Required(CONF_DEVICE_ID): cv.string,
     vol.Required(CONF_LOCAL_KEY): cv.string,
-    vol.Required(CONF_TYPE): vol.In([CONF_TYPE_HEATER, CONF_TYPE_DEHUMIDIFIER]),
+    vol.Required(CONF_TYPE): vol.In([CONF_TYPE_HEATER, CONF_TYPE_DEHUMIDIFIER, CONF_TYPE_FAN]),
     vol.Optional(CONF_CLIMATE, default=True): cv.boolean,
     vol.Optional(CONF_DISPLAY_LIGHT, default=False): cv.boolean,
     vol.Optional(CONF_CHILD_LOCK, default=False): cv.boolean,

+ 4 - 1
custom_components/goldair_climate/climate.py

@@ -3,10 +3,11 @@ Setup for different kinds of Goldair climate devices
 """
 from homeassistant.const import CONF_HOST
 from custom_components.goldair_climate import (
-    DOMAIN, CONF_TYPE, CONF_TYPE_HEATER, CONF_TYPE_DEHUMIDIFIER
+    DOMAIN, CONF_TYPE, CONF_TYPE_HEATER, CONF_TYPE_DEHUMIDIFIER, CONF_TYPE_FAN
 )
 from custom_components.goldair_climate.heater.climate import GoldairHeater
 from custom_components.goldair_climate.dehumidifier.climate import GoldairDehumidifier
+from custom_components.goldair_climate.fan.climate import GoldairFan
 
 
 def setup_platform(hass, config, add_devices, discovery_info=None):
@@ -16,3 +17,5 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
         add_devices([GoldairHeater(device)])
     elif discovery_info[CONF_TYPE] == CONF_TYPE_DEHUMIDIFIER:
         add_devices([GoldairDehumidifier(device)])
+    elif discovery_info[CONF_TYPE] == CONF_TYPE_FAN:
+        add_devices([GoldairFan(device)])

+ 1 - 2
custom_components/goldair_climate/dehumidifier/climate.py

@@ -1,5 +1,5 @@
 """
-Goldair WiFi Heater device.
+Goldair WiFi Dehumidifier device.
 """
 from homeassistant.const import (
     ATTR_TEMPERATURE, TEMP_CELSIUS, STATE_UNAVAILABLE
@@ -13,7 +13,6 @@ from homeassistant.components.climate.const import (
 )
 from custom_components.goldair_climate import GoldairTuyaDevice
 
-ATTR_ON = 'on'
 ATTR_TARGET_HUMIDITY = 'target_humidity'
 ATTR_AIR_CLEAN_ON = 'air_clean_on'
 ATTR_CHILD_LOCK = 'child_lock'

+ 0 - 0
custom_components/goldair_climate/fan/__init__.py


+ 167 - 0
custom_components/goldair_climate/fan/climate.py

@@ -0,0 +1,167 @@
+"""
+Goldair WiFi Fan device.
+"""
+from homeassistant.const import (
+    ATTR_TEMPERATURE, TEMP_CELSIUS, STATE_UNAVAILABLE
+)
+from homeassistant.components.climate import ClimateDevice
+from homeassistant.components.climate.const import (
+    ATTR_HVAC_MODE, ATTR_PRESET_MODE, ATTR_FAN_MODE, ATTR_SWING_MODE,
+    HVAC_MODE_OFF, HVAC_MODE_FAN_ONLY,
+    PRESET_ECO, PRESET_SLEEP,
+    SUPPORT_FAN_MODE, SUPPORT_PRESET_MODE, SUPPORT_SWING_MODE,
+    SWING_OFF, SWING_HORIZONTAL
+)
+from custom_components.goldair_climate import GoldairTuyaDevice
+
+ATTR_TARGET_TEMPERATURE = 'target_temperature'
+ATTR_DISPLAY_ON = 'display_on'
+
+PRESET_NORMAL = 'normal'
+
+PROPERTY_TO_DPS_ID = {
+    ATTR_HVAC_MODE: '1',
+    ATTR_FAN_MODE: '2',
+    ATTR_PRESET_MODE: '3',
+    ATTR_SWING_MODE: '8',
+    ATTR_DISPLAY_ON: '101'
+}
+
+HVAC_MODE_TO_DPS_MODE = {
+    HVAC_MODE_OFF: False,
+    HVAC_MODE_FAN_ONLY: True
+}
+PRESET_MODE_TO_DPS_MODE = {
+    PRESET_NORMAL: 'normal',
+    PRESET_ECO: 'nature',
+    PRESET_SLEEP: 'sleep'
+}
+SWING_MODE_TO_DPS_MODE = {
+    SWING_OFF: False,
+    SWING_HORIZONTAL: True
+}
+FAN_MODES = {
+    PRESET_NORMAL: {1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', 10: '10', 11: '11',
+                    12: '12'},
+    PRESET_ECO: {1: '4', 2: '8', 3: '12'},
+    PRESET_SLEEP: {1: '4', 2: '8', 3: '12'}
+}
+
+SUPPORT_FLAGS = SUPPORT_FAN_MODE | SUPPORT_PRESET_MODE | SUPPORT_SWING_MODE
+
+
+class GoldairFan(ClimateDevice):
+    """Representation of a Goldair WiFi fan."""
+
+    def __init__(self, device):
+        """Initialize the fan.
+        Args:
+            name (str): The device's name.
+            device (GoldairTuyaDevice): The device API instance."""
+        self._device = device
+
+        self._support_flags = SUPPORT_FLAGS
+
+    @property
+    def supported_features(self):
+        """Return the list of supported features."""
+        return self._support_flags
+
+    @property
+    def should_poll(self):
+        """Return the polling state."""
+        return True
+
+    @property
+    def name(self):
+        """Return the name of the climate device."""
+        return self._device.name
+
+    @property
+    def temperature_unit(self):
+        """This is not used but required by Home Assistant."""
+        return TEMP_CELSIUS
+
+    @property
+    def hvac_mode(self):
+        """Return current HVAC mode, ie Fan Only or Off."""
+        dps_mode = self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_HVAC_MODE])
+
+        if dps_mode is not None:
+            return GoldairTuyaDevice.get_key_for_value(HVAC_MODE_TO_DPS_MODE, dps_mode)
+        else:
+            return STATE_UNAVAILABLE
+
+    @property
+    def hvac_modes(self):
+        """Return the list of available HVAC modes."""
+        return list(HVAC_MODE_TO_DPS_MODE.keys())
+
+    def set_hvac_mode(self, hvac_mode):
+        """Set new HVAC mode."""
+        dps_mode = HVAC_MODE_TO_DPS_MODE[hvac_mode]
+        self._device.set_property(PROPERTY_TO_DPS_ID[ATTR_HVAC_MODE], dps_mode)
+
+    @property
+    def preset_mode(self):
+        """Return current preset mode, ie Comfort, Eco, Anti-freeze."""
+        dps_mode = self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_PRESET_MODE])
+        if dps_mode is not None:
+            return GoldairTuyaDevice.get_key_for_value(PRESET_MODE_TO_DPS_MODE, dps_mode)
+        else:
+            return None
+
+    @property
+    def preset_modes(self):
+        """Return the list of available preset modes."""
+        return list(PRESET_MODE_TO_DPS_MODE.keys())
+
+    def set_preset_mode(self, preset_mode):
+        """Set new preset mode."""
+        dps_mode = PRESET_MODE_TO_DPS_MODE[preset_mode]
+        self._device.set_property(PROPERTY_TO_DPS_ID[ATTR_PRESET_MODE], dps_mode)
+
+    @property
+    def swing_mode(self):
+        """Return current swing mode: horizontal or off"""
+        dps_mode = self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_SWING_MODE])
+        if dps_mode is not None:
+            return GoldairTuyaDevice.get_key_for_value(SWING_MODE_TO_DPS_MODE, dps_mode)
+        else:
+            return None
+
+    @property
+    def swing_modes(self):
+        """Return the list of available swing modes."""
+        return list(SWING_MODE_TO_DPS_MODE.keys())
+
+    def set_swing_mode(self, swing_mode):
+        """Set new swing mode."""
+        dps_mode = SWING_MODE_TO_DPS_MODE[swing_mode]
+        self._device.set_property(PROPERTY_TO_DPS_ID[ATTR_SWING_MODE], dps_mode)
+
+    @property
+    def fan_mode(self):
+        """Return current fan mode: 1-12"""
+        dps_mode = self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_FAN_MODE])
+        if dps_mode is not None and self.preset_mode is not None:
+            return GoldairTuyaDevice.get_key_for_value(FAN_MODES[self.preset_mode], dps_mode)
+        else:
+            return None
+
+    @property
+    def fan_modes(self):
+        """Return the list of available fan modes."""
+        if self.preset_mode is not None:
+            return list(FAN_MODES[self.preset_mode].keys())
+        else:
+            return []
+
+    def set_fan_mode(self, fan_mode):
+        """Set new fan mode."""
+        if self.preset_mode is not None:
+            dps_mode = FAN_MODES[self.preset_mode][int(fan_mode)]
+            self._device.set_property(PROPERTY_TO_DPS_ID[ATTR_FAN_MODE], dps_mode)
+
+    def update(self):
+        self._device.refresh()

+ 56 - 0
custom_components/goldair_climate/fan/light.py

@@ -0,0 +1,56 @@
+"""
+Platform to control the LED display light on Goldair WiFi-connected fans and panels.
+"""
+from homeassistant.components.light import Light
+from homeassistant.const import STATE_UNAVAILABLE
+from custom_components.goldair_climate import GoldairTuyaDevice
+from custom_components.goldair_climate.fan.climate import (
+    ATTR_DISPLAY_ON, PROPERTY_TO_DPS_ID, HVAC_MODE_TO_DPS_MODE
+)
+from homeassistant.components.climate import (
+    ATTR_HVAC_MODE, HVAC_MODE_OFF
+)
+
+
+class GoldairFanLedDisplayLight(Light):
+    """Representation of a Goldair WiFi-connected fan LED display."""
+
+    def __init__(self, device):
+        """Initialize the light.
+        Args:
+            device (GoldairTuyaDevice): The device API instance."""
+        self._device = device
+
+    @property
+    def should_poll(self):
+        """Return the polling state."""
+        return True
+
+    @property
+    def name(self):
+        """Return the name of the light."""
+        return self._device.name
+
+    @property
+    def is_on(self):
+        """Return the current state."""
+        dps_hvac_mode = self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_HVAC_MODE])
+        dps_display_on = self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_DISPLAY_ON])
+
+        if dps_hvac_mode is None or dps_hvac_mode == HVAC_MODE_TO_DPS_MODE[HVAC_MODE_OFF]:
+            return STATE_UNAVAILABLE
+        else:
+            return dps_display_on
+
+    def turn_on(self):
+        self._device.set_property(PROPERTY_TO_DPS_ID[ATTR_DISPLAY_ON], True)
+
+    def turn_off(self):
+        self._device.set_property(PROPERTY_TO_DPS_ID[ATTR_DISPLAY_ON], False)
+
+    def toggle(self):
+        dps_hvac_mode = self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_HVAC_MODE])
+        dps_display_on = self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_DISPLAY_ON])
+
+        if dps_hvac_mode != HVAC_MODE_TO_DPS_MODE[HVAC_MODE_OFF]:
+            self.turn_on() if not dps_display_on else self.turn_off()

+ 0 - 1
custom_components/goldair_climate/heater/climate.py

@@ -12,7 +12,6 @@ from homeassistant.components.climate.const import (
 )
 from custom_components.goldair_climate import GoldairTuyaDevice
 
-ATTR_ON = 'on'
 ATTR_TARGET_TEMPERATURE = 'target_temperature'
 ATTR_CHILD_LOCK = 'child_lock'
 ATTR_FAULT = 'fault'

+ 4 - 1
custom_components/goldair_climate/light.py

@@ -3,10 +3,11 @@ Setup for different kinds of Goldair climate devices
 """
 from homeassistant.const import CONF_HOST
 from custom_components.goldair_climate import (
-    DOMAIN, CONF_TYPE, CONF_TYPE_HEATER, CONF_TYPE_DEHUMIDIFIER
+    DOMAIN, CONF_TYPE, CONF_TYPE_HEATER, CONF_TYPE_DEHUMIDIFIER, CONF_TYPE_FAN
 )
 from custom_components.goldair_climate.heater.light import GoldairHeaterLedDisplayLight
 from custom_components.goldair_climate.dehumidifier.light import GoldairDehumidifierLedDisplayLight
+from custom_components.goldair_climate.fan.light import GoldairFanLedDisplayLight
 
 
 def setup_platform(hass, config, add_devices, discovery_info=None):
@@ -16,3 +17,5 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
         add_devices([GoldairHeaterLedDisplayLight(device)])
     elif discovery_info[CONF_TYPE] == CONF_TYPE_DEHUMIDIFIER:
         add_devices([GoldairDehumidifierLedDisplayLight(device)])
+    elif discovery_info[CONF_TYPE] == CONF_TYPE_FAN:
+        add_devices([GoldairFanLedDisplayLight(device)])

+ 3 - 1
custom_components/goldair_climate/lock.py

@@ -3,7 +3,7 @@ Setup for different kinds of Goldair climate devices
 """
 from homeassistant.const import CONF_HOST
 from custom_components.goldair_climate import (
-    DOMAIN, CONF_TYPE, CONF_TYPE_HEATER, CONF_TYPE_DEHUMIDIFIER
+    DOMAIN, CONF_TYPE, CONF_TYPE_HEATER, CONF_TYPE_DEHUMIDIFIER, CONF_TYPE_FAN
 )
 from custom_components.goldair_climate.heater.lock import GoldairHeaterChildLock
 from custom_components.goldair_climate.dehumidifier.lock import GoldairDehumidifierChildLock
@@ -16,3 +16,5 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
         add_devices([GoldairHeaterChildLock(device)])
     if discovery_info[CONF_TYPE] == CONF_TYPE_DEHUMIDIFIER:
         add_devices([GoldairDehumidifierChildLock(device)])
+    if discovery_info[CONF_TYPE] == CONF_TYPE_FAN:
+        raise ValueError('Goldair fains do not support Child Lock.')

+ 9 - 6
custom_updater.json

@@ -1,6 +1,6 @@
 {
     "goldair_climate": {
-        "version": "0.0.8",
+        "version": "0.0.9",
         "local_location": "/custom_components/goldair_climate/__init__.py",
         "remote_location": "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/__init__.py",
         "visit_repo": "https://github.com/nikrolls/homeassistant-goldair-climate",
@@ -11,14 +11,17 @@
             "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/climate.py",
             "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/light.py",
             "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/lock.py",
-            "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/heater/__init__.py",
-            "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/heater/climate.py",
-            "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/heater/light.py",
-            "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/heater/lock.py",
             "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/dehumidifier/__init__.py",
             "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/dehumidifier/climate.py",
             "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/dehumidifier/light.py",
-            "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/dehumidifier/lock.py"
+            "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/dehumidifier/lock.py",
+            "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/fan/__init__.py",
+            "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/fan/climate.py",
+            "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/fan/light.py",
+            "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/heater/__init__.py",
+            "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/heater/climate.py",
+            "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/heater/light.py",
+            "https://raw.githubusercontent.com/nikrolls/homeassistant-goldair-climate/master/custom_components/goldair_climate/heater/lock.py"
         ]
     }
 }