v1.4.1 docs

This commit is contained in:
MickMake 2022-03-10 19:56:37 +11:00
parent 6778af7233
commit 006d970cde
16 changed files with 287 additions and 301 deletions

View File

@ -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.

View File

@ -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

BIN
docs/Grafana1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

BIN
docs/Grafana2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

BIN
docs/Grafana3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

BIN
docs/Grafana4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

16
go.mod
View File

@ -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

47
go.sum
View File

@ -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=

View File

@ -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],

View File

@ -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

2
iSolarCloud/cache.go Normal file
View File

@ -0,0 +1,2 @@
package iSolarCloud

View File

@ -2,4 +2,4 @@ package iSolarCloud
import "time"
const DefaultCacheTimeout = time.Hour
const DefaultCacheTimeout = time.Minute * 5

View File

@ -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 {

View File

@ -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
}

View File

@ -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")

View File

@ -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"