391 lines
13 KiB
Python
391 lines
13 KiB
Python
"""
|
|
Dashboard templates and examples for AI agent to use when creating dashboards.
|
|
"""
|
|
|
|
# Basic dashboard templates for different use cases
|
|
DASHBOARD_TEMPLATES = {
|
|
"simple_lights": {
|
|
"title": "Lights Dashboard",
|
|
"url_path": "lights",
|
|
"icon": "mdi:lightbulb",
|
|
"show_in_sidebar": True,
|
|
"views": [
|
|
{
|
|
"title": "All Lights",
|
|
"cards": [
|
|
{
|
|
"type": "entities",
|
|
"title": "Living Room Lights",
|
|
"entities": [], # To be filled with actual light entities
|
|
},
|
|
{
|
|
"type": "light",
|
|
"entity": "", # To be filled with main light entity
|
|
},
|
|
],
|
|
}
|
|
],
|
|
},
|
|
"security": {
|
|
"title": "Security Dashboard",
|
|
"url_path": "security",
|
|
"icon": "mdi:security",
|
|
"show_in_sidebar": True,
|
|
"views": [
|
|
{
|
|
"title": "Security Overview",
|
|
"cards": [
|
|
{
|
|
"type": "entities",
|
|
"title": "Sensors",
|
|
"entities": [], # To be filled with sensor entities
|
|
},
|
|
{
|
|
"type": "entities",
|
|
"title": "Cameras",
|
|
"entities": [], # To be filled with camera entities
|
|
},
|
|
{
|
|
"type": "alarm-panel",
|
|
"entity": "", # To be filled with alarm panel entity
|
|
},
|
|
],
|
|
}
|
|
],
|
|
},
|
|
"climate": {
|
|
"title": "Climate Control",
|
|
"url_path": "climate",
|
|
"icon": "mdi:thermometer",
|
|
"show_in_sidebar": True,
|
|
"views": [
|
|
{
|
|
"title": "Temperature & Humidity",
|
|
"cards": [
|
|
{
|
|
"type": "thermostat",
|
|
"entity": "", # To be filled with climate.* thermostat entity (optional)
|
|
},
|
|
{
|
|
"type": "history-graph",
|
|
"title": "Temperature History",
|
|
"entities": [], # To be filled with temperature sensor entities
|
|
"hours_to_show": 24,
|
|
},
|
|
{
|
|
"type": "entities",
|
|
"title": "Temperature Sensors",
|
|
"entities": [], # To be filled with temperature sensor entities (device_class: temperature)
|
|
},
|
|
{
|
|
"type": "history-graph",
|
|
"title": "Humidity History",
|
|
"entities": [], # To be filled with humidity sensor entities
|
|
"hours_to_show": 24,
|
|
},
|
|
{
|
|
"type": "entities",
|
|
"title": "Humidity Sensors",
|
|
"entities": [], # To be filled with humidity sensor entities (device_class: humidity)
|
|
},
|
|
{
|
|
"type": "weather-forecast",
|
|
"entity": "", # To be filled with weather entity (optional)
|
|
},
|
|
],
|
|
}
|
|
],
|
|
},
|
|
"media": {
|
|
"title": "Media Center",
|
|
"url_path": "media",
|
|
"icon": "mdi:play",
|
|
"show_in_sidebar": True,
|
|
"views": [
|
|
{
|
|
"title": "Media Players",
|
|
"cards": [
|
|
{
|
|
"type": "media-control",
|
|
"entity": "", # To be filled with media player entity
|
|
},
|
|
{
|
|
"type": "entities",
|
|
"title": "All Media Players",
|
|
"entities": [], # To be filled with media player entities
|
|
},
|
|
],
|
|
}
|
|
],
|
|
},
|
|
"energy": {
|
|
"title": "Energy Monitoring",
|
|
"url_path": "energy",
|
|
"icon": "mdi:lightning-bolt",
|
|
"show_in_sidebar": True,
|
|
"views": [
|
|
{
|
|
"title": "Energy Usage",
|
|
"cards": [
|
|
{"type": "energy-distribution", "title": "Energy Distribution"},
|
|
{
|
|
"type": "entities",
|
|
"title": "Power Sensors",
|
|
"entities": [], # To be filled with power sensor entities
|
|
},
|
|
{
|
|
"type": "history-graph",
|
|
"title": "Power Usage",
|
|
"entities": [], # To be filled with power entities
|
|
},
|
|
],
|
|
}
|
|
],
|
|
},
|
|
}
|
|
|
|
# Card type examples and their typical use cases
|
|
CARD_EXAMPLES = {
|
|
"entities": {
|
|
"description": "Shows a list of entities with their states",
|
|
"example": {
|
|
"type": "entities",
|
|
"title": "Living Room",
|
|
"entities": [
|
|
"light.living_room_main",
|
|
"switch.living_room_fan",
|
|
"sensor.living_room_temperature",
|
|
],
|
|
},
|
|
},
|
|
"glance": {
|
|
"description": "Shows entities in a compact grid format",
|
|
"example": {
|
|
"type": "glance",
|
|
"title": "Quick Overview",
|
|
"entities": [
|
|
"binary_sensor.front_door",
|
|
"binary_sensor.back_door",
|
|
"binary_sensor.garage_door",
|
|
],
|
|
},
|
|
},
|
|
"thermostat": {
|
|
"description": "Controls and displays thermostat information",
|
|
"example": {"type": "thermostat", "entity": "climate.main_thermostat"},
|
|
},
|
|
"weather-forecast": {
|
|
"description": "Shows weather information and forecast",
|
|
"example": {
|
|
"type": "weather-forecast",
|
|
"entity": "weather.home",
|
|
"name": "Weather",
|
|
},
|
|
},
|
|
"media-control": {
|
|
"description": "Controls media players with full interface",
|
|
"example": {"type": "media-control", "entity": "media_player.living_room_tv"},
|
|
},
|
|
"light": {
|
|
"description": "Dedicated light control card",
|
|
"example": {"type": "light", "entity": "light.living_room_main"},
|
|
},
|
|
"alarm-panel": {
|
|
"description": "Security alarm panel interface",
|
|
"example": {"type": "alarm-panel", "entity": "alarm_control_panel.home_alarm"},
|
|
},
|
|
"picture-entity": {
|
|
"description": "Shows entity state with a background image",
|
|
"example": {
|
|
"type": "picture-entity",
|
|
"entity": "light.living_room",
|
|
"image": "/local/living_room.jpg",
|
|
},
|
|
},
|
|
"history-graph": {
|
|
"description": "Shows historical data as a graph",
|
|
"example": {
|
|
"type": "history-graph",
|
|
"title": "Temperature History",
|
|
"entities": ["sensor.temperature_indoor", "sensor.temperature_outdoor"],
|
|
"hours_to_show": 24,
|
|
},
|
|
},
|
|
"gauge": {
|
|
"description": "Shows a single entity value as a gauge",
|
|
"example": {
|
|
"type": "gauge",
|
|
"entity": "sensor.cpu_temperature",
|
|
"min": 0,
|
|
"max": 100,
|
|
"name": "CPU Temperature",
|
|
},
|
|
},
|
|
}
|
|
|
|
# Predefined color schemes and icons
|
|
COMMON_ICONS = {
|
|
"lights": "mdi:lightbulb",
|
|
"security": "mdi:security",
|
|
"climate": "mdi:thermometer",
|
|
"energy": "mdi:lightning-bolt",
|
|
"media": "mdi:play",
|
|
"kitchen": "mdi:chef-hat",
|
|
"bedroom": "mdi:bed",
|
|
"bathroom": "mdi:shower",
|
|
"living_room": "mdi:sofa",
|
|
"garage": "mdi:garage",
|
|
"garden": "mdi:flower",
|
|
"office": "mdi:desk",
|
|
"basement": "mdi:stairs-down",
|
|
"attic": "mdi:stairs-up",
|
|
}
|
|
|
|
|
|
def get_template_for_entities(entities, dashboard_type="general"):
|
|
"""Generate a dashboard template based on available entities."""
|
|
template = {
|
|
"title": f"{dashboard_type.title()} Dashboard",
|
|
"url_path": dashboard_type.lower().replace(" ", "-"),
|
|
"icon": COMMON_ICONS.get(dashboard_type, "mdi:view-dashboard"),
|
|
"show_in_sidebar": True,
|
|
"views": [],
|
|
}
|
|
|
|
# Group entities by domain and by device_class for sensors
|
|
entity_groups = {}
|
|
sensor_by_device_class = {}
|
|
|
|
for entity in entities:
|
|
if isinstance(entity, dict) and "entity_id" in entity:
|
|
entity_id = entity["entity_id"]
|
|
# Get device_class from attributes if available
|
|
device_class = entity.get("attributes", {}).get("device_class")
|
|
else:
|
|
entity_id = str(entity)
|
|
device_class = None
|
|
|
|
domain = entity_id.split(".")[0]
|
|
if domain not in entity_groups:
|
|
entity_groups[domain] = []
|
|
entity_groups[domain].append(entity_id)
|
|
|
|
# Categorize sensors by device_class
|
|
if domain == "sensor" and device_class:
|
|
if device_class not in sensor_by_device_class:
|
|
sensor_by_device_class[device_class] = []
|
|
sensor_by_device_class[device_class].append(entity_id)
|
|
|
|
# Create view with cards for each domain
|
|
view_cards = []
|
|
|
|
# Lights
|
|
if "light" in entity_groups:
|
|
view_cards.append(
|
|
{"type": "entities", "title": "Lights", "entities": entity_groups["light"]}
|
|
)
|
|
|
|
# Climate - handle both climate entities and temperature/humidity sensors
|
|
if "climate" in entity_groups:
|
|
for climate_entity in entity_groups["climate"]:
|
|
view_cards.append({"type": "thermostat", "entity": climate_entity})
|
|
|
|
# Temperature sensors - create history graphs for climate dashboards
|
|
if "temperature" in sensor_by_device_class:
|
|
temp_sensors = sensor_by_device_class["temperature"]
|
|
# Add history graph for temperature visualization
|
|
view_cards.append(
|
|
{
|
|
"type": "history-graph",
|
|
"title": "Temperature History",
|
|
"entities": temp_sensors,
|
|
"hours_to_show": 24,
|
|
}
|
|
)
|
|
# Add entity card for current values
|
|
view_cards.append(
|
|
{
|
|
"type": "entities",
|
|
"title": "Temperature Sensors",
|
|
"entities": temp_sensors,
|
|
}
|
|
)
|
|
|
|
# Humidity sensors - create gauge cards for climate dashboards
|
|
if "humidity" in sensor_by_device_class:
|
|
humidity_sensors = sensor_by_device_class["humidity"]
|
|
# Add history graph for humidity visualization
|
|
view_cards.append(
|
|
{
|
|
"type": "history-graph",
|
|
"title": "Humidity History",
|
|
"entities": humidity_sensors,
|
|
"hours_to_show": 24,
|
|
}
|
|
)
|
|
# Add entity card for current values
|
|
view_cards.append(
|
|
{
|
|
"type": "entities",
|
|
"title": "Humidity Sensors",
|
|
"entities": humidity_sensors,
|
|
}
|
|
)
|
|
|
|
# Media players
|
|
if "media_player" in entity_groups:
|
|
for media_entity in entity_groups["media_player"]:
|
|
view_cards.append({"type": "media-control", "entity": media_entity})
|
|
|
|
# Security entities
|
|
if "binary_sensor" in entity_groups:
|
|
view_cards.append(
|
|
{
|
|
"type": "entities",
|
|
"title": "Sensors",
|
|
"entities": entity_groups["binary_sensor"],
|
|
}
|
|
)
|
|
|
|
if "alarm_control_panel" in entity_groups:
|
|
for alarm_entity in entity_groups["alarm_control_panel"]:
|
|
view_cards.append({"type": "alarm-panel", "entity": alarm_entity})
|
|
|
|
# Other Sensors (not temperature or humidity)
|
|
if "sensor" in entity_groups:
|
|
# Filter out temperature and humidity sensors that we already handled
|
|
other_sensors = [
|
|
s
|
|
for s in entity_groups["sensor"]
|
|
if s not in sensor_by_device_class.get("temperature", [])
|
|
and s not in sensor_by_device_class.get("humidity", [])
|
|
]
|
|
if other_sensors:
|
|
view_cards.append(
|
|
{
|
|
"type": "entities",
|
|
"title": "Other Sensors",
|
|
"entities": other_sensors[:10], # Limit to first 10
|
|
}
|
|
)
|
|
|
|
# Switches
|
|
if "switch" in entity_groups:
|
|
view_cards.append(
|
|
{
|
|
"type": "entities",
|
|
"title": "Switches",
|
|
"entities": entity_groups["switch"],
|
|
}
|
|
)
|
|
|
|
# Weather
|
|
if "weather" in entity_groups:
|
|
view_cards.append(
|
|
{"type": "weather-forecast", "entity": entity_groups["weather"][0]}
|
|
)
|
|
|
|
template["views"] = [{"title": "Overview", "cards": view_cards}]
|
|
|
|
return template
|