1
mirror of https://github.com/home-assistant/core synced 2024-10-04 07:58:43 +02:00
ha-core/homeassistant/components/wilight/support.py

89 lines
2.3 KiB
Python

"""Support for config validation using voluptuous and Translate Trigger."""
from __future__ import annotations
import calendar
import locale
import re
from typing import Any
import voluptuous as vol
def wilight_trigger(value: Any) -> str | None:
"""Check rules for WiLight Trigger."""
step = 1
err_desc = "Value is None"
result_128 = False
result_24 = False
result_60 = False
result_2 = False
if value is not None:
step = 2
err_desc = "Expected a string"
if (step == 2) & isinstance(value, str):
step = 3
err_desc = "String should only contain 8 decimals character"
if re.search(r"^([0-9]{8})$", value) is not None:
step = 4
err_desc = "First 3 character should be less than 128"
result_128 = int(value[0:3]) < 128
result_24 = int(value[3:5]) < 24
result_60 = int(value[5:7]) < 60
result_2 = int(value[7:8]) < 2
if (step == 4) & result_128:
step = 5
err_desc = "Hour part should be less than 24"
if (step == 5) & result_24:
step = 6
err_desc = "Minute part should be less than 60"
if (step == 6) & result_60:
step = 7
err_desc = "Active part should be less than 2"
if (step == 7) & result_2:
return value
raise vol.Invalid(err_desc)
def wilight_to_hass_trigger(value: str | None) -> str | None:
"""Convert wilight trigger to hass description.
Ex: "12719001" -> "sun mon tue wed thu fri sat 19:00 On"
"00000000" -> "00:00 Off"
"""
if value is None:
return value
locale.setlocale(locale.LC_ALL, "")
week_days = list(calendar.day_abbr)
days = bin(int(value[0:3]))[2:].zfill(8)
desc = ""
if int(days[7:8]) == 1:
desc += f"{week_days[6]} "
if int(days[6:7]) == 1:
desc += f"{week_days[0]} "
if int(days[5:6]) == 1:
desc += f"{week_days[1]} "
if int(days[4:5]) == 1:
desc += f"{week_days[2]} "
if int(days[3:4]) == 1:
desc += f"{week_days[3]} "
if int(days[2:3]) == 1:
desc += f"{week_days[4]} "
if int(days[1:2]) == 1:
desc += f"{week_days[5]} "
desc += f"{value[3:5]}:{value[5:7]} "
if int(value[7:8]) == 1:
desc += "On"
else:
desc += "Off"
return desc