Pure-Python OPC UA servers from quasar Design files — the quasarnova family's no-codegen engine
Project description
kilonova
What is this?
kilonova serves a quasar Design.xml + config.xml as a live OPC UA server in pure
Python — no code generation, no C++. It produces the same address space as a
quasar-generated server (same ns=2 string NodeIds,
same dotted parent.child addressing), so quasar ecosystem tools —
Cacophony/WinCC OA,
UaoForQuasar clients, plain OPC UA clients —
work against it unmodified.
A kilonova is the luminous flash of a neutron-star merger — a lighter, faster transient in the nova family. This kilonova is the pure-Python engine of the quasarnova family: successor of MilkyWay (Piotr Nikiel's 2021 pure-Python prototype; this rewrite was briefly named microquasar), rebuilt from scratch on asyncua 2.x.
Basic usage mode
- Install (Python ≥ 3.10):
pip install kilonova - Run your existing quasar server's design, unchanged:
kilonova run --design Design/Design.xml --config bin/config.xml - Point any OPC UA client at
opc.tcp://host:4841— the address space is quasar's. - Dump a running server's address space (uasak_dump-style NodeSet2):
kilonova dump --endpoint opc.tcp://127.0.0.1:4841 --output dump.xml
Device logic is plain Python (see doc/DeviceLogic.md):
from kilonova import Server
server = Server("Design.xml", config_path="config.xml")
@server.read("sca1.adc") # source variable: runs inside the client read
async def read_adc(obj):
return await hardware.read_adc()
@server.method("sca1.reset") # method handler
async def reset(obj):
await obj.setOnline(0) # generated setter, quasar naming
async with server:
...
What works
All 12 cases of quasar's own CI test suite pass against the reference nodesets (cache/source/calculated variables, methods incl. arguments, config entries and restrictions, singleVariableNode, design/config instantiation, StandardMetaData). Production designs were probed against live C++ servers of both backends: ATCA and CAEN at full structural parity; CanOpen surfaced two genuine C++ cross-backend quirks (kilonova sides with one backend on each). Details: doc/Parity.md.
Limitations
- Device logic is registered per address at runtime — there is no generated
D<Class>skeleton (that is the point). - Design-mandated children are instantiated unconditionally; C++ device logic may create some conditionally.
- No server-side security policies yet (NoSecurity endpoint only).
- Values live in asyncua's address space; extreme write rates were not a design goal.
Documentation
- doc/Architecture.md — modules and data flow
- doc/DeviceLogic.md — the user API
- doc/Parity.md — the parity contract and current status
- PLAN.md — milestone log, parity backlog, engineering notes
- CHANGELOG.md — release history
- quasar framework documentation: https://quasar.docs.cern.ch
Credits
- Paris Moschovakos (paris@moschovakos.com) — kilonova
- Piotr Nikiel — quasar concept and architecture; MilkyWay, the predecessor
Contact: paris@moschovakos.com
License: BSD-2-Clause.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kilonova-0.1.1.tar.gz.
File metadata
- Download URL: kilonova-0.1.1.tar.gz
- Upload date:
- Size: 53.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bfad71d71605d7dd7323f17f369f7b84bd6fbed532cec25cdbd3ac4af8c3ed05
|
|
| MD5 |
186bfd9e56b1e0bc934a331d8ab7490b
|
|
| BLAKE2b-256 |
00b87cf770ae2efa0b8a7f025aaeaab28dc926a95734396ce4c9a8ad960ee532
|
Provenance
The following attestation bundles were made for kilonova-0.1.1.tar.gz:
Publisher:
release.yml on quasarnova-team/kilonova
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kilonova-0.1.1.tar.gz -
Subject digest:
bfad71d71605d7dd7323f17f369f7b84bd6fbed532cec25cdbd3ac4af8c3ed05 - Sigstore transparency entry: 2146397750
- Sigstore integration time:
-
Permalink:
quasarnova-team/kilonova@a703a27729f6717c6919b34a46885b6be07da297 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/quasarnova-team
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a703a27729f6717c6919b34a46885b6be07da297 -
Trigger Event:
push
-
Statement type:
File details
Details for the file kilonova-0.1.1-py3-none-any.whl.
File metadata
- Download URL: kilonova-0.1.1-py3-none-any.whl
- Upload date:
- Size: 38.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e82d857649ce3fdca7d8a8b3621719da0613c9d70a186c33c8d9878ba99d3c8d
|
|
| MD5 |
2b288a68315069a38ff075099f66c3b9
|
|
| BLAKE2b-256 |
4664a0d2a1b24dcd89ce36d47d525c52f5091911f09ea3c169305c66d7a9123f
|
Provenance
The following attestation bundles were made for kilonova-0.1.1-py3-none-any.whl:
Publisher:
release.yml on quasarnova-team/kilonova
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kilonova-0.1.1-py3-none-any.whl -
Subject digest:
e82d857649ce3fdca7d8a8b3621719da0613c9d70a186c33c8d9878ba99d3c8d - Sigstore transparency entry: 2146397753
- Sigstore integration time:
-
Permalink:
quasarnova-team/kilonova@a703a27729f6717c6919b34a46885b6be07da297 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/quasarnova-team
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a703a27729f6717c6919b34a46885b6be07da297 -
Trigger Event:
push
-
Statement type: