## [1.4.1] - 2026-03-17 ### Fixed - `config.ini` now saves to `AppData\Local\Series3Watcher\` instead of `Program Files` — fixes permission denied error on first-run wizard save. - Config path resolution in both `series3_tray.py` and `series3_watcher.py` updated to use `sys.frozen` + `LOCALAPPDATA` when running as a PyInstaller `.exe`. - Status menu item now uses a callable so it updates every time the menu opens — was showing stale "Starting..." while tooltip correctly showed current status. - Settings dialog now opens in its own thread — fixes unresponsive tabs and text fields while the watcher loop is running. - Tray icon reverted to plain colored dot — custom icon graphic was unreadable at 16px tray size. `.ico` file is still used for the `.exe` file icon. ### Changed - Terra-View URL field in settings wizard now accepts base URL only (e.g. `http://192.168.x.x:8000`) — `/api/series3/heartbeat` endpoint appended automatically. - Test Connection button now hits `/health` endpoint instead of posting a fake heartbeat — no database side effects. - "terra-view URL" label capitalized to "Terra-View URL". - Default log path updated to `AppData\Local\Series3Watcher\agent_logs\series3_watcher.log`. - Installer now creates `agent_logs\` folder on install. - `BUILDING.md` added — step-by-step guide for building, releasing, and updating. ## [1.4.0] - 2026-03-12 ### Added - `series3_tray.py` — system tray launcher using `pystray` + `Pillow`. Color-coded icon (green=OK, amber=Pending, red=Missing, purple=Error, grey=Starting). Right-click menu shows live status, unit count, last scan age, Open Log Folder, and Exit. - `run_watcher(state, stop_event)` in `series3_watcher.py` for background thread use by the tray. Shared `state` dict updated on every scan cycle with status, unit list, last scan time, and last error. - Interruptible sleep in watcher loop — tray exit is immediate, no waiting out the full scan interval. ### Changed - `main()` now calls `run_watcher()` — standalone behavior unchanged. - `requirements.txt` updated to document tray dependencies (`pystray`, `Pillow`); watcher itself remains stdlib-only.
Series 3 Watcher v1.4.1
Monitors Instantel Series 3 (Minimate) call-in activity on a Blastware server. Runs as a system tray app that starts automatically on login, reports heartbeats to terra-view, and self-updates from Gitea.
Deployment (Recommended — Installer)
The easiest way to deploy to a field machine is the pre-built Windows installer.
- Download
series3-watcher-setup.exefrom the latest release on Gitea. - Run the installer on the target machine. It installs to
C:\Program Files\Series3Watcher\and adds a shortcut to the user's Startup folder. - On first launch the Setup Wizard opens automatically — fill in the terra-view URL and Blastware path, then click Save & Start.
- A coloured dot appears in the system tray. Done.
The watcher will auto-start on every login from that point on.
Auto-Updates
The watcher checks Gitea for a newer release approximately every 5 minutes. When a newer .exe is found it downloads it silently, swaps the file, and relaunches — no user action required.
Updates can also be pushed remotely from terra-view → Settings → Developer → Watcher Manager.
Building & Releasing
See BUILDING.md for the full step-by-step process covering:
- First-time build and installer creation
- Publishing a release to Gitea
- Releasing hotfix updates (auto-updater picks them up automatically)
Running Without the Installer (Dev / Debug)
pip install -r requirements.txt
python series3_tray.py # tray app (recommended)
python series3_watcher.py # console-only, no tray
config.ini must exist in the same directory. Copy config-template.ini to config.ini and edit it, or just run series3_tray.py — the wizard will create it on first run.
Configuration
All settings live in config.ini. The Setup Wizard covers every field, but here's the reference:
API / terra-view
| Key | Description |
|---|---|
API_ENABLED |
true to send heartbeats to terra-view |
API_URL |
Terra-View base URL, e.g. http://192.168.1.10:8000 — the /api/series3/heartbeat endpoint is appended automatically |
API_INTERVAL_SECONDS |
How often to POST (default 300) |
SOURCE_ID |
Identifier for this machine (defaults to hostname) |
SOURCE_TYPE |
Always series3_watcher |
Paths
| Key | Description |
|---|---|
SERIES3_PATH |
Blastware autocall folder, e.g. C:\Blastware 10\Event\autocall home |
MAX_EVENT_AGE_DAYS |
Ignore .MLG files older than this (default 365) |
LOG_FILE |
Path to the log file |
Scanning
| Key | Description |
|---|---|
SCAN_INTERVAL_SECONDS |
How often to scan the folder (default 300) |
OK_HOURS |
Age threshold for OK status (default 12) |
MISSING_HOURS |
Age threshold for Missing status (default 24) |
MLG_HEADER_BYTES |
Bytes to read from each .MLG header for unit ID (default 2048) |
RECENT_WARN_DAYS |
Log unsniffable files newer than this window |
Logging
| Key | Description |
|---|---|
ENABLE_LOGGING |
true / false |
LOG_RETENTION_DAYS |
Auto-clear log after this many days (default 30) |
COLORIZE |
ANSI colours in console — leave false on Win7 |
Tray Icon
| Colour | Meaning |
|---|---|
| Grey | Starting / no scan yet |
| Green | All detected units OK |
| Yellow | At least one unit Pending |
| Red | At least one unit Missing, or error |
Right-click the icon for: status, per-unit list, Settings, Open Log Folder, Exit.
terra-view Integration
When API_ENABLED = true, the watcher POSTs a telemetry payload to terra-view on each heartbeat interval. terra-view updates the emitter table and tracks the watcher process itself (version, last seen, log tail) in the Watcher Manager.
To view connected watchers: Settings → Developer → Watcher Manager.
Requirements
- Windows 7 or later
- Python 3.8 (only needed if running from source — not needed with the installer)
- Blastware 10 event folder accessible on the local machine
Versioning
Follows Semantic Versioning. Current release: v1.4.1.
See CHANGELOG.md for full history.
License
Private / internal — Terra-Mechanics Inc.