Skip to content

Latest commit

Β 

History

History
61 lines (48 loc) Β· 1.86 KB

File metadata and controls

61 lines (48 loc) Β· 1.86 KB

Plugin System

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 Types

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

Getter/Setter Interfaces

type StringGetter func() (string, error)
type FloatGetter  func() (float64, error)
type IntGetter    func() (int64, error)
type BoolGetter   func() (bool, error)
// + corresponding Setter types

Pipeline Transforms

Plugins support chained transforms: scale, offset, lookup, regex.

Template-Based Device Configuration

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.

Key Files

  • plugin/config.go β€” plugin registry and config types
  • plugin/http.go β€” HTTP plugin
  • plugin/mqtt.go β€” MQTT plugin
  • plugin/modbus.go β€” Modbus plugin
  • plugin/sunspec.go β€” SunSpec plugin
  • charger/charger.go β€” generic configurable charger using plugins