The plugin system (plugin/) provides protocol-level abstraction for device
communication. Plugins implement typed getter/setter interfaces and are composed
into charger, meter, or vehicle implementations via configuration.
| Plugin | Protocol | Key Config |
|---|---|---|
http |
HTTP/REST | uri, method, headers, auth, cache, timeout |
mqtt |
MQTT | topic, retained, payload template, timeout |
modbus |
Modbus TCP/RTU | uri, register, scale, baudrate, rtu |
sunspec |
SunSpec/Modbus | Model-based point queries via device tree |
js |
JavaScript/WASM | Inline script evaluation |
go |
Go runtime | Dynamic Go code |
gpio |
Linux GPIO | Digital I/O for relays |
type StringGetter func() (string, error)
type FloatGetter func() (float64, error)
type IntGetter func() (int64, error)
type BoolGetter func() (bool, error)
// + corresponding Setter typesPlugins support chained transforms: scale, offset, lookup, regex.
Devices can be defined entirely via YAML templates using plugins:
# templates/definition/charger/example.yaml
status:
source: http
uri: http://{{ .host }}/status
enable:
source: http
uri: http://{{ .host }}/enable
method: POST
maxcurrent:
source: http
uri: http://{{ .host }}/current/{{ .maxcurrent }}The generic configurable charger (charger/charger.go) wires these plugin
configs into the api.Charger interface at runtime.
plugin/config.goβ plugin registry and config typesplugin/http.goβ HTTP pluginplugin/mqtt.goβ MQTT pluginplugin/modbus.goβ Modbus pluginplugin/sunspec.goβ SunSpec plugincharger/charger.goβ generic configurable charger using plugins