Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 43 additions & 1 deletion custom_components/hon/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,28 @@ async def async_setup_entry(hass, entry: ConfigEntry, async_add_entities) -> Non
appliances.extend([HonBasePreheating(hass, coordinator, entry, appliance)])
if device.has("healthMode"):
appliances.extend([HonBaseHealthMode(hass, coordinator, entry, appliance)])
if device.has("muteStatus"):
appliances.extend([HonBaseMuteStatus(hass, coordinator, entry, appliance)])

# WM additional binary sensors
if device.has("pause"):
appliances.extend([HonBasePauseStatus(hass, coordinator, entry, appliance)])
if device.has("nightWashStatus"):
appliances.extend([HonBaseGenericStatus(hass, coordinator, entry, appliance, "nightWashStatus", "Night wash", BinarySensorDeviceClass.RUNNING)])
if device.has("steamStatus"):
appliances.extend([HonBaseGenericStatus(hass, coordinator, entry, appliance, "steamStatus", "Steam", BinarySensorDeviceClass.RUNNING)])
if device.has("energySavingStatus"):
appliances.extend([HonBaseGenericStatus(hass, coordinator, entry, appliance, "energySavingStatus", "Energy saving", BinarySensorDeviceClass.RUNNING)])

# DW additional binary sensors
if device.has("extraDry"):
appliances.extend([HonBaseGenericStatus(hass, coordinator, entry, appliance, "extraDry", "Extra dry", BinarySensorDeviceClass.RUNNING)])
if device.has("halfLoad"):
appliances.extend([HonBaseGenericStatus(hass, coordinator, entry, appliance, "halfLoad", "Half load", BinarySensorDeviceClass.RUNNING)])
if device.has("openDoor"):
appliances.extend([HonBaseGenericStatus(hass, coordinator, entry, appliance, "openDoor", "Open door at end", BinarySensorDeviceClass.RUNNING)])
if device.has("ecoExpress"):
appliances.extend([HonBaseGenericStatus(hass, coordinator, entry, appliance, "ecoExpress", "Eco express", BinarySensorDeviceClass.RUNNING)])

async_add_entities(appliances)

Expand Down Expand Up @@ -157,4 +179,24 @@ def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "healthMode", "Health mode")

self._attr_device_class = BinarySensorDeviceClass.RUNNING
self._attr_icon = "mdi:doctor"
self._attr_icon = "mdi:doctor"


class HonBaseMuteStatus(HonBaseBinarySensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "muteStatus", "Mute")

self._attr_icon = "mdi:volume-off"

def coordinator_update(self):
self._attr_is_on = self._device.get("muteStatus") == "1"


class HonBasePauseStatus(HonBaseBinarySensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "pause", "Paused")

self._attr_icon = "mdi:pause-circle"

def coordinator_update(self):
self._attr_is_on = self._device.get("pause") == "1"
2 changes: 1 addition & 1 deletion custom_components/hon/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ def __init__(self,hass, coordinator, entry, appliance) -> None:
self._name = appliance.get('nickName', appliance.get('modelName', 'Climate'))
self._connectivity = appliance['connectivity']
self._model = appliance['modelName']
self._series = appliance['series']
self._series = appliance.get('series', '')
self._modelId = appliance['applianceModelId']
self._type_name = appliance['applianceTypeName']
self._serialNumber = appliance['serialNumber']
Expand Down
4 changes: 3 additions & 1 deletion custom_components/hon/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ class APPLIANCE_TYPE(IntEnum):
TUMBLE_DRYER = 8,
DISH_WASHER = 9,
CLIMATE = 11,
FRIDGE = 14
FRIDGE = 14,
TV = 25

APPLIANCE_DEFAULT_NAME = {
"1": "Washing Machine",
Expand All @@ -64,6 +65,7 @@ class APPLIANCE_TYPE(IntEnum):
"9": "Dish Washer",
"11": "Climate",
"14": "Fridge",
"25": "TV",
}

CLIMATE_FAN_MODE = {
Expand Down
2 changes: 1 addition & 1 deletion custom_components/hon/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def __init__(self, hon, coordinator, appliance) -> None:
self._name = appliance.get("nickName", APPLIANCE_DEFAULT_NAME.get(str(self._type_id), "Device ID: " + str(self._type_id)))
self._mac = appliance["macAddress"]
self._model = appliance["modelName"]
self._series = appliance["series"]
self._series = appliance.get("series", "")
self._model_id = appliance["applianceModelId"]
self._serial_number = appliance["serialNumber"]
self._fw_version = appliance["fwVersion"]
Expand Down
2 changes: 1 addition & 1 deletion custom_components/hon/hon.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ async def load_commands(self, appliance):
"fwVersion": appliance["fwVersion"],
"os": OS,
"appVersion": APP_VERSION,
"series": appliance["series"],
"series": appliance.get("series", ""),
}
url = f"{API_URL}/commands/v1/retrieve"
async with self._session.get(url, params=params, headers=self._headers) as resp:
Expand Down
123 changes: 123 additions & 0 deletions custom_components/hon/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,36 @@ 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", )])

# WM additional sensors
if device.has("currentWashCycle"):
appliances.extend([HonBaseCurrentWashCycle(hass, coordinator, entry, appliance)])
if device.has("remainingRinseIterations"):
appliances.extend([HonBaseInt(hass, coordinator, entry, appliance, "remainingRinseIterations", "Remaining rinse iterations")])
if device.has("detergentPercent"):
appliances.extend([HonBaseDetergentPercent(hass, coordinator, entry, appliance)])
if device.has("haier_DetergentWeight"):
appliances.extend([HonBaseDetergentWeight(hass, coordinator, entry, appliance, "haier_DetergentWeight", "Detergent weight")])
if device.has("haier_SoftenerWeight"):
appliances.extend([HonBaseDetergentWeight(hass, coordinator, entry, appliance, "haier_SoftenerWeight", "Softener weight")])
if device.has("weight") and not device.has("actualWeight"):
appliances.extend([HonBaseWeight(hass, coordinator, entry, appliance)])

# DW additional sensors
if device.has("waterHard"):
appliances.extend([HonBaseWaterHardness(hass, coordinator, entry, appliance)])
if device.has("delayTime"):
appliances.extend([HonBaseDelayTime(hass, coordinator, entry, appliance)])

# TV sensors
if device.has("volume"):
appliances.extend([HonBaseVolume(hass, coordinator, entry, appliance)])
if device.has("displayedApp"):
appliances.extend([HonBaseDisplayedApp(hass, coordinator, entry, appliance)])

# Statistics sensors
if device.get("statistics.programsCounter") is not None:
appliances.extend([HonBaseProgramsCounter(hass, coordinator, entry, appliance)])

await coordinator.async_request_refresh()

async_add_entities(appliances)
Expand Down Expand Up @@ -618,3 +648,96 @@ def coordinator_update(self):
if( self._type_id == APPLIANCE_TYPE.WASHING_MACHINE ):
if self._device.get("machMode") in ("1","6"):
self._attr_native_value = 0


class HonBaseVolume(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "volume", "Volume")

self._attr_state_class = SensorStateClass.MEASUREMENT
self._attr_icon = "mdi:volume-high"
self._attr_native_unit_of_measurement = PERCENTAGE

def coordinator_update(self):
self._attr_native_value = self._device.getInt("volume")


class HonBaseDisplayedApp(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "displayedApp", "Displayed app")

self._attr_icon = "mdi:application"

def coordinator_update(self):
app = self._device.get("displayedApp")
self._attr_native_value = f"{app}"


class HonBaseProgramsCounter(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "statistics.programsCounter", "Total programs")

self._attr_state_class = SensorStateClass.TOTAL_INCREASING
self._attr_icon = "mdi:counter"

def coordinator_update(self):
value = self._device.get("statistics.programsCounter")
if value is not None:
self._attr_native_value = int(value)


class HonBaseCurrentWashCycle(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "currentWashCycle", "Current wash cycle")

self._attr_state_class = SensorStateClass.TOTAL_INCREASING
self._attr_icon = "mdi:counter"

def coordinator_update(self):
self._attr_native_value = self._device.getInt("currentWashCycle")


class HonBaseDetergentPercent(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "detergentPercent", "Detergent level")

self._attr_native_unit_of_measurement = PERCENTAGE
self._attr_state_class = SensorStateClass.MEASUREMENT
self._attr_icon = "mdi:bottle-tonic"

def coordinator_update(self):
self._attr_native_value = self._device.getInt("detergentPercent")


class HonBaseDetergentWeight(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance, key, name) -> None:
super().__init__(coordinator, appliance, key, name)

self._attr_native_unit_of_measurement = UnitOfMass.GRAMS
self._attr_state_class = SensorStateClass.MEASUREMENT
self._attr_icon = "mdi:bottle-tonic"

def coordinator_update(self):
self._attr_native_value = self._device.getFloat(self._key)


class HonBaseWaterHardness(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "waterHard", "Water hardness")

self._attr_icon = "mdi:water-opacity"

def coordinator_update(self):
self._attr_native_value = self._device.getInt("waterHard")


class HonBaseDelayTime(HonBaseSensorEntity):
def __init__(self, hass, coordinator, entry, appliance) -> None:
super().__init__(coordinator, appliance, "delayTime", "Delay time")

self._attr_native_unit_of_measurement = UnitOfTime.MINUTES
self._attr_device_class = SensorDeviceClass.DURATION
self._attr_icon = "mdi:timer-sand"

def coordinator_update(self):
self._attr_native_value = self._device.getInt("delayTime")