Skip to content

Releases: gridsociety/mythy

v1.2.1

Choose a tag to compare

@github-actions github-actions released this 15 May 14:38
b6dc5bb

Documentation & cosmetic patch. No behavior change, no new flags, no bug fixes. Upgrading from v1.2.0 is optional — the binaries are functionally identical aside from one CLI string. Released so the published docs and --help reflect the project's intended tone and scope.

Highlights

CLI: neutral, professional tagline

mythy --help no longer opens with the colloquial "talks to PROX/PRON/XMR the way ThyVisor does, but smarter." Long description is now:

Command-line tool to configure, monitor, and manage Thytronic protection relays.

README: honest scope

  • Opener no longer name-drops (XV10P, NV10P, NA10, …) in a way that implied a closed support list.
  • New Compatibility section: declares only XV10P (PROX family) and NV10P (PRON family) as actually tested end-to-end, while explaining that the vendor's wire format is uniform across Codifica.xml so other Thytronic families (NA10, XMR, DMC*, SME*, CCI, NTG, iBU, …) are expected to work but unverified. Reports of success or failure on those are welcome via issues.
  • New License section: points at the MIT LICENSE, restates the as-is warranty disclaimer in-context, and notes that this is an unaffiliated third-party tool — Thytronic, ThyVisor, and product names are trademarks of their respective owners.

README: late documentation for v1.2.0 features

v1.2.0 shipped a few small things that landed in the README only after the tag was cut. They are now documented here:

  • mythy export --include-disabled-modules and the --all shortcut for opting into module-disabled DATA.
  • Per-category "skipped N key(s)" summary lines at the end of every export.
  • Locale-aware YAML round-trip: every export records device.locale, and import / diff / validate reconcile it against --locale (with --force-locale to override).

Internal cleanup

  • cmd/mythy/connection.go: the comment justifying the hardcoded 0x143E discovery read used to say "every PROX/PRON/XMR template puts IDENTIFICATION at num=5183". An empirical scan of all 847 templates in the vendor catalog showed this register address is universal across every family that declares IDENTIFICATION, not just three of them. Comment broadened to match reality.

Upgrading

Drop-in. Same flags, same outputs, same on-the-wire behavior. Replace the binary at your leisure.

Full changelog: v1.2.0...v1.2.1

v1.2.0

Choose a tag to compare

@github-actions github-actions released this 15 May 13:34
ee40be4

v1.2.0 is a small minor release focused on two user-visible affordances on top of v1.1.0:

  • mythy export --all now actually means "everything", including DATA whose MODULE attribute is reported off by EnableBoard_*. The previous build silently dropped those (RELE_K*, ING_I*, family-wide measurement compounds, …), so snapshots and YAML round-trips lost entire categories without surfacing the omission. New flag --include-disabled-modules exposes the gate by itself; --all bundles it alongside --include-hidden / --include-readonly / --include-skip. Every export now ends with a per-category skip summary (skipped 64 module-disabled key(s) (use --include-disabled-modules to include)), so what was implicit before is now explicit and discoverable.
  • The compound-write error from mythy set no longer leaks map[string]any (a Go-internal type unactionable from a CLI) and instead points the user at the supported dotted-path syntax with a concrete example. The symmetric error on the YAML import path got the same treatment.

Both are non-breaking additions on top of v1.1.0; the bump to a minor version reflects the new CLI flag and the new YAML-stream output lines.

Upgrade notes

No migration. Existing exports done with v1.1.0 round-trip unchanged through the v1.2.0 import path. If you previously relied on the silent module-gate behaviour to keep RELE_K* out of your snapshots, you don't need to do anything — the default is unchanged; only --all now means more than it did.


What's Changed

  • fix(export): --all includes module-disabled DATA + per-category skip summary by @ale-rinaldi in #23
  • fix(session,configio): point at dotted-path in compound-error messages by @ale-rinaldi in #24

Full Changelog: v1.1.0...v1.2.0

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 15 May 12:21
f156c87

v1.1.0 is a bug-fix release focused on three areas: write-path safety on protection-relay devices, catalog-decoding correctness across the NV10P / PROX / SMEI / legacy SIF/SVF families, and round-trip fidelity of YAML configurations.

If you ran v1.0.0 against an NV10P (or any non-PROX family), this release closes silent-corruption paths you may have hit without seeing a clear error. The full PR list is at the bottom; the sections below group the changes by what you'll notice as an operator.

Safety

  • Import scope guard. mythy import no longer writes to VISIBILITY="3" (Administrator subtree) or SKIP="YES" (identification, IP, comm config) keys by default. Hand-edited YAMLs that mistakenly carry those keys are skipped and listed, instead of going to wire and risking a FATALE state requiring a factory reset. Per-category opt-ins behind --include-hidden / --include-skip / --all, all gated on a paired --yes-i-understand. (#17)
  • Loud failures on unresolvable enum labels. Compound sub-fields (e.g. SOGLIA.Tipo, SOGLIA.Stato, RELE_PARAM.Logica) used to silently fall through to value 0 when an enum label couldn't be resolved against the loaded template. They now error out by name, which closes the SOGLIA-flips-MINIMA↔MASSIMA silent-corruption path. (#3, #4)
  • Locale-aware YAML round-trips. Export records the --locale it ran under into device.locale; import / diff / validate refuse to proceed on cross-locale mismatches unless --force-locale is set explicitly. Keeps YAML readable in the operator's native language while making locale drift a loud, opt-in event. (#4)

Catalog correctness

  • Compound TIPO overrides. v1.0.0 trusted the <CLASS> block alone when building a compound's wire layout. For SOGLIA, RELE, LED, MISURA, CONTATORE, INFO_SCHEDA, SGN_IN, STATO_RELE, INFO_SGN_IN, and SOGLIA_DT — every compound used by NV10P / NV11B / NA10 protection settings — the per-instance <DATA TIPO="<class>"> carries nested <DATA NAME="..." TIPO="..."> children that override sub-field TIPOs. The pre-fix encoder shipped 12 registers where the wire expected 14, and the device interpreted everything after the first override as shifted-by-two garbage. Now we honour the overrides; cross-catalog audit confirms 9,816 compound DATA instances balance correctly. (#6)
  • ENUM_WORD support (the SMEI family's 16-bit enum). (#9)
  • INT support in legacy SIF / SVF / SIF_8EV / SVF_8EV / SVF5740 templates, confirmed empirically as a WORD synonym from SIF5600.IdentificationResponse's INT + LONG + INT + INT = dim 5 split. (#10)
  • TYPEDEF resolution at load. ENUM_RELE / ENUM_LED / ENUM_ING (all aliasing BIT32) are now resolved once at catalog parse time; every TIPO switch site downstream — read, write, YAML I/O — sees the resolved primitive without per-site hardcoded knowledge of which names are aliases. (#1)
  • Multi-band <RANGE> validation. Settings like VLineaPrimario_1 with several <RANGE VALUE="lo,hi,step"/> children describing piecewise-valid bands now accept values from any band; the validator used to read only the last <RANGE> and refused legitimate values from any other. (#2)
  • .cache wire-format versioning. Template caches gain a magic header and a parser-schema version. Mythy builds that change the catalog parser now auto-invalidate stale caches on first use — no more "I upgraded mythy but it keeps using the old parser's output until I rm Templates/*.cache". (#5)

Connectivity / UX

  • NV10P initial-handshake fix. v1.0.0's Identify unconditionally probed ENABLE_SEC_MODE and only tolerated Modbus exception 0x02. PRON-family firmware (every NV10P-EB0 / NA10 / NV11B variant where the register isn't declared) returns exception 0x03 instead, so every command went straight to "discovery: request timed out" or a confusing Modbus error. Identify now consults the loaded template first and skips the probe entirely on devices that don't declare the register — matching what ThyVisor does on the wire — and tolerates both 0x02 and 0x03 on unknown variants. (#12 / PR #13)
  • Default --request-timeout raised from 2 s to 10 s. Tight enough to fail fast on stuck connections but enough head-room to cover END_CHANGE_DB's flash-commit on typical imports. The 2 s default routinely surfaced a cosmetic timeout error on imports the device had actually committed. (#7)
  • Compound int handling on import. YAML decoders emit Go int for small integers like Tipo: 1; the pre-fix import path only handled int64 / uint64, so int values silently became 0. (#3)

Upgrading

Single static binary, no migration steps. On first run the new build will:

  • regenerate any existing Templates/*.cache files (the cache wire format gained a version header in #5);
  • accept YAMLs produced by v1.0.0 unchanged (the new device.locale field is optional and omitempty).

Re-exporting your snapshots after upgrading gets you the locale-tagged header that future cross-locale round-trips will use.


What's Changed

  • fix(catalog): resolve TYPEDEF aliases at load time by @ale-rinaldi in #11
  • fix(session): gate ENABLE_SEC_MODE probe on the catalog, tolerate exception 0x03 by @ale-rinaldi in #13
  • fix(codec): accept Go int for enum sub-field values by @ale-rinaldi in #14
  • fix(transport): bump default request-timeout from 2s to 10s by @ale-rinaldi in #15
  • fix(session): accept value matching any band on multi-RANGE DATA by @ale-rinaldi in #16
  • fix(import,export): scope-aware writes, refuse dangerous categories by default by @ale-rinaldi in #17
  • fix(catalog,codec): honour per-instance compound TIPO overrides; add ENUM_WORD and INT by @ale-rinaldi in #18
  • fix(catalog): version the .cache wire format so parser changes auto-invalidate by @ale-rinaldi in #19
  • fix(configio,codec): record export locale and refuse cross-locale silent label remap by @ale-rinaldi in #20

New Contributors

Full Changelog: v1.0.0...v1.1.0

v1.0.0

Choose a tag to compare

@github-actions github-actions released this 06 May 18:35

First public release of mythy — a command-line client for Thytronic protection relays (XV10P, NV10P, NA10, …).

mythy speaks the same Modbus TCP / RTU protocol as the vendor's ThyVisor Windows app, so you can identify devices, browse the parameter catalog, read measurements, change settings, snapshot configurations to YAML, and invoke commands without leaving the terminal. Single static Go binary, no runtime dependencies.

What's in the box

  • Catalog browsing, with or without a connected device
  • Type-aware reads (primitives, ENUMs, 12-field compounds)
  • Multi-parameter writes batched into a single Modbus edit transaction; client-side validation of RANGE / ENUM / STRING constraints
  • YAML snapshot / diff / import (--dry-run / --force) for configuration management
  • Command invocation: any catalog <COMMAND>, plus shortcuts (reboot, reset, clock-set, net-set, …)
  • G61850 RPC parser (g61850 list / g61850 invoke)
  • Modbus TCP and RTU (serial / USB-CDC) transports
  • Output formats: human, json, yaml, unified (for diff)

Install

Download the archive for your platform below — prebuilt for Linux (386, amd64, armv7, arm64), macOS (amd64, arm64), and Windows (386, amd64, arm64). Each archive contains the mythy binary, the project LICENSE (MIT), and THIRD_PARTY_LICENSES covering the bundled Go modules. SHA256SUMS is published alongside.

tar -xzf mythy-v1.0.0-linux-amd64.tar.gz
./mythy --version

First-time setup

mythy reads its parameter catalog from a copy of ThyVisor's Templates/ folder. See the README for the one-time extraction steps (Windows or Wine).

Documentation

  • README — usage walkthrough and command reference

License

Released under the MIT License. Copyright © 2026 Grid Society S.r.l.