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