From dd59c687e38dfa9eed2f13dc32ac2da558af35bb Mon Sep 17 00:00:00 2001 From: Julian Pawlowski Date: Sun, 12 Apr 2026 14:45:15 +0000 Subject: [PATCH] chore(configuration): enhance development configuration for Home Assistant Updated the configuration files to improve development experience by explicitly loading useful integrations and adjusting logging levels. Added YAML schemas for configuration and services to ensure proper structure and validation. Impact: Developers will have a more streamlined setup process and better logging during integration development. --- config/configuration.yaml | 129 +++++- schemas/json/manifest_schema.json | 48 +- schemas/json/translation_schema.json | 10 +- schemas/yaml/configuration_schema.yaml | 591 ++++++++++++++++++++++++ schemas/yaml/services_schema.yaml | 611 +++++++++++++++++++++++++ 5 files changed, 1368 insertions(+), 21 deletions(-) create mode 100644 schemas/yaml/configuration_schema.yaml create mode 100644 schemas/yaml/services_schema.yaml diff --git a/config/configuration.yaml b/config/configuration.yaml index eb8bc85..97862fe 100644 --- a/config/configuration.yaml +++ b/config/configuration.yaml @@ -1,20 +1,32 @@ -# Development-friendly config that excludes go2rtc which has compatibility issues +# yaml-language-server: $schema=../schemas/yaml/configuration_schema.yaml +# Development-friendly Home Assistant configuration +# +# We don't use default_config to avoid HA OS-specific integrations like go2rtc +# that expect specific container environments. Instead, we explicitly load +# the integrations useful for custom component development. + # https://www.home-assistant.io/integrations/homeassistant/ homeassistant: debug: true -# Disable analytics, diagnostics and error reporting for development instance +# Debugging integration +# https://www.home-assistant.io/integrations/debugpy/ +debugpy: + +# Privacy & analytics settings # https://www.home-assistant.io/integrations/analytics/ analytics: - # Disable usage analytics to prevent skewing production statistics - # https://analytics.home-assistant.io should only reflect real user installations + # Analytics are disabled to prevent development instances from skewing + # production statistics at https://analytics.home-assistant.io +# System monitoring # https://www.home-assistant.io/integrations/system_health/ system_health: + # Provides system health information in Settings > System > Repairs + # Safe for development - only shows local system status -# https://www.home-assistant.io/integrations/diagnostics/ -# Note: Diagnostics integration cannot be disabled, but without analytics -# and with internal_url set, no data is sent externally +# Note: The diagnostics integration is always loaded and cannot be disabled. +# With analytics disabled, diagnostic data stays local and isn't sent anywhere. # Core integrations http: @@ -34,19 +46,120 @@ http: cors_allowed_origins: - "*" +# Config UI integration - useful for development +config: + +# Frontend - required for UI +frontend: + # Optional: Enable custom themes + # themes: !include_dir_merge_named themes + automation: script: scene: +# Useful default_config integrations for development +# https://www.home-assistant.io/integrations/history/ +history: + +# https://www.home-assistant.io/integrations/logbook/ +logbook: + +# https://www.home-assistant.io/integrations/conversation/ +# conversation: +# Note: Uncomment to enable voice assistant/conversation features +# Dependencies (hassil, home-assistant-intents) are pre-installed in bootstrap + +# https://www.home-assistant.io/integrations/webhook/ +webhook: + +# https://www.home-assistant.io/integrations/my/ +my: + +# https://www.home-assistant.io/integrations/recorder/ +recorder: + # Development-friendly database settings + # Reduce database size and improve performance + purge_keep_days: 2 + commit_interval: 30 + # Exclude entities you don't need history for + exclude: + domains: + # Sun position changes constantly, rarely needed in dev + - sun + # Backups don't need history + - backup + # Updates don't need full history tracking + - update + entity_globs: + # Time sensors change every second/minute + - sensor.time* + - sensor.date* + # Uptime sensors not interesting for development + - sensor.*uptime* + - sensor.*last_boot* + # Memory/CPU sensors create a lot of data + - sensor.*memory* + - sensor.*cpu* + event_types: + # Very frequent, rarely needed in development + - call_service + # System events create lots of noise + - system_log_event + # Component loading events + - component_loaded + energy: # https://www.home-assistant.io/integrations/logger/ logger: default: info logs: - # Main integration logger - applies to ALL sub-loggers by default + # Reduce noise from chatty components + homeassistant.components.recorder: warning + homeassistant.components.recorder.util: warning + homeassistant.components.websocket_api: warning + homeassistant.components.http.ban: warning + homeassistant.components.zeroconf: warning + homeassistant.components.ssdp: warning + homeassistant.components.bluetooth: warning + # Conversation can be noisy with hassil + homeassistant.components.conversation: warning + # Analytics/metrics are not interesting during development + homeassistant.components.analytics: error + + # Hide platform setup messages (scene, binary_sensor, sensor, etc.) + homeassistant.components.scene: warning + homeassistant.components.binary_sensor: warning + homeassistant.components.sensor: warning + homeassistant.components.event: warning + homeassistant.components.switch: warning + + # HTTP/network + homeassistant.components.http: warning + + # Keep loader at warning level to see real issues with our integration + homeassistant.loader: warning + + # Hide the verbose "Setting up X" messages during startup + # but keep warnings/errors visible + homeassistant.bootstrap: warning + homeassistant.setup: warning + + # Core system - keep visible for important messages + homeassistant.core: info + + # IMPORTANT for custom integration development: + # Coordinator issues (API calls, update failures) + homeassistant.helpers.update_coordinator: info + # Entity registration problems + homeassistant.helpers.entity_registry: info + # Config flow debugging (setup, options) + homeassistant.config_entries: info + + # Your integration debug logging - shows EVERYTHING from your integration custom_components.tibber_prices: debug # Reduce verbosity for details loggers (change to 'debug' for deep debugging) diff --git a/schemas/json/manifest_schema.json b/schemas/json/manifest_schema.json index 7349f12..e307c07 100644 --- a/schemas/json/manifest_schema.json +++ b/schemas/json/manifest_schema.json @@ -1,10 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Home Assistant integration manifest", - "description": "The manifest for a Home Assistant integration", + "title": "Home Assistant Custom Integration manifest for HACS", + "description": "The manifest.json schema for Home Assistant custom integrations distributed via HACS (Home Assistant Community Store). Extends the official Home Assistant manifest schema with HACS-specific requirements like version and issue_tracker fields.", "type": "object", "if": { - "properties": { "integration_type": { "const": "virtual" } }, + "properties": { + "integration_type": { + "const": "virtual" + } + }, "required": ["integration_type"] }, "then": { @@ -129,7 +133,9 @@ "properties": { "description": "The properties of the Zeroconf advertisement to filter.", "type": "object", - "additionalProperties": { "type": "string" } + "additionalProperties": { + "type": "string" + } } }, "required": ["type"], @@ -160,7 +166,9 @@ "type": "string" } }, - "additionalProperties": { "type": "string" } + "additionalProperties": { + "type": "string" + } } }, "bluetooth": { @@ -300,9 +308,13 @@ } }, "documentation": { - "description": "The website containing the documentation for the integration. It has to be in the format \"https://www.home-assistant.io/integrations/[domain]\"\nhttps://developers.home-assistant.io/docs/creating_integration_manifest/#documentation", + "description": "The website containing the documentation for the integration. For core integrations, it should be \"https://www.home-assistant.io/integrations/[domain]\". Custom integrations can use any URL.\nhttps://developers.home-assistant.io/docs/creating_integration_manifest/#documentation", + "type": "string", + "format": "uri" + }, + "issue_tracker": { + "description": "The issue tracker of your integration, where users can report issues. For custom integrations, this is typically a GitHub issues URL.\nhttps://developers.home-assistant.io/docs/creating_integration_manifest/#issue-tracker", "type": "string", - "pattern": "^https://www.home-assistant.io/integrations/[0-9a-z_]+$", "format": "uri" }, "quality_scale": { @@ -375,15 +387,31 @@ "single_config_entry": { "description": "Whether the integration only supports a single config entry.\nhttps://developers.home-assistant.io/docs/creating_integration_manifest/#single-config-entry-only", "const": true + }, + "version": { + "description": "The version of the integration. Required for custom integrations, should be omitted for core integrations.\nhttps://developers.home-assistant.io/docs/creating_integration_manifest/#version", + "type": "string", + "pattern": "^([0-9]+)\\.([0-9]+)\\.([0-9]+)(?:[-\\.]([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+)?$" } }, "additionalProperties": false, - "required": ["domain", "name", "codeowners", "documentation"], + "required": [ + "domain", + "name", + "codeowners", + "documentation", + "issue_tracker", + "version" + ], "dependencies": { "mqtt": { "anyOf": [ - { "required": ["dependencies"] }, - { "required": ["after_dependencies"] } + { + "required": ["dependencies"] + }, + { + "required": ["after_dependencies"] + } ] } } diff --git a/schemas/json/translation_schema.json b/schemas/json/translation_schema.json index 06d8358..115b6bf 100644 --- a/schemas/json/translation_schema.json +++ b/schemas/json/translation_schema.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Home Assistant Translation File Schema", - "description": "Schema for Home Assistant custom integration translation files based on https://developers.home-assistant.io/docs/internationalization/core", + "title": "Home Assistant Custom Integration Translation (strings.json)", + "description": "JSON schema for Home Assistant custom integration translation files (strings.json and translations/*.json). Defines translations for config flows, entities, services, device automations, and more. Based on the official Home Assistant internationalization specification: https://developers.home-assistant.io/docs/internationalization/core", "type": "object", "properties": { "title": { @@ -187,13 +187,17 @@ }, "sections": { "type": "object", - "description": "Collapsible section labels", + "description": "Collapsible section labels and descriptions", "additionalProperties": { "type": "object", "properties": { "name": { "type": "string", "description": "Section name" + }, + "description": { + "type": "string", + "description": "Section description (optional, supports Markdown)" } } } diff --git a/schemas/yaml/configuration_schema.yaml b/schemas/yaml/configuration_schema.yaml new file mode 100644 index 0000000..9be9bfb --- /dev/null +++ b/schemas/yaml/configuration_schema.yaml @@ -0,0 +1,591 @@ +# YAML Schema for Home Assistant configuration.yaml +# Based on: https://www.home-assistant.io/docs/configuration/ +$schema: http://json-schema.org/draft-07/schema# +title: Home Assistant Configuration +description: Basic schema for Home Assistant configuration.yaml. This covers core configuration structure but individual integrations have their own specific schemas. + +type: object + +properties: + homeassistant: + type: object + description: Core Home Assistant configuration + properties: + name: + type: string + description: Name of the location + + latitude: + type: number + description: Latitude of your location + + longitude: + type: number + description: Longitude of your location + + elevation: + type: number + description: Elevation in meters + + unit_system: + type: string + enum: [metric, imperial, us_customary] + description: Unit system to use + + temperature_unit: + type: string + enum: [C, F] + description: Temperature unit (overrides unit_system) + + time_zone: + type: string + description: Time zone (e.g., Europe/Berlin) + + currency: + type: string + description: Currency code (e.g., EUR, USD) + + country: + type: string + description: Country code (ISO 3166-1 alpha-2, e.g., DE, US) + + language: + type: string + description: Language code (e.g., en, de) + + internal_url: + type: string + format: uri + description: Internal URL for Home Assistant + + external_url: + type: string + format: uri + description: External URL for Home Assistant + + allowlist_external_dirs: + type: array + items: + type: string + description: List of directories that are allowed for external access + + allowlist_external_urls: + type: array + items: + type: string + format: uri + description: List of external URLs that are allowed + + packages: + type: object + description: Split configuration into packages + additionalProperties: true + + customize: + type: object + description: Customize entities + additionalProperties: true + + customize_domain: + type: object + description: Customize all entities in a domain + additionalProperties: true + + customize_glob: + type: object + description: Customize entities using glob patterns + additionalProperties: true + + auth_providers: + type: array + description: Authentication providers + items: + type: object + + auth_mfa_modules: + type: array + description: Multi-factor authentication modules + items: + type: object + + debug: + type: boolean + description: Enable debug mode + + media_dirs: + type: object + description: Media directories + additionalProperties: + type: string + + default_config: + description: Load default integrations. Set to empty object {} to include default_config. + oneOf: + - type: object + additionalProperties: false + - type: "null" + + # Common integrations + http: + description: HTTP integration configuration (https://www.home-assistant.io/integrations/http/) + type: [object, "null"] + properties: + server_host: + oneOf: + - type: string + format: ipv4 + - type: string + format: ipv6 + - type: array + items: + type: string + description: Host to bind to (e.g., 0.0.0.0 for all interfaces) + + server_port: + type: integer + minimum: 1 + maximum: 65535 + description: Port to bind to + + base_url: + type: string + format: uri + description: Base URL for external access (deprecated, use homeassistant.external_url) + + ssl_certificate: + type: string + description: Path to SSL certificate + + ssl_key: + type: string + description: Path to SSL private key + + cors_allowed_origins: + type: array + items: + type: string + description: List of allowed CORS origins + + use_x_forwarded_for: + type: boolean + description: Enable X-Forwarded-For header processing + + trusted_proxies: + type: array + items: + type: string + description: List of trusted proxy IP addresses + + ip_ban_enabled: + type: boolean + description: Enable automatic IP banning + + login_attempts_threshold: + type: integer + minimum: 1 + description: Number of failed login attempts before ban + + api: + description: API integration + oneOf: + - type: object + additionalProperties: false + - type: "null" + + analytics: + description: Analytics configuration (https://www.home-assistant.io/integrations/analytics/) + oneOf: + - type: object + additionalProperties: false + - type: "null" + + logger: + type: object + description: Logger configuration (https://www.home-assistant.io/integrations/logger/) + properties: + default: + type: string + enum: [notset, debug, info, warning, error, critical] + description: Default log level for all components + + logs: + type: object + description: Per-component log levels (e.g., homeassistant.components.http, custom_components.your_integration) + patternProperties: + "^(homeassistant\\.components\\.[a-z0-9_.]+|homeassistant\\.[a-z0-9_.]+|custom_components\\.[a-z0-9_.]+|[a-z0-9_.]+)$": + type: string + enum: [notset, debug, info, warning, error, critical] + additionalProperties: false + + filters: + type: object + description: Filter log messages + additionalProperties: true + + recorder: + description: Recorder (database) configuration (https://www.home-assistant.io/integrations/recorder/) + oneOf: + - type: object + properties: + db_url: + type: string + description: Database URL (e.g., sqlite:///path/to/file.db, postgresql://...) + format: uri + + purge_keep_days: + type: integer + minimum: 1 + description: Number of days to keep history + + commit_interval: + type: integer + minimum: 1 + description: Seconds between database commits + + auto_purge: + type: boolean + description: Automatically purge old data + + auto_repack: + type: boolean + description: Automatically repack database (SQLite only) + + exclude: + type: object + description: Exclude entities/domains from recording + properties: + domains: + type: array + items: + type: string + description: Domain names to exclude (e.g., sun, backup) + + entities: + type: array + items: + type: string + description: Specific entities to exclude + + entity_globs: + type: array + items: + type: string + description: Entity glob patterns to exclude (e.g., sensor.time*) + + event_types: + type: array + items: + type: string + description: Event types to exclude (e.g., call_service) + + include: + type: object + description: Include only specific entities/domains + properties: + domains: + type: array + items: + type: string + description: Domain names to include + + entities: + type: array + items: + type: string + description: Specific entities to include + + entity_globs: + type: array + items: + type: string + description: Entity glob patterns to include + - type: "null" + + history: + description: History configuration (https://www.home-assistant.io/integrations/history/) + oneOf: + - type: object + properties: + exclude: + type: object + description: Exclude entities from history + properties: + domains: + type: array + items: + type: string + entities: + type: array + items: + type: string + entity_globs: + type: array + items: + type: string + + include: + type: object + description: Include only specific entities in history + properties: + domains: + type: array + items: + type: string + entities: + type: array + items: + type: string + entity_globs: + type: array + items: + type: string + - type: "null" + + logbook: + description: Logbook configuration (https://www.home-assistant.io/integrations/logbook/) + oneOf: + - type: object + properties: + exclude: + type: object + description: Exclude entities from logbook + properties: + domains: + type: array + items: + type: string + entities: + type: array + items: + type: string + entity_globs: + type: array + items: + type: string + + include: + type: object + description: Include only specific entities in logbook + properties: + domains: + type: array + items: + type: string + entities: + type: array + items: + type: string + entity_globs: + type: array + items: + type: string + - type: "null" + + frontend: + description: Frontend configuration (https://www.home-assistant.io/integrations/frontend/) + oneOf: + - type: object + properties: + themes: + type: object + description: Custom themes + additionalProperties: true + + extra_module_url: + type: array + description: Additional JavaScript modules to load + items: + type: string + format: uri + + extra_js_url_es5: + type: array + description: Additional ES5 JavaScript modules + items: + type: string + format: uri + + development_repo: + type: string + description: Path to frontend development repository + - type: "null" + + config: + description: Configuration panel + oneOf: + - type: object + additionalProperties: false + - type: "null" + + map: + description: Map panel + oneOf: + - type: object + additionalProperties: false + - type: "null" + + sun: + description: Sun integration + oneOf: + - type: object + additionalProperties: false + - type: "null" + + system_health: + description: System health integration + oneOf: + - type: object + additionalProperties: false + - type: "null" + + mobile_app: + description: Mobile app integration (https://www.home-assistant.io/integrations/mobile_app/) + oneOf: + - type: object + additionalProperties: false + - type: "null" + + # Development integrations + debugpy: + description: Python debugger integration for development (https://www.home-assistant.io/integrations/debugpy/) + oneOf: + - type: object + properties: + start: + type: boolean + description: Auto-start debugger on Home Assistant start + wait: + type: boolean + description: Wait for debugger to attach before continuing + port: + type: integer + minimum: 1 + maximum: 65535 + description: Port for debugger + host: + type: string + description: Host to bind debugger to + - type: "null" + + webhook: + description: Webhook integration (https://www.home-assistant.io/integrations/webhook/) + oneOf: + - type: object + additionalProperties: false + - type: "null" + + my: + description: My Home Assistant integration (https://www.home-assistant.io/integrations/my/) + oneOf: + - type: object + additionalProperties: false + - type: "null" + + conversation: + description: Conversation/voice assistant integration (https://www.home-assistant.io/integrations/conversation/) + oneOf: + - type: object + properties: + intents: + type: object + description: Custom conversation intents + additionalProperties: true + - type: "null" + + person: + type: array + description: Person configuration + items: + type: object + + zone: + type: array + description: Zone configuration + items: + type: object + + automation: + description: Automation configuration (https://www.home-assistant.io/integrations/automation/) + oneOf: + - type: string + pattern: "^!include" + description: Include from external file (e.g., !include automations.yaml) + - type: array + description: List of automations + items: + type: object + - type: object + description: Named automations + additionalProperties: true + - type: "null" + + script: + description: Script configuration (https://www.home-assistant.io/integrations/script/) + oneOf: + - type: string + pattern: "^!include" + description: Include from external file (e.g., !include scripts.yaml) + - type: object + description: Named scripts + additionalProperties: true + - type: "null" + + scene: + description: Scene configuration (https://www.home-assistant.io/integrations/scene/) + oneOf: + - type: string + pattern: "^!include" + description: Include from external file (e.g., !include scenes.yaml) + - type: array + description: List of scenes + items: + type: object + - type: object + description: Named scenes + additionalProperties: true + - type: "null" + + input_boolean: + type: object + description: Input boolean helpers + + input_number: + type: object + description: Input number helpers + + input_datetime: + type: object + description: Input datetime helpers + + input_text: + type: object + description: Input text helpers + + input_select: + type: object + description: Input select helpers + + input_button: + type: object + description: Input button helpers + + counter: + type: object + description: Counter helpers + + timer: + type: object + description: Timer helpers + + group: + type: object + description: Group configuration + + template: + type: array + description: Template entities + items: + type: object + +# Allow any integration not explicitly defined +additionalProperties: true diff --git a/schemas/yaml/services_schema.yaml b/schemas/yaml/services_schema.yaml new file mode 100644 index 0000000..6a135f2 --- /dev/null +++ b/schemas/yaml/services_schema.yaml @@ -0,0 +1,611 @@ +# YAML Schema for Home Assistant services.yaml +# Based on: https://developers.home-assistant.io/docs/dev_101_services/ +$schema: http://json-schema.org/draft-07/schema# +title: Home Assistant Service Actions Definition +description: Schema for Home Assistant services.yaml file that defines service actions for custom integrations + +type: object +patternProperties: + "^[a-z][a-z0-9_]*$": + type: object + description: Service action definition (key is the service action name) + additionalProperties: false + properties: + name: + type: string + description: User-visible name of the service action (translated via strings.json) + + description: + type: string + description: User-visible description of the service action (translated via strings.json). Supports Markdown. + + target: + type: object + description: Allows users to specify entities by entity, device, or area. Do NOT define entity_id in fields if target is specified. + additionalProperties: false + properties: + entity: + type: object + description: Entity selector configuration + additionalProperties: false + properties: + domain: + oneOf: + - type: string + - type: array + items: + type: string + description: Filter entities by domain(s) + + integration: + type: string + description: Filter entities by integration + + device_class: + oneOf: + - type: string + - type: array + items: + type: string + description: Filter entities by device class(es) + + supported_features: + type: array + description: Filter by required supported features. Each item is either a single feature or a list of features (AND logic). + items: + oneOf: + - type: string + - type: number + - type: array + items: + oneOf: + - type: string + - type: number + + device: + type: object + description: Device selector configuration + additionalProperties: false + properties: + integration: + type: string + description: Filter devices by integration + + manufacturer: + type: string + description: Filter devices by manufacturer + + model: + type: string + description: Filter devices by model + + area: + type: object + description: Area selector configuration + additionalProperties: false + + fields: + type: object + description: Input fields for the service action + additionalProperties: false + patternProperties: + "^[a-z][a-z0-9_]*$": + type: object + description: Service action field definition + additionalProperties: false + properties: + name: + type: string + description: User-visible field name (translated via strings.json) + + description: + type: string + description: User-visible field description (translated via strings.json) + + required: + type: boolean + default: false + description: Whether the field is required + + advanced: + type: boolean + default: false + description: Advanced fields are only shown when advanced mode is enabled + + example: + description: Example value for this field + + default: + description: Default field value if not provided + + selector: + type: object + description: Selector to control the input UI (https://www.home-assistant.io/docs/blueprint/selectors/) + additionalProperties: true + properties: + # Common selectors + action: + type: [object, "null"] + description: Action sequence selector + additionalProperties: true + + boolean: + type: [object, "null"] + description: Toggle switch selector + additionalProperties: true + + condition: + type: [object, "null"] + description: Condition selector + additionalProperties: true + + entity: + type: object + description: Entity selector with filtering options + additionalProperties: false + properties: + domain: + oneOf: + - type: string + - type: array + items: + type: string + integration: + type: string + device_class: + oneOf: + - type: string + - type: array + items: + type: string + supported_features: + type: array + items: + oneOf: + - type: string + - type: number + multiple: + type: boolean + exclude_entities: + type: array + items: + type: string + include_entities: + type: array + items: + type: string + + device: + type: object + description: Device selector with filtering options + additionalProperties: false + properties: + integration: + type: string + manufacturer: + type: string + model: + type: string + multiple: + type: boolean + entity: + type: object + properties: + domain: + oneOf: + - type: string + - type: array + items: + type: string + device_class: + oneOf: + - type: string + - type: array + items: + type: string + + area: + type: object + description: Area selector with filtering options + additionalProperties: false + properties: + multiple: + type: boolean + entity: + type: object + properties: + domain: + oneOf: + - type: string + - type: array + items: + type: string + integration: + type: string + device: + type: object + properties: + integration: + type: string + manufacturer: + type: string + + target: + type: object + description: Target selector (entity/device/area combined) + additionalProperties: false + properties: + entity: + type: object + properties: + domain: + oneOf: + - type: string + - type: array + items: + type: string + device_class: + oneOf: + - type: string + - type: array + items: + type: string + + number: + type: object + description: Number input selector + additionalProperties: false + properties: + min: + type: number + max: + type: number + step: + oneOf: + - type: number + - type: string + enum: ["any"] + unit_of_measurement: + type: string + mode: + type: string + enum: ["box", "slider"] + + text: + type: [object, "null"] + description: Text input selector + additionalProperties: false + properties: + multiline: + type: boolean + type: + type: string + enum: + [ + "color", + "date", + "datetime-local", + "email", + "month", + "number", + "password", + "search", + "tel", + "text", + "time", + "url", + "week", + ] + multiple: + type: boolean + prefix: + type: string + suffix: + type: string + + select: + type: object + description: Selection dropdown/list selector + additionalProperties: false + properties: + options: + oneOf: + - type: array + items: + type: string + - type: array + items: + type: object + properties: + label: + type: string + value: + type: string + multiple: + type: boolean + custom_value: + type: boolean + mode: + type: string + enum: ["list", "dropdown"] + sort: + type: boolean + translation_key: + type: string + required: + - options + + time: + type: [object, "null"] + description: Time picker selector + additionalProperties: true + + date: + type: [object, "null"] + description: Date picker selector + additionalProperties: true + + datetime: + type: [object, "null"] + description: Date & time picker selector + additionalProperties: true + + duration: + type: object + description: Duration selector (days, hours, minutes, seconds) + additionalProperties: false + properties: + enable_day: + type: boolean + enable_millisecond: + type: boolean + + color_temp: + type: object + description: Color temperature selector + additionalProperties: false + properties: + unit: + type: string + enum: ["kelvin", "mired"] + min: + type: integer + max: + type: integer + + color_rgb: + type: [object, "null"] + description: RGB color picker selector + additionalProperties: true + + icon: + type: object + description: Icon picker selector + additionalProperties: false + properties: + placeholder: + type: string + + template: + type: [object, "null"] + description: Jinja2 template input selector + additionalProperties: true + + object: + type: object + description: YAML object input selector + additionalProperties: false + properties: + multiple: + type: boolean + + trigger: + type: [object, "null"] + description: Trigger configuration selector + additionalProperties: true + + location: + type: object + description: Location/coordinates picker selector + additionalProperties: false + properties: + radius: + type: boolean + icon: + type: string + + media: + type: object + description: Media picker selector + additionalProperties: false + properties: + accept: + type: array + items: + type: string + + theme: + type: object + description: Theme selector + additionalProperties: false + properties: + include_default: + type: boolean + + # Additional selectors (simplified) + addon: + type: object + description: Add-on selector (HAOS only) + additionalProperties: true + + assist_pipeline: + type: object + description: Assist pipeline selector + additionalProperties: true + + attribute: + type: object + description: Attribute selector + additionalProperties: false + properties: + entity_id: + type: string + required: + - entity_id + + backup_location: + type: object + description: Backup location selector (HAOS only) + additionalProperties: true + + config_entry: + type: object + description: Configuration entry selector + additionalProperties: false + properties: + integration: + type: string + + constant: + type: object + description: Constant value selector + additionalProperties: false + properties: + value: + description: The constant value + label: + type: string + required: + - value + + conversation_agent: + type: object + description: Conversation agent selector + additionalProperties: false + properties: + language: + type: string + + country: + type: object + description: Country selector + additionalProperties: false + properties: + countries: + type: array + items: + type: string + no_sort: + type: boolean + + floor: + type: object + description: Floor selector + additionalProperties: false + properties: + multiple: + type: boolean + + label: + type: object + description: Label selector + additionalProperties: false + properties: + multiple: + type: boolean + + language: + type: object + description: Language selector + additionalProperties: false + properties: + languages: + type: array + items: + type: string + native_name: + type: boolean + no_sort: + type: boolean + + qr_code: + type: object + description: QR code display (no return value) + additionalProperties: false + properties: + data: + description: Data to encode in QR code + scale: + type: integer + error_correction_level: + type: string + enum: ["low", "medium", "quartile", "high"] + required: + - data + + state: + type: object + description: State selector + additionalProperties: false + properties: + entity_id: + type: string + multiple: + type: boolean + + statistic: + type: object + description: Statistic selector + additionalProperties: false + properties: + multiple: + type: boolean + + filter: + type: object + description: Filter to show field only if selected entities match criteria + additionalProperties: false + properties: + supported_features: + type: array + description: Show field if at least one selected entity supports at least one listed feature + items: + oneOf: + - type: string + - type: number + + attribute: + type: object + description: Show field if at least one selected entity's attribute matches one of the listed values + patternProperties: + ".*": + type: array + items: + oneOf: + - type: string + - type: number + - type: boolean + oneOf: + - required: [supported_features] + - required: [attribute] + + # Collapsible sections for grouping fields (e.g., advanced_fields) + advanced_fields: + type: object + description: Collapsible section for advanced fields + additionalProperties: false + properties: + collapsed: + type: boolean + default: false + description: Whether the section is initially collapsed + + fields: + type: object + description: Advanced fields in this section + additionalProperties: false + patternProperties: + "^[a-z][a-z0-9_]*$": + $ref: "#/patternProperties/^[a-z][a-z0-9_]*$/properties/fields/patternProperties/^[a-z][a-z0-9_]*$" + +additionalProperties: false