88 lines
2.3 KiB
Python
88 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
|