Changelog
All notable changes to this project are documented here.
This project follows Semantic Versioning.
[Unreleased]
Section titled “[Unreleased]”[0.2.1] - 2026-09-26 Current
- Linux ARM64 builds — prebuilt CLI and GUI for 64-bit ARM Linux (
aarch64-unknown-linux-gnu, glibc 2.35 or newer, such as Raspberry Pi OS Bookworm), offered by the install scripts - Release install test — every release is installed with its own install scripts on each platform before it is published, and the documented one-liners are checked again once it is live; each macOS DMG now has a
.sha256
Changed
Section titled “Changed”aranet syncwith no device and no default device configured now falls back to the last-used device, then (whenbehavior.load_cacheis on, the default) the most recently seen device in the local database, asreadandstatusdo. It used to scan and prompt for a device, or fail with “No device specified” when not run interactively- Where
aranet syncstores history — 0.2.1 stores history under the device address. History that 0.2.0 synced under any other identifier (a device name or part of one, a MAC address typed in lowercase or without colons, or part of a macOS device UUID) stays under that ID, andreport,historyandcachequeries for the old ID stop receiving new records. The first sync after upgrading downloads the device’s whole history buffer again under the address, andaranet sync --allsyncs the sensor once for each ID it is stored under. Thedevicefield in single-devicearanet sync --format jsonoutput is now also this address rather than the identifier given on the command line;aranet sync --alloutput is unchanged - History deduplication window — records within 30 s of a record already stored for the same device are skipped on every history write, including
aranet cache import(so an import can now report skipped duplicates that are not exact timestamp matches). Aranet devices measure at most once a minute, so real records are never this close. Duplicate rows already in the database are not removed. Rows that 0.2.0 stored were shifted by the length of their download, which can exceed 30 s, so the first download after upgrading that overlaps them (such asaranet history, which saves the whole buffer) may still add a copy aranet set smart-homewithout a value is now an error. 0.2.0 release builds read it asfalse, a request to turn Smart Home off- Service WebSocket — when the API key is sent as
?token=, a request with more than onetokenparameter is now rejected. 0.2.0 used the first one - The prebuilt
aranetCLI no longer includesaranet gui— installaranet-guior the macOS app for the desktop GUI (cargo install aranet-cli --features guistill builds it in) - Leaner
aranet-clibuilds —aranet-serviceis compiled only with theclifeature (it runsaranet server), soaranet-tui,aranet-guiand TUI-only builds no longer compile the HTTP server; the unusedaxumandtower-httpdependencies were removed - HTTP clients — outgoing requests (webhooks, InfluxDB, Prometheus push gateway, service client) use HTTP/1.1, and
aranet serverno longer accepts cleartext HTTP/2 (the standalonearanet-servicenever did). The CLI, TUI and GUI no longer read macOS/Windows system proxy settings;HTTP_PROXY,HTTPS_PROXYandNO_PROXYstill apply. When a webhook, InfluxDB or the Prometheus push gateway returns an error,aranet servernow reads the response body in its error message as UTF-8, whatever charset the response declares, as the standalonearanet-servicealready did - Releases — all seven crates take their version from the workspace manifest and are released with cargo-release: one
chore: release vX.Y.Zcommit, onevX.Y.Ztag on exactly that commit, and crates published to crates.io from that tag after the release binaries are built (CONTRIBUTING.md, “Releasing”) - GitHub Release titles and notes now come from this changelog
- Homebrew — one workflow (
.github/workflows/homebrew.yml) updates thecameronrye/aranettap after each release, and refuses to publish if a release asset is missing or doesn’t match its published.sha256; pre-releases no longer touch the tap - Screenshots — the screenshot workflow pushes its updates to a
screenshots/<tag>branch for review instead of committing tomain
Removed
Section titled “Removed”- Unused Homebrew formula sources (
distribution/homebrew/) and thearanet-cli.rb/aranet-gui.rbrelease assets that no tap installed
- Aranet2 and Aranet Radiation advertisements are decoded at the offsets real devices use; Radiation dose rate is no longer reported 10× too high
- History download no longer drops the newest record, and no longer spins forever if a device repeats a packet
- Duplicate history rows — re-syncing a device no longer inserts copies of records already stored. History timestamps are anchored when the device is queried, and a record within 30 s of one already stored for the same device is skipped as a duplicate (see Changed)
aranet syncresolves aliases likereadandstatusdo, and stores history under the connected device’s address like other commands (see Changed)aranet statusshows radon in pCi/L correctly (previously printed the Bq/m³ value with a pCi/L label);aranet reportlabels the radon threshold it actually counts, and its radon “time above” percentage now counts only records that have a radon valuearanet set smart-home true|falseis accepted (see Changed)- Service API —
offsetwithoutlimitno longer returns 500; a rejected device update no longer corrupts the running configuration - Service WebSocket — API keys containing
+,/or=now work from the dashboard, which URL-encodes the?token=value. Clients that send the key unencoded keep working (see Changed) - macOS — no longer leaks an OS thread on every Bluetooth connection. The shared Bluetooth adapter runs on a background thread of its own, so it keeps working for programs that use more than one tokio runtime, and it is replaced if its CoreBluetooth thread stops
- Install scripts —
aranet-cli-installer.sh/.ps1andaranet-gui-installer.sh/.ps1offer every published platform again, and the macOS installs no longer fail with a checksum mismatch - Checksums — the
.sha256files andsha256.summatch the signed macOS archives, andsha256.sumlists every archive - Linux CLI no longer needs GTK or libxdo installed
- Windows GUI no longer opens a console window; as a result,
aranet-gui --helpand--versionprint nothing in a Windows terminal (usearanetthere) - macOS app has its icon, minimum macOS version (11.0) and Bluetooth usage descriptions; the
aranet-guibinary in the macOS tarballs is Developer ID signed and notarized like the CLI aranet-cliwith only thetuifeature (cargo install aranet-cli --no-default-features --features tui) compiles; thearanetbinary now uses the library’s TUI instead of compiling a second copy of it
Security
Section titled “Security”- Linux BlueZ agent — aranet was already BlueZ’s default agent while running, and 0.2.0 approved every pairing and authorization request from any device. It now approves pairing, confirmation and authorization only for devices aranet has connected to (or tried to) since it started, and always rejects
AuthorizeService, which lets a remote device use the host’s own Bluetooth profiles (such as HID input). As before, these requests don’t reach the desktop’s agent while aranet runs; pair other devices from the desktop’s Bluetooth settings, or stop aranet first - Service logs no longer record request query strings, which could include the API key
- Dependencies updated to clear the 9 RustSec vulnerability advisories that affect 0.2.0’s lockfile:
h2(RUSTSEC-2026-0258),quick-xml(RUSTSEC-2026-0194, RUSTSEC-2026-0195),quinn-proto(RUSTSEC-2026-0185),rustls(RUSTSEC-2026-0285),rustls-webpki(RUSTSEC-2026-0098, RUSTSEC-2026-0099, RUSTSEC-2026-0104) andwebbrowser(RUSTSEC-2026-0257). This also replaces the unsoundanyhow,event-listener,lru,memmap2andrandreleases and the yankedspin0.9.8 - One TLS stack for HTTP: webhooks, InfluxDB export, the Prometheus push gateway and the TUI/GUI service client now use rustls on every platform, trusting the OS certificate store plus the bundled Mozilla roots. The Linux
aranetbinary no longer links OpenSSL. MQTT over TLS (mqtts://, themqttfeature ofaranet-service) still uses the platform TLS library untilrumqttcships a patchedrustls-webpki - GitHub Actions — every hand-written workflow gives its
GITHUB_TOKENonly the permissions each job needs (dist’s generatedrelease.ymlstill setscontents: writefor the whole workflow), every action is pinned to a full commit SHA, and no checkout leaves the token in its git config - Homebrew tap token — no longer handed to a third-party action
Known issues
Section titled “Known issues”- Aranet4 on Linux — connecting to an Aranet4 can fail with “Service discovery timed out”, most often the first time. On Linux, the Bluetooth library aranet uses gives BlueZ only 5 seconds to discover the sensor’s services, and the Aranet4 can take longer. A failed attempt can also leave the sensor connected until BlueZ drops the link. 0.2.0 behaves the same; the next release fixes both
[0.2.0] - 2026-03-28
Section titled “[0.2.0] - 2026-03-28”- Docker support - Multi-stage
Dockerfileanddocker-compose.ymlfor containerized deployment with BLE passthrough, health checks, and persistent storage - Homebrew formula automation - GitHub Actions workflow automatically publishes updated Homebrew formulae to the
cameronrye/homebrew-aranettap on each release - Cached summary reports - New
aranet reportcommand generates daily, weekly, and monthly summaries from synced local history without reconnecting to devices - Webhook notifications - HTTP POST alerts when CO2, radon, or battery thresholds are exceeded, with configurable endpoints, per-device cooldowns, and custom headers for Slack/Discord/PagerDuty integration
- InfluxDB export - Real-time sensor data export to InfluxDB v2 using line protocol, with configurable organization, bucket, and measurement names
- mDNS service discovery - Automatic network advertisement via
_aranet._tcp.local.and_http._tcp.local.so clients can discover the service without manual IP configuration - Grafana dashboard template - Pre-built dashboard (
grafana/aranet-dashboard.json) with panels for CO2 gauges, environment time series, radon/radiation, battery levels, and collector statistics - Improved web dashboard - Tab-based UI with Overview (live sparklines), History (interactive charts with statistics), and Service Status (collector health and per-device poll stats)
- Home Assistant MQTT auto-discovery - Optional MQTT discovery publishing with
mqtt.homeassistant = trueandmqtt.ha_discovery_prefix = "homeassistant"so Home Assistant can register supported sensors automatically - E2E API tests - 27 integration tests covering health, devices, readings, configuration, authentication, Prometheus metrics, and broadcast channel integration
- BLE adapter serialization - Semaphore-based locking ensures only one device uses the Bluetooth adapter at a time, preventing connection contention
- Staggered device startup - Devices start polling with a 5-second stagger to avoid adapter contention on boot
- Cached BLE manager - Shared
Managerinstance with automatic reset on D-Bus connection failure - Poll duration metric - New
aranet_device_poll_duration_msPrometheus gauge tracks how long each device poll takes - Staleness detection -
/api/devices/:id/currentnow returnsage_secondsandstalefields DeviceTypecapability methods -has_co2(),has_temperature(),has_humidity(),has_pressure()for querying sensor capabilities- Aranet Radiation ☢ symbol detection -
DeviceType::from_namenow recognizes the Unicode ☢ (U+2622) in device names
Changed
Section titled “Changed”- Aranet2 GATT protocol - Fixed parsing to use correct 12-byte format with proper field ordering (header, interval, age, battery, temp, humidity, status flags)
- Aranet2 status bit extraction - Status is now read from bits[2:3] (temperature status) instead of bits[0:1]
- Aranet2 humidity parsing - Humidity is now parsed as u16 LE divided by 10 (was u8 raw)
- BlueZ agent - Now registers as default agent with retry cap (max 3 attempts) and permanent failure state
- Prometheus metrics - Metrics are now filtered by device capabilities (e.g., Aranet2 won’t emit
aranet_co2_ppm) - Prometheus device labels - Device labels now use configured aliases when available
- MQTT topic naming - Published MQTT topics now use configured aliases when available and include radon average topics when the device reports them
- Passive monitor - Retries adapter acquisition on startup instead of exiting immediately; logs all consecutive errors
- Service discovery retry - Automatically disconnects and retries when BlueZ returns 0 services (stale state)
- Connection timeouts -
challenging_environment()preset now uses 90s connection / 30s discovery timeouts - Synchronized all crate versions to 0.2.1
Breaking
Section titled “Breaking”GET /api/devices/:id/currentnow returnsCurrentReadingResponsewithage_secondsandstalefields alongside the reading (previously returned rawStoredReading)- WebSocket query-token auth - the
tokenquery parameter is now accepted only on/api/ws; REST and metrics requests must sendX-API-Key
Internal
Section titled “Internal”- Bumped Rust edition to 2024 with minimum supported Rust version 1.90
- Removed legacy advertisement parsers (v1 format) — only v2 parsers are used
- Consolidated GATT reading parsers in
aranet-coreto delegate toaranet-types::CurrentReading - Extracted
spawn_staggered_device_tasks()helper to deduplicate collector startup logic
[0.1.13] - 2026-03-25
Section titled “[0.1.13] - 2026-03-25”- BlueZ Agent - Register a BlueZ agent on Linux to prevent BLE hangs during service discovery
- Fix BLE connection hang on Linux caused by unhandled BlueZ pairing/authorization requests
- Update vulnerable dependencies:
bytes1.11.1,quinn-proto0.11.14,rustls-webpki0.103.10,time0.3.47 - Ignore unpatchable
rustls-webpki0.102.x advisory (pinned byrumqttc)
[0.1.12] - 2026-02-01
Section titled “[0.1.12] - 2026-02-01”-
Diagnostics Module - Comprehensive Bluetooth diagnostics and troubleshooting
DiagnosticsCollectorfor gathering adapter info, connection stats, and recent errorsAdapterInfowith state detection (Available, PoweredOff, NotFound)ConnectionStatstracking success rates, connection times, and disconnection reasons- Global diagnostics collector accessible via
global_diagnostics()
-
Passive Monitoring - Monitor devices via BLE advertisements without connecting
PassiveMonitorfor low-power, connectionless monitoring- Support for more devices than the BLE connection limit
- Configurable deduplication and device filtering
-
Platform Module - Platform-specific BLE configuration and tuning
Platformdetection (macOS, Linux, Windows) with appropriate defaultsPlatformConfigwith recommended timeouts and scan durations- Cross-platform device aliasing with
DeviceAliasandAliasStore
-
Retry Logic - Configurable retry policies for BLE operations
RetryPolicywith immediate, fixed, and exponential backoff strategies- Configurable max attempts, delays, and jitter
-
History Improvements
HistoryCheckpointfor resumable history downloadsPartialHistoryDatafor incremental sync with checkpoint tracking- History sync progress events with record counts
-
Device Connection Improvements
ConnectionConfigfor configurable connection settingsSignalQualityenum for RSSI classification
-
Device Manager Improvements
AdaptiveIntervalfor smart polling that adjusts based on device activityDevicePriorityfor prioritizing certain devices during polling
-
Error Context - User-friendly error messages with actionable suggestions
ErrorContextwith message, retryable flag, and suggestion- Automatic classification of errors with retry guidance
-
New Commands
CancelOperation- Cancel long-running scans, syncs, and other operations- Background polling commands
- System service management from GUI/TUI
-
GUI Service Panel - Manage aranet-service from the desktop application
- View service status (installed, running)
- Install/uninstall system service (user-level, no admin required)
- Start/stop service controls
-
API Improvements
/api/health/detailedendpoint with database, collector, and platform diagnostics- Improved Prometheus metrics with better lock management
Changed
Section titled “Changed”- Improved Prometheus metrics collection performance
- Enhanced history sync events with progress tracking
- Synchronized all crate versions to 0.1.12
- Lock contention in Prometheus metrics endpoint
[0.1.11] - 2026-01-31
Section titled “[0.1.11] - 2026-01-31”-
MQTT Integration - Publish sensor readings to MQTT brokers for IoT integration
- Real-time publishing to configurable topics (
{prefix}/{device}/co2,/temperature, etc.) - TLS support via
mqtts://scheme - Configurable QoS levels (0, 1, 2), retain flag, and authentication
- Automatic reconnection with retry intervals
- Feature flag:
mqtt(included infullfeature)
- Real-time publishing to configurable topics (
-
Prometheus Metrics Endpoint - Export sensor data for monitoring and alerting
/metricsendpoint with Prometheus text format (0.0.4)- Sensor metrics:
aranet_co2_ppm,aranet_temperature_celsius,aranet_humidity_percent,aranet_pressure_hpa,aranet_battery_percent - Radon/radiation metrics when available
- Collector statistics:
aranet_collector_running,aranet_collector_uptime_seconds, poll success/failure counts - Optional push gateway support
- Feature flag:
prometheus(included infullfeature)
-
Service Management Commands
aranet-service service install [--user]- Install as system/user servicearanet-service service uninstall/start/stop/status [--user]- Control service
-
REST API Enhancements
POST /api/collector/startandPOST /api/collector/stop- Control background collectorGET /api/status- Full service status with collector stateGET/PUT /api/config- Runtime configuration managementPOST/PUT/DELETE /api/config/devices- Dynamic device management
-
GUI Improvements
- Multi-panel architecture: Device List, Device Detail, History, Comparison, Alerts, Service, Settings
- Export functionality (CSV/JSON) for historical data
- Comparison view for side-by-side multi-device analysis
- Alert system with threshold management and alert history
- Service panel for background collector control
- macOS native menu bar integration
- System tray with quick access to readings
- Light/dark theme support
-
TUI Service Tab - Monitor and control aranet-service from terminal dashboard
-
Service Client Library -
service-clientfeature in aranet-core for type-safe API access -
Downloads page on website with direct download links for all platforms
-
New icon assets with multiple resolutions (16px to 1024px)
-
docs/ARCHITECTURE.mdwith comprehensive technical documentation -
Troubleshooting guide on website
-
Entitlements for Bluetooth access on macOS GUI app
-
crates.io and docs.rs badges to all crate README files
-
Documentation website links in all crate README files
Changed
Section titled “Changed”- Updated screenshots in README and website
- Improved CI workflow for screenshots and site deployment
- Synchronized all crate versions to 0.1.11
Removed
Section titled “Removed”aranet-wasmcrate removed from workspace (was not published)ROADMAP.mdremoved in favor of website roadmap page
- Icon asset included in aranet-cli for crates.io publishing
- Screenshots and deploy-site workflow failures
- Removed references to non-existent CLI flags from troubleshooting documentation
[0.1.9] - 2026-01-22
Section titled “[0.1.9] - 2026-01-22”Changed
Section titled “Changed”- Replaced unmaintained
attycrate withstd::io::IsTerminal(resolves RUSTSEC-2024-0375) - Updated
rusqlitefrom 0.33 to 0.35 - Updated multiple dependencies to latest versions
- Marked
aranet-guiandaranet-wasmaspublish = false(not ready for release)
- CONTRIBUTING.md with contribution guidelines
- SECURITY.md with vulnerability reporting process
- GitHub issue templates for bug reports and feature requests
- Pull request template
[0.1.8] - 2026-01-19
Section titled “[0.1.8] - 2026-01-19”- TUI Dashboard Enhancements - Complete overhaul with 44 new features
- Navigation: Tab/Shift+Tab for tabs, j/k/arrows for devices, vim-style keybindings
- Auto-refresh: Readings update automatically based on device interval
- Trend indicators: Up/down/stable arrows next to readings
- Statistics: Min/Max/Avg CO2 stats, radon 1-day/7-day averages
- Alerts: CO2/radon threshold alerts with Info/Warning/Critical severity levels
- Alert history: View past alerts with ‘a’ key, sticky alerts with ‘A’
- Terminal bell: Audio alert on threshold breach (toggle with ‘b’)
- Sparkline charts: CO2/radon history with min/max labels and time axis
- Full-screen chart: Press ‘g’ for expanded chart view
- Multiple metrics: Stack temperature/humidity on chart with T/H keys
- Time range filter: 0=all, 1=today, 2=24h, 3=7d, 4=30d
- Scrollable history: PgUp/PgDn to scroll through records
- Export history: Press ‘e’ to export visible history to CSV
- Device filter: Cycle filter with ‘f’ (All/Aranet4/Radon/Radiation/Connected)
- Comparison view: Side-by-side device readings with ‘v’, cycle with
</> - Connect all: Connect to all known devices with ‘C’
- Device alias: Set friendly names with ‘n’ key
- Settings editing: Change interval with Enter, BLE range with ‘B’, Smart Home with ‘I’
- Threshold config: Adjust CO2/radon thresholds with +/- keys
- Theme support: Toggle light/dark theme with ‘t’ key
- Responsive layout: Auto-hide sidebar on narrow terminals, toggle with ’[’
- Wider sidebar: Toggle sidebar width with ’]’ key
- Mouse support: Click to select devices, tabs, and buttons
- RSSI signal strength: Visual signal bars for connected devices
- Device uptime: Shows how long device has been connected
- Battery warning: Alert when battery drops below 20%
- Reading age warning: Highlight stale readings (> 2x interval)
- Loading spinners: Visual feedback during connect/sync operations
- Status messages: Queue of messages with auto-dismiss timeout
- Confirmation dialogs: Y/N prompts before destructive actions
- Error details: View full error with ‘E’ key
- Help overlay: Press ’?’ for organized keyboard shortcuts cheatsheet
- Header bar: Shows connected count, avg CO2, alert count, indicators
- ASCII-only output: All indicators use pure ASCII characters for compatibility
[0.1.7] - 2026-01-18
Section titled “[0.1.7] - 2026-01-18”-
aranet-store crate - New SQLite-based local data persistence layer
- Store current readings and device metadata
- Cache history records from devices for offline access
- Incremental sync support (only download new records)
- Query by device, time range, with pagination
- Automatic deduplication of history records
- Platform-specific database locations:
- Linux:
~/.local/share/aranet/data.db - macOS:
~/Library/Application Support/aranet/data.db - Windows:
C:\Users\<user>\AppData\Local\aranet\data.db
- Linux:
-
CLI sync command - Download device history to local database
aranet sync --device <ADDRESS>for incremental syncaranet sync --device <ADDRESS> --fullfor complete re-download- Progress bar during history download
-
CLI cache command - Query cached data without device connection
aranet cache devices- List all cached devicesaranet cache stats- Show cache statistics (readings, history counts)aranet cache history- Query cached history with filtersaranet cache info- Show database path and size
Changed
Section titled “Changed”- All crate versions bumped to 0.1.7
[0.1.6] - 2026-01-18
Section titled “[0.1.6] - 2026-01-18”- Code coverage with cargo-llvm-cov - CI now reports test coverage via Codecov
- Property-based testing with proptest - Fuzz testing for all byte parsers
- aranet-types: CurrentReading parser fuzzing
- aranet-core: All device parsers (Aranet4, Aranet2, Radon, Radiation)
- aranet-core: Advertisement parsing fuzzing
- GUI tests - Component tests for AppState (6 new tests)
- TUI tests - Component tests for App key handling (6 new tests)
- Expanded MockDevice tests - Comprehensive coverage for history, settings, calibration
- Aranet Radiation advertisement parser panic - Fixed crash on malformed data (found by proptest)
Changed
Section titled “Changed”- Test count increased from 268 to 310+ tests
- All test modules now have comprehensive inline documentation
[0.1.5] - 2026-01-18
Section titled “[0.1.5] - 2026-01-18”- Multi-device passive watch mode -
aranet watch --passivemonitors ALL devices broadcasting advertisements - Device name identification in watch output:
[AranetRn+ 306B8] - CSV, JSON, and text output formats with device identification
[0.1.4] - 2026-01-17
Section titled “[0.1.4] - 2026-01-17”- Fix clippy warnings for Rust 2024 edition compliance
- Resolve collapsible if/else-if blocks in CLI styling code
- Remove unnecessary
.clone()on Copy types in tests - Fix manual range contains and clamp patterns
[0.1.3] - 2026-01-17
Section titled “[0.1.3] - 2026-01-17”- Rich CLI styling (now the default)
- Spinners for long-running operations (scan, connect, history download)
- Color-coded sensor values based on thresholds (CO2, radon, battery, humidity, temperature)
- Table formatting with
tabledfor history, info, alias, and scan output - Trend indicators in watch mode (up/down/stable arrows)
--styleflag:rich(default),minimal, orplainfor scripting--briefflag for status command (compact one-line output)- Device name headers in read output
- Air quality summary labels (Excellent, Good, Fair, Poor)
- Pressure unit conversion (
--inhg/--hpaflags)- Display pressure in inches of mercury (inHg) with
--inhg - Explicitly request hPa with
--hpa(default) - Configurable via config file (
inhg = true)
- Display pressure in inches of mercury (inHg) with
doctorcommand for BLE diagnostics- Checks Bluetooth adapter availability and permissions
- Scans for devices to verify BLE functionality
- Platform-specific troubleshooting tips (macOS, Linux, Windows)
- Numbered progress steps with colored status indicators
aliascommand for device managementalias list- Show all saved device aliases (now with table formatting)alias set <name> <address>- Create a friendly name for a devicealias remove <name>- Delete an alias- Use aliases anywhere a device address is expected
- Passive read mode (
--passiveflag onread)- Read sensor data from BLE advertisements without connecting
- Requires Smart Home integration enabled on the device
- Multi-device read support
- Specify multiple devices:
aranet read -d device1 -d device2 - Parallel reading from all devices
- Combined output in text, JSON, and CSV formats
- Specify multiple devices:
- Interactive device picker
- When no device is specified, scan and present a selection menu
- History date filters (
--since/--until)- Filter history by date range (RFC3339 or YYYY-MM-DD format)
- Progress bars for history download
- Visual progress indicator with percentage and current parameter
- Full AranetRn+ (Radon) sensor support with 4-byte radon history values
- History V2 protocol parsing with 10-byte header format
aranet-typescrate for platform-agnostic shared types- WebAssembly module foundation (
aranet-wasm)
- UUID mappings for history characteristics
- V2 history parsing header format
- macOS device identifier now uses CoreBluetooth UUID instead of placeholder address
Changed
Section titled “Changed”- Default style mode changed from
minimaltorich - Replaced unmaintained
attycrate withstd::io::IsTerminal - Refactored
cmd_historyto useHistoryArgsstruct (clippy compliance) HistoryRecordnow includes optionalradon: Option<u32>field- Improved error messages for BLE connection failures
[0.1.2] - 2026-01-16
Section titled “[0.1.2] - 2026-01-16”Core Library (aranet-core)
Section titled “Core Library (aranet-core)”- Device Discovery — Scan for nearby Aranet devices via BLE
- Current Readings — CO₂, temperature, pressure, humidity, radon, radiation
- Historical Data — Download measurement history with timestamps (V1 + V2 protocols)
- Device Settings — Read/write measurement interval, Bluetooth range, Smart Home
- Auto-reconnection — Configurable backoff and retry logic
- Real-time Streaming — Subscribe to sensor value changes via notifications
- Multi-device Manager — Manage multiple sensors simultaneously
- Event System — Connect/disconnect/reading event dispatcher
- Data Validation — Bounds checking with
ReadingValidator - CO₂ Thresholds — Helpers for green/amber/red status
- Mock Device — For testing without hardware
Supported Devices
Section titled “Supported Devices”| Device | Status |
|---|---|
| Aranet4 | Full Support |
| Aranet2 | Full Support |
| AranetRn+ (Radon) | Full Support |
| Aranet Radiation | Full Support |
CLI Tool (aranet-cli)
Section titled “CLI Tool (aranet-cli)”All core commands fully implemented:
scan— Discover nearby Aranet devicesread— Read current sensor measurementsstatus— Quick one-line reading with colored CO₂ statusinfo— Display device informationhistory— Download historical data (text, JSON, CSV)set— Modify device settings (interval, range, smart_home)watch— Continuous monitoring with auto-reconnectconfig— Manage configuration file (~/.config/aranet/config.toml)completions— Generate shell completions (bash, zsh, fish, PowerShell)
Features:
- JSON and CSV output formats for all commands
- Colored CO₂ status indicators (green/amber/red)
- Config file support with device, format, no_color, fahrenheit options
ARANET_DEVICEenvironment variable support--no-colorflag andNO_COLORenv var support
Testing
Section titled “Testing”- 310+ workspace tests (295+ run, 15 ignored for hardware-dependent tests)
- Property-based testing with proptest for all byte parsers
- Code coverage with cargo-llvm-cov (Codecov integration)
- Hardware tested: Aranet4 17C3C (FW v1.4.19), AranetRn+ 306B8 (FW v1.12.0)
- CI running on Ubuntu, macOS, Windows
Dependencies
Section titled “Dependencies”| Dependency | Version | Purpose |
|---|---|---|
| btleplug | 0.11 | Cross-platform BLE |
| tokio | 1.x | Async runtime |
| thiserror | 2.x | Error handling |
| clap | 4.x | CLI argument parsing |
| time | 0.3 | Date/time handling |
| serde | 1.x | Serialization |