hOn/scripts/sensor_docs.py

86 lines
3.0 KiB
Python
Raw Normal View History

2023-04-22 23:36:31 +02:00
#!/usr/bin/env python
2023-04-17 23:18:27 +02:00
import re
2023-04-22 23:36:31 +02:00
import sys
2023-04-17 23:18:27 +02:00
from pathlib import Path
2023-05-10 18:13:05 +02:00
2023-04-22 23:36:31 +02:00
if __name__ == "__main__":
sys.path.insert(0, str(Path(__file__).parent.parent))
from custom_components.hon.const import APPLIANCES
2023-04-16 23:35:43 +02:00
from custom_components.hon.binary_sensor import BINARY_SENSORS
from custom_components.hon.button import BUTTONS
2023-05-10 18:13:05 +02:00
from custom_components.hon.climate import CLIMATES
2023-07-01 14:24:04 +02:00
from custom_components.hon.fan import FANS
from custom_components.hon.light import LIGHTS
from custom_components.hon.lock import LOCKS
2023-04-16 23:35:43 +02:00
from custom_components.hon.number import NUMBERS
from custom_components.hon.select import SELECTS
from custom_components.hon.sensor import SENSORS
2023-05-28 07:50:59 +02:00
from custom_components.hon.switch import (
SWITCHES,
HonControlSwitchEntityDescription,
HonSwitchEntityDescription,
)
2023-04-16 23:35:43 +02:00
ENTITY_CATEGORY_SORT = ["control", "config", "sensor"]
entities = {
"binary_sensor": BINARY_SENSORS,
"button": BUTTONS,
"climate": CLIMATES,
2023-07-01 14:24:04 +02:00
"fan": FANS,
"light": LIGHTS,
"lock": LOCKS,
2023-04-16 23:35:43 +02:00
"number": NUMBERS,
"select": SELECTS,
"sensor": SENSORS,
"switch": SWITCHES,
2023-04-16 23:35:43 +02:00
}
result = {}
for entity_type, appliances in entities.items():
for appliance, data in appliances.items():
for entity in data:
2023-05-28 07:50:59 +02:00
if isinstance(entity, HonControlSwitchEntityDescription):
2023-04-17 23:18:27 +02:00
key = f"{entity.turn_on_key}` / `{entity.turn_off_key}"
else:
key = entity.key
2023-04-24 21:38:05 +02:00
attributes = (key, entity.name, entity.icon, entity_type)
2023-05-10 18:13:05 +02:00
category = (
"control"
2023-05-17 00:01:33 +02:00
if entity.key.startswith("settings")
2023-05-28 07:50:59 +02:00
or isinstance(entity, HonSwitchEntityDescription)
or isinstance(entity, HonControlSwitchEntityDescription)
2023-07-01 17:09:53 +02:00
or entity_type in ["button", "climate", "lock", "light", "fan"]
2023-05-10 18:13:05 +02:00
else "sensor"
)
2023-04-16 23:35:43 +02:00
result.setdefault(appliance, {}).setdefault(
entity.entity_category or category, []
).append(attributes)
2023-04-17 23:18:27 +02:00
text = ""
2023-04-16 23:35:43 +02:00
for appliance, categories in sorted(result.items()):
2023-04-17 23:18:27 +02:00
text += f"\n### {APPLIANCES[appliance]}\n"
2023-04-16 23:35:43 +02:00
categories = {k: categories[k] for k in ENTITY_CATEGORY_SORT if k in categories}
for category, data in categories.items():
2023-04-17 23:18:27 +02:00
text += f"#### {str(category).capitalize()}s\n"
2023-04-24 21:38:05 +02:00
text += "| Name | Icon | Entity | Key |\n"
text += "| --- | --- | --- | --- |\n"
for key, name, icon, entity_type in sorted(data, key=lambda d: d[1]):
2023-04-23 02:01:14 +02:00
icon = f"`{icon.replace('mdi:', '')}`" if icon else ""
2023-04-24 21:38:05 +02:00
text += f"| {name} | {icon} | `{entity_type}` | `{key}` |\n"
2023-04-17 23:18:27 +02:00
with open(Path(__file__).parent.parent / "README.md", "r") as file:
readme = file.read()
readme = re.sub(
"(## Appliance Features\n)(?:.|\\s)+?([^#]## |\\Z)",
f"\\1{text}\\2",
readme,
re.DOTALL,
)
2023-10-02 03:33:45 +02:00
entities = sum(len(x) for cat in result.values() for x in cat.values())
readme = re.sub("badge/Entities-\\d+", f"badge/Entities-{entities}", readme)
2023-04-17 23:18:27 +02:00
with open(Path(__file__).parent.parent / "README.md", "w") as file:
file.write(readme)