Releases: OceanDataTools/openrvdas
v2.5.1
Fixes a bug where all loggers appeared as "EXITED" in the UI after loading a cruise
configuration without restarting the logger manager. The status polling threads in
logger_manager.py could crash permanently on startup if no cruise was loaded in the
database yet, causing logger status to never reach the CachedDataServer. This release
broadens the exception handling in those threads so they recover gracefully and resume
normal operation once a cruise is loaded.
v2.5.0
What's Changed
-
Release v2.5.0: merge dev → master by @davidpablocohn in #561
New Components
#493)
- CachedDataServer HTTP GET API — simple field retrieval via HTTP GET for clients that
can't use WebSockets (#367, #550)
New Features
- ufw firewall support — Ubuntu installations can now optionally configure ufw
alongside the existing firewalld support for RHEL/CentOS (#553, #554) - Firewall prompts default to data pipeline UDP ports 6221–6226 (#555, #559)
- YAML configuration file validator (#516)
- Auto-generated API docs with pdoc and GitHub Actions workflow (#525)
- NMEA timestamp extraction in TimestampTransform (#518, #519)
- Comprehensive NMEA 0183 device type definitions (#515)
- Legacy NMEA met sentences MTA, MHU, MMB added to NMEA_Meteo (#521, #522)
- Trimble message definitions extended with additional formats and fields
- --tap argument for listeners (#480, #510)
- pyproject.toml and CLI entry points (#540, #544, #545)
Fixes & Improvements
- Fix MacOS install on Apple Silicon/Intel; improve install UX for all platforms (#471,
#531, #529) - Fix uwsgi setup failures and home-directory nginx socket permissions (#548, #549)
- Fix supervisord web interface binding to localhost only (#543)
- Fix supervisorctl requiring sudo on Ubuntu — patch supervisord.conf directly (#556,
#557) - Fix CachedDataServer rejecting connections under CentOS (#536, #537)
- Fix substitute_variables failing to expand multi-placeholder strings (#524)
- Fix serial writer test to work without socat (#532)
- Fix docs workflow to open PR instead of pushing directly to protected branch (#547)
- Skip modbus tests when pymodbus not installed (#487, #517)
- Add pytest to requirements.txt
- Unify CSIRO and CORIOLIX regex parse transforms (#507, #509)
- Deprecate install_influxdb.sh (#478, #490)
- Replace subprocess git tag retrieval with GitPython (#483)
- Handle int('123.0') edge case (#501)
- CachedDataServer HTTP GET API — simple field retrieval via HTTP GET for clients that
Full Changelog: v2.4.0...v2.5.0
v2.4.0
What's Changed
- Fix substitute_variables failing to expand multi-placeholder strings by @davidpablocohn in #524
- Merge dev → master: MacOS install fixes, API docs, WebsocketWriter, SSL improvements and component additions by @davidpablocohn-claude-bot in #535
- Remove stale markdown documentation in docs/
Full Changelog: v2.3.0...v2.4.0
v2.3.1
v2.3.0
Release v2.3.0
New Features
HTTPReader (#317)
Polling HTTP GET/POST reader with configurable interval, headers, JSON payload, and URL verification. Uses urllib (no external dependency).
ModbusSerialReader (#481, #487)
Polls Modbus RTU devices over RS-485 serial connections. Supports holding/input registers, coils, and discrete inputs; single and multi-slave operation; YAML scan-file configuration; exponential backoff for connection retries.
GoogleSheetsWriter (#457)
Writes DASRecord fields as rows to a Google Sheets spreadsheet via a Google Service Account. Auto-creates columns as new fields are encountered.
GrafanaLiveWriter (#491, #493)
New writer that pushes DASRecords to Grafana Live via the /api/live/push endpoint using InfluxDB Line Protocol. Supports dynamic sub-stream routing ({base_stream}/{data_id}/{message_type}), secure token loading (file, environment variable, or direct string), batching, and queue-based async HTTP dispatch.
Unified RegexParseTransform (#507, #493)
Unified regex-based text parser that reconciles the previously incompatible CORIOLIX and CSIRO parse transforms. Supports named patterns, device definition files, metadata injection, and optional field type conversion.
Comprehensive NMEA Device Definitions (#515)
New logger/devices/NMEA_0183.yaml with 13 device types and 87 format patterns covering standard NMEA sentences and proprietary extensions (PSXN, PASHR, PRDID, PGRMF, PKEL, PUBX, PTNL, etc.).
NMEA Timestamp Extraction in TimestampTransform (#518)
New NMEATimestampExtractor utility parses embedded timestamps from all common NMEA 0183 sentences (GGA, GLL, RMC, ZDA, GBS, GST, GNS, BWC, TLL, TTM) and proprietary sentences (PASHR, PGRMF, PTNL GGK/PJK, PUBX 00/04, PSIMSNS, PSIMSSB, PSXN 26). TimestampTransform gains use_nmea_timestamp, nmea_timestamp_timeout, and nmea_time_drift_threshold parameters with configurable drift/staleness warnings.
ConvertFieldsTransform (#493)
Converts string-format field values to typed Python values (float, int, str, bool, hex_int). Handles NMEA-style lat/lon conversion (DDMM.MMMM + N/S/E/W to signed decimal degrees). Accepts both flat and dict-of-dicts field specifications.
YAML Configuration Validator (#516)
New logger/utils/validate_config.py auto-detects and validates device definitions, logger configs, and cruise definitions with clear, actionable error messages. Includes a git pre-commit hook script (scripts/validate_yaml_precommit.sh).
Enhancements
mirror_totap/redistribution for Readers and Transforms (#480) —BaseModulegains amirror_toparameter that asynchronously copies every record to a specified Writer via a background thread, enabling data tapping without modifying primary logger configs.- Variable substitution default values (#475) — Extended syntax
<<var_name|default_value>>with support for nested defaults. listen.pypositional config file (#495) — A bare filename argument is now treated as--config_file, reducing required typing.- Modbus reader timing fix (#487) — Interval sleep now occurs before data retrieval for more accurate timestamps.
- RecordParser definition path — Now loads from both
logger/devices/*.yamlandcontrib/devices/*.yamlautomatically. - Deprecate formats.py type checking (#489) — Removed old
utils/formats.pycomponent type hierarchy from all readers, transforms, and writers in favor of Python native type hints withcan_process_record()/digest_record(). Added**kwargspropagation throughout.
Bug Fixes
- API
load-configuration-fileNameError (#511) — FixedNameError: name 'configuration' is not definedinapi_views.py; also fixed missingread_config()call inCruiseReloadCurrentConfigurationAPIView. - API serializer typo (#511) —
CruiseReloadCurrentConfiguartionSerializerrenamed toCruiseReloadCurrentConfigurationSerializer. - API URL and field typos (#511) —
/api/scheam/→/api/schema/;configuartion→configuration;realod→reload. - Skip Modbus tests when pymodbus not installed (#517) — Tests now skip gracefully on systems without the optional dependency.
- Handle
int('123.0')edge case (#501) —ConvertFieldsTransformnow converts viafloatfirst to avoidValueError.
Infrastructure & Tooling
- git_info.py utility (#482, #483) — New
utils/git_info.pyreturns repo tag, branch, commit, and remote URL. - Django API tests (#511) — Comprehensive unit tests for
api_views.pyREST endpoints. - Ubuntu 25 support — Added to
install_openrvdas.sh. - macOS Homebrew path fixes (#472) — Corrected paths for Homebrew-based installations.
- Deprecate install_influxdb.sh (#478) — Added deprecation warning; manual Grafana/InfluxDB/Telegraf setup is now the recommended path.
UI & Documentation
- Django GUI UI refresh (#473) — Centralized CSS, resizable stderr divs, improved button styling, favicon, based on SOI operator feedback.
- Grafana displays documentation (#478) — Substantially rewritten with step-by-step manual Grafana/InfluxDB/Telegraf setup guide and new screenshots.
126 files changed, ~8,665 insertions, ~1,527 deletions
🤖 Generated with Claude Code