chore(style): reformat JSON config files from 4-space to 2-space indent

Apply consistent 2-space indentation to all project-level JSON configuration
files: devcontainer.json, devcontainer-extensions.json, manifest.json,
icons.json, hacs.json, .markdownlint.json, and translation_schema.json.
No content changes.

Release-Notes: skip
This commit is contained in:
Julian Pawlowski 2026-04-12 14:15:04 +00:00
parent a957334990
commit a93ad1ac96
7 changed files with 446 additions and 464 deletions

View file

@ -1,6 +1,4 @@
{ {
"recommendations": [], "recommendations": [],
"unwantedRecommendations": [ "unwantedRecommendations": ["ms-python.pylint"]
"ms-python.pylint"
]
} }

View file

@ -7,11 +7,7 @@
"PYTHONASYNCIODEBUG": "1", "PYTHONASYNCIODEBUG": "1",
"TIBBER_PRICES_DEV": "1" "TIBBER_PRICES_DEV": "1"
}, },
"forwardPorts": [ "forwardPorts": [8123, 3000, 3001],
8123,
3000,
3001
],
"portsAttributes": { "portsAttributes": {
"8123": { "8123": {
"label": "Home Assistant", "label": "Home Assistant",
@ -56,9 +52,7 @@
"reportUnusedCoroutine": "none", "reportUnusedCoroutine": "none",
"reportMissingTypeStubs": "none" "reportMissingTypeStubs": "none"
}, },
"python.analysis.include": [ "python.analysis.include": ["custom_components/tibber_prices"],
"custom_components/tibber_prices"
],
"python.analysis.exclude": [ "python.analysis.exclude": [
"**/.venv/**", "**/.venv/**",
"**/venv/**", "**/venv/**",
@ -74,9 +68,7 @@
], ],
"python.terminal.activateEnvironment": true, "python.terminal.activateEnvironment": true,
"python.terminal.activateEnvInCurrentTerminal": true, "python.terminal.activateEnvInCurrentTerminal": true,
"python.testing.pytestArgs": [ "python.testing.pytestArgs": ["--no-cov"],
"--no-cov"
],
"[json]": { "[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode", "editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true, "editor.formatOnSave": true,
@ -112,15 +104,11 @@
"markdown.validate.fragmentLinks.enabled": "ignore", "markdown.validate.fragmentLinks.enabled": "ignore",
"json.schemas": [ "json.schemas": [
{ {
"fileMatch": [ "fileMatch": ["homeassistant/components/*/manifest.json"],
"homeassistant/components/*/manifest.json"
],
"url": "${containerWorkspaceFolder}/schemas/json/manifest_schema.json" "url": "${containerWorkspaceFolder}/schemas/json/manifest_schema.json"
}, },
{ {
"fileMatch": [ "fileMatch": ["homeassistant/components/*/translations/*.json"],
"homeassistant/components/*/translations/*.json"
],
"url": "${containerWorkspaceFolder}/schemas/json/translation_schema.json" "url": "${containerWorkspaceFolder}/schemas/json/translation_schema.json"
} }
], ],

View file

@ -1,9 +1,9 @@
{ {
"default": true, "default": true,
"MD013": false, "MD013": false,
"MD033": false, "MD033": false,
"MD041": false, "MD041": false,
"no-inline-html": false, "no-inline-html": false,
"line-length": false, "line-length": false,
"first-line-heading": false "first-line-heading": false
} }

View file

@ -1,79 +1,79 @@
{ {
"services": { "services": {
"get_price": { "get_price": {
"service": "mdi:table-search" "service": "mdi:table-search"
}, },
"get_chartdata": { "get_chartdata": {
"service": "mdi:chart-bar", "service": "mdi:chart-bar",
"sections": { "sections": {
"general": "mdi:identifier", "general": "mdi:identifier",
"selection": "mdi:calendar-range", "selection": "mdi:calendar-range",
"filters": "mdi:filter-variant", "filters": "mdi:filter-variant",
"transformation": "mdi:tune", "transformation": "mdi:tune",
"format": "mdi:file-table", "format": "mdi:file-table",
"arrays_of_objects": "mdi:code-json", "arrays_of_objects": "mdi:code-json",
"arrays_of_arrays": "mdi:code-brackets" "arrays_of_arrays": "mdi:code-brackets"
} }
}, },
"get_apexcharts_yaml": { "get_apexcharts_yaml": {
"service": "mdi:chart-line", "service": "mdi:chart-line",
"sections": { "sections": {
"entry_id": "mdi:identifier", "entry_id": "mdi:identifier",
"day": "mdi:calendar-range", "day": "mdi:calendar-range",
"level_type": "mdi:format-list-bulleted-type", "level_type": "mdi:format-list-bulleted-type",
"resolution": "mdi:timer-sand", "resolution": "mdi:timer-sand",
"highlight_best_price": "mdi:battery-charging-low", "highlight_best_price": "mdi:battery-charging-low",
"highlight_peak_price": "mdi:battery-alert" "highlight_peak_price": "mdi:battery-alert"
} }
}, },
"refresh_user_data": { "refresh_user_data": {
"service": "mdi:refresh" "service": "mdi:refresh"
}, },
"find_cheapest_block": { "find_cheapest_block": {
"service": "mdi:washing-machine", "service": "mdi:washing-machine",
"sections": { "sections": {
"search_range": "mdi:calendar-search", "search_range": "mdi:calendar-search",
"time_alternatives": "mdi:clock-time-eight-outline", "time_alternatives": "mdi:clock-time-eight-outline",
"price_filter": "mdi:filter-variant", "price_filter": "mdi:filter-variant",
"output": "mdi:tune-variant" "output": "mdi:tune-variant"
} }
}, },
"find_most_expensive_block": { "find_most_expensive_block": {
"service": "mdi:lightning-bolt-circle", "service": "mdi:lightning-bolt-circle",
"sections": { "sections": {
"search_range": "mdi:calendar-search", "search_range": "mdi:calendar-search",
"time_alternatives": "mdi:clock-time-eight-outline", "time_alternatives": "mdi:clock-time-eight-outline",
"price_filter": "mdi:filter-variant", "price_filter": "mdi:filter-variant",
"output": "mdi:tune-variant" "output": "mdi:tune-variant"
} }
}, },
"find_cheapest_hours": { "find_cheapest_hours": {
"service": "mdi:ev-station", "service": "mdi:ev-station",
"sections": { "sections": {
"search_range": "mdi:calendar-search", "search_range": "mdi:calendar-search",
"time_alternatives": "mdi:clock-time-eight-outline", "time_alternatives": "mdi:clock-time-eight-outline",
"price_filter": "mdi:filter-variant", "price_filter": "mdi:filter-variant",
"output": "mdi:tune-variant" "output": "mdi:tune-variant"
} }
}, },
"find_most_expensive_hours": { "find_most_expensive_hours": {
"service": "mdi:flash-alert", "service": "mdi:flash-alert",
"sections": { "sections": {
"search_range": "mdi:calendar-search", "search_range": "mdi:calendar-search",
"time_alternatives": "mdi:clock-time-eight-outline", "time_alternatives": "mdi:clock-time-eight-outline",
"price_filter": "mdi:filter-variant", "price_filter": "mdi:filter-variant",
"output": "mdi:tune-variant" "output": "mdi:tune-variant"
} }
}, },
"find_cheapest_schedule": { "find_cheapest_schedule": {
"service": "mdi:calendar-check", "service": "mdi:calendar-check",
"sections": { "sections": {
"scheduling_options": "mdi:format-list-numbered", "scheduling_options": "mdi:format-list-numbered",
"search_range": "mdi:calendar-search", "search_range": "mdi:calendar-search",
"time_alternatives": "mdi:clock-time-eight-outline", "time_alternatives": "mdi:clock-time-eight-outline",
"price_filter": "mdi:filter-variant", "price_filter": "mdi:filter-variant",
"output": "mdi:tune-variant" "output": "mdi:tune-variant"
} }
}
} }
}
} }

View file

@ -1,15 +1,11 @@
{ {
"domain": "tibber_prices", "domain": "tibber_prices",
"name": "Tibber Price Information & Ratings", "name": "Tibber Price Information & Ratings",
"codeowners": [ "codeowners": ["@jpawlowski"],
"@jpawlowski"
],
"config_flow": true, "config_flow": true,
"documentation": "https://github.com/jpawlowski/hass.tibber_prices", "documentation": "https://github.com/jpawlowski/hass.tibber_prices",
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"issue_tracker": "https://github.com/jpawlowski/hass.tibber_prices/issues", "issue_tracker": "https://github.com/jpawlowski/hass.tibber_prices/issues",
"requirements": [ "requirements": ["aiofiles>=23.2.1"],
"aiofiles>=23.2.1"
],
"version": "0.30.0" "version": "0.30.0"
} }

View file

@ -1,5 +1,5 @@
{ {
"name": "Tibber Price Information & Ratings", "name": "Tibber Price Information & Ratings",
"homeassistant": "2026.4.0", "homeassistant": "2026.4.0",
"hacs": "2.0.5" "hacs": "2.0.5"
} }

View file

@ -1,372 +1,372 @@
{ {
"$schema": "http://json-schema.org/draft-07/schema#", "$schema": "http://json-schema.org/draft-07/schema#",
"title": "Home Assistant Translation File 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", "description": "Schema for Home Assistant custom integration translation files based on https://developers.home-assistant.io/docs/internationalization/core",
"type": "object", "type": "object",
"properties": { "properties": {
"title": { "title": {
"type": "string", "type": "string",
"description": "Title of the integration (optional, will fallback to integration name if omitted). Only include if not a product brand." "description": "Title of the integration (optional, will fallback to integration name if omitted). Only include if not a product brand."
},
"common": {
"type": "object",
"description": "Shared strings that can be referenced using [%key:component::domain::common::key_path%]",
"additionalProperties": true
},
"config": {
"type": "object",
"description": "Translations for the configuration flow",
"properties": {
"flow_title": {
"type": "string",
"description": "Title shown in list (only rendered if placeholders required), e.g. 'Discovered Device ({host})'"
}, },
"common": { "entry_type": {
"type": "object", "type": "string",
"description": "Shared strings that can be referenced using [%key:component::domain::common::key_path%]", "description": "Label explaining what an entry represents (optional, only if default translations are misleading)"
"additionalProperties": true
}, },
"config": { "initiate_flow": {
"type": "object",
"description": "Menu or button labels for starting flows",
"properties": {
"reconfigure": {
"type": "string",
"description": "Label for reconfigure flow"
},
"user": {
"type": "string",
"description": "Label for user flow"
}
}
},
"step": {
"type": "object",
"description": "Translations for each config flow step",
"additionalProperties": {
"type": "object", "type": "object",
"description": "Translations for the configuration flow",
"properties": { "properties": {
"flow_title": { "title": {
"type": "string", "type": "string",
"description": "Title shown in list (only rendered if placeholders required), e.g. 'Discovered Device ({host})'" "description": "User-visible title of the step (will show integration name if omitted)"
}, },
"entry_type": { "description": {
"type": "string", "type": "string",
"description": "Label explaining what an entry represents (optional, only if default translations are misleading)" "description": "Markdown description shown with the step (optional)"
}, },
"initiate_flow": { "data": {
"type": "object",
"description": "Menu or button labels for starting flows",
"properties": {
"reconfigure": {
"type": "string",
"description": "Label for reconfigure flow"
},
"user": {
"type": "string",
"description": "Label for user flow"
}
}
},
"step": {
"type": "object",
"description": "Translations for each config flow step",
"additionalProperties": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "User-visible title of the step (will show integration name if omitted)"
},
"description": {
"type": "string",
"description": "Markdown description shown with the step (optional)"
},
"data": {
"type": "object",
"description": "Labels for input fields",
"additionalProperties": {
"type": "string"
}
},
"data_description": {
"type": "object",
"description": "Descriptions for input fields",
"additionalProperties": {
"type": "string"
}
},
"sections": {
"type": "object",
"description": "Labels for form sections (only if form has sections)",
"additionalProperties": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Section label"
}
}
}
}
}
}
},
"error": {
"type": "object",
"description": "Error messages returned by the flow",
"additionalProperties": {
"type": "string"
}
},
"abort": {
"type": "object",
"description": "Abort messages (supports Markdown)",
"additionalProperties": {
"type": "string"
}
},
"progress": {
"type": "object",
"description": "Progress messages for async_show_progress (supports Markdown)",
"additionalProperties": {
"type": "string"
}
},
"create_entry": {
"type": "object",
"description": "Success dialog messages (supports Markdown)",
"properties": {
"default": {
"type": "string",
"description": "Default message if async_create_entry called with description=None"
}
},
"additionalProperties": {
"type": "string",
"description": "Custom messages for specific description keys"
}
}
}
},
"options": {
"type": "object",
"description": "Translations for the options flow (same format as config)"
},
"config_subentries": {
"type": "object",
"description": "Translations for config subentry flows (map of subentry types, each with same format as config)",
"additionalProperties": {
"type": "object"
}
},
"selector": {
"type": "object",
"description": "Translations for selector options. The key is the translation_key set in SelectSelectorConfig. CRITICAL: Use selector.{translation_key}.options.{value}, NOT selector.select.{translation_key}",
"additionalProperties": {
"type": "object", "type": "object",
"properties": { "description": "Labels for input fields",
"options": {
"type": "object",
"description": "Option label translations for select selectors. Keys must match the values passed in the options list.",
"additionalProperties": {
"type": "string"
}
},
"unit_of_measurement": {
"type": "object",
"description": "Unit translations for number selectors",
"additionalProperties": {
"type": "string"
}
}
}
}
},
"services": {
"type": "object",
"description": "Translations for service actions",
"additionalProperties": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Service action name"
},
"description": {
"type": "string",
"description": "Service action description"
},
"fields": {
"type": "object",
"description": "Field translations",
"additionalProperties": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Field name"
},
"description": {
"type": "string",
"description": "Field description"
}
}
}
},
"sections": {
"type": "object",
"description": "Collapsible section labels",
"additionalProperties": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Section name"
}
}
}
}
}
}
},
"entity": {
"type": "object",
"description": "Translations for entities",
"additionalProperties": {
"type": "object",
"description": "Entity domain (sensor, binary_sensor, etc.)",
"additionalProperties": { "additionalProperties": {
"type": "object", "type": "string"
"description": "Entity translation_key",
"properties": {
"name": {
"type": "string",
"description": "Entity name (only for entities with has_entity_name=True)"
},
"state": {
"type": "object",
"description": "State translations",
"additionalProperties": {
"type": "string"
}
},
"state_attributes": {
"type": "object",
"description": "Entity state attribute translations",
"additionalProperties": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Attribute name"
},
"state": {
"type": "object",
"description": "Attribute state translations",
"additionalProperties": {
"type": "string"
}
}
}
}
},
"unit_of_measurement": {
"type": "string",
"description": "Unit of measurement translation (for sensor/number entities)"
}
}
} }
} },
}, "data_description": {
"entity_component": {
"type": "object",
"description": "Translations for entity components (if integration provides entities under its domain)",
"additionalProperties": {
"type": "object", "type": "object",
"description": "Device class or '_' for default", "description": "Descriptions for input fields",
"properties": { "additionalProperties": {
"state": { "type": "string"
"type": "object",
"description": "State translations for this device class",
"additionalProperties": {
"type": "string"
}
},
"state_attributes": {
"type": "object",
"description": "Attribute name and state translations",
"additionalProperties": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Attribute name"
},
"state": {
"type": "object",
"description": "Attribute state values",
"additionalProperties": {
"type": "string"
}
}
}
}
}
} }
} },
}, "sections": {
"device": {
"type": "object",
"description": "Translations for device names",
"additionalProperties": {
"type": "object", "type": "object",
"properties": { "description": "Labels for form sections (only if form has sections)",
"additionalProperties": {
"type": "object",
"properties": {
"name": { "name": {
"type": "string", "type": "string",
"description": "Device name (set device's translation_key to use this)" "description": "Section label"
} }
}
} }
}
} }
}
}, },
"device_automation": { "error": {
"type": "object", "type": "object",
"description": "Translations for device automations", "description": "Error messages returned by the flow",
"properties": { "additionalProperties": {
"action_type": { "type": "string"
"type": "object", }
"description": "Device action translations",
"additionalProperties": {
"type": "string"
}
},
"condition_type": {
"type": "object",
"description": "Device condition translations",
"additionalProperties": {
"type": "string"
}
},
"trigger_type": {
"type": "object",
"description": "Device trigger translations",
"additionalProperties": {
"type": "string"
}
},
"trigger_subtype": {
"type": "object",
"description": "Device trigger subtype translations (e.g., button names)",
"additionalProperties": {
"type": "string"
}
}
}
}, },
"exceptions": { "abort": {
"type": "object", "type": "object",
"description": "Translations for HomeAssistantError and subclasses", "description": "Abort messages (supports Markdown)",
"additionalProperties": { "additionalProperties": {
"type": "object", "type": "string"
"properties": { }
"message": {
"type": "string",
"description": "Exception message (supports placeholders)"
}
}
}
}, },
"issues": { "progress": {
"type": "object", "type": "object",
"description": "Translations for repairs issues", "description": "Progress messages for async_show_progress (supports Markdown)",
"additionalProperties": { "additionalProperties": {
"type": "object", "type": "string"
"properties": { }
"title": { },
"type": "string", "create_entry": {
"description": "Issue title" "type": "object",
}, "description": "Success dialog messages (supports Markdown)",
"description": { "properties": {
"type": "string", "default": {
"description": "Issue description (exactly one of 'description' or 'fix_flow' must be present)" "type": "string",
}, "description": "Default message if async_create_entry called with description=None"
"fix_flow": {
"type": "object",
"description": "Repair flow translations (same format as config flow, exactly one of 'description' or 'fix_flow' must be present)"
}
}
} }
},
"additionalProperties": {
"type": "string",
"description": "Custom messages for specific description keys"
}
} }
}
},
"options": {
"type": "object",
"description": "Translations for the options flow (same format as config)"
},
"config_subentries": {
"type": "object",
"description": "Translations for config subentry flows (map of subentry types, each with same format as config)",
"additionalProperties": {
"type": "object"
}
},
"selector": {
"type": "object",
"description": "Translations for selector options. The key is the translation_key set in SelectSelectorConfig. CRITICAL: Use selector.{translation_key}.options.{value}, NOT selector.select.{translation_key}",
"additionalProperties": {
"type": "object",
"properties": {
"options": {
"type": "object",
"description": "Option label translations for select selectors. Keys must match the values passed in the options list.",
"additionalProperties": {
"type": "string"
}
},
"unit_of_measurement": {
"type": "object",
"description": "Unit translations for number selectors",
"additionalProperties": {
"type": "string"
}
}
}
}
},
"services": {
"type": "object",
"description": "Translations for service actions",
"additionalProperties": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Service action name"
},
"description": {
"type": "string",
"description": "Service action description"
},
"fields": {
"type": "object",
"description": "Field translations",
"additionalProperties": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Field name"
},
"description": {
"type": "string",
"description": "Field description"
}
}
}
},
"sections": {
"type": "object",
"description": "Collapsible section labels",
"additionalProperties": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Section name"
}
}
}
}
}
}
},
"entity": {
"type": "object",
"description": "Translations for entities",
"additionalProperties": {
"type": "object",
"description": "Entity domain (sensor, binary_sensor, etc.)",
"additionalProperties": {
"type": "object",
"description": "Entity translation_key",
"properties": {
"name": {
"type": "string",
"description": "Entity name (only for entities with has_entity_name=True)"
},
"state": {
"type": "object",
"description": "State translations",
"additionalProperties": {
"type": "string"
}
},
"state_attributes": {
"type": "object",
"description": "Entity state attribute translations",
"additionalProperties": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Attribute name"
},
"state": {
"type": "object",
"description": "Attribute state translations",
"additionalProperties": {
"type": "string"
}
}
}
}
},
"unit_of_measurement": {
"type": "string",
"description": "Unit of measurement translation (for sensor/number entities)"
}
}
}
}
},
"entity_component": {
"type": "object",
"description": "Translations for entity components (if integration provides entities under its domain)",
"additionalProperties": {
"type": "object",
"description": "Device class or '_' for default",
"properties": {
"state": {
"type": "object",
"description": "State translations for this device class",
"additionalProperties": {
"type": "string"
}
},
"state_attributes": {
"type": "object",
"description": "Attribute name and state translations",
"additionalProperties": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Attribute name"
},
"state": {
"type": "object",
"description": "Attribute state values",
"additionalProperties": {
"type": "string"
}
}
}
}
}
}
}
},
"device": {
"type": "object",
"description": "Translations for device names",
"additionalProperties": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Device name (set device's translation_key to use this)"
}
}
}
},
"device_automation": {
"type": "object",
"description": "Translations for device automations",
"properties": {
"action_type": {
"type": "object",
"description": "Device action translations",
"additionalProperties": {
"type": "string"
}
},
"condition_type": {
"type": "object",
"description": "Device condition translations",
"additionalProperties": {
"type": "string"
}
},
"trigger_type": {
"type": "object",
"description": "Device trigger translations",
"additionalProperties": {
"type": "string"
}
},
"trigger_subtype": {
"type": "object",
"description": "Device trigger subtype translations (e.g., button names)",
"additionalProperties": {
"type": "string"
}
}
}
},
"exceptions": {
"type": "object",
"description": "Translations for HomeAssistantError and subclasses",
"additionalProperties": {
"type": "object",
"properties": {
"message": {
"type": "string",
"description": "Exception message (supports placeholders)"
}
}
}
},
"issues": {
"type": "object",
"description": "Translations for repairs issues",
"additionalProperties": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "Issue title"
},
"description": {
"type": "string",
"description": "Issue description (exactly one of 'description' or 'fix_flow' must be present)"
},
"fix_flow": {
"type": "object",
"description": "Repair flow translations (same format as config flow, exactly one of 'description' or 'fix_flow' must be present)"
}
}
}
} }
}
} }