plugins/home-assistant-dev/skills/ha-debugging/SKILL.md
Debug and troubleshoot Home Assistant integration issues. Use when mentioning error, debug, not working, unavailable, traceback, exception, logs, failing, ConfigEntryNotReady, UpdateFailed, or needing help diagnosing HA integration problems.
npx skillsauth add l3digital-net/claude-code-plugins ha-debuggingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Add to configuration.yaml:
logger:
default: warning
logs:
custom_components.{domain}: debug
homeassistant.config_entries: debug
View: Settings → System → Logs, or tail -f config/home-assistant.log
| Symptom | Likely Cause | Check |
| --- | --- | --- |
| Integration won't load | Import/manifest error | __init__.py, manifest.json |
| "Config flow could not be loaded" | Syntax error | config_flow.py, strings.json |
| "Unexpected exception" in setup | Unhandled error | Config flow validation |
| Entities "unavailable" | Coordinator UpdateFailed | coordinator.py |
| Entities don't appear | Missing platform forward | __init__.py, platform files |
| "ConfigEntryNotReady" | First refresh failed | Coordinator/API connection |
| State not updating | Subscription broken | Entity super().__init__() |
# Check relative imports
from .const import DOMAIN # RIGHT
from custom_components.my_integration.const import DOMAIN # WRONG
# Check manifest.json requirements
# Check __init__.py exists
async def async_step_user(self, user_input=None):
errors: dict[str, str] = {} # MUST initialize!
if user_input is not None:
try:
# validation
except Exception:
_LOGGER.exception("Setup failed") # Log actual error
errors["base"] = "unknown"
return self.async_show_form(..., errors=errors)
# Check coordinator raises UpdateFailed properly
async def _async_update_data(self):
try:
return await self.client.get_data()
except Exception as err:
raise UpdateFailed(f"Error: {err}") from err
# Check entity available property
@property
def available(self) -> bool:
return super().available and self._device_id in self.coordinator.data
# Check PLATFORMS list
PLATFORMS = [Platform.SENSOR, Platform.SWITCH]
# Check platform forwarding
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
# Check async_add_entities is called
async def async_setup_entry(hass, entry, async_add_entities):
entities = [MySensor(coordinator, "temp")]
async_add_entities(entities) # Must be called!
# WRONG
data = requests.get(url)
# RIGHT
data = await hass.async_add_executor_job(requests.get, url)
# Check inheritance order
class MySensor(CoordinatorEntity[MyCoordinator], SensorEntity): # Coordinator FIRST!
# Check super().__init__ is called
def __init__(self, coordinator):
super().__init__(coordinator) # REQUIRED!
# Check native_value reads from coordinator
@property
def native_value(self):
return self.coordinator.data.get("value")
# Validate JSON
python -c "import json; json.load(open('manifest.json'))"
python -c "import json; json.load(open('strings.json'))"
# Check syntax
python -m py_compile __init__.py
python -m py_compile config_flow.py
# Lint
ruff check .
# Type check
mypy .
# Check if loaded
grep '{domain}' config/home-assistant.log | tail -20
tools
Configures Python projects to the Python Tooling SSOT Standard (uv, Ruff, BasedPyright strict, pytest+coverage, pip-audit). Use when creating projects, writing standalone scripts, configuring pyproject.toml, migrating from pip/Poetry/mypy/black/flake8, or auditing a project for conformance to the standard.
development
Use when you're stuck or missing current information mid-task - the same command/API/approach failed twice, an error looks like a changed or deprecated API, or you need the current version of something, a fact from after your training cutoff, or to verify something you cannot confirm from the code in context. Starts with a cheap inline lookup and only escalates to a full research sweep if that fails. Do not use for routine pre-emptive checks before ordinary library work - for deliberate research, use /qdev:research.
documentation
Update the llm-wiki knowledge base (remote LXC CT 103, /srv/workspaces/llm-wiki, over SSH) with implementation-level details from the current session by dispatching the up-docs-propagate-wiki sub-agent. This skill should be used when the user runs /up-docs:wiki.
documentation
Update repository documentation (README.md, docs/, CLAUDE.md) based on session changes by dispatching the up-docs-propagate-repo sub-agent. This skill should be used when the user runs /up-docs:repo.