+# Changelog
All notable changes to SMART Sniffer are documented here.
Agent-only release. No integration or installer changes. Fixes smart-sniffer-app#6.
- Health endpoint no longer blocked by bearer token auth -- when a bearer token is configured,
/api/healthwas behind the auth middleware. External systems polling the health endpoint without a token (Supervisor watchdog, load balancers, monitoring tools) received 401 instead of 200, which caused the HAOS App's Supervisor watchdog to restart the container in a loop (~every 4 minutes). The health endpoint is now exempt from auth. It only exposes operational status (version, uptime, drive count) -- no SMART data or drive identifiers. Reported by @circa1665.
- Agent-only update. Rebuild or download the updated agent binary. No integration or installer changes needed.
- HAOS App users with a bearer token: update the agent to stop the watchdog restart loop. The App will also ship a workaround (TCP watchdog) for users who haven't updated the agent yet.
- Standalone agent users: this bug was invisible to you (nothing externally health-checks the standalone agent), but updating is still recommended.
Integration-only release. No agent or installer changes. Community contribution by @nsleigh.
smart_sniffer.get_drive_dataservice call -- returns the full cached SMART dataset for any agent, including raw attributes, our attention evaluation (state, severity, reasons), filesystem usage, and agent metadata. Designed for automation workflows that pipe drive data to an AI for analysis. Call it from an automation, pass the JSON to a conversation agent (Google AI, OpenAI, Claude, Ollama), and get back a plain-English health report. Also works from Developer Tools > Services for manual inspection. Implements #37, contributed by @nsleigh in PR #38.
- Integration-only update. Update via HACS or manually replace
custom_components/smart_sniffer/. No agent update needed. - New service: after updating, the
smart_sniffer.get_drive_dataservice appears in Developer Tools > Services. Select your agent from the dropdown and call it to see the full response.
Integration-only release. No agent or installer changes.
- Multi-variant SMART attributes no longer silently hidden -- drives that report multiple attributes from the same consolidated sensor group (e.g. both Wear_Leveling_Count and Remaining_Lifetime_Perc) previously only showed the first match. The other variants were suppressed by the diagnostic entity loop because they were considered "already covered." Now only the winning variant is suppressed -- the rest surface as disabled-by-default diagnostic entities like any other uncovered attribute. Most drives report a single variant and see no change. Drives with multiple variants (common on Silicon Motion controller SSDs, some WD/HGST enterprise drives) now expose the full picture.
- Integration-only update. Update via HACS or manually replace
custom_components/smart_sniffer/. No agent update needed. - Multi-variant drive users: after updating, check your drive's device page -- you may see new disabled diagnostic entities for attributes that were previously hidden. Enable the ones you care about.
Agent-only release. No integration or installer changes.
- Custom protocols in
device_overridesnow work -- the agent previously only passed-d satto smartctl, silently dropping any other protocol. Protocols likejmb39x-q,N(JMicron USB RAID bridges),usbcypress,megaraid,N, and others were accepted in the config but never sent to smartctl, causing "command line parse error" failures. The agent now passes any custom protocol through to smartctl via-d. Standard scan-detected protocols (ata, scsi, nvme) are still handled automatically. Fixes #29.
- v0.5.8 through v0.5.12 (installer-only, not individually changelogged):
- Drive picker -- the installer now shows all detected drives and lets you choose which ones to monitor. Remote transports (iSCSI, Fibre Channel) and unknown transports are flagged so you can exclude them. Useful for Proxmox hosts with iSCSI LUNs, NAS boxes with USB backup drives, or any setup where you don't want every block device polled.
exclude_devicesconfig field -- YAML list of device paths the agent skips during scan. Symlink-aware. Set automatically by the drive picker or manually in config.yaml.--discoverexclude annotation -- excluded devices show[excluded by config]in discovery output.- NVMe namespace path fallback -- the drive picker now correctly maps NVMe controller paths (e.g.
/dev/nvme0) to namespace paths (nvme0n1) for enrichment from lsblk. - Robust lsblk parsing -- switched from positional column parsing to
lsblk -Pkey-value pairs, eliminating column-alignment bugs when fields are empty.
- Agent-only update. Re-run the installer or replace the binary. No integration changes needed.
- If you use
device_overrideswith non-SAT protocols: update to v0.5.13 and your overrides will start working. Re-runsmartha-agent --discoverto verify.
Integration-only release. No agent or installer changes.
- SAS/SCSI drives now get basic monitoring -- temperature, power-on hours, and power cycle count now work for SAS drives (protocol "SCSI"). Previously these sensors returned nothing because the integration only had ATA and NVMe extraction paths. The data was already in the smartctl JSON output at the top level -- we just weren't reading it. SAS drives still report SMART health status as before; full SCSI attribute parsing (grown defect list, error counters, endurance indicators) is future work.
- Vendor-specific SMART attributes as diagnostic entities -- for ATA/SATA drives in the smartctl database, every named SMART attribute that isn't already a dedicated sensor now appears as a disabled-by-default diagnostic entity. Enable the ones you care about from your drive's device page. Covers attributes like erase counts, host writes, program/erase failures, available reserved space, and anything else your drive reports with a recognized name. Drives not in the smartctl database (where attribute names show as "Unknown") don't get junk entities.
- Internal refactor: ATA attribute name mapping moved to module level for reuse. No behavior change.
- Integration-only update. Update via HACS or manually replace
custom_components/smart_sniffer/. No agent update needed. - SAS users: reload the integration after updating to pick up the new sensors. Your SAS drives should immediately show temperature and power-on hours.
- ATA/SATA users: check your drive's device page after updating -- you'll see new disabled diagnostic entities in the entity list. Nothing changes on your dashboard unless you choose to enable them.
Installer-only patch. No agent, integration, or config changes.
- macOS installer crash during filesystem picker -- the bind-mount deduplication logic (added in v0.5.6) used bash 4+ associative arrays (
local -A), which crash on macOS's built-in bash 3.2. The grouping code is now gated behind amountinfocheck so it only runs on Linux, where bind mounts exist and bash 4+ is standard. On macOS and BSD, every filesystem entry is treated as canonical with no bind-mount grouping. No functional change on Linux. - macOS installer summary showed grep error -- the post-install IP detection used
grep -P(Perl regex), which is not available on macOS. Replaced with portablegrep -oEand reordered to tryifconfigbeforeipso macOS hits the working path first.
Agent + integration release. Both components updated.
- Wear level sensor now reports consistent "percentage used" across ATA and NVMe drives -- ATA SSDs report a normalized SMART value where 100 means "new" and 0 means "worn." NVMe drives report
percentage_usedwhere 0 means "new" and 100 means "worn" -- the opposite scale. Previously, the integration passed both values through as-is, so the same sensor meant opposite things depending on drive protocol. Now ATA values are inverted to match NVMe: 0% = new drive, 100% = fully worn. Breaking change: if you have automations based on the ATA wear sensor, your values will invert (e.g., a new Samsung 870 EVO previously showed 99, now shows 1). - Installer filesystem picker: bind mount deduplication -- the picker now parses
/proc/self/mountinfo(when available) and deduplicates entries by(source, fstype, root). Previously, bind mounts of the same filesystem appeared as separate entries, tripling the list on systems like ZimaOS. Falls back to/proc/mountsand thenmounton systems where mountinfo is not available. - Installer filesystem picker: path unescaping -- mount paths containing spaces, tabs, newlines, or backslashes are now displayed correctly. The kernel escapes these characters in mountinfo/proc output (
\040for space, etc.) and the installer previously showed the raw escaped strings. - Installer summary now shows the correct IP -- the post-install summary previously showed the first IP from
hostname -I, which on systems with Docker bridges or virtual interfaces was often an unreachable internal IP (e.g.,172.18.0.1). It now shows the IP of the mDNS-advertised interface you selected during setup.
- ATA SSD wear now triggers attention warnings -- ATA SSDs with wear level at 90% or higher (after inversion to "percentage used") now fire a WARNING in the Attention Needed sensor, matching the existing NVMe threshold. Previously only NVMe drives got wear-based attention warnings.
- btrfs filesystem fallback -- when
statvfsreturns zero for a btrfs mount (a known quirk on some multi-device or DUP-profile configurations), the agent falls back tobtrfs filesystem usage --rawfor accurate size/usage data. Requiresbtrfs-progsto be installed (most btrfs systems have it). Without it, the mount reports as(unknown size)in the picker and zero-byte usage from the API. - Installer: bind mount hiding -- bind mounts of subdirectories are hidden by default behind a
[+N bind mounts hidden]tag with a y/N prompt to reveal them. Reduces noise on systems with many bind mounts.
- Sensor name: "Wear Leveling / Percentage Used" renamed to "Wear Level (% Used)" for clarity.
- Both agent and integration should be updated. Replace the agent binary or re-run the installer. Update the integration via HACS or manually.
- Wear sensor breaking change: ATA SSD wear values are inverted. If you have automations checking wear level, review your thresholds. The sensor now consistently means "percentage of rated life consumed" for both ATA and NVMe. A new drive reads ~0-1%, a heavily worn drive reads 90%+.
- btrfs users: install
btrfs-progsif not already present for accurate filesystem reporting. The agent works without it but btrfs mounts will show zero usage.
Installer-only patch. No agent, integration, or config changes.
- macOS: installer now removes Gatekeeper quarantine flag -- files downloaded via curl get a
com.apple.quarantineextended attribute that blocks execution with an "unidentified developer" dialog. The installer now strips this automatically. Previously, macOS users had to runxattr -dmanually or navigate System Settings after install. - Installer interface picker labels updated -- the network interface picker now correctly tags LXC/LXD bridges, Proxmox interfaces, Podman, HA OS supervisor bridges, and tunnel/VPN interfaces. Previously only Docker, ZeroTier, Tailscale, WireGuard, libvirt, VirtualBox, and VMware were labeled.
Agent-only patch. No integration, installer, or config changes.
Fixes the mDNS agent advertising an unreachable container bridge IP on QNAP (and similar platforms), reported by @gbravery in #19.
- mDNS interface filter expanded from 10 to 51 prefixes -- the auto-filter now covers LXC/LXD bridges, Kubernetes CNI (Flannel, Calico, Cilium, Weave), Proxmox firewall interfaces, macOS system interfaces, Podman, Open vSwitch, and more. Previously, QNAP's LXC bridge (
lxcbr0) slipped through and the agent advertised its container IP instead of the LAN IP. Dangerous/ambiguous prefixes (bond, barebr,vlan,qvs) are intentionally excluded since they can be primary LAN interfaces on NAS platforms. - IP scoring now prefers 192.168.x over 10.x -- when multiple candidate IPs survive filtering,
192.168.x(almost always a home LAN) now scores higher than10.x(commonly used for containers, VPNs, and internal networks). Previously they scored equally and enumeration order broke the tie, which often picked the wrong one.
Agent-only patch. No integration, installer, or config changes.
Fixes drives being silently dropped when sleeping on agent startup, reported by @rolandg-reflow in #18.
- Drives no longer vanish when sleeping on startup -- the agent's first poll after starting now wakes all drives to collect a full SMART baseline (serial, model, attributes). This ensures every drive is registered with its stable serial-based ID immediately. Subsequent polls honor
standby_modenormally -- sleeping drives are skipped and cached data is served. Previously, a drive that was asleep on the first poll was silently dropped from the API because there was no cached data to serve.
Agent-only patch. No integration, installer, or config changes.
Fixes the SAT fallback not triggering on QNAP hardware reported by @gbravery in #16.
- SAT fallback now triggers on all smartctl execution failures -- the fallback previously only activated when smartctl reported "device open failed" (exit code bit 1). On QNAP, drives open fine under SCSI but return "command failed" (exit code bit 2) because the SMART commands don't work over the SCSI translation layer. The agent now retries with SAT on any of the three execution failure bits, covering both the Synology and QNAP failure modes.
--discoverno longer reports false positives -- the diagnostic tool previously reported "SMART data: Yes" for drives that returned execution errors other than "device open failed". It now correctly flags any execution failure as a problem and attempts SAT fallback.
Agent-only patch. No integration, installer, or config changes.
Addresses the PATH resolution issue reported by @EagleDTW in #17 -- Synology DSM (and other NAS platforms) ship an outdated smartctl in /usr/bin that shadows newer versions installed via package managers.
- smartctl path auto-resolution -- the agent no longer relies solely on
PATHto findsmartctl. If the version inPATHis missing or older than 7.0, the agent searches 13 known platform-specific install locations (SynoCommunity, Entware, Homebrew, MacPorts, NixOS, Unraid NerdTools, QNAP QPKG, standard Linux/BSD paths). The first 7.0+ binary found is used automatically. Zero new flags, zero config -- the agent finds the right binary itself. Logged on startup:using smartctl: /path/to/smartctl (version X.Y).
Agent-only release. No integration or installer changes required.
Addresses issues #16 (QNAP SATA drives misreported as SCSI) and #17 (Synology /dev/sata* paths not discovered by scan).
- NAS protocol auto-detection on startup -- the agent now uses
smartctl --scan-openon its first scan cycle instead of--scan. This opens device handles and gives more accurate protocol detection, which fixes QNAP HBAs that report SATA drives as SCSI. Subsequent cycles revert to regular--scanto avoid waking sleeping drives. - SAT fallback for misreported SCSI drives -- if a drive is reported as SCSI but smartctl cannot read it, the agent automatically retries with
-d sat(SCSI-to-ATA Translation). If that works, the agent uses SAT for that drive going forward and logs it once. No config required -- QNAP users affected by #16 should see this pick up their drives automatically. device_overridesconfig option -- for drives that need an explicit protocol the agent cannot auto-detect (Synology/dev/sata*paths, RAID controllers with custom-dsyntax), you can now list them inconfig.yaml. Overridden devices are treated as first-class drives even if they are not found by--scan.--discoverdiagnostic flag -- runsmartha-agent --discoverto probe every drive, test protocol detection, check SAT fallback, and print a clear summary of what the agent will see at runtime. On Synology, it also probes/dev/sata1through/dev/sata8. If any drives needdevice_overrides, it offers to write the config for you. Useful for support: paste the output into a GitHub issue and we can diagnose protocol problems without asking for manual smartctl runs.
- Agent update only. Replace the binary or re-run the installer. No integration update, config migration, or installer re-run is required.
- QNAP users affected by #16: update the agent -- no config change needed. The SAT fallback handles this automatically.
- Synology users affected by #17: update the agent and run
smartha-agent --discoverto generate thedevice_overridesblock for your config. Restart the agent after writing the config.
Integration-only release. No agent changes required.
- Drive Standby binary sensor -- each drive now has a dedicated Standby entity that reports on when the drive is spun down and off when it is active. When on, the sensor exposes a
data_as_ofattribute showing when the cached SMART readings were last refreshed. Makes it straightforward to automate on standby state directly rather than reading an attribute off the Health sensor. - Agent OS diagnostic sensor -- the agent device now exposes an OS entity reporting the agent host as linux, darwin, or windows. Visible by default; useful for at-a-glance inventory across mixed deployments.
- Scan Interval renamed to HA Poll Interval -- the existing agent diagnostic entity has been renamed to clarify that it represents how often Home Assistant polls the agent, not how often the agent itself reads SMART data from drives. The underlying entity is preserved, so existing automations and templates referencing the entity ID continue to work.
binary_sensor.*_healthattributesin_standbyanddata_as_of-- superseded by the newbinary_sensor.*_standbyentity (state anddata_as_ofattribute). The attributes remain on the Health sensor in this release for backward compatibility with v0.5.3 automations and will be removed in a future release. Tracked indocs/internal/process/deprecations.md.
- Integration update only. Update via HACS and reload. No agent update, installer re-run, or configuration change is required.
- Noisy agent logs from drives with error history -- drives with old error log entries (common on aged HDDs) caused the agent to log a warning every scan cycle, roughly 1,440 lines per day per drive. The agent now decodes the smartctl exit code properly: actual failures still warn, but informational flags about drive history are logged once and then suppressed.
- OS detection on Windows agents -- the health endpoint reported "unknown" for the OS field on Windows because it relied on a Unix-only command. Now uses Go's built-in platform detection and correctly reports "windows", "linux", "darwin", etc.
- Standby-aware polling for NAS users -- new
standby_modeconfig option prevents the agent from waking sleeping HDDs during scans. When a drive is in standby, the agent serves cached data instead of spinning the disk up. The installer detects spinning drives and offers to enable this automatically. Keeps your NAS quiet and your drives resting when they should be. - Agent connectivity sensor in Home Assistant -- a new binary sensor per agent shows Connected or Disconnected in real time. Unlike drive sensors that go "Unavailable" when the agent is offline, this sensor stays available and explicitly shows the connection state, making it easy to build automations around agent outages.
- Agent diagnostic entities -- version, last seen, IP, port, scan interval, and auth status are now available as entities under each agent device. Version is enabled by default; the rest are hidden by default and can be enabled in entity settings.
- Minimum smartctl version check -- the agent now verifies smartctl 7.0+ is installed before starting, with clear upgrade instructions if not. Older versions lack the JSON output the agent depends on, and previously failed silently.
- OS and uptime in health endpoint -- the agent's
/api/healthresponse now includes host OS and uptime, used by the new diagnostic entities. - Standby indicators on drive sensors -- when a drive is sleeping and being served from cache, its sensors gain
in_standbyanddata_as_ofattributes so you can tell the data is stale and how old it is. (Deprecated in v0.5.4 -- replaced by a dedicated Standby binary sensor. The v0.5.3 attributes remain for backward compatibility.)
- Agent update required. Re-run the installer or replace the binary to get the new features. Existing configs work without changes -- all new options default to current behavior.
- Integration update required. Update via HACS and reload to pick up the new connectivity sensor and diagnostic entities.
- NAS users with spinning drives: after updating the agent, re-run the installer to enable standby-aware polling, or manually add
standby_mode: standbyto your config.yaml.
- macOS/BSD: installer prints grep errors during agent summary -- three uses of
grep -P(Perl regex) in install.sh are not supported on macOS or BSD systems, which ship BSD grep. Replaced with portablegrep -oEandsedequivalents. The drive name display in the post-install summary was the visible failure; two others in the interface picker were latent (only reachable on Linux with busybox grep).
- macOS: filesystem picker writes "on" instead of actual mountpoint -- the install.sh parser assumed Linux
/proc/mountsfield positions, but macOSmountoutput uses a different format (/dev/disk3s1s1 on / (apfs, ...)). Field $2 is "on", not the mountpoint. Now detects macOS via$OSTYPEand parses correctly with sed. Also filters macOS virtual volumes (Preboot, Recovery, VM, xarts, iSCPreboot, Hardware, devfs, autofs) and usesdf -kinstead of the GNU-onlydf -B1. (HA Forum Post #43, reported by spry-salt) - Command Timeout false positives on USB drives -- SMART attribute 188 (Command_Timeout) was triggering MAYBE on any non-zero decoded value. Low counts (1-100) are normal from USB sleep/wake cycles, SATA power management (ALPM), and NCQ reordering. Backblaze data shows 84% of drives accumulate non-zero Command_Timeout over their lifetime -- the correlation is with elevated counts, not merely non-zero. Threshold raised from >0 to >100. (HA Forum Post #43, reported by spry-salt)
- Windows: winget source picker appears during smartmontools install -- added
--disable-interactivity --source wingetto suppress the interactive source selection prompt.
- Windows: interface picker in installer -- multi-homed Windows hosts can now select the mDNS advertise interface during install, matching the Unix installer. Virtual adapters (Hyper-V, TAP, Tailscale, WireGuard, WSL, Loopback) are labeled and shown separately. Single-adapter machines auto-select without prompting.
- Windows: filesystem picker in installer -- Windows installer now offers disk usage monitoring setup, matching the Unix installer. Enumerates fixed volumes via Get-Volume with human-readable sizes and percent used. Supports comma-separated selection, "all", or "none".
- Windows: upgrade-aware field migration -- upgrading from older configs now detects missing
advertise_interface(prompts only on multi-NIC) andfilesystemsfields, offering to add them. Append-only -- existing config is never rewritten. - Windows: real filesystem monitoring in agent -- replaced the stub
filesystem_windows.gowith a real implementation using Win32GetDiskFreeSpaceEx. Windows agents with filesystems configured now report actual disk usage data via/api/filesystems.
- Agent: timing-safe token comparison -- bearer token authentication now uses a constant-time comparison that is resistant to timing side-channel attacks. The previous implementation leaked information about the token with every failed request, making it theoretically possible to recover the full token one character at a time. The new approach reveals nothing about the token regardless of the input, matching the standard used by web frameworks and authentication libraries across the industry.
- macOS users seeing "statfs on failed": this release fixes the installer. Re-run the installer to regenerate config.yaml with correct mountpoints, then restart the agent.
- USB drive users seeing false MAYBE alerts: the Command Timeout threshold is now >100 instead of >0. Update the integration via HACS and reload to clear stale alerts.
- Windows users: significant update. Re-run the installer to get the interface picker, filesystem picker, and upgrade-aware field migration. The agent now supports real disk usage monitoring -- the installer will offer to set it up.
- Windows: agent service fails to start with Error 1053 (#13) — the Go binary was being registered as a Windows service but did not implement the Service Control Manager handshake, so SCM killed it after 30 seconds with the generic "service did not respond to the start or control request in a timely fashion" error. The agent now detects when it has been launched by the SCM, reports StartPending immediately, and reports Running the moment its HTTP listener binds. On boxes with many disks where the smartctl preflight scan takes longer than SCM's start window, a 20-second watchdog reports Running anyway so the scan can complete in the background without a 1053 timeout.
- Linux: agent fails to start on older distros with "GLIBC_2.32 not found" (#14) — Linux release binaries were dynamically linked against whichever glibc the GitHub Actions runner had installed (typically 2.34 or 2.32), making them incompatible with Debian 9, RHEL 7, and other long-term-support distros shipping older glibc. Linux builds are now statically linked via
CGO_ENABLED=0, removing the glibc version dependency entirely. Also makes the binary work unmodified on musl-based distros like Alpine.
- Windows: service startup and shutdown events in Event Log — the agent now writes to the Windows Event Log under source
SmartHA-Agent(installer registers the source automatically). Service start, stop, and failure events appear in Event Viewer → Windows Logs → Application with dedicated event IDs (1 started, 2 stopped, 100 startup failure, 101 runtime failure, 102 shutdown error). Operators debugging service issues no longer have to guess at causes from the Services panel alone. - Windows installer: config preservation on upgrade — re-running
install.ps1now detects an existingconfig.yaml, displays current settings, and asks to keep them (default yes). Matches the Unix installer behavior that had been shipped since v0.4.28 but missed on Windows. Upgraders no longer silently lose their bearer token, custom port, or scan interval when reinstalling for a version bump. - Windows installer: diagnostics on start failure — if
Start-Servicefails during install, the installer now dumps the current service status and the last 10 Event Log entries from our source in-line before exiting, so the user has the context to diagnose without opening Event Viewer.
- Agent: bounded graceful shutdown budget — shutdown phases (mDNS deregister, HTTP drain, coordinator close) now run under a single 8-second budget instead of an unconditional 5-second sleep. If a phase hangs, the installer logs which one stalled and how far along each phase got. Tuned to fire before Home Assistant Supervisor's 10-second stop timeout and well within Windows SCM's 20-second service-stop window, so the agent chooses what to drop rather than the OS killing it mid-cleanup.
- Build: Makefile VERSION derived from git —
makenow stamps binaries withgit describe --tags --always --dirtyby default so self-builders get an accurate version string in their binary. CI continues to set an explicit VERSION on the command line for releases.
- Windows users on Error 1053: this release is the fix. Re-run the installer; it will detect your existing config and preserve it, replace the binary, and re-register the service with the new SCM handler. No manual uninstall needed.
- Debian 9 / RHEL 7 / Alpine users on "GLIBC not found": this release is the fix. Re-run the installer — the new binary is statically linked and no longer depends on the host's glibc version.
- Home Assistant integration: no changes required. This is an agent-only release.
- macOS and modern Linux distros: nothing changes for you behaviorally; the agent gets the build-time and shutdown-budget improvements but nothing user-visible.
- Disk Usage monitoring — agents running v0.5.0+ with filesystem monitoring configured now report disk usage data. The integration creates a Disk Usage device per host with a percentage sensor for each monitored mountpoint (e.g., "Disk Usage — Root (/)"). Attributes include total, used, and available space in GB, plus mountpoint, device, and filesystem type. Use automations to alert when a disk fills up (e.g., trigger at 90%).
- Agent:
/api/filesystemsendpoint — serves real-time disk usage for mountpoints selected during install. Refreshes on the same interval as SMART data. - Agent: filesystem picker in installer — the install script now asks which mountpoints to monitor for disk usage. Writes selections to
config.yaml. Skipping this step disables disk usage monitoring (the endpoint is not registered).
- Integration: update via HACS as usual. Fully backward compatible — older agents (pre-0.5.0) continue to work with no changes and no new entities.
- Agent: to enable disk usage monitoring, update your agents to v0.5.0 by re-running the installer. The installer will ask which disks to monitor. Existing agents that don't upgrade will continue to work — they just won't show disk usage.
- New entities appear after reload: after upgrading an agent to v0.5.0, go to the SMART Sniffer integration page, click the three-dot menu on the agent, and select Reload. The new Disk Usage device and sensors will appear.
- Power-On Hours showing astronomically wrong values on some SATA drives — certain vendors (e.g., Seagate, HGST) pack additional counters (days, minutes) into the upper bytes of the 48-bit raw value for SMART attribute 9 (Power_On_Hours). The integration was displaying the full compound value (e.g., 165 trillion hours) instead of the actual hours stored in the lower 32 bits. Now parses the human-readable string first, falls back to masking. Same class of bug as the Command Timeout fix in v0.4.26 and the Wear Leveling fix in v0.4.30. (#10)
- Wear Leveling / Percentage Used showing raw write count instead of percentage — ATA wear-related attributes (
Media_Wearout_Indicator,SSD_Life_Left,Percent_Lifetime_Remain, etc.) were reading theRAW_VALUEcolumn from smartctl, which contains a vendor-specific counter (e.g., 1569 total writes). Now reads the normalizedVALUEcolumn (0–100), which is the actual percentage remaining. Fixes drives incorrectly showing values like "1,568%" instead of "100%". (#7)
- Release workflow: auto-extract changelog — GitHub Release body now pulls the current version's notes from CHANGELOG.md automatically, so HA update notifications show descriptive release info instead of a generic placeholder
- README: scan interval documentation — agent configuration section now documents Go duration syntax (
30s,5m,1h,24h) and notes that each poll wakes spun-down drives - README: roadmap additions — per-drive scan intervals, standby-aware polling, and YAML-based attribute definitions added to roadmap
- Agent: version in
/api/health— the health endpoint now returns{"status":"ok","version":"0.4.28"}, enabling the integration to detect outdated agents without relying solely on mDNS TXT records - Integration: agent version check + HA repair notifications — the coordinator checks the agent version every poll cycle. If the agent is older than
MIN_AGENT_VERSION, a repair card appears in Settings → Repairs with the agent hostname, current vs required version, and a one-liner upgrade command. The repair auto-clears once the agent is updated — no restart or user action needed inside HA - Integration: version warning at discovery — when adding a new agent via zeroconf, the config flow shows a warning if the discovered agent is outdated, without blocking setup
- Installer: config preservation on upgrade — re-running the installer now detects an existing
config.yaml, displays current settings (with masked token), and asks to keep them. Default is yes — press Enter to upgrade in place with no re-entry of port, token, or interval - Installer: interface picker on upgrade — configs from pre-v0.4.25 without
advertise_interfaceget a one-time interface prompt on multi-homed hosts, preventing mDNS from advertising on VPN/Docker interfaces - Installer:
utunvirtual interface detection — macOS VPN tunnels (ZeroTier, Tailscale) usingutunXinterfaces are now correctly identified as virtual and excluded from the default mDNS interface list - Agent:
--mdns-nameflag /mdns_nameconfig — allows overriding the mDNS instance name (default:smartha-<hostname>). Fixes mDNS collisions when multiple HA instances run the SMART Sniffer add-on on the same network — container hostnames are typically identical, causing only one agent to be discoverable. The HA add-on passes--mdns-name=smartha-<ha-hostname>derived from the Supervisor API to ensure unique names per instance
- Agent: armv7 (Raspberry Pi) binary — release workflow and Makefile now build
smartha-agent-linux-arm(ARMv7 hard-float, GOARM=7) alongside existing platforms. Enables native Raspberry Pi 2/3/4 installs and unblocks the HA add-on armv7 architecture build.
.gitignore: local docs folder —docs/internal/excluded from version control for project-private documentation
- Seagate/OEM Command Timeout false alerts — Seagate and OEM drives (e.g., OOS-series) pack three 16-bit counters into the 48-bit raw value for SMART attribute 188. The integration was comparing the full compound value against zero, triggering false MAYBE alerts on every affected drive. Now decodes to the lower 16 bits when raw value exceeds 0xFFFF. Applies to all vendors — detection is value-based, not vendor-based.
- Command Timeout sensor display — sensor entity was showing the raw compound value (e.g., 940 billion) instead of the decoded timeout count
- README: interface picker documentation — install section, agent configuration, and auto-discovery paragraphs now document the mDNS interface picker,
advertise_interfaceconfig, and multi-homed host guidance - README: updated install screenshot — now shows the interface picker flow
- README: documentation table — added links to Platform Install Paths and Agent Version Repair docs
- docs/agent-version-repair.md — design doc for HA repair notifications when agent version is too old
- Agent: mDNS interface filtering — auto-skips Docker, ZeroTier, Tailscale, WireGuard, and other virtual interfaces by default; only advertises on real LAN interfaces
- Agent:
advertise_interfaceconfig option — restrict mDNS to a specific interface (e.g.,advertise_interface: eth0) - Agent:
ip=mDNS TXT record — agent reports its preferred LAN IP so the HA integration doesn't have to guess - Agent:
--configflag — specify a custom config file path (smartha-agent --config /path/to/config.yaml) - Agent:
--interfaceflag — CLI override for mDNS interface (smartha-agent --interface eth0) - Installer: interface picker — during install, presents detected interfaces with labels (Docker, ZeroTier, etc.) and lets the user choose which to advertise on
- Integration: reads agent
ip=TXT field — trusts the agent's preferred IP over local scoring when available; falls back gracefully for older agents
- Duplicate mDNS discoveries from Docker bridges, VPNs, and mDNS reflectors surfacing the same agent at multiple IPs
- IPv6 addresses deprioritized in IP scoring (unreliable across VLANs in home networks)
- Zeroconf discovery now correctly selects real LAN IPs (10.x, 192.168.x) over Docker bridge IPs (172.17.x) on container-based systems like ZimaOS/CasaOS
- Switched config entry unique IDs from IP-based to hostname-based to prevent duplicate discoveries when mDNS reflectors surface the same agent on multiple IPs/VLANs; existing entries are migrated automatically
- Installer now probes for writable paths on immutable-rootfs platforms (ZimaOS, CasaOS); falls back to
/DATA/smartha-agent/or/opt/smartha-agent/ - New doc:
docs/platform-install-paths.md— explains platform-specific install locations and how to add new ones
- Re-cropped brand icons with tighter framing on magnifying glass + spies (eliminates letterboxing in HA UI)
- Zeroconf auto-discovery now requires user confirmation before adding an agent (previously no-auth agents were added silently)
- Updated
early-warning-attributes.md— corrected stalebinary_sensorreferences to enum sensor with proper state examples
- New brand icons cropped from header art (spy + magnifying glass) for HA integrations page
- Documented v0.4.21 fixes in build journal
- Removed
brands-repo-pr/directory (HA brands repo no longer accepts custom integration PRs) - Removed legacy platform-specific install scripts (superseded by unified
install.sh/install.ps1) - Cleaned committed build artifacts and
__pycache__from repo - Added GitHub issue templates (bug report, feature request)
- WD/HGST drives reporting ~214 billion °C temperature — packed 48-bit raw value now parsed correctly via
raw.stringwith bitmask fallback - Zeroconf discovery picking Tailscale VPN IP (100.x) over LAN IP — new
_pick_best_ip()prefers RFC 1918 private addresses asyncio.TimeoutErrornot caught in config flow — connection timeouts now show "Unable to connect" instead of stack traces
- Beta launch — new screenshots, CONTRIBUTING.md, SECURITY.md
- GitHub Sponsors and funding links
- Mock agent for testing (
tools/mock-agent.py) — simulates drives with controllable SMART attributes - Attention Reasons diagnostic entity — shows exactly what triggered the attention state
- Dynamic icons for attention sensor (per-state MDI icons)
- Expanded NVMe sensor coverage
- SMART FAILED status not triggering
YESattention state - Health sensor correctly reports
Unknownfor USB drives with no SMART data
- mDNS/Zeroconf auto-discovery — agents advertise
_smartha._tcp.local., HA discovers them automatically - Zeroconf config flow with pre-filled host/port and conditional token prompt
- Skip blank confirmation form for no-auth discovered agents
ZeroconfServiceInfoimport path compatibility for HA 2025.x+- mDNS instance name breaking with dotted hostnames on macOS
grandcat/zeroconfpulling stale Go x/ dependencies
- Uninstall support in
install.sh - Bearer token authentication for agent API
- Auth health check returning wrong status
install.shstdin handling forcurl | bashpiping- Uninstall env var clobbering
- "Text file busy" error on reinstall
- Bare number scan interval not appending
ssuffix
- Initial release
- Go agent (
smartha-agent) wrappingsmartctlwith HTTP REST API - Home Assistant custom integration with per-drive devices and sensors
- Early-warning attention system (Reallocated Sectors, Pending Sectors, Uncorrectable Errors)
- Persistent notifications on attention state changes
- Cross-platform installers (
install.shfor Linux/macOS,install.ps1for Windows) - GitHub Actions release workflow with cross-compilation and SHA256 checksums