Describe the issue you are experiencing
When an add-on is stopped manually via the HA UI, the Supervisor REST API (GET /addons/<slug>/info) returns state: "error" instead of state: "stopped".
Root cause: in supervisor/apps/app.py, container_state_changed() sets AppState.ERROR for ContainerState.FAILED without checking _manual_stop:
elif event.state == ContainerState.FAILED:
self.state = AppState.ERROR # _manual_stop is NOT checked here
When docker stop sends SIGTERM and the container exits with code 143 (SIGTERM not handled gracefully by the add-on), Docker records ContainerState.FAILED, which always results in AppState.ERROR regardless of whether the stop was intentional.
_manual_stop is correctly set to True in stop() and IS checked in watchdog_container() to skip unwanted restarts — but container_state_changed() ignores it entirely.
Proposed fix in container_state_changed():
elif event.state == ContainerState.FAILED:
self.state = AppState.STOPPED if self._manual_stop else AppState.ERROR
What type of installation are you running?
Home Assistant OS
Which operating system are you running on?
Other (e.g., Raspbian/Raspberry Pi OS/Fedora)
Steps to reproduce the issue
- Start any add-on (e.g. File editor / core_configurator)
- Stop it manually via Settings → Add-ons → Stop
- Query from SSH terminal:
curl -sSL -H "Authorization: Bearer $SUPERVISOR_TOKEN"
http://supervisor/addons/core_configurator/info
| python3 -m json.tool | grep '"state"'
- Observe: "state": "error" instead of "state": "stopped"
Anything in the Supervisor logs that might be useful for us?
2026-05-13 21:49:11.040 INFO (MainThread) [supervisor.docker.manager] Stopping addon_core_configurator application
2026-05-13 21:49:14.241 INFO (MainThread) [supervisor.docker.manager] Cleaning addon_core_configurator application
No errors logged — the state transition to ERROR happens silently in memory via container_state_changed().
System information
System Information
| version |
core-2026.5.1 |
| installation_type |
Home Assistant OS |
| dev |
false |
| hassio |
true |
| docker |
true |
| container_arch |
amd64 |
| user |
root |
| virtualenv |
false |
| python_version |
3.14.2 |
| os_name |
Linux |
| os_version |
6.12.85-haos |
| arch |
x86_64 |
| timezone |
Europe/Paris |
| config_dir |
/config |
Home Assistant Community Store
| GitHub API |
ok |
| GitHub Content |
ok |
| GitHub Web |
ok |
| HACS Data |
ok |
| GitHub API Calls Remaining |
5000 |
| Installed Version |
2.0.5 |
| Stage |
running |
| Available Repositories |
3009 |
| Downloaded Repositories |
19 |
Home Assistant Cloud
| logged_in |
false |
| can_reach_cert_server |
ok |
| can_reach_cloud_auth |
ok |
| can_reach_cloud |
ok |
Home Assistant Supervisor
| host_os |
Home Assistant OS 17.3 |
| update_channel |
stable |
| supervisor_version |
supervisor-2026.05.0 |
| agent_version |
1.8.1 |
| docker_version |
29.3.1 |
| disk_total |
56.0 GB |
| disk_used |
40.2 GB |
| nameservers |
fe80::229a:7dff:fe28:93d0, 192.168.1.1, 2a01:cb05:7e1:500:229a:7dff:fe28:93d0, 192.168.1.25 |
| healthy |
true |
| supported |
true |
| host_connectivity |
true |
| supervisor_connectivity |
true |
| ntp_synchronized |
true |
| virtualization |
|
| board |
generic-x86-64 |
| supervisor_api |
ok |
| version_api |
ok |
| installed_addons |
Matter Server (8.4.0), Piper (2.2.2), Samba share (12.6.1), Nginx Proxy Manager (2.1.0), Speech-to-Phrase (1.4.3), Advanced SSH & Web Terminal (23.0.9), OpenThread Border Router (2.16.8), vosk (1.6.1), Gazpar2HAWS (0.5.0), Zigbee2MQTT (2.10.1-1), AdGuard Home (6.1.3), File editor (6.0.0), Network UPS Tools (0.18.0), Mosquitto broker (7.1.0), Z-Wave JS UI (7.3.0), WG Easy 15+ (15.2.2) |
Dashboards
| dashboards |
5 |
| resources |
2 |
| views |
23 |
| mode |
storage |
Network Configuration
| adapters |
lo (disabled), enp1s0 (enabled, default, auto), hassio (disabled), docker0 (disabled), veth52dab75 (disabled), vethd8a6a64 (disabled), vethfa30f57 (disabled), veth42be94f (disabled), veth3b7bbdd (disabled), veth1fa731b (disabled), vethb6ea517 (disabled), wpan0 (disabled), vethf8f4f60 (disabled), vethb3fad12 (disabled), vethbae16bc (disabled), veth7f3c437 (disabled), veth0f9f0fa (disabled), vethd3f3d7a (disabled), vetha7febbd (disabled), veth4f15738 (disabled), veth33c53fc (disabled) |
| ipv4_addresses |
lo (127.0.0.1/8), enp1s0 (192.168.1.25/24), hassio (172.30.32.1/23), docker0 (172.30.232.1/23), veth52dab75 (), vethd8a6a64 (), vethfa30f57 (), veth42be94f (), veth3b7bbdd (), veth1fa731b (), vethb6ea517 (), wpan0 (), vethf8f4f60 (), vethb3fad12 (), vethbae16bc (), veth7f3c437 (), veth0f9f0fa (), vethd3f3d7a (), vetha7febbd (), veth4f15738 (), veth33c53fc () |
| ipv6_addresses |
lo (::1/128), enp1s0 (2a01:cb05:7e1:500:5bb7:5c2e:c4e9:60a3/64, fd87:3b15:78bc:a1f9:c9d1:4c4a:f525:c59e/64, fe80::f701:8192:4ceb:7abf/64), hassio (fd0c:ac1e:2100::1/48, fe80::60f4:18ff:fea9:6ba6/64), docker0 (fe80::411:e8ff:fe03:a0ce/64), veth52dab75 (fe80::1cc4:d0ff:fed5:f119/64), vethd8a6a64 (fe80::8c51:feff:fee4:3d31/64), vethfa30f57 (fe80::3058:4dff:fe74:7b13/64), veth42be94f (fe80::30e1:38ff:fe8b:51d4/64), veth3b7bbdd (fe80::e47d:37ff:fed6:b3f7/64), veth1fa731b (fe80::a461:c8ff:fe09:e9f4/64), vethb6ea517 (fe80::7810:7eff:fe6e:a15d/64), wpan0 (fd10:7e18:2341:7fc0:0:ff:fe00:fc11/64, fdd8:c6e1:96bb:1:2e:4c1a:2b36:8d8e/64, fd10:7e18:2341:7fc0:0:ff:fe00:fc10/64, fd10:7e18:2341:7fc0:0:ff:fe00:fc38/64, fd10:7e18:2341:7fc0:0:ff:fe00:8400/64, fd10:7e18:2341:7fc0:ec24:5d7c:83b6:c848/64, fe80::28bf:6438:f68b:a3b2/64), vethf8f4f60 (fe80::a8ee:66ff:fedc:c951/64), vethb3fad12 (fe80::24dd:38ff:fec1:ad43/64), vethbae16bc (fe80::4492:3cff:fe41:727f/64), veth7f3c437 (fe80::a4ae:96ff:fe95:8113/64), veth0f9f0fa (fe80::5c93:a0ff:fe6a:24db/64), vethd3f3d7a (fe80::f0b3:deff:febf:49be/64), vetha7febbd (fe80::44e:acff:fe1d:9292/64), veth4f15738 (fe80::f055:84ff:feaf:a69e/64), veth33c53fc (fe80::88b2:99ff:fe83:1681/64) |
| announce_addresses |
192.168.1.25, 2a01:cb05:7e1:500:5bb7:5c2e:c4e9:60a3, fd87:3b15:78bc:a1f9:c9d1:4c4a:f525:c59e, fe80::f701:8192:4ceb:7abf |
Recorder
| oldest_recorder_run |
2 mai 2026 à 9:34 PM |
| current_recorder_run |
13 mai 2026 à 9:46 PM |
| estimated_db_size |
622.20 MiB |
| database_engine |
sqlite |
| database_version |
3.49.2 |
Supervisor diagnostics
config_entry-hassio-44b94439c287847721776982e19a040f.json
Additional information
No response
Describe the issue you are experiencing
When an add-on is stopped manually via the HA UI, the Supervisor REST API (
GET /addons/<slug>/info) returnsstate: "error"instead ofstate: "stopped".Root cause: in
supervisor/apps/app.py,container_state_changed()setsAppState.ERRORforContainerState.FAILEDwithout checking_manual_stop:When
docker stopsends SIGTERM and the container exits with code 143 (SIGTERM not handled gracefully by the add-on), Docker recordsContainerState.FAILED, which always results inAppState.ERRORregardless of whether the stop was intentional._manual_stopis correctly set toTrueinstop()and IS checked inwatchdog_container()to skip unwanted restarts — butcontainer_state_changed()ignores it entirely.Proposed fix in
container_state_changed():What type of installation are you running?
Home Assistant OS
Which operating system are you running on?
Other (e.g., Raspbian/Raspberry Pi OS/Fedora)
Steps to reproduce the issue
curl -sSL -H "Authorization: Bearer $SUPERVISOR_TOKEN"
http://supervisor/addons/core_configurator/info
| python3 -m json.tool | grep '"state"'
Anything in the Supervisor logs that might be useful for us?
System information
System Information
Home Assistant Community Store
Home Assistant Cloud
Home Assistant Supervisor
Dashboards
Network Configuration
Recorder
Supervisor diagnostics
config_entry-hassio-44b94439c287847721776982e19a040f.json
Additional information
No response