Skip to content

Commit

Permalink
ZONT: add filter class and unit sensors
Browse files Browse the repository at this point in the history
  • Loading branch information
Михаил Шутов committed May 14, 2024
1 parent 5af61d2 commit 7e820ce
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 24 deletions.
37 changes: 31 additions & 6 deletions custom_components/zont_ha/const.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from homeassistant.const import (
UnitOfTemperature, UnitOfElectricPotential, PERCENTAGE, UnitOfPressure,
SIGNAL_STRENGTH_DECIBELS_MILLIWATT
SIGNAL_STRENGTH_DECIBELS_MILLIWATT, UnitOfVolumeFlowRate, UnitOfSpeed,
UnitOfVolume, UnitOfFrequency, UnitOfPower, UnitOfApparentPower,
POWER_VOLT_AMPERE_REACTIVE, CONCENTRATION_PARTS_PER_MILLION, UnitOfEnergy
)

DOMAIN = 'zont_ha'
Expand All @@ -22,7 +24,7 @@

URL_GET_TOKEN = ZONT_API_URL_ROOT + 'authtoken/get'

VALID_UNITS = {
UNIT_BY_TYPE = {
'temperature': UnitOfTemperature.CELSIUS,
'humidity': PERCENTAGE,
'voltage': UnitOfElectricPotential.VOLT,
Expand All @@ -33,19 +35,42 @@
'smoke': UnitOfElectricPotential.VOLT,
'opening': UnitOfElectricPotential.VOLT,
'room_thermostat': UnitOfElectricPotential.VOLT,
'boiler_failure': UnitOfElectricPotential.VOLT,
'power_source': UnitOfElectricPotential.VOLT,
'power_source': UnitOfEnergy.KILO_WATT_HOUR,
'discrete': UnitOfElectricPotential.VOLT,
'dhw_speed': 'л/мин',
'err': None,
'signal_strength': SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
'battery': PERCENTAGE
}

VALID_UNITS = {
'л/мин': UnitOfVolumeFlowRate.LITERS_PER_MINUTE,
'л': UnitOfVolume.LITERS,
'м³/ч': UnitOfVolumeFlowRate.CUBIC_METERS_PER_HOUR,
'txt': None,
'дБм': SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
'бар': UnitOfPressure.BAR,
'°': UnitOfTemperature.CELSIUS,
'%': PERCENTAGE,
'В': UnitOfElectricPotential.VOLT,
'км/ч': UnitOfSpeed.KILOMETERS_PER_HOUR,
'Гц': UnitOfFrequency.HERTZ,
'Вт': UnitOfPower.WATT,
'ВА': UnitOfApparentPower.VOLT_AMPERE,
'ВАР': POWER_VOLT_AMPERE_REACTIVE,
'кВт•ч': UnitOfEnergy.KILO_WATT_HOUR,
'ppm': CONCENTRATION_PARTS_PER_MILLION,
'battery': PERCENTAGE
}

ZONT_SENSOR_TYPE = {
'dhw_speed': 'volume_flow_rate'
}

SENSOR_TYPE_ICON = {
'boiler_failure': 'mdi:wrench-outline',
'dhw_speed': 'mdi:waves-arrow-right',
'modulation': 'mdi:fire'
}

VALID_TYPE_SENSOR = {
'pressure': 'бар',
'temperature': '°',
Expand Down
25 changes: 18 additions & 7 deletions custom_components/zont_ha/core/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@
from aiohttp import ClientResponse

from .exceptions import ResponseZontError
from ..const import HEATING_MODES, VALID_UNITS, VALID_TYPE_SENSOR
from .models_zont import SensorZONT
from ..const import (
HEATING_MODES, VALID_TYPE_SENSOR, ZONT_SENSOR_TYPE, UNIT_BY_TYPE,
VALID_UNITS
)

_LOGGER = logging.getLogger(__name__)

Expand Down Expand Up @@ -67,11 +70,19 @@ def get_icon(name_mode: str) -> str:
return 'mdi:refresh-circle'


def get_unit_sensor(type_sensor, unit_sensor) -> str:
try:
return VALID_UNITS[unit_sensor]
except KeyError:
return VALID_UNITS[type_sensor]
def get_unit_sensor(sensor: SensorZONT) -> str:
"""Фильтр для получения правильной единицы измерения сенсора"""
type_sensor = sensor.type
unit_by_type = UNIT_BY_TYPE.get(sensor.type)
unit = VALID_UNITS.get(sensor.unit)
if type_sensor == 'voltage':
return unit
elif isinstance(
unit, type(unit_by_type)
):
return unit
else:
return UNIT_BY_TYPE.get(type_sensor, unit)


def get_devise_class_by_name(name: str) -> str | None:
Expand All @@ -91,4 +102,4 @@ def get_devise_class_sensor(sensor: SensorZONT) -> str:
if sensor.unit in unit:
return device_class
else:
return sensor.type
return ZONT_SENSOR_TYPE.get(sensor.type, sensor.type)
11 changes: 7 additions & 4 deletions custom_components/zont_ha/core/zont.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,14 +108,16 @@ def _create_radio_sensors(self, device: DeviceZONT):
name=f'{sensor.name}_rssi',
type='signal_strength',
status='ok',
value=sensor.rssi
value=sensor.rssi,
unit='дБм'
))
device.sensors.append(SensorZONT(
id=f'{sensor.id}_battery',
name=f'{sensor.name}_battery',
type='battery',
status='ok',
value=self._convert_value_battery(sensor.battery)
value=self._convert_value_battery(sensor.battery),
unit='%'
))

@staticmethod
Expand All @@ -141,9 +143,10 @@ def _create_error_boiler_sensors(device: DeviceZONT):
device.sensors.append(SensorZONT(
id=f'{boiler.id}_boiler',
name=f'{boiler.name}_ошибка',
type='err',
type='boiler_failure',
status='ok',
value=code_err + text
value=code_err + text,
unit='txt'
))

def get_device(self, device_id: int) -> DeviceZONT | None:
Expand Down
2 changes: 1 addition & 1 deletion custom_components/zont_ha/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
"integration_type": "hub",
"dependencies": ["http", "zeroconf"],
"requirements": [],
"version": "0.5.2-beta"
"version": "0.5.2"
}
11 changes: 5 additions & 6 deletions custom_components/zont_ha/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
CoordinatorEntity,
)
from . import ZontCoordinator
from .const import DOMAIN, BINARY_SENSOR_TYPES
from .const import DOMAIN, BINARY_SENSOR_TYPES, VALID_UNITS, SENSOR_TYPE_ICON
from .core.exceptions import SensorNotFoundError
from .core.models_zont import SensorZONT, DeviceZONT, OTSensorZONT
from .core.utils import get_unit_sensor, get_devise_class_sensor
from .core.utils import get_devise_class_sensor, get_unit_sensor

_LOGGER = logging.getLogger(__name__)

Expand Down Expand Up @@ -51,8 +51,7 @@ def __init__(
self._sensor = sensor
self._unique_id = unique_id
self._attr_device_info = coordinator.devices_info(device.id)
if sensor.type == 'err':
self._attr_icon = 'mdi:wrench-outline'
self._attr_icon = SENSOR_TYPE_ICON.get(sensor.type)

@property
def name(self) -> str:
Expand All @@ -61,14 +60,14 @@ def name(self) -> str:
@property
def native_value(self) -> float | str:
"""Возвращает состояние сенсора"""
if self._sensor.type == 'battery':
if self._sensor.type == 'battery' and isinstance(self._sensor.value, float):
return int(self._sensor.value)
return self._sensor.value

@property
def native_unit_of_measurement(self) -> str | None:
"""Возвращает единицу измерения сенсора из API zont"""
return get_unit_sensor(self._sensor.type, self._sensor.unit)
return get_unit_sensor(self._sensor)

@property
def unique_id(self) -> str:
Expand Down

0 comments on commit 7e820ce

Please sign in to comment.