Documentation
What Ember+ is, the shape of its data, and how emberviewer maps onto it. No prior experience required.
Ember+ is an open control protocol from Lawo, widely used in broadcast and pro-audio gear to expose and control device parameters over the network. A device (or software) that publishes controllable data is a provider; a tool that connects to it - like emberviewer - is a consumer.
Under the hood it is three nested layers over a single TCP connection (default port 9000):
TCP → S101 frames → BER (TLV) → Glow tree
emberviewer implements all three from scratch in Rust (the ember-proto and ember-net crates), so there is nothing closed in the stack.
A provider exposes its data as a tree. Every element sits at a numeric path such as
0.1.3 (encoded on the wire as a RELATIVE-OID). The element types you'll meet:
A small tree, as emberviewer shows it:
Three operations cover almost everything emberviewer does:
You never download the whole tree at once. emberviewer sends a getDirectory request for the
children of a node, and the provider replies with that node's immediate children. Expanding a branch in the
UI issues another getDirectory for it - this is the "lazy" browsing you see in the tree.
To change a writable parameter, emberviewer sends a set with the new value at that parameter's path. Booleans get dedicated set and pulse controls; other types are edited inline. The provider applies the change and reports the result back.
Rather than polling, a consumer subscribes to a parameter and the provider pushes updates whenever the value changes. emberviewer subscribes to what you're viewing so the value column stays live, and records changes in the change log.
getDirectory for that node's children.set.subscribes.