Documentation
¶
Index ¶
- Constants
- Variables
- func ParseRegisterInverterResponse(body []byte) error
- func ParseUnregisterInverterResponse(body []byte) error
- type Client
- func (c *Client) FindUnregisteredInverter() (*Inverter, error)
- func (c *Client) GetInfo(inverter *Inverter) (*NormalInfoResponse, error)
- func (c *Client) GetInverterInfo(inverter *Inverter) (*InverterInfoResponse, error)
- func (c *Client) Read() ([]byte, error)
- func (c *Client) RegisterInverter(inverter *Inverter, address byte) error
- func (c *Client) Send(req []byte) error
- func (c *Client) UnregisterInverter(inverter *Inverter) error
- type Connection
- type Inverter
- type InverterInfoResponse
- type NormalInfoResponse
- type NormalizedNormalInfoResponse
- type Packet
- func DefaultPacket() *Packet
- func InverterInfoRequest(address byte) *Packet
- func NormalInfoRequest(address byte) *Packet
- func ParsePacket(res []byte) (*Packet, error)
- func RegisterInverterRequest(serial []byte, address byte) *Packet
- func UnregisterInverterRequest(serial []byte, address byte) *Packet
- func UnregisteredInverterRequest() *Packet
- type UnregisteredInverterResponse
Constants ¶
Variables ¶
Functions ¶
Types ¶
type Client ¶
type Client struct {
Conn Connection
LastResponse []byte
}
func NewClientWithConnection ¶
func NewClientWithConnection(conn Connection) (*Client, error)
func (*Client) FindUnregisteredInverter ¶
FindUnregisteredInverter returns the first unregistered inverter (address 0x00) Use RegisterInverter afterwards to set an address for the inverter
func (*Client) GetInverterInfo ¶
func (c *Client) GetInverterInfo(inverter *Inverter) (*InverterInfoResponse, error)
func (*Client) RegisterInverter ¶
RegisterInverter Sets the bus address for an unregistered inverter
func (*Client) UnregisterInverter ¶
UnregisterInverter resets the inverter address (becomes 0x00)
type Connection ¶
type Connection interface {
io.ReadWriteCloser
Flush() error
}
type InverterInfoResponse ¶
type InverterInfoResponse struct {
Phase byte
RatedPower string
FirmwareVersion string
ModuleName string
FactoryName string
SerialNumber string
RatedBusVoltage string
}
func InverterInfoResponseFromData ¶
func InverterInfoResponseFromData(data []byte) (InverterInfoResponse, error)
func ParseInverterInfoResponse ¶
func ParseInverterInfoResponse(body []byte) (InverterInfoResponse, error)
0x83
type NormalInfoResponse ¶
type NormalInfoResponse struct {
Temperature uint16 // Celsius
EnergyToday uint16 // 0.1kWh
Vpv1 uint16 // 0.1V
Vpv2 uint16 // 0.1V
Apv1 uint16 // 0.1A
Apv2 uint16 // 0.1A
Iac uint16 // 0.1A
Vac uint16 // 0.1V
Frequency uint16 // 0.01Hz
Power uint16 // 1W
EnergyTotal uint32 // 0.1kWh
TimeTotal uint32 // hours
Mode uint16 // Inverter mode (0: Wait, 1: Check, 2: Normal, 3: Fault, 4: Permanent Fault, 5: Update, 6: Selftest)
GridVoltFault uint16 // 0.1V Grid voltage fault value
GridFreqFault uint16 // 0.01Hz Grid frequency fault value
DCIFault uint16 // mA, DJ injection fault value
TemperatureFault uint16 // Temperature fault value
PV1Fault uint16 // 0.1V PV1 voltage fault value
PV2Fault uint16 // 0.1V PV2 voltage fault value
GFCFault uint16 // mA, GFC fault value
ErrMessage uint32 // Error message code
// contains filtered or unexported fields
}
func NormalInfoResponseFromData ¶
func NormalInfoResponseFromData(data []byte) (NormalInfoResponse, error)
func ParseNormalInfoResponse ¶
func ParseNormalInfoResponse(body []byte) (NormalInfoResponse, error)
0x82
type NormalizedNormalInfoResponse ¶
type NormalizedNormalInfoResponse struct {
Temperature uint16 // Celsius
EnergyToday float64 // 0.1kWh -> kWh
Vpv1 float64 // 0.1V -> V
Vpv2 float64 // 0.1V -> V
Apv1 float64 // 0.1A -> A
Apv2 float64 // 0.1A -> A
Iac float64 // 0.1A -> A
Vac float64 // 0.1V -> V
Frequency float64 // 0.01Hz -> Hz
Power uint16 // 1W
EnergyTotal float64 // 0.1kWh
TimeTotal uint32 // hours
Mode string // Inverter mode (0: Wait, 1: Check, 2: Normal, 3: Fault, 4: Permanent Fault, 5: Update, 6: Selftest)
GridVoltFault float64 // 0.1V Grid voltage fault value -> V
GridFreqFault float64 // 0.01Hz Grid frequency fault value -> Hz
DCIFault float64 // mA, DJ injection fault value -> A
TemperatureFault float64 // Temperature fault value
PV1Fault float64 // 0.1V PV1 voltage fault value -> V
PV2Fault float64 // 0.1V PV2 voltage fault value -> V
GFCFault float64 // mA, GFC fault value -> A
ErrMessage []string // Error message code
// contains filtered or unexported fields
}
func NormalizeInfoResponse ¶
func NormalizeInfoResponse(in NormalInfoResponse) NormalizedNormalInfoResponse
type Packet ¶
type Packet struct {
Header uint16
Source uint16
Destination uint16
ControlCode byte
FunctionCode byte
Data []byte
}
Default packet format for Solax X1 air. It uses an RS485 protocol that with some resemblance to modbus
## Packet format: Header 2 0xAA55 // Always same value Source Address 2 0xXX00 // Typically 0x0000 Destination Address 2 0x00XX // As set, default 0x0000 Control code 1 0xXX // Depends on command Function code 1 0xXX // Depends on command Data lenght 1 0xXX // Data length, can be 0 Data0..N N Checksum 2 sum of bytes above
func DefaultPacket ¶
func DefaultPacket() *Packet
func ParsePacket ¶
func RegisterInverterRequest ¶
0x01
func UnregisterInverterRequest ¶
0x02
type UnregisteredInverterResponse ¶
type UnregisteredInverterResponse struct {
Serial []byte
}
func ParseUnregisteredInverterResponse ¶
func ParseUnregisteredInverterResponse(body []byte) (UnregisteredInverterResponse, error)
0x80