From adb109944bee0f4ddda7e1372fc5a957667deeb5 Mon Sep 17 00:00:00 2001 From: MickMake Date: Thu, 13 Oct 2022 12:01:27 +1100 Subject: [PATCH] v2.3.1 - More endpoints. --- .idea/workspace.xml | 173 ++-- cmd/cmd_data.go | 42 + cmd/cmd_mqtt.go | 33 +- iSolarCloud/AppService/findPsType/data.go | 79 ++ .../AppService/getAllDeviceByPsId/data.go | 83 +- iSolarCloud/AppService/getDeviceList/data.go | 202 +++- .../AppService/getIncomeSettingInfos/data.go | 139 ++- iSolarCloud/AppService/getKpiInfo/data.go | 68 +- iSolarCloud/AppService/getPsDetail/data.go | 215 ++--- .../AppService/getPsDetailWithPsType/data.go | 17 +- iSolarCloud/AppService/getPsList/data.go | 2 +- .../AppService/queryDeviceList/data.go | 255 +++--- .../AppService/queryDeviceListForApp/data.go | 84 +- iSolarCloud/api/apiReflect/reflect.go | 20 +- iSolarCloud/api/const.go | 2 + iSolarCloud/api/nullEndpoint/data.go | 49 +- iSolarCloud/api/nullEndpoint/struct.go | 62 ++ iSolarCloud/api/struct_data.go | 115 ++- iSolarCloud/highlevel.go | 866 ++++++++++++++++-- 19 files changed, 1934 insertions(+), 572 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 4dcac8502..fb6aeb742 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,41 +5,25 @@ - - - - - - - + + + + + - + - - - + + - - - - - - - - - - - - - diff --git a/cmd/cmd_data.go b/cmd/cmd_data.go index f9c9d0000..f09d48f6c 100644 --- a/cmd/cmd_data.go +++ b/cmd/cmd_data.go @@ -95,6 +95,7 @@ func (c *CmdData) AttachCommand(cmd *cobra.Command) *cobra.Command { c.AttachCmdDataPoints(cmdDataGet) c.AttachCmdDataRealTime(cmdDataGet) c.AttachCmdDataPsDetails(cmdDataGet) + c.AttachCmdDataAll(cmdDataGet) // ******************************************************************************** var cmdDataRaw = &cobra.Command{ @@ -128,6 +129,7 @@ func (c *CmdData) AttachCommand(cmd *cobra.Command) *cobra.Command { c.AttachCmdDataPoints(cmdDataRaw) c.AttachCmdDataRealTime(cmdDataRaw) c.AttachCmdDataPsDetails(cmdDataRaw) + c.AttachCmdDataAll(cmdDataRaw) // ******************************************************************************** var cmdDataJson = &cobra.Command{ @@ -161,6 +163,7 @@ func (c *CmdData) AttachCommand(cmd *cobra.Command) *cobra.Command { c.AttachCmdDataPoints(cmdDataJson) c.AttachCmdDataRealTime(cmdDataJson) c.AttachCmdDataPsDetails(cmdDataJson) + c.AttachCmdDataAll(cmdDataJson) // ******************************************************************************** var cmdDataCsv = &cobra.Command{ @@ -194,6 +197,7 @@ func (c *CmdData) AttachCommand(cmd *cobra.Command) *cobra.Command { c.AttachCmdDataPoints(cmdDataCsv) c.AttachCmdDataRealTime(cmdDataCsv) c.AttachCmdDataPsDetails(cmdDataCsv) + c.AttachCmdDataAll(cmdDataCsv) // ******************************************************************************** var cmdDataGraph = &cobra.Command{ @@ -226,6 +230,7 @@ func (c *CmdData) AttachCommand(cmd *cobra.Command) *cobra.Command { c.AttachCmdDataTemplate(cmdDataGraph) c.AttachCmdDataPoints(cmdDataGraph) c.AttachCmdDataRealTime(cmdDataGraph) + // c.AttachCmdDataAll(cmdDataGraph) // ******************************************************************************** var cmdDataPut = &cobra.Command{ @@ -436,3 +441,40 @@ func (c *CmdData) AttachCmdDataPsDetails(cmd *cobra.Command) *cobra.Command { return cmd } + +func (c *CmdData) AttachCmdDataAll(cmd *cobra.Command) *cobra.Command { + // ******************************************************************************** + var c2 = &cobra.Command{ + Use: "all", + Aliases: []string{}, + Annotations: map[string]string{"group": "Data"}, + Short: fmt.Sprintf("Get all iSolarCloud ps details."), + Long: fmt.Sprintf("Get all iSolarCloud ps details."), + DisableFlagParsing: false, + DisableFlagsInUseLine: false, + PreRunE: func(cmd *cobra.Command, args []string) error { + cmds.Error = cmds.ProcessArgs(cmd, args) + if cmds.Error != nil { + return cmds.Error + } + cmds.Error = cmds.SunGrowArgs(cmd, args) + if cmds.Error != nil { + return cmds.Error + } + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + _ = cmds.SetOutputType(cmd) + // pids, err := cmds.Api.SunGrow.StringToPids(args...) + // if err != nil { + // return err + // } + return cmds.Api.SunGrow.GetEndpoints(args) + }, + Args: cobra.MinimumNArgs(0), + } + cmd.AddCommand(c2) + c2.Example = cmdHelp.PrintExamples(c2, "") + + return cmd +} diff --git a/cmd/cmd_mqtt.go b/cmd/cmd_mqtt.go index 774c20877..6428a16ec 100644 --- a/cmd/cmd_mqtt.go +++ b/cmd/cmd_mqtt.go @@ -2,6 +2,7 @@ package cmd import ( "GoSungrow/Only" + "GoSungrow/iSolarCloud" "GoSungrow/iSolarCloud/api" "GoSungrow/mmHa" "errors" @@ -341,13 +342,19 @@ func (ca *Cmds) MqttCron() error { newDay = true } + var data iSolarCloud.SunGrowData + data.New(ca.Api.SunGrow) + + // All := []string{ "queryDeviceList", "getPsList", "getPsDetailWithPsType", "getPsDetail" } + All := []string{ "getPsDetail" } for psId, ok := range ca.Mqtt.Mqtt.SungrowPsIds { if !ok { continue } for _, endpoint := range All { - ca.Error = ca.Update(endpoint, psId, newDay) + response := data.Get(endpoint, iSolarCloud.SunGrowDataRequest{ PsId: psId }) + ca.Error = ca.Update(endpoint, response.Data, newDay) if ca.Error != nil { break } @@ -363,31 +370,11 @@ func (ca *Cmds) MqttCron() error { return ca.Error } -// var All = []string{ "queryDeviceList", "getPsList", "getPsDetailWithPsType" } -var All = []string{ "getPsDetail" } -func (ca *Cmds) Update(endpoint string, psId api.Integer, newDay bool) error { +func (ca *Cmds) Update(endpoint string, data api.DataMap, newDay bool) error { for range Only.Once { // Also getPowerStatistics, getHouseholdStoragePsReport, getPsList, getUpTimePoint, - var data api.DataMap - switch endpoint { - case "queryDeviceList": - ep := ca.Api.SunGrow.QueryDeviceList(psId) - data = ep.GetData() - - case "getPsList": - ep := ca.Api.SunGrow.GetPsList() - data = ep.GetData() - - case "getPsDetailWithPsType": - ep := ca.Api.SunGrow.GetPsDetailWithPsType(psId) - data = ep.GetData() - - case "getPsDetail": - ep := ca.Api.SunGrow.GetPsDetail(psId) - data = ep.GetData() - } - cmdLog.LogPrintDate("Syncing %d entries with HASSIO from %s.\n", len(data.DataPoints), endpoint) + for _, o := range data.Order { entries := data.DataPoints[o] r := entries.GetEntry(api.LastEntry) // Gets the last entry diff --git a/iSolarCloud/AppService/findPsType/data.go b/iSolarCloud/AppService/findPsType/data.go index 4c017fb66..734695ba5 100644 --- a/iSolarCloud/AppService/findPsType/data.go +++ b/iSolarCloud/AppService/findPsType/data.go @@ -3,7 +3,11 @@ package findPsType import ( "GoSungrow/iSolarCloud/api" "GoSungrow/iSolarCloud/api/apiReflect" + "GoSungrow/iSolarCloud/api/output" "fmt" + "github.com/MickMake/GoUnify/Only" + "sort" + "time" ) const Url = "/v1/powerStationService/findPsType" @@ -56,3 +60,78 @@ func (e *ResultData) IsValid() error { // // return err //} + +func (e *EndPoint) GetData() api.DataMap { + entries := api.NewDataMap() + + for range Only.Once { + pkg := apiReflect.GetName("", *e) + for _, d := range e.Response.ResultData { + name := fmt.Sprintf("%s.%s", pkg, e.Request.PsId.String()) + entries.StructToPoints(d, name, e.Request.PsId.String(), time.Time{}) + } + } + + return entries +} + +func (e *EndPoint) GetDataTable() output.Table { + var table output.Table + for range Only.Once { + table = output.NewTable() + table.SetTitle("") + table.SetJson([]byte(e.GetJsonData(false))) + table.SetRaw([]byte(e.GetJsonData(true))) + + _ = table.SetHeader( + "Date", + "Point Id", + // "Parents", + "Group Name", + "Description", + "Value", + "Unit", + ) + + data := e.GetData() + var sorted []string + for p := range data.DataPoints { + sorted = append(sorted, string(p)) + } + sort.Strings(sorted) + + for _, p := range sorted { + entries := data.DataPoints[api.PointId(p)] + for _, de := range entries { + if de.Hide { + continue + } + + _ = table.AddRow( + de.Date.Format(api.DtLayout), + // api.NameDevicePointInt(de.Point.Parents, p.PointID.Value()), + // de.Point.Id, + p, + // de.Point.Parents.String(), + de.Point.GroupName, + de.Point.Name, + de.Value, + de.Point.Unit, + ) + } + } + + // table.InitGraph(output.GraphRequest { + // Title: "", + // TimeColumn: output.SetInteger(1), + // SearchColumn: output.SetInteger(2), + // NameColumn: output.SetInteger(4), + // ValueColumn: output.SetInteger(5), + // UnitsColumn: output.SetInteger(6), + // SearchString: output.SetString(""), + // MinLeftAxis: output.SetFloat(0), + // MaxLeftAxis: output.SetFloat(0), + // }) + } + return table +} diff --git a/iSolarCloud/AppService/getAllDeviceByPsId/data.go b/iSolarCloud/AppService/getAllDeviceByPsId/data.go index 00cfbe187..466e09ab0 100644 --- a/iSolarCloud/AppService/getAllDeviceByPsId/data.go +++ b/iSolarCloud/AppService/getAllDeviceByPsId/data.go @@ -1,16 +1,20 @@ package getAllDeviceByPsId import ( + "GoSungrow/iSolarCloud/api" "GoSungrow/iSolarCloud/api/apiReflect" + "GoSungrow/iSolarCloud/api/output" "errors" "fmt" + "github.com/MickMake/GoUnify/Only" + "sort" ) const Url = "/v1/devService/getAllDeviceByPsId" -const Disabled = true +const Disabled = false type RequestData struct { - // DeviceType string `json:"device_type" required:"true"` + PsId api.Integer `json:"ps_id" required:"true"` } func (rd RequestData) IsValid() error { @@ -56,3 +60,78 @@ func (e *ResultData) IsValid() error { // // return err //} + +func (e *EndPoint) GetData() api.DataMap { + entries := api.NewDataMap() + + for range Only.Once { + // pkg := apiReflect.GetName("", *e) + // for _, d := range e.Response.ResultData { + // name := fmt.Sprintf("findPsType.%s", e.Request.PsId.String()) + // entries.StructToPoints(d, name, e.Request.PsId.String(), time.Time{}) + // } + } + + return entries +} + +func (e *EndPoint) GetDataTable() output.Table { + var table output.Table + for range Only.Once { + table = output.NewTable() + table.SetTitle("") + table.SetJson([]byte(e.GetJsonData(false))) + table.SetRaw([]byte(e.GetJsonData(true))) + + _ = table.SetHeader( + "Date", + "Point Id", + // "Parents", + "Group Name", + "Description", + "Value", + "Unit", + ) + + data := e.GetData() + var sorted []string + for p := range data.DataPoints { + sorted = append(sorted, string(p)) + } + sort.Strings(sorted) + + for _, p := range sorted { + entries := data.DataPoints[api.PointId(p)] + for _, de := range entries { + if de.Hide { + continue + } + + _ = table.AddRow( + de.Date.Format(api.DtLayout), + // api.NameDevicePointInt(de.Point.Parents, p.PointID.Value()), + // de.Point.Id, + p, + // de.Point.Parents.String(), + de.Point.GroupName, + de.Point.Name, + de.Value, + de.Point.Unit, + ) + } + } + + // table.InitGraph(output.GraphRequest { + // Title: "", + // TimeColumn: output.SetInteger(1), + // SearchColumn: output.SetInteger(2), + // NameColumn: output.SetInteger(4), + // ValueColumn: output.SetInteger(5), + // UnitsColumn: output.SetInteger(6), + // SearchString: output.SetString(""), + // MinLeftAxis: output.SetFloat(0), + // MaxLeftAxis: output.SetFloat(0), + // }) + } + return table +} diff --git a/iSolarCloud/AppService/getDeviceList/data.go b/iSolarCloud/AppService/getDeviceList/data.go index 4c4711c47..1d9cf1180 100644 --- a/iSolarCloud/AppService/getDeviceList/data.go +++ b/iSolarCloud/AppService/getDeviceList/data.go @@ -6,6 +6,8 @@ import ( "GoSungrow/iSolarCloud/api/output" "fmt" "github.com/MickMake/GoUnify/Only" + "sort" + "time" ) const Url = "/v1/devService/getDeviceList" @@ -27,7 +29,7 @@ func (rd RequestData) Help() string { type ResultData struct { PageList []struct { AttrID api.Integer `json:"attr_id"` - ChannelId api.Integer `json:"chnnl_id"` + ChannelId api.Integer `json:"chnnl_id" PointId:"channel_id"` CommandStatus api.Integer `json:"command_status"` ConnectState api.Integer `json:"connect_state"` DataFlag api.Integer `json:"data_flag"` @@ -36,7 +38,7 @@ type ResultData struct { DevStatus string `json:"dev_status"` DeviceArea string `json:"device_area"` DeviceCode api.Integer `json:"device_code"` - DeviceFactoryDate interface{} `json:"device_factory_date"` + DeviceFactoryDate api.DateTime `json:"device_factory_date"` DeviceID api.Integer `json:"device_id"` DeviceModel api.String `json:"device_model"` DeviceModelCode api.String `json:"device_model_code"` @@ -67,7 +69,7 @@ type ResultData struct { PsID api.Integer `json:"ps_id"` PsKey api.PsKey `json:"ps_key"` RelState api.Integer `json:"rel_state"` - Sn api.String `json:"sn"` + Sn api.String `json:"sn" PointName:"Serial Number"` TypeName api.String `json:"type_name"` UUID api.Integer `json:"uuid"` } `json:"pageList"` @@ -104,7 +106,48 @@ func (e *ResultData) IsValid() error { // return err //} -func (e *EndPoint) GetDataTable() output.Table { +type Device struct { + Vendor api.String + PsId api.Integer + PsKey api.PsKey + DeviceName api.String + DeviceProSn api.String + DeviceModel api.String + DeviceType api.Integer + DeviceCode api.Integer + ChannelId api.Integer + DeviceModelID api.Integer + TypeName api.String + DeviceState string + DevStatus string + Uuid api.Integer +} +type Devices []Device + +func (e *EndPoint) GetDevices() Devices { + var ret Devices + for _, d := range e.Response.ResultData.PageList { + ret = append(ret, Device{ + Vendor: d.FactoryName, + PsKey: d.PsKey, + PsId: d.PsID, + DeviceType: d.DeviceType, + DeviceCode: d.DeviceCode, + ChannelId: d.ChannelId, + TypeName: d.TypeName, + DeviceProSn: d.DeviceProSn, + DeviceModel: d.DeviceModel, + DeviceModelID: d.DeviceModelID, + DeviceName: d.DeviceName, + DeviceState: d.DeviceState, + DevStatus: d.DevStatus, + Uuid: d.ModuleUUID, + }) + } + return ret +} + +func (e *EndPoint) GetDevicesTable() output.Table { var table output.Table for range Only.Once { // table = output.NewTable() @@ -146,14 +189,52 @@ func (e *EndPoint) GetDataTable() output.Table { // } data := e.GetDevices() - table = GetDataTable(data) + table = GetDevicesTable(data) } return table } -func GetDataTable(data Devices) output.Table { +func GetDevicesTable(data Devices) output.Table { var table output.Table for range Only.Once { + // table = output.NewTable() + // table.SetTitle("") + // table.SetJson([]byte(e.GetJsonData(false))) + // table.SetRaw([]byte(e.GetJsonData(true))) + // + // _ = table.SetHeader( + // "Ps Key", + // "Ps Id", + // "Type", + // "Code", + // "Id", + // "Type Name", + // "Serial Number", + // "Model", + // "Model Id", + // "Name", + // "State", + // "Status", + // // "Factory Date", + // ) + // for _, d := range e.Response.ResultData.PageList { + // _ = table.AddRow( + // d.PsKey.Value(), + // d.PsID.Value(), + // d.DeviceType.Value(), + // d.DeviceCode.Value(), + // d.ChannelId.Value(), + // d.TypeName.Value(), + // d.DeviceProSn.Value(), + // d.DeviceModel.Value(), + // d.DeviceModelID.Value(), + // d.DeviceName.Value(), + // d.DeviceState, + // d.DevStatus, + // // d.DeviceFactoryDate, + // ) + // } + table = output.NewTable() table.SetTitle("") // table.SetJson([]byte(e.GetJsonData(false))) @@ -197,43 +278,78 @@ func GetDataTable(data Devices) output.Table { return table } -type Device struct { - Vendor api.String - PsId api.Integer - PsKey api.PsKey - DeviceName api.String - DeviceProSn api.String - DeviceModel api.String - DeviceType api.Integer - DeviceCode api.Integer - ChannelId api.Integer - DeviceModelID api.Integer - TypeName api.String - DeviceState string - DevStatus string - Uuid api.Integer -} -type Devices []Device -func (e *EndPoint) GetDevices() Devices { - var ret Devices - for _, d := range e.Response.ResultData.PageList { - ret = append(ret, Device{ - Vendor: d.FactoryName, - PsKey: d.PsKey, - PsId: d.PsID, - DeviceType: d.DeviceType, - DeviceCode: d.DeviceCode, - ChannelId: d.ChannelId, - TypeName: d.TypeName, - DeviceProSn: d.DeviceProSn, - DeviceModel: d.DeviceModel, - DeviceModelID: d.DeviceModelID, - DeviceName: d.DeviceName, - DeviceState: d.DeviceState, - DevStatus: d.DevStatus, - Uuid: d.ModuleUUID, - }) +func (e *EndPoint) GetData() api.DataMap { + entries := api.NewDataMap() + + for range Only.Once { + pkg := apiReflect.GetName("", *e) + for _, d := range e.Response.ResultData.PageList { + name := fmt.Sprintf("%s.%s", pkg, d.PsKey.Value()) + entries.StructToPoints(d, name, e.Request.PsId.String(), time.Time{}) + } } - return ret + + return entries +} + +func (e *EndPoint) GetDataTable() output.Table { + var table output.Table + for range Only.Once { + table = output.NewTable() + table.SetTitle("") + table.SetJson([]byte(e.GetJsonData(false))) + table.SetRaw([]byte(e.GetJsonData(true))) + + _ = table.SetHeader( + "Date", + "Point Id", + // "Parents", + "Group Name", + "Description", + "Value", + "Unit", + ) + + data := e.GetData() + var sorted []string + for p := range data.DataPoints { + sorted = append(sorted, string(p)) + } + sort.Strings(sorted) + + for _, p := range sorted { + entries := data.DataPoints[api.PointId(p)] + for _, de := range entries { + if de.Hide { + continue + } + + _ = table.AddRow( + de.Date.Format(api.DtLayout), + // api.NameDevicePointInt(de.Point.Parents, p.PointID.Value()), + // de.Point.Id, + p, + // de.Point.Parents.String(), + de.Point.GroupName, + de.Point.Name, + de.Value, + de.Point.Unit, + ) + } + } + + // table.InitGraph(output.GraphRequest { + // Title: "", + // TimeColumn: output.SetInteger(1), + // SearchColumn: output.SetInteger(2), + // NameColumn: output.SetInteger(4), + // ValueColumn: output.SetInteger(5), + // UnitsColumn: output.SetInteger(6), + // SearchString: output.SetString(""), + // MinLeftAxis: output.SetFloat(0), + // MaxLeftAxis: output.SetFloat(0), + // }) + } + return table } diff --git a/iSolarCloud/AppService/getIncomeSettingInfos/data.go b/iSolarCloud/AppService/getIncomeSettingInfos/data.go index 369b48579..5dd135507 100644 --- a/iSolarCloud/AppService/getIncomeSettingInfos/data.go +++ b/iSolarCloud/AppService/getIncomeSettingInfos/data.go @@ -3,7 +3,11 @@ package getIncomeSettingInfos import ( "GoSungrow/iSolarCloud/api" "GoSungrow/iSolarCloud/api/apiReflect" + "GoSungrow/iSolarCloud/api/output" "fmt" + "github.com/MickMake/GoUnify/Only" + "sort" + "time" ) const Url = "/v1/powerStationService/getIncomeSettingInfos" @@ -22,39 +26,38 @@ func (rd RequestData) Help() string { return ret } - -type ResultData struct { - CodeType api.Integer `json:"code_type"` +type ResultData struct { + CodeType api.Integer `json:"code_type"` EnvironmentPowerChargeList []interface{} `json:"enviormentPowerChargeList"` - ParamIncomeUnit api.Integer `json:"param_income_unit"` - PowerElectricalChargeMap struct { - CityAllowanceMoney interface{} `json:"city_allowance_money"` - CodeType api.Integer `json:"code_type"` - CountyAllowanceMoney interface{} `json:"county_allowance_money"` - DefaultCharge api.Float `json:"default_charge"` - ElectricChargeID api.Integer `json:"electric_charge_id"` - EndTime string `json:"end_time"` - IncomeStyle interface{} `json:"income_style"` - IntervalTimeCharge interface{} `json:"interval_time_charge"` - NationAllowanceMoney interface{} `json:"nation_allowance_money"` - ParamIncomeUnit api.Integer `json:"param_income_unit"` - ProvinceAllowanceMoney interface{} `json:"province_allowance_money"` - PsID api.Integer `json:"ps_id"` - StartTime string `json:"start_time"` - UseSharpPeekValleyFlat interface{} `json:"use_sharp_peek_valley_flat"` - ValidFlag string `json:"valid_flag"` + ParamIncomeUnit api.Integer `json:"param_income_unit"` + PowerElectricalChargeMap struct { + CityAllowanceMoney interface{} `json:"city_allowance_money"` + CodeType api.Integer `json:"code_type"` + CountyAllowanceMoney interface{} `json:"county_allowance_money"` + DefaultCharge api.Float `json:"default_charge"` + ElectricChargeID api.Integer `json:"electric_charge_id"` + EndTime api.DateTime `json:"end_time"` + IncomeStyle interface{} `json:"income_style"` + IntervalTimeCharge interface{} `json:"interval_time_charge"` + NationAllowanceMoney interface{} `json:"nation_allowance_money"` + ParamIncomeUnit api.Integer `json:"param_income_unit"` + ProvinceAllowanceMoney interface{} `json:"province_allowance_money"` + PsID api.Integer `json:"ps_id"` + StartTime api.DateTime `json:"start_time"` + UseSharpPeekValleyFlat interface{} `json:"use_sharp_peek_valley_flat"` + ValidFlag api.Bool `json:"valid_flag"` } `json:"powerElectricalChargeMap"` PowerIntervalTimesChargeMap interface{} `json:"powerIntevalTimesChargeMap"` - PowerSelfUseTimesChargeMap struct { - DefaultCharge api.Float `json:"default_charge"` - EndTime string `json:"end_time"` - IntervalTimeCharge string `json:"interval_time_charge"` - OnlineElectricityPercent string `json:"online_electricity_percent"` - PsID api.Integer `json:"ps_id"` - StartTime string `json:"start_time"` - UseElectricityDiscount string `json:"use_electricity_discount"` + PowerSelfUseTimesChargeMap struct { + DefaultCharge api.Float `json:"default_charge"` + EndTime api.DateTime `json:"end_time"` + IntervalTimeCharge api.String `json:"interval_time_charge"` + OnlineElectricityPercent api.Float `json:"online_electricity_percent"` + PsID api.Integer `json:"ps_id"` + StartTime api.DateTime `json:"start_time"` + UseElectricityDiscount api.Float `json:"use_electricity_discount"` } `json:"powerSelfUseTimesChargeMap"` - PsID string `json:"ps_id"` + PsID api.Integer `json:"ps_id"` } func (e *ResultData) IsValid() error { @@ -86,3 +89,81 @@ func (e *ResultData) IsValid() error { // // return err //} + +func (e *EndPoint) GetData() api.DataMap { + entries := api.NewDataMap() + + for range Only.Once { + pkg := apiReflect.GetName("", *e) + name := fmt.Sprintf("%s.%s", pkg, e.Response.ResultData.PsID.String()) + entries.StructToPoints(e.Response.ResultData, name, e.Request.PsId.String(), time.Time{}) + + // for _, d := range e.Response.ResultData.EnvironmentPowerChargeList { + // name = fmt.Sprintf("getIncomeSettingInfos.%s", e.Response.ResultData.PsID.String()) + // entries.StructToPoints(d, name, e.Request.PsId.String(), time.Time{}) + // } + } + + return entries +} + +func (e *EndPoint) GetDataTable() output.Table { + var table output.Table + for range Only.Once { + table = output.NewTable() + table.SetTitle("") + table.SetJson([]byte(e.GetJsonData(false))) + table.SetRaw([]byte(e.GetJsonData(true))) + + _ = table.SetHeader( + "Date", + "Point Id", + // "Parents", + "Group Name", + "Description", + "Value", + "Unit", + ) + + data := e.GetData() + var sorted []string + for p := range data.DataPoints { + sorted = append(sorted, string(p)) + } + sort.Strings(sorted) + + for _, p := range sorted { + entries := data.DataPoints[api.PointId(p)] + for _, de := range entries { + if de.Hide { + continue + } + + _ = table.AddRow( + de.Date.Format(api.DtLayout), + // api.NameDevicePointInt(de.Point.Parents, p.PointID.Value()), + // de.Point.Id, + p, + // de.Point.Parents.String(), + de.Point.GroupName, + de.Point.Name, + de.Value, + de.Point.Unit, + ) + } + } + + // table.InitGraph(output.GraphRequest { + // Title: "", + // TimeColumn: output.SetInteger(1), + // SearchColumn: output.SetInteger(2), + // NameColumn: output.SetInteger(4), + // ValueColumn: output.SetInteger(5), + // UnitsColumn: output.SetInteger(6), + // SearchString: output.SetString(""), + // MinLeftAxis: output.SetFloat(0), + // MaxLeftAxis: output.SetFloat(0), + // }) + } + return table +} diff --git a/iSolarCloud/AppService/getKpiInfo/data.go b/iSolarCloud/AppService/getKpiInfo/data.go index 24ef4e1c8..a1e7a9c87 100644 --- a/iSolarCloud/AppService/getKpiInfo/data.go +++ b/iSolarCloud/AppService/getKpiInfo/data.go @@ -3,8 +3,10 @@ package getKpiInfo import ( "GoSungrow/iSolarCloud/api" "GoSungrow/iSolarCloud/api/apiReflect" + "GoSungrow/iSolarCloud/api/output" "fmt" "github.com/MickMake/GoUnify/Only" + "sort" "time" ) @@ -39,7 +41,7 @@ type ResultData struct { PlanEnergyUnit string `json:"plan_energy_unit"` PsCount api.Integer `json:"ps_count"` TodayEnergy api.UnitValue `json:"today_energy"` - TotalCapcity api.UnitValue `json:"total_capcity"` + TotalCapcity api.UnitValue `json:"total_capcity" PointId:"total_capacity"` TotalDesignCapacity api.UnitValue `json:"total_design_capacity"` TotalEnergy api.UnitValue `json:"total_energy"` YearEnergy api.UnitValue `json:"year_energy"` @@ -79,8 +81,70 @@ func (e *EndPoint) GetData() api.DataMap { entries := api.NewDataMap() for range Only.Once { - entries.StructToPoints(e.Response.ResultData, "getKpiInfo", "PsId", time.Time{}) + pkg := apiReflect.GetName("", *e) + entries.StructToPoints(e.Response.ResultData, pkg, "system", time.Time{}) } return entries } + +func (e *EndPoint) GetDataTable() output.Table { + var table output.Table + for range Only.Once { + table = output.NewTable() + table.SetTitle("") + table.SetJson([]byte(e.GetJsonData(false))) + table.SetRaw([]byte(e.GetJsonData(true))) + + _ = table.SetHeader( + "Date", + "Point Id", + // "Parents", + "Group Name", + "Description", + "Value", + "Unit", + ) + + data := e.GetData() + var sorted []string + for p := range data.DataPoints { + sorted = append(sorted, string(p)) + } + sort.Strings(sorted) + + for _, p := range sorted { + entries := data.DataPoints[api.PointId(p)] + for _, de := range entries { + if de.Hide { + continue + } + + _ = table.AddRow( + de.Date.Format(api.DtLayout), + // api.NameDevicePointInt(de.Point.Parents, p.PointID.Value()), + // de.Point.Id, + p, + // de.Point.Parents.String(), + de.Point.GroupName, + de.Point.Name, + de.Value, + de.Point.Unit, + ) + } + } + + // table.InitGraph(output.GraphRequest { + // Title: "", + // TimeColumn: output.SetInteger(1), + // SearchColumn: output.SetInteger(2), + // NameColumn: output.SetInteger(4), + // ValueColumn: output.SetInteger(5), + // UnitsColumn: output.SetInteger(6), + // SearchString: output.SetString(""), + // MinLeftAxis: output.SetFloat(0), + // MaxLeftAxis: output.SetFloat(0), + // }) + } + return table +} diff --git a/iSolarCloud/AppService/getPsDetail/data.go b/iSolarCloud/AppService/getPsDetail/data.go index 381e555aa..28f9f37ef 100644 --- a/iSolarCloud/AppService/getPsDetail/data.go +++ b/iSolarCloud/AppService/getPsDetail/data.go @@ -27,8 +27,8 @@ func (rd RequestData) Help() string { } type ResultData struct { - ActualEnergy []string `json:"actual_energy" PointUnitFrom:"actual_energy_unit"` - ActualEnergyUnit api.String `json:"actual_energy_unit" PointId:"actual_energy_unit"` + ActualEnergy []api.Float `json:"actual_energy" PointUnitFrom:"actual_energy_unit"` + ActualEnergyUnit api.String `json:"actual_energy_unit" PointId:"actual_energy_unit"` AlarmCount api.Integer `json:"alarm_count"` AreaID interface{} `json:"area_id"` AreaType api.Integer `json:"area_type"` @@ -39,14 +39,14 @@ type ResultData struct { CoalReduceTotal api.UnitValue `json:"coal_reduce_total" PointId:"coal_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` ConnectGrid string `json:"connect_grid"` ConnectType api.Integer `json:"connect_type"` - ContactPerson api.String `json:"contact_person"` + ContactPerson api.String `json:"contact_person"` CurrPower api.UnitValue `json:"curr_power"` // Pv Power - DataLastUpdateTime api.DateTime `json:"data_last_update_time"` + DataLastUpdateTime api.DateTime `json:"data_last_update_time"` DayEqHours string `json:"day_eq_hours"` Description interface{} `json:"description"` DesignCapacity api.UnitValue `json:"design_capacity"` DesignCapacityBattery api.UnitValue `json:"design_capacity_battery"` - DiagramURL api.String `json:"diagram_url"` + DiagramURL api.String `json:"diagram_url"` EnergyScheme interface{} `json:"energy_scheme"` ExpectInstallDate api.DateTime `json:"expect_install_date"` FaultCount api.Integer `json:"fault_count"` @@ -55,14 +55,14 @@ type ResultData struct { GcjLongitude api.Float `json:"gcj_longitude"` GprsLatitude api.Float `json:"gprs_latitude"` GprsLongitude api.Float `json:"gprs_longitude"` - HasAmmeter api.Bool `json:"has_ammeter"` + HasAmmeter api.Bool `json:"has_ammeter"` Images []struct { FileID api.Integer `json:"file_id"` ID api.Integer `json:"id"` PicLanguage api.Integer `json:"pic_language"` PicType api.Integer `json:"pic_type"` - PictureName api.String `json:"picture_name"` - PictureURL api.String `json:"picture_url"` + PictureName api.String `json:"picture_name"` + PictureURL api.String `json:"picture_url"` PsUnitUUID interface{} `json:"ps_unit_uuid"` } `json:"images"` InstallDate api.DateTime `json:"install_date"` @@ -76,34 +76,34 @@ type ResultData struct { MapLongitude api.Float `json:"map_longitude"` MeterReduce api.UnitValue `json:"meter_reduce"` MeterReduceTotal api.UnitValue `json:"meter_reduce_total" PointId:"meter_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` - MobileTel api.String `json:"mibile_tel" PointId:"mobile_tel"` + MobileTel api.String `json:"mibile_tel" PointId:"mobile_tel"` MonthPr string `json:"monthPr" PointId:"monthPr" PointValueType:"" PointTimeSpan:"PointTimeSpanMonth"` MonthEnergy api.UnitValue `json:"month_energy" PointId:"month_energy" PointValueType:"" PointTimeSpan:"PointTimeSpanMonth"` MonthEnergyVirgin api.UnitValue `json:"month_energy_virgin" PointIgnore:"true"` - MonthEqHours api.Float `json:"month_eq_hours" PointId:"month_eq_hours" PointValueType:"" PointTimeSpan:"PointTimeSpanMonth"` + MonthEqHours api.Float `json:"month_eq_hours" PointId:"month_eq_hours" PointValueType:"" PointTimeSpan:"PointTimeSpanMonth"` MonthIncome api.UnitValue `json:"month_income" PointId:"month_income" PointValueType:"" PointTimeSpan:"PointTimeSpanMonth"` NoxReduce api.UnitValue `json:"nox_reduce"` NoxReduceTotal api.UnitValue `json:"nox_reduce_total" PointId:"nox_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` OperateYear string `json:"operate_year"` - OperationBusName api.String `json:"operation_bus_name"` + OperationBusName api.String `json:"operation_bus_name"` OwnerPsFaultStatus string `json:"owner_ps_fault_status"` - P83012Value api.Float `json:"p83012_value" PointId:"p83012" PointUnitFrom:"p83012_unit"` - P83012Unit api.String `json:"p83012_unit" PointId:"p83012_unit"` - P83013Value api.Float `json:"p83013_value" PointId:"p83013" PointUnitFrom:"p83013_unit"` - P83013Unit api.String `json:"p83013_unit" PointId:"p83013_unit"` - P83036Value api.Float `json:"p83036_value" PointId:"p83036" PointUnitFrom:"p83036_unit"` - P83036Unit api.String `json:"p83036_unit" PointId:"p83036_unit"` - P83016 api.Float `json:"p83016" PointId:"p83016" PointUnitFrom:"p83016_unit"` - P83016Unit api.String `json:"p83016_unit" PointId:"p83016_unit"` - P83017 api.Float `json:"p83017" PointId:"p83017" PointUnitFrom:"p83017_unit"` - P83017Unit api.String `json:"p83017_unit" PointId:"p83017_unit"` - P83023 api.Float `json:"p83023" PointId:"p83023"` + P83012Value api.Float `json:"p83012_value" PointId:"p83012" PointUnitFrom:"p83012_unit"` + P83012Unit api.String `json:"p83012_unit" PointId:"p83012_unit"` + P83013Value api.Float `json:"p83013_value" PointId:"p83013" PointUnitFrom:"p83013_unit"` + P83013Unit api.String `json:"p83013_unit" PointId:"p83013_unit"` + P83036Value api.Float `json:"p83036_value" PointId:"p83036" PointUnitFrom:"p83036_unit"` + P83036Unit api.String `json:"p83036_unit" PointId:"p83036_unit"` + P83016 api.Float `json:"p83016" PointId:"p83016" PointUnitFrom:"p83016_unit"` + P83016Unit api.String `json:"p83016_unit" PointId:"p83016_unit"` + P83017 api.Float `json:"p83017" PointId:"p83017" PointUnitFrom:"p83017_unit"` + P83017Unit api.String `json:"p83017_unit" PointId:"p83017_unit"` + P83023 api.Float `json:"p83023" PointId:"p83023"` P83023y string `json:"p83023y" PointId:"p83023y"` P83023year string `json:"p83023year" PointId:"p83023y"` P83023ym string `json:"p83023ym" PointId:"p83023ym"` - P83043 api.Float `json:"p83043" PointId:"p83043"` - P83044 api.Float `json:"p83044" PointId:"p83044"` - P83045 api.Float `json:"p83045" PointId:"p83045"` + P83043 api.Float `json:"p83043" PointId:"p83043"` + P83044 api.Float `json:"p83044" PointId:"p83044"` + P83045 api.Float `json:"p83045" PointId:"p83045"` P83072Map api.UnitValue `json:"p83072_map" PointId:"p83072"` P83072MapVirgin api.UnitValue `json:"p83072_map_virgin" PointIgnore:"true"` P83073Map api.UnitValue `json:"p83073_map" PointId:"p83073"` @@ -112,9 +112,9 @@ type ResultData struct { P83074MapVirgin api.UnitValue `json:"p83074_map_virgin" PointIgnore:"true"` P83075Map api.UnitValue `json:"p83075_map" PointId:"p83075"` P83075MapVirgin api.UnitValue `json:"p83075_map_virgin" PointIgnore:"true"` - P83076Map api.UnitValue `json:"p83076_map" PointId:"p83076"` // Pv Power + P83076Map api.UnitValue `json:"p83076_map" PointId:"p83076"` // Pv Power P83076MapVirgin api.UnitValue `json:"p83076_map_virgin" PointIgnore:"true"` // Pv Power - P83077Map api.UnitValue `json:"p83077_map" PointId:"p83077"` // Pv Energy + P83077Map api.UnitValue `json:"p83077_map" PointId:"p83077"` // Pv Energy P83077MapVirgin api.UnitValue `json:"p83077_map_virgin" PointIgnore:"true"` // Pv Energy P83078Map api.UnitValue `json:"p83078_map" PointId:"p83078"` P83078MapVirgin api.UnitValue `json:"p83078_map_virgin" PointIgnore:"true"` @@ -122,14 +122,14 @@ type ResultData struct { P83079MapVirgin api.UnitValue `json:"p83079_map_virgin" PointIgnore:"true"` P83080Map api.UnitValue `json:"p83080_map" PointId:"p83080"` P83080MapVirgin api.UnitValue `json:"p83080_map_virgin" PointIgnore:"true"` - P83088Map api.UnitValue `json:"p83088_map" PointId:"p83088"` // Es Energy + P83088Map api.UnitValue `json:"p83088_map" PointId:"p83088"` // Es Energy P83088MapVirgin api.UnitValue `json:"p83088_map_virgin" PointIgnore:"true"` // Es Energy - P83089Map api.UnitValue `json:"p83089_map" PointId:"p83089"` // Es Discharge Energy + P83089Map api.UnitValue `json:"p83089_map" PointId:"p83089"` // Es Discharge Energy P83089MapVirgin api.UnitValue `json:"p83089_map_virgin" PointIgnore:"true"` // Es Discharge Energy P83094Map api.UnitValue `json:"p83094_map" PointId:"p83094"` P83094MapVirgin api.UnitValue `json:"p83094_map_virgin" PointIgnore:"true"` - P83095Map api.UnitValue `json:"p83095_map" PointId:"p83095" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` // Es Total Discharge Energy - P83095MapVirgin api.UnitValue `json:"p83095_map_virgin" PointIgnore:"true"` // Es Total Discharge Energy + P83095Map api.UnitValue `json:"p83095_map" PointId:"p83095" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` // Es Total Discharge Energy + P83095MapVirgin api.UnitValue `json:"p83095_map_virgin" PointIgnore:"true"` // Es Total Discharge Energy P83097Map api.UnitValue `json:"p83097_map" PointId:"p83097"` P83097MapVirgin api.UnitValue `json:"p83097_map_virgin" PointIgnore:"true"` P83100Map api.UnitValue `json:"p83100_map" PointId:"p83100"` @@ -138,7 +138,7 @@ type ResultData struct { P83101MapVirgin api.UnitValue `json:"p83101_map_virgin" PointIgnore:"true"` P83102Map api.UnitValue `json:"p83102_map" PointId:"p83102"` P83102MapVirgin api.UnitValue `json:"p83102_map_virgin" PointIgnore:"true"` - P83102Percent api.Float `json:"p83102_percent" PointId:"p83102"` + P83102Percent api.Float `json:"p83102_percent" PointId:"p83102"` P83105Map api.UnitValue `json:"p83105_map" PointId:"p83105"` P83105MapVirgin api.UnitValue `json:"p83105_map_virgin" PointIgnore:"true"` P83106Map api.UnitValue `json:"p83106_map" PointId:"p83106"` @@ -151,64 +151,64 @@ type ResultData struct { P83119MapVirgin api.UnitValue `json:"p83119_map_virgin" PointIgnore:"true"` P83120Map api.UnitValue `json:"p83120_map" PointId:"p83120"` P83120MapVirgin api.UnitValue `json:"p83120_map_virgin" PointIgnore:"true"` - P83121 api.Float `json:"p83121" PointId:"p83121"` - P83122 api.Float `json:"p83122" PointId:"p83122"` + P83121 api.Float `json:"p83121" PointId:"p83121"` + P83122 api.Float `json:"p83122" PointId:"p83122"` P83123Map api.UnitValue `json:"p83123_map" PointId:"p83123"` P83123MapVirgin api.UnitValue `json:"p83123_map_virgin" PointIgnore:"true"` P83124Map api.UnitValue `json:"p83124_map" PointId:"p83124"` P83124MapVirgin api.UnitValue `json:"p83124_map_virgin" PointIgnore:"true"` - P83125 api.Float `json:"p83125" PointId:"p83125"` - P83126 api.Float `json:"p83126" PointId:"p83126"` + P83125 api.Float `json:"p83125" PointId:"p83125"` + P83126 api.Float `json:"p83126" PointId:"p83126"` P83128MapVirgin api.UnitValue `json:"p83128_map_virgin" PointIgnore:"true"` P83202Map api.UnitValue `json:"p83202_map" PointId:"p83202"` P83202MapVirgin api.UnitValue `json:"p83202_map_virgin" PointIgnore:"true"` PercentPlanYear api.Float `json:"percent_plan_year"` - PlanEnergy []string `json:"plan_energy" PointUnitFrom:"plan_energy_unit"` - PlanEnergyUnit api.String `json:"plan_energy_unit" PointId:"plan_energy_unit"` + PlanEnergy []api.Float `json:"plan_energy" PointUnitFrom:"plan_energy_unit"` + PlanEnergyUnit api.String `json:"plan_energy_unit" PointId:"plan_energy_unit"` PlanEnergyYear api.UnitValue `json:"plan_energy_year"` PowderReduce api.UnitValue `json:"powder_reduce"` PowderReduceTotal api.UnitValue `json:"powder_reduce_total" PointId:"powder_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` - PowerChargeSetted api.Bool `json:"power_charge_setted" PointId:"power_charge_setted" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + PowerChargeSetted api.Bool `json:"power_charge_setted" PointId:"power_charge_setted" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` Producer string `json:"producer"` PsCountryID api.Integer `json:"ps_country_id"` PsFaultStatus string `json:"ps_fault_status"` PsHealthStatus string `json:"ps_health_status"` - PsHolder api.String `json:"ps_holder"` - PsLocation api.String `json:"ps_location"` - PsName api.String `json:"ps_name"` - PsShortName api.String `json:"ps_short_name"` + PsHolder api.String `json:"ps_holder"` + PsLocation api.String `json:"ps_location"` + PsName api.String `json:"ps_name"` + PsShortName api.String `json:"ps_short_name"` PsState string `json:"ps_state"` PsType api.Integer `json:"ps_type"` - PsTypeName api.String `json:"ps_type_name"` + PsTypeName api.String `json:"ps_type_name"` PsWindLevel string `json:"ps_wind_level"` PsWindPos string `json:"ps_wind_pos"` - RecordCreateTime api.DateTime `json:"recore_create_time"` + RecordCreateTime api.DateTime `json:"recore_create_time"` ReportType string `json:"report_type"` RobotNumSweepCapacity struct { - Num api.Integer `json:"num"` - SweepCapacity api.Float `json:"sweep_capacity"` + Num api.Integer `json:"num"` + SweepCapacity api.Float `json:"sweep_capacity"` } `json:"robot_num_sweep_capacity"` SafeStartDate api.DateTime `json:"safe_start_date"` SelfConsumptionOffsetReminder api.Integer `json:"self_consumption_offset_reminder"` - ShippingAddress api.String `json:"shipping_address"` - ShippingZipCode api.String `json:"shipping_zip_code"` + ShippingAddress api.String `json:"shipping_address"` + ShippingZipCode api.String `json:"shipping_zip_code"` So2Reduce api.UnitValue `json:"so2_reduce"` So2ReduceTotal api.UnitValue `json:"so2_reduce_total" PointId:"so2_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` StorageInverterData []struct { - CommunicationDevSn api.String `json:"communication_dev_sn"` + CommunicationDevSn api.String `json:"communication_dev_sn"` DevFaultStatus api.Integer `json:"dev_fault_status"` DevStatus api.Integer `json:"dev_status"` DeviceCode api.Integer `json:"device_code"` - DeviceModelCode api.String `json:"device_model_code"` - DeviceName api.String `json:"device_name"` + DeviceModelCode api.String `json:"device_model_code"` + DeviceName api.String `json:"device_name"` DeviceState string `json:"device_state"` DeviceType api.Integer `json:"device_type"` - DrmStatus api.Integer `json:"drm_status"` - DrmStatusName api.String `json:"drm_status_name"` - EnergyFlow []string `json:"energy_flow"` - HasAmmeter api.Integer `json:"has_ammeter"` + DrmStatus api.Integer `json:"drm_status"` + DrmStatusName api.String `json:"drm_status_name"` + EnergyFlow []api.Integer `json:"energy_flow"` + HasAmmeter api.Bool `json:"has_ammeter"` InstallerDevFaultStatus api.Integer `json:"installer_dev_fault_status"` - InverterSn api.String `json:"inverter_sn"` + InverterSn api.String `json:"inverter_sn"` OwnerDevFaultStatus api.Integer `json:"owner_dev_fault_status"` P13003Map api.UnitValue `json:"p13003_map" PointId:"p13003" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` P13003MapVirgin api.UnitValue `json:"p13003_map_virgin" PointIgnore:"true"` @@ -222,20 +222,20 @@ type ResultData struct { P13121MapVirgin api.UnitValue `json:"p13121_map_virgin" PointIgnore:"true"` P13126Map api.UnitValue `json:"p13126_map" PointId:"p13126" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` P13126MapVirgin api.UnitValue `json:"p13126_map_virgin" PointIgnore:"true"` - P13141 api.Float `json:"p13141" PointId:"p13141" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` - P13142 api.Float `json:"p13142" PointId:"p13142" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` + P13141 api.Float `json:"p13141" PointId:"p13141" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` + P13142 api.Float `json:"p13142" PointId:"p13142" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` P13149Map api.UnitValue `json:"p13149_map" PointId:"p13149" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` P13149MapVirgin api.UnitValue `json:"p13149_map_virgin" PointIgnore:"true"` P13150Map api.UnitValue `json:"p13150_map" PointId:"p13150" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` P13150MapVirgin api.UnitValue `json:"p13150_map_virgin" PointIgnore:"true"` - P13155 api.Float `json:"p13155" PointId:"p13155" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` - PsKey api.PsKey `json:"ps_key"` - UpdateTime api.DateTime `json:"update_time"` + P13155 api.Float `json:"p13155" PointId:"p13155" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` + PsKey api.PsKey `json:"ps_key"` + UpdateTime api.DateTime `json:"update_time"` UUID api.Integer `json:"uuid"` } `json:"storage_inverter_data"` SysScheme api.Integer `json:"sys_scheme"` TimeZoneID api.Integer `json:"time_zone_id"` - Timezone api.String `json:"timezone"` + Timezone api.String `json:"timezone"` TodayEnergy api.UnitValue `json:"today_energy" PointId:"today_energy" PointValueType:"" PointTimeSpan:"PointTimeSpanDaily"` TodayEnergyVirgin api.UnitValue `json:"today_energy_virgin" PointIgnore:"true"` TodayIncome api.UnitValue `json:"today_income" PointId:"today_income" PointValueType:"" PointTimeSpan:"PointTimeSpanDaily"` @@ -246,16 +246,16 @@ type ResultData struct { TreeReduce api.UnitValue `json:"tree_reduce"` TreeReduceTotal api.UnitValue `json:"tree_reduce_total" PointId:"tree_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` TuvLevel string `json:"tuv_level"` - ValidFlag api.Bool `json:"valid_flag"` + ValidFlag api.Bool `json:"valid_flag"` WaitAssignOrderCount api.Integer `json:"wait_assign_order_count"` WaterReduce api.UnitValue `json:"water_reduce"` WaterReduceTotal api.UnitValue `json:"water_reduce_total" PointId:"water_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` WgsLatitude api.Float `json:"wgs_latitude"` WgsLongitude api.Float `json:"wgs_longitude"` - Year api.Integer `json:"year"` + Year api.Integer `json:"year"` ZfzyMap api.UnitValue `json:"zfzy_map"` ZfzyMapVirgin api.UnitValue `json:"zfzy_map_virgin" PointIgnore:"true"` - ZipCode api.String `json:"zip_code"` + ZipCode api.String `json:"zip_code"` ZjzzMap api.UnitValue `json:"zjzz_map"` ZjzzMapVirgin api.UnitValue `json:"zjzz_map_virgin" PointIgnore:"true"` } @@ -291,6 +291,48 @@ func (e *ResultData) IsValid() error { // } +func (e *EndPoint) GetData() api.DataMap { + entries := api.NewDataMap() + + for range Only.Once { + pkg := apiReflect.GetName("", *e) + name := fmt.Sprintf("%s.%s", pkg, e.Request.PsId.String()) + entries.StructToPoints(e.Response.ResultData, name, e.Request.PsId.String(), time.Time{}) + + for _, sid := range e.Response.ResultData.StorageInverterData { + name = fmt.Sprintf("%s.%s", pkg, sid.PsKey.Value()) + entries.StructToPoints(sid, name, sid.PsKey.Value(), time.Time{}) + } + } + + // for range Only.Once { + // // name := fmt.Sprintf("getPsDetail.%s", e.Request.PsId.String()) + // // + // // uv := api.SetUnitValueFloat(e.Response.ResultData.P83012Value.Value(), e.Response.ResultData.P83012Unit.Value()) + // // entries.AddUnitValue(name + ".p83012", e.Request.PsId.String(), "p83012", "", "", api.NewDateTime(""), uv) + // // + // // uv = api.SetUnitValueFloat(e.Response.ResultData.P83013Value.Value(), e.Response.ResultData.P83013Unit.Value()) + // // entries.AddUnitValue(name + ".p83013", e.Request.PsId.String(), "p83013", "", "", api.NewDateTime(""), uv) + // // + // // uv = api.SetUnitValueFloat(e.Response.ResultData.P83036Value.Value(), e.Response.ResultData.P83036Unit.Value()) + // // entries.AddUnitValue(name + ".p83036", e.Request.PsId.String(), "p83036", "", "", api.NewDateTime(""), uv) + // // + // // uv = api.SetUnitValueFloat(e.Response.ResultData.P83016.Value(), e.Response.ResultData.P83016Unit.Value()) + // // entries.AddUnitValue(name + ".p83016", e.Request.PsId.String(), "p83016", "", "", api.NewDateTime(""), uv) + // // + // // uv = api.SetUnitValueFloat(e.Response.ResultData.P83017.Value(), e.Response.ResultData.P83017Unit.Value()) + // // entries.AddUnitValue(name + ".p83017", e.Request.PsId.String(), "p83017", "", "", api.NewDateTime(""), uv) + // // + // // entries.StructToPoints(e.Response.ResultData, name, e.Request.PsId.String(), time.Time{}) + // // + // // for _, sid := range e.Response.ResultData.StorageInverterData { + // // entries.StructToPoints(sid, name + ".StorageInverterData." + sid.PsKey.Value(), sid.PsKey.Value(), time.Time{}) + // // } + // } + + return entries +} + func (e *EndPoint) GetDataTable() output.Table { var table output.Table @@ -340,44 +382,3 @@ func (e *EndPoint) GetDataTable() output.Table { return table } - -func (e *EndPoint) GetData() api.DataMap { - entries := api.NewDataMap() - - for range Only.Once { - name := fmt.Sprintf("getPsDetail.%s", e.Request.PsId.String()) - entries.StructToPoints(e.Response.ResultData, name, e.Request.PsId.String(), time.Time{}) - - for _, sid := range e.Response.ResultData.StorageInverterData { - name = fmt.Sprintf("getPsDetail.%s", sid.PsKey.Value()) - entries.StructToPoints(sid, name, sid.PsKey.Value(), time.Time{}) - } - } - - // for range Only.Once { - // // name := fmt.Sprintf("getPsDetail.%s", e.Request.PsId.String()) - // // - // // uv := api.SetUnitValueFloat(e.Response.ResultData.P83012Value.Value(), e.Response.ResultData.P83012Unit.Value()) - // // entries.AddUnitValue(name + ".p83012", e.Request.PsId.String(), "p83012", "", "", api.NewDateTime(""), uv) - // // - // // uv = api.SetUnitValueFloat(e.Response.ResultData.P83013Value.Value(), e.Response.ResultData.P83013Unit.Value()) - // // entries.AddUnitValue(name + ".p83013", e.Request.PsId.String(), "p83013", "", "", api.NewDateTime(""), uv) - // // - // // uv = api.SetUnitValueFloat(e.Response.ResultData.P83036Value.Value(), e.Response.ResultData.P83036Unit.Value()) - // // entries.AddUnitValue(name + ".p83036", e.Request.PsId.String(), "p83036", "", "", api.NewDateTime(""), uv) - // // - // // uv = api.SetUnitValueFloat(e.Response.ResultData.P83016.Value(), e.Response.ResultData.P83016Unit.Value()) - // // entries.AddUnitValue(name + ".p83016", e.Request.PsId.String(), "p83016", "", "", api.NewDateTime(""), uv) - // // - // // uv = api.SetUnitValueFloat(e.Response.ResultData.P83017.Value(), e.Response.ResultData.P83017Unit.Value()) - // // entries.AddUnitValue(name + ".p83017", e.Request.PsId.String(), "p83017", "", "", api.NewDateTime(""), uv) - // // - // // entries.StructToPoints(e.Response.ResultData, name, e.Request.PsId.String(), time.Time{}) - // // - // // for _, sid := range e.Response.ResultData.StorageInverterData { - // // entries.StructToPoints(sid, name + ".StorageInverterData." + sid.PsKey.Value(), sid.PsKey.Value(), time.Time{}) - // // } - // } - - return entries -} diff --git a/iSolarCloud/AppService/getPsDetailWithPsType/data.go b/iSolarCloud/AppService/getPsDetailWithPsType/data.go index 60638e15a..60c005653 100644 --- a/iSolarCloud/AppService/getPsDetailWithPsType/data.go +++ b/iSolarCloud/AppService/getPsDetailWithPsType/data.go @@ -103,7 +103,7 @@ type ResultData struct { DeviceType api.Integer `json:"device_type" PointId:"DeviceType" PointTimeSpan:"PointTimeSpanBoot"` DrmStatus api.Integer `json:"drm_status" PointId:"DrmStatus" PointTimeSpan:"PointTimeSpanBoot"` DrmStatusName api.String `json:"drm_status_name" PointId:"DrmStatusName" PointTimeSpan:"PointTimeSpanBoot"` - EnergyFlow []string `json:"energy_flow"` + EnergyFlow []api.Integer `json:"energy_flow"` HasAmmeter api.Bool `json:"has_ammeter" PointId:"HasAmmeter" PointTimeSpan:"PointTimeSpanBoot"` InstallerDevFaultStatus api.Integer `json:"installer_dev_fault_status" PointId:"InstallerDevFaultStatus" PointTimeSpan:"PointTimeSpanBoot"` InverterSn api.String `json:"inverter_sn" PointId:"InverterSn" PointTimeSpan:"PointTimeSpanBoot"` @@ -170,6 +170,10 @@ func (e *ResultData) IsValid() error { // return err //} +func (e *EndPoint) GetData() api.DataMap { + return e.Response.ResultData.GetData() +} + func (e *EndPoint) GetDataTable() output.Table { var table output.Table @@ -303,15 +307,16 @@ func (e *EndPoint) GetDataTable() output.Table { return table } -func (e *EndPoint) GetData() api.DataMap { +func (e *ResultData) GetData() api.DataMap { entries := api.NewDataMap() for range Only.Once { - name := fmt.Sprintf("getPsDetailWithPsType.%s", e.Response.ResultData.PsPsKey.Value()) - entries.StructToPoints(e.Response.ResultData, name, e.Response.ResultData.PsPsKey.Value(), time.Time{}) + pkg := apiReflect.GetName("", *e) + name := fmt.Sprintf("%s.%s", pkg, e.PsPsKey.Value()) + entries.StructToPoints(*e, name, e.PsPsKey.Value(), time.Time{}) - for _, sid := range e.Response.ResultData.StorageInverterData { - name = fmt.Sprintf("getPsDetailWithPsType.%s", sid.PsKey.Value()) + for _, sid := range e.StorageInverterData { + name = fmt.Sprintf("%s.%s", pkg, sid.PsKey.Value()) entries.StructToPoints(sid, name, sid.PsKey.Value(), time.Time{}) } } diff --git a/iSolarCloud/AppService/getPsList/data.go b/iSolarCloud/AppService/getPsList/data.go index fb62d08d5..5b56d7c85 100644 --- a/iSolarCloud/AppService/getPsList/data.go +++ b/iSolarCloud/AppService/getPsList/data.go @@ -281,7 +281,7 @@ func (e *ResultData) GetData() api.DataMap { for _, p := range e.PageList { psId := p.PsID.String() // psId := strconv.FormatInt(p.PsID.Value(), 10) - name := "getPsList." + psId + name := apiReflect.GetName("", *e) + "." + psId entries.StructToPoints(p, name, psId, time.Time{}) } } diff --git a/iSolarCloud/AppService/queryDeviceList/data.go b/iSolarCloud/AppService/queryDeviceList/data.go index b5f5ad54d..6a0e12099 100644 --- a/iSolarCloud/AppService/queryDeviceList/data.go +++ b/iSolarCloud/AppService/queryDeviceList/data.go @@ -28,10 +28,10 @@ func (rd RequestData) Help() string { type ResultData struct { DevCountByStatusMap struct { - FaultCount api.Count `json:"fault_count" PointId:"fault_count" PointValueType:"" PointTimeSpan:""` - OfflineCount api.Count `json:"offline_count" PointId:"offline_count" PointValueType:"" PointTimeSpan:""` - RunCount api.Count `json:"run_count" PointId:"run_count" PointValueType:"" PointTimeSpan:""` - WarningCount api.Count `json:"warning_count" PointId:"warning_count" PointValueType:"" PointTimeSpan:""` + FaultCount api.Count `json:"fault_count" PointId:"fault_count"` + OfflineCount api.Count `json:"offline_count" PointId:"offline_count"` + RunCount api.Count `json:"run_count" PointId:"run_count"` + WarningCount api.Count `json:"warning_count" PointId:"warning_count"` } `json:"dev_count_by_status_map"` DevCountByTypeMap map[string]api.Integer `json:"dev_count_by_type_map"` // DevCountByTypeMap struct { @@ -90,52 +90,52 @@ type ResultData struct { // Nine9 string `json:"99"` // } `json:"dev_type_definition"` PageList []struct { - AlarmCount api.Count `json:"alarm_count" PointId:"alarm_count" PointValueType:"" PointTimeSpan:""` - ChannelId api.Integer `json:"chnnl_id" PointId:"channel_id" PointValueType:"" PointTimeSpan:""` - CommandStatus api.Integer `json:"command_status" PointId:"command_status" PointValueType:"" PointTimeSpan:""` - ComponentAmount api.Integer `json:"component_amount" PointId:"component_amount" PointValueType:"" PointTimeSpan:""` - DataFlag api.Integer `json:"data_flag" PointId:"data_flag" PointValueType:"" PointTimeSpan:""` - DataFlagDetail api.Integer `json:"data_flag_detail" PointId:"data_flag_detail" PointValueType:"" PointTimeSpan:""` - DeviceArea api.Integer `json:"device_area" PointId:"device_area" PointValueType:"" PointTimeSpan:""` - DeviceAreaName api.String `json:"device_area_name" PointId:"device_area_name" PointValueType:"" PointTimeSpan:""` - DeviceCode api.Integer `json:"device_code" PointId:"device_code" PointValueType:"" PointTimeSpan:""` - DeviceID api.Integer `json:"device_id" PointId:"device_id" PointValueType:"" PointTimeSpan:""` - DeviceModelCode api.String `json:"device_model_code" PointId:"device_model_code" PointValueType:"" PointTimeSpan:""` - DeviceModelID api.Integer `json:"device_model_id" PointId:"device_model_id" PointValueType:"" PointTimeSpan:""` - DeviceName api.String `json:"device_name" PointId:"device_name" PointValueType:"" PointTimeSpan:""` - DeviceStatus api.Bool `json:"device_status" PointId:"device_status" PointValueType:"" PointTimeSpan:""` - DeviceType api.Integer `json:"device_type" PointId:"device_type" PointValueType:"" PointTimeSpan:""` - FaultCount api.Count `json:"fault_count" PointId:"fault_count" PointValueType:"" PointTimeSpan:""` - FaultStatus string `json:"fault_status" PointId:"fault_status" PointValueType:"" PointTimeSpan:""` - FunctionEnum api.String `json:"function_enum" PointId:"function_enum" PointValueType:"" PointTimeSpan:""` - InstallerAlarmCount api.Count `json:"installer_alarm_count" PointId:"installer_alarm_count" PointValueType:"" PointTimeSpan:""` - InstallerDevFaultStatus api.Integer `json:"installer_dev_fault_status" PointId:"installer_dev_fault_status" PointValueType:"" PointTimeSpan:""` - InstallerFaultCount api.Count `json:"installer_fault_count" PointId:"installer_fault_count" PointValueType:"" PointTimeSpan:""` - InverterModelType api.Integer `json:"inverter_model_type" PointId:"inverter_model_type" PointValueType:"" PointTimeSpan:""` - IsDeveloper api.Bool `json:"is_developer" PointId:"is_developer" PointValueType:"" PointTimeSpan:""` - IsG2point5Module api.Bool `json:"is_g2point5_module" PointId:"is_g2point5_module" PointValueType:"" PointTimeSpan:""` - IsInit api.Bool `json:"is_init" PointId:"is_init" PointValueType:"" PointTimeSpan:""` - IsSecond api.Bool `json:"is_second" PointId:"is_second" PointValueType:"" PointTimeSpan:""` - IsSupportParamset api.Bool `json:"is_support_paramset" PointId:"is_support_paramset" PointValueType:"" PointTimeSpan:""` - NodeTimestamps interface{} `json:"node_timestamps" PointId:"node_timestamps" PointValueType:"" PointTimeSpan:""` - OwnerAlarmCount api.Count `json:"owner_alarm_count" PointId:"owner_alarm_count" PointValueType:"" PointTimeSpan:""` - OwnerDevFaultStatus api.Integer `json:"owner_dev_fault_status" PointId:"owner_dev_fault_status" PointValueType:"" PointTimeSpan:""` - OwnerFaultCount api.Count `json:"owner_fault_count" PointId:"owner_fault_count" PointValueType:"" PointTimeSpan:""` + AlarmCount api.Count `json:"alarm_count" PointId:"alarm_count"` + ChannelId api.Integer `json:"chnnl_id" PointId:"channel_id"` + CommandStatus api.Integer `json:"command_status" PointId:"command_status"` + ComponentAmount api.Integer `json:"component_amount" PointId:"component_amount"` + DataFlag api.Integer `json:"data_flag" PointId:"data_flag"` + DataFlagDetail api.Integer `json:"data_flag_detail" PointId:"data_flag_detail"` + DeviceArea api.Integer `json:"device_area" PointId:"device_area"` + DeviceAreaName api.String `json:"device_area_name" PointId:"device_area_name"` + DeviceCode api.Integer `json:"device_code" PointId:"device_code"` + DeviceID api.Integer `json:"device_id" PointId:"device_id"` + DeviceModelCode api.String `json:"device_model_code" PointId:"device_model_code"` + DeviceModelID api.Integer `json:"device_model_id" PointId:"device_model_id"` + DeviceName api.String `json:"device_name" PointId:"device_name"` + DeviceStatus api.Bool `json:"device_status" PointId:"device_status"` + DeviceType api.Integer `json:"device_type" PointId:"device_type"` + FaultCount api.Count `json:"fault_count" PointId:"fault_count"` + FaultStatus string `json:"fault_status" PointId:"fault_status"` + FunctionEnum api.String `json:"function_enum" PointId:"function_enum"` + InstallerAlarmCount api.Count `json:"installer_alarm_count" PointId:"installer_alarm_count"` + InstallerDevFaultStatus api.Integer `json:"installer_dev_fault_status" PointId:"installer_dev_fault_status"` + InstallerFaultCount api.Count `json:"installer_fault_count" PointId:"installer_fault_count"` + InverterModelType api.Integer `json:"inverter_model_type" PointId:"inverter_model_type"` + IsDeveloper api.Bool `json:"is_developer" PointId:"is_developer"` + IsG2point5Module api.Bool `json:"is_g2point5_module" PointId:"is_g2point5_module"` + IsInit api.Bool `json:"is_init" PointId:"is_init"` + IsSecond api.Bool `json:"is_second" PointId:"is_second"` + IsSupportParamset api.Bool `json:"is_support_paramset" PointId:"is_support_paramset"` + NodeTimestamps interface{} `json:"node_timestamps" PointId:"node_timestamps"` + OwnerAlarmCount api.Count `json:"owner_alarm_count" PointId:"owner_alarm_count"` + OwnerDevFaultStatus api.Integer `json:"owner_dev_fault_status" PointId:"owner_dev_fault_status"` + OwnerFaultCount api.Count `json:"owner_fault_count" PointId:"owner_fault_count"` PointData PointData `json:"point_data"` - Points interface{} `json:"points" PointId:"points" PointValueType:"" PointTimeSpan:""` + Points interface{} `json:"points" PointId:"points"` PsTimezoneInfo struct { IsDst api.Bool `json:"is_dst"` TimeZone api.String `json:"time_zone"` } `json:"psTimezoneInfo"` - PsID api.Integer `json:"ps_id" PointId:"ps_id" PointValueType:"" PointTimeSpan:""` - PsKey api.PsKey `json:"ps_key" PointId:"ps_key" PointValueType:"" PointTimeSpan:""` - RelState api.Integer `json:"rel_state" PointId:"rel_state" PointValueType:"" PointTimeSpan:""` - Sn api.String `json:"sn" PointId:"sn" PointValueType:"" PointTimeSpan:""` - StringAmount api.Integer `json:"string_amount" PointId:"string_amount" PointValueType:"" PointTimeSpan:""` - TypeName api.String `json:"type_name" PointId:"type_name" PointValueType:"" PointTimeSpan:""` - UnitName api.String `json:"unit_name" PointId:"unit_name" PointValueType:"" PointTimeSpan:""` - UUID api.Integer `json:"uuid" PointId:"uuid" PointValueType:"" PointTimeSpan:""` - UUIDIndexCode api.String `json:"uuid_index_code" PointId:"uuid_index_code" PointValueType:"" PointTimeSpan:""` + PsID api.Integer `json:"ps_id" PointId:"ps_id"` + PsKey api.PsKey `json:"ps_key" PointId:"ps_key"` + RelState api.Integer `json:"rel_state" PointId:"rel_state"` + Sn api.String `json:"sn" PointId:"sn"` + StringAmount api.Integer `json:"string_amount" PointId:"string_amount"` + TypeName api.String `json:"type_name" PointId:"type_name"` + UnitName api.String `json:"unit_name" PointId:"unit_name"` + UUID api.Integer `json:"uuid" PointId:"uuid"` + UUIDIndexCode api.String `json:"uuid_index_code" PointId:"uuid_index_code"` } `json:"pageList"` RowCount api.Integer `json:"rowCount"` } @@ -165,12 +165,6 @@ type PointStruct struct { ValueDescription api.String `json:"value_description"` } -// type VirtualPointStruct struct { -// api.DataEntry -// ValueFloat api.Float -// } - - func (e *ResultData) IsValid() error { var err error // switch { @@ -219,83 +213,6 @@ func (e *ResultData) GetDataByName(name string) PointData { return ret } -func (e *EndPoint) GetDataTable() output.Table { - var table output.Table - for range Only.Once { - table = output.NewTable() - table.SetTitle("") - table.SetJson([]byte(e.GetJsonData(false))) - table.SetRaw([]byte(e.GetJsonData(true))) - - _ = table.SetHeader( - "Date", - "Point Id", - // "Parents", - "Group Name", - "Description", - "Value", - "Unit", - ) - - data := e.GetData() - var sorted []string - for p := range data.DataPoints { - sorted = append(sorted, string(p)) - } - sort.Strings(sorted) - - for _, p := range sorted { - entries := data.DataPoints[api.PointId(p)] - for _, de := range entries { - if de.Hide { - continue - } - - _ = table.AddRow( - de.Date.Format(api.DtLayout), - // api.NameDevicePointInt(de.Point.Parents, p.PointID.Value()), - // de.Point.Id, - p, - // de.Point.Parents.String(), - de.Point.GroupName, - de.Point.Name, - de.Value, - de.Point.Unit, - ) - } - } - - // for _, d := range e.Response.ResultData.PageList { - // for _, p := range d.PointData { - // // p.Value, p.Unit = api.DivideByThousandIfRequired(p.Value, p.Unit) - // uv := api.SetUnitValueFloat(p.Value.Value(), p.Unit) - // _ = table.AddRow( - // api.NewDateTime(p.TimeStamp).PrintFull(), - // api.NameDevicePointInt(d.PsKey, p.PointID.Value()), - // p.PointGroupName, - // p.PointName, - // uv.Value(), - // uv.Unit(), - // ) - // } - // } - - table.InitGraph(output.GraphRequest { - Title: "", - TimeColumn: output.SetInteger(1), - SearchColumn: output.SetInteger(2), - NameColumn: output.SetInteger(4), - ValueColumn: output.SetInteger(5), - UnitsColumn: output.SetInteger(6), - SearchString: output.SetString(""), - MinLeftAxis: output.SetFloat(0), - MaxLeftAxis: output.SetFloat(0), - }) - - } - return table -} - func (e *EndPoint) GetData() api.DataMap { entries := api.NewDataMap() @@ -338,11 +255,12 @@ func (e *EndPoint) GetData() api.DataMap { // // var TotalEnergyConsumption VirtualPointStruct - name1 := "queryDeviceList." + e.Request.PsId.String() + pkg := apiReflect.GetName("", *e) + name1 := pkg + "." + e.Request.PsId.String() entries.StructToPoints(e.Response.ResultData.DevCountByStatusMap, name1 + ".status", e.Request.PsId.String(), time.Time{}) for _, d := range e.Response.ResultData.PageList { - name2 := fmt.Sprintf("queryDeviceList.%s", d.PsKey.Value()) + name2 := fmt.Sprintf("%s.%s", pkg, d.PsKey.Value()) entries.StructToPoints(d, name2, d.PsKey.Value(), time.Time{}) // entries.StructToPoints(d.PsTimezoneInfo, name2 + "PsTimezoneInfo", d.PsKey.Value(), time.Time{}) @@ -562,3 +480,80 @@ func (e *EndPoint) GetData() api.DataMap { return entries } + +func (e *EndPoint) GetDataTable() output.Table { + var table output.Table + for range Only.Once { + table = output.NewTable() + table.SetTitle("") + table.SetJson([]byte(e.GetJsonData(false))) + table.SetRaw([]byte(e.GetJsonData(true))) + + _ = table.SetHeader( + "Date", + "Point Id", + // "Parents", + "Group Name", + "Description", + "Value", + "Unit", + ) + + data := e.GetData() + var sorted []string + for p := range data.DataPoints { + sorted = append(sorted, string(p)) + } + sort.Strings(sorted) + + for _, p := range sorted { + entries := data.DataPoints[api.PointId(p)] + for _, de := range entries { + if de.Hide { + continue + } + + _ = table.AddRow( + de.Date.Format(api.DtLayout), + // api.NameDevicePointInt(de.Point.Parents, p.PointID.Value()), + // de.Point.Id, + p, + // de.Point.Parents.String(), + de.Point.GroupName, + de.Point.Name, + de.Value, + de.Point.Unit, + ) + } + } + + // for _, d := range e.Response.ResultData.PageList { + // for _, p := range d.PointData { + // // p.Value, p.Unit = api.DivideByThousandIfRequired(p.Value, p.Unit) + // uv := api.SetUnitValueFloat(p.Value.Value(), p.Unit) + // _ = table.AddRow( + // api.NewDateTime(p.TimeStamp).PrintFull(), + // api.NameDevicePointInt(d.PsKey, p.PointID.Value()), + // p.PointGroupName, + // p.PointName, + // uv.Value(), + // uv.Unit(), + // ) + // } + // } + + table.InitGraph(output.GraphRequest { + Title: "", + TimeColumn: output.SetInteger(1), + SearchColumn: output.SetInteger(2), + NameColumn: output.SetInteger(4), + ValueColumn: output.SetInteger(5), + UnitsColumn: output.SetInteger(6), + SearchString: output.SetString(""), + MinLeftAxis: output.SetFloat(0), + MaxLeftAxis: output.SetFloat(0), + }) + + } + return table +} diff --git a/iSolarCloud/AppService/queryDeviceListForApp/data.go b/iSolarCloud/AppService/queryDeviceListForApp/data.go index 9158fa775..8b0ac8d47 100644 --- a/iSolarCloud/AppService/queryDeviceListForApp/data.go +++ b/iSolarCloud/AppService/queryDeviceListForApp/data.go @@ -3,7 +3,12 @@ package queryDeviceListForApp import ( "GoSungrow/iSolarCloud/api" "GoSungrow/iSolarCloud/api/apiReflect" + "GoSungrow/iSolarCloud/api/output" "fmt" + "github.com/MickMake/GoUnify/Only" + "sort" + "strings" + "time" ) const Url = "/v1/devService/queryDeviceListForApp" @@ -25,7 +30,7 @@ func (rd RequestData) Help() string { type ResultData struct { PageList []struct { AttrID api.Integer `json:"attr_id"` - ChannelId api.Integer `json:"chnnl_id"` + ChannelId api.Integer `json:"chnnl_id" PointId:"channel_id"` CommandStatus api.Integer `json:"command_status"` ConnectState api.Integer `json:"connect_state"` DataFlag api.Integer `json:"data_flag"` @@ -65,7 +70,7 @@ type ResultData struct { PsID api.Integer `json:"ps_id"` PsKey api.PsKey `json:"ps_key"` RelState api.Integer `json:"rel_state"` - Sn api.String `json:"sn"` + Sn api.String `json:"sn" PointName:"Serial Number"` TypeName api.String `json:"type_name"` UUID api.Integer `json:"uuid"` } `json:"pageList"` @@ -101,3 +106,78 @@ func (e *ResultData) IsValid() error { // // return err //} + +func (e *EndPoint) GetData() api.DataMap { + entries := api.NewDataMap() + + for range Only.Once { + pkg := apiReflect.GetName("", *e) + for _, d := range e.Response.ResultData.PageList { + name := strings.Join([]string{pkg, d.PsKey.Value()}, ".") + entries.StructToPoints(d, name, d.PsKey.Value(), time.Time{}) + } + } + + return entries +} + +func (e *EndPoint) GetDataTable() output.Table { + var table output.Table + for range Only.Once { + table = output.NewTable() + table.SetTitle("") + table.SetJson([]byte(e.GetJsonData(false))) + table.SetRaw([]byte(e.GetJsonData(true))) + + _ = table.SetHeader( + "Date", + "Point Id", + // "Parents", + "Group Name", + "Description", + "Value", + "Unit", + ) + + data := e.GetData() + var sorted []string + for p := range data.DataPoints { + sorted = append(sorted, string(p)) + } + sort.Strings(sorted) + + for _, p := range sorted { + entries := data.DataPoints[api.PointId(p)] + for _, de := range entries { + if de.Hide { + continue + } + + _ = table.AddRow( + de.Date.Format(api.DtLayout), + // api.NameDevicePointInt(de.Point.Parents, p.PointID.Value()), + // de.Point.Id, + p, + // de.Point.Parents.String(), + de.Point.GroupName, + de.Point.Name, + de.Value, + de.Point.Unit, + ) + } + } + + // table.InitGraph(output.GraphRequest { + // Title: "", + // TimeColumn: output.SetInteger(1), + // SearchColumn: output.SetInteger(2), + // NameColumn: output.SetInteger(4), + // ValueColumn: output.SetInteger(5), + // UnitsColumn: output.SetInteger(6), + // SearchString: output.SetString(""), + // MinLeftAxis: output.SetFloat(0), + // MaxLeftAxis: output.SetFloat(0), + // }) + } + return table +} diff --git a/iSolarCloud/api/apiReflect/reflect.go b/iSolarCloud/api/apiReflect/reflect.go index dfe6c9722..9a652b785 100644 --- a/iSolarCloud/api/apiReflect/reflect.go +++ b/iSolarCloud/api/apiReflect/reflect.go @@ -667,24 +667,31 @@ func GetPointTags(ref interface{}, name ...string) DataStructureMap { ignore = true } - // if fieldTo.Tag.Get("json") == "robot_num_sweep_capacity" { + // if fieldTo.Tag.Get("json") == "p83012" { // fmt.Sprintf("") // } + pointJson := fieldTo.Tag.Get("json") + pointId := fieldTo.Tag.Get(PointId) + if pointId == "" { + pointId = pointJson + } + if IsUnknownStructure(fieldTo, fieldVo) { n2 := name - n2 = append(n2, fieldTo.Name) + n2 = append(n2, pointId) t2 := GetPointTags(fieldVo.Interface(), n2...) for k, v := range t2 { ret[k] = v } - break + continue } endPointName := strings.Join(name, ".") - pointName := strings.TrimPrefix(endPointName + "." + fieldTo.Name, ".") + pointName := strings.TrimPrefix(endPointName + "." + pointId, ".") ret[pointName] = DataStructure { - PointId: fieldTo.Tag.Get(PointId), + Json: pointJson, + PointId: pointId, // PointType: fieldTo.Tag.Get(PointType), PointUnit: fieldTo.Tag.Get(PointUnit), PointUnitFrom: fieldTo.Tag.Get(PointUnitFrom), @@ -696,13 +703,12 @@ func GetPointTags(ref interface{}, name ...string) DataStructureMap { PointGroupName: fieldTo.Tag.Get(PointGroupName), PointIgnore: ignore, - Json: fieldTo.Tag.Get("json"), Value: fieldVo.Interface(), ValueType: fieldTo.Type.String(), Endpoint: endPointName, } - // if fieldTo.Tag.Get("json") == "robot_num_sweep_capacity" { + // if fieldTo.Tag.Get("json") == "p83012" { // fmt.Sprintf("") // } } diff --git a/iSolarCloud/api/const.go b/iSolarCloud/api/const.go index c9a2c15b2..42240f40f 100644 --- a/iSolarCloud/api/const.go +++ b/iSolarCloud/api/const.go @@ -1,7 +1,9 @@ package api +import "time" const ( NullAreaName = "NullArea" NullEndPointName = "NullEndpoint" + DefaultTimeout = time.Second * 60 ) \ No newline at end of file diff --git a/iSolarCloud/api/nullEndpoint/data.go b/iSolarCloud/api/nullEndpoint/data.go index 0dc7ade05..2b1cc5c3d 100644 --- a/iSolarCloud/api/nullEndpoint/data.go +++ b/iSolarCloud/api/nullEndpoint/data.go @@ -1,11 +1,12 @@ package nullEndpoint import ( - "GoSungrow/Only" + "GoSungrow/iSolarCloud/api" "GoSungrow/iSolarCloud/api/apiReflect" - "GoSungrow/iSolarCloud/api/output" "errors" "fmt" + "github.com/MickMake/GoUnify/Only" + "time" ) @@ -63,47 +64,13 @@ func (e *ResultData) IsValid() error { // return err // } -func (e *EndPoint) GetDataTable() output.Table { - var table output.Table + +func (e *EndPoint) GetData() api.DataMap { + entries := api.NewDataMap() for range Only.Once { - table = output.NewTable() - table.SetTitle("") - table.SetJson([]byte(e.GetJsonData(false))) - table.SetRaw([]byte(e.GetJsonData(true))) - - // e.Error = table.SetHeader( - // "Template Id", - // "Template Name", - // "Update On", - // ) - // if e.Error != nil { - // break - // } - - // for _, p := range e.Response.ResultData.PageList { - // _ = table.AddRow( - // p.TemplateID, - // p.TemplateName, - // api.NewDateTime(p.UpdateTime).PrintFull(), - // ) - // if table.Error != nil { - // continue - // } - // } - - // table.InitGraph(output.GraphRequest { - // Title: "", - // TimeColumn: output.SetInteger(1), - // SearchColumn: output.SetInteger(2), - // NameColumn: output.SetInteger(3), - // ValueColumn: output.SetInteger(4), - // UnitsColumn: output.SetInteger(5), - // SearchString: output.SetString(""), - // MinLeftAxis: output.SetFloat(0), - // MaxLeftAxis: output.SetFloat(0), - // }) + entries.StructToPoints(e.Response.ResultData, apiReflect.GetName("", *e), "PsId", time.Time{}) } - return table + return entries } diff --git a/iSolarCloud/api/nullEndpoint/struct.go b/iSolarCloud/api/nullEndpoint/struct.go index 57e853885..1891dce6e 100644 --- a/iSolarCloud/api/nullEndpoint/struct.go +++ b/iSolarCloud/api/nullEndpoint/struct.go @@ -12,6 +12,7 @@ import ( "encoding/json" "errors" "fmt" + "sort" "time" ) @@ -361,3 +362,64 @@ func (e EndPoint) SetCacheTimeout(duration time.Duration) api.EndPoint { func (e EndPoint) GetCacheTimeout() time.Duration { return e.ApiRoot.GetCacheTimeout() } + +func (e EndPoint) GetDataTable() output.Table { + var table output.Table + for range Only.Once { + table = output.NewTable() + table.SetTitle("") + table.SetJson([]byte(e.GetJsonData(false))) + table.SetRaw([]byte(e.GetJsonData(true))) + + _ = table.SetHeader( + "Date", + "Point Id", + // "Parents", + "Group Name", + "Description", + "Value", + "Unit", + ) + + data := e.GetData() + var sorted []string + for p := range data.DataPoints { + sorted = append(sorted, string(p)) + } + sort.Strings(sorted) + + for _, p := range sorted { + entries := data.DataPoints[api.PointId(p)] + for _, de := range entries { + if de.Hide { + continue + } + + _ = table.AddRow( + de.Date.Format(api.DtLayout), + // api.NameDevicePointInt(de.Point.Parents, p.PointID.Value()), + // de.Point.Id, + p, + // de.Point.Parents.String(), + de.Point.GroupName, + de.Point.Name, + de.Value, + de.Point.Unit, + ) + } + } + + // table.InitGraph(output.GraphRequest { + // Title: "", + // TimeColumn: output.SetInteger(1), + // SearchColumn: output.SetInteger(2), + // NameColumn: output.SetInteger(4), + // ValueColumn: output.SetInteger(5), + // UnitsColumn: output.SetInteger(6), + // SearchString: output.SetString(""), + // MinLeftAxis: output.SetFloat(0), + // MaxLeftAxis: output.SetFloat(0), + // }) + } + return table +} diff --git a/iSolarCloud/api/struct_data.go b/iSolarCloud/api/struct_data.go index f0779adad..dcaac722d 100644 --- a/iSolarCloud/api/struct_data.go +++ b/iSolarCloud/api/struct_data.go @@ -97,12 +97,9 @@ func (dm *DataMap) StructToPoints(ref interface{}, endpoint string, parentId str // fmt.Printf("TP: %v\n", tp) for _, f := range tp { - // if strings.Contains(strings.ToLower(k), "robot") { + // if strings.Contains(strings.ToLower(f.Json), "p83012") { // fmt.Sprintf("") // } - if f.PointId == "" { - f.PointId = f.Json - } if f.PointIgnore { // fmt.Printf("IGNORE: %s\n", f.PointId) @@ -152,53 +149,135 @@ func (dm *DataMap) StructToPoints(ref interface{}, endpoint string, parentId str uv = f.Value.(UnitValue) // uv = uv.UnitValueFix() + case "[]UnitValue": + fallthrough + case "[]api.UnitValue": + // v := strings.Join(f.Value.([]string), ",") + j, err := json.Marshal(f.Value.([]UnitValue)) + if err != nil { + j = []byte(fmt.Sprintf("%v", f.Value.([]UnitValue))) + } + uv = SetUnitValueString(string(j), f.PointUnit) + case "Float": fallthrough case "api.Float": v := f.Value.(Float) uv = SetUnitValueFloat(v.Value(), f.PointUnit) + case "[]Float": + fallthrough + case "[]api.Float": + // v := strings.Join(f.Value.([]string), ",") + j, err := json.Marshal(f.Value.([]Float)) + if err != nil { + j = []byte(fmt.Sprintf("%v", f.Value.([]Float))) + } + uv = SetUnitValueString(string(j), f.PointUnit) + case "Integer": fallthrough case "api.Integer": v := f.Value.(Integer).Value() uv = SetUnitValueInteger(v, f.PointUnit) + case "[]Integer": + fallthrough + case "[]api.Integer": + j, err := json.Marshal(f.Value.([]Integer)) + if err != nil { + j = []byte(fmt.Sprintf("%v", f.Value.([]Integer))) + } + uv = SetUnitValueString(string(j), f.PointUnit) + case "Count": fallthrough case "api.Count": v := f.Value.(Count).Value() uv = SetUnitValueInteger(v, "counter") + case "[]Count": + fallthrough + case "[]api.Count": + j, err := json.Marshal(f.Value.([]Count)) + if err != nil { + j = []byte(fmt.Sprintf("%v", f.Value.([]Count))) + } + uv = SetUnitValueString(string(j), f.PointUnit) + case "Bool": fallthrough case "api.Bool": v := f.Value.(Bool).String() uv = SetUnitValueString(v, "binary") + case "[]Bool": + fallthrough + case "[]api.Bool": + j, err := json.Marshal(f.Value.([]Bool)) + if err != nil { + j = []byte(fmt.Sprintf("%v", f.Value.([]Bool))) + } + uv = SetUnitValueString(string(j), f.PointUnit) + case "String": fallthrough case "api.String": v := f.Value.(String).String() uv = SetUnitValueString(v, f.PointUnit) + case "[]String": + fallthrough + case "[]api.String": + j, err := json.Marshal(f.Value.([]String)) + if err != nil { + j = []byte(fmt.Sprintf("%v", f.Value.([]String))) + } + uv = SetUnitValueString(string(j), f.PointUnit) + case "PsKey": fallthrough case "api.PsKey": v := f.Value.(PsKey).Value() uv = SetUnitValueString(v, f.PointUnit) + case "[]PsKey": + fallthrough + case "[]api.PsKey": + j, err := json.Marshal(f.Value.([]PsKey)) + if err != nil { + j = []byte(fmt.Sprintf("%v", f.Value.([]PsKey))) + } + uv = SetUnitValueString(string(j), f.PointUnit) + case "DateTime": fallthrough case "api.DateTime": v := f.Value.(DateTime).String() uv = SetUnitValueString(v, "date") + case "[]DateTime": + fallthrough + case "[]api.DateTime": + j, err := json.Marshal(f.Value.([]DateTime)) + if err != nil { + j = []byte(fmt.Sprintf("%v", f.Value.([]DateTime))) + } + uv = SetUnitValueString(string(j), f.PointUnit) + + case "[]string": + // v := strings.Join(f.Value.([]string), ",") + j, err := json.Marshal(f.Value.([]string)) + if err != nil { + j = []byte(fmt.Sprintf("%v", f.Value.([]string))) + } + uv = SetUnitValueString(string(j), f.PointUnit) + default: ignore = true } if ignore { - // fmt.Printf("IGNORE: %s\n", f.PointId) + // fmt.Printf("IGNORE: %s.%s (%s)\n", f.Endpoint, f.PointId, f.ValueType) continue } @@ -217,6 +296,15 @@ func (dm *DataMap) StructToPoints(ref interface{}, endpoint string, parentId str f.PointTimeSpan = PointTimeSpanTotal } + var now DateTime + if timestamp.IsZero() { + now = NewDateTime(time.Now().Round(5 * time.Minute).Format(DtLayoutZeroSeconds)) + } else { + now = NewDateTime(timestamp.String()) + } + + // @TODO - Think about adding in arrays of values OR just marshal arrays into JSON. + // fullName := JoinDevicePoint(device, PointId(f.PointId)) p := Point { Parents: parents, @@ -230,12 +318,9 @@ func (dm *DataMap) StructToPoints(ref interface{}, endpoint string, parentId str States: nil, } - var now DateTime - if timestamp.IsZero() { - now = NewDateTime(time.Now().Round(5 * time.Minute).Format(DtLayoutZeroSeconds)) - } else { - now = NewDateTime(timestamp.String()) - } + // if strings.Contains(strings.ToLower(f.Json), "p83012") { + // fmt.Sprintf("") + // } dm.AddEntry(f.Endpoint, f.PointDevice, p, now, uv.String()) @@ -247,12 +332,15 @@ func (dm *DataMap) StructToPoints(ref interface{}, endpoint string, parentId str } for _, f := range tp { + // if strings.Contains(strings.ToLower(f.PointId), "p83012") { + // fmt.Sprintf("") + // } if f.PointUnitFrom != "" { sdp := dm.GetEntryFromPointId(f.PointUnitFrom) if sdp == nil { continue } - ddp := dm.GetEntryFromPointId(f.Json) + ddp := dm.GetEntryFromPointId(f.PointId) if ddp == nil { continue } @@ -492,6 +580,9 @@ func (dm *DataMap) AddEntry(endpoint string, parentId string, point Point, date point.Unit = ref.Unit() point.Valid = true + if _, ok := dm.DataPoints[point.Id]; ok { + point.Id += ".BARF" + } // dm.Add(JoinDevicePoint(endpoint, point.Id), DataEntry { dm.Add(JoinDevicePoint(endpoint, point.Id), DataEntry { EndPoint: endpoint, diff --git a/iSolarCloud/highlevel.go b/iSolarCloud/highlevel.go index 375861899..32a227f0f 100644 --- a/iSolarCloud/highlevel.go +++ b/iSolarCloud/highlevel.go @@ -2,9 +2,12 @@ package iSolarCloud import ( "GoSungrow/Only" + "GoSungrow/iSolarCloud/AppService/findPsType" + "GoSungrow/iSolarCloud/AppService/getAllDeviceByPsId" "GoSungrow/iSolarCloud/AppService/getDeviceList" "GoSungrow/iSolarCloud/AppService/getDeviceModelInfoList" "GoSungrow/iSolarCloud/AppService/getHouseholdStoragePsReport" + "GoSungrow/iSolarCloud/AppService/getIncomeSettingInfos" "GoSungrow/iSolarCloud/AppService/getKpiInfo" "GoSungrow/iSolarCloud/AppService/getPowerDevicePointInfo" "GoSungrow/iSolarCloud/AppService/getPowerDevicePointNames" @@ -14,6 +17,7 @@ import ( "GoSungrow/iSolarCloud/AppService/getPsList" "GoSungrow/iSolarCloud/AppService/getTemplateList" "GoSungrow/iSolarCloud/AppService/queryDeviceList" + "GoSungrow/iSolarCloud/AppService/queryDeviceListForApp" "GoSungrow/iSolarCloud/AppService/queryDeviceRealTimeDataByPsKeys" "GoSungrow/iSolarCloud/AppService/queryMutiPointDataList" "GoSungrow/iSolarCloud/WebAppService/getMqttConfigInfoByAppkey" @@ -484,43 +488,34 @@ func (sg *SunGrow) GetRealTimeData(psKey string) error { func (sg *SunGrow) CmdDataPsDetail(psIds ...api.Integer) error { for range Only.Once { + if len(psIds) == 0 { + psIds, sg.Error = sg.GetPsIds() + if sg.Error != nil { + break + } + } + + var data SunGrowData + data.New(sg) + for _, psId := range psIds { - data := sg.GetPsDetail(psId) - table := data.GetDataTable() - if table.Error != nil { - sg.Error = table.Error + response := data.Get("getPsDetail", SunGrowDataRequest{PsId: psId}) + if response.Error != nil { break } - - table.SetTitle("PS Details %s", psId) - table.SetFilePrefix(data.SetFilenamePrefix("%d", psId)) - table.SetGraphFilter("") - table.SetSaveFile(sg.SaveAsFile) - table.OutputType = sg.OutputType - sg.Error = table.Output() + sg.Error = response.Table.Output() if sg.Error != nil { break } - - data2 := sg.GetPsDetailWithPsType(psId) - table = data2.GetDataTable() - if table.Error != nil { - sg.Error = table.Error + response = data.Get("getPsDetailWithPsType", SunGrowDataRequest{PsId: psId}) + if response.Error != nil { break } - - table.SetTitle("PS Details With Ps Type %s", psId) - table.SetFilePrefix(data.SetFilenamePrefix("%d", psId)) - table.SetGraphFilter("") - table.SetSaveFile(sg.SaveAsFile) - table.OutputType = sg.OutputType - sg.Error = table.Output() + sg.Error = response.Table.Output() if sg.Error != nil { break } - - // api.Points.Print() } } @@ -683,7 +678,7 @@ func (sg *SunGrow) GetDeviceList(psIds ...api.Integer) error { ret = append(ret, data.GetDevices()...) } - table := getDeviceList.GetDataTable(ret) + table := getDeviceList.GetDevicesTable(ret) table.SetTitle("All Devices") table.SetFilePrefix("") table.SetGraphFilter("") @@ -1124,7 +1119,7 @@ func (sg *SunGrow) GetDevices(print bool) (getDeviceList.Devices, error) { break } - table := getDeviceList.GetDataTable(ret) + table := getDeviceList.GetDevicesTable(ret) table.SetTitle("All Devices") table.SetFilePrefix("") table.SetGraphFilter("") @@ -1229,90 +1224,815 @@ func (sg *SunGrow) GetPsKeys() ([]string, error) { // ****************************************************** // -func (sg *SunGrow) QueryDeviceList(psId api.Integer) queryDeviceList.EndPoint { - var data queryDeviceList.EndPoint +func (sg *SunGrow) GetEndpoints(endpoints []string, psIds ...api.Integer) error { for range Only.Once { - if psId.Value() == 0 { - break + var data SunGrowData + data.New(sg) + + if len(endpoints) == 0 { + endpoints = data.GetAllEndPoints() } - ep := sg.GetByStruct( - "AppService.queryDeviceList", - queryDeviceList.RequestData{PsId: psId}, - time.Second * 60, - ) + if len(psIds) == 0 { + psIds, sg.Error = sg.GetPsIds() + if sg.Error != nil { + break + } + } - data = queryDeviceList.Assert(ep) - if data.Error != nil { - sg.Error = data.Error - break + for _, endpoint := range endpoints { + if !data.HasArgs(endpoint) { + response := data.Get(endpoint, SunGrowDataRequest{ }) + if response.Error != nil { + break + } + // response.Table.SetGraphFilter("") + sg.Error = response.Table.Output() + if sg.Error != nil { + break + } + continue + } + + for _, psId := range psIds { + response := data.Get(endpoint, SunGrowDataRequest{PsId: psId}) + if response.Error != nil { + break + } + // response.Table.SetGraphFilter("") + sg.Error = response.Table.Output() + if sg.Error != nil { + break + } + } } } - return data + return sg.Error } -func (sg *SunGrow) GetPsList() getPsList.EndPoint { - var data getPsList.EndPoint +type SunGrowData struct { + EndPoint string + EndPoints EndPoints + SunGrow *SunGrow + Error error +} +type EndPoints map[string]EndPoint +type EndPoint struct { + Func SunGrowDataFunction + HasArgs bool +} +type SunGrowDataFunction func(request SunGrowDataRequest) SunGrowDataResponse +type SunGrowDataRequest struct { + PsId api.Integer `json:"ps_id"` + ReportType string `json:"report_type"` + DateID string `json:"date_id"` + DateType string `json:"date_type"` +} +type SunGrowDataResponse struct { + Data api.DataMap + Table output.Table + Filename string + Title string + Error error +} + + +func (sg *SunGrowData) New(ref *SunGrow) { for range Only.Once { - ep := sg.GetByStruct( + sg.SunGrow = ref + sg.EndPoints = make(EndPoints) + sg.EndPoints["getPsList"] = EndPoint { Func: sg.getPsList, HasArgs: false } + sg.EndPoints["queryDeviceList"] = EndPoint { Func: sg.queryDeviceList, HasArgs: true } + sg.EndPoints["queryDeviceListForApp"] = EndPoint { Func: sg.queryDeviceListForApp, HasArgs: true } + sg.EndPoints["getPsDetailWithPsType"] = EndPoint { Func: sg.getPsDetailWithPsType, HasArgs: true } + sg.EndPoints["getPsDetail"] = EndPoint { Func: sg.getPsDetail, HasArgs: true } + sg.EndPoints["findPsType"] = EndPoint { Func: sg.findPsType, HasArgs: true } + // sg.EndPoints["getAllDeviceByPsId"] = EndPoint { Func: sg.getAllDeviceByPsId, HasArgs: false } + sg.EndPoints["getDeviceList"] = EndPoint { Func: sg.getDeviceList, HasArgs: true } + sg.EndPoints["getIncomeSettingInfos"] = EndPoint { Func: sg.getIncomeSettingInfos, HasArgs: true } + sg.EndPoints["getKpiInfo"] = EndPoint { Func: sg.getKpiInfo, HasArgs: false } + } +} + +func (sg *SunGrowData) GetAllEndPoints() []string { + var ret []string + for ep := range sg.EndPoints { + ret = append(ret, ep) + } + return ret +} + +func (sg *SunGrowData) Get(endpoint string, request SunGrowDataRequest) SunGrowDataResponse { + var response SunGrowDataResponse + for range Only.Once { + dataEndPoint, ok := sg.Exists(endpoint) + if !ok { + break + } + + response = dataEndPoint.Func(request) + if response.Error != nil { + break + } + + if response.Filename == "" { + response.Filename = endpoint + } + if response.Title == "" { + response.Title = fmt.Sprintf("Data Request %s", endpoint) + } + response.Table.SetTitle(response.Title) + response.Table.SetFilePrefix(response.Filename) + response.Table.SetGraphFilter("") + response.Table.SetSaveFile(sg.SunGrow.SaveAsFile) + response.Table.OutputType = sg.SunGrow.OutputType + } + return response +} + +func (sg *SunGrowData) Exists(endpoint string) (EndPoint, bool) { + var dataFunc EndPoint + var yes bool + for range Only.Once { + if dataFunc, yes = sg.EndPoints[endpoint]; yes { + yes = true + break + } + sg.Error = errors.New(fmt.Sprintf("unknown endpoint function '%s'", endpoint)) + } + return dataFunc, yes +} + +func (sg *SunGrowData) HasArgs(endpoint string) bool { + var yes bool + for range Only.Once { + dataEndPoint, ok := sg.Exists(endpoint) + if !ok { + break + } + yes = dataEndPoint.HasArgs + } + return yes +} + + +func (sg *SunGrowData) getPsList(request SunGrowDataRequest) SunGrowDataResponse { + var response SunGrowDataResponse + for range Only.Once { + ep := sg.SunGrow.GetByStruct( "AppService.getPsList", - getPsList.RequestData{}, - time.Second * 60, + getPsList.RequestData{ }, + api.DefaultTimeout, ) - data = getPsList.Assert(ep) + data := getPsList.Assert(ep) if data.Error != nil { - sg.Error = data.Error + sg.SunGrow.Error = data.Error break } - } - return data + response.Filename = data.SetFilenamePrefix("getPsList-%d", request.PsId) + response.Data = data.GetData() + response.Table = data.GetDataTable() + } + return response } -func (sg *SunGrow) GetPsDetailWithPsType(psId api.Integer) getPsDetailWithPsType.EndPoint { - var data getPsDetailWithPsType.EndPoint +func (sg *SunGrowData) queryDeviceList(request SunGrowDataRequest) SunGrowDataResponse { + var response SunGrowDataResponse for range Only.Once { - if psId.Value() == 0 { + ep := sg.SunGrow.GetByStruct( + "AppService.queryDeviceList", + queryDeviceList.RequestData{ PsId: request.PsId }, + api.DefaultTimeout, + ) + + data := queryDeviceList.Assert(ep) + if data.Error != nil { + sg.SunGrow.Error = data.Error break } - ep := sg.GetByStruct( + response.Filename = data.SetFilenamePrefix("queryDeviceList-%d", request.PsId) + response.Data = data.GetData() + response.Table = data.GetDataTable() + } + return response +} + +func (sg *SunGrowData) queryDeviceListForApp(request SunGrowDataRequest) SunGrowDataResponse { + var response SunGrowDataResponse + for range Only.Once { + ep := sg.SunGrow.GetByStruct( + "AppService.queryDeviceListForApp", + queryDeviceListForApp.RequestData{ PsId: request.PsId }, + api.DefaultTimeout, + ) + + data := queryDeviceListForApp.Assert(ep) + if data.Error != nil { + sg.SunGrow.Error = data.Error + break + } + + response.Filename = data.SetFilenamePrefix("queryDeviceListForApp-%d", request.PsId) + response.Data = data.GetData() + response.Table = data.GetDataTable() + } + return response +} + +func (sg *SunGrowData) getPsDetailWithPsType(request SunGrowDataRequest) SunGrowDataResponse { + var response SunGrowDataResponse + for range Only.Once { + ep := sg.SunGrow.GetByStruct( "AppService.getPsDetailWithPsType", - getPsDetailWithPsType.RequestData{PsId: psId}, - time.Second * 60, + getPsDetailWithPsType.RequestData{ PsId: request.PsId }, + api.DefaultTimeout, ) - data = getPsDetailWithPsType.Assert(ep) + data := getPsDetailWithPsType.Assert(ep) if data.Error != nil { - sg.Error = data.Error + sg.SunGrow.Error = data.Error break } - } - return data + response.Filename = data.SetFilenamePrefix("getPsDetailWithPsType-%d", request.PsId) + response.Data = data.GetData() + response.Table = data.GetDataTable() + } + return response } -func (sg *SunGrow) GetPsDetail(psId api.Integer) getPsDetail.EndPoint { - var data getPsDetail.EndPoint +func (sg *SunGrowData) getPsDetail(request SunGrowDataRequest) SunGrowDataResponse { + var response SunGrowDataResponse for range Only.Once { - if psId.Value() == 0 { - break - } - - ep := sg.GetByStruct( + ep := sg.SunGrow.GetByStruct( "AppService.getPsDetail", - getPsDetail.RequestData{PsId: psId}, - time.Second * 60, + getPsDetail.RequestData{ PsId: request.PsId }, + api.DefaultTimeout, ) - data = getPsDetail.Assert(ep) + data := getPsDetail.Assert(ep) if data.Error != nil { - sg.Error = data.Error + sg.SunGrow.Error = data.Error break } - } - return data + response.Filename = data.SetFilenamePrefix("getPsDetail-%d", request.PsId) + response.Data = data.GetData() + response.Table = data.GetDataTable() + } + return response } + +func (sg *SunGrowData) findPsType(request SunGrowDataRequest) SunGrowDataResponse { + var response SunGrowDataResponse + for range Only.Once { + ep := sg.SunGrow.GetByStruct( + "AppService.findPsType", + findPsType.RequestData{ PsId: request.PsId }, + api.DefaultTimeout, + ) + + data := findPsType.Assert(ep) + if data.Error != nil { + sg.SunGrow.Error = data.Error + break + } + + response.Filename = data.SetFilenamePrefix("findPsType-%d", request.PsId) + response.Data = data.GetData() + response.Table = data.GetDataTable() + } + return response +} + +func (sg *SunGrowData) getAllDeviceByPsId(request SunGrowDataRequest) SunGrowDataResponse { + var response SunGrowDataResponse + for range Only.Once { + ep := sg.SunGrow.GetByStruct( + "AppService.getAllDeviceByPsId", + getAllDeviceByPsId.RequestData{ PsId: request.PsId }, + api.DefaultTimeout, + ) + + data := getAllDeviceByPsId.Assert(ep) + if data.Error != nil { + sg.SunGrow.Error = data.Error + break + } + + response.Filename = data.SetFilenamePrefix("getAllDeviceByPsId-%d", request.PsId) + response.Data = data.GetData() + response.Table = data.GetDataTable() + } + return response +} + +func (sg *SunGrowData) getDeviceList(request SunGrowDataRequest) SunGrowDataResponse { + var response SunGrowDataResponse + for range Only.Once { + ep := sg.SunGrow.GetByStruct( + "AppService.getDeviceList", + getDeviceList.RequestData{ PsId: request.PsId }, + api.DefaultTimeout, + ) + + data := getDeviceList.Assert(ep) + if data.Error != nil { + sg.SunGrow.Error = data.Error + break + } + + response.Filename = data.SetFilenamePrefix("getDeviceList-%d", request.PsId) + response.Data = data.GetData() + response.Table = data.GetDataTable() + } + return response +} + +func (sg *SunGrowData) getIncomeSettingInfos(request SunGrowDataRequest) SunGrowDataResponse { + var response SunGrowDataResponse + for range Only.Once { + ep := sg.SunGrow.GetByStruct( + "AppService.getIncomeSettingInfos", + getIncomeSettingInfos.RequestData{ PsId: request.PsId }, + api.DefaultTimeout, + ) + + data := getIncomeSettingInfos.Assert(ep) + if data.Error != nil { + sg.SunGrow.Error = data.Error + break + } + + response.Filename = data.SetFilenamePrefix("getIncomeSettingInfos-%d", request.PsId) + response.Data = data.GetData() + response.Table = data.GetDataTable() + } + return response +} + +func (sg *SunGrowData) getKpiInfo(request SunGrowDataRequest) SunGrowDataResponse { + var response SunGrowDataResponse + for range Only.Once { + ep := sg.SunGrow.GetByStruct( + "AppService.getKpiInfo", + getKpiInfo.RequestData{ }, + api.DefaultTimeout, + ) + + data := getKpiInfo.Assert(ep) + if data.Error != nil { + sg.SunGrow.Error = data.Error + break + } + + response.Filename = data.SetFilenamePrefix("getKpiInfo-%d", request.PsId) + response.Data = data.GetData() + response.Table = data.GetDataTable() + } + return response +} + +// func (sg *SunGrowData) getPowerChargeSettingInfo(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.getPowerChargeSettingInfo", +// getPowerChargeSettingInfo.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := getPowerChargeSettingInfo.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("getPowerChargeSettingInfo-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) getPowerStationBasicInfo(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.getPowerStationBasicInfo", +// getPowerStationBasicInfo.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := getPowerStationBasicInfo.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("getPowerStationBasicInfo-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) getPowerStationData(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.getPowerStationData", +// getPowerStationData.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := getPowerStationData.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("getPowerStationData-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) getPowerStationForHousehold(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.getPowerStationForHousehold", +// getPowerStationForHousehold.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := getPowerStationForHousehold.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("getPowerStationForHousehold-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) getPowerStationInfo(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.getPowerStationInfo", +// getPowerStationInfo.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := getPowerStationInfo.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("getPowerStationInfo-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) getPowerStatistics(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.getPowerStatistics", +// getPowerStatistics.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := getPowerStatistics.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("getPowerStatistics-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) getPsHealthState(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.getPsHealthState", +// getPsHealthState.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := getPsHealthState.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("getPsHealthState-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) getPsWeatherList(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.getPsWeatherList", +// getPsWeatherList.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := getPsWeatherList.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("getPsWeatherList-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) getRemoteUpgradeTaskList(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.getRemoteUpgradeTaskList", +// getRemoteUpgradeTaskList.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := getRemoteUpgradeTaskList.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("getRemoteUpgradeTaskList-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) getReportData(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.getReportData", +// getReportData.RequestData{ PsId: request.PsId, ReportType: request.ReportType }, +// api.DefaultTimeout, +// ) +// +// data := getReportData.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("getReportData-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) psForcastInfo(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.psForcastInfo", +// psForcastInfo.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := psForcastInfo.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("psForcastInfo-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) queryAllPsIdAndName(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.queryAllPsIdAndName", +// queryAllPsIdAndName.RequestData{ }, +// api.DefaultTimeout, +// ) +// +// data := queryAllPsIdAndName.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("queryAllPsIdAndName-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) queryPsIdList(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.queryPsIdList", +// queryPsIdList.RequestData{ }, +// api.DefaultTimeout, +// ) +// +// data := queryPsIdList.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("queryPsIdList-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) queryPsNameByPsId(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.queryPsNameByPsId", +// queryPsNameByPsId.RequestData{ }, +// api.DefaultTimeout, +// ) +// +// data := queryPsNameByPsId.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("queryPsNameByPsId-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) queryPowerStationInfo(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.queryPowerStationInfo", +// queryPowerStationInfo.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := queryPowerStationInfo.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("queryPowerStationInfo-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) queryPsProfit(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.queryPsProfit", +// queryPsProfit.RequestData{ PsId: request.PsId, DateID: request.DateID, DateType: request.DateType }, +// api.DefaultTimeout, +// ) +// +// data := queryPsProfit.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("queryPsProfit-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) reportList(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.reportList", +// reportList.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := reportList.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("reportList-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) getPsIdState(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.getPsIdState", +// getPsIdState.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := getPsIdState.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("getPsIdState-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) showPSView(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.showPSView", +// showPSView.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := showPSView.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("showPSView-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// } +// +// func (sg *SunGrowData) getMaxDeviceIdByPsId(request SunGrowDataRequest) SunGrowDataResponse { +// var response SunGrowDataResponse +// for range Only.Once { +// ep := sg.SunGrow.GetByStruct( +// "AppService.getMaxDeviceIdByPsId", +// getMaxDeviceIdByPsId.RequestData{ PsId: request.PsId }, +// api.DefaultTimeout, +// ) +// +// data := getMaxDeviceIdByPsId.Assert(ep) +// if data.Error != nil { +// sg.SunGrow.Error = data.Error +// break +// } +// +// response.Filename = data.SetFilenamePrefix("getMaxDeviceIdByPsId-%d", request.PsId) +// response.Data = data.GetData() +// response.Table = data.GetDataTable() +// } +// return response +// }