Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for Sinope TH1134ZB-HC thermostat #3821

Open
wants to merge 12 commits into
base: dev
Choose a base branch
from
3 changes: 3 additions & 0 deletions zhaquirks/sinope/switch.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,9 @@ class AttributeDefs(foundation.BaseAttributeDefs):
max_measured_temp: Final = foundation.ZCLAttributeDef(
id=0x007D, type=t.int16s, access="rp", is_manufacturer_specific=True
)
water_temp_protection_type: Final = foundation.ZCLAttributeDef(
id=0x007E, type=t.enum8, access="rwp", is_manufacturer_specific=True
)
current_summation_delivered: Final = foundation.ZCLAttributeDef(
id=0x0090, type=t.uint32_t, access="rp", is_manufacturer_specific=True
)
Expand Down
157 changes: 154 additions & 3 deletions zhaquirks/sinope/thermostat.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ class Display(t.enum8):
Auto = 0x00
Setpoint = 0x01
Outside_temperature = 0x02
Room_temperature = 0x04


class FloorMode(t.enum8):
Expand All @@ -64,7 +65,9 @@ class AuxMode(t.enum8):
"""Aux_output_mode values."""

Off = 0x00
On = 0x01
On_15m = 0x01
On_15s = 0x02
Exp_module = 0x03


class PumpStatus(t.uint8_t):
Expand Down Expand Up @@ -97,6 +100,44 @@ class TimeFormat(t.enum8):
Format_12h = 0x01


class WeatherIcon(t.enum8):
"""weather_icons values."""

Cloud = 0x05
Cloud2 = 0x08
Cloud3 = 0x09
Cloudfog = 0x11
Cloudlightning = 0x0B
Cloudlightning2 = 0x0C
Cloudmoon = 0x13
Cloudmoon2 = 0x14
Cloudmoon3 = 0x15
Cloudrain = 0x0A
Cloudrain2 = 0x1C
Cloudrain3 = 0x1D
Cloudrainmoon = 0x17
Cloudrainmoon2 = 0x18
Cloudrainmoon3 = 0x19
Cloudrainmoon4 = 0x1F
Cloudrainmoon5 = 0x21
Cloudrainsun = 0x06
Cloudrainsun2 = 0x07
Cloudrainsun3 = 0x1E
Cloudrainsun4 = 0x20
Cloudsnow = 0x0D
Cloudsnow2 = 0x0E
Cloudsnow3 = 0x0F
Cloudsnow4 = 0x10
Cloudsnow5 = 0x16
Cloudsnow6 = 0x1A
Cloudsun = 0x03
Cloudsun2 = 0x04
Hide = 0x00
Moonstar = 0x12
Sun = 0x01
Sun2 = 0x02


class GfciStatus(t.enum8):
"""Gfci_status values."""

Expand Down Expand Up @@ -159,6 +200,13 @@ class CycleOutput(t.uint16_t):
Off = 0xFFFF


class Language(t.enum8):
"""Display_language values."""

En = 0x00
Fr = 0x01


class SinopeTechnologiesManufacturerCluster(CustomCluster):
"""SinopeTechnologiesManufacturerCluster manufacturer cluster."""

Expand All @@ -167,9 +215,11 @@ class SinopeTechnologiesManufacturerCluster(CustomCluster):
FloorMode: Final = FloorMode
AuxMode: Final = AuxMode
PumpStatus: Final = PumpStatus
Language: Final = Language
LimitStatus: Final = LimitStatus
SensorType: Final = SensorType
TimeFormat: Final = TimeFormat
WeatherIcon: Final = WeatherIcon
GfciStatus: Final = GfciStatus
SystemMode: Final = SystemMode
PumpDuration: Final = PumpDuration
Expand All @@ -194,6 +244,9 @@ class AttributeDefs(foundation.BaseAttributeDefs):
access="rp",
is_manufacturer_specific=True,
)
display_language: Final = foundation.ZCLAttributeDef(
id=0x0005, type=Language, access="rwp", is_manufacturer_specific=True
)
outdoor_temp: Final = foundation.ZCLAttributeDef(
id=0x0010, type=t.int16s, access="rwp", is_manufacturer_specific=True
)
Expand All @@ -203,6 +256,9 @@ class AttributeDefs(foundation.BaseAttributeDefs):
config_2nd_display: Final = foundation.ZCLAttributeDef(
id=0x0012, type=Display, access="rwp", is_manufacturer_specific=True
)
weather_icons: Final = foundation.ZCLAttributeDef(
id=0x0013, type=WeatherIcon, access="rwp", is_manufacturer_specific=True
)
secs_since_2k: Final = foundation.ZCLAttributeDef(
id=0x0020, type=t.uint32_t, access="rwp", is_manufacturer_specific=True
)
Expand All @@ -218,8 +274,8 @@ class AttributeDefs(foundation.BaseAttributeDefs):
eco_safety_temperature_delta: Final = foundation.ZCLAttributeDef(
id=0x0073, type=t.uint8_t, access="rwp", is_manufacturer_specific=True
)
unknown_attr_1: Final = foundation.ZCLAttributeDef(
id=0x0101, type=Array, access="r", is_manufacturer_specific=True
unknown_attr_5: Final = foundation.ZCLAttributeDef(
id=0x0101, type=Array, access="rp", is_manufacturer_specific=True
)
setpoint: Final = foundation.ZCLAttributeDef(
id=0x0104, type=t.int16s, access="rw", is_manufacturer_specific=True
Expand Down Expand Up @@ -278,6 +334,21 @@ class AttributeDefs(foundation.BaseAttributeDefs):
report_local_temperature: Final = foundation.ZCLAttributeDef(
id=0x012D, type=t.int16s, access="rp", is_manufacturer_specific=True
)
balance_point: Final = foundation.ZCLAttributeDef(
id=0x0134, type=t.int16s, access="rwp", is_manufacturer_specific=True
)
timer_off: Final = foundation.ZCLAttributeDef(
id=0x0136, type=t.uint16_t, access="rwp", is_manufacturer_specific=True
)
abs_min_heat_setpoint_limit: Final = foundation.ZCLAttributeDef(
id=0x0137, type=t.int16s, access="rwp", is_manufacturer_specific=True
)
heat_lockout_temperature: Final = foundation.ZCLAttributeDef(
id=0x0139, type=t.int16s, access="rwp", is_manufacturer_specific=True
)
cool_lockout_temperature: Final = foundation.ZCLAttributeDef(
id=0x013A, type=t.int16s, access="rwp", is_manufacturer_specific=True
)
unknown_attr_11: Final = foundation.ZCLAttributeDef(
id=0x013B, type=t.bitmap8, access="rp", is_manufacturer_specific=True
)
Expand All @@ -287,9 +358,27 @@ class AttributeDefs(foundation.BaseAttributeDefs):
unknown_attr_12: Final = foundation.ZCLAttributeDef(
id=0x0202, type=t.enum8, access="r", is_manufacturer_specific=True
)
hc_model_mac_addr: Final = foundation.ZCLAttributeDef(
id=0x0267, type=t.EUI64, access="rwp", is_manufacturer_specific=True
)
min_heat_setpoint_limit: Final = foundation.ZCLAttributeDef(
id=0x026B, type=t.int16s, access="rwp", is_manufacturer_specific=True
)
max_heat_setpoint_limit: Final = foundation.ZCLAttributeDef(
id=0x026C, type=t.int16s, access="rwp", is_manufacturer_specific=True
)
min_cool_setpoint_limit: Final = foundation.ZCLAttributeDef(
id=0x026D, type=t.int16s, access="rwp", is_manufacturer_specific=True
)
max_cool_setpoint_limit: Final = foundation.ZCLAttributeDef(
id=0x026E, type=t.int16s, access="rwp", is_manufacturer_specific=True
)
cycle_length: Final = foundation.ZCLAttributeDef(
id=0x0281, type=CycleLength, access="rwp", is_manufacturer_specific=True
)
cool_cycle_length: Final = foundation.ZCLAttributeDef(
id=0x0282, type=CycleLength, access="rwp", is_manufacturer_specific=True
)
cluster_revision: Final = foundation.ZCL_CLUSTER_REVISION_ATTR


Expand Down Expand Up @@ -736,3 +825,65 @@ class SinopeHPThermostats(CustomDevice):
},
}
}


class SinopeHCThermostats(CustomDevice):
"""TH1134ZB-HC thermostats."""

signature = {
# <SimpleDescriptor endpoint=1 profile=260 device_type=769 device_version=1
# input_clusters=[0, 3, 4, 5, 513, 514, 516, 1026, 1794, 2820, 2821, 65281]
# output_clusters=[3, 10, 25]>
MODELS_INFO: [(SINOPE, "TH1134ZB-HC")],
ENDPOINTS: {
1: {
PROFILE_ID: zha_p.PROFILE_ID,
DEVICE_TYPE: zha_p.DeviceType.THERMOSTAT,
INPUT_CLUSTERS: [
Basic.cluster_id,
Identify.cluster_id,
Groups.cluster_id,
Scenes.cluster_id,
Thermostat.cluster_id,
Fan.cluster_id,
UserInterface.cluster_id,
TemperatureMeasurement.cluster_id,
Metering.cluster_id,
ElectricalMeasurement.cluster_id,
Diagnostic.cluster_id,
SINOPE_MANUFACTURER_CLUSTER_ID,
],
OUTPUT_CLUSTERS: [
Identify.cluster_id,
Time.cluster_id,
Ota.cluster_id,
],
}
},
}

replacement = {
ENDPOINTS: {
1: {
INPUT_CLUSTERS: [
Basic.cluster_id,
Identify.cluster_id,
Groups.cluster_id,
Scenes.cluster_id,
Fan.cluster_id,
UserInterface.cluster_id,
TemperatureMeasurement.cluster_id,
Metering.cluster_id,
Diagnostic.cluster_id,
SinopeTechnologiesElectricalMeasurementCluster,
SinopeTechnologiesThermostatCluster,
SinopeTechnologiesManufacturerCluster,
],
OUTPUT_CLUSTERS: [
Identify.cluster_id,
Time.cluster_id,
Ota.cluster_id,
],
}
}
}
Loading