evcc-io/server/modbus/proxy.go
2025-03-01 19:13:41 +01:00

45 lines
968 B
Go

package modbus
import (
"context"
"fmt"
"net"
"github.com/andig/mbserver"
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/util"
"github.com/evcc-io/evcc/util/modbus"
"github.com/evcc-io/evcc/util/sponsor"
)
func StartProxy(port int, config modbus.Settings, readOnly ReadOnlyMode) error {
conn, err := modbus.NewConnection(context.Background(), config.URI, config.Device, config.Comset, config.Baudrate, config.Protocol(), config.ID)
if err != nil {
return err
}
if !sponsor.IsAuthorized() {
return api.ErrSponsorRequired
}
h := &handler{
log: util.NewLogger(fmt.Sprintf("proxy-%d", port)),
readOnly: readOnly,
conn: conn,
}
l, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
if err != nil {
return err
}
h.log.DEBUG.Printf("modbus proxy for %s listening at :%d", config.String(), port)
srv, err := mbserver.New(h, mbserver.Logger(&logger{log: h.log}))
if err == nil {
err = srv.Start(l)
}
return err
}