Merge pull request #24 from schizza/chill_index

Wind chill index
pull/27/head v1.3.3
Lukas Svoboda 2024-05-09 14:18:48 +02:00 committed by GitHub
commit 615b384487
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 42 additions and 3 deletions

View File

@ -70,6 +70,7 @@ UV: Final = "uv"
CH2_TEMP: Final = "ch2_temp" CH2_TEMP: Final = "ch2_temp"
CH2_HUMIDITY: Final = "ch2_humidity" CH2_HUMIDITY: Final = "ch2_humidity"
HEAT_INDEX: Final = "heat_index" HEAT_INDEX: Final = "heat_index"
CHILL_INDEX: Final = "chill_index"
REMAP_ITEMS: dict = { REMAP_ITEMS: dict = {

View File

@ -1,4 +1,5 @@
"""Sensors definition for SWS12500.""" """Sensors definition for SWS12500."""
from collections.abc import Callable from collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
import logging import logging
@ -34,6 +35,7 @@ from .const import (
BARO_PRESSURE, BARO_PRESSURE,
CH2_HUMIDITY, CH2_HUMIDITY,
CH2_TEMP, CH2_TEMP,
CHILL_INDEX,
DAILY_RAIN, DAILY_RAIN,
DEW_POINT, DEW_POINT,
DOMAIN, DOMAIN,
@ -52,7 +54,7 @@ from .const import (
WIND_SPEED, WIND_SPEED,
UnitOfDir, UnitOfDir,
) )
from .utils import wind_dir_to_text, heat_index from .utils import heat_index, wind_dir_to_text, chill_index
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -226,6 +228,17 @@ SENSOR_TYPES: tuple[WeatherSensorEntityDescription, ...] = (
translation_key=HEAT_INDEX, translation_key=HEAT_INDEX,
value_fn=lambda data: cast(int, data), value_fn=lambda data: cast(int, data),
), ),
WeatherSensorEntityDescription(
key=CHILL_INDEX,
native_unit_of_measurement=UnitOfTemperature.FAHRENHEIT,
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.TEMPERATURE,
suggested_unit_of_measurement=UnitOfTemperature.CELSIUS,
suggested_display_precision=2,
icon="mdi:weather-sunny",
translation_key=CHILL_INDEX,
value_fn=lambda data: cast(int, data),
),
) )
@ -245,8 +258,11 @@ async def async_setup_entry(
if sensors_to_load := config_entry.options.get(SENSORS_TO_LOAD): if sensors_to_load := config_entry.options.get(SENSORS_TO_LOAD):
if WIND_DIR in sensors_to_load: if WIND_DIR in sensors_to_load:
sensors_to_load.append(WIND_AZIMUT) sensors_to_load.append(WIND_AZIMUT)
if (WIND_SPEED in sensors_to_load) and (OUTSIDE_TEMP in sensors_to_load): if (OUTSIDE_HUMIDITY in sensors_to_load) and (OUTSIDE_TEMP in sensors_to_load):
sensors_to_load.append(HEAT_INDEX) sensors_to_load.append(HEAT_INDEX)
if (WIND_SPEED in sensors_to_load) and (OUTSIDE_TEMP in sensors_to_load):
sensors_to_load.append(CHILL_INDEX)
sensors = [ sensors = [
WeatherSensor(hass, description, coordinator) WeatherSensor(hass, description, coordinator)
for description in SENSOR_TYPES for description in SENSOR_TYPES
@ -309,6 +325,9 @@ class WeatherSensor(
if self.coordinator.data and (HEAT_INDEX in self.entity_description.key): if self.coordinator.data and (HEAT_INDEX in self.entity_description.key):
return self.entity_description.value_fn(heat_index(self.coordinator.data)) return self.entity_description.value_fn(heat_index(self.coordinator.data))
if self.coordinator.data and (CHILL_INDEX in self.entity_description.key):
return self.entity_description.value_fn(chill_index(self.coordinator.data))
return self.entity_description.value_fn(self._data) return self.entity_description.value_fn(self._data)
@property @property

View File

@ -77,6 +77,7 @@
"ch2_temp": { "name": "Teplota senzoru 2" }, "ch2_temp": { "name": "Teplota senzoru 2" },
"ch2_humidity": { "name": "Vlhkost sensoru 2" }, "ch2_humidity": { "name": "Vlhkost sensoru 2" },
"heat_index": { "name": "Tepelný index" }, "heat_index": { "name": "Tepelný index" },
"chill_index": { "name": "Pocitová teplota" },
"wind_azimut": { "wind_azimut": {
"name": "Azimut", "name": "Azimut",
"state": { "state": {

View File

@ -78,6 +78,7 @@
"ch2_temp": { "name": "Channel 2 temperature" }, "ch2_temp": { "name": "Channel 2 temperature" },
"ch2_humidity": { "name": "Channel 2 humidity" }, "ch2_humidity": { "name": "Channel 2 humidity" },
"heat_index": { "name": "Apparent temperature" }, "heat_index": { "name": "Apparent temperature" },
"chill_index": { "name": "Wind chill" },
"wind_azimut": { "wind_azimut": {
"name": "Bearing", "name": "Bearing",
"state": { "state": {

View File

@ -19,6 +19,7 @@ from .const import (
UnitOfDir, UnitOfDir,
OUTSIDE_TEMP, OUTSIDE_TEMP,
OUTSIDE_HUMIDITY, OUTSIDE_HUMIDITY,
WIND_SPEED,
) )
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -190,6 +191,22 @@ def heat_index(data: Any) -> UnitOfTemperature:
if rh > 80 and (temp in np.arange(80, 87, 0.1)): if rh > 80 and (temp in np.arange(80, 87, 0.1)):
adjustment = ((rh - 85) / 10) * ((87 - temp) / 5) adjustment = ((rh - 85) / 10) * ((87 - temp) / 5)
return full_index + adjustment if adjustment else full_index return round((full_index + adjustment if adjustment else full_index), 2)
return simple return simple
def chill_index(data: Any) -> UnitOfTemperature:
"""Calculate wind chill index."""
temp = float(data[OUTSIDE_TEMP])
wind = float(data[WIND_SPEED])
return round(
(
(35.7 + (0.6215 * temp))
- (35.75 * (wind**0.16))
+ (0.4275 * (temp * (wind**0.16)))
),
2,
)