Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhanced the library with writing settings to the inverter. #1

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ This library is not affiliated with Kostal and is no offical product of KOSTAL S
## Features

* Authenticate (Login, Logout, Check authentication)
* Read settings
* Read/Write settings
* Read processdata
* Read events

Expand Down Expand Up @@ -68,6 +68,15 @@ Use "golrackpi [command] --help" for more information about a command.
## Documentation

...todo...
## Write settings

Available settings can be found in the swagger documentation of the inverter or by calling `client.Settings()``. The following example shows how to activate smart battery control:

```go
module := golrackpi.ModuleSettings{ModuleId: "devices:local"}
module.Settings = []golrackpi.SettingsValues{golrackpi.SettingsValues{Id: "Battery:SmartBatteryControl:Enable", Value: "1"}}
client.UpdateSettings([]golrackpi.ModuleSettings{module})
```

## License

Expand Down
10 changes: 5 additions & 5 deletions auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ import (
"crypto/cipher"
"crypto/hmac"
"errors"
"io"

"crypto/sha256"
b64 "encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"

"github.com/geschke/golrackpi/internal/helper"

Expand Down Expand Up @@ -136,7 +136,7 @@ func (c *AuthClient) Login() (string, error) {
return "", errors.New("request returned with http error " + resp.Status)
}

responseBody, err := ioutil.ReadAll(resp.Body)
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
return "", errors.New("could not read authentication response")
}
Expand Down Expand Up @@ -196,7 +196,7 @@ func (c *AuthClient) Login() (string, error) {

defer respFinish.Body.Close()

responseFinishBody, err := ioutil.ReadAll(respFinish.Body)
responseFinishBody, err := io.ReadAll(respFinish.Body)
if err != nil {
//Failed to read response.
return "", errors.New("could not read from authentication finish request")
Expand Down Expand Up @@ -275,7 +275,7 @@ func (c *AuthClient) Login() (string, error) {
}
defer respCreateSession.Body.Close()

responseCreateSessionBody, err := ioutil.ReadAll(respCreateSession.Body)
responseCreateSessionBody, err := io.ReadAll(respCreateSession.Body)
if err != nil {
return "", errors.New("could not read from create session request")
}
Expand Down Expand Up @@ -337,7 +337,7 @@ func (c *AuthClient) Me() (map[string]interface{}, error) {
}
defer response.Body.Close()

body, err := ioutil.ReadAll(response.Body)
body, err := io.ReadAll(response.Body)
if err != nil {
}
var jsonResult interface{}
Expand Down
7 changes: 4 additions & 3 deletions events.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ package golrackpi
import (
"bytes"
"encoding/json"
"io/ioutil"
"io"

"net/http"

"github.com/geschke/golrackpi/internal/timefix"
Expand Down Expand Up @@ -67,7 +68,7 @@ func (c *AuthClient) EventsWithParam(language string, max int) ([]EventData, err
}
defer response.Body.Close()

body, err := ioutil.ReadAll(response.Body)
body, err := io.ReadAll(response.Body)
if err != nil {
return jsonResult, err
}
Expand Down Expand Up @@ -98,7 +99,7 @@ func (c *AuthClient) Events() ([]EventData, error) {
}
defer response.Body.Close()

body, err := ioutil.ReadAll(response.Body)
body, err := io.ReadAll(response.Body)
if err != nil {
return jsonResult, err
}
Expand Down
11 changes: 8 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
module github.com/geschke/golrackpi

go 1.16
go 1.21

require (
github.com/spf13/cobra v1.4.0
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29
github.com/spf13/cobra v1.8.0
golang.org/x/crypto v0.18.0
)

require (
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
)
23 changes: 8 additions & 15 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,19 +1,12 @@
github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q=
github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o=
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
4 changes: 2 additions & 2 deletions info.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ package golrackpi
import (
"encoding/json"
"errors"
"io"

"io/ioutil"
"net/http"
)

Expand All @@ -30,7 +30,7 @@ func (c *AuthClient) Version() (map[string]interface{}, error) {

}

body, err := ioutil.ReadAll(response.Body)
body, err := io.ReadAll(response.Body)
if err != nil {
return result, err
}
Expand Down
4 changes: 2 additions & 2 deletions modules.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ package golrackpi

import (
"encoding/json"
"io"

"io/ioutil"
"net/http"
)

Expand Down Expand Up @@ -35,7 +35,7 @@ func (c *AuthClient) Modules() ([]ModuleData, error) {
}
defer response.Body.Close()

body, err := ioutil.ReadAll(response.Body)
body, err := io.ReadAll(response.Body)
if err != nil {
return moduleData, err

Expand Down
10 changes: 5 additions & 5 deletions processdata.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ package golrackpi
import (
"bytes"
"encoding/json"
"io"
"strings"

"io/ioutil"
"net/http"
)

Expand Down Expand Up @@ -54,7 +54,7 @@ func (c *AuthClient) ProcessData() ([]ProcessData, error) {
}
defer response.Body.Close()

body, err := ioutil.ReadAll(response.Body)
body, err := io.ReadAll(response.Body)
if err != nil {
return processData, err
}
Expand Down Expand Up @@ -87,7 +87,7 @@ func (c *AuthClient) ProcessDataModule(moduleId string) ([]ProcessDataValues, er
}
defer response.Body.Close()

body, err := ioutil.ReadAll(response.Body)
body, err := io.ReadAll(response.Body)
if err != nil {
return processDataValues, err
}
Expand Down Expand Up @@ -129,7 +129,7 @@ func (c *AuthClient) ProcessDataModuleValues(moduleId string, processDataIds ...
}
defer response.Body.Close()

body, err := ioutil.ReadAll(response.Body)
body, err := io.ReadAll(response.Body)
if err != nil {
return processDataValues, err
}
Expand Down Expand Up @@ -170,7 +170,7 @@ func (c *AuthClient) ProcessDataValues(v []ProcessData) ([]ProcessDataValues, er
}
defer response.Body.Close()

body, err := ioutil.ReadAll(response.Body)
body, err := io.ReadAll(response.Body)
if err != nil {
return processDataValues, err
}
Expand Down
60 changes: 55 additions & 5 deletions settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
package golrackpi

import (
"bytes"
"encoding/json"
"io"
"strings"

"errors"
"io/ioutil"

"net/http"
)

Expand Down Expand Up @@ -57,7 +59,7 @@ func (c *AuthClient) Settings() ([]SettingsData, error) {
}
defer response.Body.Close()

body, err := ioutil.ReadAll(response.Body)
body, err := io.ReadAll(response.Body)
if err != nil {
return jsonResult, err
}
Expand Down Expand Up @@ -90,7 +92,7 @@ func (c *AuthClient) SettingsModule(moduleid string) ([]SettingsValues, error) {
if response.StatusCode != 200 {
return jsonResult, errors.New("module or setting not found")
}
body, err := ioutil.ReadAll(response.Body)
body, err := io.ReadAll(response.Body)
if err != nil {
return jsonResult, err
}
Expand Down Expand Up @@ -126,7 +128,7 @@ func (c *AuthClient) SettingsModuleSetting(moduleid string, settingid string) ([
return jsonResult, errors.New("module or setting not found")
}

body, err := ioutil.ReadAll(response.Body)
body, err := io.ReadAll(response.Body)
if err != nil {
return jsonResult, err
}
Expand Down Expand Up @@ -167,7 +169,7 @@ func (c *AuthClient) SettingsModuleSettings(moduleid string, settingids ...strin
return jsonResult, errors.New("module or setting not found")
}

body, err := ioutil.ReadAll(response.Body)
body, err := io.ReadAll(response.Body)
if err != nil {
return jsonResult, err
}
Expand All @@ -180,3 +182,51 @@ func (c *AuthClient) SettingsModuleSettings(moduleid string, settingids ...strin

return jsonResult, nil
}

// ModuleSettings specifies the structure of the request body for the "settings" endpoint.
type ModuleSettings struct {
Settings []SettingsValues `json:"settings"`
ModuleId string `json:"moduleid"`
}

// write settings
func (c *AuthClient) UpdateSettings(settings []ModuleSettings) ([]ModuleSettings, error) {
jsonResult := []ModuleSettings{}
jsonPayload, err := json.Marshal(settings)

if err != nil {
return jsonResult, err
}

client := http.Client{}
request, err := http.NewRequest("PUT", c.getUrl("/api/v1/settings"), bytes.NewBuffer(jsonPayload))
if err != nil {
return jsonResult, err
}

request.Header.Add("authorization", "Session "+c.SessionId)
request.Header.Add("Content-Type", "application/json")

response, err := client.Do(request)
if err != nil {
return jsonResult, err
}
defer response.Body.Close()

if response.StatusCode != 200 {
return jsonResult, err
}

body, err := io.ReadAll(response.Body) // response body is []byte
if err != nil {
return jsonResult, err
}

err = json.Unmarshal(body, &jsonResult)
if err != nil {
return jsonResult, err

}

return jsonResult, err
}