From f8d09800a5eb91b6621471c73f29bb8a921df33a Mon Sep 17 00:00:00 2001 From: dreadnought Date: Wed, 28 Jan 2026 18:09:03 +0100 Subject: [PATCH] myStrom: add token support (#27047) --- charger/mystrom.go | 3 ++- meter/mystrom.go | 5 +++-- meter/mystrom/mystrom.go | 19 +++++++++++++------ templates/definition/charger/mystrom.yaml | 5 +++++ templates/definition/meter/mystrom.yaml | 5 +++++ 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/charger/mystrom.go b/charger/mystrom.go index e21d8d04b..760a160b4 100644 --- a/charger/mystrom.go +++ b/charger/mystrom.go @@ -28,6 +28,7 @@ func NewMyStromFromConfig(other map[string]any) (api.Charger, error) { cc := struct { embed `mapstructure:",squash"` URI string + Token string StandbyPower float64 Cache time.Duration }{ @@ -39,7 +40,7 @@ func NewMyStromFromConfig(other map[string]any) (api.Charger, error) { } c := &MyStrom{ - conn: mystrom.NewConnection(cc.URI), + conn: mystrom.NewConnection(cc.URI, cc.Token), } c.switchSocket = NewSwitchSocket(&cc.embed, c.Enabled, c.conn.CurrentPower, cc.StandbyPower) diff --git a/meter/mystrom.go b/meter/mystrom.go index 293ff3808..2823aea03 100644 --- a/meter/mystrom.go +++ b/meter/mystrom.go @@ -16,12 +16,13 @@ func init() { // NewMyStromFromConfig creates a myStrom meter from generic config func NewMyStromFromConfig(other map[string]any) (api.Meter, error) { var cc struct { - URI string + URI string + Token string } if err := util.DecodeOther(other, &cc); err != nil { return nil, err } - return mystrom.NewConnection(cc.URI), nil + return mystrom.NewConnection(cc.URI, cc.Token), nil } diff --git a/meter/mystrom/mystrom.go b/meter/mystrom/mystrom.go index aa8d86d66..ac57f8cb1 100644 --- a/meter/mystrom/mystrom.go +++ b/meter/mystrom/mystrom.go @@ -17,29 +17,36 @@ type Report struct { type Connection struct { *request.Helper - uri string + uri string + token string } -func NewConnection(uri string) *Connection { +func NewConnection(uri, token string) *Connection { return &Connection{ uri: util.DefaultScheme(strings.TrimSuffix(uri, "/"), "http"), + token: token, Helper: request.NewHelper(util.NewLogger("mystrom")), } } func (c *Connection) Request(path string) error { uri := fmt.Sprintf("%s/%s", c.uri, path) - req, err := request.New(http.MethodGet, uri, nil, nil) - if err == nil { - _, err = c.DoBody(req) + req, _ := request.New(http.MethodGet, uri, nil, nil) + if c.token != "" { + req.Header.Set("Token", c.token) } + _, err := c.DoBody(req) return err } func (c *Connection) Report() (Report, error) { var res Report uri := fmt.Sprintf("%s/report", c.uri) - err := c.GetJSON(uri, &res) + req, _ := request.New(http.MethodGet, uri, nil, request.AcceptJSON) + if c.token != "" { + req.Header.Set("Token", c.token) + } + err := c.DoJSON(req, &res) return res, err } diff --git a/templates/definition/charger/mystrom.yaml b/templates/definition/charger/mystrom.yaml index 946f425e7..ba4f9fa7c 100644 --- a/templates/definition/charger/mystrom.yaml +++ b/templates/definition/charger/mystrom.yaml @@ -6,8 +6,13 @@ products: group: switchsockets params: - name: host + - name: token + help: + en: API token, only needed if token is set on device (Advanced -> Enable REST API -> Token) + de: API-Token, nur erforderlich wenn ein Token auf Gerät dem gesetzt ist (Experte -> REST API aktivieren -> Token) - preset: switchsocket render: | type: mystrom uri: http://{{ .host }} + token: {{ .token }} {{ include "switchsocket" . }} diff --git a/templates/definition/meter/mystrom.yaml b/templates/definition/meter/mystrom.yaml index 3b3dc1369..279252cdd 100644 --- a/templates/definition/meter/mystrom.yaml +++ b/templates/definition/meter/mystrom.yaml @@ -8,6 +8,11 @@ params: - name: usage choice: ["pv", "charge"] - name: host + - name: token + help: + en: API token, only needed if token is set on device (Advanced -> Enable REST API -> Token) + de: API-Token, nur erforderlich wenn ein Token auf Gerät dem gesetzt ist (Experte -> REST API aktivieren -> Token) render: | type: mystrom uri: http://{{ .host }} + token: {{ .token }}