-
v1.5.0 - SFM forwarder. Stable
released this
2026-05-11 12:37:32 -04:00 | 0 commits to main since this release[5-11-26] — v1.5.0
First release of the SFM event forwarder.
Added — SFM event forwarder
- Forward Blastware event binaries (+ paired BW ACH ASCII reports) to an SFM server. When
SFM_FORWARD_ENABLED=trueandSFM_URLis set, every event binary in the BW ACH watch folder is POSTed as multipart to/db/import/blastware_filealong with its<stem>_<ext>_ASCII.TXTpartner report (BW ACH convention; manual-export<binary>.TXTis also supported as a fallback). SFM parses the report and indexes the full per-channel stats (PPV, ZC Freq, Time of Peak, Peak Acceleration / Displacement, Peak Vector Sum + time, sensor self-check Pass/Fail, monitor-log timestamps) into a searchable database — no codec decoding required. - Idempotent forwarding. Forwarded files are tracked by sha256 in a JSON state file (default
<log dir>/sfm_forwarded.json, override viaSFM_STATE_FILE). Re-scans don't re-POST and the state survives restarts / auto-updates. - Re-pair on late-arriving TXT. When the watcher forwards a binary alone (
_ASCII.TXTpartner didn't appear withinSFM_MISSING_REPORT_GRACE_SECONDS), the state file recordshad_report: false. On subsequent scans, the watcher re-checks whether the TXT has since arrived. If yes, the event is re-forwarded with the TXT attached — the SFM server's upsert path refreshes the DB row with the report's device-authoritative peak / project values. Without this, slow-disk or AV-interrupted TXT writes would permanently leave that event with broken-codec peaks in the SFM database. Legacy state-file entries (without thehad_reportfield) default tohad_report: trueso an upgrade doesn't unexpectedly re-forward existing entries. - Quiescence + grace-period guards. Files modified within
SFM_QUIESCENCE_SECONDS(default 5s) are skipped to avoid forwarding mid-write. If a binary's report partner hasn't appeared afterSFM_MISSING_REPORT_GRACE_SECONDS(default 60s), the binary is forwarded alone rather than blocking forever. - Per-pass rate cap.
SFM_MAX_FORWARDS_PER_PASS(default 500) drips first-deploy backfill instead of hammering the SFM server in one burst. At 60-secondSFM_FORWARD_INTERVAL_SECONDScadence that's ~30K events/hour throughput. Set to0for unlimited. Scan walks oldest-first so backfill advances chronologically and successive scans reliably progress. event_forwarder.py --seed-stateCLI mode. Walks the watch folder once, sha256s every in-window event, and marks them all as already-forwarded without POSTing anything. Recommended pre-deploy workflow on machines with a large historical archive — flipSFM_FORWARD_ENABLED=trueafter seeding and only events that appear from then on get forwarded.- SFM Forward tab in the Settings dialog with: Forward checkbox, SFM URL + Test button (GETs
/health), Forward Interval / Quiescence / Missing-Report Grace / HTTP Timeout / Max Events Per Pass spinboxes, State File entry with Browse... Save-time guard: enabling forwarding without a URL shows a validation error. - Histogram-aware log clarity. Histogram events (extensions ending in
H) don't get auto-exported reports from BW; the log distinguishes that case ((histogram, no report expected)) from a waveform with unexpectedly missing report (no report ⚠). - README "First-time deployment" section documenting the seed-state workflow + the rate cap as belt-and-suspenders for safe rollout on machines with hundreds of thousands of historical events.
- 31 new unit tests in
test_event_forwarder.pycovering filename matching, state idempotency, scan logic (quiescence / grace period / max age / already-forwarded / TXT pairing), multipart byte shape, rate cap (oldest-first, cap=0 unlimited, cap=N enforcement), seed-state mode (in-window seeding / max-age skip / end-to-end skip-after-seed / idempotent re-runs), histogram classification, and an end-to-end POST against a stdlib fake server.
Configuration
New
[agent]keys (all default-off — existing 1.4.x deployments don't change behaviour on auto-update):Key Default Notes SFM_FORWARD_ENABLEDfalseMaster toggle for the forwarder SFM_URLempty e.g. http://10.0.0.44:8200SFM_FORWARD_INTERVAL_SECONDS60Scan-and-forward cadence SFM_QUIESCENCE_SECONDS5Skip files modified in the last N seconds SFM_MISSING_REPORT_GRACE_SECONDS60Forward without TXT after this delay SFM_HTTP_TIMEOUT60Per-request HTTP timeout SFM_STATE_FILE<log dir>/sfm_forwarded.jsonOverride location of the forwarded-sha256 state file SFM_MAX_FORWARDS_PER_PASS500Per-scan cap ( 0= unlimited)Compatibility
- Requires SFM server v0.16+ (the
/db/import/blastware_fileendpoint that accepts paired_ASCII.TXTreports + the BW-report label normalisation — released alongside this watcher version on the seismo-relay side).
Downloads
- Forward Blastware event binaries (+ paired BW ACH ASCII reports) to an SFM server. When
-
v1.4.4 Stable
released this
2026-03-18 01:34:30 -04:00 | 12 commits to main since this releaseDownloads
-
released this
2026-03-17 21:12:39 -04:00 | 14 commits to main since this release[1.4.3] - 2026-03-17
Added
- Auto-updater now logs all activity to the watcher log file (
[updater]prefix) — silent failures are now visible. - Configurable update source:
UPDATE_SOURCE = gitea(default),url, ordisabled. Inurlmode the watcher fetchesversion.txtand the.exefrom a custom base URL (e.g. terra-view) instead of the Gitea API — enables updates on isolated networks that cannot reach Gitea.disabledturns off automatic checks while keeping the remote push path (from terra-view) functional. - New Updates tab in the Settings dialog to configure
UPDATE_SOURCEandUPDATE_URL.
Fixed
- Downloaded
.exeis now validated before applying: absolute size floor (100 KB), relative size floor (50% of current exe), and MZ magic bytes check. A corrupt or truncated download is now rejected and logged rather than silently overwriting the live exe. - Swap
.batnow backs up the current exe as<exe>.oldbefore overwriting, providing a manual rollback copy if needed. - Swap
.batretry loop is now capped at 5 attempts — was previously infinite if the file remained locked. - Swap
.batnow cleans up the temp download file on both success and failure.
Downloads
- Auto-updater now logs all activity to the watcher log file (
-
v1.4.2 - status hotfix. Stable
released this
2026-03-17 16:30:53 -04:00 | 16 commits to main since this releaseChanged
- Tray icon color now reflects watcher + API health rather than unit ages — green=API OK, amber=API disabled, red=API failing, purple=watcher error.
- Status menu text updated to show
Running — API OK | N unit(s) | scan Xm ago. - Units submenu removed from tray — status tracking for individual units is handled by terra-view, not the watcher.
- Unit list still logged to console and log file for debugging, but no OK/Pending/Missing judgement applied.
watcher_statusfield added to heartbeat payload so terra-view receives accurate watcher health data.
Install
- To install on a new machine, please use the installer.exe (from 1.4.1, it will then automatically update to 1.4.2 after detecting the new release)
- If already running 1.4.1, it SHOULD auto update. (its still tbd if that actually works tho....)
Downloads
-
released this
2026-03-17 14:36:36 -04:00 | 19 commits to main since this releaseInstallation
New Install
- download the series3-watcher-setup.exe
- Run install wizard.
Existing Install update
- Should update automatically? (havent tested it yet tho)
[1.4.1] - 2026-03-17
Fixed
config.ininow saves toAppData\Local\Series3Watcher\instead ofProgram Files— fixes permission denied error on first-run wizard save.- Config path resolution in both
series3_tray.pyandseries3_watcher.pyupdated to usesys.frozen+LOCALAPPDATAwhen 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.
.icofile is still used for the.exefile icon.
Changed
- Terra-View URL field in settings wizard now accepts base URL only (e.g.
http://192.168.x.x:8000) —/api/series3/heartbeatendpoint appended automatically. - Test Connection button now hits
/healthendpoint 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.mdadded — step-by-step guide for building, releasing, and updating.
[1.4.0] - 2026-03-12
Added
series3_tray.py— system tray launcher usingpystray+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)inseries3_watcher.pyfor background thread use by the tray. Sharedstatedict 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 callsrun_watcher()— standalone behavior unchanged.requirements.txtupdated to document tray dependencies (pystray,Pillow); watcher itself remains stdlib-only.
Downloads