diff --git a/README.md b/README.md index 04d4dcf2d..4b6c8b61c 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,15 @@ I'm currently using it in my [HomeAssistant](https://www.home-assistant.io/) ins ![alt text](https://github.com/MickMake/GoSungrow/blob/master/docs/SunGrowOnHASSIO5.png?raw=true) +![alt text](https://github.com/MickMake/GoSungrow/blob/master/docs/Grafan1.png?raw=true) + +![alt text](https://github.com/MickMake/GoSungrow/blob/master/docs/Grafan2.png?raw=true) + +![alt text](https://github.com/MickMake/GoSungrow/blob/master/docs/Grafan3.png?raw=true) + +![alt text](https://github.com/MickMake/GoSungrow/blob/master/docs/Grafan4.png?raw=true) + + ## What state is it in? This is currently usable for my needs, (seeing all data in [HomeAssistant](https://www.home-assistant.io/)), but there's quite a few API endpoints that need to be implemented for completeness. diff --git a/cmd/cmd_mqtt.go b/cmd/cmd_mqtt.go index c9cbeda80..828f46bc1 100644 --- a/cmd/cmd_mqtt.go +++ b/cmd/cmd_mqtt.go @@ -136,38 +136,6 @@ func cmdMqttRunFunc(_ *cobra.Command, _ []string) error { // break // } - // var psId int64 - // psId, Cmd.Error = Cmd.SunGrow.GetPsId() - // if err != nil { - // break - // } - // - // fmt.Printf("# Found SunGrow device %d\n", psId) - // // Also getPowerStatistics, getHouseholdStoragePsReport, getPsList, getUpTimePoint, - // ep := Cmd.SunGrow.QueryDevice(psId) - // if ep.IsError() { - // Cmd.Error = ep.GetError() - // break - // } - // - // data := ep.GetData() - // fmt.Printf("# Adding %d entries to HASSIO.\n", len(data.Entries)) - // for i, r := range data.Entries { - // fmt.Printf("%s ", r.PointId) - // Cmd.Error = foo.SensorPublishConfig(r.PointId, r.PointName, r.Unit, i) - // if err != nil { - // break - // } - // Cmd.Error = foo.SensorPublishState(r.PointId, r.Value) - // if err != nil { - // break - // } - // } - // fmt.Println() - // if err != nil { - // break - // } - Cmd.Error = MqttCron() if Cmd.Error != nil { break diff --git a/docs/Grafana1.png b/docs/Grafana1.png new file mode 100644 index 000000000..f86faac43 Binary files /dev/null and b/docs/Grafana1.png differ diff --git a/docs/Grafana2.png b/docs/Grafana2.png new file mode 100644 index 000000000..8556628b5 Binary files /dev/null and b/docs/Grafana2.png differ diff --git a/docs/Grafana3.png b/docs/Grafana3.png new file mode 100644 index 000000000..e355133b5 Binary files /dev/null and b/docs/Grafana3.png differ diff --git a/docs/Grafana4.png b/docs/Grafana4.png new file mode 100644 index 000000000..d619d6a1d Binary files /dev/null and b/docs/Grafana4.png differ diff --git a/go.mod b/go.mod index 50da109f9..7e2a6c900 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.17 require ( github.com/acarl005/textcol v0.0.0 github.com/eclipse/paho.mqtt.golang v1.3.5 - github.com/go-co-op/gocron v1.12.0 + github.com/go-co-op/gocron v1.13.0 github.com/go-git/go-billy/v5 v5.3.1 github.com/go-git/go-git/v5 v5.4.2 github.com/mattn/go-colorable v0.1.12 @@ -16,14 +16,14 @@ require ( github.com/wcharczuk/go-chart/v2 v2.1.0 github.com/willf/pad v0.0.0-20200313202418-172aa767f2a4 go.pennock.tech/tabular v1.1.3 - golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 - golang.org/x/sys v0.0.0-20220209214540-3681064d5158 - google.golang.org/api v0.68.0 + golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b + golang.org/x/sys v0.0.0-20220307203707-22a9840ba4d7 + google.golang.org/api v0.71.0 gopkg.in/alecthomas/kingpin.v2 v2.2.6 ) require ( - cloud.google.com/go/compute v1.2.0 // indirect + cloud.google.com/go/compute v1.5.0 // indirect github.com/Microsoft/go-winio v0.4.16 // indirect github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect @@ -60,12 +60,12 @@ require ( go.opencensus.io v0.23.0 // indirect golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect - golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d // indirect + golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect golang.org/x/text v0.3.7 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e // indirect - google.golang.org/grpc v1.43.0 // indirect + google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8 // indirect + google.golang.org/grpc v1.44.0 // indirect google.golang.org/protobuf v1.27.1 // indirect gopkg.in/ini.v1 v1.66.2 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect diff --git a/go.sum b/go.sum index 13faf1c8c..38840fafb 100644 --- a/go.sum +++ b/go.sum @@ -36,8 +36,9 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0 h1:EKki8sSdvDU0OO9mAXGwPXOTOgPz2l08R0/IutDH11I= -cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0 h1:b1zWmYuuHz7gO9kDcM/EpHGr06UgsYNRpNJzI2kFiLM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= @@ -138,8 +139,8 @@ github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-co-op/gocron v1.12.0 h1:RahikbAIhp/wlNBraICMZfby7bdkeCXe+QQSW323Lpo= -github.com/go-co-op/gocron v1.12.0/go.mod h1:qtlsoMpHlSdIZ3E/xuZzrrAbeX3u5JtPvWf2TcdutU0= +github.com/go-co-op/gocron v1.13.0 h1:BjkuNImPy5NuIPEifhWItFG7pYyr27cyjS6BN9w/D4c= +github.com/go-co-op/gocron v1.13.0/go.mod h1:GD5EIEly1YNW+LovFVx5dzbYVcIc8544K99D8UVRpGo= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= @@ -539,8 +540,10 @@ golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5o golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -557,8 +560,9 @@ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -640,12 +644,15 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220307203707-22a9840ba4d7 h1:8IVLkfbr2cLhv0a/vKq4UFUcJym8RmDoDboxCFWEjYE= +golang.org/x/sys v0.0.0-20220307203707-22a9840ba4d7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -751,9 +758,10 @@ google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUb google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.68.0 h1:9eJiHhwJKIYX6sX2fUZxQLi7pDRA/MYu8c12q6WbJik= -google.golang.org/api v0.68.0/go.mod h1:sOM8pTpwgflXRhz+oC8H2Dr+UcbMqkPPWNJo88Q7TH8= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0 h1:SgWof18M8V2NylsX7bL4fM28j+nFdRopHZbdipaaw20= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -826,10 +834,12 @@ google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e h1:hXl9hnyOkeznztYpYxVPAVZfPzcbO6Q0C+nLXodza8k= -google.golang.org/genproto v0.0.0-20220204002441-d6cc3cc0770e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8 h1:U9V52f6rAgINH7kT+musA1qF8kWyVOxzF8eYuOVuFwQ= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -857,8 +867,9 @@ google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM= google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/iSolarCloud/api/struct_template_points.go b/iSolarCloud/api/struct_template_points.go index 693b97233..fccc020f0 100644 --- a/iSolarCloud/api/struct_template_points.go +++ b/iSolarCloud/api/struct_template_points.go @@ -56,6 +56,7 @@ func CreatePoints(points []string) TemplatePoints { for _, p := range points { pa := strings.Split(p, ".") if len(pa) == 2 { + pa[1] = "p" + strings.TrimPrefix(pa[1], "p") ret = append(ret, TemplatePoint{ Description: "", PsKey: pa[0], diff --git a/iSolarCloud/api/web.go b/iSolarCloud/api/web.go index 725307e62..8553498b9 100644 --- a/iSolarCloud/api/web.go +++ b/iSolarCloud/api/web.go @@ -17,6 +17,7 @@ import ( "net/http" ) + type Web struct { Url EndPointUrl Body []byte @@ -30,6 +31,7 @@ type Web struct { httpResponse *http.Response } + func (w *Web) SetUrl(u string) error { w.Url = SetUrl(u) // w.Error = w.Url.Error diff --git a/iSolarCloud/cache.go b/iSolarCloud/cache.go new file mode 100644 index 000000000..28f9584b5 --- /dev/null +++ b/iSolarCloud/cache.go @@ -0,0 +1,2 @@ +package iSolarCloud + diff --git a/iSolarCloud/const.go b/iSolarCloud/const.go index 2e2f643f1..0767f56da 100644 --- a/iSolarCloud/const.go +++ b/iSolarCloud/const.go @@ -2,4 +2,4 @@ package iSolarCloud import "time" -const DefaultCacheTimeout = time.Hour +const DefaultCacheTimeout = time.Minute * 5 diff --git a/iSolarCloud/funcs.go b/iSolarCloud/funcs.go index 7c5f576e3..7d8a03843 100644 --- a/iSolarCloud/funcs.go +++ b/iSolarCloud/funcs.go @@ -2,244 +2,9 @@ package iSolarCloud import ( "GoSungrow/Only" - "GoSungrow/iSolarCloud/AppService/getPsDetailWithPsType" - "GoSungrow/iSolarCloud/AppService/getPsList" - "GoSungrow/iSolarCloud/AppService/queryMutiPointDataList" - "GoSungrow/iSolarCloud/api" - "GoSungrow/iSolarCloud/api/output" - "errors" - "fmt" - "strconv" - "time" ) -func (sg *SunGrow) GetByJson(endpoint string, request string) api.EndPoint { - var ret api.EndPoint - for range Only.Once { - ret = sg.GetEndpoint(endpoint) - if sg.Error != nil { - break - } - if ret.IsError() { - sg.Error = ret.GetError() - break - } - - if request != "" { - ret = ret.SetRequestByJson(output.Json(request)) - if ret.IsError() { - fmt.Println(ret.Help()) - sg.Error = ret.GetError() - break - } - } - - ret = ret.Call() - if ret.IsError() { - fmt.Println(ret.Help()) - sg.Error = ret.GetError() - break - } - - switch { - case sg.OutputType.IsNone(): - - case sg.OutputType.IsFile(): - sg.Error = ret.WriteDataFile() - - case sg.OutputType.IsRaw(): - fmt.Println(ret.GetJsonData(true)) - - case sg.OutputType.IsJson(): - fmt.Println(ret.GetJsonData(false)) - - default: - } - } - return ret -} - -func (sg *SunGrow) GetByStruct(endpoint string, request interface{}, cache time.Duration) api.EndPoint { - var ret api.EndPoint - for range Only.Once { - ret = sg.GetEndpoint(endpoint) - if sg.Error != nil { - break - } - if ret.IsError() { - sg.Error = ret.GetError() - break - } - - if request != nil { - ret = ret.SetRequest(request) - if ret.IsError() { - sg.Error = ret.GetError() - break - } - } - - ret = ret.SetCacheTimeout(cache) - // if ret.CheckCache() { - // ret = ret.ReadCache() - // if !ret.IsError() { - // break - // } - // } - - ret = ret.Call() - if ret.IsError() { - sg.Error = ret.GetError() - break - } - - // sg.Error = ret.WriteCache() - // if sg.Error != nil { - // break - // } - } - - return ret -} - -func (sg *SunGrow) GetPointData(date string, pointNames api.TemplatePoints) error { - for range Only.Once { - if len(pointNames) == 0 { - sg.Error = errors.New("no points defined") - break - } - - if date == "" { - date = api.NewDateTime("").String() - } - when := api.NewDateTime(date) - - var psId int64 - psId, sg.Error = sg.GetPsId() - if sg.Error != nil { - break - } - - ep := sg.GetByStruct( - "AppService.queryMutiPointDataList", - queryMutiPointDataList.RequestData { - PsID: psId, - PsKey: pointNames.PrintKeys(), - Points: pointNames.PrintPoints(), - MinuteInterval: "5", - StartTimeStamp: when.GetDayStartTimestamp(), - EndTimeStamp: when.GetDayEndTimestamp(), - }, - DefaultCacheTimeout, - ) - if sg.Error != nil { - break - } - - ep2 := queryMutiPointDataList.Assert(ep) - table := ep2.GetDataTable(pointNames) - if table.Error != nil { - sg.Error = table.Error - break - } - - sg.Error = sg.Output(ep2, &table, "") - if sg.Error != nil { - break - } - } - - return sg.Error -} - -func (sg *SunGrow) Output(endpoint api.EndPoint, table *output.Table, graphFilter string) error { - for range Only.Once { - switch { - case sg.OutputType.IsNone(): - - case sg.OutputType.IsHuman(): - if table == nil { - break - } - table.Print() - - case sg.OutputType.IsFile(): - if table == nil { - break - } - sg.Error = table.WriteCsvFile() - - case sg.OutputType.IsRaw(): - fmt.Println(endpoint.GetJsonData(true)) - - case sg.OutputType.IsJson(): - fmt.Println(endpoint.GetJsonData(false)) - - case sg.OutputType.IsGraph(): - if table == nil { - break - } - sg.Error = table.SetGraphFromJson(output.Json(graphFilter)) - if sg.Error != nil { - break - } - sg.Error = table.CreateGraph() - if sg.Error != nil { - break - } - - default: - } - } - - return sg.Error -} - -func (sg *SunGrow) GetPsId() (int64, error) { - var ret int64 - - for range Only.Once { - - ep := sg.GetByStruct("AppService.getPsList", nil, DefaultCacheTimeout) - if ep.IsError() { - sg.Error = ep.GetError() - break - } - - _getPsList := getPsList.AssertResultData(ep) - ret = _getPsList.GetPsId() - } - - return ret, sg.Error -} - -func (sg *SunGrow) GetPsKeys() ([]string, error) { - var ret []string - - for range Only.Once { - var psId int64 - psId, sg.Error = sg.GetPsId() - if sg.Error != nil { - break - } - - ep := sg.GetByStruct( - "AppService.getPsDetailWithPsType", - getPsDetailWithPsType.RequestData{PsId: strconv.FormatInt(psId, 10)}, - DefaultCacheTimeout) - if ep.IsError() { - sg.Error = ep.GetError() - break - } - - ep2 := getPsDetailWithPsType.Assert(ep) - ret = ep2.GetPsKeys() - } - - return ret, sg.Error -} - func fillArray(count int, args []string) []string { var ret []string for range Only.Once { diff --git a/iSolarCloud/highlevel.go b/iSolarCloud/highlevel.go index ff11d164d..430a00757 100644 --- a/iSolarCloud/highlevel.go +++ b/iSolarCloud/highlevel.go @@ -135,7 +135,7 @@ func (sg *SunGrow) GetTemplatePoints(template string) error { ss := sg.GetPointNamesFromTemplate(template) for _, s := range ss { sg.Error = table.AddRow( - s.PointId, + api.NameDevicePoint(s.PsKey, s.PointId), s.Description, s.Unit, ) @@ -436,7 +436,6 @@ func (sg *SunGrow) GetRealTimeData(psKey string) error { } func (sg *SunGrow) GetPsDetails(psid string) error { - for range Only.Once { var psId int64 if psid == "" { @@ -472,3 +471,97 @@ func (sg *SunGrow) GetPsDetails(psid string) error { return sg.Error } + +func (sg *SunGrow) GetPointData(date string, pointNames api.TemplatePoints) error { + for range Only.Once { + if len(pointNames) == 0 { + sg.Error = errors.New("no points defined") + break + } + + if date == "" { + date = api.NewDateTime("").String() + } + when := api.NewDateTime(date) + + var psId int64 + psId, sg.Error = sg.GetPsId() + if sg.Error != nil { + break + } + + ep := sg.GetByStruct( + "AppService.queryMutiPointDataList", + queryMutiPointDataList.RequestData { + PsID: psId, + PsKey: pointNames.PrintKeys(), + Points: pointNames.PrintPoints(), + MinuteInterval: "5", + StartTimeStamp: when.GetDayStartTimestamp(), + EndTimeStamp: when.GetDayEndTimestamp(), + }, + DefaultCacheTimeout, + ) + if sg.Error != nil { + break + } + + ep2 := queryMutiPointDataList.Assert(ep) + table := ep2.GetDataTable(pointNames) + if table.Error != nil { + sg.Error = table.Error + break + } + + sg.Error = sg.Output(ep2, &table, "") + if sg.Error != nil { + break + } + } + + return sg.Error +} + +func (sg *SunGrow) GetPsId() (int64, error) { + var ret int64 + + for range Only.Once { + + ep := sg.GetByStruct("AppService.getPsList", nil, DefaultCacheTimeout) + if ep.IsError() { + sg.Error = ep.GetError() + break + } + + _getPsList := getPsList.AssertResultData(ep) + ret = _getPsList.GetPsId() + } + + return ret, sg.Error +} + +func (sg *SunGrow) GetPsKeys() ([]string, error) { + var ret []string + + for range Only.Once { + var psId int64 + psId, sg.Error = sg.GetPsId() + if sg.Error != nil { + break + } + + ep := sg.GetByStruct( + "AppService.getPsDetailWithPsType", + getPsDetailWithPsType.RequestData{PsId: strconv.FormatInt(psId, 10)}, + DefaultCacheTimeout) + if ep.IsError() { + sg.Error = ep.GetError() + break + } + + ep2 := getPsDetailWithPsType.Assert(ep) + ret = ep2.GetPsKeys() + } + + return ret, sg.Error +} diff --git a/iSolarCloud/struct.go b/iSolarCloud/struct.go index 97b6f87a5..7914a005f 100644 --- a/iSolarCloud/struct.go +++ b/iSolarCloud/struct.go @@ -12,9 +12,12 @@ import ( "GoSungrow/iSolarCloud/api" "GoSungrow/iSolarCloud/api/output" "errors" + "fmt" "strings" + "time" ) + type SunGrow struct { ApiRoot api.Web Auth login.EndPoint @@ -23,11 +26,6 @@ type SunGrow struct { NeedLogin bool OutputType output.OutputType - // EndPoint api.EndPoint - - // OutputString string - // OutputArray [][]interface{} - // OutputType } func NewSunGro(baseUrl string, cacheDir string) *SunGrow { @@ -99,6 +97,95 @@ func (sg *SunGrow) GetEndpoint(ae string) api.EndPoint { return ep } +func (sg *SunGrow) GetByJson(endpoint string, request string) api.EndPoint { + var ret api.EndPoint + for range Only.Once { + ret = sg.GetEndpoint(endpoint) + if sg.Error != nil { + break + } + if ret.IsError() { + sg.Error = ret.GetError() + break + } + + if request != "" { + ret = ret.SetRequestByJson(output.Json(request)) + if ret.IsError() { + fmt.Println(ret.Help()) + sg.Error = ret.GetError() + break + } + } + + ret = ret.Call() + if ret.IsError() { + fmt.Println(ret.Help()) + sg.Error = ret.GetError() + break + } + + switch { + case sg.OutputType.IsNone(): + + case sg.OutputType.IsFile(): + sg.Error = ret.WriteDataFile() + + case sg.OutputType.IsRaw(): + fmt.Println(ret.GetJsonData(true)) + + case sg.OutputType.IsJson(): + fmt.Println(ret.GetJsonData(false)) + + default: + } + } + return ret +} + +func (sg *SunGrow) GetByStruct(endpoint string, request interface{}, cache time.Duration) api.EndPoint { + var ret api.EndPoint + for range Only.Once { + ret = sg.GetEndpoint(endpoint) + if sg.Error != nil { + break + } + if ret.IsError() { + sg.Error = ret.GetError() + break + } + + if request != nil { + ret = ret.SetRequest(request) + if ret.IsError() { + sg.Error = ret.GetError() + break + } + } + + ret = ret.SetCacheTimeout(cache) + // if ret.CheckCache() { + // ret = ret.ReadCache() + // if !ret.IsError() { + // break + // } + // } + + ret = ret.Call() + if ret.IsError() { + sg.Error = ret.GetError() + break + } + + // sg.Error = ret.WriteCache() + // if sg.Error != nil { + // break + // } + } + + return ret +} + func (sg *SunGrow) SplitEndPoint(ae string) (string, string) { var area string var endpoint string @@ -141,6 +228,49 @@ func (sg *SunGrow) AreaNotExists(area string) bool { return sg.Areas.NotExists(area) } +func (sg *SunGrow) Output(endpoint api.EndPoint, table *output.Table, graphFilter string) error { + for range Only.Once { + switch { + case sg.OutputType.IsNone(): + + case sg.OutputType.IsHuman(): + if table == nil { + break + } + table.Print() + + case sg.OutputType.IsFile(): + if table == nil { + break + } + sg.Error = table.WriteCsvFile() + + case sg.OutputType.IsRaw(): + fmt.Println(endpoint.GetJsonData(true)) + + case sg.OutputType.IsJson(): + fmt.Println(endpoint.GetJsonData(false)) + + case sg.OutputType.IsGraph(): + if table == nil { + break + } + sg.Error = table.SetGraphFromJson(output.Json(graphFilter)) + if sg.Error != nil { + break + } + sg.Error = table.CreateGraph() + if sg.Error != nil { + break + } + + default: + } + } + + return sg.Error +} + func (sg *SunGrow) Login(auth login.SunGrowAuth) error { for range Only.Once { a := sg.GetEndpoint(AppService.GetAreaName() + ".login") diff --git a/mmMqtt/struct.go b/mmMqtt/struct.go index b7f10419d..c911a9ba2 100644 --- a/mmMqtt/struct.go +++ b/mmMqtt/struct.go @@ -266,6 +266,11 @@ func (m *Mqtt) SensorPublishConfig(point api.DataEntry) error { case "℃": class = "temperature" + // point.Unit = "C" + + case "C": + class = "temperature" + point.Unit = "℃" case "%": class = "battery"