Release Date: June 11, 2026
Version: 1.9.3
Platform: Arduino Opta + Blues Wireless Notecard
A production-ready industrial monitoring system for remote tank level monitoring, alarm management, and fleet coordination using cellular IoT connectivity.
TankAlarm is a complete industrial monitoring solution designed for reliable, remote tank level monitoring with SMS/email alerts. Built on the Arduino Opta industrial controller platform with Blues Wireless cellular connectivity, it provides enterprise-grade reliability without requiring WiFi or wired network infrastructure at remote sites.
The system consists of three components:
- Client - Remote monitoring device (deployed at tank sites)
- Server - Central data aggregation and alerting hub (office/headquarters)
- Viewer - Read-only monitoring device (optional, for remote viewing)
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
โ CLIENT โ โ SERVER โ
โ (Remote) โ โ (HQ/Office) โ
โ โข Monitors โ โ โข Dashboard โ
โ โข Sensors โ โ โข Alerts โ
โโโโโโโโฒโโโโโโโ โโโโโโโโฒโโโโโโโ
โ โ
โ Cellular โ Cellular
โผ โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ BLUES NOTEHUB (Cloud) โ
โ (Data Exchange & Device Management) โ
โโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โ Cellular/WiFi
โผ
โโโโโโโโโโโโโโโ
โ VIEWER โ
โ (Read-Only) โ
โโโโโโโโฌโโโโโโโ
โ
Ethernet LAN
(User Display)
- Multi-Sensor Support - Monitor up to 8 objects per device
- Analog voltage (0-10V)
- 4-20mA current loop (pressure sensors, level transmitters)
- Digital on/off (float switches)
- Pulse counting (flow meters, RPM sensors)
- Flexible Object Types - Tanks, engines, pumps, gas systems, flow meters
- Intelligent Alarming - Configurable high/low thresholds with hysteresis and debouncing
- Rate Limiting - Prevents alert flooding during transient conditions
- Relay Control - Automated shutoff with multiple modes (momentary, until_clear, manual_reset)
- Remote Configuration - Update all settings via server web interface
- Persistent Storage - LittleFS internal flash (no SD card required)
- Watchdog Protection - Automatic recovery from system hangs
- Low Power Design - Optimized for battery/solar operation
- Web Dashboard - Real-time monitoring of all clients
- SMS & Email Alerts - Immediate notifications for alarm conditions
- Daily Reports - Scheduled email summaries
- Remote Client Management - Configure any client from web interface
- RESTful API - Programmatic access for automation
- Fleet Management - Centralized control via Blues Notehub
- FTP Backup/Restore - Configuration archiving
- Client Console - Real-time serial log viewing for troubleshooting
- PIN Authentication - Secure access with constant-time comparison and rate limiting
- Configuration Import/Export - JSON-based backup and templating
- Config Comparison - Visual diff before deploying changes
- Unsaved Changes Warning - Prevents accidental data loss
- Audit Log - Track configuration changes with timestamps
- Contextual Tooltips - Inline help for complex configuration options
- Dashboard-Only - No configuration access
- Stale Data Warnings - Visual indicators for outdated readings
- Minimal Attack Surface - Secure deployment for public areas
- Notecard Sync - Automatic data updates from server
- Arduino Opta Lite - Industrial controller (STM32H747XI dual-core)
- Blues Wireless for Opta - Cellular Notecard carrier board
- Arduino Opta Ext A0602 (optional) - 4-20mA analog expansion for sensors
- Sensors - Compatible with 0-10V, 4-20mA, digital, or pulse outputs
- Power Supply - 12-24V DC (solar + battery recommended for remote sites)
- Arduino Opta Lite - Industrial controller
- Blues Wireless for Opta - Cellular Notecard carrier board
- Ethernet Connection - RJ45 to local network
- Power Supply - 12-24V DC
- Arduino Opta Lite - Industrial controller
- Blues Wireless for Opta - Cellular Notecard carrier board
- Ethernet Connection - RJ45 to local network
- Power Supply - 12-24V DC
| Type | Model | Interface | Application |
|---|---|---|---|
| Pressure Transmitter | Dwyer 626-06-CB-P1-E5-S1 | 4-20mA | Tank level (0-5 PSI) |
| Float Switch | Dayton 3BY75 | Digital | High/low level detection |
| Hall Effect Sensor | Generic | Pulse | Engine RPM monitoring |
| Flow Meter | Generic | Pulse | Liquid flow rate |
- Digital (Float Switches) - Binary on/off, 3.3V/5V compatible
- Analog Voltage - 0-10V (via Opta Ext A0602)
- 4-20mA Current Loop - Pressure transmitters, level sensors
- Pulse Counting - Flow meters, RPM sensors (up to 10 kHz)
Client (Remote Site):
- Install Blues Wireless for Opta carrier on Arduino Opta
- Activate Notecard at blues.io
- Connect sensors to appropriate inputs
- Connect 12-24V DC power (solar recommended)
Server (Office/HQ):
- Install Blues Wireless for Opta carrier on Arduino Opta
- Activate Notecard at blues.io
- Connect Ethernet cable to local network
- Connect 12-24V DC power supply
Prerequisites:
- Arduino IDE 2.x or later
- Arduino Mbed OS Opta Boards core (via Boards Manager)
Required Libraries:
- ArduinoJson v7.x or later
- Blues Wireless Notecard (latest)
- LittleFS (built into Mbed core)
- Ethernet (built-in)
Installation:
- Clone this repository
- Install TankAlarm-112025-Common library:
# Windows PowerShell (as Admin) New-Item -ItemType Junction -Path "$env:USERPROFILE\Documents\Arduino\libraries\TankAlarm-112025-Common" -Target "C:\path\to\ArduinoSMSTankAlarm\TankAlarm-112025-Common"
- Open the appropriate sketch in Arduino IDE:
- Client:
TankAlarm-112025-Client-BluesOpta/TankAlarm-112025-Client-BluesOpta.ino - Server:
TankAlarm-112025-Server-BluesOpta/TankAlarm-112025-Server-BluesOpta.ino - Viewer:
TankAlarm-112025-Viewer-BluesOpta/TankAlarm-112025-Viewer-BluesOpta.ino
- Client:
- Update
PRODUCT_UIDto match your Blues Notehub project - Compile and upload
- Create account at notehub.io
- Create a new product for your TankAlarm system
- Create three fleets:
tankalarm-server- For server device(s)tankalarm-clients- For all client devicestankalarm-viewer- For viewer device(s)
- Claim all Notecards into the product
- Assign each Notecard to the appropriate fleet
Detailed Instructions:
- Client Setup: TankAlarm-112025-Client-BluesOpta/README.md
- Server Setup: TankAlarm-112025-Server-BluesOpta/README.md
- Fleet Configuration: TankAlarm-112025-Server-BluesOpta/FLEET_SETUP.md
- Power on the server and wait for network connection
- Check serial monitor (115200 baud) for IP address
- Navigate to:
http://<server-ip>/ - Configure server settings and SMS/email recipients
- Configure clients remotely via the dashboard
- Lines of Code: 5,488
- Memory Footprint: ~150KB flash, ~30KB RAM
- Monitors per Device: Up to 8
- Sample Interval: Configurable (default: 30 minutes)
- Alarm Hysteresis: Configurable per monitor
- Watchdog Timeout: 30 seconds
- Cellular Connectivity: Blues Wireless Notecard (LTE-M/NB-IoT)
- Data Persistence: LittleFS internal flash
- Power Requirements: 12-24V DC, ~2W typical
- Lines of Code: 10,328
- Memory Footprint: ~300KB flash, ~100KB RAM
- Max Clients: 32 (expandable)
- Max Tanks: 64 total across all clients
- Web Server: HTTP (port 80)
- API Endpoints: 15+ RESTful endpoints
- Network: Ethernet (10/100 Mbps)
- Data Persistence: LittleFS internal flash
- Power Requirements: 12-24V DC, ~3W typical
- Lines of Code: 763
- Memory Footprint: ~100KB flash, ~20KB RAM
- Web Server: HTTP (port 80) - read-only
- Network: Ethernet (10/100 Mbps)
- Power Requirements: 12-24V DC, ~2W typical
The system uses Blues Notehub fleet-based routing for device-to-device communication:
- Client โ Server: Telemetry and alarms routed to
tankalarm-serverfleet - Server โ Client: Configuration updates routed to specific client device IDs
- Server โ Viewer: Status updates sent for dashboard display
Advantages:
- No hardcoded device IDs in firmware
- Simplified fleet management
- Automatic routing via Notehub
- Scalable to hundreds of devices
CLIENT BLUES NOTEHUB SERVER
โ โ โ
โโโโ telemetry.qo โโโโโโโโโโโโโโโค โ
โ (level data) โ โ
โ โโโโ fleet routing โโโโโถโ
โ โ โ
โโโโ alarm.qo โโโโโโโโโโโโโโโโโโโค โ
โ (alarm event) โ โ
โ โโโโ fleet routing โโโโโถโ
โ โ โ
โ โ โโ SMS/Email
โ โ โ Alerts
โ โ โ
โ โโโโโ config_push.qi โโโโค
โ โ (new config) โ
โโโโโโ route: device_id โโโโโโโโโค โ
โ (config received) โ โ
- PIN-based Access Control - Protect configuration endpoints
- Constant-Time PIN Comparison - Prevents timing attack analysis
- Authentication Rate Limiting - Exponential backoff with lockout after 5 failures
- Optional PIN - Can be disabled for trusted networks
- Session-based - PIN verified per-session
- All POST endpoints validate JSON structure
- Buffer overflow protection on string inputs
- Range checking on numeric values
- Client UID length validation with diagnostic logging
- Hash table bounds checking to prevent out-of-bounds access
- HTTP 400/401/429/500 status codes for error conditions
- HTTP Only - Deploy on trusted local networks
- No Internet Exposure - Server should not be internet-facing
- Ethernet Isolation - Physical network segmentation recommended
Note: HTTPS/TLS not currently supported. For internet-facing deployments, use VPN or reverse proxy with TLS termination.
- Tutorials Index: Tutorials/Tutorials-112025/README.md
- Client: TankAlarm-112025-Client-BluesOpta/README.md
- Server: TankAlarm-112025-Server-BluesOpta/README.md
- Fleet Setup: TankAlarm-112025-Server-BluesOpta/FLEET_SETUP.md
- Firmware Update Guide (OTA): Tutorials/Tutorials-112025/FIRMWARE_UPDATE_GUIDE.md
- Client MCUboot Provisioning: Tutorials/Tutorials-112025/CLIENT_MCUBOOT_PROVISIONING_GUIDE.md
- MCUboot Bootloader Options: CODE REVIEW/MCUBOOT_BOOTLOADER_OPTIONS.md
- Server/Viewer Update Strategy: CODE REVIEW/MCUBOOT_SERVER_VIEWER_SUGGESTIONS_06112026.md
Update model: The Client (field-deployed) supports secure, rollback-protected over-the-air (OTA) updates via MCUboot. The Server and Viewer are updated locally over USB. See the Server/Viewer strategy note above for the rationale.
- Relay Control: TankAlarm-112025-Client-BluesOpta/RELAY_CONTROL.md
- Unload Tracking: TankAlarm-112025-Client-BluesOpta/UNLOAD_TRACKING.md
- Device-to-Device API: TankAlarm-112025-Client-BluesOpta/DEVICE_TO_DEVICE_API.md
- Migration Guide: TankAlarm-112025-Client-BluesOpta/MIGRATION_GUIDE.md
- Security Fixes (Feb 2026): CODE REVIEW/SECURITY_FIXES_02062026.md
- Communication Architecture: CODE REVIEW/COMMUNICATION_ARCHITECTURE_VERDICT_02192026.md
- Data Usage Analysis: CODE REVIEW/DATA_USAGE_ANALYSIS_02192026.md
- Common Header Audit: CODE REVIEW/COMMON_HEADER_AUDIT_02192026.md
- v1.8.4 Release Notes: CODE REVIEW/V1.8.4_RELEASE_NOTES.md
- v1.1.8 Release Notes: CODE REVIEW/V1.1.8_RELEASE_NOTES.md
- v1.1.7 Release Notes: CODE REVIEW/V1.1.7_RELEASE_NOTES.md
- v1.1.6 Release Notes: CODE REVIEW/V1.1.6_RELEASE_NOTES.md
- v1.1.5 Release Notes: CODE REVIEW/V1.1.5_RELEASE_NOTES.md
- v1.1.4 Release Notes: CODE REVIEW/V1.1.4_RELEASE_NOTES.md
- v1.1.1 Release Notes: CODE REVIEW/V1.1.1_RELEASE_NOTES.md
- v1.0 Release Summary: CODE REVIEW/V1.0_RELEASE_SUMMARY.md
- v1.0.1 Release Notes: CODE REVIEW/V1.0.1_RELEASE_NOTES.md
- Advanced Features (Feb 2026): CODE REVIEW/ADVANCED_FEATURES_IMPLEMENTATION_02052026.md
- Historical Data Architecture: TankAlarm-112025-Server-BluesOpta/HISTORICAL_DATA_ARCHITECTURE.md
- Console Restrictions: TankAlarm-112025-Server-BluesOpta/CONSOLE_RESTRICTIONS.md
-
Hardware Validation
- All sensors reading correctly
- Relay control functioning
- Cellular connectivity stable
- Ethernet connectivity stable
-
Software Validation
- Firmware version 1.9.3 confirmed
- All clients reporting to server
- Alarms triggering correctly
- SMS/email alerts delivering
- Web dashboard accessible
-
Network Testing
- Blues Notehub routing configured
- Fleet assignments verified
- Server IP address documented
- Firewall rules configured (if applicable)
-
Burn-In Testing
- 48-hour continuous operation test
- Watchdog recovery test
- Power cycle recovery test
- Network failover test
- Flash all devices with v1.9.3 firmware
- Configure Blues Notehub fleet assignments
- Set server IP address and network configuration
- Configure SMS/email recipients
- Test alarm notifications
- Test relay control
- Verify web dashboard access
- Document device serial numbers and locations
- Establish backup schedule (FTP recommended)
- Enhanced email formatting (HTML, attachments)
- Historical data logging (30-day retention)
- Graphical trend charts
- Common header consolidation (centralize duplicated constants)
- Event-driven Notecard polling (
file.changes+ change trackers)
- Advanced analytics and reporting
- Predictive maintenance alerts
See LICENSE file for details.
For technical support, bug reports, or feature requests, please open an issue on GitHub.
- Blues Wireless Documentation: dev.blues.io
- Arduino Opta Documentation: docs.arduino.cc
- Bill of Materials: TankAlarm-112025-BillOfMaterials.md
SenaxTankAlarm/
โโโ TankAlarm-112025-Client-BluesOpta/ # Remote monitoring client
โโโ TankAlarm-112025-Server-BluesOpta/ # Central server & dashboard
โโโ TankAlarm-112025-Viewer-BluesOpta/ # Read-only viewer
โโโ TankAlarm-112025-Common/ # Shared library
โโโ CODE REVIEW/ # Code reviews & documentation
โโโ RecycleBin/ # Archived versions
โโโ Tutorials/ # Getting started guides
โโโ TankAlarm-112025-BillOfMaterials.md # Hardware BOM
โโโ README.md # This file
- Fixed Client OTA blocker (ODFU regression): The Client boot sequence was again configuring the Notecard for STM32 Outboard DFU (
card.dfu {"name":"stm32"}) โ the same setting v1.8.6 removed because the Blues Wireless for Opta carrier cannot drive ODFU. This caused every Notehub firmware update to fail with{odfu-fail}: stmConnectToBootloader: timeouteven though the image downloaded into the Notecard completely. The Client now sendscard.dfu {"name":"-"}at boot to actively clear the outboard host type (more robust than simply omitting the call, since the Notecard persists the prior setting). Notehub-delivered firmware now stays in Notecard storage for the host to pull viadfu.getand apply through MCUboot. - Clears ODFU before startup sync: The Client now enables the
userDFU channel and clears the persisted outboard host type before the first boot-timehub.sync, preventing the first sync after a USB update from re-entering the failing ODFU path.
- First OTA-test release for the MCUboot Client. Build sequence advanced to 192 so the field Client (running 1.9.1 / build 191) can perform a genuine MCUboot A/B swap to a higher version. This is the target image used to validate the staging โ swap โ confirm โ rollback path on the bench before fleet rollout.
- No functional code changes vs 1.9.1; version/build-sequence bump only.
- Client MCUboot OTA: The Client now updates over-the-air through the Arduino MCUboot bootloader, providing atomic A/B image swap and automatic rollback on a failed boot. Builds are compiled with
-DTANKALARM_DFU_MCUBOOTand published as a signed/encrypted.slot.bin. - QSPI storage redesign: The Client mounts its LittleFS configuration store on QSPI partition 4 and never reformats the whole device, reserving partition 2 for MCUboot OTA staging.
KeyProvisioningnow creates the full MBR partition table (p1 WiFi / p2 OTA / p3 KVStore / p4 user) before formatting the OTA partition. - Client-only update model: The Server (HQ) and Viewer (separate office) are updated locally over USB with their raw
.binand are intentionally not built with MCUboot, keeping them identical and avoiding QSPI partitioning. See CODE REVIEW/MCUBOOT_SERVER_VIEWER_SUGGESTIONS_06112026.md. - New provisioning tutorial: Tutorials/Tutorials-112025/CLIENT_MCUBOOT_PROVISIONING_GUIDE.md documents the one-time USB provisioning flow.
- Reverted Client to IAP firmware updates: Undid the v1.8.5 "Coordinated ODFU" change on the Client. The Blues Wireless for Opta carrier communicates with the Opta over the AUX/I2C expansion bus and does not route the STM32H747
BOOT0/NRST/USART1lines required for Notecard Outboard DFU (ODFU). The v1.8.5 outboardcard.dfupath therefore failed in the field with{odfu-fail}: stmConnectToBootloader: timeout. The Client now uses host-driven IAP (dfu.get+FlashIAP) again โ the mechanism that successfully delivered OTA host updates from v1.3.0 through v1.8.4. - Removed stuck outboard DFU enable: Dropped the boot-time
card.dfu {"name":"stm32","off":true}initialization and the RS-485 quiescing handshake that depended on unrouted hardware. - Documentation: Corrected DFU notes to reflect that ODFU is not supported on this carrier without a hardware change (Notecarrier CX/F or hand-wired
ALT_DFUlines); IAP remains the supported OTA path.
- Solar Charger Hardening: Fully resolved all R-1 to R-5 and SR-1 to SR-5 implementation review findings to fix no-charge alert false-trips under float charging conditions, prevent stale alert leaks on link drops, enforce strict battery voltage range and charge current plausibility clamps, cache functional codes efficiently, and standardize software-tracked daily limits.
- Release Refresh: Firmware versioning, package metadata, and release assets are synchronized to the current 1.8.4 source tree.
- Binary Assets: Client, server, and viewer
.binfiles are rebuilt and published under the 1.8.4 release naming.
- Genuine Hardware MAC Retrieval: Fixed a critical bug in standard Mbed OS parameterless
Ethernet.begin()where raw ethernet interface registration defaulted to temporary/empty MAC values. The Server now retrieves the exact factory block register MAC address (A8:61:0Ablock) viaEthernet.MACAddress(gMacAddress)before boots, ensuring local router IP reservations (such as192.168.7.117) are correctly matched and active. - Fail-Safe IP State Machine Fallback: Added auto-healing IP negotiation. If DHCP fails or a static IP subnet is misconfigured (e.g., mismatching local gateway range), the initialization dynamically pivots to try the companion network mode rather than failing the network setup completely.
- Improved Serial Interface Recovery: Hardened board interaction so host diagnostics and debug ports cleanly re-initialize COM configuration after DFU restarts.
- CI/Release Pipeline Modernization: Migrated GitHub Actions workflow dependencies to Node 24-compatible versions to stay ahead of the Node 20 runner deprecation timeline.
- Arduino CLI Install Hardening: Replaced action-based Arduino CLI setup in CI/release workflows with deterministic direct binary install (
arduino-cli 1.4.1) to reduce external runtime coupling and improve reliability. - Operational Note: Firmware application behavior is unchanged; this release focuses on build/release infrastructure resilience.
- Viewer Daily Print Reports: Added optional daily plain-text printing from Viewer Opta to LAN printers over JetDirect/Raw TCP (
9100). - Print Scheduling & Retry: New daily UTC-hour scheduler with retry throttling, day-boundary reset, and config validation for safer unattended operation.
- Print Delivery Hardening: Viewer now checks post-flush socket health and retries on transfer failure instead of marking the day as complete.
- Configuration Additions: Added
PRINT_ENABLED,PRINTER_IP_1..4,PRINTER_PORT, andPRINT_DAILY_HOURoptions inViewerConfig.hdefaults/examples.
- Per-Monitor Report Threshold: Change-based telemetry is now configured per sensor in the sensor's own unit (inches, PSI, RPM, GPM) via the new
reportThresholdfield, replacing the single globallevelChangeThreshold.0disables change-based telemetry for that sensor. (CONFIG_SCHEMA_VERSIONโ 3) - Universal Units in Alarm Logs: Client alarm serial log now labels readings with the monitor's own unit instead of a hardcoded
insuffix. - Alarm Hysteresis Fix: High and low alarm clear bands are now decoupled, so a latched alarm can no longer get stuck when thresholds are close relative to the hysteresis band.
- Sensor-Fault Hardening: Total current-loop acquisition failure, invalid sensor ranges, and unknown interfaces now escalate a
sensor-fault(return NAN) instead of reporting a plausible-but-fake0. - Wireless Command Safety: Relay/serial/location/sync command inboxes now peek-validate-execute-delete (and gate future schema versions) instead of deleting before processing.
- Server Identity/Schema Validation: System-alarm, daily, and sensor paths validate the client UID and reject future-schema notes; sensor index is range-checked.
- Config Dispatch & Offline Replay: Larger config snapshot capacity (4096B) and offline note replay buffer (2304B) so large multi-sensor configs and daily reports survive caching and outages.
- History Pruning: Hot-tier prune now compacts survivors and skips pre-time-sync snapshots, preventing wrong-entry drops after a clock correction.
- Daily Reconciliation: Daily reports always include the alarm array (schema 2+), so the server can clear orphaned alarms when a clear note was lost.
- Note:
NOTEFILE_SCHEMA_VERSIONremains2โ the telemetry/alarm/daily note wire format is unchanged.
- Data Integrity: Save all dirty data (registry, metadata, hot tier, history settings) before DFU/reboot โ previously only saved config
- Dedup Daily Summaries: Persist last rollup date and remove duplicates on reboot to prevent double-counted daily entries
- FTP Backup Expansion: Added
tank_registry.json,client_metadata.json, andhistory_settings.jsonto nightly FTP backup list - Crash Recovery: Added
hot_tier.jsonandarchived_clients.jsonto orphaned.tmpfile recovery - Warm Tier Fallback: FTP monthly archives now aggregate warm tier daily summaries when hot tier has no data for the target month
- SMS Rate-Limit Persistence:
lastSmsAlertEpochandsmsAlertsInLastHournow survive reboots via tank registry - FTP Sync Hour:
ftpSyncHoursetting now actually controls when nightly FTP archive runs (was previously ignored) - History Slots Warning: Rate-limited warning logged when all 20 tank history slots are exhausted
- Default Fix:
hotTierRetentionDaysdefault corrected from 730 to 90 to match actual ring buffer capacity - Stale Sensor Pruning: 3-layer auto-pruning system โ config-based periodic, per-sensor orphan (72h), dead client removal (7d)
- FTP Archive Before Removal: Clients active >30 days archived to FTP with date-stamped naming before deletion
- Archived Clients API: New
/api/history/archivedendpoint and Historical Data page section for browsing archived client data
- Naming Refactor: Complete elimination of tank-centric numbering from data model โ
tankNumberโsensorIndexwith new optionaluserNumberdisplay field - API Consistency: All JSON API keys, C++ locals, JS properties, and URL parameters updated from
"tank"to"sensorIndex"/"sensor" - Backward Compatibility Removal: ~50 dual-key JSON parsing fallbacks removed across all three firmware files
- Bug Fix: Client
saveConfigToFlash()now serializesmonitorType(was silently dropped) - Bug Fix: Client
serializeConfig()fixed to emitsensorIndexcorrectly - Documentation: 8 docs updated to reflect new naming conventions
- URL Param Rename:
/api/history?tank=โ?sensor=,/api/history/yoy?tank=โ?sensor=
- Viewer Fleet: Viewer devices now join dedicated
tankalarm-viewerfleet for fleet-scoped DFU and routing - Relay Forwarding: New
relay_forward.qo/.qiprotocol for client-to-client relay commands via server - Serial ACKs: Client emits
serial_ack.qoprocessing/complete status during serial log requests - Config ACK Enhancements: Config version hash (
cv) tracked through dispatch โ ACK cycle - ArduinoJson v7: Full migration to auto-sizing
JsonDocumentin Server and Viewer (removed all capacity constants) - Notecard Hardening: NULL-safe
card.uuidhandling across all three sketches - Watchdog Fix: Corrected macro name to
TANKALARM_WATCHDOG_AVAILABLEacross all components - Memory Safety: Use
JDeletefor unsent request cleanup; fix relay body allocation leak - Dead Code Removal: ~300 lines of unused helpers removed from Common headers
- Documentation: 14 tutorial guides updated for three-fleet architecture
- Security: Constant-time PIN comparison to prevent timing attacks
- Security: Authentication rate limiting with exponential backoff and lockout
- Security: Hash table bounds checking to prevent out-of-bounds memory access
- Security: Client UID length validation with diagnostic logging
- Security: Buffer boundary fix for FTP response parsing
- Server Console: Configuration import/export (JSON backup & templating)
- Server Console: Unsaved changes warning with browser prompt
- Server Console: Configuration comparison with visual diff before deploy
- Server Console: Audit log tracking last 50 configuration changes
- Server Console: Contextual tooltips for complex configuration fields
- Architecture: Communication architecture review and documentation
- Architecture: Data usage analysis for standard vs. proxy patterns
- Architecture: Common header audit identifying constants to centralize
- UI: Centralized CSS with browser caching for faster page loads
- Stability: JavaScript null-safety hardening across dashboard pages
- Stability: UTF-8 BOM and struct compilation fixes
- Centralized CSS into single cached stylesheet
- UI header standardization (Action Bar layout)
- JavaScript null-safety hardening
- Compilation fixes (UTF-8 BOM, struct definitions)
- Initial production release
- Client, Server, and Viewer firmware
- Blues Wireless fleet-based routing
- Web dashboard with SMS/email alerts
- LittleFS persistent storage
- Remote client configuration
Built with โค๏ธ for industrial IoT applications
Last Updated: June 11, 2026