diff --git a/custom_components/sws12500/const.py b/custom_components/sws12500/const.py index 1819c7f..f5b41e7 100644 --- a/custom_components/sws12500/const.py +++ b/custom_components/sws12500/const.py @@ -23,8 +23,12 @@ WSLINK: Final = "wslink" WINDY_API_KEY = "WINDY_API_KEY" WINDY_ENABLED: Final = "windy_enabled_checkbox" WINDY_LOGGER_ENABLED: Final = "windy_logger_checkbox" -WINDY_NOT_INSERTED: Final = "Data was succefuly sent to Windy, but not inserted by Windy API. Does anyone else sent data to Windy?" -WINDY_INVALID_KEY: Final = "Windy API KEY is invalid. Send data to Windy is now disabled. Check your API KEY and try again." +WINDY_NOT_INSERTED: Final = ( + "Data was succefuly sent to Windy, but not inserted by Windy API. Does anyone else sent data to Windy?" +) +WINDY_INVALID_KEY: Final = ( + "Windy API KEY is invalid. Send data to Windy is now disabled. Check your API KEY and try again." +) WINDY_SUCCESS: Final = ( "Windy successfully sent data and data was successfully inserted by Windy API" ) @@ -63,6 +67,7 @@ OUTSIDE_TEMP: Final = "outside_temp" DEW_POINT: Final = "dew_point" OUTSIDE_HUMIDITY: Final = "outside_humidity" OUTSIDE_CONNECTION: Final = "outside_connection" +OUTSIDE_BATTERY: Final = "outside_battery" WIND_SPEED: Final = "wind_speed" WIND_GUST: Final = "wind_gust" WIND_DIR: Final = "wind_dir" @@ -137,6 +142,7 @@ REMAP_WSLINK_ITEMS: dict = { "t1rainwy": WEEKLY_RAIN, "t1rainmth": MONTHLY_RAIN, "t1rainyr": YEARLY_RAIN, + "t1bat": OUTSIDE_BATTERY, } # TODO: Add more sensors @@ -153,6 +159,7 @@ DISABLED_BY_DEFAULT: Final = [ CH3_HUMIDITY, CH4_TEMP, CH4_HUMIDITY, + OUTSIDE_BATTERY, ] @@ -195,3 +202,18 @@ AZIMUT: list[UnitOfDir] = [ UnitOfDir.NNW, UnitOfDir.N, ] + + +class UnitOfBat(StrEnum): + """Battery level unit of measure.""" + + LOW = "low" + NORMAL = "normal" + UNKNOWN = "unknown" + + +BATTERY_LEVEL: list[UnitOfBat] = [ + UnitOfBat.LOW, + UnitOfBat.NORMAL, + UnitOfBat.UNKNOWN, +] diff --git a/custom_components/sws12500/sensors_wslink.py b/custom_components/sws12500/sensors_wslink.py index dc09aa9..d808564 100644 --- a/custom_components/sws12500/sensors_wslink.py +++ b/custom_components/sws12500/sensors_wslink.py @@ -27,25 +27,26 @@ from .const import ( DAILY_RAIN, DEW_POINT, HEAT_INDEX, + HOURLY_RAIN, INDOOR_HUMIDITY, INDOOR_TEMP, + MONTHLY_RAIN, + OUTSIDE_BATTERY, OUTSIDE_HUMIDITY, OUTSIDE_TEMP, RAIN, SOLAR_RADIATION, UV, + WEEKLY_RAIN, WIND_AZIMUT, WIND_DIR, WIND_GUST, WIND_SPEED, - UnitOfDir, - MONTHLY_RAIN, YEARLY_RAIN, - HOURLY_RAIN, - WEEKLY_RAIN, + UnitOfDir, ) from .sensors_common import WeatherSensorEntityDescription -from .utils import wind_dir_to_text +from .utils import battery_level_to_icon, battery_level_to_text, wind_dir_to_text SENSOR_TYPES_WSLINK: tuple[WeatherSensorEntityDescription, ...] = ( WeatherSensorEntityDescription( @@ -303,4 +304,11 @@ SENSOR_TYPES_WSLINK: tuple[WeatherSensorEntityDescription, ...] = ( translation_key=CHILL_INDEX, value_fn=lambda data: cast("int", data), ), + WeatherSensorEntityDescription( + key=OUTSIDE_BATTERY, + translation_key=OUTSIDE_BATTERY, + icon=lambda data: battery_level_to_icon(battery_level_to_text(int(data))), + device_class=SensorDeviceClass.ENUM, + value_fn=lambda data: battery_level_to_text(int(data)), + ), ) diff --git a/custom_components/sws12500/strings.json b/custom_components/sws12500/strings.json index fda0f39..3472af0 100644 --- a/custom_components/sws12500/strings.json +++ b/custom_components/sws12500/strings.json @@ -131,6 +131,14 @@ "wnw": "WNW", "nw": "NW", "nnw": "NNW" + }, + "outside_battery": { + "name": "Outside battery level", + "state": { + "normal": "OK", + "low": "Low", + "unknown": "Unknown / drained out" + } } } } diff --git a/custom_components/sws12500/translations/cs.json b/custom_components/sws12500/translations/cs.json index e024ec3..8da9943 100644 --- a/custom_components/sws12500/translations/cs.json +++ b/custom_components/sws12500/translations/cs.json @@ -136,6 +136,14 @@ "nw": "SZ", "nnw": "SSZ" } + }, + "outside_battery": { + "name": "Stav nabití venkovní baterie", + "state": { + "low": "Nízká", + "normal": "Normální", + "unknown": "Neznámá / zcela vybitá" + } } } }, diff --git a/custom_components/sws12500/translations/en.json b/custom_components/sws12500/translations/en.json index e0ce1a6..b0f3567 100644 --- a/custom_components/sws12500/translations/en.json +++ b/custom_components/sws12500/translations/en.json @@ -136,6 +136,14 @@ "nw": "NW", "nnw": "NNW" } + }, + "outside_battery": { + "name": "Outside battery level", + "state": { + "normal": "OK", + "low": "Low", + "unknown": "Unknown / drained out" + } } } }, diff --git a/custom_components/sws12500/utils.py b/custom_components/sws12500/utils.py index 30a667b..c78f63f 100644 --- a/custom_components/sws12500/utils.py +++ b/custom_components/sws12500/utils.py @@ -20,6 +20,7 @@ from homeassistant.helpers.translation import async_get_translations from .const import ( AZIMUT, + BATTERY_LEVEL, DATABASE_PATH, DEV_DBG, OUTSIDE_HUMIDITY, @@ -29,6 +30,7 @@ from .const import ( SENSORS_TO_LOAD, WIND_SPEED, UnitOfDir, + UnitOfBat, ) _LOGGER = logging.getLogger(__name__) @@ -181,6 +183,32 @@ def wind_dir_to_text(deg: float) -> UnitOfDir | None: return None +def battery_level_to_text(battery: int) -> UnitOfBat: + """Return battery level in text representation. + + Returns UnitOfBat + """ + + return { + 0: UnitOfBat.LOW, + 1: UnitOfBat.NORMAL, + }.get(battery, UnitOfBat.UNKNOWN) + + +def battery_level_to_icon(battery: UnitOfBat) -> str: + """Return battery level in icon representation. + + Returns str + """ + + icons = { + UnitOfBat.LOW: "mdi:battery-alert", + UnitOfBat.NORMAL: "mdi:battery", + } + + return icons.get(battery, "mdi:battery-unknown") + + def fahrenheit_to_celsius(fahrenheit: float) -> float: """Convert Fahrenheit to Celsius.""" return (fahrenheit - 32) * 5.0 / 9.0 @@ -267,10 +295,12 @@ def long_term_units_in_statistics_meta(): db = conn.cursor() try: - db.execute(""" + db.execute( + """ SELECT statistic_id, unit_of_measurement from statistics_meta WHERE statistic_id LIKE 'sensor.weather_station_sws%' - """) + """ + ) rows = db.fetchall() sensor_units = { statistic_id: f"{statistic_id} ({unit})" for statistic_id, unit in rows @@ -286,8 +316,8 @@ def long_term_units_in_statistics_meta(): async def migrate_data(hass: HomeAssistant, sensor_id: str | None = None) -> bool: """Migrate data from mm/d to mm.""" - - _LOGGER.debug("Sensor %s is required for data migration", sensor_id) + + _LOGGER.debug("Sensor %s is required for data migration", sensor_id) updated_rows = 0 if not Path(DATABASE_PATH).exists():