Skip to content

Commit

Permalink
0.7.0
Browse files Browse the repository at this point in the history
  • Loading branch information
gvigroux committed Apr 18, 2024
1 parent 5974856 commit 8bc22af
Show file tree
Hide file tree
Showing 5 changed files with 868 additions and 42 deletions.
16 changes: 8 additions & 8 deletions custom_components/hon/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,16 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
appliances.extend([HonBaseOnOff(hass, coordinator, entry, appliance)])

if device.has("doorStatusZ1"):
appliances.extend([HonBaseDoorStatus(hass, coordinator, entry, appliance, "Z1", "Zone 1")])
appliances.extend([HonBaseDoorStatus(hass, coordinator, entry, appliance, "Z1", "zone 1")])
if device.has("doorStatusZ2"):
appliances.extend([HonBaseDoorStatus(hass, coordinator, entry, appliance, "Z2", "Zone 2")])
appliances.extend([HonBaseDoorStatus(hass, coordinator, entry, appliance, "Z2", "zone 2")])
if device.has("doorLockStatus"):
appliances.extend([HonBaseDoorLockStatus(hass, coordinator, entry, appliance)])

if device.has("door2StatusZ1"):
appliances.extend([HonBaseDoor2Status(hass, coordinator, entry, appliance, "Z1", "Zone 1")])
appliances.extend([HonBaseDoor2Status(hass, coordinator, entry, appliance, "Z1", "zone 1")])
if device.has("door2StatusZ2"):
appliances.extend([HonBaseDoor2Status(hass, coordinator, entry, appliance, "Z2", "Zone 2")])
appliances.extend([HonBaseDoor2Status(hass, coordinator, entry, appliance, "Z2", "zone 2")])

if device.has("lockStatus"):
appliances.extend([HonBaseChildLockStatus(hass, coordinator, entry, appliance)])
Expand Down Expand Up @@ -101,15 +101,15 @@ def supported_attributes(self) -> set[str] | None:

class HonBaseRemoteControl(HonBaseBinarySensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "remoteCtrValid", "Remote Control")
super().__init__(coordinator, appliance, "remoteCtrValid", "Remote control")

self._attr_device_class = BinarySensorDeviceClass.CONNECTIVITY
self._attr_icon = "mdi:remote"


class HonBaseDoorLockStatus(HonBaseBinarySensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "doorLockStatus", "Door Lock")
super().__init__(coordinator, appliance, "doorLockStatus", "Door lock")

self._attr_device_class = BinarySensorDeviceClass.LOCK

Expand All @@ -119,7 +119,7 @@ def coordinator_update(self):

class HonBaseChildLockStatus(HonBaseBinarySensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "lockStatus", "Child Lock")
super().__init__(coordinator, appliance, "lockStatus", "Child lock")

translation_key = "lockStatus"
self._attr_device_class = BinarySensorDeviceClass.LOCK
Expand All @@ -137,7 +137,7 @@ def __init__(self, hass, coordinator, entry, appliance) -> None:

class HonBaseHealthMode(HonBaseBinarySensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "healthMode", "Health Mode")
super().__init__(coordinator, appliance, "healthMode", "Health mode")

self._attr_device_class = BinarySensorDeviceClass.RUNNING
self._attr_icon = "mdi:doctor"
10 changes: 10 additions & 0 deletions custom_components/hon/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,16 @@ def getFloat(self, item):
def has(self, item, default=None):
return self.get(item) != None

def getProgramName(self):
try:
name = self._attributes["commandHistory"]["command"]["programName"].lower()
parts = name.split('.')
if( len(parts) == 3 ):
name = parts[2]
return name
except (KeyError, IndexError):
return None

async def load_context(self):
data = await self._hon.async_get_context(self)
self._attributes = data
Expand Down
2 changes: 1 addition & 1 deletion custom_components/hon/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
"documentation": "https://github.com/gvigroux/hon",
"iot_class": "cloud_polling",
"issue_tracker": "https://github.com/gvigroux/hon/issues",
"version": "0.6.16"
"version": "0.7.0"
}
77 changes: 46 additions & 31 deletions custom_components/hon/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,13 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
if device.has("tempSel"):
appliances.extend([HonBaseTemperature(hass, coordinator, entry, appliance, "tempSel", "Selected temperature")])
if device.has("tempSelZ1"):
appliances.extend([HonBaseTemperature(hass, coordinator, entry, appliance, "tempSelZ1", "Selected temperature Zone 1")])
appliances.extend([HonBaseTemperature(hass, coordinator, entry, appliance, "tempSelZ1", "Selected temperature zone 1")])
if device.has("tempSelZ2"):
appliances.extend([HonBaseTemperature(hass, coordinator, entry, appliance, "tempSelZ2", "Selected temperature Zone 2")])
appliances.extend([HonBaseTemperature(hass, coordinator, entry, appliance, "tempSelZ2", "Selected temperature zone 2")])
if device.has("tempZ1"):
appliances.extend([HonBaseTemperature(hass, coordinator, entry, appliance, "tempZ1", "Temperature Zone 1")])
appliances.extend([HonBaseTemperature(hass, coordinator, entry, appliance, "tempZ1", "Temperature zone 1")])
if device.has("tempZ2"):
appliances.extend([HonBaseTemperature(hass, coordinator, entry, appliance, "tempZ2", "Temperature Zone 2")])
appliances.extend([HonBaseTemperature(hass, coordinator, entry, appliance, "tempZ2", "Temperature zone 2")])

if device.has("remainingTimeMM"):
appliances.extend([HonBaseStart(hass, coordinator, entry, appliance)])
Expand All @@ -84,15 +84,15 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
if device.has("humidity") and device.getInt("humidity") > 0:
appliances.extend([HonBaseHumidity(hass, coordinator, entry, appliance, "", "")])
if device.has("humidityZ1") and device.getInt("humidityZ1") > 0:
appliances.extend([HonBaseHumidity(hass, coordinator, entry, appliance, "Z1", "Zone 1")])
appliances.extend([HonBaseHumidity(hass, coordinator, entry, appliance, "Z1", "zone 1")])
if device.has("humidityZ2") and device.getInt("humidityZ2") > 0:
appliances.extend([HonBaseHumidity(hass, coordinator, entry, appliance, "Z2", "Zone 2")])
appliances.extend([HonBaseHumidity(hass, coordinator, entry, appliance, "Z2", "zone 2")])
if device.has("humidityIndoor") and device.getInt("humidityIndoor") > 0:
appliances.extend([HonBaseHumidity(hass, coordinator, entry, appliance, "Indoor", "Indoor")])
appliances.extend([HonBaseHumidity(hass, coordinator, entry, appliance, "Indoor", "indoor")])
if device.has("humidityOutdoor") and device.getInt("humidityOutdoor") > 0:
appliances.extend([HonBaseHumidity(hass, coordinator, entry, appliance, "Outdoor", "Outdoor")])
appliances.extend([HonBaseHumidity(hass, coordinator, entry, appliance, "Outdoor", "outdoor")])
if device.has("humidityEnv") and device.getInt("humidityEnv") > 0:
appliances.extend([HonBaseHumidity(hass, coordinator, entry, appliance, "Env", "Environment")])
appliances.extend([HonBaseHumidity(hass, coordinator, entry, appliance, "Env", "environment")])

if device.has("pm2p5ValueIndoor") and device.getFloat("pm2p5ValueIndoor") > 0:
appliances.extend([HonBaseIndoorPM2p5(hass, coordinator, entry, appliance)])
Expand Down Expand Up @@ -154,6 +154,10 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
if device.has("sterilizationStatus"):
appliances.extend([HonBaseInt(hass, coordinator, entry, appliance, "sterilizationStatus", "Sterilization status", )])

programName = device.getProgramName()
if( programName != None ):
appliances.extend([HonBaseProgramName(hass, coordinator, entry, appliance)])


await coordinator.async_request_refresh()

Expand All @@ -170,11 +174,7 @@ def __init__(self, hass, coordinator, entry, appliance) -> None:
if( self._type_id == APPLIANCE_TYPE.CLIMATE ):
self.translation_key = "climate_mode"

if( self._type_id == APPLIANCE_TYPE.WASH_DRYER):
self.translation_key = "wash_mode"
self._attr_icon = "mdi:washing-machine"

if( self._type_id == APPLIANCE_TYPE.WASHING_MACHINE):
if( self._type_id in (APPLIANCE_TYPE.WASHING_MACHINE, APPLIANCE_TYPE.WASH_DRYER)):
self.translation_key = "wash_mode"
self._attr_icon = "mdi:washing-machine"

Expand All @@ -193,6 +193,17 @@ def coordinator_update(self):
self._attr_native_value = f"{mode}"


class HonBaseProgramName(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "Program Name", "Program name")

#self._attr_icon = "mdi:chemical-weapon"
self.translation_key = "programs_" + self._type_name.lower()


def coordinator_update(self):
self._attr_native_value = self._device.getProgramName()


class HonBaseTemperature(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance, key, name) -> None:
Expand Down Expand Up @@ -221,7 +232,7 @@ def __init__(self, hass, coordinator, entry, appliance, key, name) -> None:

class HonBaseRemainingTime(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "remainingTimeMM", "Remaining Time")
super().__init__(coordinator, appliance, "remainingTimeMM", "Remaining time")

self._attr_native_unit_of_measurement = UnitOfTime.MINUTES
self._attr_device_class = SensorDeviceClass.DURATION
Expand Down Expand Up @@ -277,7 +288,7 @@ def __init__(self, hass, coordinator, entry, appliance) -> None:

class HonBaseIndoorVOC(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "vocValueIndoor", "Indoor VO")
super().__init__(coordinator, appliance, "vocValueIndoor", "Indoor VOC")

self._attr_icon = "mdi:chemical-weapon"
self.translation_key = "voc" #APPLIANCE_TYPE.PURIFIER
Expand All @@ -289,7 +300,7 @@ def coordinator_update(self):

class HonBaseCOlevel(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "coLevel", "CO Level")
super().__init__(coordinator, appliance, "coLevel", "CO level")

self._attr_device_class = SensorDeviceClass.CO2
self._attr_state_class = SensorStateClass.MEASUREMENT
Expand All @@ -299,7 +310,7 @@ def __init__(self, hass, coordinator, entry, appliance) -> None:

class HonBaseAIRquality(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "airQuality", "Air Quality")
super().__init__(coordinator, appliance, "airQuality", "Air quality")

self._attr_device_class = SensorDeviceClass.AQI
self._attr_state_class = SensorStateClass.MEASUREMENT
Expand Down Expand Up @@ -338,18 +349,18 @@ def coordinator_update(self):

class HonBaseProgram(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "prCode", "Program")
super().__init__(coordinator, appliance, "prCode", "Program code")

if( self._type_id == APPLIANCE_TYPE.TUMBLE_DRYER):
self._attr_icon = "mdi:tumble-dryer"
self.translation_key = "tumbledryer_program"
#if( self._type_id == APPLIANCE_TYPE.TUMBLE_DRYER):
# self._attr_icon = "mdi:tumble-dryer"
# self.translation_key = "tumbledryer_program"

if( self._type_id == APPLIANCE_TYPE.OVEN):
self.translation_key = "oven_program"
#if( self._type_id == APPLIANCE_TYPE.OVEN):
# self.translation_key = "oven_program"

if( self._type_id == APPLIANCE_TYPE.DISH_WASHER):
##some programs share id but parameters (T, W, time) might be differnet. Task develop parameter adjustment
self.translation_key = "dishwasher_program"
#if( self._type_id == APPLIANCE_TYPE.DISH_WASHER):
# ##some programs share id but parameters (T, W, time) might be differnet. Task develop parameter adjustment
# self.translation_key = "dishwasher_program"

def coordinator_update(self):
program = self._device.get("prCode")
Expand All @@ -361,8 +372,12 @@ def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "prPhase", "Program phase")

if( self._type_id == APPLIANCE_TYPE.TUMBLE_DRYER ):
self._attr_icon = "mdi:tumble-dryer"
self.translation_key = "tumbledryer_program_phase"
self._attr_icon = "mdi:tumble-dryer"

if( self._type_id in (APPLIANCE_TYPE.WASHING_MACHINE, APPLIANCE_TYPE.WASH_DRYER)):
self.translation_key = "wash_program_phase"
self._attr_icon = "mdi:washing-machine"

def coordinator_update(self):
programPhase = self._device.get("prPhase")
Expand Down Expand Up @@ -463,7 +478,7 @@ def coordinator_update(self):

class HonBaseMeanWaterConsumption(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "", "Mean Water Consumption")
super().__init__(coordinator, appliance, "", "Mean water consumption")

self._attr_native_unit_of_measurement = UnitOfVolume.LITERS
self._attr_device_class = SensorDeviceClass.WATER
Expand Down Expand Up @@ -493,7 +508,7 @@ def coordinator_update(self):

class HonBaseTotalWashCycle(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "totalWashCycle", "Total Wash Cycle")
super().__init__(coordinator, appliance, "totalWashCycle", "Total wash cycle")

self._attr_state_class = SensorStateClass.TOTAL_INCREASING
self._attr_icon = "mdi:counter"
Expand All @@ -517,7 +532,7 @@ def coordinator_update(self):

class HonBaseWeight(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "actualWeight", "Estimated Weight")
super().__init__(coordinator, appliance, "actualWeight", "Estimated weight")

self._attr_native_unit_of_measurement = UnitOfMass.KILOGRAMS
self._attr_device_class = SensorDeviceClass.WEIGHT
Expand Down
Loading

0 comments on commit 8bc22af

Please sign in to comment.