Documentation ¶
Index ¶
- Constants
- Variables
- func F2fp(x float64) *float64
- func Fp2f(x *float64) float64
- func GetIecDescription(key string) string
- func MkIndexHandler(mc *MeasurementCache) func(http.ResponseWriter, *http.Request)
- func MkLastAllValuesHandler(mc *MeasurementCache) func(http.ResponseWriter, *http.Request)
- func MkLastMinuteAvgAllHandler(mc *MeasurementCache) func(http.ResponseWriter, *http.Request)
- func MkLastMinuteAvgSingleHandler(mc *MeasurementCache) func(http.ResponseWriter, *http.Request)
- func MkLastSingleValuesHandler(mc *MeasurementCache) func(http.ResponseWriter, *http.Request)
- func MkSocketHandler(hub *SocketHub) func(http.ResponseWriter, *http.Request)
- func MkStatusHandler(s *Status) func(http.ResponseWriter, *http.Request)
- func NewRTUClient(rtuDevice string, comset int, verbose bool) *modbus.RTUClientHandler
- func Run_httpd(mc *MeasurementCache, firehose *Firehose, hub *SocketHub, s *Status, ...)
- func ServeWebsocket(hub *SocketHub, w http.ResponseWriter, r *http.Request)
- func SetupScheduler(meters map[uint8]*Meter, qe *ModbusEngine) (*MeterScheduler, QuerySnipChannel)
- type ByteSlice
- type Client
- type ControlSnip
- type ControlSnipChannel
- type ControlSnipType
- type Firehose
- type MeasurementCache
- type MeasurementCacheItem
- type MemoryStatus
- type MeterReadings
- type MeterScheduler
- type MeterStatus
- type MockClient
- func (c *MockClient) MaskWriteRegister(address, andMask, orMask uint16) (results []byte, err error)
- func (c *MockClient) ReadCoils(address, quantity uint16) (results []byte, err error)
- func (c *MockClient) ReadDiscreteInputs(address, quantity uint16) (results []byte, err error)
- func (c *MockClient) ReadFIFOQueue(address uint16) (results []byte, err error)
- func (c *MockClient) ReadHoldingRegisters(address, quantity uint16) (results []byte, err error)
- func (c *MockClient) ReadInputRegisters(address, quantity uint16) (results []byte, err error)
- func (c *MockClient) ReadWriteMultipleRegisters(readAddress, readQuantity, writeAddress, writeQuantity uint16, value []byte) (results []byte, err error)
- func (c *MockClient) WriteMultipleCoils(address, quantity uint16, value []byte) (results []byte, err error)
- func (c *MockClient) WriteMultipleRegisters(address, quantity uint16, value []byte) (results []byte, err error)
- func (c *MockClient) WriteSingleCoil(address, value uint16) (results []byte, err error)
- func (c *MockClient) WriteSingleRegister(address, value uint16) (results []byte, err error)
- type ModbusEngine
- type ModbusStatus
- type MqttClient
- type QuerySnip
- type QuerySnipBroadcaster
- type QuerySnipChannel
- type ReadingSlice
- type Readings
- type SocketHub
- type Status
- type THDInfo
- type ThreePhaseReadings
Constants ¶
const ( ModbusComset2400_8N1 ModbusComset9600_8N1 ModbusComset19200_8N1 ModbusComset2400_8E1 ModbusComset9600_8E1 ModbusComset19200_8E1 )
const (
MaxRetryCount = 5
)
const (
RELEASEVERSION = "0.6.0"
)
const (
SECONDS_BETWEEN_STATUSUPDATE = 1
)
Variables ¶
var UniqueIdFormat string = "Instrument%d"
UniqueIdFormat is a format string for unique ID generation. It expects one %d conversion specifier, which will be replaced with the device ID. The UniqueIdFormat can be changed on program startup, before any additional goroutines are started.
Functions ¶
func GetIecDescription ¶ added in v0.7.0
func MkIndexHandler ¶
func MkIndexHandler(mc *MeasurementCache) func(http.ResponseWriter, *http.Request)
func MkLastAllValuesHandler ¶
func MkLastAllValuesHandler(mc *MeasurementCache) func(http.ResponseWriter, *http.Request)
func MkLastMinuteAvgAllHandler ¶
func MkLastMinuteAvgAllHandler(mc *MeasurementCache) func(http.ResponseWriter, *http.Request)
func MkLastMinuteAvgSingleHandler ¶
func MkLastMinuteAvgSingleHandler(mc *MeasurementCache) func(http.ResponseWriter, *http.Request)
func MkLastSingleValuesHandler ¶
func MkLastSingleValuesHandler(mc *MeasurementCache) func(http.ResponseWriter, *http.Request)
func MkSocketHandler ¶
func MkSocketHandler(hub *SocketHub) func(http.ResponseWriter, *http.Request)
func MkStatusHandler ¶
func MkStatusHandler(s *Status) func(http.ResponseWriter, *http.Request)
func NewRTUClient ¶ added in v0.7.0
func NewRTUClient(rtuDevice string, comset int, verbose bool) *modbus.RTUClientHandler
func Run_httpd ¶
func Run_httpd( mc *MeasurementCache, firehose *Firehose, hub *SocketHub, s *Status, url string, )
func ServeWebsocket ¶
func ServeWebsocket(hub *SocketHub, w http.ResponseWriter, r *http.Request)
ServeWebsocket handles websocket requests from the peer.
func SetupScheduler ¶
func SetupScheduler(meters map[uint8]*Meter, qe *ModbusEngine) (*MeterScheduler, QuerySnipChannel)
SetupScheduler creates a scheduler and its wiring
Types ¶
type ByteSlice ¶
type ByteSlice []byte
ByteSlice attaches the methods of sort.Interface to []byte, sorting in increasing order.
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client is a middleman between the websocket connection and the hub.
type ControlSnip ¶
type ControlSnip struct { Type ControlSnipType Message string DeviceId uint8 }
ControlSnip wraps control information like query success or failure.
type ControlSnipChannel ¶
type ControlSnipChannel chan ControlSnip
type ControlSnipType ¶
type ControlSnipType uint8
const ( CONTROLSNIP_OK ControlSnipType = iota CONTROLSNIP_ERROR )
type Firehose ¶
type Firehose struct {
// contains filtered or unexported fields
}
func NewFirehose ¶
func NewFirehose(inChannel QuerySnipChannel, status *Status, verbose bool) *Firehose
func (*Firehose) GetHandler ¶
func (f *Firehose) GetHandler() func(w http.ResponseWriter, r *http.Request)
type MeasurementCache ¶
type MeasurementCache struct {
// contains filtered or unexported fields
}
func NewMeasurementCache ¶
func NewMeasurementCache( meters map[uint8]*Meter, inChannel QuerySnipChannel, scheduler *MeterScheduler, maxAge time.Duration, isVerbose bool, ) *MeasurementCache
func (*MeasurementCache) Consume ¶
func (mc *MeasurementCache) Consume()
func (*MeasurementCache) GetCurrent ¶ added in v0.7.0
func (mc *MeasurementCache) GetCurrent(deviceId byte) (*Readings, error)
func (*MeasurementCache) GetMinuteAvg ¶
func (mc *MeasurementCache) GetMinuteAvg(deviceId byte) (*Readings, error)
func (*MeasurementCache) GetSortedIDs ¶
func (mc *MeasurementCache) GetSortedIDs() []byte
func (*MeasurementCache) Purge ¶ added in v0.7.0
func (mc *MeasurementCache) Purge(deviceId byte) error
Purge removes accumulated data for specified device
type MeasurementCacheItem ¶ added in v0.7.0
type MeasurementCacheItem struct { *Meter *MeterReadings }
type MemoryStatus ¶
func CurrentMemoryStatus ¶
func CurrentMemoryStatus() MemoryStatus
type MeterReadings ¶
type MeterReadings struct { Historic ReadingSlice Current Readings // contains filtered or unexported fields }
func NewMeterReadings ¶
func NewMeterReadings(devid uint8, maxAge time.Duration) *MeterReadings
func (*MeterReadings) AddSnip ¶
func (mr *MeterReadings) AddSnip(snip QuerySnip)
func (*MeterReadings) Purge ¶
func (mr *MeterReadings) Purge(devid uint8)
type MeterScheduler ¶
type MeterScheduler struct {
// contains filtered or unexported fields
}
func NewMeterScheduler ¶
func NewMeterScheduler( out QuerySnipChannel, control ControlSnipChannel, devices map[uint8]*Meter, ) *MeterScheduler
func (*MeterScheduler) Run ¶
func (q *MeterScheduler) Run()
func (*MeterScheduler) SetCache ¶ added in v0.7.0
func (q *MeterScheduler) SetCache(mc *MeasurementCache)
type MeterStatus ¶
type MockClient ¶ added in v0.7.0
type MockClient struct {
// contains filtered or unexported fields
}
func NewMockClient ¶ added in v0.7.0
func NewMockClient(errorRate int32) *MockClient
func (*MockClient) MaskWriteRegister ¶ added in v0.7.0
func (c *MockClient) MaskWriteRegister(address, andMask, orMask uint16) (results []byte, err error)
func (*MockClient) ReadCoils ¶ added in v0.7.0
func (c *MockClient) ReadCoils(address, quantity uint16) (results []byte, err error)
func (*MockClient) ReadDiscreteInputs ¶ added in v0.7.0
func (c *MockClient) ReadDiscreteInputs(address, quantity uint16) (results []byte, err error)
func (*MockClient) ReadFIFOQueue ¶ added in v0.7.0
func (c *MockClient) ReadFIFOQueue(address uint16) (results []byte, err error)
func (*MockClient) ReadHoldingRegisters ¶ added in v0.7.0
func (c *MockClient) ReadHoldingRegisters(address, quantity uint16) (results []byte, err error)
func (*MockClient) ReadInputRegisters ¶ added in v0.7.0
func (c *MockClient) ReadInputRegisters(address, quantity uint16) (results []byte, err error)
func (*MockClient) ReadWriteMultipleRegisters ¶ added in v0.7.0
func (c *MockClient) ReadWriteMultipleRegisters(readAddress, readQuantity, writeAddress, writeQuantity uint16, value []byte) (results []byte, err error)
func (*MockClient) WriteMultipleCoils ¶ added in v0.7.0
func (c *MockClient) WriteMultipleCoils(address, quantity uint16, value []byte) (results []byte, err error)
func (*MockClient) WriteMultipleRegisters ¶ added in v0.7.0
func (c *MockClient) WriteMultipleRegisters(address, quantity uint16, value []byte) (results []byte, err error)
func (*MockClient) WriteSingleCoil ¶ added in v0.7.0
func (c *MockClient) WriteSingleCoil(address, value uint16) (results []byte, err error)
func (*MockClient) WriteSingleRegister ¶ added in v0.7.0
func (c *MockClient) WriteSingleRegister(address, value uint16) (results []byte, err error)
type ModbusEngine ¶
type ModbusEngine struct {
// contains filtered or unexported fields
}
func NewModbusEngine ¶
func NewModbusEngine( rtuDevice string, comset int, verbose bool, status *Status, ) *ModbusEngine
func (*ModbusEngine) Scan ¶
func (q *ModbusEngine) Scan()
func (*ModbusEngine) Transform ¶
func (q *ModbusEngine) Transform( inputStream QuerySnipChannel, controlStream ControlSnipChannel, outputStream QuerySnipChannel, )
type ModbusStatus ¶
type MqttClient ¶
type MqttClient struct {
// contains filtered or unexported fields
}
func NewMqttClient ¶
type QuerySnip ¶
QuerySnip represents modbus query operations
func NewQuerySnip ¶ added in v0.7.0
func (*QuerySnip) MarshalJSON ¶
MarshalJSON converts QuerySnip to json, replacing ReadTimestamp with unix time representation
type QuerySnipBroadcaster ¶
type QuerySnipBroadcaster struct {
// contains filtered or unexported fields
}
QuerySnipBroadcaster acts as hub for broadcating QuerySnips to multiple recipients
func NewQuerySnipBroadcaster ¶
func NewQuerySnipBroadcaster(in QuerySnipChannel) *QuerySnipBroadcaster
NewQuerySnipBroadcaster creates QuerySnipBroadcaster
func (*QuerySnipBroadcaster) Attach ¶
func (b *QuerySnipBroadcaster) Attach() QuerySnipChannel
Attach creates and attaches a QuerySnipChannel to the broadcaster
func (*QuerySnipBroadcaster) Run ¶
func (b *QuerySnipBroadcaster) Run()
Run executes the broadcaster
type QuerySnipChannel ¶
type QuerySnipChannel chan QuerySnip
type ReadingSlice ¶
type ReadingSlice []Readings
ReadingSlice is a type alias for a slice of readings.
func (*ReadingSlice) Average ¶ added in v0.7.0
func (r *ReadingSlice) Average() (*Readings, error)
Average calculates average across a ReadingSlice
func (ReadingSlice) NotOlderThan ¶
func (r ReadingSlice) NotOlderThan(ts time.Time) (res ReadingSlice)
NotOlderThan creates a new ReadingSlice of latest data
type Readings ¶
type Readings struct { UniqueId string Timestamp time.Time Unix int64 DeviceId uint8 `json:"ModbusDeviceId"` Power ThreePhaseReadings Voltage ThreePhaseReadings Current ThreePhaseReadings Cosphi ThreePhaseReadings Import ThreePhaseReadings TotalImport *float64 Export ThreePhaseReadings TotalExport *float64 THD THDInfo Frequency *float64 }
Readings combines readings of all measurements into one data structure
func (*Readings) IsOlderThan ¶
IsOlderThan returns true if the reading is older than the given timestamp.
type SocketHub ¶
type SocketHub struct {
// contains filtered or unexported fields
}
SocketHub maintains the set of active clients and broadcasts messages to the clients.
func NewSocketHub ¶
func NewSocketHub(inChannel QuerySnipChannel, status *Status) *SocketHub
type Status ¶
type Status struct { Starttime time.Time UptimeSeconds float64 Goroutines int Memory MemoryStatus Modbus ModbusStatus ConfiguredMeters []MeterStatus // contains filtered or unexported fields }
func (*Status) IncreaseReconnectCounter ¶ added in v0.7.0
func (s *Status) IncreaseReconnectCounter()
func (*Status) IncreaseRequestCounter ¶ added in v0.7.0
func (s *Status) IncreaseRequestCounter()
func (*Status) MarshalJSON ¶ added in v0.7.0
MarshalJSON will syncronize access to the status object see http://choly.ca/post/go-json-marshalling/ for avoiding infinite loop
type THDInfo ¶
type THDInfo struct { // Current ThreePhaseReadings // AvgCurrent float64 VoltageNeutral ThreePhaseReadings AvgVoltageNeutral *float64 }