VonNeuro
A connected device stays in the laboratory that owns it. An agent on the adjacent computer links it to vonNeuro Messenger; a short driver declares the operations the device supports and their limits; the owner decides who may use it. Messenger provides accounts, queueing, metering and the return of results.
The agent connects out to the hub over HTTPS. Nothing listens on the laboratory network and no port is opened.
The driver checks every job before anything is driven. The hub can narrow what reaches a device, never widen it.
New devices start private. Owners share them with every account, with selected users, or with nobody, and can switch them off or disconnect at any time.
pip install https://series-marina-gigantic.ngrok-free.dev/downloads/vonneuro-node.zip # Python 3.11+ vonneuro-node pair --hub https://series-marina-gigantic.ngrok-free.dev --code ABCD-EFGH vonneuro-node check # validates your driver's operations, offline vonneuro-node run # connects; your devices go online vonneuro-node service install # optional: start it at logon
The default configuration uses a simulated RC circuit, so the full job path can be tested before real hardware is attached.
import json
from vonneuro_node import Driver, DeviceSpec, Operation, RunResult
import my_lab.probe_station as instrument # your existing control code
class CrossbarDriver(Driver):
def devices(self):
return [DeviceSpec(slug="crossbar-8x8", name="8×8 memristor crossbar", kind="memristor",
specs={"cells": 64, "max_voltage_v": 1.0},
operations=[Operation("read", "Read one cell at a small voltage",
params={"row": {"type": "integer", "minimum": 0, "maximum": 7},
"col": {"type": "integer", "minimum": 0, "maximum": 7},
"voltage": {"type": "number", "exclusiveMinimum": 0, "maximum": 0.3,
"unit": "V", "default": 0.1}},
result="read.json")])]
def check(self, slug, operation, params, ctx):
return None if instrument.ready() else "The probe station is busy"
def run(self, slug, operation, params, ctx):
current = instrument.read(params["row"], params["col"], params["voltage"])
(ctx.output_dir / "read.json").write_text(json.dumps({"current_a": current}))
return RunResult(exit_code=0, usage_seconds=0.2)
Set [driver] class = "your_module:CrossbarDriver" in node.toml. The agent keeps a local journal of every job it ran, independent of the hub's records.
Two example drivers come with the agent: drivers/simulated.py, the shortest starting point, and drivers/bench.py, the driver of the laboratory bench used in the worked examples. That bench is an ordinary node, paired the same way: its RC board and memristor array sit behind multiplexers, and its safety rules are written in its driver. A driver can also declare settings that node admins change from the website, a device page, and VOLT support through a single drive function.