From 02151a60b030e22f6b09dc59b4b45b97cdc420e3 Mon Sep 17 00:00:00 2001 From: MickMake Date: Wed, 19 Oct 2022 01:37:11 +1100 Subject: [PATCH] v2.3.2 - Support update freqs. --- .idea/workspace.xml | 253 +-- cmd/cmd_mqtt.go | 10 +- iSolarCloud/AppService/getDeviceList/data.go | 113 +- .../getHouseholdStoragePsReport/data.go | 174 +- .../getPowerDevicePointInfo/data.go | 14 +- iSolarCloud/AppService/getPsDetail/data.go | 216 +-- .../AppService/getPsDetailWithPsType/data.go | 264 +-- iSolarCloud/AppService/getPsList/data.go | 159 +- .../AppService/queryDeviceList/data.go | 748 ++++++--- .../AppService/queryDeviceListForApp/data.go | 52 +- .../AppService/queryMutiPointDataList/data.go | 2 +- iSolarCloud/api/apiReflect/reflect.go | 613 +++++-- iSolarCloud/api/const.go | 102 ++ iSolarCloud/api/legacy.go | 662 ++++++++ iSolarCloud/api/nullEndpoint/struct.go | 12 +- iSolarCloud/api/struct_data.go | 1412 +++++------------ iSolarCloud/api/struct_de.go | 102 ++ iSolarCloud/api/struct_dpe.go | 175 ++ iSolarCloud/api/struct_point.go | 126 +- iSolarCloud/api/struct_points.go | 140 +- iSolarCloud/api/struct_template_points.go | 10 +- iSolarCloud/api/types.go | 19 +- iSolarCloud/api/valueTypes/bool.go | 57 +- iSolarCloud/api/valueTypes/datetime.go | 10 +- iSolarCloud/api/valueTypes/float.go | 11 +- iSolarCloud/api/valueTypes/integers.go | 14 + iSolarCloud/api/valueTypes/point.go | 7 + iSolarCloud/api/valueTypes/string.go | 18 + iSolarCloud/api/valueTypes/types.go | 557 +++++-- iSolarCloud/api/valueTypes/uv.go | 232 ++- iSolarCloud/data.go | 2 +- iSolarCloud/highlevel.go | 14 +- mmHa/struct.go | 2 +- 33 files changed, 3877 insertions(+), 2425 deletions(-) create mode 100644 iSolarCloud/api/legacy.go create mode 100644 iSolarCloud/api/struct_de.go create mode 100644 iSolarCloud/api/struct_dpe.go diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 3e251acb5..42ec81bd2 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,13 +5,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cmd/cmd_mqtt.go b/cmd/cmd_mqtt.go index 38ce46444..d9a2c8a9f 100644 --- a/cmd/cmd_mqtt.go +++ b/cmd/cmd_mqtt.go @@ -373,10 +373,10 @@ func (ca *Cmds) MqttCron() error { func (ca *Cmds) Update(endpoint string, data api.DataMap, newDay bool) error { for range Only.Once { // Also getPowerStatistics, getHouseholdStoragePsReport, getPsList, getUpTimePoint, - cmdLog.LogPrintDate("Syncing %d entries with HASSIO from %s.\n", len(data.DataPoints), endpoint) + cmdLog.LogPrintDate("Syncing %d entries with HASSIO from %s.\n", len(data.Map), endpoint) for _, o := range data.Order { - entries := data.DataPoints[o] + entries := data.Map[o] r := entries.GetEntry(api.LastEntry) // Gets the last entry if !r.Point.Valid { fmt.Printf("\nInvalid: %v\n", r) @@ -398,11 +398,11 @@ func (ca *Cmds) Update(endpoint string, data api.DataMap, newDay bool) error { FullId: fullId, // string(r.FullId), // WAS r.Point.FullId // FullName: r.Point.Name, Units: r.Point.Unit, - ValueName: r.Point.Name, + ValueName: r.Point.Description, // ValueName: r.Id, DeviceClass: "", - StateClass: r.Point.TimeSpan, - Value: r.Value, + StateClass: r.Point.UpdateFreq, + Value: r.Value.String(), // Icon: "", // ValueTemplate: "", diff --git a/iSolarCloud/AppService/getDeviceList/data.go b/iSolarCloud/AppService/getDeviceList/data.go index 194ca8e97..331c29506 100644 --- a/iSolarCloud/AppService/getDeviceList/data.go +++ b/iSolarCloud/AppService/getDeviceList/data.go @@ -3,8 +3,8 @@ package getDeviceList import ( "GoSungrow/iSolarCloud/api" "GoSungrow/iSolarCloud/api/apiReflect" - "GoSungrow/iSolarCloud/api/valueTypes" "GoSungrow/iSolarCloud/api/output" + "GoSungrow/iSolarCloud/api/valueTypes" "fmt" "github.com/MickMake/GoUnify/Only" ) @@ -27,50 +27,50 @@ func (rd RequestData) Help() string { type ResultData struct { PageList []struct { - AttrID valueTypes.Integer `json:"attr_id"` - ChannelId valueTypes.Integer `json:"chnnl_id" PointId:"channel_id"` - CommandStatus valueTypes.Integer `json:"command_status"` - ConnectState valueTypes.Integer `json:"connect_state"` - DataFlag valueTypes.Integer `json:"data_flag"` - DataFlagDetail valueTypes.Integer `json:"data_flag_detail"` - DevFaultStatus string `json:"dev_fault_status"` - DevStatus string `json:"dev_status"` - DeviceArea string `json:"device_area"` - DeviceCode valueTypes.Integer `json:"device_code"` + AttrID valueTypes.Integer `json:"attr_id"` + ChannelId valueTypes.Integer `json:"chnnl_id" PointId:"channel_id"` + CommandStatus valueTypes.Integer `json:"command_status"` + ConnectState valueTypes.Integer `json:"connect_state"` + DataFlag valueTypes.Integer `json:"data_flag"` + DataFlagDetail valueTypes.Integer `json:"data_flag_detail"` + DevFaultStatus valueTypes.Integer `json:"dev_fault_status"` + DevStatus valueTypes.Integer `json:"dev_status"` + DeviceArea valueTypes.Integer `json:"device_area"` + DeviceCode valueTypes.Integer `json:"device_code"` DeviceFactoryDate valueTypes.DateTime `json:"device_factory_date"` - DeviceID valueTypes.Integer `json:"device_id"` - DeviceModel valueTypes.String `json:"device_model"` - DeviceModelCode valueTypes.String `json:"device_model_code"` - DeviceModelID valueTypes.Integer `json:"device_model_id"` - DeviceName valueTypes.String `json:"device_name"` - DeviceProSn valueTypes.String `json:"device_pro_sn"` - DeviceState string `json:"device_state"` - DeviceSubType interface{} `json:"device_sub_type"` - DeviceSubTypeName interface{} `json:"device_sub_type_name"` - DeviceType valueTypes.Integer `json:"device_type"` - FactoryName valueTypes.String `json:"factory_name"` - InstallerDevFaultStatus string `json:"installer_dev_fault_status"` - InverterModelType valueTypes.Integer `json:"inverter_model_type"` - IsCountryCheck valueTypes.Bool `json:"is_country_check"` - IsHasFunctionEnum valueTypes.Bool `json:"is_has_function_enum"` - IsHasTheAbility valueTypes.Bool `json:"is_has_the_ability"` - IsInit valueTypes.Bool `json:"is_init"` - IsReadSet valueTypes.Bool `json:"is_read_set"` - IsReplacing valueTypes.Bool `json:"is_replacing"` - IsReset valueTypes.Bool `json:"is_reset"` - IsSecond valueTypes.Bool `json:"is_second"` - IsThirdParty valueTypes.Bool `json:"is_third_party"` - ModuleUUID valueTypes.Integer `json:"module_uuid"` - OwnerDevFaultStatus string `json:"owner_dev_fault_status"` - P24 interface{} `json:"p24"` - Posx interface{} `json:"posx"` - Posy interface{} `json:"posy"` - PsID valueTypes.Integer `json:"ps_id"` - PsKey valueTypes.PsKey `json:"ps_key"` - RelState valueTypes.Integer `json:"rel_state"` - Sn valueTypes.String `json:"sn" PointName:"Serial Number"` - TypeName valueTypes.String `json:"type_name"` - UUID valueTypes.Integer `json:"uuid"` + DeviceID valueTypes.Integer `json:"device_id"` + DeviceModel valueTypes.String `json:"device_model"` + DeviceModelCode valueTypes.String `json:"device_model_code"` + DeviceModelID valueTypes.Integer `json:"device_model_id"` + DeviceName valueTypes.String `json:"device_name"` + DeviceProSn valueTypes.String `json:"device_pro_sn"` + DeviceState valueTypes.Integer `json:"device_state"` + DeviceSubType interface{} `json:"device_sub_type"` + DeviceSubTypeName interface{} `json:"device_sub_type_name"` + DeviceType valueTypes.Integer `json:"device_type"` + FactoryName valueTypes.String `json:"factory_name"` + InstallerDevFaultStatus valueTypes.Integer `json:"installer_dev_fault_status"` + InverterModelType valueTypes.Integer `json:"inverter_model_type"` + IsCountryCheck valueTypes.Bool `json:"is_country_check"` + IsHasFunctionEnum valueTypes.Bool `json:"is_has_function_enum"` + IsHasTheAbility valueTypes.Bool `json:"is_has_the_ability"` + IsInit valueTypes.Bool `json:"is_init"` + IsReadSet valueTypes.Bool `json:"is_read_set"` + IsReplacing valueTypes.Bool `json:"is_replacing"` + IsReset valueTypes.Bool `json:"is_reset"` + IsSecond valueTypes.Bool `json:"is_second"` + IsThirdParty valueTypes.Bool `json:"is_third_party"` + ModuleUUID valueTypes.Integer `json:"module_uuid"` + OwnerDevFaultStatus valueTypes.Integer `json:"owner_dev_fault_status"` + P24 interface{} `json:"p24"` + Posx interface{} `json:"posx"` + Posy interface{} `json:"posy"` + PsID valueTypes.Integer `json:"ps_id"` + PsKey valueTypes.PsKey `json:"ps_key"` + RelState valueTypes.Integer `json:"rel_state"` + Sn valueTypes.String `json:"sn" PointName:"Serial Number"` + TypeName valueTypes.String `json:"type_name"` + UUID valueTypes.Integer `json:"uuid"` } `json:"pageList"` RowCount valueTypes.Integer `json:"rowCount"` } @@ -86,25 +86,6 @@ func (e *ResultData) IsValid() error { return err } -//type DecodeResultData ResultData -// -//func (e *ResultData) UnmarshalJSON(data []byte) error { -// var err error -// -// for range Only.Once { -// if len(data) == 0 { -// break -// } -// var pd DecodeResultData -// -// // Store ResultData -// _ = json.Unmarshal(data, &pd) -// e.Dummy = pd.Dummy -// } -// -// return err -//} - type Device struct { Vendor valueTypes.String PsId valueTypes.Integer @@ -117,8 +98,8 @@ type Device struct { ChannelId valueTypes.Integer DeviceModelID valueTypes.Integer TypeName valueTypes.String - DeviceState string - DevStatus string + DeviceState valueTypes.Integer + DevStatus valueTypes.Integer Uuid valueTypes.Integer } type Devices []Device @@ -284,7 +265,7 @@ func (e *EndPoint) GetData() api.DataMap { for range Only.Once { pkg := apiReflect.GetName("", *e) for _, d := range e.Response.ResultData.PageList { - name := fmt.Sprintf("%s.%s", pkg, d.PsKey.Value()) + name := api.JoinWithDots(0, valueTypes.DateTimeLayoutDay, pkg, d.PsKey) entries.StructToPoints(d, name, e.Request.PsId.String(), valueTypes.NewDateTime("")) } } diff --git a/iSolarCloud/AppService/getHouseholdStoragePsReport/data.go b/iSolarCloud/AppService/getHouseholdStoragePsReport/data.go index 755b497ab..68e391e7d 100644 --- a/iSolarCloud/AppService/getHouseholdStoragePsReport/data.go +++ b/iSolarCloud/AppService/getHouseholdStoragePsReport/data.go @@ -46,42 +46,42 @@ type DayData struct { JthdMapVirgin valueTypes.UnitValue `json:"jthd_map_virgin" PointIgnore:"true"` JtydMap valueTypes.UnitValue `json:"jtyd_map"` JtydMapVirgin valueTypes.UnitValue `json:"jtyd_map_virgin" PointIgnore:"true"` - P83072Map valueTypes.UnitValue `json:"p83072_map" PointId:"p83072" PointValueType:"" PointTimeSpan:"PointTimeSpanDaily"` + P83072Map valueTypes.UnitValue `json:"p83072_map" PointId:"p83072" PointValueType:"" PointUpdateFreq:"UpdateFreqDaily"` P83072MapVirgin valueTypes.UnitValue `json:"p83072_map_virgin" PointIgnore:"true"` - P83077Map valueTypes.UnitValue `json:"p83077_map" PointId:"p83077" PointValueType:"" PointTimeSpan:"PointTimeSpanDaily"` + P83077Map valueTypes.UnitValue `json:"p83077_map" PointId:"p83077" PointValueType:"" PointUpdateFreq:"UpdateFreqDaily"` P83077MapVirgin valueTypes.UnitValue `json:"p83077_map_virgin" PointIgnore:"true"` - P83088Map valueTypes.UnitValue `json:"p83088_map" PointId:"p83088" PointValueType:"" PointTimeSpan:"PointTimeSpanDaily"` + P83088Map valueTypes.UnitValue `json:"p83088_map" PointId:"p83088" PointValueType:"" PointUpdateFreq:"UpdateFreqDaily"` P83088MapVirgin valueTypes.UnitValue `json:"p83088_map_virgin" PointIgnore:"true"` - P83089Map valueTypes.UnitValue `json:"p83089_map" PointId:"p83089" PointValueType:"" PointTimeSpan:"PointTimeSpanDaily"` + P83089Map valueTypes.UnitValue `json:"p83089_map" PointId:"p83089" PointValueType:"" PointUpdateFreq:"UpdateFreqDaily"` P83089MapVirgin valueTypes.UnitValue `json:"p83089_map_virgin" PointIgnore:"true"` - P83097Map valueTypes.UnitValue `json:"p83097_map" PointId:"p83097" PointValueType:"" PointTimeSpan:"PointTimeSpanDaily"` + P83097Map valueTypes.UnitValue `json:"p83097_map" PointId:"p83097" PointValueType:"" PointUpdateFreq:"UpdateFreqDaily"` P83097MapVirgin valueTypes.UnitValue `json:"p83097_map_virgin" PointIgnore:"true"` - P83102Map valueTypes.UnitValue `json:"p83102_map" PointId:"p83102" PointValueType:"" PointTimeSpan:"PointTimeSpanDaily"` + P83102Map valueTypes.UnitValue `json:"p83102_map" PointId:"p83102" PointValueType:"" PointUpdateFreq:"UpdateFreqDaily"` P83102MapVirgin valueTypes.UnitValue `json:"p83102_map_virgin" PointIgnore:"true"` - P83118Map valueTypes.UnitValue `json:"p83118_map" PointId:"p83118" PointValueType:"" PointTimeSpan:"PointTimeSpanDaily"` + P83118Map valueTypes.UnitValue `json:"p83118_map" PointId:"p83118" PointValueType:"" PointUpdateFreq:"UpdateFreqDaily"` P83118MapVirgin valueTypes.UnitValue `json:"p83118_map_virgin" PointIgnore:"true"` - P83119Map valueTypes.UnitValue `json:"p83119_map" PointId:"p83119" PointValueType:"" PointTimeSpan:"PointTimeSpanDaily"` + P83119Map valueTypes.UnitValue `json:"p83119_map" PointId:"p83119" PointValueType:"" PointUpdateFreq:"UpdateFreqDaily"` P83119MapVirgin valueTypes.UnitValue `json:"p83119_map_virgin" PointIgnore:"true"` - P83120Map valueTypes.UnitValue `json:"p83120_map" PointId:"p83120" PointValueType:"" PointTimeSpan:"PointTimeSpanDaily"` + P83120Map valueTypes.UnitValue `json:"p83120_map" PointId:"p83120" PointValueType:"" PointUpdateFreq:"UpdateFreqDaily"` P83120MapVirgin valueTypes.UnitValue `json:"p83120_map_virgin" PointIgnore:"true"` - P83121 valueTypes.Float `json:"p83121" PointId:"p83121" PointUnitFrom:"FOO" PointTimeSpan:"PointTimeSpanDaily"` - P83122 valueTypes.Float `json:"p83122" PointId:"p83122" PointUnitFrom:"FOO" PointTimeSpan:"PointTimeSpanDaily"` + P83121 valueTypes.Float `json:"p83121" PointId:"p83121" PointUnitFrom:"FOO" PointUpdateFreq:"UpdateFreqDaily"` + P83122 valueTypes.Float `json:"p83122" PointId:"p83122" PointUnitFrom:"FOO" PointUpdateFreq:"UpdateFreqDaily"` PointData15List []struct { - P83076 valueTypes.Float `json:"p83076" PointId:"p83076" PointUnitFrom:"p83076_unit" PointTimeSpan:"PointTimeSpanDaily"` + P83076 valueTypes.Float `json:"p83076" PointId:"p83076" PointUnitFrom:"p83076_unit" PointUpdateFreq:"UpdateFreqDaily"` P83076Unit valueTypes.String `json:"p83076_unit"` - P83080 valueTypes.Float `json:"p83080" PointId:"p83080" PointUnitFrom:"p83080_unit" PointTimeSpan:"PointTimeSpanDaily"` + P83080 valueTypes.Float `json:"p83080" PointId:"p83080" PointUnitFrom:"p83080_unit" PointUpdateFreq:"UpdateFreqDaily"` P83080Unit valueTypes.String `json:"p83080_unit"` - P83086 valueTypes.Float `json:"p83086" PointId:"p83086" PointUnitFrom:"p83086_unit" PointTimeSpan:"PointTimeSpanDaily"` + P83086 valueTypes.Float `json:"p83086" PointId:"p83086" PointUnitFrom:"p83086_unit" PointUpdateFreq:"UpdateFreqDaily"` P83086Unit valueTypes.String `json:"p83086_unit"` - P83087 valueTypes.Float `json:"p83087" PointId:"p83087" PointUnitFrom:"p83087_unit" PointTimeSpan:"PointTimeSpanDaily"` + P83087 valueTypes.Float `json:"p83087" PointId:"p83087" PointUnitFrom:"p83087_unit" PointUpdateFreq:"UpdateFreqDaily"` P83087Unit valueTypes.String `json:"p83087_unit"` - P83096 valueTypes.Float `json:"p83096" PointId:"p83096" PointUnitFrom:"p83096_unit" PointTimeSpan:"PointTimeSpanDaily"` + P83096 valueTypes.Float `json:"p83096" PointId:"p83096" PointUnitFrom:"p83096_unit" PointUpdateFreq:"UpdateFreqDaily"` P83096Unit valueTypes.String `json:"p83096_unit"` - P83101 valueTypes.Float `json:"p83101" PointId:"p83101" PointUnitFrom:"p83101_unit" PointTimeSpan:"PointTimeSpanDaily"` + P83101 valueTypes.Float `json:"p83101" PointId:"p83101" PointUnitFrom:"p83101_unit" PointUpdateFreq:"UpdateFreqDaily"` P83101Unit valueTypes.String `json:"p83101_unit"` - P83106 valueTypes.Float `json:"p83106" PointId:"p83106" PointUnitFrom:"p83106_unit" PointTimeSpan:"PointTimeSpanDaily"` + P83106 valueTypes.Float `json:"p83106" PointId:"p83106" PointUnitFrom:"p83106_unit" PointUpdateFreq:"UpdateFreqDaily"` P83106Unit valueTypes.String `json:"p83106_unit"` - P83128 valueTypes.Float `json:"p83128" PointId:"p83128" PointUnitFrom:"p83128_unit" PointTimeSpan:"PointTimeSpanDaily"` + P83128 valueTypes.Float `json:"p83128" PointId:"p83128" PointUnitFrom:"p83128_unit" PointUpdateFreq:"UpdateFreqDaily"` P83128Unit valueTypes.String `json:"p83128_unit"` TimeStamp valueTypes.DateTime `json:"time_stamp"` Zfzy valueTypes.Float `json:"zfzy" PointUnitFrom:"zfzy_unit"` @@ -104,51 +104,51 @@ type MonthData struct { JthdUnit valueTypes.String `json:"jthd_unit"` Jtyd valueTypes.Float `json:"jtyd" PointUnitFrom:"jtyd_unit"` JtydUnit valueTypes.String `json:"jtyd_unit"` - P83022 valueTypes.Float `json:"p83022" PointId:"p83022" PointTimeSpan:"PointTimeSpanMonthly"` - P83072 valueTypes.Float `json:"p83072" PointId:"p83072" PointUnitFrom:"p83072_unit" PointTimeSpan:"PointTimeSpanMonthly"` + P83022 valueTypes.Float `json:"p83022" PointId:"p83022" PointUpdateFreq:"UpdateFreqMonthly"` + P83072 valueTypes.Float `json:"p83072" PointId:"p83072" PointUnitFrom:"p83072_unit" PointUpdateFreq:"UpdateFreqMonthly"` P83072Unit valueTypes.String `json:"p83072_unit"` - P83077 valueTypes.Float `json:"p83077" PointId:"p83077" PointUnitFrom:"p83077_unit" PointTimeSpan:"PointTimeSpanMonthly"` + P83077 valueTypes.Float `json:"p83077" PointId:"p83077" PointUnitFrom:"p83077_unit" PointUpdateFreq:"UpdateFreqMonthly"` P83077Unit valueTypes.String `json:"p83077_unit"` - P83088 valueTypes.Float `json:"p83088" PointId:"p83088" PointUnitFrom:"p83088_unit" PointTimeSpan:"PointTimeSpanMonthly"` + P83088 valueTypes.Float `json:"p83088" PointId:"p83088" PointUnitFrom:"p83088_unit" PointUpdateFreq:"UpdateFreqMonthly"` P83088Unit valueTypes.String `json:"p83088_unit"` - P83089 valueTypes.Float `json:"p83089" PointId:"p83089" PointUnitFrom:"p83089_unit" PointTimeSpan:"PointTimeSpanMonthly"` + P83089 valueTypes.Float `json:"p83089" PointId:"p83089" PointUnitFrom:"p83089_unit" PointUpdateFreq:"UpdateFreqMonthly"` P83089Unit valueTypes.String `json:"p83089_unit"` - P83097 valueTypes.Float `json:"p83097" PointId:"p83097" PointUnitFrom:"p83097_unit" PointTimeSpan:"PointTimeSpanMonthly"` + P83097 valueTypes.Float `json:"p83097" PointId:"p83097" PointUnitFrom:"p83097_unit" PointUpdateFreq:"UpdateFreqMonthly"` P83097Unit valueTypes.String `json:"p83097_unit"` - P83102 valueTypes.Float `json:"p83102" PointId:"p83102" PointUnitFrom:"p83102_unit" PointTimeSpan:"PointTimeSpanMonthly"` + P83102 valueTypes.Float `json:"p83102" PointId:"p83102" PointUnitFrom:"p83102_unit" PointUpdateFreq:"UpdateFreqMonthly"` P83102Unit valueTypes.String `json:"p83102_unit"` - P83118 valueTypes.Float `json:"p83118" PointId:"p83118" PointUnitFrom:"p83118_unit" PointTimeSpan:"PointTimeSpanMonthly"` + P83118 valueTypes.Float `json:"p83118" PointId:"p83118" PointUnitFrom:"p83118_unit" PointUpdateFreq:"UpdateFreqMonthly"` P83118Unit valueTypes.String `json:"p83118_unit"` - P83119 valueTypes.Float `json:"p83119" PointId:"p83119" PointUnitFrom:"p83119_unit" PointTimeSpan:"PointTimeSpanMonthly"` + P83119 valueTypes.Float `json:"p83119" PointId:"p83119" PointUnitFrom:"p83119_unit" PointUpdateFreq:"UpdateFreqMonthly"` P83119Unit valueTypes.String `json:"p83119_unit"` - P83120 valueTypes.Float `json:"p83120" PointId:"p83120" PointTimeSpan:"PointTimeSpanMonthly"` - P83121 valueTypes.Float `json:"p83121" PointId:"p83121" PointTimeSpan:"PointTimeSpanMonthly"` - P83122 valueTypes.Float `json:"p83122" PointId:"p83122" PointTimeSpan:"PointTimeSpanMonthly"` + P83120 valueTypes.Float `json:"p83120" PointId:"p83120" PointUpdateFreq:"UpdateFreqMonthly"` + P83121 valueTypes.Float `json:"p83121" PointId:"p83121" PointUpdateFreq:"UpdateFreqMonthly"` + P83122 valueTypes.Float `json:"p83122" PointId:"p83122" PointUpdateFreq:"UpdateFreqMonthly"` PsID valueTypes.Integer `json:"ps_id"` SelfConsumptionYield valueTypes.Float `json:"self_consumption_yield" PointUnitFrom:"self_consumption_yield_unit"` SelfConsumptionYieldUnit valueTypes.String `json:"self_consumption_yield_unit"` TimeStamp valueTypes.DateTime `json:"time_stamp"` } `json:"month_data_day_list"` - P83073Map valueTypes.UnitValue `json:"p83073_map" PointId:"p83073" PointValueType:"" PointTimeSpan:"PointTimeSpanMonthly"` + P83073Map valueTypes.UnitValue `json:"p83073_map" PointId:"p83073" PointValueType:"" PointUpdateFreq:"UpdateFreqMonthly"` P83073MapVirgin valueTypes.UnitValue `json:"p83073_map_virgin" PointIgnore:"true"` - P83078Map valueTypes.UnitValue `json:"p83078_map" PointId:"p83078" PointValueType:"" PointTimeSpan:"PointTimeSpanMonthly"` + P83078Map valueTypes.UnitValue `json:"p83078_map" PointId:"p83078" PointValueType:"" PointUpdateFreq:"UpdateFreqMonthly"` P83078MapVirgin valueTypes.UnitValue `json:"p83078_map_virgin" PointIgnore:"true"` - P83088Map valueTypes.UnitValue `json:"p83088_map" PointId:"p83088" PointValueType:"" PointTimeSpan:"PointTimeSpanMonthly"` + P83088Map valueTypes.UnitValue `json:"p83088_map" PointId:"p83088" PointValueType:"" PointUpdateFreq:"UpdateFreqMonthly"` P83088MapVirgin valueTypes.UnitValue `json:"p83088_map_virgin" PointIgnore:"true"` - P83091Map valueTypes.UnitValue `json:"p83091_map" PointId:"p83091" PointValueType:"" PointTimeSpan:"PointTimeSpanMonthly"` + P83091Map valueTypes.UnitValue `json:"p83091_map" PointId:"p83091" PointValueType:"" PointUpdateFreq:"UpdateFreqMonthly"` P83091MapVirgin valueTypes.UnitValue `json:"p83091_map_virgin" PointIgnore:"true"` - P83097Map valueTypes.UnitValue `json:"p83097_map" PointId:"p83097" PointValueType:"" PointTimeSpan:"PointTimeSpanMonthly"` + P83097Map valueTypes.UnitValue `json:"p83097_map" PointId:"p83097" PointValueType:"" PointUpdateFreq:"UpdateFreqMonthly"` P83097MapVirgin valueTypes.UnitValue `json:"p83097_map_virgin" PointIgnore:"true"` - P83103Map valueTypes.UnitValue `json:"p83103_map" PointId:"p83103" PointValueType:"" PointTimeSpan:"PointTimeSpanMonthly"` + P83103Map valueTypes.UnitValue `json:"p83103_map" PointId:"p83103" PointValueType:"" PointUpdateFreq:"UpdateFreqMonthly"` P83103MapVirgin valueTypes.UnitValue `json:"p83103_map_virgin" PointIgnore:"true"` - P83118Map valueTypes.UnitValue `json:"p83118_map" PointId:"p83118" PointValueType:"" PointTimeSpan:"PointTimeSpanMonthly"` + P83118Map valueTypes.UnitValue `json:"p83118_map" PointId:"p83118" PointValueType:"" PointUpdateFreq:"UpdateFreqMonthly"` P83118MapVirgin valueTypes.UnitValue `json:"p83118_map_virgin" PointIgnore:"true"` - P83119Map valueTypes.UnitValue `json:"p83119_map" PointId:"p83119" PointValueType:"" PointTimeSpan:"PointTimeSpanMonthly"` + P83119Map valueTypes.UnitValue `json:"p83119_map" PointId:"p83119" PointValueType:"" PointUpdateFreq:"UpdateFreqMonthly"` P83119MapVirgin valueTypes.UnitValue `json:"p83119_map_virgin" PointIgnore:"true"` - P83120Map valueTypes.UnitValue `json:"p83120_map" PointId:"p83120" PointValueType:"" PointTimeSpan:"PointTimeSpanMonthly"` + P83120Map valueTypes.UnitValue `json:"p83120_map" PointId:"p83120" PointValueType:"" PointUpdateFreq:"UpdateFreqMonthly"` P83120MapVirgin valueTypes.UnitValue `json:"p83120_map_virgin" PointIgnore:"true"` - P83121 valueTypes.Float `json:"p83121" PointId:"p83121" PointUnitFrom:"FOO" PointTimeSpan:"PointTimeSpanMonthly"` - P83122 valueTypes.Float `json:"p83122" PointId:"p83122" PointUnitFrom:"FOO" PointTimeSpan:"PointTimeSpanMonthly"` + P83121 valueTypes.Float `json:"p83121" PointId:"p83121" PointUnitFrom:"FOO" PointUpdateFreq:"UpdateFreqMonthly"` + P83122 valueTypes.Float `json:"p83122" PointId:"p83122" PointUnitFrom:"FOO" PointUpdateFreq:"UpdateFreqMonthly"` ZfzyMap valueTypes.UnitValue `json:"zfzy_map"` ZfzyMapVirgin valueTypes.UnitValue `json:"zfzy_map_virgin" PointIgnore:"true"` ZjzzMap valueTypes.UnitValue `json:"zjzz_map"` @@ -160,52 +160,52 @@ type YearData struct { JthdMapVirgin valueTypes.UnitValue `json:"jthd_map_virgin" PointIgnore:"true"` JtydMap valueTypes.UnitValue `json:"jtyd_map"` JtydMapVirgin valueTypes.UnitValue `json:"jtyd_map_virgin" PointIgnore:"true"` - P83074 valueTypes.UnitValue `json:"p83074_map" PointId:"p83074" PointValueType:"" PointTimeSpan:"PointTimeSpanYearly"` + P83074 valueTypes.UnitValue `json:"p83074_map" PointId:"p83074" PointValueType:"" PointUpdateFreq:"UpdateFreqYearly"` P83074MapVirgin valueTypes.UnitValue `json:"p83074_map_virgin" PointIgnore:"true"` - P83079 valueTypes.UnitValue `json:"p83079_map" PointId:"p83079" PointValueType:"" PointTimeSpan:"PointTimeSpanYearly"` + P83079 valueTypes.UnitValue `json:"p83079_map" PointId:"p83079" PointValueType:"" PointUpdateFreq:"UpdateFreqYearly"` P83079MapVirgin valueTypes.UnitValue `json:"p83079_map_virgin" PointIgnore:"true"` - P83088 valueTypes.UnitValue `json:"p83088_map" PointId:"p83088" PointValueType:"" PointTimeSpan:"PointTimeSpanYearly"` + P83088 valueTypes.UnitValue `json:"p83088_map" PointId:"p83088" PointValueType:"" PointUpdateFreq:"UpdateFreqYearly"` P83088MapVirgin valueTypes.UnitValue `json:"p83088_map_virgin" PointIgnore:"true"` - P83093 valueTypes.UnitValue `json:"p83093_map" PointId:"p83093" PointValueType:"" PointTimeSpan:"PointTimeSpanYearly"` + P83093 valueTypes.UnitValue `json:"p83093_map" PointId:"p83093" PointValueType:"" PointUpdateFreq:"UpdateFreqYearly"` P83093MapVirgin valueTypes.UnitValue `json:"p83093_map_virgin" PointIgnore:"true"` - P83097 valueTypes.UnitValue `json:"p83097_map" PointId:"p83097" PointValueType:"" PointTimeSpan:"PointTimeSpanYearly"` + P83097 valueTypes.UnitValue `json:"p83097_map" PointId:"p83097" PointValueType:"" PointUpdateFreq:"UpdateFreqYearly"` P83097MapVirgin valueTypes.UnitValue `json:"p83097_map_virgin" PointIgnore:"true"` - P83104 valueTypes.UnitValue `json:"p83104_map" PointId:"p83104" PointValueType:"" PointTimeSpan:"PointTimeSpanYearly"` + P83104 valueTypes.UnitValue `json:"p83104_map" PointId:"p83104" PointValueType:"" PointUpdateFreq:"UpdateFreqYearly"` P83104MapVirgin valueTypes.UnitValue `json:"p83104_map_virgin" PointIgnore:"true"` - P83118 valueTypes.UnitValue `json:"p83118_map" PointId:"p83118" PointValueType:"" PointTimeSpan:"PointTimeSpanYearly"` + P83118 valueTypes.UnitValue `json:"p83118_map" PointId:"p83118" PointValueType:"" PointUpdateFreq:"UpdateFreqYearly"` P83118MapVirgin valueTypes.UnitValue `json:"p83118_map_virgin" PointIgnore:"true"` - P83119 valueTypes.UnitValue `json:"p83119_map" PointId:"p83119" PointValueType:"" PointTimeSpan:"PointTimeSpanYearly"` + P83119 valueTypes.UnitValue `json:"p83119_map" PointId:"p83119" PointValueType:"" PointUpdateFreq:"UpdateFreqYearly"` P83119MapVirgin valueTypes.UnitValue `json:"p83119_map_virgin" PointIgnore:"true"` - P83120 valueTypes.UnitValue `json:"p83120_map" PointId:"p83120" PointValueType:"" PointTimeSpan:"PointTimeSpanYearly"` + P83120 valueTypes.UnitValue `json:"p83120_map" PointId:"p83120" PointValueType:"" PointUpdateFreq:"UpdateFreqYearly"` P83120MapVirgin valueTypes.UnitValue `json:"p83120_map_virgin" PointIgnore:"true"` - P83121 valueTypes.Float `json:"p83121" PointId:"p83121" PointUnitFrom:"FOO" PointTimeSpan:"PointTimeSpanYearly"` - P83122 valueTypes.Float `json:"p83122" PointId:"p83122" PointUnitFrom:"FOO" PointTimeSpan:"PointTimeSpanYearly"` + P83121 valueTypes.Float `json:"p83121" PointId:"p83121" PointUnitFrom:"FOO" PointUpdateFreq:"UpdateFreqYearly"` + P83122 valueTypes.Float `json:"p83122" PointId:"p83122" PointUnitFrom:"FOO" PointUpdateFreq:"UpdateFreqYearly"` YearDataMonthList []struct { DateID valueTypes.Integer `json:"date_id"` Jthd valueTypes.Float `json:"jthd" PointUnitFrom:"jthd_unit"` JthdUnit valueTypes.String `json:"jthd_unit"` Jtyd valueTypes.Float `json:"jtyd" PointUnitFrom:"jtyd_unit"` JtydUnit valueTypes.String `json:"jtyd_unit"` - P83037 valueTypes.Float `json:"p83037" PointId:"p83037" PointTimeSpan:"PointTimeSpanYearly"` - P83073 valueTypes.Float `json:"p83073" PointId:"p83073" PointUnitFrom:"p83073_unit" PointTimeSpan:"PointTimeSpanYearly"` + P83037 valueTypes.Float `json:"p83037" PointId:"p83037" PointUpdateFreq:"UpdateFreqYearly"` + P83073 valueTypes.Float `json:"p83073" PointId:"p83073" PointUnitFrom:"p83073_unit" PointUpdateFreq:"UpdateFreqYearly"` P83073Unit valueTypes.String `json:"p83073_unit"` - P83078 valueTypes.Float `json:"p83078" PointId:"p83078" PointUnitFrom:"p83078_unit" PointTimeSpan:"PointTimeSpanYearly"` + P83078 valueTypes.Float `json:"p83078" PointId:"p83078" PointUnitFrom:"p83078_unit" PointUpdateFreq:"UpdateFreqYearly"` P83078Unit valueTypes.String `json:"p83078_unit"` - P83088 valueTypes.Float `json:"p83088" PointId:"p83088" PointUnitFrom:"p83088_unit" PointTimeSpan:"PointTimeSpanYearly"` + P83088 valueTypes.Float `json:"p83088" PointId:"p83088" PointUnitFrom:"p83088_unit" PointUpdateFreq:"UpdateFreqYearly"` P83088Unit valueTypes.String `json:"p83088_unit"` - P83091 valueTypes.Float `json:"p83091" PointId:"p83091" PointUnitFrom:"p83091_unit" PointTimeSpan:"PointTimeSpanYearly"` + P83091 valueTypes.Float `json:"p83091" PointId:"p83091" PointUnitFrom:"p83091_unit" PointUpdateFreq:"UpdateFreqYearly"` P83091Unit valueTypes.String `json:"p83091_unit"` - P83098 valueTypes.Float `json:"p83098" PointId:"p83098" PointUnitFrom:"p83098_unit" PointTimeSpan:"PointTimeSpanYearly"` + P83098 valueTypes.Float `json:"p83098" PointId:"p83098" PointUnitFrom:"p83098_unit" PointUpdateFreq:"UpdateFreqYearly"` P83098Unit valueTypes.String `json:"p83098_unit"` - P83103 valueTypes.Float `json:"p83103" PointId:"p83103" PointUnitFrom:"p83103_unit" PointTimeSpan:"PointTimeSpanYearly"` + P83103 valueTypes.Float `json:"p83103" PointId:"p83103" PointUnitFrom:"p83103_unit" PointUpdateFreq:"UpdateFreqYearly"` P83103Unit valueTypes.String `json:"p83103_unit"` - P83118 valueTypes.Float `json:"p83118" PointId:"p83118" PointUnitFrom:"p83118_unit" PointTimeSpan:"PointTimeSpanYearly"` + P83118 valueTypes.Float `json:"p83118" PointId:"p83118" PointUnitFrom:"p83118_unit" PointUpdateFreq:"UpdateFreqYearly"` P83118Unit valueTypes.String `json:"p83118_unit"` - P83119 valueTypes.Float `json:"p83119" PointId:"p83119" PointUnitFrom:"p83119_unit" PointTimeSpan:"PointTimeSpanYearly"` + P83119 valueTypes.Float `json:"p83119" PointId:"p83119" PointUnitFrom:"p83119_unit" PointUpdateFreq:"UpdateFreqYearly"` P83119Unit valueTypes.String `json:"p83119_unit"` - P83120 valueTypes.Float `json:"p83120" PointId:"p83120" PointTimeSpan:"PointTimeSpanYearly"` - P83121 valueTypes.Float `json:"p83121" PointId:"p83121" PointTimeSpan:"PointTimeSpanYearly"` - P83122 valueTypes.Float `json:"p83122" PointId:"p83122" PointTimeSpan:"PointTimeSpanYearly"` + P83120 valueTypes.Float `json:"p83120" PointId:"p83120" PointUpdateFreq:"UpdateFreqYearly"` + P83121 valueTypes.Float `json:"p83121" PointId:"p83121" PointUpdateFreq:"UpdateFreqYearly"` + P83122 valueTypes.Float `json:"p83122" PointId:"p83122" PointUpdateFreq:"UpdateFreqYearly"` PsID valueTypes.Integer `json:"ps_id"` SelfConsumptionYield valueTypes.Float `json:"self_consumption_yield" PointUnitFrom:"self_consumption_yield_unit"` SelfConsumptionYieldUnit valueTypes.String `json:"self_consumption_yield_unit"` @@ -222,23 +222,23 @@ type TotalData struct { JthdMapVirgin valueTypes.UnitValue `json:"jthd_map_virgin" PointIgnore:"true"` JtydMap valueTypes.UnitValue `json:"jtyd_map"` JtydMapVirgin valueTypes.UnitValue `json:"jtyd_map_virgin" PointIgnore:"true"` - P83075 valueTypes.UnitValue `json:"p83075_map" PointId:"p83075" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + P83075 valueTypes.UnitValue `json:"p83075_map" PointId:"p83075" PointValueType:"" PointUpdateFreq:"UpdateFreqTotal"` P83075MapVirgin valueTypes.UnitValue `json:"p83075_map_virgin" PointIgnore:"true"` - P83094 valueTypes.UnitValue `json:"p83094_map" PointId:"p83094" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + P83094 valueTypes.UnitValue `json:"p83094_map" PointId:"p83094" PointValueType:"" PointUpdateFreq:"UpdateFreqTotal"` P83094MapVirgin valueTypes.UnitValue `json:"p83094_map_virgin" PointIgnore:"true"` - P83095 valueTypes.UnitValue `json:"p83095_map" PointId:"p83095" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + P83095 valueTypes.UnitValue `json:"p83095_map" PointId:"p83095" PointValueType:"" PointUpdateFreq:"UpdateFreqTotal"` P83095MapVirgin valueTypes.UnitValue `json:"p83095_map_virgin" PointIgnore:"true"` - P83105 valueTypes.UnitValue `json:"p83105_map" PointId:"p83105" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + P83105 valueTypes.UnitValue `json:"p83105_map" PointId:"p83105" PointValueType:"" PointUpdateFreq:"UpdateFreqTotal"` P83105MapVirgin valueTypes.UnitValue `json:"p83105_map_virgin" PointIgnore:"true"` - P83107 valueTypes.UnitValue `json:"p83107_map" PointId:"p83107" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + P83107 valueTypes.UnitValue `json:"p83107_map" PointId:"p83107" PointValueType:"" PointUpdateFreq:"UpdateFreqTotal"` P83107MapVirgin valueTypes.UnitValue `json:"p83107_map_virgin" PointIgnore:"true"` - P83123 valueTypes.UnitValue `json:"p83123_map" PointId:"p83123" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + P83123 valueTypes.UnitValue `json:"p83123_map" PointId:"p83123" PointValueType:"" PointUpdateFreq:"UpdateFreqTotal"` P83123MapVirgin valueTypes.UnitValue `json:"p83123_map_virgin" PointIgnore:"true"` - P83124 valueTypes.UnitValue `json:"p83124_map" PointId:"p83124" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + P83124 valueTypes.UnitValue `json:"p83124_map" PointId:"p83124" PointValueType:"" PointUpdateFreq:"UpdateFreqTotal"` P83124MapVirgin valueTypes.UnitValue `json:"p83124_map_virgin" PointIgnore:"true"` - P83125 valueTypes.Float `json:"p83125" PointId:"p83125" PointUnitFrom:"FOO" PointTimeSpan:"PointTimeSpanTotal"` - P83126 valueTypes.Float `json:"p83126" PointId:"p83126" PointUnitFrom:"FOO" PointTimeSpan:"PointTimeSpanTotal"` - P83127 valueTypes.UnitValue `json:"p83127_map" PointId:"p83127" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + P83125 valueTypes.Float `json:"p83125" PointId:"p83125" PointUnitFrom:"FOO" PointUpdateFreq:"UpdateFreqTotal"` + P83126 valueTypes.Float `json:"p83126" PointId:"p83126" PointUnitFrom:"FOO" PointUpdateFreq:"UpdateFreqTotal"` + P83127 valueTypes.UnitValue `json:"p83127_map" PointId:"p83127" PointValueType:"" PointUpdateFreq:"UpdateFreqTotal"` P83127MapVirgin valueTypes.UnitValue `json:"p83127_map_virgin" PointIgnore:"true"` TotalDataYearList []struct { DateID valueTypes.Integer `json:"date_id"` @@ -246,26 +246,26 @@ type TotalData struct { JthdUnit valueTypes.String `json:"jthd_unit"` Jtyd valueTypes.Float `json:"jtyd" PointUnitFrom:"jtyd_unit"` JtydUnit valueTypes.String `json:"jtyd_unit"` - P83038 valueTypes.Float `json:"p83038" PointId:"p83038" PointTimeSpan:"PointTimeSpanTotal"` - P83074 valueTypes.Float `json:"p83074" PointId:"p83074" PointUnitFrom:"p83074_unit" PointTimeSpan:"PointTimeSpanTotal"` + P83038 valueTypes.Float `json:"p83038" PointId:"p83038" PointUpdateFreq:"UpdateFreqTotal"` + P83074 valueTypes.Float `json:"p83074" PointId:"p83074" PointUnitFrom:"p83074_unit" PointUpdateFreq:"UpdateFreqTotal"` P83074Unit valueTypes.String `json:"p83074_unit"` - P83079 valueTypes.Float `json:"p83079" PointId:"p83079" PointUnitFrom:"p83079_unit" PointTimeSpan:"PointTimeSpanTotal"` + P83079 valueTypes.Float `json:"p83079" PointId:"p83079" PointUnitFrom:"p83079_unit" PointUpdateFreq:"UpdateFreqTotal"` P83079Unit valueTypes.String `json:"p83079_unit"` - P83088 valueTypes.Float `json:"p83088" PointId:"p83088" PointUnitFrom:"p83088_unit" PointTimeSpan:"PointTimeSpanTotal"` + P83088 valueTypes.Float `json:"p83088" PointId:"p83088" PointUnitFrom:"p83088_unit" PointUpdateFreq:"UpdateFreqTotal"` P83088Unit valueTypes.String `json:"p83088_unit"` - P83093 valueTypes.Float `json:"p83093" PointId:"p83093" PointUnitFrom:"p83093_unit" PointTimeSpan:"PointTimeSpanTotal"` + P83093 valueTypes.Float `json:"p83093" PointId:"p83093" PointUnitFrom:"p83093_unit" PointUpdateFreq:"UpdateFreqTotal"` P83093Unit valueTypes.String `json:"p83093_unit"` - P83099 valueTypes.Float `json:"p83099" PointId:"p83099" PointUnitFrom:"p83099_unit" PointTimeSpan:"PointTimeSpanTotal"` + P83099 valueTypes.Float `json:"p83099" PointId:"p83099" PointUnitFrom:"p83099_unit" PointUpdateFreq:"UpdateFreqTotal"` P83099Unit valueTypes.String `json:"p83099_unit"` - P83104 valueTypes.Float `json:"p83104" PointId:"p83104" PointUnitFrom:"p83104_unit" PointTimeSpan:"PointTimeSpanTotal"` + P83104 valueTypes.Float `json:"p83104" PointId:"p83104" PointUnitFrom:"p83104_unit" PointUpdateFreq:"UpdateFreqTotal"` P83104Unit valueTypes.String `json:"p83104_unit"` - P83118 valueTypes.Float `json:"p83118" PointId:"p83118" PointUnitFrom:"p83118_unit" PointTimeSpan:"PointTimeSpanTotal"` + P83118 valueTypes.Float `json:"p83118" PointId:"p83118" PointUnitFrom:"p83118_unit" PointUpdateFreq:"UpdateFreqTotal"` P83118Unit valueTypes.String `json:"p83118_unit"` - P83119 valueTypes.Float `json:"p83119" PointId:"p83119" PointUnitFrom:"p83119_unit" PointTimeSpan:"PointTimeSpanTotal"` + P83119 valueTypes.Float `json:"p83119" PointId:"p83119" PointUnitFrom:"p83119_unit" PointUpdateFreq:"UpdateFreqTotal"` P83119Unit valueTypes.String `json:"p83119_unit"` - P83120 valueTypes.Float `json:"p83120" PointId:"p83120" PointTimeSpan:"PointTimeSpanTotal"` - P83121 valueTypes.Float `json:"p83121" PointId:"p83121" PointTimeSpan:"PointTimeSpanTotal"` - P83122 valueTypes.Float `json:"p83122" PointId:"p83122" PointTimeSpan:"PointTimeSpanTotal"` + P83120 valueTypes.Float `json:"p83120" PointId:"p83120" PointUpdateFreq:"UpdateFreqTotal"` + P83121 valueTypes.Float `json:"p83121" PointId:"p83121" PointUpdateFreq:"UpdateFreqTotal"` + P83122 valueTypes.Float `json:"p83122" PointId:"p83122" PointUpdateFreq:"UpdateFreqTotal"` PsID valueTypes.Integer `json:"ps_id"` SelfConsumptionYield valueTypes.Float `json:"self_consumption_yield" PointUnitFrom:"self_consumption_yield_unit"` SelfConsumptionYieldUnit valueTypes.String `json:"self_consumption_yield_unit"` diff --git a/iSolarCloud/AppService/getPowerDevicePointInfo/data.go b/iSolarCloud/AppService/getPowerDevicePointInfo/data.go index 56eeee354..c5b497033 100644 --- a/iSolarCloud/AppService/getPowerDevicePointInfo/data.go +++ b/iSolarCloud/AppService/getPowerDevicePointInfo/data.go @@ -29,13 +29,13 @@ func (rd RequestData) Help() string { type ResultData struct { - DeviceType valueTypes.Integer `json:"device_type" PointId:"device_type" PointValueType:"" PointTimeSpan:""` - ID valueTypes.Integer `json:"id" PointId:"id" PointValueType:"" PointTimeSpan:""` - Period valueTypes.Integer `json:"period" PointId:"period" PointValueType:"" PointTimeSpan:""` - PointID valueTypes.Integer `json:"point_id" PointId:"point_id" PointValueType:"" PointTimeSpan:""` - PointName string `json:"point_name" PointId:"point_name" PointValueType:"" PointTimeSpan:""` - ShowPointName string `json:"show_point_name" PointId:"show_point_name" PointValueType:"" PointTimeSpan:""` - TranslationID valueTypes.Integer `json:"translation_id" PointId:"translation_id" PointValueType:"" PointTimeSpan:""` + DeviceType valueTypes.Integer `json:"device_type" PointId:"device_type" PointValueType:"" PointUpdateFreq:""` + ID valueTypes.Integer `json:"id" PointId:"id" PointValueType:"" PointUpdateFreq:""` + Period valueTypes.Integer `json:"period" PointId:"period" PointValueType:"" PointUpdateFreq:""` + PointID valueTypes.Integer `json:"point_id" PointId:"point_id" PointValueType:"" PointUpdateFreq:""` + PointName string `json:"point_name" PointId:"point_name" PointValueType:"" PointUpdateFreq:""` + ShowPointName string `json:"show_point_name" PointId:"show_point_name" PointValueType:"" PointUpdateFreq:""` + TranslationID valueTypes.Integer `json:"translation_id" PointId:"translation_id" PointValueType:"" PointUpdateFreq:""` } func (e *ResultData) IsValid() error { diff --git a/iSolarCloud/AppService/getPsDetail/data.go b/iSolarCloud/AppService/getPsDetail/data.go index 50a5927c2..306c29cb2 100644 --- a/iSolarCloud/AppService/getPsDetail/data.go +++ b/iSolarCloud/AppService/getPsDetail/data.go @@ -25,30 +25,30 @@ func (rd RequestData) Help() string { } type ResultData struct { - ActualEnergy []valueTypes.Float `json:"actual_energy" PointUnitFrom:"actual_energy_unit"` - ActualEnergyUnit valueTypes.String `json:"actual_energy_unit" PointId:"actual_energy_unit"` + ActualEnergy []valueTypes.Float `json:"actual_energy" PointId:"actual_energy" PointName:"Actual Energy" PointUnitFrom:"ActualEnergyUnit"` + ActualEnergyUnit valueTypes.String `json:"actual_energy_unit" PointId:"actual_energy_unit" PointIgnore:"true"` AlarmCount valueTypes.Integer `json:"alarm_count"` - AreaID interface{} `json:"area_id"` + AreaID interface{} `json:"area_id"` AreaType valueTypes.Integer `json:"area_type"` BuildDate valueTypes.DateTime `json:"build_date"` Co2Reduce valueTypes.UnitValue `json:"co2_reduce"` - Co2ReduceTotal valueTypes.UnitValue `json:"co2_reduce_total" PointId:"co2_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + Co2ReduceTotal valueTypes.UnitValue `json:"co2_reduce_total" PointId:"co2_reduce_total" PointUpdateFreq:"UpdateFreqTotal"` CoalReduce valueTypes.UnitValue `json:"coal_reduce"` - CoalReduceTotal valueTypes.UnitValue `json:"coal_reduce_total" PointId:"coal_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` - ConnectGrid string `json:"connect_grid"` + CoalReduceTotal valueTypes.UnitValue `json:"coal_reduce_total" PointId:"coal_reduce_total" PointUpdateFreq:"UpdateFreqTotal"` + ConnectGrid string `json:"connect_grid"` ConnectType valueTypes.Integer `json:"connect_type"` ContactPerson valueTypes.String `json:"contact_person"` CurrPower valueTypes.UnitValue `json:"curr_power"` // Pv Power DataLastUpdateTime valueTypes.DateTime `json:"data_last_update_time"` - DayEqHours string `json:"day_eq_hours"` - Description interface{} `json:"description"` + DayEqHours valueTypes.Float `json:"day_eq_hours" PointUnit:"h" PointUpdateFreq:"UpdateFreqDaily"` + Description interface{} `json:"description"` DesignCapacity valueTypes.UnitValue `json:"design_capacity"` DesignCapacityBattery valueTypes.UnitValue `json:"design_capacity_battery"` DiagramURL valueTypes.String `json:"diagram_url"` - EnergyScheme interface{} `json:"energy_scheme"` + EnergyScheme interface{} `json:"energy_scheme"` ExpectInstallDate valueTypes.DateTime `json:"expect_install_date"` FaultCount valueTypes.Integer `json:"fault_count"` - FaultSendType string `json:"fault_send_type"` + FaultSendType string `json:"fault_send_type"` GcjLatitude valueTypes.Float `json:"gcj_latitude"` GcjLongitude valueTypes.Float `json:"gcj_longitude"` GprsLatitude valueTypes.Float `json:"gprs_latitude"` @@ -61,10 +61,10 @@ type ResultData struct { PicType valueTypes.Integer `json:"pic_type"` PictureName valueTypes.String `json:"picture_name"` PictureURL valueTypes.String `json:"picture_url"` - PsUnitUUID interface{} `json:"ps_unit_uuid"` - } `json:"images"` + PsUnitUUID interface{} `json:"ps_unit_uuid" PointName:"Images"` + } `json:"images" PointName:"Images"` InstallDate valueTypes.DateTime `json:"install_date"` - InstallerPsFaultStatus string `json:"installer_ps_fault_status"` + InstallerPsFaultStatus valueTypes.Integer `json:"installer_ps_fault_status"` IsHaveEsInverter valueTypes.Bool `json:"is_have_es_inverter"` IsTransformSystem valueTypes.Bool `json:"is_transform_system"` IsTuv valueTypes.Bool `json:"is_tuv"` @@ -73,32 +73,32 @@ type ResultData struct { MapLatitude valueTypes.Float `json:"map_latitude"` MapLongitude valueTypes.Float `json:"map_longitude"` MeterReduce valueTypes.UnitValue `json:"meter_reduce"` - MeterReduceTotal valueTypes.UnitValue `json:"meter_reduce_total" PointId:"meter_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + MeterReduceTotal valueTypes.UnitValue `json:"meter_reduce_total" PointId:"meter_reduce_total" PointUpdateFreq:"UpdateFreqTotal"` MobileTel valueTypes.String `json:"mibile_tel" PointId:"mobile_tel"` - MonthPr string `json:"monthPr" PointId:"monthPr" PointValueType:"" PointTimeSpan:"PointTimeSpanMonth"` - MonthEnergy valueTypes.UnitValue `json:"month_energy" PointId:"month_energy" PointValueType:"" PointTimeSpan:"PointTimeSpanMonth"` + MonthPr string `json:"monthPr" PointId:"monthPr" PointUpdateFreq:"UpdateFreqMonth"` + MonthEnergy valueTypes.UnitValue `json:"month_energy" PointId:"month_energy" PointUpdateFreq:"UpdateFreqMonth"` MonthEnergyVirgin valueTypes.UnitValue `json:"month_energy_virgin" PointIgnore:"true"` - MonthEqHours valueTypes.Float `json:"month_eq_hours" PointId:"month_eq_hours" PointValueType:"" PointTimeSpan:"PointTimeSpanMonth"` - MonthIncome valueTypes.UnitValue `json:"month_income" PointId:"month_income" PointValueType:"" PointTimeSpan:"PointTimeSpanMonth"` + MonthEqHours valueTypes.Float `json:"month_eq_hours" PointId:"month_eq_hours" PointUnit:"h" PointUpdateFreq:"UpdateFreqMonth"` + MonthIncome valueTypes.UnitValue `json:"month_income" PointId:"month_income" PointUpdateFreq:"UpdateFreqMonth"` NoxReduce valueTypes.UnitValue `json:"nox_reduce"` - NoxReduceTotal valueTypes.UnitValue `json:"nox_reduce_total" PointId:"nox_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` - OperateYear string `json:"operate_year"` + NoxReduceTotal valueTypes.UnitValue `json:"nox_reduce_total" PointId:"nox_reduce_total" PointUpdateFreq:"UpdateFreqTotal"` + OperateYear string `json:"operate_year"` OperationBusName valueTypes.String `json:"operation_bus_name"` - OwnerPsFaultStatus string `json:"owner_ps_fault_status"` - P83012Value valueTypes.Float `json:"p83012_value" PointId:"p83012" PointUnitFrom:"p83012_unit"` - P83012Unit valueTypes.String `json:"p83012_unit" PointId:"p83012_unit"` - P83013Value valueTypes.Float `json:"p83013_value" PointId:"p83013" PointUnitFrom:"p83013_unit"` - P83013Unit valueTypes.String `json:"p83013_unit" PointId:"p83013_unit"` - P83036Value valueTypes.Float `json:"p83036_value" PointId:"p83036" PointUnitFrom:"p83036_unit"` - P83036Unit valueTypes.String `json:"p83036_unit" PointId:"p83036_unit"` - P83016 valueTypes.Float `json:"p83016" PointId:"p83016" PointUnitFrom:"p83016_unit"` - P83016Unit valueTypes.String `json:"p83016_unit" PointId:"p83016_unit"` - P83017 valueTypes.Float `json:"p83017" PointId:"p83017" PointUnitFrom:"p83017_unit"` - P83017Unit valueTypes.String `json:"p83017_unit" PointId:"p83017_unit"` + OwnerPsFaultStatus valueTypes.Integer `json:"owner_ps_fault_status"` + P83012Value valueTypes.Float `json:"p83012_value" PointId:"p83012" PointUnitFrom:"P83012Unit"` + P83012Unit valueTypes.String `json:"p83012_unit" PointId:"p83012_unit" PointIgnore:"true"` + P83013Value valueTypes.Float `json:"p83013_value" PointId:"p83013" PointUnitFrom:"P83013Unit"` + P83013Unit valueTypes.String `json:"p83013_unit" PointId:"p83013_unit" PointIgnore:"true"` + P83036Value valueTypes.Float `json:"p83036_value" PointId:"p83036" PointUnitFrom:"P83036Unit"` + P83036Unit valueTypes.String `json:"p83036_unit" PointId:"p83036_unit" PointIgnore:"true"` + P83016 valueTypes.Float `json:"p83016" PointId:"p83016" PointUnitFrom:"P83016Unit"` + P83016Unit valueTypes.String `json:"p83016_unit" PointId:"p83016_unit" PointIgnore:"true"` + P83017 valueTypes.Float `json:"p83017" PointId:"p83017" PointUnitFrom:"P83017Unit"` + P83017Unit valueTypes.String `json:"p83017_unit" PointId:"p83017_unit" PointIgnore:"true"` P83023 valueTypes.Float `json:"p83023" PointId:"p83023"` - P83023y string `json:"p83023y" PointId:"p83023y"` - P83023year string `json:"p83023year" PointId:"p83023y"` - P83023ym string `json:"p83023ym" PointId:"p83023ym"` + P83023y string `json:"p83023y" PointId:"p83023y"` + P83023year string `json:"p83023year" PointId:"p83023y"` + P83023ym string `json:"p83023ym" PointId:"p83023ym"` P83043 valueTypes.Float `json:"p83043" PointId:"p83043"` P83044 valueTypes.Float `json:"p83044" PointId:"p83044"` P83045 valueTypes.Float `json:"p83045" PointId:"p83045"` @@ -110,24 +110,24 @@ type ResultData struct { P83074MapVirgin valueTypes.UnitValue `json:"p83074_map_virgin" PointIgnore:"true"` P83075Map valueTypes.UnitValue `json:"p83075_map" PointId:"p83075"` P83075MapVirgin valueTypes.UnitValue `json:"p83075_map_virgin" PointIgnore:"true"` - P83076Map valueTypes.UnitValue `json:"p83076_map" PointId:"p83076"` // Pv Power - P83076MapVirgin valueTypes.UnitValue `json:"p83076_map_virgin" PointIgnore:"true"` // Pv Power - P83077Map valueTypes.UnitValue `json:"p83077_map" PointId:"p83077"` // Pv Energy - P83077MapVirgin valueTypes.UnitValue `json:"p83077_map_virgin" PointIgnore:"true"` // Pv Energy + P83076Map valueTypes.UnitValue `json:"p83076_map" PointName:"Pv Power" PointId:"p83076"` // Pv Power + P83076MapVirgin valueTypes.UnitValue `json:"p83076_map_virgin" PointIgnore:"true"` + P83077Map valueTypes.UnitValue `json:"p83077_map" PointName:"Pv Energy" PointId:"p83077"` // Pv Energy + P83077MapVirgin valueTypes.UnitValue `json:"p83077_map_virgin" PointIgnore:"true"` P83078Map valueTypes.UnitValue `json:"p83078_map" PointId:"p83078"` P83078MapVirgin valueTypes.UnitValue `json:"p83078_map_virgin" PointIgnore:"true"` P83079Map valueTypes.UnitValue `json:"p83079_map" PointId:"p83079"` P83079MapVirgin valueTypes.UnitValue `json:"p83079_map_virgin" PointIgnore:"true"` P83080Map valueTypes.UnitValue `json:"p83080_map" PointId:"p83080"` P83080MapVirgin valueTypes.UnitValue `json:"p83080_map_virgin" PointIgnore:"true"` - P83088Map valueTypes.UnitValue `json:"p83088_map" PointId:"p83088"` // Es Energy - P83088MapVirgin valueTypes.UnitValue `json:"p83088_map_virgin" PointIgnore:"true"` // Es Energy - P83089Map valueTypes.UnitValue `json:"p83089_map" PointId:"p83089"` // Es Discharge Energy - P83089MapVirgin valueTypes.UnitValue `json:"p83089_map_virgin" PointIgnore:"true"` // Es Discharge Energy + P83088Map valueTypes.UnitValue `json:"p83088_map" PointName:"ES Energy" PointId:"p83088"` // Es Energy + P83088MapVirgin valueTypes.UnitValue `json:"p83088_map_virgin" PointIgnore:"true"` + P83089Map valueTypes.UnitValue `json:"p83089_map" PointName:"ES Discharge Energy" PointId:"p83089"` // Es Discharge Energy + P83089MapVirgin valueTypes.UnitValue `json:"p83089_map_virgin" PointIgnore:"true"` P83094Map valueTypes.UnitValue `json:"p83094_map" PointId:"p83094"` P83094MapVirgin valueTypes.UnitValue `json:"p83094_map_virgin" PointIgnore:"true"` - P83095Map valueTypes.UnitValue `json:"p83095_map" PointId:"p83095" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` // Es Total Discharge Energy - P83095MapVirgin valueTypes.UnitValue `json:"p83095_map_virgin" PointIgnore:"true"` // Es Total Discharge Energy + P83095Map valueTypes.UnitValue `json:"p83095_map" PointId:"p83095" PointName:"ES Total Discharge Energy" PointUpdateFreq:"UpdateFreqTotal"` // Es Total Discharge Energy + P83095MapVirgin valueTypes.UnitValue `json:"p83095_map_virgin" PointIgnore:"true"` P83097Map valueTypes.UnitValue `json:"p83097_map" PointId:"p83097"` P83097MapVirgin valueTypes.UnitValue `json:"p83097_map_virgin" PointIgnore:"true"` P83100Map valueTypes.UnitValue `json:"p83100_map" PointId:"p83100"` @@ -161,27 +161,27 @@ type ResultData struct { P83202Map valueTypes.UnitValue `json:"p83202_map" PointId:"p83202"` P83202MapVirgin valueTypes.UnitValue `json:"p83202_map_virgin" PointIgnore:"true"` PercentPlanYear valueTypes.Float `json:"percent_plan_year"` - PlanEnergy []valueTypes.Float `json:"plan_energy" PointUnitFrom:"plan_energy_unit"` - PlanEnergyUnit valueTypes.String `json:"plan_energy_unit" PointId:"plan_energy_unit"` + PlanEnergy []valueTypes.Float `json:"plan_energy" PointUnitFrom:"PlanEnergyUnit"` + PlanEnergyUnit valueTypes.String `json:"plan_energy_unit" PointId:"plan_energy_unit" PointIgnore:"true"` PlanEnergyYear valueTypes.UnitValue `json:"plan_energy_year"` PowderReduce valueTypes.UnitValue `json:"powder_reduce"` - PowderReduceTotal valueTypes.UnitValue `json:"powder_reduce_total" PointId:"powder_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` - PowerChargeSetted valueTypes.Bool `json:"power_charge_setted" PointId:"power_charge_setted" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` - Producer string `json:"producer"` + PowderReduceTotal valueTypes.UnitValue `json:"powder_reduce_total" PointId:"powder_reduce_total" PointUpdateFreq:"UpdateFreqTotal"` + PowerChargeSetted valueTypes.Bool `json:"power_charge_setted" PointId:"power_charge_set" PointUpdateFreq:"UpdateFreqTotal"` + Producer string `json:"producer"` PsCountryID valueTypes.Integer `json:"ps_country_id"` - PsFaultStatus string `json:"ps_fault_status"` - PsHealthStatus string `json:"ps_health_status"` + PsFaultStatus valueTypes.Integer `json:"ps_fault_status"` + PsHealthStatus valueTypes.Integer `json:"ps_health_status"` PsHolder valueTypes.String `json:"ps_holder"` PsLocation valueTypes.String `json:"ps_location"` PsName valueTypes.String `json:"ps_name"` PsShortName valueTypes.String `json:"ps_short_name"` - PsState string `json:"ps_state"` + PsState valueTypes.Integer `json:"ps_state"` PsType valueTypes.Integer `json:"ps_type"` PsTypeName valueTypes.String `json:"ps_type_name"` - PsWindLevel string `json:"ps_wind_level"` - PsWindPos string `json:"ps_wind_pos"` + PsWindLevel string `json:"ps_wind_level"` + PsWindPos string `json:"ps_wind_pos"` RecordCreateTime valueTypes.DateTime `json:"recore_create_time"` - ReportType string `json:"report_type"` + ReportType string `json:"report_type"` RobotNumSweepCapacity struct { Num valueTypes.Integer `json:"num"` SweepCapacity valueTypes.Float `json:"sweep_capacity"` @@ -191,7 +191,7 @@ type ResultData struct { ShippingAddress valueTypes.String `json:"shipping_address"` ShippingZipCode valueTypes.String `json:"shipping_zip_code"` So2Reduce valueTypes.UnitValue `json:"so2_reduce"` - So2ReduceTotal valueTypes.UnitValue `json:"so2_reduce_total" PointId:"so2_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + So2ReduceTotal valueTypes.UnitValue `json:"so2_reduce_total" PointId:"so2_reduce_total" PointUpdateFreq:"UpdateFreqTotal"` StorageInverterData []struct { CommunicationDevSn valueTypes.String `json:"communication_dev_sn"` DevFaultStatus valueTypes.Integer `json:"dev_fault_status"` @@ -199,55 +199,55 @@ type ResultData struct { DeviceCode valueTypes.Integer `json:"device_code"` DeviceModelCode valueTypes.String `json:"device_model_code"` DeviceName valueTypes.String `json:"device_name"` - DeviceState string `json:"device_state"` + DeviceState string `json:"device_state"` DeviceType valueTypes.Integer `json:"device_type"` DrmStatus valueTypes.Integer `json:"drm_status"` DrmStatusName valueTypes.String `json:"drm_status_name"` - EnergyFlow []valueTypes.Integer `json:"energy_flow"` + EnergyFlow []valueTypes.Integer `json:"energy_flow" PointName:"Energy Flow"` HasAmmeter valueTypes.Bool `json:"has_ammeter"` InstallerDevFaultStatus valueTypes.Integer `json:"installer_dev_fault_status"` InverterSn valueTypes.String `json:"inverter_sn"` OwnerDevFaultStatus valueTypes.Integer `json:"owner_dev_fault_status"` - P13003Map valueTypes.UnitValue `json:"p13003_map" PointId:"p13003" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` + P13003Map valueTypes.UnitValue `json:"p13003_map" PointId:"p13003" PointUpdateFreq:"UpdateFreqInstant"` P13003MapVirgin valueTypes.UnitValue `json:"p13003_map_virgin" PointIgnore:"true"` - P13011Map valueTypes.UnitValue `json:"p13011_map" PointId:"p13011" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` + P13011Map valueTypes.UnitValue `json:"p13011_map" PointId:"p13011" PointUpdateFreq:"UpdateFreqInstant"` P13011MapVirgin valueTypes.UnitValue `json:"p13011_map_virgin" PointIgnore:"true"` - P13115Map valueTypes.UnitValue `json:"p13115_map" PointId:"p13115" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` + P13115Map valueTypes.UnitValue `json:"p13115_map" PointId:"p13115" PointUpdateFreq:"UpdateFreqInstant"` P13115MapVirgin valueTypes.UnitValue `json:"p13115_map_virgin" PointIgnore:"true"` - P13119Map valueTypes.UnitValue `json:"p13119_map" PointId:"p13119" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` + P13119Map valueTypes.UnitValue `json:"p13119_map" PointId:"p13119" PointUpdateFreq:"UpdateFreqInstant"` P13119MapVirgin valueTypes.UnitValue `json:"p13119_map_virgin" PointIgnore:"true"` - P13121Map valueTypes.UnitValue `json:"p13121_map" PointId:"p13121" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` + P13121Map valueTypes.UnitValue `json:"p13121_map" PointId:"p13121" PointUpdateFreq:"UpdateFreqInstant"` P13121MapVirgin valueTypes.UnitValue `json:"p13121_map_virgin" PointIgnore:"true"` - P13126Map valueTypes.UnitValue `json:"p13126_map" PointId:"p13126" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` + P13126Map valueTypes.UnitValue `json:"p13126_map" PointId:"p13126" PointUpdateFreq:"UpdateFreqInstant"` P13126MapVirgin valueTypes.UnitValue `json:"p13126_map_virgin" PointIgnore:"true"` - P13141 valueTypes.Float `json:"p13141" PointId:"p13141" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` - P13142 valueTypes.Float `json:"p13142" PointId:"p13142" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` - P13149Map valueTypes.UnitValue `json:"p13149_map" PointId:"p13149" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` + P13141 valueTypes.Float `json:"p13141" PointId:"p13141" PointUpdateFreq:"UpdateFreqInstant"` + P13142 valueTypes.Float `json:"p13142" PointId:"p13142" PointUpdateFreq:"UpdateFreqInstant"` + P13149Map valueTypes.UnitValue `json:"p13149_map" PointId:"p13149" PointUpdateFreq:"UpdateFreqInstant"` P13149MapVirgin valueTypes.UnitValue `json:"p13149_map_virgin" PointIgnore:"true"` - P13150Map valueTypes.UnitValue `json:"p13150_map" PointId:"p13150" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` + P13150Map valueTypes.UnitValue `json:"p13150_map" PointId:"p13150" PointUpdateFreq:"UpdateFreqInstant"` P13150MapVirgin valueTypes.UnitValue `json:"p13150_map_virgin" PointIgnore:"true"` - P13155 valueTypes.Float `json:"p13155" PointId:"p13155" PointValueType:"" PointTimeSpan:"PointTimeSpanInstant"` + P13155 valueTypes.Float `json:"p13155" PointId:"p13155" PointUpdateFreq:"UpdateFreqInstant"` PsKey valueTypes.PsKey `json:"ps_key"` UpdateTime valueTypes.DateTime `json:"update_time"` UUID valueTypes.Integer `json:"uuid"` - } `json:"storage_inverter_data"` + } `json:"storage_inverter_data" PointNameFromChild:"PsKey"` SysScheme valueTypes.Integer `json:"sys_scheme"` TimeZoneID valueTypes.Integer `json:"time_zone_id"` Timezone valueTypes.String `json:"timezone"` - TodayEnergy valueTypes.UnitValue `json:"today_energy" PointId:"today_energy" PointValueType:"" PointTimeSpan:"PointTimeSpanDaily"` + TodayEnergy valueTypes.UnitValue `json:"today_energy" PointId:"today_energy" PointUpdateFreq:"UpdateFreqDaily"` TodayEnergyVirgin valueTypes.UnitValue `json:"today_energy_virgin" PointIgnore:"true"` - TodayIncome valueTypes.UnitValue `json:"today_income" PointId:"today_income" PointValueType:"" PointTimeSpan:"PointTimeSpanDaily"` - TotalEnergy valueTypes.UnitValue `json:"total_energy" PointId:"total_energy" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + TodayIncome valueTypes.UnitValue `json:"today_income" PointId:"today_income" PointUpdateFreq:"UpdateFreqDaily"` + TotalEnergy valueTypes.UnitValue `json:"total_energy" PointId:"total_energy" PointUpdateFreq:"UpdateFreqTotal"` TotalEnergyVirgin valueTypes.UnitValue `json:"total_energy_virgin" PointIgnore:"true"` - TotalEnergyYear valueTypes.UnitValue `json:"total_energy_year" PointId:"total_energy_year" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` - TotalIncome valueTypes.UnitValue `json:"total_income" PointId:"total_income" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + TotalEnergyYear valueTypes.UnitValue `json:"total_energy_year" PointId:"total_energy_year" PointUpdateFreq:"UpdateFreqTotal"` + TotalIncome valueTypes.UnitValue `json:"total_income" PointId:"total_income" PointUpdateFreq:"UpdateFreqTotal"` TreeReduce valueTypes.UnitValue `json:"tree_reduce"` - TreeReduceTotal valueTypes.UnitValue `json:"tree_reduce_total" PointId:"tree_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` - TuvLevel string `json:"tuv_level"` + TreeReduceTotal valueTypes.UnitValue `json:"tree_reduce_total" PointId:"tree_reduce_total" PointUpdateFreq:"UpdateFreqTotal"` + TuvLevel string `json:"tuv_level"` ValidFlag valueTypes.Bool `json:"valid_flag"` WaitAssignOrderCount valueTypes.Integer `json:"wait_assign_order_count"` WaterReduce valueTypes.UnitValue `json:"water_reduce"` - WaterReduceTotal valueTypes.UnitValue `json:"water_reduce_total" PointId:"water_reduce_total" PointValueType:"" PointTimeSpan:"PointTimeSpanTotal"` + WaterReduceTotal valueTypes.UnitValue `json:"water_reduce_total" PointId:"water_reduce_total" PointUpdateFreq:"UpdateFreqTotal"` WgsLatitude valueTypes.Float `json:"wgs_latitude"` WgsLongitude valueTypes.Float `json:"wgs_longitude"` Year valueTypes.Integer `json:"year"` @@ -269,64 +269,24 @@ func (e *ResultData) IsValid() error { return err } -// type DecodeResultData ResultData -// -// func (e *ResultData) UnmarshalJSON(data []byte) error { -// var err error -// -// for range Only.Once { -// if len(data) == 0 { -// break -// } -// var pd DecodeResultData -// -// // Store ResultData -// _ = json.Unmarshal(data, &pd) -// e.Dummy = pd.Dummy -// } -// -// 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.Request.PsId.String()) - entries.StructToPoints(e.Response.ResultData, name, e.Request.PsId.String(), valueTypes.NewDateTime("")) + dt := valueTypes.NewDateTime(valueTypes.Now) + entries.StructToPoints(e.Response.ResultData, pkg + "." + e.Request.PsId.String(), "", dt) - for _, sid := range e.Response.ResultData.StorageInverterData { - name = fmt.Sprintf("%s.%s", pkg, sid.PsKey.Value()) - entries.StructToPoints(sid, name, sid.PsKey.Value(), valueTypes.NewDateTime("")) - } + // pkg := apiReflect.GetName("", *e) + // name := api.JoinWithDots(0, valueTypes.DateTimeLayoutDay, pkg, e.Request.PsId) + // entries.StructToPoints(e.Response.ResultData, name, e.Request.PsId.String(), valueTypes.NewDateTime("")) + // + // for _, sid := range e.Response.ResultData.StorageInverterData { + // name = api.JoinWithDots(0, valueTypes.DateTimeLayoutDay, pkg, sid.PsKey) + // entries.StructToPoints(sid, name, sid.PsKey.Value(), valueTypes.NewDateTime("")) + // } } - // 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", "", "", valueTypes.NewDateTime(""), uv) - // // - // // uv = api.SetUnitValueFloat(e.Response.ResultData.P83013Value.Value(), e.Response.ResultData.P83013Unit.Value()) - // // entries.AddUnitValue(name + ".p83013", e.Request.PsId.String(), "p83013", "", "", valueTypes.NewDateTime(""), uv) - // // - // // uv = api.SetUnitValueFloat(e.Response.ResultData.P83036Value.Value(), e.Response.ResultData.P83036Unit.Value()) - // // entries.AddUnitValue(name + ".p83036", e.Request.PsId.String(), "p83036", "", "", valueTypes.NewDateTime(""), uv) - // // - // // uv = api.SetUnitValueFloat(e.Response.ResultData.P83016.Value(), e.Response.ResultData.P83016Unit.Value()) - // // entries.AddUnitValue(name + ".p83016", e.Request.PsId.String(), "p83016", "", "", valueTypes.NewDateTime(""), uv) - // // - // // uv = api.SetUnitValueFloat(e.Response.ResultData.P83017.Value(), e.Response.ResultData.P83017Unit.Value()) - // // entries.AddUnitValue(name + ".p83017", e.Request.PsId.String(), "p83017", "", "", valueTypes.NewDateTime(""), uv) - // // - // // entries.StructToPoints(e.Response.ResultData, name, e.Request.PsId.String(), valueTypes.NewDateTime("")) - // // - // // for _, sid := range e.Response.ResultData.StorageInverterData { - // // entries.StructToPoints(sid, name + ".StorageInverterData." + sid.PsKey.Value(), sid.PsKey.Value(), valueTypes.NewDateTime("")) - // // } - // } - return entries } diff --git a/iSolarCloud/AppService/getPsDetailWithPsType/data.go b/iSolarCloud/AppService/getPsDetailWithPsType/data.go index 52fbbab02..2c71603c2 100644 --- a/iSolarCloud/AppService/getPsDetailWithPsType/data.go +++ b/iSolarCloud/AppService/getPsDetailWithPsType/data.go @@ -26,116 +26,116 @@ func (rd RequestData) Help() string { } type ResultData struct { - BatteryLevelPercent valueTypes.Integer `json:"battery_level_percent" PointId:"BatteryLevelPercent" PointUnit:"%" PointTimeSpan:"PointTimeSpanInstant"` - ChargingDischargingPowerMap valueTypes.UnitValue `json:"charging_discharging_power_map" PointId:"ChargingDischargingPowerMap" PointTimeSpan:"PointTimeSpanInstant"` - Co2ReduceTotal valueTypes.UnitValue `json:"co2_reduce_total" PointId:"Co2ReduceTotal" PointTimeSpan:"PointTimeSpanTotal"` - CoalReduceTotal valueTypes.UnitValue `json:"coal_reduce_total" PointId:"CoalReduceTotal" PointTimeSpan:"PointTimeSpanTotal"` - ConnectType string `json:"connect_type" PointId:"ConnectType" PointTimeSpan:"PointTimeSpanBoot"` - CurrPower valueTypes.UnitValue `json:"curr_power" PointId:"CurrPower" PointTimeSpan:"PointTimeSpanInstant"` - DesignCapacity valueTypes.UnitValue `json:"design_capacity" PointId:"DesignCapacity" PointTimeSpan:"PointTimeSpanBoot"` - EnergyScheme interface{} `json:"energy_scheme"` - GcjLatitude valueTypes.Float `json:"gcj_latitude" PointId:"GcjLatitude" PointTimeSpan:"PointTimeSpanBoot"` - GcjLongitude valueTypes.Float `json:"gcj_longitude" PointId:"GcjLongitude" PointTimeSpan:"PointTimeSpanBoot"` - HasAmmeter valueTypes.Bool `json:"has_ammeter" PointId:"HasAmmeter" PointTimeSpan:"PointTimeSpanBoot"` - HouseholdInverterData interface{} `json:"household_inverter_data"` - InstallerPsFaultStatus string `json:"installer_ps_fault_status" PointId:"InstallerPsFaultStatus" PointTimeSpan:"PointTimeSpanBoot"` - IsHaveEsInverter valueTypes.Bool `json:"is_have_es_inverter" PointId:"IsHaveEsInverter" PointTimeSpan:"PointTimeSpanBoot"` - IsSingleInverter valueTypes.Bool `json:"is_single_inverter" PointId:"IsSingleInverter" PointTimeSpan:"PointTimeSpanBoot"` - IsTransformSystem valueTypes.Bool `json:"is_transform_system" PointId:"IsTransformSystem" PointTimeSpan:"PointTimeSpanBoot"` - Latitude valueTypes.Float `json:"latitude" PointId:"Latitude" PointTimeSpan:"PointTimeSpanBoot"` - LoadPowerMap valueTypes.UnitValue `json:"load_power_map" PointId:"LoadPowerMap" PointTimeSpan:"PointTimeSpanInstant"` + BatteryLevelPercent valueTypes.Integer `json:"battery_level_percent" PointId:"battery_level_percent" PointUnit:"%" PointUpdateFreq:"UpdateFreqInstant"` + ChargingDischargingPowerMap valueTypes.UnitValue `json:"charging_discharging_power_map" PointId:"charging_discharging_power_map" PointUpdateFreq:"UpdateFreqInstant"` // Holds the battery charge/discharge amount + Co2ReduceTotal valueTypes.UnitValue `json:"co2_reduce_total" PointId:"co2_reduce_total" PointUpdateFreq:"UpdateFreqTotal"` + CoalReduceTotal valueTypes.UnitValue `json:"coal_reduce_total" PointId:"coal_reduce_total" PointUpdateFreq:"UpdateFreqTotal"` + ConnectType valueTypes.Integer `json:"connect_type" PointId:"connect_type" PointUpdateFreq:"UpdateFreqBoot"` + CurrPower valueTypes.UnitValue `json:"curr_power" PointId:"curr_power" PointUpdateFreq:"UpdateFreqInstant"` + DesignCapacity valueTypes.UnitValue `json:"design_capacity" PointId:"design_capacity" PointUpdateFreq:"UpdateFreqBoot"` + EnergyScheme interface{} `json:"energy_scheme" PointId:"energy_scheme"` + GcjLatitude valueTypes.Float `json:"gcj_latitude" PointId:"gcj_latitude" PointUpdateFreq:"UpdateFreqBoot"` + GcjLongitude valueTypes.Float `json:"gcj_longitude" PointId:"gcj_longitude" PointUpdateFreq:"UpdateFreqBoot"` + HasAmmeter valueTypes.Bool `json:"has_ammeter" PointId:"has_ammeter" PointUpdateFreq:"UpdateFreqBoot"` + HouseholdInverterData interface{} `json:"household_inverter_data" PointId:"household_inverter_data"` + InstallerPsFaultStatus valueTypes.Integer `json:"installer_ps_fault_status" PointId:"installer_ps_fault_status" PointUpdateFreq:"UpdateFreqInstant"` + IsHaveEsInverter valueTypes.Bool `json:"is_have_es_inverter" PointId:"is_have_es_inverter" PointUpdateFreq:"UpdateFreqBoot"` + IsSingleInverter valueTypes.Bool `json:"is_single_inverter" PointId:"is_single_inverter" PointUpdateFreq:"UpdateFreqBoot"` + IsTransformSystem valueTypes.Bool `json:"is_transform_system" PointId:"is_transform_system" PointUpdateFreq:"UpdateFreqBoot"` + Latitude valueTypes.Float `json:"latitude" PointId:"latitude" PointUpdateFreq:"UpdateFreqBoot"` + LoadPowerMap valueTypes.UnitValue `json:"load_power_map" PointId:"load_power_map" PointUpdateFreq:"UpdateFreqInstant"` LoadPowerMapVirgin valueTypes.UnitValue `json:"load_power_map_virgin" PointIgnore:"true"` - Longitude valueTypes.Float `json:"longitude" PointId:"Longitude" PointTimeSpan:"PointTimeSpanBoot"` - MapLatitude valueTypes.Float `json:"map_latitude" PointId:"MapLatitude" PointTimeSpan:"PointTimeSpanBoot"` - MapLongitude valueTypes.Float `json:"map_longitude" PointId:"MapLongitude" PointTimeSpan:"PointTimeSpanBoot"` - MeterReduceTotal valueTypes.UnitValue `json:"meter_reduce_total" PointId:"MeterReduceTotal" PointTimeSpan:"PointTimeSpanTotal"` - MobileTel valueTypes.String `json:"moble_tel" PointId:"MobleTel" PointTimeSpan:"PointTimeSpanBoot"` - MonthEnergy valueTypes.UnitValue `json:"month_energy" PointId:"MonthEnergy" PointTimeSpan:"PointTimeSpanMonthly"` + Longitude valueTypes.Float `json:"longitude" PointId:"longitude" PointUpdateFreq:"UpdateFreqBoot"` + MapLatitude valueTypes.Float `json:"map_latitude" PointId:"map_latitude" PointUpdateFreq:"UpdateFreqBoot"` + MapLongitude valueTypes.Float `json:"map_longitude" PointId:"map_longitude" PointUpdateFreq:"UpdateFreqBoot"` + MeterReduceTotal valueTypes.UnitValue `json:"meter_reduce_total" PointId:"meter_reduce_total" PointUpdateFreq:"UpdateFreqTotal"` + MobileTel valueTypes.String `json:"moble_tel" PointId:"mobile_tel" PointUpdateFreq:"UpdateFreqBoot"` + MonthEnergy valueTypes.UnitValue `json:"month_energy" PointId:"month_energy" PointUpdateFreq:"UpdateFreqMonthly"` MonthEnergyVirgin valueTypes.UnitValue `json:"month_energy_virgin" PointIgnore:"true"` - MonthIncome valueTypes.UnitValue `json:"month_income" PointId:"MonthIncome" PointTimeSpan:"PointTimeSpanMonthly"` - NegativeLoadMsg interface{} `json:"negative_load_msg"` - OwnerPsFaultStatus string `json:"owner_ps_fault_status" PointId:"OwnerPsFaultStatus" PointTimeSpan:"PointTimeSpanBoot"` - P83081Map valueTypes.UnitValue `json:"p83081_map" PointId:"p83081" PointTimeSpan:"PointTimeSpanInstant"` + MonthIncome valueTypes.UnitValue `json:"month_income" PointId:"month_income" PointUpdateFreq:"UpdateFreqMonthly"` + NegativeLoadMsg interface{} `json:"negative_load_msg" PointId:"negative_load_msg"` + OwnerPsFaultStatus valueTypes.Integer `json:"owner_ps_fault_status" PointId:"owner_ps_fault_status" PointUpdateFreq:"UpdateFreqInstant"` + P83081Map valueTypes.UnitValue `json:"p83081_map" PointId:"p83081" PointName:"Load Power" PointUpdateFreq:"UpdateFreq5Mins"` P83081MapVirgin valueTypes.UnitValue `json:"p83081_map_virgin" PointIgnore:"true"` - P83102Map valueTypes.UnitValue `json:"p83102_map" PointId:"p83102" PointTimeSpan:"PointTimeSpanInstant"` + P83102Map valueTypes.UnitValue `json:"p83102_map" PointId:"p83102" PointName:"Energy Purchased" PointUpdateFreq:"UpdateFreq5Mins"` P83102MapVirgin valueTypes.UnitValue `json:"p83102_map_virgin" PointIgnore:"true"` - P83102Percent valueTypes.Float `json:"p83102_percent" PointId:"p83102" PointUnit:"%" PointTimeSpan:"PointTimeSpanInstant"` - P83118Map valueTypes.UnitValue `json:"p83118_map" PointId:"p83118" PointTimeSpan:"PointTimeSpanInstant"` + P83102Percent valueTypes.Float `json:"p83102_percent" PointId:"p83102_percent" PointName:"Energy Purchased Percent" PointUnit:"%" PointUpdateFreq:"UpdateFreq5Mins"` + P83118Map valueTypes.UnitValue `json:"p83118_map" PointId:"p83118" PointName:"Energy Used" PointUpdateFreq:"UpdateFreq5Mins"` P83118MapVirgin valueTypes.UnitValue `json:"p83118_map_virgin" PointIgnore:"true"` - P83119Map valueTypes.UnitValue `json:"p83119_map" PointId:"p83119" PointTimeSpan:"PointTimeSpanInstant"` + P83119Map valueTypes.UnitValue `json:"p83119_map" PointId:"p83119" PointName:"Energy Feed-In" PointUpdateFreq:"UpdateFreq5Mins"` P83119MapVirgin valueTypes.UnitValue `json:"p83119_map_virgin" PointIgnore:"true"` - P83120Map valueTypes.UnitValue `json:"p83120_map" PointId:"p83120" PointTimeSpan:"PointTimeSpanInstant"` + P83120Map valueTypes.UnitValue `json:"p83120_map" PointId:"p83120" PointName:"Energy Battery Charge" PointUpdateFreq:"UpdateFreq5Mins"` P83120MapVirgin valueTypes.UnitValue `json:"p83120_map_virgin" PointIgnore:"true"` - P83122 valueTypes.Float `json:"p83122" PointId:"p83122" PointTimeSpan:"PointTimeSpanInstant"` - P83124Map valueTypes.UnitValue `json:"p83124_map" PointId:"p83124" PointTimeSpan:"PointTimeSpanInstant"` + P83122 valueTypes.Float `json:"p83122" PointId:"p83122" PointName:"Self Sufficiency Percent" PointUnit:"%" PointUpdateFreq:"UpdateFreq5Mins"` + P83124Map valueTypes.UnitValue `json:"p83124_map" PointId:"p83124" PointUpdateFreq:"UpdateFreq5Mins"` P83124MapVirgin valueTypes.UnitValue `json:"p83124_map_virgin" PointIgnore:"true"` - P83202Map valueTypes.UnitValue `json:"p83202_map" PointId:"p83202" PointTimeSpan:"PointTimeSpanInstant"` - P83202MapVirgin valueTypes.UnitValue `json:"p83202_map_virgin" PointIgnore:"true"` + P83202Map valueTypes.UnitValue `json:"p83202_map" PointId:"p83202" PointName:"Installed Power" PointUpdateFreq:"UpdateFreq5Mins"` + P83202MapVirgin valueTypes.UnitValue `json:"p83202_map_virgin" PointIgnore:"true"` P83532MapVirgin valueTypes.UnitValue `json:"p83532_map_virgin" PointIgnore:"true"` - PowerChargeSetted valueTypes.Integer `json:"power_charge_setted" PointId:"PowerChargeSetted" PointTimeSpan:"PointTimeSpanBoot"` - PowerGridPowerMap valueTypes.UnitValue `json:"power_grid_power_map" PointId:"PowerGridPowerMap" PointTimeSpan:"PointTimeSpanInstant"` + PowerChargeSetted valueTypes.Bool `json:"power_charge_setted" PointId:"power_charge_set" PointUpdateFreq:"UpdateFreqBoot"` + PowerGridPowerMap valueTypes.UnitValue `json:"power_grid_power_map" PointId:"power_grid_power_map" PointUpdateFreq:"UpdateFreq5Mins"` PowerGridPowerMapVirgin valueTypes.UnitValue `json:"power_grid_power_map_virgin" PointIgnore:"true"` - PsCountryID valueTypes.Integer `json:"ps_country_id" PointId:"PsCountryID" PointTimeSpan:"PointTimeSpanBoot"` - PsDeviceType valueTypes.Integer `json:"ps_device_type" PointId:"PsDeviceType" PointTimeSpan:"PointTimeSpanBoot"` - PsFaultStatus string `json:"ps_fault_status" PointId:"PsFaultStatus" PointTimeSpan:"PointTimeSpanBoot"` - PsHealthStatus string `json:"ps_health_status" PointId:"PsHealthStatus" PointTimeSpan:"PointTimeSpanBoot"` - PsLocation valueTypes.String `json:"ps_location" PointId:"PsLocation" PointTimeSpan:"PointTimeSpanBoot"` - PsName valueTypes.String `json:"ps_name" PointId:"PsName" PointTimeSpan:"PointTimeSpanBoot"` - PsPsKey valueTypes.PsKey `json:"ps_ps_key" PointId:"PsPsKey" PointTimeSpan:"PointTimeSpanBoot"` - PsState string `json:"ps_state" PointId:"PsState" PointTimeSpan:"PointTimeSpanBoot"` - PsType valueTypes.Integer `json:"ps_type" PointId:"PsType" PointTimeSpan:"PointTimeSpanBoot"` - PvPowerMap valueTypes.UnitValue `json:"pv_power_map" PointId:"PvPowerMap" PointTimeSpan:"PointTimeSpanInstant"` + PsCountryID valueTypes.Integer `json:"ps_country_id" PointId:"ps_country_id" PointUpdateFreq:"UpdateFreqBoot"` + PsDeviceType valueTypes.Integer `json:"ps_device_type" PointId:"ps_device_type" PointUpdateFreq:"UpdateFreqBoot"` + PsFaultStatus valueTypes.Integer `json:"ps_fault_status" PointId:"ps_fault_status" PointUpdateFreq:"UpdateFreqInstant"` + PsHealthStatus valueTypes.Integer `json:"ps_health_status" PointId:"ps_health_status" PointUpdateFreq:"UpdateFreqInstant"` + PsLocation valueTypes.String `json:"ps_location" PointId:"ps_location" PointUpdateFreq:"UpdateFreqBoot"` + PsName valueTypes.String `json:"ps_name" PointId:"ps_name" PointUpdateFreq:"UpdateFreqBoot"` + PsPsKey valueTypes.PsKey `json:"ps_ps_key" PointId:"ps_key" PointUpdateFreq:"UpdateFreqBoot"` + PsState valueTypes.Bool `json:"ps_state" PointId:"ps_state" PointUpdateFreq:"UpdateFreqInstant"` + PsType valueTypes.Integer `json:"ps_type" PointId:"ps_type" PointUpdateFreq:"UpdateFreqBoot"` + PvPowerMap valueTypes.UnitValue `json:"pv_power_map" PointId:"pv_power_map" PointUpdateFreq:"UpdateFreq5Mins"` PvPowerMapVirgin valueTypes.UnitValue `json:"pv_power_map_virgin" PointIgnore:"true"` RobotNumSweepCapacity struct { - Num valueTypes.Integer `json:"num" PointId:"Num" PointTimeSpan:"PointTimeSpanBoot"` - SweepCapacity valueTypes.Float `json:"sweep_capacity" PointId:"SweepCapacity" PointTimeSpan:"PointTimeSpanBoot"` - } `json:"robot_num_sweep_capacity"` - SelfConsumptionOffsetReminder valueTypes.Integer `json:"self_consumption_offset_reminder" PointId:"SelfConsumptionOffsetReminder" PointTimeSpan:"PointTimeSpanBoot"` - So2ReduceTotal valueTypes.UnitValue `json:"so2_reduce_total" PointId:"So2ReduceTotal" PointTimeSpan:"PointTimeSpanTotal"` + Num valueTypes.Integer `json:"num" PointId:"num" PointUpdateFreq:"UpdateFreqBoot"` + SweepCapacity valueTypes.Float `json:"sweep_capacity" PointId:"sweep_capacity" PointUpdateFreq:"UpdateFreqBoot"` + } `json:"robot_num_sweep_capacity" PointId:"robot"` + SelfConsumptionOffsetReminder valueTypes.Integer `json:"self_consumption_offset_reminder" PointId:"self_consumption_offset_reminder" PointUpdateFreq:"UpdateFreqBoot"` + So2ReduceTotal valueTypes.UnitValue `json:"so2_reduce_total" PointId:"so2_reduce_total" PointUpdateFreq:"UpdateFreqTotal"` StorageInverterData []struct { - CommunicationDevSn valueTypes.String `json:"communication_dev_sn" PointId:"CommunicationDevSn" PointName:"Serial No" PointTimeSpan:"PointTimeSpanBoot"` - DevStatus valueTypes.Integer `json:"dev_status" PointId:"DevStatus" PointTimeSpan:"PointTimeSpanBoot"` - DeviceCode valueTypes.Integer `json:"device_code" PointId:"DeviceCode" PointTimeSpan:"PointTimeSpanBoot"` - DeviceModelCode valueTypes.String `json:"device_model_code" PointId:"DeviceModelCode" PointTimeSpan:"PointTimeSpanBoot"` - DeviceName valueTypes.String `json:"device_name" PointId:"DeviceName" PointTimeSpan:"PointTimeSpanBoot"` - DeviceState string `json:"device_state" PointId:"DeviceState" PointTimeSpan:"PointTimeSpanBoot"` - DeviceType valueTypes.Integer `json:"device_type" PointId:"DeviceType" PointTimeSpan:"PointTimeSpanBoot"` - DrmStatus valueTypes.Integer `json:"drm_status" PointId:"DrmStatus" PointTimeSpan:"PointTimeSpanBoot"` - DrmStatusName valueTypes.String `json:"drm_status_name" PointId:"DrmStatusName" PointTimeSpan:"PointTimeSpanBoot"` - EnergyFlow []valueTypes.Integer `json:"energy_flow"` - HasAmmeter valueTypes.Bool `json:"has_ammeter" PointId:"HasAmmeter" PointTimeSpan:"PointTimeSpanBoot"` - InstallerDevFaultStatus valueTypes.Integer `json:"installer_dev_fault_status" PointId:"InstallerDevFaultStatus" PointTimeSpan:"PointTimeSpanBoot"` - InverterSn valueTypes.String `json:"inverter_sn" PointId:"InverterSn" PointTimeSpan:"PointTimeSpanBoot"` - OwnerDevFaultStatus valueTypes.Integer `json:"owner_dev_fault_status" PointId:"OwnerDevFaultStatus" PointTimeSpan:"PointTimeSpanBoot"` - P13003Map valueTypes.UnitValue `json:"p13003_map" PointId:"p13003" PointTimeSpan:"PointTimeSpanInstant"` + CommunicationDevSn valueTypes.String `json:"communication_dev_sn" PointId:"communication_dev_sn" PointName:"Serial No" PointUpdateFreq:"UpdateFreqBoot"` + DevStatus valueTypes.Integer `json:"dev_status" PointId:"dev_status" PointUpdateFreq:"UpdateFreqInstant"` + DeviceCode valueTypes.Integer `json:"device_code" PointId:"device_code" PointUpdateFreq:"UpdateFreqBoot"` + DeviceModelCode valueTypes.String `json:"device_model_code" PointId:"device_model_code" PointUpdateFreq:"UpdateFreqBoot"` + DeviceName valueTypes.String `json:"device_name" PointId:"device_name" PointUpdateFreq:"UpdateFreqBoot"` + DeviceState valueTypes.Integer `json:"device_state" PointId:"device_state" PointUpdateFreq:"UpdateFreqInstant"` + DeviceType valueTypes.Integer `json:"device_type" PointId:"device_type" PointUpdateFreq:"UpdateFreqBoot"` + DrmStatus valueTypes.Integer `json:"drm_status" PointId:"drm_status" PointUpdateFreq:"UpdateFreqBoot"` + DrmStatusName valueTypes.String `json:"drm_status_name" PointId:"drm_status_name" PointUpdateFreq:"UpdateFreqBoot"` + EnergyFlow []valueTypes.Integer `json:"energy_flow" PointId:"energy_flow" PointArrayFlatten:"true" PointUpdateFreq:"UpdateFreq5Mins"` + HasAmmeter valueTypes.Bool `json:"has_ammeter" PointId:"has_ammeter" PointUpdateFreq:"UpdateFreqBoot"` + InstallerDevFaultStatus valueTypes.Integer `json:"installer_dev_fault_status" PointId:"installer_dev_fault_status" PointUpdateFreq:"UpdateFreqInstant"` + InverterSn valueTypes.String `json:"inverter_sn" PointId:"inverter_sn" PointUpdateFreq:"UpdateFreqBoot"` + OwnerDevFaultStatus valueTypes.Integer `json:"owner_dev_fault_status" PointId:"owner_dev_fault_status" PointUpdateFreq:"UpdateFreqInstant"` + P13003Map valueTypes.UnitValue `json:"p13003_map" PointId:"p13003" PointName:"PV Power To Load" PointUpdateFreq:"UpdateFreq5Mins"` P13003MapVirgin valueTypes.UnitValue `json:"p13003_map_virgin" PointIgnore:"true"` - P13119Map valueTypes.UnitValue `json:"p13119_map" PointId:"p13119" PointTimeSpan:"PointTimeSpanInstant"` + P13119Map valueTypes.UnitValue `json:"p13119_map" PointId:"p13119" PointName:"Load Power" PointUpdateFreq:"UpdateFreq5Mins"` P13119MapVirgin valueTypes.UnitValue `json:"p13119_map_virgin" PointIgnore:"true"` - P13121Map valueTypes.UnitValue `json:"p13121_map" PointId:"p13121" PointTimeSpan:"PointTimeSpanInstant"` + P13121Map valueTypes.UnitValue `json:"p13121_map" PointId:"p13121" PointName:"PV Power To Grid" PointUpdateFreq:"UpdateFreq5Mins"` P13121MapVirgin valueTypes.UnitValue `json:"p13121_map_virgin" PointIgnore:"true"` - P13126Map valueTypes.UnitValue `json:"p13126_map" PointId:"p13126" PointTimeSpan:"PointTimeSpanInstant"` + P13126Map valueTypes.UnitValue `json:"p13126_map" PointId:"p13126" PointName:"PV Power To Battery" PointUpdateFreq:"UpdateFreq5Mins"` P13126MapVirgin valueTypes.UnitValue `json:"p13126_map_virgin" PointIgnore:"true"` - P13141 valueTypes.Float `json:"p13141" PointId:"p13141" PointTimeSpan:"PointTimeSpanInstant"` - P13149Map valueTypes.UnitValue `json:"p13149_map" PointId:"p13149" PointTimeSpan:"PointTimeSpanInstant"` + P13141 valueTypes.Float `json:"p13141" PointId:"p13141" PointName:"Battery Charge Percent" PointUnit:"%" PointUpdateFreq:"UpdateFreq5Mins"` + P13149Map valueTypes.UnitValue `json:"p13149_map" PointId:"p13149" PointName:"Grid Power To Load" PointUpdateFreq:"UpdateFreq5Mins"` P13149MapVirgin valueTypes.UnitValue `json:"p13149_map_virgin" PointIgnore:"true"` - P13150Map valueTypes.UnitValue `json:"p13150_map" PointId:"p13150" PointTimeSpan:"PointTimeSpanInstant"` - P13150MapVirgin valueTypes.UnitValue `json:"p13150_map_virgin" PointIgnore:"true"` - PsKey valueTypes.PsKey `json:"ps_key" PointId:"PsKey" PointTimeSpan:"PointTimeSpanBoot"` - UUID valueTypes.Integer `json:"uuid" PointId:"UUID" PointTimeSpan:"PointTimeSpanBoot"` - } `json:"storage_inverter_data"` - TodayEnergy valueTypes.UnitValue `json:"today_energy" PointId:"TodayEnergy" PointTimeSpan:"PointTimeSpanDaily"` + P13150Map valueTypes.UnitValue `json:"p13150_map" PointId:"p13150" PointUpdateFreq:"UpdateFreq5Mins"` + P13150MapVirgin valueTypes.UnitValue `json:"p13150_map_virgin" PointIgnore:"true"` + PsKey valueTypes.PsKey `json:"ps_key" PointId:"ps_key" PointUpdateFreq:"UpdateFreqBoot"` + UUID valueTypes.Integer `json:"uuid" PointId:"uuid" PointUpdateFreq:"UpdateFreqBoot"` + } `json:"storage_inverter_data" PointNameFromChild:"PsKey"` + TodayEnergy valueTypes.UnitValue `json:"today_energy" PointId:"today_energy" PointUpdateFreq:"UpdateFreqDaily"` TodayEnergyVirgin valueTypes.UnitValue `json:"today_energy_virgin" PointIgnore:"true"` - TodayIncome valueTypes.UnitValue `json:"today_income" PointId:"TodayIncome" PointTimeSpan:"PointTimeSpanDaily"` - TotalEnergy valueTypes.UnitValue `json:"total_energy" PointId:"TotalEnergy" PointTimeSpan:"PointTimeSpanTotal"` + TodayIncome valueTypes.UnitValue `json:"today_income" PointId:"today_income" PointUpdateFreq:"UpdateFreqDaily"` + TotalEnergy valueTypes.UnitValue `json:"total_energy" PointId:"total_energy" PointUpdateFreq:"UpdateFreqTotal"` TotalEnergyVirgin valueTypes.UnitValue `json:"total_energy_virgin" PointIgnore:"true"` - TotalIncome valueTypes.UnitValue `json:"total_income" PointId:"TotalIncome" PointTimeSpan:"PointTimeSpanTotal"` - TreeReduceTotal valueTypes.UnitValue `json:"tree_reduce_total" PointId:"TreeReduceTotal" PointTimeSpan:"PointTimeSpanTotal"` - ValidFlag valueTypes.Integer `json:"valid_flag" PointId:"ValidFlag" PointTimeSpan:"PointTimeSpanBoot"` - WgsLatitude valueTypes.Float `json:"wgs_latitude" PointId:"WgsLatitude" PointTimeSpan:"PointTimeSpanBoot"` - WgsLongitude valueTypes.Float `json:"wgs_longitude" PointId:"WgsLongitude" PointTimeSpan:"PointTimeSpanBoot"` - ZfzyMap valueTypes.UnitValue `json:"zfzy_map" PointId:"ZfzyMap" PointTimeSpan:"PointTimeSpanInstant"` + TotalIncome valueTypes.UnitValue `json:"total_income" PointId:"total_income" PointUpdateFreq:"UpdateFreqTotal"` + TreeReduceTotal valueTypes.UnitValue `json:"tree_reduce_total" PointId:"tree_reduce_total" PointUpdateFreq:"UpdateFreqTotal"` + ValidFlag valueTypes.Bool `json:"valid_flag" PointId:"valid_flag" PointUpdateFreq:"UpdateFreqBoot"` + WgsLatitude valueTypes.Float `json:"wgs_latitude" PointId:"wgs_latitude" PointUpdateFreq:"UpdateFreqBoot"` + WgsLongitude valueTypes.Float `json:"wgs_longitude" PointId:"wgs_longitude" PointUpdateFreq:"UpdateFreqBoot"` + ZfzyMap valueTypes.UnitValue `json:"zfzy_map" PointId:"zfzy_map" PointName:"Self Consumption Of PV" PointUpdateFreq:"UpdateFreq5Mins"` ZfzyMapVirgin valueTypes.UnitValue `json:"zfzy_map_virgin" PointIgnore:"true"` - ZjzzMap valueTypes.UnitValue `json:"zjzz_map" PointId:"ZjzzMap" PointTimeSpan:"PointTimeSpanInstant"` + ZjzzMap valueTypes.UnitValue `json:"zjzz_map" PointId:"zjzz_map" PointName:"Self Sufficiency" PointUpdateFreq:"UpdateFreq5Mins"` ZjzzMapVirgin valueTypes.UnitValue `json:"zjzz_map_virgin" PointIgnore:"true"` } @@ -150,41 +150,69 @@ func (e *ResultData) IsValid() error { return err } -//type DecodeResultData ResultData -// -//func (e *ResultData) UnmarshalJSON(data []byte) error { -// var err error -// -// for range Only.Once { -// if len(data) == 0 { -// break -// } -// var pd DecodeResultData -// -// // Store ResultData -// _ = json.Unmarshal(data, &pd) -// e.Dummy = pd.Dummy -// } -// -// return err -//} - func (e *EndPoint) GetData() api.DataMap { - return e.Response.ResultData.GetData() -} - -func (e *ResultData) GetData() api.DataMap { entries := api.NewDataMap() for range Only.Once { pkg := apiReflect.GetName("", *e) - name := fmt.Sprintf("%s.%s", pkg, e.PsPsKey.Value()) - entries.StructToPoints(*e, name, e.PsPsKey.Value(), valueTypes.NewDateTime("")) + name := api.JoinWithDots(0, valueTypes.DateTimeLayoutDay, pkg, e.Response.ResultData.PsPsKey) + entries.StructToPoints(e.Response.ResultData, name, e.Response.ResultData.PsPsKey.Value(), valueTypes.NewDateTime("")) - for _, sid := range e.StorageInverterData { - name = fmt.Sprintf("%s.%s", pkg, sid.PsKey.Value()) - entries.StructToPoints(sid, name, sid.PsKey.Value(), valueTypes.NewDateTime("")) + dstEndpoint := "virtual." + e.Request.PsId.String() + srcEndpoint := fmt.Sprintf("%s.%s", pkg, e.Response.ResultData.PsPsKey.Value()) + + var devices []string + for _, device := range e.Response.ResultData.StorageInverterData { + if !device.DeviceType.Match(api.DeviceNameEnergyStorageSystem) { + // Only looking for a Battery. + continue + } + devices = append(devices, device.PsKey.String()) } + + + for pn, device := range e.Response.ResultData.StorageInverterData { + fmt.Println(pn) + fmt.Println(device.PsKey) + } + + for _, device := range devices { + dstEndpoint = "virtual." + device + _ = entries.CopyPoint(api.JoinWithDots(0, "", srcEndpoint, device, "p13003"), dstEndpoint, "p13003", "") // PV Power To Load + _ = entries.CopyPoint(api.JoinWithDots(0, "", srcEndpoint, device, "p13119"), dstEndpoint, "p13119", "") // Load Power + _ = entries.CopyPoint(api.JoinWithDots(0, "", srcEndpoint, device, "p13121"), dstEndpoint, "p13121", "") // PV Power To Grid + _ = entries.CopyPoint(api.JoinWithDots(0, "", srcEndpoint, device, "p13126"), dstEndpoint, "p13126", "") // PV Power To Battery + _ = entries.CopyPoint(api.JoinWithDots(0, "", srcEndpoint, device, "p13141"), dstEndpoint, "p13141", "") // Battery Charge Percent + _ = entries.CopyPoint(api.JoinWithDots(0, "", srcEndpoint, device, "p13149"), dstEndpoint, "p13149", "") // ?? Grid Power To Load + _ = entries.CopyPoint(api.JoinWithDots(0, "", srcEndpoint, device, "p13150"), dstEndpoint, "p13150", "") // + } + + dstEndpoint = "virtual." + e.Response.ResultData.PsPsKey.Value() + _ = entries.CopyPoint(srcEndpoint + ".p83081", dstEndpoint, "p83081", "") // ?? Load Power - also getPsDetailWithPsType.1171348_11_0_0.curr_power + _ = entries.CopyPoint(srcEndpoint + ".p83102", dstEndpoint, "p83102", "") // Energy Purchased + _ = entries.CopyPoint(srcEndpoint + ".p83102_percent", dstEndpoint + ".p83102", "percent", "") // Energy Purchased Percent + _ = entries.CopyPoint(srcEndpoint + ".p83118", dstEndpoint, "p83118", "") // Energy Used + _ = entries.CopyPoint(srcEndpoint + ".p83119", dstEndpoint, "p83119", "") // Energy Feed-In + _ = entries.CopyPoint(srcEndpoint + ".p83120", dstEndpoint, "p83120", "") // Energy Battery Charge + _ = entries.CopyPoint(srcEndpoint + ".p83122", dstEndpoint, "p83122", "") // Self Sufficiency Percent + _ = entries.CopyPoint(srcEndpoint + ".p83124", dstEndpoint, "p83124", "") + _ = entries.CopyPoint(srcEndpoint + ".p83202", dstEndpoint, "p83202", "") // Installed Power + + _ = entries.CopyPoint(srcEndpoint + ".zjzz_map", dstEndpoint, "zjzz", "") // Self Sufficiency + _ = entries.CopyPoint(srcEndpoint + ".zfzy_map", dstEndpoint, "zfzy", "") // Self Consumption Of PV + + // for _, sid := range e.Response.ResultData.StorageInverterData { + // name = api.JoinWithDots(0, valueTypes.DateTimeLayoutDay, pkg, sid.PsKey) + // entries.StructToPoints(sid, name, sid.PsKey.Value(), valueTypes.NewDateTime("")) + // + // // EnergyFlow + // for _, ef := range sid.EnergyFlow { + // name = api.JoinWithDots(0, valueTypes.DateTimeLayoutDay, pkg, sid.PsKey) + // entries.StructToPoints(ef, name, sid.PsKey.Value(), valueTypes.NewDateTime("")) + // + // // EnergyFlow + // } + // } } // api.Points.Print() @@ -204,7 +232,7 @@ func (e *EndPoint) GetPsName() string { } func (e *EndPoint) GetPsState() string { - return e.Response.ResultData.PsState + return e.Response.ResultData.PsState.String() } func (e *EndPoint) GetPsKey() string { diff --git a/iSolarCloud/AppService/getPsList/data.go b/iSolarCloud/AppService/getPsList/data.go index 3d2dbf2b6..aaedcb1e4 100644 --- a/iSolarCloud/AppService/getPsList/data.go +++ b/iSolarCloud/AppService/getPsList/data.go @@ -26,27 +26,27 @@ func (rd RequestData) Help() string { type ResultData struct { PageList []struct { - AlarmCount valueTypes.Integer `json:"alarm_count" PointId:"alarm_count" PointTimeSpan:"PointTimeSpanBoot"` - AlarmDevCount valueTypes.Integer `json:"alarm_dev_count" PointId:"alarm_dev_count" PointTimeSpan:"PointTimeSpanBoot"` - AreaID interface{} `json:"area_id" PointId:"area_id"` - AreaType interface{} `json:"area_type" PointId:"area_type"` + AlarmCount valueTypes.Integer `json:"alarm_count" PointId:"alarm_count" PointUpdateFreq:"UpdateFreqBoot"` + AlarmDevCount valueTypes.Integer `json:"alarm_dev_count" PointId:"alarm_dev_count" PointUpdateFreq:"UpdateFreqBoot"` + AreaID interface{} `json:"area_id" PointId:"area_id"` + AreaType interface{} `json:"area_type" PointId:"area_type"` ArrearsStatus valueTypes.Integer `json:"arrears_status" PointId:"arrears_status"` - BuildDate valueTypes.DateTime `json:"build_date" PointId:"build_date" PointTimeSpan:"PointTimeSpanBoot"` - BuildStatus valueTypes.Integer `json:"build_status" PointId:"build_status" PointTimeSpan:"PointTimeSpanBoot"` + BuildDate valueTypes.DateTime `json:"build_date" PointId:"build_date" PointUpdateFreq:"UpdateFreqBoot"` + BuildStatus valueTypes.Integer `json:"build_status" PointId:"build_status" PointUpdateFreq:"UpdateFreqBoot"` Co2Reduce valueTypes.UnitValue `json:"co2_reduce" PointId:"co2_reduce"` - Co2ReduceTotal valueTypes.UnitValue `json:"co2_reduce_total" PointId:"co2_reduce_total" PointTimeSpan:"PointTimeSpanTotal"` + Co2ReduceTotal valueTypes.UnitValue `json:"co2_reduce_total" PointId:"co2_reduce_total" PointUpdateFreq:"UpdateFreqTotal"` CurrPower valueTypes.UnitValue `json:"curr_power" PointId:"curr_power"` - DailyIrradiation valueTypes.UnitValue `json:"daily_irradiation" PointId:"daily_irradiation" PointTimeSpan:"PointTimeSpanDaily"` + DailyIrradiation valueTypes.UnitValue `json:"daily_irradiation" PointId:"daily_irradiation" PointUpdateFreq:"UpdateFreqDaily"` DailyIrradiationVirgin valueTypes.Float `json:"daily_irradiation_virgin" PointIgnore:"true"` DesignCapacity valueTypes.Float `json:"design_capacity" PointId:"design_capacity" PointUnitFrom:"design_capacity_unit"` DesignCapacityUnit valueTypes.String `json:"design_capacity_unit" PointId:"design_capacity_unit"` DesignCapacityVirgin valueTypes.Float `json:"design_capacity_virgin" PointIgnore:"true"` - EquivalentHour valueTypes.UnitValue `json:"equivalent_hour" PointId:"equivalent_hour" PointTimeSpan:"PointTimeSpanDaily"` - EsDischargeEnergy valueTypes.UnitValue `json:"es_disenergy" PointId:"p83089" PointName:"Es Discharge Energy"` - EsEnergy valueTypes.UnitValue `json:"es_energy" PointId:"p83120" PointName:"Es Energy"` - EsPower valueTypes.UnitValue `json:"es_power" PointId:"p83081" PointName:"Es Power"` - EsTotalDischargeEnergy valueTypes.UnitValue `json:"es_total_disenergy" PointId:"p83095" PointAlias:"p83095" PointTimeSpan:"PointTimeSpanTotal"` - EsTotalEnergy valueTypes.UnitValue `json:"es_total_energy" PointId:"p83127" PointAlias:"p83127" PointTimeSpan:"PointTimeSpanTotal"` + EquivalentHour valueTypes.UnitValue `json:"equivalent_hour" PointId:"equivalent_hour" PointUpdateFreq:"UpdateFreqDaily"` + EsDischargeEnergy valueTypes.UnitValue `json:"es_disenergy" PointId:"p83089" PointName:"ES Discharge Energy" PointUpdateFreq:"UpdateFreq5Mins"` + EsEnergy valueTypes.UnitValue `json:"es_energy" PointId:"p83120" PointName:"ES Energy" PointUpdateFreq:"UpdateFreq5Mins"` + EsPower valueTypes.UnitValue `json:"es_power" PointId:"p83081" PointName:"ES Power" PointUpdateFreq:"UpdateFreq5Mins"` + EsTotalDischargeEnergy valueTypes.UnitValue `json:"es_total_disenergy" PointId:"p83095" PointName:"ES Total Discharge Energy" PointUpdateFreq:"UpdateFreqTotal"` + EsTotalEnergy valueTypes.UnitValue `json:"es_total_energy" PointId:"p83127" PointName:"ES Total Energy" PointUpdateFreq:"UpdateFreqTotal"` ExpectInstallDate valueTypes.DateTime `json:"expect_install_date" PointId:"expect_install_date"` FaultAlarmOfflineDevCount valueTypes.Integer `json:"fault_alarm_offline_dev_count" PointId:"fault_alarm_offline_dev_count"` FaultCount valueTypes.Integer `json:"fault_count" PointId:"fault_count"` @@ -63,8 +63,8 @@ type ResultData struct { PictureName valueTypes.String `json:"picture_name"` PictureURL valueTypes.String `json:"picture_url"` PsID valueTypes.Integer `json:"ps_id"` - PsUnitUUID interface{} `json:"ps_unit_uuid"` - } `json:"images"` + PsUnitUUID interface{} `json:"ps_unit_uuid"` + } `json:"images" PointName:"Images"` InstallDate valueTypes.DateTime `json:"install_date" PointId:"install_date"` InstalledPowerMap valueTypes.UnitValue `json:"installed_power_map" PointId:"installed_power_map"` InstalledPowerVirgin valueTypes.Float `json:"installed_power_virgin" PointIgnore:"true"` @@ -82,29 +82,29 @@ type ResultData struct { MlpeFlag valueTypes.Integer `json:"mlpe_flag" PointId:"mlpe_flag"` Nmi valueTypes.String `json:"nmi" PointId:"nmi"` OfflineDevCount valueTypes.Integer `json:"offline_dev_count" PointId:"offline_dev_count"` - OperateYear interface{} `json:"operate_year" PointId:"operate_year"` + OperateYear interface{} `json:"operate_year" PointId:"operate_year"` OperationBusName valueTypes.String `json:"operation_bus_name" PointId:"operation_bus_name"` OwnerAlarmCount valueTypes.Integer `json:"owner_alarm_count" PointId:"owner_alarm_count"` OwnerFaultCount valueTypes.Integer `json:"owner_fault_count" PointId:"owner_fault_count"` OwnerPsFaultStatus valueTypes.Integer `json:"owner_ps_fault_status" PointId:"owner_ps_fault_status"` - P83022y valueTypes.String `json:"p83022y" PointId:"p83022"` - P83046 valueTypes.Float `json:"p83046" PointId:"p83046"` - P83048 valueTypes.Float `json:"p83048" PointId:"p83048"` - P83049 valueTypes.Float `json:"p83049" PointId:"p83049"` - P83050 valueTypes.Float `json:"p83050" PointId:"p83050"` - P83051 valueTypes.Float `json:"p83051" PointId:"p83051"` - P83054 valueTypes.Float `json:"p83054" PointId:"p83054"` - P83055 valueTypes.Float `json:"p83055" PointId:"p83055"` - P83067 valueTypes.Float `json:"p83067" PointId:"p83067"` - P83070 valueTypes.Float `json:"p83070" PointId:"p83070"` - P83076 valueTypes.Float `json:"p83076" PointId:"p83076" PointIgnore:"true"` // Dupe of PvPower - P83077 valueTypes.Float `json:"p83077" PointId:"p83077" PointIgnore:"true"` // Dupe of PvEnergy - P83081 valueTypes.Float `json:"p83081" PointId:"p83081" PointIgnore:"true"` // Dupe of EsPower - P83089 valueTypes.Float `json:"p83089" PointId:"p83089" PointIgnore:"true"` // Dupe of EsDischargeEnergy - P83095 valueTypes.Float `json:"p83095" PointId:"p83095" PointIgnore:"true"` // Dupe of EsTotalDischargeEnergy - P83118 valueTypes.Float `json:"p83118" PointId:"p83118" PointIgnore:"true"` // Dupe of UseEnergy - P83120 valueTypes.Float `json:"p83120" PointId:"p83120" PointIgnore:"true"` // Dupe of EsEnergy - P83127 valueTypes.Float `json:"p83127" PointId:"p83127" PointIgnore:"true"` // Dupe of EsTotalEnergy + P83022y valueTypes.String `json:"p83022y" PointId:"p83022" PointUpdateFreq:"UpdateFreq5Mins"` + P83046 valueTypes.Float `json:"p83046" PointId:"p83046" PointUpdateFreq:"UpdateFreq5Mins"` + P83048 valueTypes.Float `json:"p83048" PointId:"p83048" PointUpdateFreq:"UpdateFreq5Mins"` + P83049 valueTypes.Float `json:"p83049" PointId:"p83049" PointUpdateFreq:"UpdateFreq5Mins"` + P83050 valueTypes.Float `json:"p83050" PointId:"p83050" PointUpdateFreq:"UpdateFreq5Mins"` + P83051 valueTypes.Float `json:"p83051" PointId:"p83051" PointUpdateFreq:"UpdateFreq5Mins"` + P83054 valueTypes.Float `json:"p83054" PointId:"p83054" PointUpdateFreq:"UpdateFreq5Mins"` + P83055 valueTypes.Float `json:"p83055" PointId:"p83055" PointUpdateFreq:"UpdateFreq5Mins"` + P83067 valueTypes.Float `json:"p83067" PointId:"p83067" PointUpdateFreq:"UpdateFreq5Mins"` + P83070 valueTypes.Float `json:"p83070" PointId:"p83070" PointUpdateFreq:"UpdateFreq5Mins"` + P83076 valueTypes.Float `json:"p83076" PointId:"_p83076" PointName:"Pv Power" PointIgnore:"true"` // Dupe of PvPower + P83077 valueTypes.Float `json:"p83077" PointId:"_p83077" PointName:"Pv Energy" PointIgnore:"true"` // Dupe of PvEnergy + P83081 valueTypes.Float `json:"p83081" PointId:"_p83081" PointName:"Es Power" PointIgnore:"true"` // Dupe of EsPower + P83089 valueTypes.Float `json:"p83089" PointId:"_p83089" PointName:"Es Discharge Energy" PointIgnore:"true"` // Dupe of EsDischargeEnergy + P83095 valueTypes.Float `json:"p83095" PointId:"_p83095" PointName:"Es Total Discharge Energy" PointIgnore:"true"` // Dupe of EsTotalDischargeEnergy + P83118 valueTypes.Float `json:"p83118" PointId:"_p83118" PointName:"Use Energy" PointIgnore:"true"` // Dupe of UseEnergy + P83120 valueTypes.Float `json:"p83120" PointId:"_p83120" PointName:"Es Energy" PointIgnore:"true"` // Dupe of EsEnergy + P83127 valueTypes.Float `json:"p83127" PointId:"_p83127" PointName:"Es Total Energy" PointIgnore:"true"` // Dupe of EsTotalEnergy ParamCo2 valueTypes.Float `json:"param_co2" PointId:"param_co2"` ParamCoal valueTypes.Float `json:"param_coal" PointId:"param_coal"` ParamIncome valueTypes.Float `json:"param_income" PointId:"param_income"` @@ -114,43 +114,43 @@ type ResultData struct { ParamSo2 valueTypes.Float `json:"param_so2" PointId:"param_so2"` ParamTree valueTypes.Float `json:"param_tree" PointId:"param_tree"` ParamWater valueTypes.Float `json:"param_water" PointId:"param_water"` - PrScale string `json:"pr_scale" PointId:"pr_scale"` - Producer interface{} `json:"producer" PointId:"producer"` + PrScale string `json:"pr_scale" PointId:"pr_scale"` + Producer interface{} `json:"producer" PointId:"producer"` PsCountryID valueTypes.Integer `json:"ps_country_id" PointId:"ps_country_id"` PsFaultStatus valueTypes.Integer `json:"ps_fault_status" PointId:"ps_fault_status"` - PsHealthStatus string `json:"ps_health_status" PointId:"ps_health_status"` + PsHealthStatus valueTypes.Integer `json:"ps_health_status" PointId:"ps_health_status"` PsHolder valueTypes.String `json:"ps_holder" PointId:"ps_holder"` - PsID valueTypes.Integer `json:"ps_id" PointId:"ps_id"` + PsId valueTypes.Integer `json:"ps_id" PointId:"ps_id"` PsIsNotInit valueTypes.Bool `json:"ps_is_not_init" PointId:"ps_is_not_init"` PsName valueTypes.String `json:"ps_name" PointId:"ps_name"` PsShortName valueTypes.String `json:"ps_short_name" PointId:"ps_short_name"` - PsStatus valueTypes.Bool `json:"ps_status" PointId:"ps_status"` + PsStatus valueTypes.Integer `json:"ps_status" PointId:"ps_status"` PsTimezone valueTypes.String `json:"ps_timezone" PointId:"ps_timezone"` PsType valueTypes.Integer `json:"ps_type" PointId:"ps_type"` - PvEnergy valueTypes.UnitValue `json:"pv_energy" PointId:"p83077" PointName:"Pv Energy"` - PvPower valueTypes.UnitValue `json:"pv_power" PointId:"p83076" PointName:"Pv Power"` + PvEnergy valueTypes.UnitValue `json:"pv_energy" PointId:"p83077" PointName:"Pv Energy" PointUpdateFreq:"UpdateFreq5Mins"` + PvPower valueTypes.UnitValue `json:"pv_power" PointId:"p83076" PointName:"Pv Power" PointUpdateFreq:"UpdateFreq5Mins"` Radiation valueTypes.UnitValue `json:"radiation" PointId:"radiation"` RadiationVirgin valueTypes.Float `json:"radiation_virgin" PointIgnore:"true"` RecordCreateTime valueTypes.DateTime `json:"recore_create_time" PointId:"record_create_time"` SafeStartDate valueTypes.DateTime `json:"safe_start_date" PointId:"safe_start_date"` - ShareType string `json:"share_type" PointId:"share_type"` + ShareType valueTypes.Integer `json:"share_type" PointId:"share_type"` ShippingAddress valueTypes.String `json:"shipping_address" PointId:"shipping_address"` ShippingZipCode valueTypes.String `json:"shipping_zip_code" PointId:"shipping_zip_code"` - TodayEnergy valueTypes.UnitValue `json:"today_energy" PointId:"today_energy" PointTimeSpan:"PointTimeSpanDaily"` - TodayIncome valueTypes.UnitValue `json:"today_income" PointId:"today_income" PointTimeSpan:"PointTimeSpanDaily"` - TotalCapacity valueTypes.UnitValue `json:"total_capcity" PointId:"total_capacity" PointTimeSpan:"PointTimeSpanTotal"` - TotalEnergy valueTypes.UnitValue `json:"total_energy" PointId:"total_energy" PointTimeSpan:"PointTimeSpanTotal"` - TotalIncome valueTypes.UnitValue `json:"total_income" PointId:"total_income" PointTimeSpan:"PointTimeSpanTotal"` - TotalInitCo2Accelerate valueTypes.Float `json:"total_init_co2_accelerate" PointId:"total_init_co2_accelerate" PointTimeSpan:"PointTimeSpanTotal"` - TotalInitElec valueTypes.Float `json:"total_init_elec" PointId:"total_init_elec" PointTimeSpan:"PointTimeSpanTotal"` - TotalInitProfit valueTypes.Float `json:"total_init_profit" PointId:"total_init_profit" PointTimeSpan:"PointTimeSpanTotal"` - UseEnergy valueTypes.UnitValue `json:"use_energy" PointId:"p83118" PointName:"Use Energy"` + TodayEnergy valueTypes.UnitValue `json:"today_energy" PointId:"today_energy" PointUpdateFreq:"UpdateFreqDaily"` + TodayIncome valueTypes.UnitValue `json:"today_income" PointId:"today_income" PointUpdateFreq:"UpdateFreqDaily"` + TotalCapacity valueTypes.UnitValue `json:"total_capcity" PointId:"total_capacity" PointUpdateFreq:"UpdateFreqTotal"` + TotalEnergy valueTypes.UnitValue `json:"total_energy" PointId:"total_energy" PointUpdateFreq:"UpdateFreqTotal"` + TotalIncome valueTypes.UnitValue `json:"total_income" PointId:"total_income" PointUpdateFreq:"UpdateFreqTotal"` + TotalInitCo2Accelerate valueTypes.Float `json:"total_init_co2_accelerate" PointId:"total_init_co2_accelerate" PointUpdateFreq:"UpdateFreqTotal"` + TotalInitElec valueTypes.Float `json:"total_init_elec" PointId:"total_init_elec" PointUpdateFreq:"UpdateFreqTotal"` + TotalInitProfit valueTypes.Float `json:"total_init_profit" PointId:"total_init_profit" PointUpdateFreq:"UpdateFreqTotal"` + UseEnergy valueTypes.UnitValue `json:"use_energy" PointId:"p83118" PointName:"Use Energy" PointUpdateFreq:"UpdateFreq5Mins"` ValidFlag valueTypes.Bool `json:"valid_flag" PointId:"valid_flag"` WgsLatitude valueTypes.Float `json:"wgs_latitude" PointId:"wgs_latitude"` WgsLongitude valueTypes.Float `json:"wgs_longitude" PointId:"wgs_longitude"` ZipCode valueTypes.String `json:"zip_code" PointId:"zip_code"` - } `json:"pageList"` - RowCount valueTypes.Integer `json:"rowCount"` + } `json:"pageList" PointNameFromChild:"PsId"` + RowCount valueTypes.Integer `json:"rowCount" PointIgnore:"true"` } func (e *ResultData) IsValid() error { @@ -164,14 +164,26 @@ func (e *ResultData) IsValid() error { return err } +func (e *EndPoint) GetData() api.DataMap { + entries := api.NewDataMap() + + for range Only.Once { + pkg := apiReflect.GetName("", *e) + dt := valueTypes.NewDateTime(valueTypes.Now) + entries.StructToPoints(e.Response.ResultData, pkg, "", dt) + } + return entries +} + + type Device struct { PsFaultStatus valueTypes.Integer - PsHealthStatus string + PsHealthStatus valueTypes.Integer PsHolder valueTypes.String PsID valueTypes.Integer PsName valueTypes.String PsShortName valueTypes.String - PsStatus valueTypes.Bool + PsStatus valueTypes.Integer PsType valueTypes.Integer } type Devices []Device @@ -183,7 +195,7 @@ func (e *ResultData) GetPsDevices() Devices { PsFaultStatus: d.PsFaultStatus, PsHealthStatus: d.PsHealthStatus, PsHolder: d.PsHolder, - PsID: d.PsID, + PsID: d.PsId, PsName: d.PsName, PsShortName: d.PsShortName, PsStatus: d.PsStatus, @@ -201,8 +213,8 @@ func (e *ResultData) GetPsIds() []valueTypes.Integer { break } for _, p := range e.PageList { - if p.PsID.Value() != 0 { - ret = append(ret, p.PsID) + if p.PsId.Value() != 0 { + ret = append(ret, p.PsId) } } } @@ -217,7 +229,7 @@ func (e *ResultData) GetPsName() []string { break } for _, p := range e.PageList { - if p.PsID.Value() != 0 { + if p.PsId.Value() != 0 { ret = append(ret, p.PsName.Value()) } } @@ -233,7 +245,7 @@ func (e *ResultData) GetPsSerial() []string { break } for _, p := range e.PageList { - if p.PsID.Value() != 0 { + if p.PsId.Value() != 0 { ret = append(ret, p.PsShortName.Value()) } } @@ -244,28 +256,3 @@ func (e *ResultData) GetPsSerial() []string { func (e *EndPoint) GetPsIds() []valueTypes.Integer { return e.Response.ResultData.GetPsIds() } - -func (e *EndPoint) GetData() api.DataMap { - entries := api.NewDataMap() - - for range Only.Once { - if len(e.Response.ResultData.PageList) == 0 { - break - } - - // now := valueTypes.NewDateTime(time.Now().Round(5 * time.Minute).Format(api.DtLayoutZeroSeconds)) - pkg := apiReflect.GetName("", *e) - - for _, p := range e.Response.ResultData.PageList { - // psId := p.PsID.String() // psId := strconv.FormatInt(p.PsID.Value(), 10) - name := api.JoinWithDots(0, "", pkg, p.PsID) - entries.StructToPoints(p, name, p.PsID.String(), valueTypes.NewDateTime("")) - - for i, v := range p.Images { - name2 := api.JoinWithDots(0, "", pkg, p.PsID, "images", i) - entries.StructToPoints(v, name2, p.PsID.String(), valueTypes.NewDateTime("")) - } - } - } - return entries -} diff --git a/iSolarCloud/AppService/queryDeviceList/data.go b/iSolarCloud/AppService/queryDeviceList/data.go index dfd6912dd..cd450a321 100644 --- a/iSolarCloud/AppService/queryDeviceList/data.go +++ b/iSolarCloud/AppService/queryDeviceList/data.go @@ -27,17 +27,17 @@ func (rd RequestData) Help() string { type ResultData struct { DevCountByStatusMap struct { - FaultCount valueTypes.Count `json:"fault_count" PointId:"fault_count"` - OfflineCount valueTypes.Count `json:"offline_count" PointId:"offline_count"` - RunCount valueTypes.Count `json:"run_count" PointId:"run_count"` - WarningCount valueTypes.Count `json:"warning_count" PointId:"warning_count"` - } `json:"dev_count_by_status_map"` - DevCountByTypeMap map[string]valueTypes.Integer `json:"dev_count_by_type_map"` + FaultCount valueTypes.Count `json:"fault_count" PointId:"fault_count" PointUpdateFreq:"UpdateFreqTotal"` + OfflineCount valueTypes.Count `json:"offline_count" PointId:"offline_count" PointUpdateFreq:"UpdateFreqTotal"` + RunCount valueTypes.Count `json:"run_count" PointId:"run_count" PointUpdateFreq:"UpdateFreqTotal"` + WarningCount valueTypes.Count `json:"warning_count" PointId:"warning_count" PointUpdateFreq:"UpdateFreqTotal"` + } `json:"dev_count_by_status_map" PointId:"device_status_count"` + DevCountByTypeMap map[string]valueTypes.Integer `json:"dev_count_by_type_map" PointId:"device_type_count" PointUpdateFreq:"UpdateFreqBoot"` // DevCountByTypeMap struct { // One4 valueTypes.Integer `json:"14"` // Two2 valueTypes.Integer `json:"22"` // } `json:"dev_count_by_type_map"` - DevTypeDefinition map[string]valueTypes.String `json:"dev_type_definition"` + DevTypeDefinition map[string]valueTypes.String `json:"dev_type_definition" PointId:"device_types" PointUpdateFreq:"UpdateFreqBoot"` // DevTypeDefinition struct { // One string `json:"1"` // One0 string `json:"10"` @@ -89,79 +89,79 @@ type ResultData struct { // Nine9 string `json:"99"` // } `json:"dev_type_definition"` PageList []struct { - AlarmCount valueTypes.Count `json:"alarm_count" PointId:"alarm_count"` - ChannelId valueTypes.Integer `json:"chnnl_id" PointId:"channel_id"` - CommandStatus valueTypes.Integer `json:"command_status" PointId:"command_status"` + AlarmCount valueTypes.Count `json:"alarm_count" PointId:"alarm_count" PointUpdateFreq:"UpdateFreqTotal"` + ChannelId valueTypes.Integer `json:"chnnl_id" PointId:"channel_id" PointUpdateFreq:"UpdateFreqBoot"` + CommandStatus valueTypes.Integer `json:"command_status" PointId:"command_status" PointUpdateFreq:"UpdateFreqInstant"` ComponentAmount valueTypes.Integer `json:"component_amount" PointId:"component_amount"` - DataFlag valueTypes.Integer `json:"data_flag" PointId:"data_flag"` + DataFlag valueTypes.Integer `json:"data_flag" PointId:"data_flag" PointUpdateFreq:"UpdateFreqBoot"` DataFlagDetail valueTypes.Integer `json:"data_flag_detail" PointId:"data_flag_detail"` - DeviceArea valueTypes.Integer `json:"device_area" PointId:"device_area"` - DeviceAreaName valueTypes.String `json:"device_area_name" PointId:"device_area_name"` - DeviceCode valueTypes.Integer `json:"device_code" PointId:"device_code"` - DeviceID valueTypes.Integer `json:"device_id" PointId:"device_id"` - DeviceModelCode valueTypes.String `json:"device_model_code" PointId:"device_model_code"` - DeviceModelID valueTypes.Integer `json:"device_model_id" PointId:"device_model_id"` - DeviceName valueTypes.String `json:"device_name" PointId:"device_name"` - DeviceStatus valueTypes.Bool `json:"device_status" PointId:"device_status"` - DeviceType valueTypes.Integer `json:"device_type" PointId:"device_type"` - FaultCount valueTypes.Count `json:"fault_count" PointId:"fault_count"` - FaultStatus string `json:"fault_status" PointId:"fault_status"` - FunctionEnum valueTypes.String `json:"function_enum" PointId:"function_enum"` - InstallerAlarmCount valueTypes.Count `json:"installer_alarm_count" PointId:"installer_alarm_count"` - InstallerDevFaultStatus valueTypes.Integer `json:"installer_dev_fault_status" PointId:"installer_dev_fault_status"` - InstallerFaultCount valueTypes.Count `json:"installer_fault_count" PointId:"installer_fault_count"` - InverterModelType valueTypes.Integer `json:"inverter_model_type" PointId:"inverter_model_type"` - IsDeveloper valueTypes.Bool `json:"is_developer" PointId:"is_developer"` - IsG2point5Module valueTypes.Bool `json:"is_g2point5_module" PointId:"is_g2point5_module"` - IsInit valueTypes.Bool `json:"is_init" PointId:"is_init"` - IsSecond valueTypes.Bool `json:"is_second" PointId:"is_second"` - IsSupportParamset valueTypes.Bool `json:"is_support_paramset" PointId:"is_support_paramset"` - NodeTimestamps interface{} `json:"node_timestamps" PointId:"node_timestamps"` - OwnerAlarmCount valueTypes.Count `json:"owner_alarm_count" PointId:"owner_alarm_count"` - OwnerDevFaultStatus valueTypes.Integer `json:"owner_dev_fault_status" PointId:"owner_dev_fault_status"` - OwnerFaultCount valueTypes.Count `json:"owner_fault_count" PointId:"owner_fault_count"` - PointData PointData `json:"point_data"` - Points interface{} `json:"points" PointId:"points"` + DeviceArea valueTypes.Integer `json:"device_area" PointId:"device_area" PointUpdateFreq:"UpdateFreqBoot"` // References UUID and referenced by UUIDIndexCode + DeviceAreaName valueTypes.String `json:"device_area_name" PointId:"device_area_name" PointUpdateFreq:"UpdateFreqBoot"` + DeviceCode valueTypes.Integer `json:"device_code" PointId:"device_code" PointUpdateFreq:"UpdateFreqBoot"` + DeviceID valueTypes.Integer `json:"device_id" PointId:"device_id" PointUpdateFreq:"UpdateFreqBoot"` + DeviceModelCode valueTypes.String `json:"device_model_code" PointId:"device_model_code" PointUpdateFreq:"UpdateFreqBoot"` + DeviceModelID valueTypes.Integer `json:"device_model_id" PointId:"device_model_id" PointUpdateFreq:"UpdateFreqBoot"` + DeviceName valueTypes.String `json:"device_name" PointId:"device_name" PointUpdateFreq:"UpdateFreqBoot"` + DeviceStatus valueTypes.Bool `json:"device_status" PointId:"device_status" PointUpdateFreq:"UpdateFreqInstant"` + DeviceType valueTypes.Integer `json:"device_type" PointId:"device_type" PointUpdateFreq:"UpdateFreqBoot"` + FaultCount valueTypes.Count `json:"fault_count" PointId:"fault_count" PointUpdateFreq:"UpdateFreqTotal"` + FaultStatus string `json:"fault_status" PointId:"fault_status" PointUpdateFreq:"UpdateFreqInstant"` + FunctionEnum valueTypes.String `json:"function_enum" PointId:"function_enum" PointUpdateFreq:"UpdateFreqInstant"` + InstallerAlarmCount valueTypes.Count `json:"installer_alarm_count" PointId:"installer_alarm_count" PointUpdateFreq:"UpdateFreqTotal"` + InstallerDevFaultStatus valueTypes.Integer `json:"installer_dev_fault_status" PointId:"installer_dev_fault_status" PointUpdateFreq:"UpdateFreqInstant"` + InstallerFaultCount valueTypes.Count `json:"installer_fault_count" PointId:"installer_fault_count" PointUpdateFreq:"UpdateFreqTotal"` + InverterModelType valueTypes.Integer `json:"inverter_model_type" PointId:"inverter_model_type" PointUpdateFreq:"UpdateFreqBoot"` + IsDeveloper valueTypes.Bool `json:"is_developer" PointId:"is_developer" PointUpdateFreq:"UpdateFreqBoot"` + IsG2point5Module valueTypes.Bool `json:"is_g2point5_module" PointId:"is_g2point5_module" PointUpdateFreq:"UpdateFreqBoot"` + IsInit valueTypes.Bool `json:"is_init" PointId:"is_init" PointUpdateFreq:"UpdateFreqBoot"` + IsSecond valueTypes.Bool `json:"is_second" PointId:"is_second" PointUpdateFreq:"UpdateFreqBoot"` + IsSupportParamset valueTypes.Bool `json:"is_support_paramset" PointId:"is_support_paramset" PointUpdateFreq:"UpdateFreqBoot"` + NodeTimestamps interface{} `json:"node_timestamps" PointId:"node_timestamps"` + OwnerAlarmCount valueTypes.Count `json:"owner_alarm_count" PointId:"owner_alarm_count" PointUpdateFreq:"UpdateFreqTotal"` + OwnerDevFaultStatus valueTypes.Integer `json:"owner_dev_fault_status" PointId:"owner_dev_fault_status" PointUpdateFreq:"UpdateFreqInstant"` + OwnerFaultCount valueTypes.Count `json:"owner_fault_count" PointId:"owner_fault_count" PointUpdateFreq:"UpdateFreqTotal"` + PointData []PointStruct `json:"point_data" PointNameFromChild:"PointID"` + Points interface{} `json:"points" PointId:"points"` PsTimezoneInfo struct { - IsDst valueTypes.Bool `json:"is_dst"` - TimeZone valueTypes.String `json:"time_zone"` + IsDst valueTypes.Bool `json:"is_dst" PointUpdateFreq:"UpdateFreqInstant"` + TimeZone valueTypes.String `json:"time_zone" PointUpdateFreq:"UpdateFreqInstant"` } `json:"psTimezoneInfo"` - PsID valueTypes.Integer `json:"ps_id" PointId:"ps_id"` - PsKey valueTypes.PsKey `json:"ps_key" PointId:"ps_key"` - RelState valueTypes.Integer `json:"rel_state" PointId:"rel_state"` - Sn valueTypes.String `json:"sn" PointId:"sn"` + PsID valueTypes.Integer `json:"ps_id" PointId:"ps_id" PointUpdateFreq:"UpdateFreqBoot"` + PsKey valueTypes.PsKey `json:"ps_key" PointId:"ps_key" PointUpdateFreq:"UpdateFreqBoot"` + RelState valueTypes.Integer `json:"rel_state" PointId:"rel_state" PointUpdateFreq:"UpdateFreqInstant"` + Sn valueTypes.String `json:"sn" PointId:"sn" PointName:"Serial Number" PointUpdateFreq:"UpdateFreqBoot"` StringAmount valueTypes.Integer `json:"string_amount" PointId:"string_amount"` - TypeName valueTypes.String `json:"type_name" PointId:"type_name"` - UnitName valueTypes.String `json:"unit_name" PointId:"unit_name"` - UUID valueTypes.Integer `json:"uuid" PointId:"uuid"` - UUIDIndexCode valueTypes.String `json:"uuid_index_code" PointId:"uuid_index_code"` - } `json:"pageList"` + TypeName valueTypes.String `json:"type_name" PointId:"type_name" PointUpdateFreq:"UpdateFreqBoot"` + UnitName valueTypes.String `json:"unit_name" PointId:"unit_name" PointUpdateFreq:"UpdateFreqBoot"` + UUID valueTypes.Integer `json:"uuid" PointId:"uuid" PointUpdateFreq:"UpdateFreqBoot"` // Referenced by DeviceArea + UUIDIndexCode valueTypes.String `json:"uuid_index_code" PointId:"uuid_index_code" PointUpdateFreq:"UpdateFreqBoot"` // Referenced by DeviceArea + } `json:"pageList" PointNameFromChild:"PsKey" PointSliceDateFormat:""` RowCount valueTypes.Integer `json:"rowCount" PointIgnore:"true"` } -type PointData []PointStruct type PointStruct struct { - CodeID valueTypes.Integer `json:"code_id"` - CodeIDOrderID valueTypes.String `json:"code_id_order_id"` - CodeName valueTypes.String `json:"code_name"` - DevPointLastUpdateTime valueTypes.DateTime `json:"dev_point_last_update_time"` - IsPlatformDefaultUnit valueTypes.Bool `json:"is_platform_default_unit"` - IsShow valueTypes.Bool `json:"is_show"` - OrderID valueTypes.Integer `json:"order_id"` - OrderNum valueTypes.Integer `json:"order_num"` - PointGroupID valueTypes.Integer `json:"point_group_id"` - PointGroupIDOrderID valueTypes.Integer `json:"point_group_id_order_id"` - PointGroupName valueTypes.String `json:"point_group_name"` - PointID valueTypes.Integer `json:"point_id"` - PointName valueTypes.String `json:"point_name"` - PointSign valueTypes.String `json:"point_sign"` - Relate valueTypes.Integer `json:"relate"` - TimeStamp valueTypes.DateTime `json:"time_stamp"` - Unit valueTypes.String `json:"unit"` - ValIsFixd valueTypes.Bool `json:"val_is_fixd"` - ValidSize valueTypes.Integer `json:"valid_size"` - Value valueTypes.Float `json:"value"` - ValueDescription valueTypes.String `json:"value_description"` + CodeID valueTypes.Integer `json:"code_id" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + CodeIDOrderID valueTypes.String `json:"code_id_order_id" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + CodeName valueTypes.String `json:"code_name" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + DevPointLastUpdateTime valueTypes.DateTime `json:"dev_point_last_update_time" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreq5Mins"` + IsPlatformDefaultUnit valueTypes.Bool `json:"is_platform_default_unit" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + IsShow valueTypes.Bool `json:"is_show" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + OrderID valueTypes.Integer `json:"order_id" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + OrderNum valueTypes.Integer `json:"order_num" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + PointGroupID valueTypes.Integer `json:"point_group_id" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + PointGroupIDOrderID valueTypes.Integer `json:"point_group_id_order_id" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + PointName valueTypes.String `json:"point_name" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + PointSign valueTypes.String `json:"point_sign" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + Relate valueTypes.Integer `json:"relate" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + ValIsFixd valueTypes.Bool `json:"val_is_fixd" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + ValidSize valueTypes.Integer `json:"valid_size" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + Value valueTypes.Float `json:"value" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUnitFrom:"Unit" PointUpdateFreq:"UpdateFreq5Mins"` + ValueDescription valueTypes.String `json:"value_description" PointGroupNameFrom:"PointGroupName" PointTimestampFrom:"TimeStamp" PointUpdateFreq:"UpdateFreqBoot"` + + PointID valueTypes.PointId `json:"point_id" PointIgnore:"true" PointUpdateFreq:"UpdateFreqBoot"` + PointGroupName valueTypes.String `json:"point_group_name" PointIgnore:"true" PointUpdateFreq:"UpdateFreqBoot"` + TimeStamp valueTypes.DateTime `json:"time_stamp" PointIgnore:"true" PointUpdateFreq:"UpdateFreq5Mins"` + Unit valueTypes.String `json:"unit" PointIgnore:"true" PointUpdateFreq:"UpdateFreqBoot"` } func (e *ResultData) IsValid() error { @@ -175,8 +175,8 @@ func (e *ResultData) IsValid() error { return err } -func (e *ResultData) GetDataByName(name string) PointData { - var ret PointData +func (e *ResultData) GetDataByName(name string) []PointStruct { + var ret []PointStruct for range Only.Once { i := len(e.PageList) if i == 0 { @@ -236,128 +236,66 @@ func (e *EndPoint) GetData() api.DataMap { // var TotalEnergyConsumption VirtualPointStruct pkg := apiReflect.GetName("", *e) - name := api.JoinWithDots(0, "", pkg, e.Request.PsId) + // name := api.JoinWithDots(0, "", pkg) // , e.Request.PsId) + dt := valueTypes.NewDateTime(valueTypes.Now) + entries.StructToPoints(e.Response.ResultData, pkg, e.Request.PsId.String(), dt) - entries.StructToPoints(e.Response.ResultData, name, e.Request.PsId.String(), valueTypes.NewDateTime("")) - - for _, d := range e.Response.ResultData.PageList { - name2 := api.JoinWithDots(0, "", pkg, d.PsKey) - entries.StructToPoints(d, name2, d.PsKey.Value(), valueTypes.NewDateTime("")) - - for _, p := range d.PointData { - pid := valueTypes.SetPointIdValue(p.PointID.Value()) - uv := valueTypes.SetUnitValueFloat(p.Value.Value(), p.Unit.Value(), "") - // name2 := fmt.Sprintf("%s.PointData.%s", name, pid) - // name3 := fmt.Sprintf("%s.PointData", name2) - entries.AddUnitValue(name2, d.PsKey.Value(), pid, p.PointName.Value(), p.PointGroupName.Value(), p.TimeStamp, uv) - - // Handle virtual results. - // switch pid { - // case "13126": - // // BatteryChargingPower - // entries["PVPowerToBattery"] = entries[pid] - // case "13150": - // // BatteryDischargingPower - // entries["BatteryPowerToLoad"] = entries[pid] - // case "13121": - // // TotalExportActivePower - // entries["PVPowerToGrid"] = entries[pid] - // case "13149": - // // PurchasedPower - // entries["GridPowerToLoad"] = entries[pid] - // case "13003": - // // TotalDcPower - // entries["PVPower"] = addVirtualAlias(entries[pid], "pv_power", "PV Power") - // case "13119": - // // TotalLoadActivePower - // entries["LoadPower"] = addVirtualAlias(entries[pid], "load_power", "Load Power") - // - // // addVirtualAlias(entries[pid], "FOO", "FOO") - // - // case "13112": - // // Daily PV Yield - // entries["DailyPvEnergy"] = addVirtualAlias(entries["DailyPvEnergy"], "daily_pv_energy", "Daily PV Energy") - // case "13174": - // // DailyBatteryChargingEnergyFromPv - // entries["YieldBatteryCharge"] = addVirtualAlias(entries[pid], "pv_battery_charge", "PV Battery Charge") - // case "13029": - // // DailyBatteryDischargingEnergy - // entries["DailyBatteryDischargingEnergy"] = entries[pid] - // case "13122": - // // entries["DailyFeedInEnergy"] = addVirtualAlias(entries[pid], "pv_feed_in", "PV Feed In") - // // @TODO - This may differ from DailyFeedInEnergyPv - // case "13173": - // // DailyFeedInEnergyPv - // entries["YieldFeedIn"] = addVirtualAlias(entries[pid], "pv_feed_in", "PV Feed In") - // case "13147": - // // DailyPurchasedEnergy - // entries["DailyPurchasedEnergy"] = addVirtualAlias(entries[pid], "daily_purchased_energy", "Daily Purchased Energy") - // - // case "13116": - // // DailyLoadEnergyConsumptionFromPv - // entries["YieldSelfConsumption"] = addVirtualAlias(entries[pid], "pv_self_consumption", "PV Self Consumption") - // case "13134": - // // TotalPvYield - // entries["TotalPvYield"] = addVirtualAlias(entries[pid], "pv_total_yield", "PV Total Yield") - // - // case "13199": - // // Daily Load Energy Consumption - // entries["DailyTotalLoad"] = addVirtualAlias(entries[pid], "daily_total_energy", "Daily Total Energy") - // - // case "13130": - // // Total Load Energy Consumption - // entries["TotalEnergyConsumption"] = addVirtualAlias(entries[pid], "total_energy_consumption", "Total Energy Consumption" - // } - } - } - - if len(entries.DataPoints) == 0 { + if len(entries.Map) == 0 { break } - // TotalDcPower - entries.FromRefAddAlias("p13003", api.VirtualPsId, "power_pv", "") - // BatteryChargingPower - entries.FromRefAddAlias("p13126", api.VirtualPsId, "battery_charge_power", "") - // BatteryDischargingPower - entries.FromRefAddAlias("p13150", api.VirtualPsId, "battery_discharge_power", "") - // TotalExportActivePower - entries.FromRefAddAlias("p13121", api.VirtualPsId, "power_pv_to_grid", "") + e.GetEnergyStorageSystem(entries) + e.GetCommunicationModule(entries) + e.GetBattery(entries) + } - // TotalLoadActivePower - entries.FromRefAddAlias("p13119", api.VirtualPsId, "power_load", "") + return entries +} - // PurchasedPower - entries.FromRefAddAlias("p13149", api.VirtualPsId, "power_grid_to_load", "") +func (e *EndPoint) GetEnergyStorageSystem(entries api.DataMap) { - // Daily PV Yield - entries.FromRefAddAlias("p13112", api.VirtualPsId, "daily_pv_energy", "") - // DailyPvEnergy := entries.getFloatValue("DailyTotalLoad") - entries.getFloatValue("DailyPurchasedEnergy") - // DailyBatteryChargingEnergyFromPv - entries.FromRefAddAlias("p13174", api.VirtualPsId, "pv_battery_charge_energy", "") - // DailyBatteryDischargingEnergy - entries.FromRefAddAlias("p13029", api.VirtualPsId, "battery_discharge", "") + for range Only.Once { + // // Used for virtual entries. + // // 0 - sungrow_battery_charging_power + // var PVPowerToBattery VirtualPointStruct + // + // // sensor.sungrow_battery_discharging_power + // var BatteryPowerToLoad VirtualPointStruct + // + // // 0 - sensor.sungrow_total_export_active_power + // var PVPowerToGrid VirtualPointStruct + // + // // sensor.sungrow_purchased_power + // var GridPowerToLoad VirtualPointStruct + // + // // 0 - sensor.sungrow_daily_battery_charging_energy_from_pv + // var YieldBatteryCharge VirtualPointStruct + // // var DailyBatteryChargingEnergy VirtualPointStruct + // + // // sensor.sungrow_daily_battery_discharging_energy + // var DailyBatteryDischargingEnergy VirtualPointStruct + // + // // 0 - sensor.sungrow_daily_feed_in_energy_pv + // var YieldFeedIn VirtualPointStruct + // + // // sensor.sungrow_daily_purchased_energy + // var DailyPurchasedEnergy VirtualPointStruct + // + // var PVPower VirtualPointStruct + // + // var LoadPower VirtualPointStruct + // + // var YieldSelfConsumption VirtualPointStruct + // // var DailyFeedInEnergy VirtualPointStruct + // var TotalPvYield VirtualPointStruct + // + // var DailyTotalLoad VirtualPointStruct + // + // var TotalEnergyConsumption VirtualPointStruct - // @TODO - This may differ from DailyFeedInEnergyPv - // entries["DailyFeedInEnergy"] = entries.AddVirtualAliasFromRef("13122", "pv_feed_in", "PV Feed In") - - // DailyFeedInEnergyPv - entries.FromRefAddAlias("p13173", api.VirtualPsId, "pv_feed_in", "") - // DailyPurchasedEnergy - entries.FromRefAddAlias("p13147", api.VirtualPsId, "daily_purchased_energy", "") - // DailyLoadEnergyConsumptionFromPv - entries.FromRefAddAlias("p13116", api.VirtualPsId, "pv_self_consumption", "") - // TotalPvYield - entries.FromRefAddAlias("p13134", api.VirtualPsId, "pv_total_yield", "") - // Daily Load Energy Consumption - entries.FromRefAddAlias("p13199", api.VirtualPsId, "daily_total_energy", "") - // Total Load Energy Consumption - entries.FromRefAddAlias("p13130", api.VirtualPsId, "total_energy_consumption", "") - // entries.AddPointFromRef(api.Point{ Id:"queryDeviceList.p13130" }, api.Point{ PsKey:api.VirtualPsId, Id:"total_energy_consumption" }) - - // entries.CopyEntry("p13130").CreateAlias() - // entries.GetEntry(api.Point{PsKey:psId, Id:"total_income", Unit:p.TotalIncome.Unit, Type:api.PointTypeTotal}, now, p.TotalIncome.Value) + pkg := apiReflect.GetName("", *e) + var devices []string /* PVPower - TotalDcPower PVPowerToBattery - BatteryChargingPower @@ -376,86 +314,392 @@ func (e *EndPoint) GetData() api.DataMap { YieldBatteryCharge - DailyBatteryChargingEnergyFromPv YieldFeedIn - DailyFeedInEnergyPv */ + for _, device := range e.Response.ResultData.PageList { + if !device.DeviceType.Match(api.DeviceNameEnergyStorageSystem) { + // Only looking for a Solar Storage System. + continue + } + devices = append(devices, device.PsKey.String()) + // if p.PointID.Match(13003) { + // } + } - // Add virtual entries. - // ts := ret.Entries[0].Date - // var value valueTypes.Float + // Points are in an array. So manually add virtuals instead of using the structure. + for _, device := range devices { + // fmt.Printf("endpoint: %s\n", device) + dstEndpoint := "virtual." + device + srcEndpoint := fmt.Sprintf("%s.%s", pkg, device) - entries.FromRefAddFloat("pv_self_consumption", - api.VirtualPsId,"pv_daily_yield", "", - entries.GetFloatValue("pv_self_consumption", api.LastEntry) + entries.GetFloatValue("pv_battery_charge_energy", api.LastEntry) + entries.GetFloatValue("pv_feed_in", api.LastEntry)) + // BatteryChargingPower + battery_charge_power := entries.CopyPoint(srcEndpoint + ".p13126.value", dstEndpoint, "battery_charge_power", "") - entries.FromRefAddFloat("daily_pv_energy", - api.VirtualPsId,"pv_self_consumption_percent", "", - entries.GetPercent("pv_self_consumption", "daily_pv_energy", api.LastEntry)) - entries.FromRefAddFloat("daily_pv_energy", - api.VirtualPsId,"pv_battery_charge_percent", "", - entries.GetPercent("pv_battery_charge_energy", "daily_pv_energy", api.LastEntry)) - entries.FromRefAddFloat("daily_pv_energy", - api.VirtualPsId,"pv_feed_in_percent", "", - entries.GetPercent("pv_feed_in", "daily_pv_energy", api.LastEntry)) + // BatteryDischargingPower + battery_discharge_power := entries.CopyPoint(srcEndpoint + ".p13150.value", dstEndpoint, "battery_discharge_power", "") - // @TODO - Add this calculation. - DailyPvEnergy := entries.GetFloatValue("daily_total_energy", api.LastEntry) - entries.GetFloatValue("daily_purchased_energy", api.LastEntry) - // fmt.Sprintf("%f", DailyPvEnergy) - entries.FromRefAddFloat("daily_total_energy", - api.VirtualPsId,"daily_pv_energy_percent", "", - api.GetPercent(DailyPvEnergy, entries.GetValue("daily_total_energy", api.LastEntry))) - entries.FromRefAddFloat("daily_total_energy", - api.VirtualPsId,"daily_purchased_energy_percent", "", - entries.GetPercent("daily_purchased_energy", "daily_total_energy", api.LastEntry)) + // Daily PV Yield + daily_pv_energy := entries.CopyPoint(srcEndpoint + ".p13112.value", dstEndpoint, "daily_pv_energy", "") - entries.FromRefAddFloat("power_pv", - api.VirtualPsId,"power_pv_to_load", "", - entries.GetFloatValue("power_pv", api.LastEntry) - entries.GetFloatValue("battery_charge_power", api.LastEntry) - entries.GetFloatValue("power_pv_to_grid", api.LastEntry)) + // DailyBatteryChargingEnergyFromPv + pv_battery_charge_energy := entries.CopyPoint(srcEndpoint + ".p13174.value", dstEndpoint, "pv_battery_charge_energy", "") - // Battery - entries.FromRefAddFloat("battery_charge_power", - api.VirtualPsId,"power_battery", "", - entries.LowerUpper("battery_discharge_power", "battery_charge_power", api.LastEntry)) - entries.FromRefAddFloat("battery_charge_power", - api.VirtualPsId,"power_pv_to_battery", "", - entries.GetFloatValue("battery_charge_power", api.LastEntry)) - entries.FromRefAddFloat("battery_discharge_power", - api.VirtualPsId,"power_battery_to_load", "", - entries.GetFloatValue("battery_charge_power", api.LastEntry)) - entries.FromRefAddFloat("battery_charge_power", - api.VirtualPsId,"power_battery_to_grid", "", - 0.0) + // DailyBatteryDischargingEnergy + battery_discharge := entries.CopyPoint(srcEndpoint + ".p13029.value", dstEndpoint, "battery_discharge", "") - // Grid - entries.FromRefAddFloat("power_grid_to_load", - api.VirtualPsId,"power_grid", "", - entries.LowerUpper("power_pv_to_grid", "power_grid_to_load", api.LastEntry)) - entries.FromRefAddFloat("power_grid_to_load", - api.VirtualPsId,"power_grid_to_battery", "", - 0.0) + // DailyFeedInEnergy - @TODO - This may differ from DailyFeedInEnergyPv + _ = entries.CopyPoint(srcEndpoint + ".p13122.value", dstEndpoint, "pv_feed_in2", "") + // fmt.Println(pv_feed_in2) + + // DailyFeedInEnergyPv + pv_feed_in := entries.CopyPoint(srcEndpoint + ".p13173.value", dstEndpoint, "pv_feed_in", "") + + // DailyPurchasedEnergy + daily_purchased_energy := entries.CopyPoint(srcEndpoint + ".p13147.value", dstEndpoint, "daily_purchased_energy", "") + + // DailyLoadEnergyConsumptionFromPv + pv_self_consumption := entries.CopyPoint(srcEndpoint + ".p13116.value", dstEndpoint, "pv_self_consumption", "") + + // TotalPvYield + _ = entries.CopyPoint(srcEndpoint + ".p13134.value", dstEndpoint, "pv_total_yield", "") + // fmt.Println(pv_total_yield) + + // Daily Load Energy Consumption + daily_total_energy := entries.CopyPoint(srcEndpoint + ".p13199.value", dstEndpoint, "daily_total_energy", "") + + // Total Load Energy Consumption + _ = entries.CopyPoint(srcEndpoint + ".p13130.value", dstEndpoint, "total_energy_consumption", "") + // fmt.Println(total_energy_consumption) + + pv_daily_yield := entries.CopyDataEntries(*pv_self_consumption, dstEndpoint, "pv_daily_yield", "") + pv_daily_yield.SetFloat(pv_self_consumption.GetFloat() + pv_battery_charge_energy.GetFloat() + pv_feed_in.GetFloat(), "", "") + + pv_self_consumption_percent := entries.CopyDataEntries(*daily_pv_energy, dstEndpoint, "pv_self_consumption_percent", "") + pv_self_consumption_percent.SetFloat(entries.GetPercent(*pv_self_consumption, *daily_pv_energy), "", "") + + battery_energy := entries.CopyDataEntries(*pv_battery_charge_energy, dstEndpoint, "battery_energy", "") + battery_energy.SetFloat(entries.LowerUpper(*pv_battery_charge_energy, *battery_discharge), "", "") + + pv_battery_charge_percent := entries.CopyDataEntries(*daily_pv_energy, dstEndpoint, "pv_battery_charge_percent", "") + pv_battery_charge_percent.SetFloat(entries.LowerUpper(*pv_battery_charge_energy, *daily_pv_energy), "", "") + + pv_feed_in_percent := entries.CopyDataEntries(*daily_pv_energy, dstEndpoint, "pv_feed_in_percent", "") + pv_feed_in_percent.SetFloat(entries.LowerUpper(*pv_feed_in, *daily_pv_energy), "", "") + + daily_pv_energy_percent := entries.CopyDataEntries(*daily_total_energy, dstEndpoint, "daily_pv_energy_percent", "") + DailyPvEnergy := daily_total_energy.GetFloat() - daily_purchased_energy.GetFloat() + daily_pv_energy_percent.SetFloat(api.GetPercent(DailyPvEnergy, daily_total_energy.GetFloat()), "", "") + + daily_purchased_energy_percent := entries.CopyDataEntries(*daily_total_energy, dstEndpoint, "daily_purchased_energy_percent", "") + daily_purchased_energy_percent.SetFloat(entries.LowerUpper(*daily_purchased_energy, *daily_total_energy), "", "") - entries.FromRefAddState("power_pv", api.VirtualPsId,"power_pv_active", "") - entries.FromRefAddState("power_battery", api.VirtualPsId,"power_battery_active", "") - entries.FromRefAddState("power_grid", api.VirtualPsId,"power_grid_active", "") - entries.FromRefAddState("power_load", api.VirtualPsId,"power_load_active", "") + // PV src + power_pv := entries.CopyPoint(srcEndpoint + ".p13003.value", dstEndpoint, "power_pv", "") // TotalDcPower + power_pv_active := entries.CopyDataEntries(*power_pv, dstEndpoint, "power_pv_active", "") + power_pv_active.FloatToState(power_pv_active.GetFloat()) - entries.FromRefAddState("power_pv_to_battery", api.VirtualPsId,"power_pv_to_battery_active", "") - entries.FromRefAddState("power_pv_to_load", api.VirtualPsId,"power_pv_to_load_active", "") - entries.FromRefAddState("power_pv_to_grid", api.VirtualPsId,"power_pv_to_grid_active", "") + power_pv_to_battery := entries.CopyDataEntries(*battery_charge_power, dstEndpoint, "power_pv_to_battery", "") + power_pv_to_battery.SetFloat(battery_charge_power.GetFloat(), "", "") + power_pv_to_battery_active := entries.CopyDataEntries(*power_pv_to_battery, dstEndpoint, "power_pv_to_battery_active", "") + power_pv_to_battery_active.FloatToState(power_pv_to_battery_active.GetFloat()) - entries.FromRefAddState("power_battery_to_load", api.VirtualPsId,"power_battery_to_load_active", "") - entries.FromRefAddState("power_battery_to_grid", api.VirtualPsId,"power_battery_to_grid_active", "") + power_pv_to_grid := entries.CopyPoint(srcEndpoint + ".p13121.value", dstEndpoint, "power_pv_to_grid", "") // TotalExportActivePower + power_pv_to_grid_active := entries.CopyDataEntries(*power_pv_to_grid, dstEndpoint, "power_pv_to_grid_active", "") + power_pv_to_grid_active.FloatToState(power_pv_to_grid_active.GetFloat()) - entries.FromRefAddState("power_grid_to_load", api.VirtualPsId,"power_grid_to_load_active", "") - entries.FromRefAddState("power_grid_to_battery", api.VirtualPsId,"power_grid_to_battery_active", "") + power_pv_to_load := entries.CopyDataEntries(*power_pv, dstEndpoint, "power_pv_to_load", "") + power_pv_to_load.SetFloat(power_pv.GetFloat() - battery_charge_power.GetFloat() - power_pv_to_grid.GetFloat(), "", "") + power_pv_to_load_active := entries.CopyDataEntries(*power_pv_to_load, dstEndpoint, "power_pv_to_load_active", "") + power_pv_to_load_active.FloatToState(power_pv_to_load_active.GetFloat()) - entries.FromRefAddFloat("pv_battery_charge_energy", - api.VirtualPsId, "battery_energy", "", - entries.LowerUpper("pv_battery_charge_energy", "battery_discharge", api.LastEntry)) + // Battery src + power_battery := entries.CopyDataEntries(*battery_charge_power, dstEndpoint, "power_battery", "") + power_battery.SetFloat(entries.LowerUpper(*battery_discharge_power, *battery_charge_power), "", "") + power_battery_active := entries.CopyDataEntries(*power_battery, dstEndpoint, "power_battery_active", "") + power_battery_active.FloatToState(power_battery_active.GetFloat()) - entries.FromRefAddFloat("pv_feed_in", - api.VirtualPsId,"grid_energy", "", - entries.LowerUpper("pv_feed_in", "daily_purchased_energy", api.LastEntry)) + power_battery_to_load := entries.CopyDataEntries(*battery_discharge_power, dstEndpoint, "power_battery_to_load", "") + power_battery_to_load.SetFloat(battery_discharge_power.GetFloat(), "", "") + power_battery_to_load_active := entries.CopyDataEntries(*power_battery_to_load, dstEndpoint, "power_battery_to_load_active", "") + power_battery_to_load_active.FloatToState(power_battery_to_load_active.GetFloat()) + + power_battery_to_grid := entries.CopyDataEntries(*battery_charge_power, dstEndpoint, "power_battery_to_grid", "") + power_battery_to_grid.SetFloat(0.0, "", "") + power_battery_to_grid_active := entries.CopyDataEntries(*power_battery_to_grid, dstEndpoint, "power_battery_to_grid_active", "") + power_battery_to_grid_active.FloatToState(power_battery_to_grid_active.GetFloat()) + + + // Grid src + power_grid_to_load := entries.CopyPoint(srcEndpoint + ".p13149.value", dstEndpoint, "power_grid_to_load", "") // PurchasedPower + power_grid_to_load_active := entries.CopyDataEntries(*power_grid_to_load, dstEndpoint, "power_grid_to_load_active", "") + power_grid_to_load_active.FloatToState(power_grid_to_load_active.GetFloat()) + + power_grid := entries.CopyDataEntries(*power_grid_to_load, dstEndpoint, "power_grid", "") + power_grid.SetFloat(entries.LowerUpper(*power_pv_to_grid, *power_grid_to_load), "", "") + power_grid_active := entries.CopyDataEntries(*power_grid, dstEndpoint, "power_grid_active", "") + power_grid_active.FloatToState(power_grid_active.GetFloat()) + + power_grid_to_battery := entries.CopyDataEntries(*power_grid_to_load, dstEndpoint, "power_grid_to_battery", "") + power_grid_to_battery.SetFloat(0.0, "", "") + power_grid_to_battery_active := entries.CopyDataEntries(*power_grid_to_battery, dstEndpoint, "power_grid_to_battery_active", "") + power_grid_to_battery_active.FloatToState(power_grid_to_battery_active.GetFloat()) + + grid_energy := entries.CopyDataEntries(*pv_feed_in, dstEndpoint, "grid_energy", "") + grid_energy.SetFloat(entries.LowerUpper(*pv_feed_in, *daily_purchased_energy), "", "") + + + // Load src + power_load := entries.CopyPoint(srcEndpoint + ".p13119.value", dstEndpoint, "power_load", "") // TotalLoadActivePower + power_load_active := entries.CopyDataEntries(*power_load, dstEndpoint, "power_load_active", "") + power_load_active.FloatToState(power_load_active.GetFloat()) + } + + // for _, d := range e.Response.ResultData.PageList { + // name2 := api.JoinWithDots(0, "", pkg, d.PsKey) + // entries.StructToPoints(d, name2, d.PsKey.Value(), valueTypes.NewDateTime("")) + // + // for _, p := range d.PointData { + // pid := valueTypes.SetPointIdValue(p.PointID.Value()) + // uv := valueTypes.SetUnitValueFloat(p.Value.Value(), p.Unit.Value(), "") + // // name2 := fmt.Sprintf("%s.PointData.%s", name, pid) + // // name3 := fmt.Sprintf("%s.PointData", name2) + // entries.AddUnitValue(name2, d.PsKey.Value(), pid, p.PointName.Value(), p.PointGroupName.Value(), p.TimeStamp, uv) + // + // // Handle virtual results. + // // switch pid { + // // case "13126": + // // // BatteryChargingPower + // // entries["PVPowerToBattery"] = entries[pid] + // // case "13150": + // // // BatteryDischargingPower + // // entries["BatteryPowerToLoad"] = entries[pid] + // // case "13121": + // // // TotalExportActivePower + // // entries["PVPowerToGrid"] = entries[pid] + // // case "13149": + // // // PurchasedPower + // // entries["GridPowerToLoad"] = entries[pid] + // // case "13003": + // // // TotalDcPower + // // entries["PVPower"] = addVirtualAlias(entries[pid], "pv_power", "PV Power") + // // case "13119": + // // // TotalLoadActivePower + // // entries["LoadPower"] = addVirtualAlias(entries[pid], "load_power", "Load Power") + // // + // // // addVirtualAlias(entries[pid], "FOO", "FOO") + // // + // // case "13112": + // // // Daily PV Yield + // // entries["DailyPvEnergy"] = addVirtualAlias(entries["DailyPvEnergy"], "daily_pv_energy", "Daily PV Energy") + // // case "13174": + // // // DailyBatteryChargingEnergyFromPv + // // entries["YieldBatteryCharge"] = addVirtualAlias(entries[pid], "pv_battery_charge", "PV Battery Charge") + // // case "13029": + // // // DailyBatteryDischargingEnergy + // // entries["DailyBatteryDischargingEnergy"] = entries[pid] + // // case "13122": + // // // entries["DailyFeedInEnergy"] = addVirtualAlias(entries[pid], "pv_feed_in", "PV Feed In") + // // // @TODO - This may differ from DailyFeedInEnergyPv + // // case "13173": + // // // DailyFeedInEnergyPv + // // entries["YieldFeedIn"] = addVirtualAlias(entries[pid], "pv_feed_in", "PV Feed In") + // // case "13147": + // // // DailyPurchasedEnergy + // // entries["DailyPurchasedEnergy"] = addVirtualAlias(entries[pid], "daily_purchased_energy", "Daily Purchased Energy") + // // + // // case "13116": + // // // DailyLoadEnergyConsumptionFromPv + // // entries["YieldSelfConsumption"] = addVirtualAlias(entries[pid], "pv_self_consumption", "PV Self Consumption") + // // case "13134": + // // // TotalPvYield + // // entries["TotalPvYield"] = addVirtualAlias(entries[pid], "pv_total_yield", "PV Total Yield") + // // + // // case "13199": + // // // Daily Load Energy Consumption + // // entries["DailyTotalLoad"] = addVirtualAlias(entries[pid], "daily_total_energy", "Daily Total Energy") + // // + // // case "13130": + // // // Total Load Energy Consumption + // // entries["TotalEnergyConsumption"] = addVirtualAlias(entries[pid], "total_energy_consumption", "Total Energy Consumption" + // // } + // } + // } + // + // // TotalDcPower + // entries.FromRefAddAlias(pkg + ".1171348_14_1_2.p13003.value", api.VirtualPsId, "power_pv", "") + // // BatteryChargingPower + // entries.FromRefAddAlias("p13126", api.VirtualPsId, "battery_charge_power", "") + // // BatteryDischargingPower + // entries.FromRefAddAlias("13150", api.VirtualPsId, "battery_discharge_power", "") + // // TotalExportActivePower + // entries.FromRefAddAlias("13121", api.VirtualPsId, "power_pv_to_grid", "") + // // TotalLoadActivePower + // entries.FromRefAddAlias("13119", api.VirtualPsId, "power_load", "") + // // PurchasedPower + // entries.FromRefAddAlias("13149", api.VirtualPsId, "power_grid_to_load", "") + // // Daily PV Yield + // entries.FromRefAddAlias("13112", api.VirtualPsId, "daily_pv_energy", "") + // DailyPvEnergy := entries.getFloatValue("DailyTotalLoad") - entries.getFloatValue("DailyPurchasedEnergy") + // // DailyBatteryChargingEnergyFromPv + // entries.FromRefAddAlias("13174", api.VirtualPsId, "pv_battery_charge_energy", "") + // // DailyBatteryDischargingEnergy + // entries.FromRefAddAlias("13029", api.VirtualPsId, "battery_discharge", "") + // + // @TODO - This may differ from DailyFeedInEnergyPv + // entries["DailyFeedInEnergy"] = entries.AddVirtualAliasFromRef("13122", "pv_feed_in", "PV Feed In") + // + // // DailyFeedInEnergyPv + // entries.FromRefAddAlias("13173", api.VirtualPsId, "pv_feed_in", "") + // // DailyPurchasedEnergy + // entries.FromRefAddAlias("13147", api.VirtualPsId, "daily_purchased_energy", "") + // // DailyLoadEnergyConsumptionFromPv + // entries.FromRefAddAlias("13116", api.VirtualPsId, "pv_self_consumption", "") + // // TotalPvYield + // entries.FromRefAddAlias("13134", api.VirtualPsId, "pv_total_yield", "") + // // Daily Load Energy Consumption + // entries.FromRefAddAlias("13199", api.VirtualPsId, "daily_total_energy", "") + // // Total Load Energy Consumption + // entries.FromRefAddAlias("13130", api.VirtualPsId, "total_energy_consumption", "") + // // entries.AddPointFromRef(api.Point{ Id:"queryDeviceList.p13130" }, api.Point{ PsKey:api.VirtualPsId, Id:"total_energy_consumption" }) + // + // entries.CopyEntry("p13130").CreateAlias() + // entries.GetEntry(api.Point{PsKey:psId, Id:"total_income", Unit:p.TotalIncome.Unit, Type:api.PointTypeTotal}, now, p.TotalIncome.Value) + // + // entries.FromRefAddFloat("pv_self_consumption", + // api.VirtualPsId,"pv_daily_yield", "", + // entries.GetFloatValue("pv_self_consumption", api.LastEntry) + entries.GetFloatValue("pv_battery_charge_energy", api.LastEntry) + entries.GetFloatValue("pv_feed_in", api.LastEntry)) + // + // entries.FromRefAddFloat("daily_pv_energy", + // api.VirtualPsId,"pv_self_consumption_percent", "", + // entries.GetPercent("pv_self_consumption", "daily_pv_energy", api.LastEntry)) + // entries.FromRefAddFloat("daily_pv_energy", + // api.VirtualPsId,"pv_battery_charge_percent", "", + // entries.GetPercent("pv_battery_charge_energy", "daily_pv_energy", api.LastEntry)) + // entries.FromRefAddFloat("daily_pv_energy", + // api.VirtualPsId,"pv_feed_in_percent", "", + // entries.GetPercent("pv_feed_in", "daily_pv_energy", api.LastEntry)) + // + // // // @TODO - Add this calculation. + // DailyPvEnergy := entries.GetFloatValue("daily_total_energy", api.LastEntry) - entries.GetFloatValue("daily_purchased_energy", api.LastEntry) + // // fmt.Sprintf("%f", DailyPvEnergy) + // entries.FromRefAddFloat("daily_total_energy", + // api.VirtualPsId,"daily_pv_energy_percent", "", + // api.GetPercent(DailyPvEnergy, entries.GetValue("daily_total_energy", api.LastEntry))) + // entries.FromRefAddFloat("daily_total_energy", + // api.VirtualPsId,"daily_purchased_energy_percent", "", + // entries.GetPercent("daily_purchased_energy", "daily_total_energy", api.LastEntry)) + // + // entries.FromRefAddFloat("power_pv", + // api.VirtualPsId,"power_pv_to_load", "", + // entries.GetFloatValue("power_pv", api.LastEntry) - entries.GetFloatValue("battery_charge_power", api.LastEntry) - entries.GetFloatValue("power_pv_to_grid", api.LastEntry)) + // + // // Battery + // entries.FromRefAddFloat("battery_charge_power", + // api.VirtualPsId,"power_battery", "", + // entries.LowerUpper("battery_discharge_power", "battery_charge_power", api.LastEntry)) + // entries.FromRefAddFloat("battery_charge_power", + // api.VirtualPsId,"power_pv_to_battery", "", + // entries.GetFloatValue("battery_charge_power", api.LastEntry)) + // entries.FromRefAddFloat("battery_discharge_power", + // api.VirtualPsId,"power_battery_to_load", "", + // entries.GetFloatValue("battery_charge_power", api.LastEntry)) + // entries.FromRefAddFloat("battery_charge_power", + // api.VirtualPsId,"power_battery_to_grid", "", + // 0.0) + // + // // Grid + // entries.FromRefAddFloat("power_grid_to_load", + // api.VirtualPsId,"power_grid", "", + // entries.LowerUpper("power_pv_to_grid", "power_grid_to_load", api.LastEntry)) + // entries.FromRefAddFloat("power_grid_to_load", + // api.VirtualPsId,"power_grid_to_battery", "", + // 0.0) + // + // entries.FromRefAddFloat("pv_battery_charge_energy", + // api.VirtualPsId, "battery_energy", "", + // entries.LowerUpper("pv_battery_charge_energy", "battery_discharge", api.LastEntry)) + // + // entries.FromRefAddFloat("pv_feed_in", + // api.VirtualPsId,"grid_energy", "", + // entries.LowerUpper("pv_feed_in", "daily_purchased_energy", api.LastEntry)) + // + // entries.FromRefAddState("power_pv", api.VirtualPsId,"power_pv_active", "") + // entries.FromRefAddState("power_battery", api.VirtualPsId,"power_battery_active", "") + // entries.FromRefAddState("power_grid", api.VirtualPsId,"power_grid_active", "") + // entries.FromRefAddState("power_load", api.VirtualPsId,"power_load_active", "") + // + // entries.FromRefAddState("power_pv_to_battery", api.VirtualPsId,"power_pv_to_battery_active", "") + // entries.FromRefAddState("power_pv_to_load", api.VirtualPsId,"power_pv_to_load_active", "") + // entries.FromRefAddState("power_pv_to_grid", api.VirtualPsId,"power_pv_to_grid_active", "") + // + // entries.FromRefAddState("power_battery_to_load", api.VirtualPsId,"power_battery_to_load_active", "") + // entries.FromRefAddState("power_battery_to_grid", api.VirtualPsId,"power_battery_to_grid_active", "") + // + // entries.FromRefAddState("power_grid_to_load", api.VirtualPsId,"power_grid_to_load_active", "") + // entries.FromRefAddState("power_grid_to_battery", api.VirtualPsId,"power_grid_to_battery_active", "") + } +} + +func (e *EndPoint) GetCommunicationModule(entries api.DataMap) { + + for range Only.Once { + pkg := apiReflect.GetName("", *e) + + var devices []string + for _, device := range e.Response.ResultData.PageList { + if !device.DeviceType.Match(api.DeviceNameCommunicationModule) { + // Only looking for a Communication Module. + continue + } + devices = append(devices, device.PsKey.String()) + } + + // Points are in an array. So manually add virtuals instead of using the structure. + for _, device := range devices { + // fmt.Printf("endpoint: %s\n", device) + dstEndpoint := "virtual." + device + srcEndpoint := fmt.Sprintf("%s.%s", pkg, device) + + // WLAN Signal Strength + _ = entries.CopyPoint(srcEndpoint + ".p23014.value", dstEndpoint, "wlan_signal_strength", "") + } + } +} + +func (e *EndPoint) GetBattery(entries api.DataMap) { + + for range Only.Once { + pkg := apiReflect.GetName("", *e) + + var devices []string + for _, device := range e.Response.ResultData.PageList { + if !device.DeviceType.Match(api.DeviceNameBattery) { + // Only looking for a Battery. + continue + } + devices = append(devices, device.PsKey.String()) + } + + // Points are in an array. So manually add virtuals instead of using the structure. + for _, device := range devices { + // fmt.Printf("endpoint: %s\n", device) + dstEndpoint := "virtual." + device + srcEndpoint := fmt.Sprintf("%s.%s", pkg, device) + + // Battery Voltage + _ = entries.CopyPoint(srcEndpoint + ".p58601.value", dstEndpoint, "battery_voltage", "") + // Battery Current + _ = entries.CopyPoint(srcEndpoint + ".p58602.value", dstEndpoint, "battery_current", "") + // Battery Temperature + _ = entries.CopyPoint(srcEndpoint + ".p58603.value", dstEndpoint, "battery_temperature", "") + // Battery Level + _ = entries.CopyPoint(srcEndpoint + ".p58604.value", dstEndpoint, "battery_level", "") + // Battery Health (SOH) + _ = entries.CopyPoint(srcEndpoint + ".p58605.value", dstEndpoint, "battery_health", "") + // Total Battery Charging Energy + _ = entries.CopyPoint(srcEndpoint + ".p58606.value", dstEndpoint, "total_battery_charging_energy", "") + // Total Battery Discharging Energy + _ = entries.CopyPoint(srcEndpoint + ".p58607.value", dstEndpoint, "total_battery_discharging_energy", "") + } } - - return entries } diff --git a/iSolarCloud/AppService/queryDeviceListForApp/data.go b/iSolarCloud/AppService/queryDeviceListForApp/data.go index 749f9d486..71ea5ef07 100644 --- a/iSolarCloud/AppService/queryDeviceListForApp/data.go +++ b/iSolarCloud/AppService/queryDeviceListForApp/data.go @@ -6,7 +6,6 @@ import ( "GoSungrow/iSolarCloud/api/valueTypes" "fmt" "github.com/MickMake/GoUnify/Only" - "strings" ) const Url = "/v1/devService/queryDeviceListForApp" @@ -33,8 +32,8 @@ type ResultData struct { ConnectState valueTypes.Integer `json:"connect_state"` DataFlag valueTypes.Integer `json:"data_flag"` DataFlagDetail valueTypes.Integer `json:"data_flag_detail"` - DevFaultStatus string `json:"dev_fault_status"` - DevStatus string `json:"dev_status"` + DevFaultStatus valueTypes.Integer `json:"dev_fault_status"` + DevStatus valueTypes.Integer `json:"dev_status"` DeviceArea valueTypes.String `json:"device_area"` DeviceCode valueTypes.Integer `json:"device_code"` DeviceFactoryDate valueTypes.DateTime `json:"device_factory_date"` @@ -44,12 +43,12 @@ type ResultData struct { DeviceModelID valueTypes.Integer `json:"device_model_id"` DeviceName valueTypes.String `json:"device_name"` DeviceProSn valueTypes.String `json:"device_pro_sn"` - DeviceState string `json:"device_state"` - DeviceSubType interface{} `json:"device_sub_type"` - DeviceSubTypeName interface{} `json:"device_sub_type_name"` + DeviceState valueTypes.Integer `json:"device_state"` + DeviceSubType interface{} `json:"device_sub_type"` + DeviceSubTypeName interface{} `json:"device_sub_type_name"` DeviceType valueTypes.Integer `json:"device_type"` FactoryName valueTypes.String `json:"factory_name"` - InstallerDevFaultStatus string `json:"installer_dev_fault_status"` + InstallerDevFaultStatus valueTypes.Integer `json:"installer_dev_fault_status"` InverterModelType valueTypes.Integer `json:"inverter_model_type"` IsCountryCheck valueTypes.Bool `json:"is_country_check"` IsHasFunctionEnum valueTypes.Bool `json:"is_has_function_enum"` @@ -61,18 +60,18 @@ type ResultData struct { IsSecond valueTypes.Bool `json:"is_second"` IsThirdParty valueTypes.Bool `json:"is_third_party"` ModuleUUID valueTypes.Integer `json:"module_uuid"` - OwnerDevFaultStatus string `json:"owner_dev_fault_status"` - P24 interface{} `json:"p24"` - Posx interface{} `json:"posx"` - Posy interface{} `json:"posy"` - PsID valueTypes.Integer `json:"ps_id"` + OwnerDevFaultStatus valueTypes.Integer `json:"owner_dev_fault_status"` + P24 interface{} `json:"p24"` + Posx interface{} `json:"posx"` + Posy interface{} `json:"posy"` + PsId valueTypes.Integer `json:"ps_id"` PsKey valueTypes.PsKey `json:"ps_key"` RelState valueTypes.Integer `json:"rel_state"` Sn valueTypes.String `json:"sn" PointName:"Serial Number"` TypeName valueTypes.String `json:"type_name"` UUID valueTypes.Integer `json:"uuid"` - } `json:"pageList"` - RowCount valueTypes.Integer `json:"rowCount"` + } `json:"pageList" PointNameFromChild:"PsKey"` + RowCount valueTypes.Integer `json:"rowCount" PointIgnore:"true"` } func (e *ResultData) IsValid() error { @@ -86,34 +85,13 @@ func (e *ResultData) IsValid() error { return err } -//type DecodeResultData ResultData -// -//func (e *ResultData) UnmarshalJSON(data []byte) error { -// var err error -// -// for range Only.Once { -// if len(data) == 0 { -// break -// } -// var pd DecodeResultData -// -// // Store ResultData -// _ = json.Unmarshal(data, &pd) -// e.Dummy = pd.Dummy -// } -// -// 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(), valueTypes.NewDateTime("")) - } + dt := valueTypes.NewDateTime(valueTypes.Now) + entries.StructToPoints(e.Response.ResultData, pkg, "", dt) } return entries diff --git a/iSolarCloud/AppService/queryMutiPointDataList/data.go b/iSolarCloud/AppService/queryMutiPointDataList/data.go index e62ab8cc6..04cae017e 100644 --- a/iSolarCloud/AppService/queryMutiPointDataList/data.go +++ b/iSolarCloud/AppService/queryMutiPointDataList/data.go @@ -197,7 +197,7 @@ func (e *EndPoint) GetPointDataTable(points api.TemplatePoints) output.Table { _ = table.AddRow( tim.Key.PrintFull(), fmt.Sprintf("%s.%s", deviceName, pointId), - gp.Description, + gp.Name, tim.Value, gp.Unit, ) diff --git a/iSolarCloud/api/apiReflect/reflect.go b/iSolarCloud/api/apiReflect/reflect.go index 6cc274c3c..ab1ccee2f 100644 --- a/iSolarCloud/api/apiReflect/reflect.go +++ b/iSolarCloud/api/apiReflect/reflect.go @@ -8,52 +8,102 @@ import ( "errors" "fmt" "hash/fnv" - "runtime" - "strconv" - "path/filepath" "reflect" + "runtime" + "strconv" "strings" + "time" ) -type DataStructureMap map[string]DataStructure +type DataStructures struct { + Map map[string]DataStructure +} type DataStructure struct { - Json string - PointId string // PointType string - PointUnit string - PointUnitFrom string - PointDevice string - PointName string - PointTimeSpan string - PointValueType string - PointAlias string - PointIgnore bool - PointGroupName string + Json string + PointId string + PointParentId string + PointUnit string + PointUnitFrom string + PointTimestamp time.Time + PointName string + PointUpdateFreq string + PointValueType string + PointAliasTo string + PointIgnore bool + PointGroupName string + PointGroupNameFrom string + PointTimestampFrom string - Value interface{} - ValueType string - ValueKind string - Endpoint string + Value interface{} + ValueType string + ValueKind string + Endpoint string } const ( - PointId = "PointId" // Point id in the form p\d+ or \d+ - // PointType = "PointType" // Type of point: energy, date, battery, temperature. - PointUnit = "PointUnit" // Units: Wh, kWh, C, h. - PointUnitFrom = "PointUnitFrom" // Get units from another point. - PointDevice = "PointDevice" // Associated device to point. - PointName = "PointName" // Human name of point. - PointTimeSpan = "PointTimeSpan" // Timespan Total, Yearly, Monthly, Day. - PointValueType = "PointValueType" // - PointAlias = "PointAlias" // Alias this point to another entry. - PointIgnore = "PointIgnore" // Ignore this point. - PointGroupName = "PointGroupName" // Point group name. + PointId = "PointId" // Point id in the form p\d+ or \d+ + PointUnit = "PointUnit" // Units: Wh, kWh, C, h. + PointUnitFrom = "PointUnitFrom" // Get PointUnit from another field structure. + PointParentId = "PointParentId" // Associated parent of point. + PointName = "PointName" // Human-readable name of point. + PointUpdateFreq = "PointUpdateFreq" // Point update frequency - Total, Yearly, Monthly, Day. + PointValueType = "PointValueType" // Value type of point: energy, date, battery, temperature. + PointAliasTo = "PointAliasTo" // Alias this point to another point. + PointAliasFrom = "PointAliasFrom" // Alias this point from another point. + PointIgnore = "PointIgnore" // Ignore this point. + PointGroupName = "PointGroupName" // Point group name. + PointGroupNameFrom = "PointGroupNameFrom" // Get PointGroupName from another field structure. + PointNameFromChild = "PointNameFromChild" // Searches child for field value to use for naming when hitting a slice, (as opposed to using an index). + PointNameFromParent = "PointNameFromParent" // Searches child for field value to use for naming when hitting a slice, (as opposed to using an index). + PointNameDateFormat = "PointNameDateFormat" // Date format when using PointNameFrom, (if the field is a time.Time type). + PointArrayFlatten = "PointArrayFlatten" // Flatten an array into a string. EG: ["one", "two", "three"] + PointTimestampFrom = "PointTimestampFrom" // Pull timestamp from another field structure. ) -func GetPointTags(ref interface{}, name ...string) DataStructureMap { - ret := make(DataStructureMap) +func (dss *DataStructures) Add(name string, ds DataStructure) { + for range Only.Once { + if dss.Map == nil { + dss.Map = make(map[string]DataStructure) + } + // fmt.Printf("DEBUG DataStructures.Add() %s - Kind:'%s' Type:'%s'\n", name, ds.ValueKind, ds.ValueType) + dss.Map[name] = ds + } +} + +func (dss *DataStructures) Exists(name string) bool { + var yes bool + for range Only.Once { + if dss.Map == nil { + break + } + if _, ok := dss.Map[name]; ok { + yes = ok + break + } + } + return yes +} + +func (dss *DataStructures) Append(dsm DataStructures) { + for range Only.Once { + if dss.Map == nil { + dss.Map = make(map[string]DataStructure) + } + // fmt.Printf("Map BEFORE:[%d] (adding %d)\n", len(dss.Map), len(dsm.Map)) + for name, ds := range dsm.Map { + dss.Map[name] = ds + } + // fmt.Printf("Map AFTER:[%d]\n", len(dss.Map)) + } +} + + +func (dss *DataStructures) GetPointTags(parentRef interface{}, ref interface{}, name ...string) DataStructures { + // var ret DataStructures + // ret.Map = make(map[string]DataStructure) for range Only.Once { vo := reflect.ValueOf(ref) @@ -64,22 +114,9 @@ func GetPointTags(ref interface{}, name ...string) DataStructureMap { fieldTo := to.Field(i) fieldVo := vo.Field(i) - pointValueType := fieldTo.Tag.Get(PointValueType) - if valueTypes.IsNil(ref) { - pointValueType = "NIL" - } - - // fmt.Printf("DEBUG: Key[%s]:\tVT:'%s' Kind:'%s' => '%s'\n", - // fieldTo.Name, - // pointValueType, - // fieldVo.Kind(), - // fieldTo.Type.String(), - // ) - - ignore := false - ig := fieldTo.Tag.Get(PointIgnore) - if ig != "" { - ignore = true + if !fieldTo.IsExported() { + fmt.Printf("DEBUG: NOTEXPORTED(%s): Type %s\n", name, fieldTo.Name) + continue } pointJson := fieldTo.Tag.Get("json") @@ -88,111 +125,435 @@ func GetPointTags(ref interface{}, name ...string) DataStructureMap { pointId = pointJson } + // fmt.Printf("DEBUG[%d]: %s.%s: Key[%s]:\tKind:'%s' Type:'%s'\n", + // len(dss.Map), + // strings.Join(name, "."), pointId, + // fieldTo.Name, + // fieldVo.Kind(), + // fieldTo.Type.String(), + // ) + // if strings.Contains(pointId, "actual_energy") || strings.Contains(pointJson, "actual_energy") { + // fmt.Printf("F:%v\n", pointId) + // fmt.Println("") + // } + switch fieldVo.Kind() { - case reflect.Struct: - if valueTypes.IsUnknownStruct(fieldTo, fieldVo) { - n2 := name - n2 = append(n2, pointId) - t2 := GetPointTags(fieldVo.Interface(), n2...) - for k, v := range t2 { - ret[k] = v + case reflect.Uintptr: + fallthrough + case reflect.Complex64: + fallthrough + case reflect.Complex128: + fallthrough + case reflect.Chan: + fallthrough + case reflect.Func: + fallthrough + case reflect.Pointer: + fallthrough + case reflect.UnsafePointer: + fmt.Printf("Unsupported type: '%s.%s' (%s)\n", name, pointId, fieldVo.Type().String()) + continue + + case reflect.Slice: + // Handle slices here. + // Adds more Point* tags - PointNameFromChild, PointNameDateFormat + // Replicates the JoinWithDots 1st and 2nd arguments. + // intSize int, dateFormat string + // fmt.Printf("Kind: %s ##########################################\n", fieldVo.Kind().String()) + pointNameFromChild := fieldTo.Tag.Get(PointNameFromChild) + pointNameFromParent := fieldTo.Tag.Get(PointNameFromParent) + pointNameDateFormat := fieldTo.Tag.Get(PointNameDateFormat) + intSize := valueTypes.SizeOfInt(fieldVo.Len()) + pointArrayFlatten := fieldTo.Tag.Get(PointArrayFlatten) + n2 := append(name, pointId) + + if pointArrayFlatten != "" { + // We want to flatten a slice down to EG "[1, 2, 3]" + endPointName, ds := makeDataStructure(parentRef, fieldTo, fieldVo, name) + ds.Value = valueTypes.AnyToValueString(fieldVo.Interface(), 0, "") + dss.Add(endPointName + "." + ds.PointId, ds) + continue + } + + if valueTypes.IsUnknownStruct(fieldVo.Interface()) { + for si := 0; si < fieldVo.Len(); si++ { + // Are we using an index number for name or field key value? + pn := strconv.Itoa(si) + n3 := append(n2, pn) + if pointNameFromChild != "" { + // PointNameFromChild - In this case points to a field within a CHILD struct. + pn = GetPointNameFrom(fieldVo.Index(si).Interface(), pointNameFromChild, intSize, pointNameDateFormat) + n3 = append(n2[:len(n2) - 1], pn) + } + if pointNameFromParent != "" { + // PointNameFromChild - In this case points to a field within a CHILD struct. + pn = GetPointNameFrom(fieldVo.Interface(), pointNameFromParent, intSize, pointNameDateFormat) + n3 = append(n2[:len(n2) - 1], pn) + } + + dss.GetPointTags(fieldVo.Index(si).Interface(), fieldVo.Index(si).Interface(), n3...) } continue } - case reflect.Slice: - // @TODO - Handle slicing here. - // Will have to add more Point* tags. - // Replicate the JoinWithDots 1st and 2nd arguments. + // Flatten slice for []Integer / []Float objects. + endPointName, ds := makeDataStructure(parentRef, fieldTo, fieldVo, name) + ds.Value = valueTypes.AnyToValueString(fieldVo.Interface(), 0, "") + dss.Add(endPointName + "." + ds.PointId, ds) + + // This commented-out section can handle []Integer fields. + // for si := 0; si < fieldVo.Len(); si++ { + // // Are we using an index number for name or field key value? + // pn := strconv.Itoa(si) + // n3 := append(n2, pn) + // if pointNameFromChild != "" { + // // PointNameFromChild - In this case points to a field within a CHILD struct. + // pn = GetPointNameFrom(fieldVo.Index(si).Interface(), pointNameFromChild, intSize, pointNameDateFormat) + // n3 = append(n2[:len(n2) - 1], pn) + // } + // if pointNameFromParent != "" { + // // PointNameFromChild - In this case points to a field within a CHILD struct. + // pn = GetPointNameFrom(fieldVo.Interface(), pointNameFromParent, intSize, pointNameDateFormat) + // n3 = append(n2[:len(n2) - 1], pn) + // } + // + // if valueTypes.IsUnknownStruct(fieldVo.Index(si).Interface()) { + // dss.GetPointTags(fieldVo.Index(si).Interface(), fieldVo.Index(si).Interface(), n3...) + // continue + // } + // + // // // We want to flatten a slice down to EG "[1, 2, 3]" + // // endPointName, ds := makeDataStructure(parentRef, fieldTo, fieldVo, n2) + // // ds.Value = valueTypes.AnyToValueString(fieldVo.Interface(), 0, "") + // // dss.Add(endPointName + "." + pn, ds) + // endPointName, ds := makeDataStructure(parentRef, fieldTo, fieldVo, n3) + // // ds.Json = pointId + pn + // ds.PointId = pn + // val := fieldVo.Index(si) + // ds.Value = val.Interface() + // dss.Add(endPointName, ds) + // } + continue + + case reflect.Array: + // @TODO - Handle arrays here. + // Adds more Point* tags - PointNameFromChild, PointNameDateFormat + // Replicates the JoinWithDots 1st and 2nd arguments. // intSize int, dateFormat string - // EG: PointSliceIntSize, PointSliceDateFormat - if pointValueType == "" { - pointValueType = reflect.Slice.String() + // fmt.Printf("Kind: %s ##########################################\n", fieldVo.Kind().String()) + pointNameFromChild := fieldTo.Tag.Get(PointNameFromChild) + pointNameFromParent := fieldTo.Tag.Get(PointNameFromParent) + pointNameDateFormat := fieldTo.Tag.Get(PointNameDateFormat) + intSize := valueTypes.SizeOfInt(fieldVo.Len()) + pointArrayFlatten := fieldTo.Tag.Get(PointArrayFlatten) + n2 := append(name, pointId) + + if pointArrayFlatten != "" { + // We want to flatten a slice down to EG "[1, 2, 3]" + endPointName, ds := makeDataStructure(parentRef, fieldTo, fieldVo, name) + ds.Value = valueTypes.AnyToValueString(fieldVo.Interface(), 0, "") + dss.Add(endPointName + "." + ds.PointId, ds) + continue } - case reflect.Invalid: - fallthrough - case reflect.Bool: - fallthrough - case reflect.String: - fallthrough - case reflect.Float32: - fallthrough - case reflect.Float64: - fallthrough - case reflect.Int: - fallthrough - case reflect.Int8: - fallthrough - case reflect.Int16: - fallthrough - case reflect.Int32: - fallthrough - case reflect.Int64: - fallthrough - case reflect.Uint: - fallthrough - case reflect.Uint8: - fallthrough - case reflect.Uint16: - fallthrough - case reflect.Uint32: - fallthrough - case reflect.Uint64: - fallthrough - case reflect.Interface: - // Pick up the unassigned types. - if pointValueType == "" { - pointValueType = reflect.Interface.String() + for si := 0; si < fieldVo.Len(); si++ { + // Are we using an index number for name or field key value? + pn := strconv.Itoa(si) + n3 := append(n2, pn) + if pointNameFromChild != "" { + // PointNameFromChild - In this case points to a field within a CHILD struct. + pn = GetPointNameFrom(fieldVo.Index(si).Interface(), pointNameFromChild, intSize, pointNameDateFormat) + n3 = append(n2[:len(n2) - 1], pn) + } + if pointNameFromParent != "" { + // PointNameFromChild - In this case points to a field within a CHILD struct. + pn = GetPointNameFrom(fieldVo.Interface(), pointNameFromParent, intSize, pointNameDateFormat) + n3 = append(n2[:len(n2) - 1], pn) + } + + if valueTypes.IsUnknownStruct(fieldVo.Index(si).Interface()) { + dss.GetPointTags(fieldVo.Index(si).Interface(), fieldVo.Index(si).Interface(), n3...) + continue + } + + // // We want to flatten a slice down to EG "[1, 2, 3]" + // endPointName, ds := makeDataStructure(parentRef, fieldTo, fieldVo, n2) + // ds.Value = valueTypes.AnyToValueString(fieldVo.Interface(), 0, "") + // dss.Add(endPointName + "." + pn, ds) + endPointName, ds := makeDataStructure(parentRef, fieldTo, fieldVo, n3) + // ds.Json = pointId + pn + ds.PointId = pointId + pn + val := fieldVo.Index(si) + ds.Value = val.Interface() + dss.Add(endPointName, ds) } + + // @TODO - Can't quite figure out what to do here. So will just flatten the array. + // for si := 0; si < fieldVo.Len(); si++ { + // // Are we using an index number for name or field key value? + // pn := strconv.Itoa(si) + // n3 := append(name) // , pointId + pn) + // if pointNameFrom != "" { + // pn = GetPointNameFromChild(parentRef, pointNameFrom, intSize, pointNameDateFormat) + // n3 = append(n2[:len(n2) - 1], pn) + // } + // + // endPointName, ds := makeDataStructure(parentRef, fieldTo, fieldVo, n3) + // // ds.Json = pointId + pn + // ds.PointId = pointId + pn + // val := fieldVo.Index(si) + // ds.Value = val.Interface() + // dss.Add(endPointName, ds) + // } + continue + + case reflect.Map: + // fmt.Printf("Kind: %s ##########################################\n", fieldVo.Kind().String()) + n2 := append(name, pointId) + // pointNameFromChild := fieldTo.Tag.Get(PointNameFromChild) + // pointNameFromParent := fieldTo.Tag.Get(PointNameFromParent) + + for _, key := range fieldVo.MapKeys() { + // @TODO - Implement this. + // if pointNameFromChild != "" { + // // PointNameFromChild - In this case points to a field within a CHILD struct. + // pn = GetPointNameFrom(fieldVo.Index(si).Interface(), pointNameFromChild, intSize, pointNameDateFormat) + // n3 = append(n2[:len(n2) - 1], pn) + // } + // if pointNameFromParent != "" { + // // PointNameFromChild - In this case points to a field within a CHILD struct. + // pn = GetPointNameFrom(fieldVo.Interface(), pointNameFromParent, intSize, pointNameDateFormat) + // n3 = append(n2[:len(n2) - 1], pn) + // } + + endPointName, ds := makeDataStructure(fieldVo.Interface(), fieldTo, fieldVo, n2) + ds.Json = key.String() + ds.PointId = key.String() + val := fieldVo.MapIndex(key) + ds.Value = val.Interface() + dss.Add(endPointName + "." + ds.PointId, ds) + } + continue + + case reflect.Struct: + // fmt.Printf("Kind: %s ##########################################\n", fieldVo.Kind().String()) + if valueTypes.IsUnknownStruct(fieldVo.Interface()) { + n2 := append(name, pointId) + dss.GetPointTags(parentRef, fieldVo.Interface(), n2...) + continue + } + + // fmt.Printf("[%s.%s] => %v\n", strings.Join(name, "."), pointId, fieldVo.Interface()) + endPointName, ds := makeDataStructure(parentRef, fieldTo, fieldVo, name) + ds.Value = fieldVo.Interface() + dss.Add(endPointName + "." + ds.PointId, ds) + continue } - if !fieldTo.IsExported() { - fmt.Printf("DEBUG: NOTEXPORTED(%s): %s\n", fieldTo.Name, fieldTo.Tag.Get("json")) + endPointName, ds := makeDataStructure(parentRef, fieldTo, fieldVo, name) + ds.Value = fieldVo.Interface() + dss.Add(endPointName + "." + ds.PointId, ds) + } + } + + return *dss +} + +func GetUnitFrom(ref interface{}, pointUnitFrom string) string { + var ret string + for range Only.Once { + vo := reflect.ValueOf(ref) + if vo.Kind() != reflect.Struct { + break + } + + // Iterate over all available fields, looking for the field name. + for i := 0; i < vo.NumField(); i++ { + if vo.Type().Field(i).Name != pointUnitFrom { continue } - endPointName := strings.Join(name, ".") - pointName := strings.TrimPrefix(endPointName + "." + pointId, ".") - ds := DataStructure { - Json: pointJson, - PointId: pointId, - // PointType: fieldTo.Tag.Get(PointType), - PointUnit: fieldTo.Tag.Get(PointUnit), - PointUnitFrom: fieldTo.Tag.Get(PointUnitFrom), - PointDevice: fieldTo.Tag.Get(PointDevice), - PointName: fieldTo.Tag.Get(PointName), - PointTimeSpan: fieldTo.Tag.Get(PointTimeSpan), - PointValueType: pointValueType, - PointAlias: fieldTo.Tag.Get(PointAlias), - PointGroupName: fieldTo.Tag.Get(PointGroupName), - PointIgnore: ignore, - - Value: fieldVo.Interface(), - ValueType: fieldTo.Type.String(), - ValueKind: fieldVo.Kind().String(), - Endpoint: endPointName, - } - ret[pointName] = ds + // fmt.Printf("GetUnitFrom: %v\n", fieldVo.Interface()) + ret = valueTypes.AnyToValueString(vo.Field(i).Interface(), 0, "") + break } } return ret } -func (dsm *DataStructureMap) GetUnitFrom(ref ...string) string { +func GetGroupNameFrom(ref interface{}, pointGroupNameFrom string) string { var ret string for range Only.Once { - r := strings.Join(ref, ".") - if s, ok := (*dsm)[r]; ok { - ret = s.PointUnit + vo := reflect.ValueOf(ref) + if vo.Kind() != reflect.Struct { + break } - // + // Iterate over all available fields, looking for the field name. + for i := 0; i < vo.NumField(); i++ { + if vo.Type().Field(i).Name != pointGroupNameFrom { + continue + } + + // fmt.Printf("GetGroupNameFrom: %v\n", fieldVo.Interface()) + ret = valueTypes.AnyToValueString(vo.Field(i).Interface(), 0, "") + break + } } + return ret } +func GetTimestampFrom(ref interface{}, pointTimestampFrom string, dateFormat string) time.Time { + var ret time.Time + for range Only.Once { + vo := reflect.ValueOf(ref) + if vo.Kind() != reflect.Struct { + break + } + + // Iterate over all available fields, looking for the field name. + for i := 0; i < vo.NumField(); i++ { + if vo.Type().Field(i).Name != pointTimestampFrom { + continue + } + + // fmt.Printf("GetTimestampFrom: %v\n", fieldVo.Interface()) + foo2 := fmt.Sprintf("%v", vo.Field(i).Interface()) + ret = valueTypes.SetDateTimeString(foo2).Time + break + } + } + + return ret +} + +func GetPointNameFrom(ref interface{}, pointNameFrom string, intSize int, dateFormat string) string { + var ret string + for range Only.Once { + vo := reflect.ValueOf(ref) + if vo.Kind() != reflect.Struct { + break + } + + // Iterate over all available fields, looking for the field name. + for i := 0; i < vo.NumField(); i++ { + if vo.Type().Field(i).Name != pointNameFrom { + continue + } + + // fmt.Printf("GetPointNameFrom: %v\n", fieldVo.Interface()) + ret = valueTypes.AnyToValueString(vo.Field(i).Interface(), intSize, dateFormat) + break + } + } + + return ret +} + +func makeDataStructure(parentRef interface{}, fieldTo reflect.StructField, fieldVo reflect.Value, name []string) (string, DataStructure) { + var endpoint string + var ds DataStructure + + for range Only.Once { + if !fieldTo.IsExported() { + fmt.Printf("DEBUG: NOTEXPORTED(%s): %s\n", fieldTo.Name, fieldTo.Tag.Get("json")) + break + } + + ignore := false + if fieldTo.Tag.Get(PointIgnore) != "" { + ignore = true + } + + // if valueTypes.IsNil(ref) { + // pointValueType = "NIL" + // } + + pointJson := fieldTo.Tag.Get("json") + pointId := fieldTo.Tag.Get(PointId) + if pointId == "" { + pointId = pointJson + } + + pointValueType := fieldTo.Tag.Get(PointValueType) + if pointValueType == "" { + // pointValueType = fieldVo.Kind().String() + } + + pointUnit := fieldTo.Tag.Get(PointUnit) + pointUnitFrom := fieldTo.Tag.Get(PointUnitFrom) + if pointUnitFrom != "" { + pointUnit = GetUnitFrom(parentRef, pointUnitFrom) + } + + pointGroupName := fieldTo.Tag.Get(PointGroupName) + pointGroupNameFrom := fieldTo.Tag.Get(PointGroupNameFrom) + if pointGroupNameFrom != "" { + pointGroupName = GetGroupNameFrom(parentRef, pointGroupNameFrom) + } + + pointTimestamp := time.Now() + pointTimestampFrom := fieldTo.Tag.Get(PointTimestampFrom) + if pointTimestampFrom != "" { + pointTimestamp = GetTimestampFrom(parentRef, pointTimestampFrom, valueTypes.DateTimeLayout) + } + + endpoint = strings.TrimPrefix(strings.Join(name, "."), ".") + + ds = DataStructure { + // PointType: fieldTo.Tag.Get(PointType), + Json: pointJson, + PointId: pointId, + PointParentId: fieldTo.Tag.Get(PointParentId), + + PointUnit: pointUnit, + PointUnitFrom: pointUnitFrom, + + PointTimestamp: pointTimestamp, + PointTimestampFrom: pointTimestampFrom, + + PointGroupName: pointGroupName, + PointGroupNameFrom: pointGroupNameFrom, + + PointName: fieldTo.Tag.Get(PointName), + PointUpdateFreq: fieldTo.Tag.Get(PointUpdateFreq), + PointValueType: pointValueType, + PointAliasTo: fieldTo.Tag.Get(PointAliasTo), + PointIgnore: ignore, + Value: nil, + ValueType: fieldTo.Type.String(), + ValueKind: fieldVo.Kind().String(), + Endpoint: endpoint, + } + } + + return endpoint, ds +} + +// func (dss *DataStructures) GetUnitFrom(ref ...string) string { +// var ret string +// for range Only.Once { +// r := strings.Join(ref, ".") +// if s, ok := dss.Map[r]; ok { +// ret = s.PointUnit +// } +// } +// return ret +// } +// +// func (dss *DataStructures) GetPointGroupNameFrom(ref ...string) string { +// var ret string +// for range Only.Once { +// r := strings.Join(ref, ".") +// if s, ok := dss.Map[r]; ok { +// ret = s.PointUnit +// } +// } +// return ret +// } + // GetArea Return an Area name if we are given an Area or EndPoint struct. func GetArea(trim string, v interface{}) string { @@ -861,7 +1222,7 @@ func GetStructKeys(ref interface{}, keys ...string) StructKeys { case "int64": value = strconv.FormatInt(k.Value().(int64), 10) case "float64": - value = strconv.FormatFloat(k.Value().(float64), 'f', 6, 64) + value = strconv.FormatFloat(k.Value().(float64), 'f', -1, 64) default: j, e := json.Marshal(k.Value()) if e == nil { diff --git a/iSolarCloud/api/const.go b/iSolarCloud/api/const.go index 42240f40f..098dbd25e 100644 --- a/iSolarCloud/api/const.go +++ b/iSolarCloud/api/const.go @@ -6,4 +6,106 @@ const ( NullAreaName = "NullArea" NullEndPointName = "NullEndpoint" DefaultTimeout = time.Second * 60 +) + +const ( + DeviceType1 = "Inverter" + DeviceType10 = "String" + DeviceType11 = "Plant" + DeviceType12 = "Circuit Protection" + DeviceType13 = "Splitting Device" + DeviceType14 = "Energy Storage System" + DeviceType15 = "Sampling Device" + DeviceType16 = "EMU" + DeviceType17 = "Unit" + DeviceType18 = "Temperature and Humidity Sensor" + DeviceType19 = "Intelligent Power Distribution Cabinet" + DeviceType20 = "Display Device" + DeviceType21 = "AC Power Distributed Cabinet" + DeviceType22 = "Communication Module" + DeviceType23 = "System-BMS" + DeviceType24 = "RackBMS" + DeviceType25 = "DC-DC" + DeviceType26 = "Energy Management System" + DeviceType28 = "Wind Energy Converter" + DeviceType29 = "SVG" + DeviceType3 = "Grid-connection Point" + DeviceType30 = "PT Cabinet" + DeviceType31 = "Bus Protection" + DeviceType32 = "Cleaning Robot" + DeviceType33 = "Direct Current Cabinet" + DeviceType34 = "Public Measurement and Control" + DeviceType35 = "Anti-islanding Protection Device" + DeviceType36 = "Frequency and Voltage Emergency Control Device" + DeviceType37 = "PCS" + DeviceType38 = "Cell BMS" + DeviceType39 = "Power Quality" + DeviceType4 = "Combiner Box" + DeviceType40 = "Shuttle" + DeviceType41 = "Optimizer" + DeviceType42 = "Tracking axis communication box" + DeviceType43 = "Battery" + DeviceType44 = "Battery Cluster Management Unit" + DeviceType45 = "Local Controller" + DeviceType46 = "Networking Devices" + DeviceType47 = "Energy Storage Unit" + DeviceType48 = "DC Container" + DeviceType5 = "Meteo Station" + DeviceType50 = "IO Module" + DeviceType6 = "Transformer" + DeviceType7 = "Meter" + DeviceType8 = "UPS" + DeviceType9 = "Data Logger" + DeviceType99 = "Others" +) + +const ( + DeviceNameInverter=1 + DeviceNameString=10 + DeviceNamePlant=11 + DeviceNameCircuitProtection=12 + DeviceNameSplittingDevice=13 + DeviceNameEnergyStorageSystem=14 + DeviceNameSamplingDevice=15 + DeviceNameEMU=16 + DeviceNameUnit=17 + DeviceNameTemperatureAndHumiditySensor=18 + DeviceNameIntelligentPowerDistributionCabinet=19 + DeviceNameDisplayDevice=20 + DeviceNameACPowerDistributedCabinet=21 + DeviceNameCommunicationModule=22 + DeviceNameSystemBMS=23 + DeviceNameRackBMS=24 + DeviceNameDCToDC=25 + DeviceNameEnergyManagementSystem=26 + DeviceNameWindEnergyConverter=28 + DeviceNameSVG=29 + DeviceNameGridConnectionPoint=3 + DeviceNamePTCabinet=30 + DeviceNameBusProtection=31 + DeviceNameCleaningRobot=32 + DeviceNameDirectCurrentCabinet=33 + DeviceNamePublicMeasurementandControl=34 + DeviceNameAntiIslandingProtectionDevice=35 + DeviceNameFrequencyAndVoltageEmergencyControlDevice=36 + DeviceNamePCS=37 + DeviceNameCellBMS=38 + DeviceNamePowerQuality=39 + DeviceNameCombinerBox=4 + DeviceNameShuttle=40 + DeviceNameOptimizer=41 + DeviceNameTrackingAxisCommunicationBox=42 + DeviceNameBattery=43 + DeviceNameBatteryClusterManagementUnit=44 + DeviceNameLocalController=45 + DeviceNameNetworkingDevices=46 + DeviceNameEnergyStorageUnit=47 + DeviceNameDCContainer=48 + DeviceNameMeteoStation=5 + DeviceNameIOModule=50 + DeviceNameTransformer=6 + DeviceNameMeter=7 + DeviceNameUPS=8 + DeviceNameDataLogger=9 + DeviceNameOthers=99 ) \ No newline at end of file diff --git a/iSolarCloud/api/legacy.go b/iSolarCloud/api/legacy.go new file mode 100644 index 000000000..6adf6c887 --- /dev/null +++ b/iSolarCloud/api/legacy.go @@ -0,0 +1,662 @@ +package api + + +// From struct_data.go + +// func (dm *DataMap) GetEntry(entry string, index int) *DataEntry { +// var ret *DataEntry +// for range Only.Once { +// pe := dm.Map[entry] +// if pe.Entries != nil { +// ret = pe.GetEntry(index) +// break +// } +// +// for k, v := range dm.Map { +// if strings.HasSuffix(k, "." + entry) { +// ret = v.GetEntry(index) +// break +// } +// } +// } +// return ret +// } +// +// func (dm *DataMap) GetFloatValue(entry string, index int) float64 { +// var ret float64 +// for range Only.Once { +// pe := dm.GetEntry(entry, index) +// if pe.IsNotValid() { +// fmt.Printf("ERROR: GetFloatValue('%s', '%d')\n", entry, index) +// break +// } +// ret = pe.Value.ValueFloat() +// } +// return ret +// } +// +// func (dm *DataMap) GetValue(entry string, index int) float64 { +// var ret float64 +// for range Only.Once { +// v := dm.GetEntry(entry, index) +// if v.IsNotValid() { +// fmt.Printf("ERROR: GetValue('%s', %d)\n", entry, index) +// break +// } +// +// ret = v.Value.ValueFloat() +// } +// return ret +// } +// +// func (dm *DataMap) GetEntryFromPointId(pointId string) *DataEntries { +// var ret *DataEntries +// for range Only.Once { +// for i, v := range dm.Map { +// if v.MatchPointId(pointId) { +// ret = dm.Map[i] +// break +// } +// } +// } +// return ret +// } +// +// func (dm *DataMap) SetEntryUnits(pointId string, unit string) { +// for range Only.Once { +// for i, v := range dm.Map { +// if v.MatchPointId(pointId) { +// // e := dm.Map[i] +// // dm.Map[i] = e.SetUnits(unit) +// dm.Map[i].SetUnits(unit) +// break +// } +// } +// } +// } +// +// func (dm *DataMap) SetEntryGroupName(pointId string, groupName string) { +// for range Only.Once { +// for i, v := range dm.Map { +// if v.MatchPointId(pointId) { +// // e := dm.Map[i] +// // dm.Map[i] = e.SetGroupName(groupName) +// dm.Map[i].SetGroupName(groupName) +// break +// } +// } +// } +// } +// +// func (dm *DataMap) SetEntryTimestamp(pointId string, timeStamp valueTypes.DateTime) { +// for range Only.Once { +// for i, v := range dm.Map { +// if v.MatchPointId(pointId) { +// // e := dm.Map[i] +// // dm.Map[i] = e.SetTimestamp(timeStamp) +// dm.Map[i].SetTimestamp(timeStamp) +// break +// } +// } +// } +// } +// +// func (dm *DataMap) FromRefAddAlias(ref string, parentId string, pid string, name string) { +// for range Only.Once { +// pe := dm.GetEntry(ref, 0) +// if pe.IsNotValid() { +// fmt.Printf("ERROR: FromRefAddAlias('%s', '%s', '%s', '%s')\n", ref, parentId, pid, name) +// break +// } +// +// de := CopyDataEntry(*pe, pe.EndPoint, parentId, valueTypes.SetPointIdString(pid), name, pe.Point.GroupName, pe.Point.Unit, pe.Point.ValueType) +// dm.Add(de) +// } +// } +// +// func (dm *DataMap) FromRefAddState(ref string, parentId string, pid string, name string) { +// for range Only.Once { +// pe := dm.GetEntry(ref, 0) +// if pe.IsNotValid() { +// fmt.Printf("ERROR: FromRefAddState('%s', '%s', '%s', '%s')\n", ref, parentId, pid, name) +// break +// } +// +// de := CopyDataEntry(*pe, pe.EndPoint, parentId, valueTypes.SetPointIdString(pid), name, pe.Point.GroupName, pe.Point.Unit, pe.Point.ValueType) +// de.MakeState(pe.Value.ValueBool()) +// // de := pe.CreateState(pe.EndPoint, parentId, valueTypes.SetPointIdString(pid), name) +// dm.Add(de) +// } +// } +// +// func (dm *DataMap) FromRefAddFloat(ref string, parentId string, pid string, name string, value float64) { +// for range Only.Once { +// pe := dm.GetEntry(ref, 0) +// if pe.IsNotValid() { +// fmt.Printf("ERROR: FromRefAddFloat('%s', '%s', '%s', '%s')\n", ref, parentId, pid, name) +// break +// } +// +// de := CopyDataEntry(*pe, pe.EndPoint, parentId, valueTypes.SetPointIdString(pid), name, pe.Point.GroupName, pe.Point.Unit, pe.Point.ValueType) +// de.MakeFloat(value, "", "") +// // de := pe.CreateFloat(pe.EndPoint, parentId, valueTypes.SetPointIdString(pid), name, value) +// dm.Add(de) +// } +// } +// +// func CopyDataEntry(ref DataEntry, endpoint string, parentId string, pid valueTypes.PointId, name string, groupName string, unit string, Type string) DataEntry { +// var ret DataEntry +// for range Only.Once { +// if name == "" { +// name = pid.PointToName() +// } +// +// point := CopyPoint(*ref.Point, parentId, pid, name, groupName, unit, Type) +// // point = &Point { +// // Parents: de.Point.Parents, +// // Id: pid, +// // GroupName: "alias", +// // Name: name, +// // Unit: de.Point.Unit, +// // UpdateFreq: de.Point.UpdateFreq, +// // ValueType: de.Point.ValueType, +// // Valid: true, +// // States: de.Point.States, +// // } +// // var parent ParentDevice +// // parent.Set(parentId) +// // point.Parents.Add(parent) +// // point.Unit = "binary" +// // if point.Unit == "" { +// // point.Unit = ref.Unit() +// // } +// // point.Name = name +// // if point.Name == "" { +// // point.Name = pid.PointToName() +// // } +// // // if de2.Point.GroupName == "" { +// // // de2.Point.GroupName = groupName +// // // } +// // point.FixUnitType() +// // point.Valid = true +// +// ret.Point = point +// ret.EndPoint = endpoint +// ret.Parent.Set(parentId) +// ret.Valid = true +// ret.Hide = false +// } +// +// return ret +// } +// +// func CopyPoint(ref Point, parentId string, pid valueTypes.PointId, name string, groupName string, unit string, Type string) *Point { +// for range Only.Once { +// if name == "" { +// name = pid.PointToName() +// } +// +// var parent ParentDevice +// parent.Set(parentId) +// ref.Parents.Add(parent) +// ref.Id = pid +// ref.Unit = unit +// ref.Name = name +// ref.UpdateFreq = "" +// ref.GroupName = groupName +// ref.ValueType = Type +// ref.Valid = true +// ref.States = nil +// +// ref.FixUnitType() +// } +// +// return &ref +// } +// +// func (dm *DataMap) HideEntry(pointId valueTypes.PointId) { +// for range Only.Once { +// de := dm.GetEntryFromPointId(pointId) +// de.Hide() +// } +// } +// +// func (dm *DataMap) AddEntry(endpoint string, parentId string, point Point, date valueTypes.DateTime, value string) { +// for range Only.Once { +// unit := point.Unit // Save unit. +// vType := point.ValueType // Save type. +// +// // Match to a previously defined point. +// p := GetPoint(point.Id.String()) +// if p != nil { +// // No point found. Create one. +// p = CreatePoint(parentId, pid, name, groupName, unit, Type) +// } +// point = *p +// +// // var parents ParentDevices +// // parents.Add(ParentDevice{Key: device}) +// var parent ParentDevice +// parent.Set(parentId) +// point.Parents.Add(parent) +// +// if point.Name == "" { +// point.Name = point.Id.PointToName() +// } +// // fid := JoinDevicePoint(parent.Key, point.Id) +// ref := valueTypes.SetUnitValueString(value, unit, vType) +// point.Unit = ref.Unit() +// point.Valid = true +// +// if _, ok := dm.DataPoints[point.Id.String()]; ok { +// fmt.Printf("BARF: %s\n", point.Id) +// } +// +// // dm.Add(JoinDevicePoint(endpoint, point.Id), DataEntry { +// dm.Add(DataEntry { +// EndPoint: endpoint, +// // FullId: valueTypes.JoinDataPoint(endpoint, point.Id.String()), +// // FullId: JoinDevicePoint(parent.Key, point.Id), +// Parent: parent, +// +// Point: &point, +// Date: date, +// Value: ref.String(), +// ValueFloat: ref.Value(), +// ValueBool: ref.ValueBool(), +// Index: 0, +// Valid: true, +// Hide: false, +// }) +// } +// } +// +// func (dm *DataMap) AddUnitValue(endpoint string, parentId string, pid valueTypes.PointId, name string, groupName string, date valueTypes.DateTime, ref valueTypes.UnitValue) { +// for range Only.Once { +// if endpoint == "" { +// endpoint = apiReflect.GetCallerPackage(2) +// } +// +// ref = ref.UnitValueFix() +// +// if name == "" { +// name = pid.PointToName() +// } +// +// point := GetPoint(pid.String()) +// if point == nil { +// // No point found. Create one. +// point = CreatePoint(parentId, pid, name, groupName, ref.Unit(), ref.Type()) +// // de := CreateDataEntry(endpoint, parentId, pid, name, groupName, date, ref) +// // dm.Add(de) +// // break +// } +// +// var parent ParentDevice +// parent.Set(parentId) +// point.Parents.Add(parent) +// if point.Unit == "" { +// point.Unit = ref.Unit() +// } +// if point.Name == "" { +// point.Name = name +// } +// if point.Name == "" { +// point.Name = pid.PointToName() +// } +// if point.GroupName == "" { +// point.GroupName = groupName +// } +// point.FixUnitType() +// point.Valid = true +// +// dm.Add(DataEntry { +// EndPoint: endpoint, +// // FullId: valueTypes.JoinDataPoint(endpoint, point.Id.String()), +// // FullId: JoinDevicePoint(parent.Key, point.Id), +// Parent: parent, +// +// Point: point, +// Date: date, +// Value: ref.String(), +// ValueFloat: ref.Value(), +// ValueBool: ref.ValueBool(), +// Index: 0, +// Valid: true, +// Hide: false, +// }) +// } +// } +// +// func (dm *DataMap) AddFloat(endpoint string, parentId string, pid PointId, name string, date valueTypes.DateTime, value float64) { +// for range Only.Once { +// // fvs := Float64ToString(value) +// point := GetPoint(parentId, pid) +// if point == nil { +// // No UV found. Create one. +// dm.Add(pid, CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, valueTypes.SetUnitValueFloat(value, point.Unit, point.ValueType))) +// break +// } +// +// ref := valueTypes.SetUnitValueFloat(value, point.Unit, point.ValueType) +// if ref.Unit() != point.Unit { +// fmt.Printf("OOOPS: Unit mismatch - %f %s != %f %s\n", value, point.Unit, ref.ValueFloat(), ref.Unit()) +// point.Unit = ref.Unit() +// } +// +// var parent ParentDevice +// parent.Set(parentId) +// point.Parents.Add(parent) +// +// dm.Add(pid, DataEntry { +// EndPoint: endpoint, +// FullId: JoinDevicePoint(endpoint, point.Id), +// // FullId: JoinDevicePoint(parent.Key, point.Id), +// Parent: parent, +// +// Date: date, +// Point: point, +// Value: ref.String(), +// ValueFloat: ref.Value(), +// }) +// } +// +// uv := valueTypes.SetUnitValueFloat(value, "", "float") +// de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, uv) +// // de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, UnitValue { +// // Unit: "float", +// // Value: fmt.Sprintf("%f", value), +// // ValueFloat: 0, +// // }) +// dm.Add(pid, de) +// } +// +// func (dm *DataMap) AddString(endpoint string, parentId string, pid PointId, name string, date valueTypes.DateTime, value string) { +// dm.Add(pid, CreateDataEntryString(date, endpoint, parentId, pid, name, value)) +// } +// +// func (dm *DataMap) AddInt(endpoint string, parentId string, pid PointId, name string, date valueTypes.DateTime, value int64) { +// +// for range Only.Once { +// uvs, ok := valueTypes.AnyToUnitValue(value, "", "") +// if !ok { +// fmt.Printf("ERROR: AddInt(endpoint '%s', parentId '%s', pid '%s', name '%s', date '%s', value %d)", +// endpoint, parentId, pid, name, date, value) +// break +// } +// for _, uv := range uvs { +// de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, uv) +// dm.Add(pid, de) +// } +// +// // uv := valueTypes.SetUnitValueInteger(value, "", "int") +// // de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, uv) +// // // de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, UnitValue { +// // // Unit: "int", +// // // Value: fmt.Sprintf("%d", value), +// // // ValueFloat: float64(value), +// // // }) +// // dm.Add(pid, de) +// } +// } +// +// func (dm *DataMap) AddAny(endpoint string, parentId string, pid valueTypes.PointId, name string, date valueTypes.DateTime, value interface{}) { +// +// for range Only.Once { +// uvs, isNil, ok := valueTypes.AnyToUnitValue(value, "", "") +// if !ok { +// fmt.Printf("ERROR: AddAny(endpoint '%s', parentId '%s', pid '%s', name '%s', date '%s', value '%v')", +// endpoint, parentId, pid, name, date, value) +// break +// } +// +// point := GetPoint(parentId + "." + pid.String()) +// if point == nil { +// // No UV found. Create one. +// for _, uv := range uvs { +// de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, uv) +// if isNil { +// de.Point.ValueType += "(NIL)" +// } +// dm.Add(de) +// } +// // dm.Add(pid, CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, +// // valueTypes.SetUnitValueFloat(value, point.Unit, point.ValueType))) +// break +// } +// +// // ref := valueTypes.SetUnitValueFloat(value, point.Unit, point.ValueType) +// // if ref.Unit() != point.Unit { +// // fmt.Printf("OOOPS: Unit mismatch - %f %s != %f %s\n", value, point.Unit, ref.ValueFloat(), ref.Unit()) +// // point.Unit = ref.Unit() +// // } +// +// if isNil { +// point.ValueType += "(NIL)" +// } +// +// for _, uv := range uvs { +// if uv.Unit() != point.Unit { +// fmt.Printf("OOOPS: Unit mismatch - %f %s != %f %s\n", value, point.Unit, uv.ValueFloat(), uv.Unit()) +// point.Unit = uv.Unit() +// } +// +// var parent ParentDevice +// parent.Set(parentId) +// point.Parents.Add(parent) +// +// // CreateDataEntry +// de := DataEntry { +// EndPoint: endpoint, +// // FullId: valueTypes.JoinDataPoint(endpoint, point.Id.String()), +// Parent: parent, +// +// Date: date, +// Point: point, +// Value: uv.String(), +// ValueFloat: uv.Value(), +// ValueBool: uv.ValueBool(), +// Index: 0, +// Valid: true, +// Hide: false, +// } +// dm.Add(de) +// } +// +// for _, uv := range uvs { +// de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, uv) +// dm.Add(de) +// } +// } +// } +// +// func (de *DataEntry) CreateFloat(endpoint string, parentId string, pid valueTypes.PointId, name string, groupName string, unit string, Type string, value float64) DataEntry { +// var ret DataEntry +// for range Only.Once { +// if name == "" { +// name = pid.PointToName() +// } +// +// ret = de.CreateDataEntry(endpoint, parentId, pid, name, groupName, unit, Type) +// uv := valueTypes.SetUnitValueFloat(value, ret.Point.Unit, ret.Point.ValueType) +// ret.Value = uv.String() +// ret.ValueFloat = uv.Value() +// ret.Valid = true +// ret.Hide = false +// } +// return ret +// } +// +// func (de *DataEntry) CreateState(endpoint string, parentId string, pid valueTypes.PointId, name string) DataEntry { +// var ret DataEntry +// for range Only.Once { +// if name == "" { +// name = pid.PointToName() +// } +// +// de2 := de.CreateDataEntry(endpoint, parentId, pid, name) +// if de2.ValueFloat == 0 { +// de2.Value = "false" +// de2.ValueBool = false +// de2.ValueFloat = 0 +// } else { +// de2.Value = "true" +// de2.ValueBool = true +// de2.ValueFloat = 1 +// } +// de2.Valid = true +// de2.Hide = false +// +// var parent ParentDevice +// parent.Set(parentId) +// de2.Point.Parents.Add(parent) +// de2.Point.Unit = "binary" +// if de2.Point.Unit == "" { +// de2.Point.Unit = ref.Unit() +// } +// de2.Point.Name = name +// if de2.Point.Name == "" { +// de2.Point.Name = pid.PointToName() +// } +// // if de2.Point.GroupName == "" { +// // de2.Point.GroupName = groupName +// // } +// de2.Point.FixUnitType() +// de2.Point.Valid = true +// } +// +// return ret +// } +// +// func CreateDataEntryActive(date valueTypes.DateTime, endpoint string, parentId string, pid valueTypes.PointId, name string, value float64) DataEntry { +// point := GetPoint(parentId, pid) +// if point == nil { +// if name == "" { +// name = pid.PointToName() +// } +// point = CreatePoint(parentId, pid, name, "state") +// } +// +// var parent ParentDevice +// parent.Set(parentId) +// point.Parents.Add(parent) +// +// return DataEntry { +// EndPoint: endpoint, +// FullId: valueTypes.JoinDataPoint(endpoint, point.Id.String()), +// // FullId: JoinDevicePoint(parent.Key, point.Id), +// Parent: parent, +// +// Point: point, +// Date: date, +// Value: fmt.Sprintf("%v", IsActive(value)), +// ValueFloat: 0, +// Index: 0, +// } +// } +// +// func CreateDataEntryString(date valueTypes.DateTime, endpoint string, parentId string, pid valueTypes.PointId, name string, value string) DataEntry { +// point := GetPoint(parentId, pid) +// if point == nil { +// if name == "" { +// name = pid.PointToName() +// } +// point = CreatePoint(parentId, pid, name, "string") +// } +// +// var parent ParentDevice +// parent.Set(parentId) +// point.Parents.Add(parent) +// +// return DataEntry { +// EndPoint: endpoint, +// FullId: valueTypes.JoinDataPoint(endpoint, pid.String()), +// // FullId: JoinDevicePoint(parent.Key, pid), +// Parent: parent, +// +// Point: point, +// Date: date, +// Value: value, +// ValueFloat: 0, +// Index: 0, +// } +// } +// +// func CreateDataEntryUnitValue(date valueTypes.DateTime, endpoint string, parentId string, pid valueTypes.PointId, name string, value valueTypes.UnitValue) DataEntry { +// value = value.UnitValueFix() +// +// point := GetPoint(parentId + "." + pid.String()) +// if point == nil { +// if name == "" { +// name = pid.PointToName() +// } +// point = CreatePoint(parentId, pid, name, value.Unit()) +// } +// +// var parent ParentDevice +// parent.Set(parentId) +// point.Parents.Add(parent) +// point.Valid = true +// +// return DataEntry { +// EndPoint: endpoint, +// // FullId: valueTypes.JoinDataPoint(endpoint, pid.String()), +// // FullId: JoinDevicePoint(parent.Key, pid), +// Parent: parent, +// +// Point: point, +// Date: date, +// Value: value.String(), +// ValueFloat: value.Value(), +// ValueBool: value.ValueBool(), +// Index: 0, +// Valid: true, +// Hide: false, +// } +// } +// +// func CreatePoint(parentId string, pid valueTypes.PointId, name string, unit string) *Point { +// if name == "" { +// name = pid.PointToName() +// } +// +// var parents ParentDevices +// parents.Add(ParentDevice{Key: parentId}) +// +// ret := &Point { +// Parents: parents, +// Id: pid, +// GroupName: parentId, +// Name: name, +// Unit: unit, +// UpdateFreq: "", +// ValueType: "", +// Valid: true, +// States: nil, +// } +// ret.FixUnitType() +// +// return ret +// } +// +// func IsActive(value float64) bool { +// if (value > 0.01) || (value < -0.01) { +// return true +// } +// return false +// } +// +// func JoinDevicePoint(endpoint string, pid valueTypes.PointId) valueTypes.PointId { +// var ret valueTypes.PointId +// for range Only.Once { +// if endpoint == "" { +// endpoint = "virtual" +// } +// ret = valueTypes.PointId(JoinWithDots(0, "", endpoint, pid)) +// } +// return ret +// } +// +// func JoinStringsWithDots(args ...string) string { +// return strings.Join(args, ".") +// } diff --git a/iSolarCloud/api/nullEndpoint/struct.go b/iSolarCloud/api/nullEndpoint/struct.go index cec8a671b..c5a974736 100644 --- a/iSolarCloud/api/nullEndpoint/struct.go +++ b/iSolarCloud/api/nullEndpoint/struct.go @@ -374,21 +374,21 @@ func (e EndPoint) GetDataTable() output.Table { _ = table.SetHeader( "Date", "Point Id", - "Group Name", - "Description", "Value", "Unit", + "Group Name", + "Description", ) data := e.GetData() var sorted []string - for p := range data.DataPoints { + for p := range data.Map { sorted = append(sorted, string(p)) } sort.Strings(sorted) for _, p := range sorted { - entries := data.DataPoints[api.PointId(p)] + entries := data.Map[api.PointId(p)] for _, de := range entries { if de.Hide { continue @@ -400,10 +400,10 @@ func (e EndPoint) GetDataTable() output.Table { // de.Point.Id, p, // de.Point.Parents.String(), - de.Point.GroupName, - de.Point.Name, de.Value, de.Point.Unit, + de.Point.GroupName, + de.Point.Name, ) } } diff --git a/iSolarCloud/api/struct_data.go b/iSolarCloud/api/struct_data.go index ecb3c8486..62cb440e3 100644 --- a/iSolarCloud/api/struct_data.go +++ b/iSolarCloud/api/struct_data.go @@ -13,344 +13,355 @@ import ( const ( - PointTimeSpanInstant = "instant" - PointTimeSpanBoot = "boot" - PointTimeSpanDaily = "daily" - PointTimeSpanMonthly = "monthly" - PointTimeSpanYearly = "yearly" - PointTimeSpanTotal = "total" + UpdateFreqInstant = "instant" + UpdateFreq5Mins = "5mins" + UpdateFreqBoot = "boot" + UpdateFreqDaily = "daily" + UpdateFreqMonthly = "monthly" + UpdateFreqYearly = "yearly" + UpdateFreqTotal = "total" ) -type DataPointEntries []DataEntry - -func (de *DataPointEntries) Hide() { - for range Only.Once { - for i := range *de { - (*de)[i].Hide = true - } - } -} - type DataMap struct { - DataPoints map[string]DataPointEntries - Order []string + Map map[string]*DataEntries + Order []string } -type DataEntry struct { - Point *Point `json:"point"` - Date valueTypes.DateTime `json:"date"` - - EndPoint string `json:"endpoint"` - // FullId valueTypes.DataPoint `json:"full_id"` - Parent ParentDevice `json:"parent"` - Value string `json:"value"` - ValueFloat float64 `json:"value_float"` - ValueBool bool `json:"value_bool"` - Index int `json:"index"` - Valid bool `json:"valid"` - Hide bool `json:"hide"` -} - -func (de *DataEntry) IsValid() bool { - var ok bool - for range Only.Once { - if de.Point == nil { - break - } - if de.Point.Valid == false { - break - } - ok = true - } - return ok -} -func (de *DataEntry) IsNotValid() bool { - return !de.IsValid() -} - -func (de *DataEntry) FullId() string { - return de.EndPoint + "." + de.Point.Id.String() -} - - func NewDataMap() DataMap { return DataMap { - DataPoints: make(map[string]DataPointEntries), + Map: make(map[string]*DataEntries), } } - func (dm *DataMap) StructToPoints(ref interface{}, endpoint string, parentId string, timestamp valueTypes.DateTime) { for range Only.Once { if endpoint == "" { endpoint = apiReflect.GetCallerPackage(2) } - // Iterate over all available fields and read the tags value - tp := apiReflect.GetPointTags(ref, endpoint) - // fmt.Printf("TP: %v\n", tp) + // Iterate over all available fields and read the tag values + var tp apiReflect.DataStructures + tp.GetPointTags(ref, ref, endpoint) - for _, f := range tp { + for _, f := range tp.Map { if f.PointIgnore { - // fmt.Printf("IGNORE: %s\n", f.PointId) continue } + // if strings.Contains(f.PointId, "p83095") || strings.Contains(f.PointId, "es_total_disenergy") { + // fmt.Printf("F:%v\n", f) + // fmt.Println("") + // } + if f.PointName == "" { f.PointName = valueTypes.PointToName(f.PointId) } - if f.PointDevice == "" { + if f.PointParentId == "" { if parentId != "" { - f.PointDevice = parentId + f.PointParentId = parentId } else { - f.PointDevice = "virtual" + f.PointParentId = "virtual" } } // fmt.Printf("DEBUG: StructToPoints(): %s / %s\n", f.Endpoint, f.PointId) - uvs, _, ok := valueTypes.AnyToUnitValue(f.Value, f.PointUnit, f.PointValueType) + uvs, _, ok := valueTypes.AnyToUnitValue(f.Value, f.PointUnit, f.PointValueType, valueTypes.DateTimeLayout) if !ok { continue } - switch f.PointTimeSpan { - case "PointTimeSpanInstant": - f.PointTimeSpan = PointTimeSpanInstant - case "PointTimeSpanBoot": - f.PointTimeSpan = PointTimeSpanBoot - case "PointTimeSpanDaily": - f.PointTimeSpan = PointTimeSpanDaily - case "PointTimeSpanMonthly": - f.PointTimeSpan = PointTimeSpanMonthly - case "PointTimeSpanYearly": - f.PointTimeSpan = PointTimeSpanYearly - case "PointTimeSpanTotal": - f.PointTimeSpan = PointTimeSpanTotal + switch f.PointUpdateFreq { + case "UpdateFreqInstant": + f.PointUpdateFreq = UpdateFreqInstant + case "UpdateFreq5Mins": + f.PointUpdateFreq = UpdateFreq5Mins + case "UpdateFreqBoot": + f.PointUpdateFreq = UpdateFreqBoot + case "UpdateFreqDaily": + f.PointUpdateFreq = UpdateFreqDaily + case "UpdateFreqMonthly": + f.PointUpdateFreq = UpdateFreqMonthly + case "UpdateFreqYearly": + f.PointUpdateFreq = UpdateFreqYearly + case "UpdateFreqTotal": + f.PointUpdateFreq = UpdateFreqTotal } var when valueTypes.DateTime - if timestamp.IsZero() { - when = valueTypes.NewDateTime(time.Now().Round(5 * time.Minute).Format(valueTypes.DateTimeLayoutZeroSeconds)) + if !f.PointTimestamp.IsZero() { + dt := valueTypes.SetDateTimeValue(f.PointTimestamp) + when = *dt } else { - when = valueTypes.NewDateTime(timestamp.String()) + if timestamp.IsZero() { + dt := valueTypes.SetDateTimeValue(time.Now().Round(5 * time.Minute)) + when = *dt + } else { + when = timestamp + } } - point := CreatePoint(parentId, valueTypes.SetPointIdString(f.PointId), f.PointName, f.PointGroupName, uvs.Unit(), uvs.Type()) - point.TimeSpan = f.PointTimeSpan - - // var parents ParentDevices - // parents.Add(ParentDevice{Key: f.PointDevice}) - // point := Point { - // Parents: parents, - // Id: valueTypes.SetPointIdString(f.PointId), - // GroupName: f.PointGroupName, - // Name: f.PointName, - // Unit: uvs.Unit(), - // TimeSpan: f.PointTimeSpan, - // ValueType: uvs.Type(), - // Valid: true, - // States: nil, - // } - // point.FixUnitType() - - if point.Id.String() == "p13003" { - fmt.Sprintf("DEBUG:") + var point Point + p := GetPoint(f.Endpoint + "." + f.PointId) + if p == nil { + // No point found. Create one. + point = CreatePoint(parentId, valueTypes.SetPointIdString(f.PointId), f.PointName, f.PointGroupName, uvs.Unit(), uvs.Type(), f.PointUpdateFreq) + } else { + point = *p } + point.UpdateFreq = f.PointUpdateFreq + point.SetName(f.PointName) + // Add arrays as multiple entries. if len(uvs) > 1 { // @TODO - Think about adding in arrays of values OR just marshal arrays into JSON. res := valueTypes.SizeOfArrayLength(uvs) for i, uv := range uvs { - dm.AddUnitValue(JoinWithDots(res, valueTypes.DateTimeLayoutDay, f.Endpoint, i), f.PointDevice, valueTypes.SetPointIdString(f.PointId), f.PointName, f.PointGroupName, when, uv) - // dm.AddEntry(fmt.Sprintf(res, f.Endpoint, i), f.PointDevice, p, now, val.String()) + // dm.AddUnitValue(JoinWithDots(res, valueTypes.DateTimeLayoutDay, f.Endpoint, i), f.PointParentId, valueTypes.SetPointIdString(f.PointId), f.PointName, f.PointGroupName, when, uv) + dm.AddPointUnitValue(JoinWithDots(res, valueTypes.DateTimeLayoutDay, f.Endpoint, i), f.PointParentId, point, when, uv) } continue } - dm.AddUnitValue(f.Endpoint, f.PointDevice, valueTypes.SetPointIdString(f.PointId), f.PointName, f.PointGroupName, when, uvs[0]) + if len(uvs) == 0 { + fmt.Printf("OOOPS - UVS is nil for %s\n", f.PointId) + continue + } + // dm.AddUnitValue(f.Endpoint, f.PointParentId, valueTypes.SetPointIdString(f.PointId), f.PointName, f.PointGroupName, when, uvs[0]) + dm.AddPointUnitValue(f.Endpoint, f.PointParentId, point, when, uvs[0]) - if f.PointAlias != "" { - point.Id = valueTypes.SetPointIdString(f.PointAlias) - dm.AddUnitValue(f.Endpoint, f.PointDevice, valueTypes.SetPointIdString(f.PointId), f.PointName, f.PointGroupName, when, uvs[0]) + if f.PointAliasTo != "" { + f.PointId = f.PointAliasTo + // dm.AddUnitValue(f.Endpoint, f.PointParentId, valueTypes.SetPointIdString(f.PointId), f.PointName, f.PointGroupName, when, uvs[0]) + dm.AddPointUnitValue(f.Endpoint, f.PointParentId, point, when, uvs[0]) } } - for _, f := range tp { - // Reference Units from another data point. - if f.PointUnitFrom != "" { - sdp := dm.GetEntryFromPointId(f.PointUnitFrom) - if sdp == nil { - continue - } - ddp := dm.GetEntryFromPointId(f.PointId) - if ddp == nil { - continue - } - ddp.SetUnits(sdp.GetEntry(0).Value) - - // Matches, so hide reference unit point. - sdp.Hide() - } - } + // for _, f := range tp.Map { + // // Reference Units from another data point. + // if f.PointUnitFrom != "" { + // sdp := dm.GetEntryFromPointId(f.PointUnitFrom) + // if sdp == nil { + // continue + // } + // ddp := dm.GetEntryFromPointId(f.PointId) + // if ddp == nil { + // continue + // } + // ddp2 := dm.GetEntryFromPointId(f.PointId) + // if ddp2 == nil { + // continue + // } + // ddp3 := dm.GetEntryFromPointId(f.PointId) + // if ddp3 == nil { + // continue + // } + // b := ddp.GetEntry(0).Point.Unit + // // ddp.SetUnits(sdp.GetEntry(0).Value) + // dm.SetEntryUnits(f.PointId, sdp.GetEntryValue(0).String()) + // ddp = dm.GetEntryFromPointId(f.PointId) + // fmt.Printf("CHECK:PointUnitFrom [%s] from [%s] : '%s' <%s> '%s'\n", f.PointId, f.PointUnitFrom, b, sdp.GetEntry(0).Value, ddp.GetEntry(0).Point.Unit) + // + // // Matches, so hide reference unit point. + // sdp.Hide() + // } + // + // if f.PointGroupNameFrom != "" { + // sdp := dm.GetEntryFromPointId(f.PointGroupNameFrom) + // if sdp == nil { + // continue + // } + // ddp := dm.GetEntryFromPointId(f.PointId) + // if ddp == nil { + // continue + // } + // b := ddp.GetEntry(0).Point.GroupName + // // ddp.SetGroupName(sdp.GetEntry(0).Value) + // dm.SetEntryGroupName(f.PointId, sdp.GetEntryValue(0).String()) + // ddp = dm.GetEntryFromPointId(f.PointId) + // fmt.Printf("CHECK:PointGroupNameFrom [%s] from [%s] : '%s' <%s> '%s'\n", f.PointId, f.PointGroupNameFrom, b, sdp.GetEntry(0).Value, ddp.GetEntry(0).Point.GroupName) + // + // // Matches, so hide reference unit point. + // sdp.Hide() + // } + // + // if f.PointTimestampFrom != "" { + // sdp := dm.GetEntryFromPointId(f.PointTimestampFrom) + // if sdp == nil { + // continue + // } + // ddp := dm.GetEntryFromPointId(f.PointId) + // if ddp == nil { + // continue + // } + // b := ddp.GetEntry(0).Date + // // ddp.SetTimestamp(sdp.GetEntry(0).Value) + // dm.SetEntryTimestamp(f.PointId, sdp.GetEntry(0).Date) + // ddp = dm.GetEntryFromPointId(f.PointId) + // fmt.Printf("CHECK:PointTimestampFrom [%s] from [%s] : '%s' <%s> '%s'\n", f.PointId, f.PointTimestampFrom, b, sdp.GetEntry(0).Value, ddp.GetEntry(0).Date) + // + // // Matches, so hide reference unit point. + // sdp.Hide() + // } + // } } } -const LastEntry = -1 -func (de *DataPointEntries) GetEntry(index int) DataEntry { +func (dm *DataMap) AddPointUnitValue(endpoint string, parentId string, point Point, date valueTypes.DateTime, uv valueTypes.UnitValue) { + for range Only.Once { - l := len(*de) - 1 - if index > l { - index = l - break + if uv.Unit() != point.Unit { + fmt.Printf("OOOPS: Unit mismatch - %s %s != %f %s\n", uv.String(), point.Unit, uv.ValueFloat(), uv.Unit()) + point.Unit = uv.Unit() } - if index < 0 { - index = l + index + 1 - if index < 0 { - index = 0 - } - } - } - return (*de)[index] -} -func (de *DataPointEntries) GetUnits() string { - var unit string - for range Only.Once { - for _, v := range *de { - unit = v.Point.Unit - break - } - } - return unit -} - -func (de *DataPointEntries) SetUnits(units string) { - for range Only.Once { - for i := range *de { - (*de)[i].Point.Unit = units - } + de := CreatePointDataEntry(endpoint, parentId, point, date, uv) + dm.Add(de) } } -func (dm *DataMap) GetEntry(entry string, index int) DataEntry { +func CreatePointDataEntry(endpoint string, parentId string, point Point, dateTime valueTypes.DateTime, uv valueTypes.UnitValue) DataEntry { var ret DataEntry for range Only.Once { - pe := dm.DataPoints[entry] - if pe != nil { - ret = pe.GetEntry(index) + ret = DataEntry { + EndPoint: endpoint, + Point: &point, + Parent: NewParentDevice(parentId), + Date: dateTime, + Value: uv, + Valid: true, + Hide: false, + Index: 0, + } + } + + return ret +} + +func CreatePoint(parentId string, pid valueTypes.PointId, name string, groupName string, unit string, Type string, timeSpan string) Point { + var point Point + for range Only.Once { + if name == "" { + name = pid.PointToName() + } + + var parent ParentDevice + parent.Set(parentId) + var parents ParentDevices + parents.Add(parent) + + point = Point { + Parents: parents, + Id: pid, + GroupName: groupName, + Description: name, + Unit: unit, + UpdateFreq: timeSpan, + ValueType: Type, + Valid: true, + States: nil, + } + point.FixUnitType() + } + + return point +} + + +func (dm *DataMap) CopyPoint(refEndpoint string, endpoint string, pointId string, name string) *DataEntries { + var ret *DataEntries + for range Only.Once { + var dep *DataEntries + var ok bool + if dep, ok = dm.Map[refEndpoint]; !ok { + fmt.Printf("ERROR: Can't find point '%s'\n", refEndpoint) break } - for k, v := range dm.DataPoints { - if strings.HasSuffix(k, "." + entry) { - ret = v.GetEntry(index) - break - } + var des DataEntries + des = dep.Copy() + for i := range des.Entries { + des.Entries[i].SetEndpoint(endpoint, pointId) + des.Entries[i].SetPointName(name) + dm.Add(des.Entries[i]) } + + epn := des.Entries[0].EndPoint + "." + des.Entries[0].Point.Id.String() + ret = dm.Map[epn] } return ret } -func (dm *DataMap) GetEntryFromPointId(pointId string) *DataPointEntries { - var ret *DataPointEntries +func (dm *DataMap) CopyDataEntries(dep DataEntries, endpoint string, pointId string, name string) *DataEntries { + var ret *DataEntries for range Only.Once { - for _, v := range dm.DataPoints { - pe := v.GetEntry(0) - if pe.IsNotValid() { - continue - } - - if pe.Point.Id.String() == pointId { - ret = &v - break - } + var des DataEntries + des = dep.Copy() + for i := range des.Entries { + des.Entries[i].SetEndpoint(endpoint, pointId) + des.Entries[i].SetPointName(name) + dm.Add(des.Entries[i]) } + + epn := des.Entries[0].EndPoint + "." + des.Entries[0].Point.Id.String() + ret = dm.Map[epn] } return ret } -func (dm *DataMap) GetFloatValue(entry string, index int) float64 { +func (dm *DataMap) LowerUpper(lowerEntry DataEntries, upperEntry DataEntries) float64 { var ret float64 for range Only.Once { - pe := dm.GetEntry(entry, index) - if pe.IsNotValid() { - fmt.Printf("ERROR: GetFloatValue('%s', '%d')\n", entry, index) + // l := dm.GetEntry(lowerEntry, index) + // if l.IsNotValid() { + // fmt.Printf("ERROR: LowerUpper('%s', '%s', %d)\n", lowerEntry, upperEntry, index) + // break + // } + // + // u := dm.GetEntry(upperEntry, index) + // if u.IsNotValid() { + // fmt.Printf("ERROR: LowerUpper('%s', '%s', %d)\n", lowerEntry, upperEntry, index) + // break + // } + + if lowerEntry.GetFloat() > 0 { + ret = 0 - lowerEntry.GetFloat() break } - ret = pe.ValueFloat + ret = upperEntry.GetFloat() } return ret } -func (dm *DataMap) LowerUpper(lowerEntry string, upperEntry string, index int) float64 { +func (dm *DataMap) GetPercent(entry DataEntries, max DataEntries) float64 { var ret float64 for range Only.Once { - l := dm.GetEntry(lowerEntry, index) - if l.IsNotValid() { - fmt.Printf("ERROR: LowerUpper('%s', '%s', %d)\n", lowerEntry, upperEntry, index) - break - } + // v := dm.GetEntry(entry, index) + // if v.IsNotValid() { + // fmt.Printf("ERROR: GetPercent('%s', '%s', %d)\n", entry, max, index) + // break + // } + // + // m := dm.GetEntry(max, index) + // if m.IsNotValid() { + // fmt.Printf("ERROR: GetPercent('%s', '%s', %d)\n", entry, max, index) + // break + // } - u := dm.GetEntry(upperEntry, index) - if u.IsNotValid() { - fmt.Printf("ERROR: LowerUpper('%s', '%s', %d)\n", lowerEntry, upperEntry, index) - break - } - - if l.ValueFloat > 0 { - ret = 0 - l.ValueFloat - break - } - ret = u.ValueFloat + ret = GetPercent(entry.GetFloat(), max.GetFloat()) } return ret } -func (dm *DataMap) GetPercent(entry string, max string, index int) float64 { - var ret float64 - for range Only.Once { - v := dm.GetEntry(entry, index) - if v.IsNotValid() { - fmt.Printf("ERROR: GetPercent('%s', '%s', %d)\n", entry, max, index) - break - } - - m := dm.GetEntry(max, index) - if m.IsNotValid() { - fmt.Printf("ERROR: GetPercent('%s', '%s', %d)\n", entry, max, index) - break - } - - ret = GetPercent(v.ValueFloat, m.ValueFloat) - } - return ret -} - -func (dm *DataMap) GetValue(entry string, index int) float64 { - var ret float64 - for range Only.Once { - v := dm.GetEntry(entry, index) - if v.IsNotValid() { - fmt.Printf("ERROR: GetValue('%s', %d)\n", entry, index) - break - } - - ret = v.ValueFloat - } - return ret -} - - func (dm *DataMap) AppendMap(add DataMap) { for range Only.Once { - if dm.DataPoints == nil { - dm.DataPoints = make(map[string]DataPointEntries) + if dm.Map == nil { + dm.Map = make(map[string]*DataEntries) } - for point, de := range add.DataPoints { - if dd, ok := dm.DataPoints[point]; ok { + for point, de := range add.Map { + if dd, ok := dm.Map[point]; ok { jde, _ := json.Marshal(de) jdd, _ := json.Marshal(dd) if string(jdd) != string(jde) { @@ -359,24 +370,19 @@ func (dm *DataMap) AppendMap(add DataMap) { fmt.Printf("Duplicate[%s]:\n%s\n%s\n", point, jde, jdd) continue } - dm.DataPoints[point] = de + dm.Map[point] = de dm.Order = append(dm.Order, point) if Points.Exists(point) { fmt.Printf("EXISTS: %s\n", point) } - Points.Add(*de[len(de)-1].Point) + Points.Add(*(de.Entries[de.Len()-1].Point)) } } } func (dm *DataMap) Add(de DataEntry) { for range Only.Once { - // if !strings.Contains(endpoint, ".") { - // // endpoint = valueTypes.PointId(de.EndPoint + "." + string(endpoint)) - // endpoint = JoinWithDots(0, "", de.EndPoint, endpoint) - // } - // DataEntry { // Point: Point{ // Parents: ParentDevices{}, @@ -384,7 +390,7 @@ func (dm *DataMap) Add(de DataEntry) { // GroupName: "", // Name: "", // Unit: "", - // TimeSpan: "", + // UpdateFreq: "", // ValueType: "", // Valid: false, // States: nil, @@ -401,10 +407,19 @@ func (dm *DataMap) Add(de DataEntry) { // Hide: false, // } - // fmt.Printf("DEBUG: dm.Add(): %s ?= %s.%s\n", de.FullId(), de.EndPoint, de.Point.Id) + // fmt.Printf("DEBUG DataMap.Add() %s - Value(%s):'%s' Parent:'%s'\n", de.FullId(), de.Point.ValueType, de.Value, de.Parent) endpoint := de.FullId() de.Index = len(dm.Order) - dm.DataPoints[endpoint] = append(dm.DataPoints[endpoint], de) + + // dm.Map[endpoint] = append(dm.Map[endpoint], de) + if dm.Map[endpoint] == nil { + // make( + dm.Map[endpoint] = &DataEntries{ Entries: []DataEntry{} } + } + entries := dm.Map[endpoint] + if entries.Add(de) == nil { + break + } dm.Order = append(dm.Order, endpoint) if Points.Exists(endpoint) { @@ -414,337 +429,6 @@ func (dm *DataMap) Add(de DataEntry) { } } -func (dm *DataMap) AddAny(endpoint string, parentId string, pid valueTypes.PointId, name string, groupName string, date valueTypes.DateTime, value interface{}, unit string, Type string) { - - for range Only.Once { - point := GetPoint(parentId + "." + pid.String()) - if point == nil { - // No point found. Create one. - point = CreatePoint(parentId, pid, name, groupName, unit, Type) - // for _, uv := range uvs { - // var de DataEntry - // CreatePoint() - // CreateDataEntry(endpoint, parentId, pid, name, groupName, uv.Unit(), uv.Type()) - // // de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, uv) - // if isNil { - // de.Point.ValueType += "(NIL)" - // } - // dm.Add(de) - // } - // // dm.Add(pid, CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, - // // valueTypes.SetUnitValueFloat(value, point.Unit, point.ValueType))) - // break - } - - // ref := valueTypes.SetUnitValueFloat(value, point.Unit, point.ValueType) - // if ref.Unit() != point.Unit { - // fmt.Printf("OOOPS: Unit mismatch - %f %s != %f %s\n", value, point.Unit, ref.ValueFloat(), ref.Unit()) - // point.Unit = ref.Unit() - // } - - uvs, isNil, ok := valueTypes.AnyToUnitValue(value, unit, Type) - if !ok { - fmt.Printf("ERROR: AddAny(endpoint '%s', parentId '%s', pid '%s', name '%s', date '%s', value '%v')", - endpoint, parentId, pid, name, date, value) - break - } - if isNil { - point.ValueType += "(NIL)" - } - - for _, uv := range uvs { - if uv.Unit() != point.Unit { - fmt.Printf("OOOPS: Unit mismatch - %f %s != %f %s\n", value, point.Unit, uv.ValueFloat(), uv.Unit()) - point.Unit = uv.Unit() - } - - var parent ParentDevice - parent.Set(parentId) - point.Parents.Add(parent) - - de := CreateDataEntry(endpoint, parentId, pid, name, groupName, date, uv) - de.Point = point - // de := DataEntry { - // EndPoint: endpoint, - // // FullId: valueTypes.JoinDataPoint(endpoint, point.Id.String()), - // Parent: parent, - // - // Date: date, - // Point: point, - // Value: uv.String(), - // ValueFloat: uv.Value(), - // ValueBool: uv.ValueBool(), - // Index: 0, - // Valid: true, - // Hide: false, - // } - dm.Add(de) - } - - // for _, uv := range uvs { - // de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, uv) - // dm.Add(de) - // } - } -} - -func (dm *DataMap) AddUnitValue(endpoint string, parentId string, pid valueTypes.PointId, name string, groupName string, date valueTypes.DateTime, uv valueTypes.UnitValue) { - - for range Only.Once { - point := GetPoint(parentId + "." + pid.String()) - if point == nil { - // No point found. Create one. - point = CreatePoint(parentId, pid, name, groupName, uv.Unit(), uv.Type()) - } - - if uv.Unit() != point.Unit { - fmt.Printf("OOOPS: Unit mismatch - %s %s != %f %s\n", uv.String(), point.Unit, uv.ValueFloat(), uv.Unit()) - point.Unit = uv.Unit() - } - - var parent ParentDevice - parent.Set(parentId) - point.Parents.Add(parent) - - de := CreateDataEntry(endpoint, parentId, pid, name, groupName, date, uv) - de.Point = point - dm.Add(de) - } -} - -func (de *DataEntry) MakeState(state bool) DataEntry { - var ret DataEntry - for range Only.Once { - uv := valueTypes.SetUnitValueBool(state) - de.Value = uv.String() - de.ValueFloat = uv.Value() - de.Point.Unit = "" - de.Point.ValueType = "Bool" - de.Point.Valid = true - de.Valid = true - de.Hide = false - } - - return ret -} - -func (de *DataEntry) MakeFloat(value float64, unit string, Type string) { - for range Only.Once { - if unit == "" { - unit = de.Point.Unit - } - if Type == "" { - Type = de.Point.ValueType - } - uv := valueTypes.SetUnitValueFloat(value, unit, Type) - de.Value = uv.String() - de.ValueFloat = uv.Value() - de.Valid = true - de.Hide = false - } -} - - -// func CreateDataEntry(endpoint string, parentId string, pid valueTypes.PointId, name string, groupName string, dateTime valueTypes.DateTime, uv valueTypes.UnitValue) DataEntry { -func CreateDataEntry(endpoint string, parentId string, pid valueTypes.PointId, name string, groupName string, dateTime valueTypes.DateTime, uv valueTypes.UnitValue) DataEntry { - var ret DataEntry - for range Only.Once { - if name == "" { - name = pid.PointToName() - } - point := CreatePoint(parentId, pid, name, groupName, uv.Unit(), uv.Type()) - - // point = &Point { - // Parents: de.Point.Parents, - // Id: pid, - // GroupName: "alias", - // Name: name, - // Unit: de.Point.Unit, - // TimeSpan: de.Point.TimeSpan, - // ValueType: de.Point.ValueType, - // Valid: true, - // States: de.Point.States, - // } - // var parent ParentDevice - // parent.Set(parentId) - // point.Parents.Add(parent) - // point.Unit = "binary" - // if point.Unit == "" { - // point.Unit = ref.Unit() - // } - // point.Name = name - // if point.Name == "" { - // point.Name = pid.PointToName() - // } - // // if de2.Point.GroupName == "" { - // // de2.Point.GroupName = groupName - // // } - // point.FixUnitType() - // point.Valid = true - - var parent ParentDevice - parent.Set(parentId) - - ret = DataEntry { - Point: point, - Date: dateTime, - EndPoint: endpoint, - Parent: parent, // ParentDevice{}, - Value: uv.String(), - ValueFloat: uv.ValueFloat(), - ValueBool: uv.ValueBool(), - Index: 0, - Valid: true, - Hide: false, - } - } - - return ret -} - -func CopyDataEntry(ref DataEntry, endpoint string, parentId string, pid valueTypes.PointId, name string, groupName string, unit string, Type string) DataEntry { - var ret DataEntry - for range Only.Once { - if name == "" { - name = pid.PointToName() - } - - point := CopyPoint(*ref.Point, parentId, pid, name, groupName, unit, Type) - // point = &Point { - // Parents: de.Point.Parents, - // Id: pid, - // GroupName: "alias", - // Name: name, - // Unit: de.Point.Unit, - // TimeSpan: de.Point.TimeSpan, - // ValueType: de.Point.ValueType, - // Valid: true, - // States: de.Point.States, - // } - // var parent ParentDevice - // parent.Set(parentId) - // point.Parents.Add(parent) - // point.Unit = "binary" - // if point.Unit == "" { - // point.Unit = ref.Unit() - // } - // point.Name = name - // if point.Name == "" { - // point.Name = pid.PointToName() - // } - // // if de2.Point.GroupName == "" { - // // de2.Point.GroupName = groupName - // // } - // point.FixUnitType() - // point.Valid = true - - ret.Point = point - ret.EndPoint = endpoint - ret.Parent.Set(parentId) - ret.Valid = true - ret.Hide = false - } - - return ret -} - -func CreatePoint(parentId string, pid valueTypes.PointId, name string, groupName string, unit string, Type string) *Point { - var point Point - for range Only.Once { - if name == "" { - name = pid.PointToName() - } - - var parent ParentDevice - parent.Set(parentId) - var parents ParentDevices - parents.Add(parent) - - point = Point { - Parents: parents, - Id: pid, - GroupName: groupName, - Name: name, - Unit: unit, - TimeSpan: "", - ValueType: Type, - Valid: true, - States: nil, - } - point.FixUnitType() - } - - return &point -} - -func CopyPoint(ref Point, parentId string, pid valueTypes.PointId, name string, groupName string, unit string, Type string) *Point { - for range Only.Once { - if name == "" { - name = pid.PointToName() - } - - var parent ParentDevice - parent.Set(parentId) - ref.Parents.Add(parent) - ref.Id = pid - ref.Unit = unit - ref.Name = name - ref.TimeSpan = "" - ref.GroupName = groupName - ref.ValueType = Type - ref.Valid = true - ref.States = nil - - ref.FixUnitType() - } - - return &ref -} - - -func (dm *DataMap) FromRefAddAlias(ref string, parentId string, pid string, name string) { - for range Only.Once { - pe := dm.GetEntry(ref, 0) - if pe.IsNotValid() { - fmt.Printf("ERROR: FromRefAddAlias('%s', '%s', '%s', '%s')\n", ref, parentId, pid, name) - break - } - - de := CopyDataEntry(pe, pe.EndPoint, parentId, valueTypes.SetPointIdString(pid), name, pe.Point.GroupName, pe.Point.Unit, pe.Point.ValueType) - dm.Add(de) - } -} - -func (dm *DataMap) FromRefAddState(ref string, parentId string, pid string, name string) { - for range Only.Once { - pe := dm.GetEntry(ref, 0) - if pe.IsNotValid() { - fmt.Printf("ERROR: FromRefAddState('%s', '%s', '%s', '%s')\n", ref, parentId, pid, name) - break - } - - de := CopyDataEntry(pe, pe.EndPoint, parentId, valueTypes.SetPointIdString(pid), name, pe.Point.GroupName, pe.Point.Unit, pe.Point.ValueType) - de.MakeState(pe.ValueBool) - // de := pe.CreateState(pe.EndPoint, parentId, valueTypes.SetPointIdString(pid), name) - dm.Add(de) - } -} - -func (dm *DataMap) FromRefAddFloat(ref string, parentId string, pid string, name string, value float64) { - for range Only.Once { - pe := dm.GetEntry(ref, 0) - if pe.IsNotValid() { - fmt.Printf("ERROR: FromRefAddFloat('%s', '%s', '%s', '%s')\n", ref, parentId, pid, name) - break - } - - de := CopyDataEntry(pe, pe.EndPoint, parentId, valueTypes.SetPointIdString(pid), name, pe.Point.GroupName, pe.Point.Unit, pe.Point.ValueType) - de.MakeFloat(value, "", "") - // de := pe.CreateFloat(pe.EndPoint, parentId, valueTypes.SetPointIdString(pid), name, value) - dm.Add(de) - } -} - func (dm *DataMap) Print() { for range Only.Once { table := datatable.New("utf8-heavy") @@ -766,15 +450,15 @@ func (dm *DataMap) Print() { ) for i, k := range dm.Order { - for _, v := range dm.DataPoints[k] { + for _, v := range dm.Map[k].Entries { table.AddRowItems( i, v.EndPoint, v.Point.Id, - v.Point.Name, + v.Point.Description, v.Point.Unit, - v.Point.TimeSpan, + v.Point.UpdateFreq, v.Value, v.Point.Valid, // fmt.Sprintf("%s\n%s\n", v.FullId, v.Value), @@ -792,7 +476,6 @@ func (dm *DataMap) Print() { } } - func GetPercent(value float64, max float64) float64 { if max == 0 { return 0 @@ -817,454 +500,151 @@ func JoinWithDots(intSize int, dateFormat string, args ...interface{}) string { } -// func (dm *DataMap) Add(point string, entry DataEntry) { -// dm.Entries[point] = entry -// dm.Order = append(dm.Order, point) -// } +func (dm *DataMap) AddAny(endpoint string, parentId string, pid valueTypes.PointId, name string, groupName string, date valueTypes.DateTime, value interface{}, unit string, Type string, timeSpan string) { -// func (dm *DataMap) HideEntry(pointId valueTypes.PointId) { -// for range Only.Once { -// de := dm.GetEntryFromPointId(pointId) -// de.Hide() -// } -// } + for range Only.Once { + var point Point + p := GetPoint(parentId + "." + pid.String()) + if p == nil { + // No point found. Create one. + point = CreatePoint(parentId, pid, name, groupName, unit, Type, timeSpan) + } else { + point = *p + } -// func (dm *DataMap) AddEntry(endpoint string, parentId string, point Point, date valueTypes.DateTime, value string) { -// for range Only.Once { -// unit := point.Unit // Save unit. -// vType := point.ValueType // Save type. -// -// // Match to a previously defined point. -// p := GetPoint(point.Id.String()) -// if p != nil { -// // No point found. Create one. -// p = CreatePoint(parentId, pid, name, groupName, unit, Type) -// } -// point = *p -// -// // var parents ParentDevices -// // parents.Add(ParentDevice{Key: device}) -// var parent ParentDevice -// parent.Set(parentId) -// point.Parents.Add(parent) -// -// if point.Name == "" { -// point.Name = point.Id.PointToName() -// } -// // fid := JoinDevicePoint(parent.Key, point.Id) -// ref := valueTypes.SetUnitValueString(value, unit, vType) -// point.Unit = ref.Unit() -// point.Valid = true -// -// if _, ok := dm.DataPoints[point.Id.String()]; ok { -// fmt.Printf("BARF: %s\n", point.Id) -// } -// -// // dm.Add(JoinDevicePoint(endpoint, point.Id), DataEntry { -// dm.Add(DataEntry { -// EndPoint: endpoint, -// // FullId: valueTypes.JoinDataPoint(endpoint, point.Id.String()), -// // FullId: JoinDevicePoint(parent.Key, point.Id), -// Parent: parent, -// -// Point: &point, -// Date: date, -// Value: ref.String(), -// ValueFloat: ref.Value(), -// ValueBool: ref.ValueBool(), -// Index: 0, -// Valid: true, -// Hide: false, -// }) -// } -// } + // ref := valueTypes.SetUnitValueFloat(value, point.Unit, point.ValueType) + // if ref.Unit() != point.Unit { + // fmt.Printf("OOOPS: Unit mismatch - %f %s != %f %s\n", value, point.Unit, ref.ValueFloat(), ref.Unit()) + // point.Unit = ref.Unit() + // } -// func (dm *DataMap) AddUnitValue(endpoint string, parentId string, pid valueTypes.PointId, name string, groupName string, date valueTypes.DateTime, ref valueTypes.UnitValue) { + uvs, isNil, ok := valueTypes.AnyToUnitValue(value, unit, Type, valueTypes.DateTimeLayout) + if !ok { + fmt.Printf("ERROR: AddAny(endpoint '%s', parentId '%s', pid '%s', name '%s', date '%s', value '%v')", + endpoint, parentId, pid, name, date, value) + break + } + if isNil { + point.ValueType += "(NIL)" + } + + for _, uv := range uvs { + if uv.Unit() != point.Unit { + fmt.Printf("OOOPS: Unit mismatch - %f %s != %f %s\n", value, point.Unit, uv.ValueFloat(), uv.Unit()) + point.Unit = uv.Unit() + } + + var parent ParentDevice + parent.Set(parentId) + point.Parents.Add(parent) + + de := CreatePointDataEntry(endpoint, parentId, point, date, uv) + // de := CreateDataEntry(endpoint, parentId, pid, name, groupName, date, uv) + de.Point = &point + // de := DataEntry { + // EndPoint: endpoint, + // // FullId: valueTypes.JoinDataPoint(endpoint, point.Id.String()), + // Parent: parent, + // + // Date: date, + // Point: point, + // Value: uv.String(), + // ValueFloat: uv.Value(), + // ValueBool: uv.ValueBool(), + // Index: 0, + // Valid: true, + // Hide: false, + // } + dm.Add(de) + } + + // for _, uv := range uvs { + // de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, uv) + // dm.Add(de) + // } + } +} + +func (dm *DataMap) AddUnitValue(endpoint string, parentId string, pid valueTypes.PointId, name string, groupName string, date valueTypes.DateTime, uv valueTypes.UnitValue, timeSpan string) { + + for range Only.Once { + var point Point + p := GetPoint(parentId + "." + pid.String()) + if p == nil { + // No point found. Create one. + point = CreatePoint(parentId, pid, name, groupName, uv.Unit(), uv.Type(), timeSpan) + } else { + point = *p + } + + if uv.Unit() != point.Unit { + fmt.Printf("OOOPS: Unit mismatch - %s %s != %f %s\n", uv.String(), point.Unit, uv.ValueFloat(), uv.Unit()) + point.Unit = uv.Unit() + } + + var parent ParentDevice + parent.Set(parentId) + point.Parents.Add(parent) + + de := CreatePointDataEntry(endpoint, parentId, point, date, uv) + de.Point = &point + dm.Add(de) + } +} + +// func CreateDataEntry(endpoint string, parentId string, pid valueTypes.PointId, name string, groupName string, dateTime valueTypes.DateTime, uv valueTypes.UnitValue, timeSpan string) DataEntry { +// var ret DataEntry // for range Only.Once { -// if endpoint == "" { -// endpoint = apiReflect.GetCallerPackage(2) -// } -// -// ref = ref.UnitValueFix() -// // if name == "" { // name = pid.PointToName() // } +// point := CreatePoint(parentId, pid, name, groupName, uv.Unit(), uv.Type(), timeSpan) // -// point := GetPoint(pid.String()) -// if point == nil { -// // No point found. Create one. -// point = CreatePoint(parentId, pid, name, groupName, ref.Unit(), ref.Type()) -// // de := CreateDataEntry(endpoint, parentId, pid, name, groupName, date, ref) -// // dm.Add(de) -// // break -// } -// -// var parent ParentDevice -// parent.Set(parentId) -// point.Parents.Add(parent) -// if point.Unit == "" { -// point.Unit = ref.Unit() -// } -// if point.Name == "" { -// point.Name = name -// } -// if point.Name == "" { -// point.Name = pid.PointToName() -// } -// if point.GroupName == "" { -// point.GroupName = groupName -// } -// point.FixUnitType() -// point.Valid = true -// -// dm.Add(DataEntry { -// EndPoint: endpoint, -// // FullId: valueTypes.JoinDataPoint(endpoint, point.Id.String()), -// // FullId: JoinDevicePoint(parent.Key, point.Id), -// Parent: parent, -// -// Point: point, -// Date: date, -// Value: ref.String(), -// ValueFloat: ref.Value(), -// ValueBool: ref.ValueBool(), -// Index: 0, -// Valid: true, -// Hide: false, -// }) -// } -// } -// -// func (dm *DataMap) AddFloat(endpoint string, parentId string, pid PointId, name string, date valueTypes.DateTime, value float64) { -// for range Only.Once { -// // fvs := Float64ToString(value) -// point := GetPoint(parentId, pid) -// if point == nil { -// // No UV found. Create one. -// dm.Add(pid, CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, valueTypes.SetUnitValueFloat(value, point.Unit, point.ValueType))) -// break -// } -// -// ref := valueTypes.SetUnitValueFloat(value, point.Unit, point.ValueType) -// if ref.Unit() != point.Unit { -// fmt.Printf("OOOPS: Unit mismatch - %f %s != %f %s\n", value, point.Unit, ref.ValueFloat(), ref.Unit()) -// point.Unit = ref.Unit() -// } -// -// var parent ParentDevice -// parent.Set(parentId) -// point.Parents.Add(parent) -// -// dm.Add(pid, DataEntry { -// EndPoint: endpoint, -// FullId: JoinDevicePoint(endpoint, point.Id), -// // FullId: JoinDevicePoint(parent.Key, point.Id), -// Parent: parent, -// -// Date: date, -// Point: point, -// Value: ref.String(), -// ValueFloat: ref.Value(), -// }) -// } -// -// uv := valueTypes.SetUnitValueFloat(value, "", "float") -// de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, uv) -// // de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, UnitValue { -// // Unit: "float", -// // Value: fmt.Sprintf("%f", value), -// // ValueFloat: 0, -// // }) -// dm.Add(pid, de) -// } -// -// func (dm *DataMap) AddString(endpoint string, parentId string, pid PointId, name string, date valueTypes.DateTime, value string) { -// dm.Add(pid, CreateDataEntryString(date, endpoint, parentId, pid, name, value)) -// } -// -// func (dm *DataMap) AddInt(endpoint string, parentId string, pid PointId, name string, date valueTypes.DateTime, value int64) { -// -// for range Only.Once { -// uvs, ok := valueTypes.AnyToUnitValue(value, "", "") -// if !ok { -// fmt.Printf("ERROR: AddInt(endpoint '%s', parentId '%s', pid '%s', name '%s', date '%s', value %d)", -// endpoint, parentId, pid, name, date, value) -// break -// } -// for _, uv := range uvs { -// de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, uv) -// dm.Add(pid, de) -// } -// -// // uv := valueTypes.SetUnitValueInteger(value, "", "int") -// // de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, uv) -// // // de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, UnitValue { -// // // Unit: "int", -// // // Value: fmt.Sprintf("%d", value), -// // // ValueFloat: float64(value), -// // // }) -// // dm.Add(pid, de) -// } -// } - -// func (dm *DataMap) AddAny(endpoint string, parentId string, pid valueTypes.PointId, name string, date valueTypes.DateTime, value interface{}) { -// -// for range Only.Once { -// uvs, isNil, ok := valueTypes.AnyToUnitValue(value, "", "") -// if !ok { -// fmt.Printf("ERROR: AddAny(endpoint '%s', parentId '%s', pid '%s', name '%s', date '%s', value '%v')", -// endpoint, parentId, pid, name, date, value) -// break -// } -// -// point := GetPoint(parentId + "." + pid.String()) -// if point == nil { -// // No UV found. Create one. -// for _, uv := range uvs { -// de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, uv) -// if isNil { -// de.Point.ValueType += "(NIL)" -// } -// dm.Add(de) -// } -// // dm.Add(pid, CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, -// // valueTypes.SetUnitValueFloat(value, point.Unit, point.ValueType))) -// break -// } -// -// // ref := valueTypes.SetUnitValueFloat(value, point.Unit, point.ValueType) -// // if ref.Unit() != point.Unit { -// // fmt.Printf("OOOPS: Unit mismatch - %f %s != %f %s\n", value, point.Unit, ref.ValueFloat(), ref.Unit()) +// // point = &Point { +// // Parents: de.Point.Parents, +// // Id: pid, +// // GroupName: "alias", +// // Name: name, +// // Unit: de.Point.Unit, +// // UpdateFreq: de.Point.UpdateFreq, +// // ValueType: de.Point.ValueType, +// // Valid: true, +// // States: de.Point.States, +// // } +// // var parent ParentDevice +// // parent.Set(parentId) +// // point.Parents.Add(parent) +// // point.Unit = "binary" +// // if point.Unit == "" { // // point.Unit = ref.Unit() // // } -// -// if isNil { -// point.ValueType += "(NIL)" -// } -// -// for _, uv := range uvs { -// if uv.Unit() != point.Unit { -// fmt.Printf("OOOPS: Unit mismatch - %f %s != %f %s\n", value, point.Unit, uv.ValueFloat(), uv.Unit()) -// point.Unit = uv.Unit() -// } -// -// var parent ParentDevice -// parent.Set(parentId) -// point.Parents.Add(parent) -// -// // CreateDataEntry -// de := DataEntry { -// EndPoint: endpoint, -// // FullId: valueTypes.JoinDataPoint(endpoint, point.Id.String()), -// Parent: parent, -// -// Date: date, -// Point: point, -// Value: uv.String(), -// ValueFloat: uv.Value(), -// ValueBool: uv.ValueBool(), -// Index: 0, -// Valid: true, -// Hide: false, -// } -// dm.Add(de) -// } -// -// for _, uv := range uvs { -// de := CreateDataEntryUnitValue(date, endpoint, parentId, pid, name, uv) -// dm.Add(de) -// } -// } -// } - -// func (de *DataEntry) CreateFloat(endpoint string, parentId string, pid valueTypes.PointId, name string, groupName string, unit string, Type string, value float64) DataEntry { -// var ret DataEntry -// for range Only.Once { -// if name == "" { -// name = pid.PointToName() -// } -// -// ret = de.CreateDataEntry(endpoint, parentId, pid, name, groupName, unit, Type) -// uv := valueTypes.SetUnitValueFloat(value, ret.Point.Unit, ret.Point.ValueType) -// ret.Value = uv.String() -// ret.ValueFloat = uv.Value() -// ret.Valid = true -// ret.Hide = false -// } -// return ret -// } -// -// func (de *DataEntry) CreateState(endpoint string, parentId string, pid valueTypes.PointId, name string) DataEntry { -// var ret DataEntry -// for range Only.Once { -// if name == "" { -// name = pid.PointToName() -// } -// -// de2 := de.CreateDataEntry(endpoint, parentId, pid, name) -// if de2.ValueFloat == 0 { -// de2.Value = "false" -// de2.ValueBool = false -// de2.ValueFloat = 0 -// } else { -// de2.Value = "true" -// de2.ValueBool = true -// de2.ValueFloat = 1 -// } -// de2.Valid = true -// de2.Hide = false +// // point.Name = name +// // if point.Name == "" { +// // point.Name = pid.PointToName() +// // } +// // // if de2.Point.GroupName == "" { +// // // de2.Point.GroupName = groupName +// // // } +// // point.FixUnitType() +// // point.Valid = true // // var parent ParentDevice // parent.Set(parentId) -// de2.Point.Parents.Add(parent) -// de2.Point.Unit = "binary" -// if de2.Point.Unit == "" { -// de2.Point.Unit = ref.Unit() +// +// ret = DataEntry { +// Point: point, +// Date: dateTime, +// EndPoint: endpoint, +// Parent: parent, // ParentDevice{}, +// Value: uv, +// // Value: uv.String(), +// // ValueFloat: uv.ValueFloat(), +// // ValueBool: uv.ValueBool(), +// Index: 0, +// Valid: true, +// Hide: false, // } -// de2.Point.Name = name -// if de2.Point.Name == "" { -// de2.Point.Name = pid.PointToName() -// } -// // if de2.Point.GroupName == "" { -// // de2.Point.GroupName = groupName -// // } -// de2.Point.FixUnitType() -// de2.Point.Valid = true // } // // return ret // } - -// func CreateDataEntryActive(date valueTypes.DateTime, endpoint string, parentId string, pid valueTypes.PointId, name string, value float64) DataEntry { -// point := GetPoint(parentId, pid) -// if point == nil { -// if name == "" { -// name = pid.PointToName() -// } -// point = CreatePoint(parentId, pid, name, "state") -// } -// -// var parent ParentDevice -// parent.Set(parentId) -// point.Parents.Add(parent) -// -// return DataEntry { -// EndPoint: endpoint, -// FullId: valueTypes.JoinDataPoint(endpoint, point.Id.String()), -// // FullId: JoinDevicePoint(parent.Key, point.Id), -// Parent: parent, -// -// Point: point, -// Date: date, -// Value: fmt.Sprintf("%v", IsActive(value)), -// ValueFloat: 0, -// Index: 0, -// } -// } -// -// func CreateDataEntryString(date valueTypes.DateTime, endpoint string, parentId string, pid valueTypes.PointId, name string, value string) DataEntry { -// point := GetPoint(parentId, pid) -// if point == nil { -// if name == "" { -// name = pid.PointToName() -// } -// point = CreatePoint(parentId, pid, name, "string") -// } -// -// var parent ParentDevice -// parent.Set(parentId) -// point.Parents.Add(parent) -// -// return DataEntry { -// EndPoint: endpoint, -// FullId: valueTypes.JoinDataPoint(endpoint, pid.String()), -// // FullId: JoinDevicePoint(parent.Key, pid), -// Parent: parent, -// -// Point: point, -// Date: date, -// Value: value, -// ValueFloat: 0, -// Index: 0, -// } -// } -// -// func CreateDataEntryUnitValue(date valueTypes.DateTime, endpoint string, parentId string, pid valueTypes.PointId, name string, value valueTypes.UnitValue) DataEntry { -// value = value.UnitValueFix() -// -// point := GetPoint(parentId + "." + pid.String()) -// if point == nil { -// if name == "" { -// name = pid.PointToName() -// } -// point = CreatePoint(parentId, pid, name, value.Unit()) -// } -// -// var parent ParentDevice -// parent.Set(parentId) -// point.Parents.Add(parent) -// point.Valid = true -// -// return DataEntry { -// EndPoint: endpoint, -// // FullId: valueTypes.JoinDataPoint(endpoint, pid.String()), -// // FullId: JoinDevicePoint(parent.Key, pid), -// Parent: parent, -// -// Point: point, -// Date: date, -// Value: value.String(), -// ValueFloat: value.Value(), -// ValueBool: value.ValueBool(), -// Index: 0, -// Valid: true, -// Hide: false, -// } -// } -// -// func CreatePoint(parentId string, pid valueTypes.PointId, name string, unit string) *Point { -// if name == "" { -// name = pid.PointToName() -// } -// -// var parents ParentDevices -// parents.Add(ParentDevice{Key: parentId}) -// -// ret := &Point { -// Parents: parents, -// Id: pid, -// GroupName: parentId, -// Name: name, -// Unit: unit, -// TimeSpan: "", -// ValueType: "", -// Valid: true, -// States: nil, -// } -// ret.FixUnitType() -// -// return ret -// } -// -// func IsActive(value float64) bool { -// if (value > 0.01) || (value < -0.01) { -// return true -// } -// return false -// } - -// func JoinDevicePoint(endpoint string, pid valueTypes.PointId) valueTypes.PointId { -// var ret valueTypes.PointId -// for range Only.Once { -// if endpoint == "" { -// endpoint = "virtual" -// } -// ret = valueTypes.PointId(JoinWithDots(0, "", endpoint, pid)) -// } -// return ret -// } - -// func JoinStringsWithDots(args ...string) string { -// return strings.Join(args, ".") -// } diff --git a/iSolarCloud/api/struct_de.go b/iSolarCloud/api/struct_de.go new file mode 100644 index 000000000..41c9b73cb --- /dev/null +++ b/iSolarCloud/api/struct_de.go @@ -0,0 +1,102 @@ +package api + +import ( + "GoSungrow/iSolarCloud/api/valueTypes" + "github.com/MickMake/GoUnify/Only" +) + + +type DataEntry struct { + EndPoint string `json:"endpoint"` + Point *Point `json:"point"` + Parent ParentDevice `json:"parent"` + Date valueTypes.DateTime `json:"date"` + Value valueTypes.UnitValue `json:"value"` + + Valid bool `json:"valid"` + Hide bool `json:"hide"` + Index int `json:"index"` +} + +func (de *DataEntry) IsValid() bool { + var ok bool + for range Only.Once { + if de == nil { + break + } + if de.Point == nil { + break + } + if de.Point.Valid == false { + break + } + ok = true + } + return ok +} +func (de *DataEntry) IsNotValid() bool { + return !de.IsValid() +} + +func (de *DataEntry) FullId() string { + return de.EndPoint + "." + de.Point.Id.String() +} + +func (de *DataEntry) SetEndpoint(endpoint string, pointId string) { + de.EndPoint = endpoint // + "." + pointId + de.Point.Id.SetString(pointId) +} + +func (de *DataEntry) SetPointId(pointId string) { + de.Point.Id.SetString(pointId) +} + +func (de *DataEntry) SetPointName(name string) { + if name != "" { + de.Point.SetName(name) + } +} + +func (de *DataEntry) MakeState(state bool) DataEntry { + var ret DataEntry + for range Only.Once { + // uv := valueTypes.SetUnitValueBool(state) + // de.Value = uv.String() + // de.ValueFloat = uv.Value() + de.Value = valueTypes.SetUnitValueBool(state) + de.Point.Unit = "" + de.Point.ValueType = "Bool" + de.Point.Valid = true + de.Valid = true + // de.EndPoint += ".state" + de.Hide = false + } + + return ret +} + +func (de *DataEntry) MakeFloat(value float64, unit string, Type string) { + for range Only.Once { + if unit == "" { + unit = de.Point.Unit + } + if Type == "" { + Type = de.Point.ValueType + } + // uv := valueTypes.SetUnitValueFloat(value, unit, Type) + // de.Value = uv.String() + // de.ValueFloat = uv.Value() + de.Value = valueTypes.SetUnitValueFloat(value, unit, Type) + de.Valid = true + de.Hide = false + } +} + +func (de *DataEntry) Copy() DataEntry { + var ret DataEntry + ret = *de + var point Point + point = *de.Point + ret.Point = &point + return ret +} diff --git a/iSolarCloud/api/struct_dpe.go b/iSolarCloud/api/struct_dpe.go new file mode 100644 index 000000000..180335185 --- /dev/null +++ b/iSolarCloud/api/struct_dpe.go @@ -0,0 +1,175 @@ +package api + +import ( + "GoSungrow/iSolarCloud/api/valueTypes" + "github.com/MickMake/GoUnify/Only" +) + + +type DataEntries struct { + Entries []DataEntry +} + +func NewDataPointEntries() DataEntries { + return DataEntries{ + Entries: []DataEntry{}, + } +} + +func (de *DataEntries) Hide() { + for range Only.Once { + for i := range de.Entries { + de.Entries[i].Hide = true + } + } +} + +const LastEntry = -1 +func (de *DataEntries) GetEntry(index int) *DataEntry { + for range Only.Once { + if de == nil { + return nil + } + if de.Entries == nil { + return nil + } + l := de.Len() - 1 + if index > l { + index = l + break + } + if index < 0 { + index = l + index + 1 + if index < 0 { + index = 0 + } + } + } + return &(de.Entries[index]) +} + +func (de *DataEntries) GetEntryValue(index int) valueTypes.UnitValue { + var ret valueTypes.UnitValue + for range Only.Once { + ref := de.GetEntry(index) + if ref == nil { + break + } + ret = ref.Value + } + return ret +} + +func (de *DataEntries) GetFloat() float64 { + var ret float64 + for range Only.Once { + ref := de.GetEntry(0) + if ref == nil { + break + } + ret = ref.Value.Value() + } + return ret +} + +func (de *DataEntries) MatchPointId(pointId string) bool { + var yes bool + for range Only.Once { + for _, v := range de.Entries { + if v.Point.Id.String() == pointId { + yes = true + break + } + } + } + return yes +} + +func (de *DataEntries) Len() int { + return len(de.Entries) +} + +func (de *DataEntries) GetUnits() string { + var unit string + for range Only.Once { + for _, v := range de.Entries { + unit = v.Point.Unit + break + } + } + return unit +} + +func (de *DataEntries) Add(ref DataEntry) *DataEntries { + for range Only.Once { + if de == nil { + break + } + de.Entries = append(de.Entries, ref) + } + return de +} + +func (de *DataEntries) SetUnits(units string) *DataEntries { + for range Only.Once { + for i := range de.Entries { + de.Entries[i].Point.Unit = units + } + } + return de +} + +func (de *DataEntries) SetGroupName(groupName string) *DataEntries { + for range Only.Once { + for i := range de.Entries { + de.Entries[i].Point.GroupName = groupName + } + } + return de +} + +func (de *DataEntries) SetTimestamp(timeStamp valueTypes.DateTime) *DataEntries { + for range Only.Once { + for i := range de.Entries { + // dt := valueTypes.SetDateTimeString(timeStamp) + de.Entries[i].Date = timeStamp + } + } + return de +} + +func (de *DataEntries) Copy() DataEntries { + var ret DataEntries + for _, d := range de.Entries { + // var point Point + // point = *d.Point + // d.Point = &point + ret.Entries = append(ret.Entries, d.Copy()) + } + return ret +} + +func (de *DataEntries) MakeState(state bool) *DataEntries { + for i := range de.Entries { + de.Entries[i].MakeState(state) + } + return de +} + +func (de *DataEntries) SetFloat(value float64, unit string, Type string) *DataEntries { + for i := range de.Entries { + de.Entries[i].MakeFloat(value, unit, Type) + } + return de +} + +func (de *DataEntries) FloatToState(value float64) *DataEntries { + for i := range de.Entries { + if value == 0 { + de.Entries[i].MakeState(false) + break + } + de.Entries[i].MakeState(true) + } + return de +} diff --git a/iSolarCloud/api/struct_point.go b/iSolarCloud/api/struct_point.go index f482e7617..87d621f7a 100644 --- a/iSolarCloud/api/struct_point.go +++ b/iSolarCloud/api/struct_point.go @@ -11,15 +11,15 @@ import ( type Point struct { - Parents ParentDevices `json:"parents,omitempty"` - Id valueTypes.PointId `json:"id,omitempty"` - GroupName string `json:"group_name,omitempty"` - Name string `json:"name,omitempty"` - Unit string `json:"unit,omitempty"` - TimeSpan string `json:"time_span,omitempty"` - ValueType string `json:"value_type,omitempty"` - Valid bool `json:"valid,omitempty"` - States map[string]string `json:"states,omitempty"` + Parents ParentDevices `json:"parents,omitempty"` + Id valueTypes.PointId `json:"id,omitempty"` + GroupName string `json:"group_name,omitempty"` + Description string `json:"description,omitempty"` + Unit string `json:"unit,omitempty"` + UpdateFreq string `json:"time_span,omitempty"` + ValueType string `json:"value_type,omitempty"` + Valid bool `json:"valid,omitempty"` + States map[string]string `json:"states,omitempty"` } @@ -119,45 +119,51 @@ func (p *Point) WhenReset() string { } func (p Point) String() string { - return fmt.Sprintf("Id:%s\tName:%s\tUnits:%s\tTimespan:%s", p.Id, p.Name, p.Unit, p.TimeSpan) - // return p.TimeSpan + return fmt.Sprintf("Id:%s\tName:%s\tUnits:%s\tUpdateFreq:%s", p.Id, p.Description, p.Unit, p.UpdateFreq) } func (p Point) IsInstant() bool { - if p.TimeSpan == PointTimeSpanInstant { + if p.UpdateFreq == UpdateFreqInstant { return true } return false } func (p Point) IsDaily() bool { - if p.TimeSpan == PointTimeSpanDaily { + if p.UpdateFreq == UpdateFreqDaily { return true } return false } func (p Point) IsMonthly() bool { - if p.TimeSpan == PointTimeSpanMonthly { + if p.UpdateFreq == UpdateFreqMonthly { return true } return false } func (p Point) IsYearly() bool { - if p.TimeSpan == PointTimeSpanYearly { + if p.UpdateFreq == UpdateFreqYearly { return true } return false } func (p Point) IsTotal() bool { - if p.TimeSpan == PointTimeSpanTotal { + if p.UpdateFreq == UpdateFreqTotal { return true } return false } +func (p *Point) SetName(name string) { + if name == "" { + name = p.Id.PointToName() + } + p.Description = name +} + func GetPoint(point string) *Point { return Points.Get(point) @@ -206,8 +212,49 @@ type ParentDevice struct { Key string `json:"ps_key"` PsId string `json:"ps_id"` Type string `json:"parent_type"` - Code string `json:"parent_code"` + Code string `json:"parent_code"` } + +func NewParentDevice(key string) ParentDevice { + var ret ParentDevice + ret.Set(key) + return ret +} + +func (pd *ParentDevice) Set(key string) { + for range Only.Once { + pd.Key = key + } +} + +func (pd *ParentDevice) Split() { + for range Only.Once { + // if pd.Key == "virtual" { + // break + // } + if pd.Key == "" { + pd.Key = "virtual" + break + } + + if !strings.Contains(pd.Key, "_") { + pd.PsId = pd.Key + break + } + s := strings.Split(pd.Key, "_") + if len(s) > 0 { + pd.PsId = s[0] + } + if len(s) > 1 { + pd.Type = s[1] + } + if len(s) > 2 { + pd.Code = s[2] + } + } +} + + type ParentDevices struct { Map map[string]*ParentDevice Index []string @@ -256,6 +303,17 @@ func (pd *ParentDevices) PsIds() string { return ret } +// func (pd *ParentDevices) Get() ParentDevice { +// var ret ParentDevice +// for range Only.Once { +// if len(pd.Map) == 0 { +// break +// } +// ret = *(pd.Map[len(pd.Map)-1]) +// } +// return ret +// } + func (pd *ParentDevices) Codes() string { var ret string for _, l := range pd.Index { @@ -274,40 +332,6 @@ func (pd *ParentDevices) Types() string { return ret } - -func (pd *ParentDevice) Set(key string) { - for range Only.Once { - pd.Key = key - } -} - -func (pd *ParentDevice) Split() { - for range Only.Once { - // if pd.Key == "virtual" { - // break - // } - if pd.Key == "" { - pd.Key = "virtual" - break - } - - if !strings.Contains(pd.Key, "_") { - pd.PsId = pd.Key - break - } - s := strings.Split(pd.Key, "_") - if len(s) > 0 { - pd.PsId = s[0] - } - if len(s) > 1 { - pd.Type = s[1] - } - if len(s) > 2 { - pd.Code = s[2] - } - } -} - // type ParentDevice struct { // Key string `json:"ps_key"` // PsId string `json:"ps_id"` diff --git a/iSolarCloud/api/struct_points.go b/iSolarCloud/api/struct_points.go index 00aebf7a2..816603282 100644 --- a/iSolarCloud/api/struct_points.go +++ b/iSolarCloud/api/struct_points.go @@ -54,7 +54,7 @@ func (pm *PointsMap) Get(point string) *Point { // Id: valueTypes.SetPointIdString(point), // Name: "", // Unit: "", - // TimeSpan: "", + // UpdateFreq: "", // Valid: false, // } } @@ -108,18 +108,18 @@ func (pm *PointsMap) Add(point Point) bool { ep = *pm.Map[point.Id.String()] ep.Parents = ParentDevices{} - if strings.ToLower(ep.Name) == ep.Id.String() { - ep.Name = point.Name + if strings.ToLower(ep.Description) == ep.Id.String() { + ep.Description = point.Description } - if ep.Name == "" { - ep.Name = point.Name + if ep.Description == "" { + ep.Description = point.Description } if ep.Unit == "" { ep.Unit = point.Unit } - if ep.TimeSpan == "" { - ep.TimeSpan = point.TimeSpan + if ep.UpdateFreq == "" { + ep.UpdateFreq = point.UpdateFreq } if ep.GroupName == "" { ep.GroupName = point.GroupName @@ -181,7 +181,7 @@ func (p *Point) HasChanged(comp Point) bool { break } - if p.Name != comp.Name { + if p.Description != comp.Description { break } @@ -189,7 +189,7 @@ func (p *Point) HasChanged(comp Point) bool { break } - if p.TimeSpan != comp.TimeSpan { + if p.UpdateFreq != comp.UpdateFreq { break } @@ -289,72 +289,72 @@ var Points = PointsMap { // "total_income": { PsKey: "virtual", Id: "total_income", Name: "total_income", Unit: "FOO", Type: PointTypeTotal }, // Added manually - // "foo": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "", Name: "", Unit: "", TimeSpan: PointTimeSpanInstant}, + // "foo": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "", Name: "", Unit: "", UpdateFreq: PointUpdateFreqInstant}, // - // "p13001": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13001", Name: "MPPT1 Voltage", Unit: "V", TimeSpan: PointTimeSpanInstant}, + // "p13001": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13001", Name: "MPPT1 Voltage", Unit: "V", UpdateFreq: PointUpdateFreqInstant}, // - // "p13012": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13012", Name: "Total Reactive Power", Unit: "kvar", TimeSpan: PointTimeSpanDaily}, + // "p13012": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13012", Name: "Total Reactive Power", Unit: "kvar", UpdateFreq: PointUpdateFreqDaily}, // - // "p13105": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13105", Name: "MPPT2 Voltage", Unit: "V", TimeSpan: PointTimeSpanInstant}, + // "p13105": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13105", Name: "MPPT2 Voltage", Unit: "V", UpdateFreq: PointUpdateFreqInstant}, // - // "p13122": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13122", Name: "Daily Feed-in Energy", Unit: "kWh", TimeSpan: PointTimeSpanDaily}, + // "p13122": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13122", Name: "Daily Feed-in Energy", Unit: "kWh", UpdateFreq: PointUpdateFreqDaily}, // - // "p13125": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13125", Name: "Total Feed-in Energy", Unit: "kWh", TimeSpan: PointTimeSpanTotal}, + // "p13125": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13125", Name: "Total Feed-in Energy", Unit: "kWh", UpdateFreq: PointUpdateFreqTotal}, // - // "p13138": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13138", Name: "Battery Voltage", Unit: "V", TimeSpan: PointTimeSpanInstant}, + // "p13138": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13138", Name: "Battery Voltage", Unit: "V", UpdateFreq: PointUpdateFreqInstant}, // - // "p13144": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13144", Name: "Daily Self-consumption Rate", Unit: "%", TimeSpan: PointTimeSpanDaily}, + // "p13144": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13144", Name: "Daily Self-consumption Rate", Unit: "%", UpdateFreq: PointUpdateFreqDaily}, // - // "p13157": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13157", Name: "Phase A Voltage", Unit: "V", TimeSpan: PointTimeSpanInstant}, + // "p13157": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13157", Name: "Phase A Voltage", Unit: "V", UpdateFreq: PointUpdateFreqInstant}, // - // "p13158": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13158", Name: "Phase B Voltage", Unit: "V", TimeSpan: PointTimeSpanInstant}, + // "p13158": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13158", Name: "Phase B Voltage", Unit: "V", UpdateFreq: PointUpdateFreqInstant}, // - // "p13159": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13159", Name: "Phase C Voltage", Unit: "V", TimeSpan: PointTimeSpanInstant}, + // "p13159": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13159", Name: "Phase C Voltage", Unit: "V", UpdateFreq: PointUpdateFreqInstant}, // - // "p13161": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13161", Name: "Bus Voltage", Unit: "V", TimeSpan: PointTimeSpanInstant}, - // "p13173": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13173", Name: "Daily Feed-in Energy (PV)", Unit: "kWh", TimeSpan: PointTimeSpanDaily}, - // "p13175": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13175", Name: "Total Feed-in Energy (PV)", Unit: "kWh", TimeSpan: PointTimeSpanTotal}, - // "p13002": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13002", Name: "MPPT1 Current", Unit: "A", TimeSpan: PointTimeSpanInstant}, + // "p13161": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13161", Name: "Bus Voltage", Unit: "V", UpdateFreq: PointUpdateFreqInstant}, + // "p13173": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13173", Name: "Daily Feed-in Energy (PV)", Unit: "kWh", UpdateFreq: PointUpdateFreqDaily}, + // "p13175": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13175", Name: "Total Feed-in Energy (PV)", Unit: "kWh", UpdateFreq: PointUpdateFreqTotal}, + // "p13002": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13002", Name: "MPPT1 Current", Unit: "A", UpdateFreq: PointUpdateFreqInstant}, // "p13003": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13003", Name: "Total DC Power", Unit: "kW"}, - // "p13007": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13007", Name: "Grid Frequency", Unit: "Hz", TimeSpan: PointTimeSpanInstant}, - // "p13008": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13008", Name: "Phase A Current", Unit: "A", TimeSpan: PointTimeSpanInstant}, - // "p13009": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13009", Name: "Phase B Current", Unit: "A", TimeSpan: PointTimeSpanInstant}, - // "p13010": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13010", Name: "Phase C Current", Unit: "A", TimeSpan: PointTimeSpanInstant}, + // "p13007": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13007", Name: "Grid Frequency", Unit: "Hz", UpdateFreq: PointUpdateFreqInstant}, + // "p13008": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13008", Name: "Phase A Current", Unit: "A", UpdateFreq: PointUpdateFreqInstant}, + // "p13009": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13009", Name: "Phase B Current", Unit: "A", UpdateFreq: PointUpdateFreqInstant}, + // "p13010": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13010", Name: "Phase C Current", Unit: "A", UpdateFreq: PointUpdateFreqInstant}, // "p13011": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13011", Name: "Total Active Power", Unit: "kW"}, // "p13013": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13013", Name: "Total Power Factor", Unit: ""}, // "p13018": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13018", Name: "Total Apparent Power", Unit: "VA"}, - // "p13019": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13019", Name: "Internal Air Temperature", Unit: "℃", TimeSpan: PointTimeSpanInstant}, - // "p13028": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13028", Name: "Daily Battery Charging Energy", Unit: "kWh", TimeSpan: PointTimeSpanDaily}, - // "p13029": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13029", Name: "Daily Battery Discharging Energy", Unit: "kWh", TimeSpan: PointTimeSpanDaily}, - // "p13034": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13034", Name: "Total Battery Charging Energy", Unit: "kWh", TimeSpan: PointTimeSpanTotal}, - // "p13035": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13035", Name: "Total Battery Discharging Energy", Unit: "kWh", TimeSpan: PointTimeSpanTotal}, - // "p13106": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13106", Name: "MPPT2 Current", Unit: "A", TimeSpan: PointTimeSpanInstant}, - // "p13112": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13112", Name: "Daily PV Yield", Unit: "kWh", TimeSpan: PointTimeSpanDaily}, - // "p13116": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13116", Name: "Daily Load Energy Consumption from PV", Unit: "kWh", TimeSpan: PointTimeSpanDaily}, + // "p13019": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13019", Name: "Internal Air Temperature", Unit: "℃", UpdateFreq: PointUpdateFreqInstant}, + // "p13028": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13028", Name: "Daily Battery Charging Energy", Unit: "kWh", UpdateFreq: PointUpdateFreqDaily}, + // "p13029": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13029", Name: "Daily Battery Discharging Energy", Unit: "kWh", UpdateFreq: PointUpdateFreqDaily}, + // "p13034": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13034", Name: "Total Battery Charging Energy", Unit: "kWh", UpdateFreq: PointUpdateFreqTotal}, + // "p13035": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13035", Name: "Total Battery Discharging Energy", Unit: "kWh", UpdateFreq: PointUpdateFreqTotal}, + // "p13106": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13106", Name: "MPPT2 Current", Unit: "A", UpdateFreq: PointUpdateFreqInstant}, + // "p13112": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13112", Name: "Daily PV Yield", Unit: "kWh", UpdateFreq: PointUpdateFreqDaily}, + // "p13116": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13116", Name: "Daily Load Energy Consumption from PV", Unit: "kWh", UpdateFreq: PointUpdateFreqDaily}, // "p13119": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13119", Name: "Total Load Active Power", Unit: "kW"}, // "p13121": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13121", Name: "Total Export Active Power", Unit: "kW"}, // "p13126": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13126", Name: "Battery Charging Power", Unit: "kW"}, - // "p13130": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13130", Name: "Total Load Energy Consumption", Unit: "kWh", TimeSpan: PointTimeSpanTotal}, - // "p13134": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13134", Name: "Total PV Yield", Unit: "kWh", TimeSpan: PointTimeSpanTotal}, - // "p13137": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13137", Name: "Total Load Energy Consumption from PV", Unit: "kWh", TimeSpan: PointTimeSpanTotal}, - // "p13139": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13139", Name: "Battery Current", Unit: "A", TimeSpan: PointTimeSpanInstant}, + // "p13130": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13130", Name: "Total Load Energy Consumption", Unit: "kWh", UpdateFreq: PointUpdateFreqTotal}, + // "p13134": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13134", Name: "Total PV Yield", Unit: "kWh", UpdateFreq: PointUpdateFreqTotal}, + // "p13137": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13137", Name: "Total Load Energy Consumption from PV", Unit: "kWh", UpdateFreq: PointUpdateFreqTotal}, + // "p13139": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13139", Name: "Battery Current", Unit: "A", UpdateFreq: PointUpdateFreqInstant}, // "p13140": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13140", Name: "Battery Capacity(kWh)", Unit: "kWh"}, - // "p13141": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13141", Name: "Battery Level (SOC)", Unit: "%", TimeSpan: PointTimeSpanInstant}, - // "p13142": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13142", Name: "Battery Health (SOH)", Unit: "%", TimeSpan: PointTimeSpanInstant}, - // "p13143": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13143", Name: "Battery Temperature", Unit: "℃", TimeSpan: PointTimeSpanInstant}, - // "p13147": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13147", Name: "Daily Purchased Energy", Unit: "kWh", TimeSpan: PointTimeSpanDaily}, - // "p13148": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13148", Name: "Total Purchased Energy", Unit: "kWh", TimeSpan: PointTimeSpanTotal}, + // "p13141": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13141", Name: "Battery Level (SOC)", Unit: "%", UpdateFreq: PointUpdateFreqInstant}, + // "p13142": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13142", Name: "Battery Health (SOH)", Unit: "%", UpdateFreq: PointUpdateFreqInstant}, + // "p13143": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13143", Name: "Battery Temperature", Unit: "℃", UpdateFreq: PointUpdateFreqInstant}, + // "p13147": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13147", Name: "Daily Purchased Energy", Unit: "kWh", UpdateFreq: PointUpdateFreqDaily}, + // "p13148": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13148", Name: "Total Purchased Energy", Unit: "kWh", UpdateFreq: PointUpdateFreqTotal}, // "p13149": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13149", Name: "Purchased Power", Unit: "kW"}, // "p13150": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13150", Name: "Battery Discharging Power", Unit: "kW"}, - // "p13160": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13160", Name: "Array Insulation Resistance", Unit: "kΩ", TimeSpan: PointTimeSpanInstant}, - // "p13162": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13162", Name: "Max. Charging Current (BMS)", Unit: "A", TimeSpan: PointTimeSpanInstant}, - // "p13163": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13163", Name: "Max. Discharging Current (BMS)", Unit: "A", TimeSpan: PointTimeSpanInstant}, - // "p13174": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13174", Name: "Daily Battery Charging Energy from PV", Unit: "kWh", TimeSpan: PointTimeSpanDaily}, - // "p13176": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13176", Name: "Total Battery Charging Energy from PV", Unit: "kWh", TimeSpan: PointTimeSpanTotal}, - // "p13199": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13199", Name: "Daily Load Energy Consumption", Unit: "kWh", TimeSpan: PointTimeSpanDaily}, - // "p18062": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p18062", Name: "Phase A Backup Current", Unit: "A", TimeSpan: PointTimeSpanInstant}, - // "p18063": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p18063", Name: "Phase B Backup Current", Unit: "A", TimeSpan: PointTimeSpanInstant}, - // "p18064": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p18064", Name: "Phase C Backup Current", Unit: "A", TimeSpan: PointTimeSpanInstant}, + // "p13160": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13160", Name: "Array Insulation Resistance", Unit: "kΩ", UpdateFreq: PointUpdateFreqInstant}, + // "p13162": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13162", Name: "Max. Charging Current (BMS)", Unit: "A", UpdateFreq: PointUpdateFreqInstant}, + // "p13163": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13163", Name: "Max. Discharging Current (BMS)", Unit: "A", UpdateFreq: PointUpdateFreqInstant}, + // "p13174": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13174", Name: "Daily Battery Charging Energy from PV", Unit: "kWh", UpdateFreq: PointUpdateFreqDaily}, + // "p13176": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13176", Name: "Total Battery Charging Energy from PV", Unit: "kWh", UpdateFreq: PointUpdateFreqTotal}, + // "p13199": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p13199", Name: "Daily Load Energy Consumption", Unit: "kWh", UpdateFreq: PointUpdateFreqDaily}, + // "p18062": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p18062", Name: "Phase A Backup Current", Unit: "A", UpdateFreq: PointUpdateFreqInstant}, + // "p18063": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p18063", Name: "Phase B Backup Current", Unit: "A", UpdateFreq: PointUpdateFreqInstant}, + // "p18064": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p18064", Name: "Phase C Backup Current", Unit: "A", UpdateFreq: PointUpdateFreqInstant}, // "p18065": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p18065", Name: "Phase A Backup Power", Unit: "kW"}, // "p18066": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p18066", Name: "Phase B Backup Power", Unit: "kW"}, // "p18067": {Parents: ParentDevices{Map: map[string]*ParentDevice{"14_1":{PsId: "manual", Type: "14", Code: "1"}}}, Id: "p18067", Name: "Phase C Backup Power", Unit: "kW"}, @@ -362,33 +362,33 @@ var Points = PointsMap { // "p83001": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83001", Name: "Inverter AC Power Normalization", Unit: "kW/kWp"}, // "p83002": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83002", Name: "Inverter AC Power", Unit: "kW"}, // "p83004": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83004", Name: "Inverter Total Yield", Unit: "kWh"}, - // "p83005": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83005", Name: "Daily Equivalent Hours of Meter", Unit: "h", TimeSpan: PointTimeSpanDaily}, + // "p83005": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83005", Name: "Daily Equivalent Hours of Meter", Unit: "h", UpdateFreq: PointUpdateFreqDaily}, // "p83006": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83006", Name: "Meter Daily Yield", Unit: "kWh"}, - // "p83007": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83007", Name: "Meter PR", Unit: "%", TimeSpan: PointTimeSpanInstant}, - // "p83008": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83008", Name: "Daily Equivalent Hours of Inverter", Unit: "h", TimeSpan: PointTimeSpanDaily}, - // "p83009": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83009", Name: "Daily Yield by Inverter", Unit: "kWh", TimeSpan: PointTimeSpanDaily}, - // "p83010": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83010", Name: "Inverter PR", Unit: "%", TimeSpan: PointTimeSpanInstant}, + // "p83007": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83007", Name: "Meter PR", Unit: "%", UpdateFreq: PointUpdateFreqInstant}, + // "p83008": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83008", Name: "Daily Equivalent Hours of Inverter", Unit: "h", UpdateFreq: PointUpdateFreqDaily}, + // "p83009": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83009", Name: "Daily Yield by Inverter", Unit: "kWh", UpdateFreq: PointUpdateFreqDaily}, + // "p83010": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83010", Name: "Inverter PR", Unit: "%", UpdateFreq: PointUpdateFreqInstant}, // "p83013": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83013", Name: "Daily Irradiation", Unit: "Wh/m2"}, - // "p83016": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83016", Name: "Plant Ambient Temperature", Unit: "℃", TimeSpan: PointTimeSpanInstant}, - // "p83017": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83017", Name: "Plant Module Temperature", Unit: "℃", TimeSpan: PointTimeSpanInstant}, - // "p83018": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83018", Name: "Daily Yield (Theoretical)", Unit: "kWh", TimeSpan: PointTimeSpanDaily}, - // "p83019": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83019", Name: "Power/Installed Power of Plant", Unit: "%", TimeSpan: PointTimeSpanInstant}, + // "p83016": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83016", Name: "Plant Ambient Temperature", Unit: "℃", UpdateFreq: PointUpdateFreqInstant}, + // "p83017": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83017", Name: "Plant Module Temperature", Unit: "℃", UpdateFreq: PointUpdateFreqInstant}, + // "p83018": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83018", Name: "Daily Yield (Theoretical)", Unit: "kWh", UpdateFreq: PointUpdateFreqDaily}, + // "p83019": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83019", Name: "Power/Installed Power of Plant", Unit: "%", UpdateFreq: PointUpdateFreqInstant}, // "p83020": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83020", Name: "Meter Total Yield", Unit: "kWh"}, // "p83021": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83021", Name: "Accumulative Power Consumption by Meter", Unit: "kWh"}, - // "p83022": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83022", Name: "Daily Yield of Plant", Unit: "kWh", TimeSpan: PointTimeSpanDaily}, - // "p83023": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83023", Name: "Plant PR", Unit: "%", TimeSpan: PointTimeSpanInstant}, + // "p83022": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83022", Name: "Daily Yield of Plant", Unit: "kWh", UpdateFreq: PointUpdateFreqDaily}, + // "p83023": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83023", Name: "Plant PR", Unit: "%", UpdateFreq: PointUpdateFreqInstant}, // "p83024": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83024", Name: "Plant Total Yield", Unit: "kWh"}, // "p83025": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83025", Name: "Plant Equivalent Hours", Unit: "h"}, // "p83032": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83032", Name: "Meter AC Power", Unit: "kW"}, // "p83033": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83033", Name: "Plant Power", Unit: "kW"}, - // "p83097": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83097", Name: "Daily Load Energy Consumption from PV", Unit: "kWh", TimeSpan: PointTimeSpanDaily}, + // "p83097": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83097", Name: "Daily Load Energy Consumption from PV", Unit: "kWh", UpdateFreq: PointUpdateFreqDaily}, // "p83100": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83100", Name: "Total Load Energy Consumption from PV", Unit: "kWh"}, - // "p83102": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83102", Name: "Daily Purchased Energy", Unit: "kWh", TimeSpan: PointTimeSpanDaily}, + // "p83102": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83102", Name: "Daily Purchased Energy", Unit: "kWh", UpdateFreq: PointUpdateFreqDaily}, // "p83105": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83105", Name: "Total Purchased Energy", Unit: "kWh"}, // "p83106": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83106", Name: "Load Power", Unit: "kW"}, // "p83124": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83124", Name: "Total Load Energy Consumption", Unit: "MWh"}, // "p83128": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83128", Name: "Total Active Power of Optical Storage", Unit: "kW"}, - // "p83129": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83129", Name: "Battery SOC", Unit: "%", TimeSpan: PointTimeSpanInstant}, + // "p83129": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83129", Name: "Battery SOC", Unit: "%", UpdateFreq: PointUpdateFreqInstant}, // "p83233": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83233", Name: "Total field maximum rechargeable power", Unit: "MW"}, // "p83234": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83234", Name: "Total field maximum dischargeable power", Unit: "MW"}, // "p83235": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83235", Name: "Total field chargeable energy", Unit: "MWh"}, @@ -400,9 +400,9 @@ var Points = PointsMap { // "p83242": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83242", Name: "Total field discharge capacity", Unit: "MWh"}, // "p83243": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83243", Name: "Total field daily charge capacity", Unit: "MWh"}, // "p83244": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83244", Name: "Total field daily discharge capacity", Unit: "MWh"}, - // "p83252": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83252", Name: "Battery Level (SOC)", Unit: "%", TimeSpan: PointTimeSpanInstant}, + // "p83252": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83252", Name: "Battery Level (SOC)", Unit: "%", UpdateFreq: PointUpdateFreqInstant}, // "p83419": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83419", Name: "Daily Highest Inverter Power/Inverter Installed Capacity", Unit: "%"}, - // "p83420": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83420", Name: "Current Power/Inverter Installed Capacity", Unit: "%", TimeSpan: PointTimeSpanInstant}, + // "p83420": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83420", Name: "Current Power/Inverter Installed Capacity", Unit: "%", UpdateFreq: PointUpdateFreqInstant}, // "p83549": {Parents: ParentDevices{Map: map[string]*ParentDevice{"11_0":{PsId: "manual", Type: "11", Code: "0"}}}, Id: "p83549", Name: "Grid active power", Unit: "kW"}, // // "p23014": {Parents: ParentDevices{Map: map[string]*ParentDevice{"22_247":{PsId: "manual", Type: "22", Code: "247"}}}, Id: "p23014", Name: "WLAN Signal Strength", Unit: ""}, diff --git a/iSolarCloud/api/struct_template_points.go b/iSolarCloud/api/struct_template_points.go index d8742ad34..2520ffa36 100644 --- a/iSolarCloud/api/struct_template_points.go +++ b/iSolarCloud/api/struct_template_points.go @@ -9,7 +9,7 @@ import ( type TemplatePoint struct { - Description string + Name string PsKey string PointId valueTypes.PointId Unit string @@ -61,10 +61,10 @@ func CreatePoints(points []string) TemplatePoints { pa[1] = valueTypes.SetPointIdString(pa[1]).String() // pa[1] = "p" + strings.TrimPrefix(pa[1], "p") ret = append(ret, TemplatePoint{ - Description: "", - PsKey: pa[0], - PointId: valueTypes.SetPointIdString(pa[1]), - Unit: "", + Name: "", + PsKey: pa[0], + PointId: valueTypes.SetPointIdString(pa[1]), + Unit: "", }) } } diff --git a/iSolarCloud/api/types.go b/iSolarCloud/api/types.go index f103a4c81..a01fc1254 100644 --- a/iSolarCloud/api/types.go +++ b/iSolarCloud/api/types.go @@ -25,7 +25,7 @@ import ( // GroupName: "", // Name: name, // Unit: uv.Unit(), -// TimeSpan: "PointTimeSpanInstant", +// UpdateFreq: "PointUpdateFreqInstant", // Valid: true, // States: nil, // } @@ -46,22 +46,23 @@ func (e *Web) GetDataTable(endpoint EndPoint) output.Table { _ = table.SetHeader( "Date", "Point Id", - "Group Name", - "Description", "Value", "Unit", "Unit Type", + "Group Name", + "Description", + "Update Freq", ) data := endpoint.GetEndPointData() var sorted []string - for p := range data.DataPoints { + for p := range data.Map { sorted = append(sorted, string(p)) } sort.Strings(sorted) for _, p := range sorted { - entries := data.DataPoints[p] + entries := data.Map[p].Entries for _, de := range entries { if de.Hide { continue @@ -69,15 +70,13 @@ func (e *Web) GetDataTable(endpoint EndPoint) output.Table { _ = table.AddRow( de.Date.Format(valueTypes.DateTimeLayout), - // 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, de.Point.ValueType, + de.Point.GroupName, + de.Point.Description, + de.Point.UpdateFreq, ) } } diff --git a/iSolarCloud/api/valueTypes/bool.go b/iSolarCloud/api/valueTypes/bool.go index ef6bd8939..7fec92bf7 100644 --- a/iSolarCloud/api/valueTypes/bool.go +++ b/iSolarCloud/api/valueTypes/bool.go @@ -65,7 +65,7 @@ func (t Bool) MarshalJSON() ([]byte, error) { break } t.Valid = true - // t.string = strconv.FormatFloat(t.bool, 'f', 12, 64) + // t.string = strconv.FormatFloat(t.bool, 'f', -1, 64) } return data, err @@ -75,6 +75,13 @@ func (t Bool) Value() bool { return t.bool } +func (t Bool) Match(comp bool) bool { + if t.bool == comp { + return true + } + return false +} + func (t Bool) String() string { return t.string } @@ -85,31 +92,31 @@ func (t *Bool) SetString(value string) Bool { t.Valid = false switch strings.ToLower(t.string) { - case "false": - fallthrough - case "no": - fallthrough - case "off": - fallthrough - case "0": - fallthrough - case "": - // fallthrough - // case "--": - t.bool = false - t.string = "false" - t.Valid = true + case "false": + fallthrough + case "no": + fallthrough + case "off": + fallthrough + case "0": + fallthrough + case "": + // fallthrough + // case "--": + t.bool = false + t.string = "false" + t.Valid = true - case "true": - fallthrough - case "yes": - fallthrough - case "on": - fallthrough - case "1": - t.bool = true - t.string = "true" - t.Valid = true + case "true": + fallthrough + case "yes": + fallthrough + case "on": + fallthrough + case "1": + t.bool = true + t.string = "true" + t.Valid = true } } diff --git a/iSolarCloud/api/valueTypes/datetime.go b/iSolarCloud/api/valueTypes/datetime.go index 852bb9cfa..97d53ce7e 100644 --- a/iSolarCloud/api/valueTypes/datetime.go +++ b/iSolarCloud/api/valueTypes/datetime.go @@ -99,7 +99,15 @@ func (dt DateTime) Value() time.Time { } func (dt DateTime) String() string { - return dt.Original() + // return dt.Original() + return dt.Time.Format(DateTimeLayout) +} + +func (dt DateTime) Match(comp time.Time) bool { + if dt.Time == comp { + return true + } + return false } func (dt *DateTime) SetString(value string) *DateTime { diff --git a/iSolarCloud/api/valueTypes/float.go b/iSolarCloud/api/valueTypes/float.go index dfd3c6bb3..5f7cba870 100644 --- a/iSolarCloud/api/valueTypes/float.go +++ b/iSolarCloud/api/valueTypes/float.go @@ -55,7 +55,7 @@ func (t Float) MarshalJSON() ([]byte, error) { break } t.Valid = true - // t.string = strconv.FormatFloat(t.float64, 'f', 12, 64) + // t.string = strconv.FormatFloat(t.float64, 'f', -1, 64) } return data, err @@ -65,6 +65,13 @@ func (t Float) Value() float64 { return t.float64 } +func (t Float) Match(comp float64) bool { + if t.float64 == comp { + return true + } + return false +} + func (t Float) String() string { return t.string } @@ -100,7 +107,7 @@ func (t *Float) SetValue(value float64) Float { t.string = "" t.float64 = value t.Valid = true - t.string = strconv.FormatFloat(t.float64, 'f', 12, 64) + t.string = strconv.FormatFloat(t.float64, 'f', -1, 64) } return *t diff --git a/iSolarCloud/api/valueTypes/integers.go b/iSolarCloud/api/valueTypes/integers.go index 81d4e785b..ab95ad926 100644 --- a/iSolarCloud/api/valueTypes/integers.go +++ b/iSolarCloud/api/valueTypes/integers.go @@ -69,6 +69,13 @@ func (t Integer) String() string { return t.string } +func (t Integer) Match(comp int64) bool { + if t.int64 == comp { + return true + } + return false +} + func (t *Integer) SetString(value string) Integer { for range Only.Once { t.string = value @@ -181,6 +188,13 @@ func (t Count) String() string { return t.string } +func (t Count) Match(comp int64) bool { + if t.int64 == comp { + return true + } + return false +} + func (t *Count) SetString(value string) Count { for range Only.Once { t.string = value diff --git a/iSolarCloud/api/valueTypes/point.go b/iSolarCloud/api/valueTypes/point.go index 985d0c19a..d44fa4d2c 100644 --- a/iSolarCloud/api/valueTypes/point.go +++ b/iSolarCloud/api/valueTypes/point.go @@ -73,6 +73,13 @@ func (t PointId) String() string { return t.string } +func (t PointId) Match(comp int64) bool { + if t.int64 == comp { + return true + } + return false +} + func (t *PointId) SetString(value string) PointId { for range Only.Once { t.string = value diff --git a/iSolarCloud/api/valueTypes/string.go b/iSolarCloud/api/valueTypes/string.go index 8728aa292..a1853654f 100644 --- a/iSolarCloud/api/valueTypes/string.go +++ b/iSolarCloud/api/valueTypes/string.go @@ -59,6 +59,13 @@ func (t String) String() string { return t.string } +func (t String) Match(comp string) bool { + if t.string == comp { + return true + } + return false +} + func (t *String) SetString(value string) String { for range Only.Once { t.string = value @@ -132,6 +139,17 @@ func (t PsKey) Value() string { return t.string } +func (t PsKey) String() string { + return t.string +} + +func (t PsKey) Match(comp string) bool { + if t.string == comp { + return true + } + return false +} + func (t PsKey) PsKey() string { return t.string } diff --git a/iSolarCloud/api/valueTypes/types.go b/iSolarCloud/api/valueTypes/types.go index b1296a5ab..bf3e05d6b 100644 --- a/iSolarCloud/api/valueTypes/types.go +++ b/iSolarCloud/api/valueTypes/types.go @@ -10,32 +10,111 @@ import ( ) -func IsUnknownStruct(fieldTo reflect.StructField, fieldVo reflect.Value) bool { +const ( + TypeBool = "Bool" + TypeCount = "Count" + TypeDateTime = "DateTime" + TypeFloat = "Float" + TypeInteger = "Integer" + TypePointId = "PointId" + TypePsKey = "PsKey" + TypeString = "String" + TypeTime = "Time" + TypeUnitValue = "UnitValue" + + TypeArrayBool = "[]Bool" + TypeArrayCount = "[]Count" + TypeArrayDateTime = "[]DateTime" + TypeArrayFloat = "[]Float" + TypeArrayInteger = "[]Integer" + TypeArrayPointId = "[]PointId" + TypeArrayPsKey = "[]PsKey" + TypeArrayString = "[]String" + TypeArrayTime = "[]Time" + TypeArrayUnitValue = "[]UnitValue" + TypeUnitValues = "UnitValues" + + TypeArrayValueTypesBool = "[]valueTypes.Bool" + TypeArrayValueTypesCount = "[]valueTypes.Count" + TypeArrayValueTypesDateTime = "[]valueTypes.DateTime" + TypeArrayValueTypesFloat = "[]valueTypes.Float" + TypeArrayValueTypesInteger = "[]valueTypes.Integer" + TypeArrayValueTypesPointId = "[]valueTypes.PointId" + TypeArrayValueTypesPsKey = "[]valueTypes.PsKey" + TypeArrayValueTypesString = "[]valueTypes.String" + TypeArrayValueTypesTime = "[]valueTypes.Time" + TypeArrayValueTypesUnitValue = "[]valueTypes.UnitValue" + + TypeValueTypesBool = "valueTypes.Bool" + TypeValueTypesCount = "valueTypes.Count" + TypeValueTypesDateTime = "valueTypes.DateTime" + TypeValueTypesFloat = "valueTypes.Float" + TypeValueTypesInteger = "valueTypes.Integer" + TypeValueTypesPointId = "valueTypes.PointId" + TypeValueTypesPsKey = "valueTypes.PsKey" + TypeValueTypesString = "valueTypes.String" + TypeValueTypesTime = "valueTypes.Time" + TypeValueTypesUnitValue = "valueTypes.UnitValue" +) + +func IsUnknownStruct(ref interface{}) bool { var ok bool for range Only.Once { + fieldVo := reflect.ValueOf(ref) + // fieldTo := reflect.TypeOf(ref) + // fmt.Printf("fieldVo.Type().String(): %s\n", fieldVo.Type().String()) + // fmt.Printf("fieldVo.Type().Name(): %s\n", fieldVo.Type().Name()) + // fmt.Printf("fieldVo.Kind().String(): %s\n", fieldVo.Kind().String()) + // fmt.Printf("fieldTo.String(): %s\n", fieldTo.String()) + // fmt.Printf("fieldTo.Name(): %s\n", fieldTo.Name()) + // fmt.Printf("fieldTo.Kind().String(): %s\n", fieldTo.Kind().String()) + + // fmt.Printf("DEBUYg: K:%s / T:%s\n", fieldVo.Kind().String(), fieldVo.Type().String()) + if fieldVo.Kind() == reflect.Slice { + if fieldVo.Len() > 0 { + ok = IsUnknownStruct(fieldVo.Index(0).Interface()) + } + break + } + + if fieldVo.Kind() == reflect.Array { + if fieldVo.Len() > 0 { + ok = IsUnknownStruct(fieldVo.Index(0).Interface()) + } + break + } + + if fieldVo.Kind() == reflect.Map { + mk := fieldVo.MapKeys() + if len(mk) > 0 { + ok = IsUnknownStruct(fieldVo.MapIndex(mk[0]).Interface()) + } + break + } + if fieldVo.Kind() == reflect.Struct { - switch fieldTo.Type.String() { - case "Bool": - case "Count": - case "DateTime": - case "Float": - case "Integer": - case "PointId": - case "PsKey": - case "String": - case "Time": - case "UnitValue": - case "valueTypes.Bool": - case "valueTypes.Count": - case "valueTypes.DateTime": - case "valueTypes.Float": - case "valueTypes.Integer": - case "valueTypes.PointId": - case "valueTypes.PsKey": - case "valueTypes.String": - case "valueTypes.Time": - case "valueTypes.UnitValue": + switch fieldVo.Type().String() { + case TypeBool: + case TypeCount: + case TypeDateTime: + case TypeFloat: + case TypeInteger: + case TypePointId: + case TypePsKey: + case TypeString: + case TypeTime: + case TypeUnitValue: + case TypeValueTypesBool: + case TypeValueTypesCount: + case TypeValueTypesDateTime: + case TypeValueTypesFloat: + case TypeValueTypesInteger: + case TypeValueTypesPointId: + case TypeValueTypesPsKey: + case TypeValueTypesString: + case TypeValueTypesTime: + case TypeValueTypesUnitValue: default: ok = true @@ -83,14 +162,14 @@ func PrintInt(s int, i interface{}) string { case "int64": val = i.(int64) - case "valueTypes.Integer": + case TypeValueTypesInteger: fallthrough - case "Integer": + case TypeInteger: val = i.(Integer).Value() case "valueTypes.Count": fallthrough - case "Count": + case TypeCount: val = i.(Integer).Value() } @@ -116,14 +195,14 @@ func SizeOfInt(i interface{}) int { case "int64": val = i.(int64) - case "valueTypes.Integer": + case TypeValueTypesInteger: fallthrough - case "Integer": + case TypeInteger: val = i.(Integer).Value() - case "valueTypes.Count": + case TypeValueTypesCount: fallthrough - case "Count": + case TypeCount: val = i.(Integer).Value() } switch { @@ -167,7 +246,6 @@ func TypeToString(intSize int, dateFormat string, e interface{}) string { ret = PrintInt(intSize, e.(int32)) case "int64": ret = PrintInt(intSize, e.(int64)) - case "float32": // ret = float64(s.(float32)) v , err := json.Marshal(e) @@ -175,7 +253,6 @@ func TypeToString(intSize int, dateFormat string, e interface{}) string { break } ret = string(v) - case "float64": // ret = s.(float64) v , err := json.Marshal(e) @@ -183,23 +260,28 @@ func TypeToString(intSize int, dateFormat string, e interface{}) string { break } ret = string(v) - case "string": ret = strings.Trim(e.(string), ".") - case "bool": ret = fmt.Sprintf("%v", e.(bool)) + case "[]string": + // v := strings.Join(s.([]string), ",") + v , err := json.Marshal(e) + if err != nil { + break + } + ret = string(v) - case "valueTypes.UnitValue": + case TypeValueTypesUnitValue: fallthrough - case "UnitValue": + case TypeUnitValue: ret = e.(UnitValue).String() - case "UnitValues": + case TypeUnitValues: fallthrough - case "[]UnitValue": + case TypeArrayUnitValue: fallthrough - case "[]valueTypes.UnitValue": + case TypeArrayValueTypesUnitValue: // ret = s.([]UnitValue) v , err := json.Marshal(e) if err != nil { @@ -207,9 +289,9 @@ func TypeToString(intSize int, dateFormat string, e interface{}) string { } ret = string(v) - case "valueTypes.Float": + case TypeValueTypesFloat: fallthrough - case "Float": + case TypeFloat: // ret = s.(Float) v , err := json.Marshal(e) if err != nil { @@ -217,9 +299,9 @@ func TypeToString(intSize int, dateFormat string, e interface{}) string { } ret = string(v) - case "[]valueTypes.Float": + case TypeArrayValueTypesFloat: fallthrough - case "[]Float": + case TypeArrayFloat: // ret = s.([]Float) v , err := json.Marshal(e) if err != nil { @@ -227,14 +309,14 @@ func TypeToString(intSize int, dateFormat string, e interface{}) string { } ret = string(v) - case "valueTypes.Integer": + case TypeValueTypesInteger: fallthrough - case "Integer": + case TypeInteger: ret = PrintInt(intSize, e.(Integer)) - case "[]valueTypes.Integer": + case TypeArrayValueTypesInteger: fallthrough - case "[]Integer": + case TypeArrayInteger: // ret = s.([]Integer) v , err := json.Marshal(e) if err != nil { @@ -242,14 +324,14 @@ func TypeToString(intSize int, dateFormat string, e interface{}) string { } ret = string(v) - case "valueTypes.Count": + case TypeValueTypesCount: fallthrough - case "Count": + case TypeCount: ret = PrintInt(intSize, e.(Count)) - case "[]valueTypes.Count": + case TypeArrayValueTypesCount: fallthrough - case "[]Count": + case TypeArrayCount: // ret = s.([]Count) v , err := json.Marshal(e) if err != nil { @@ -257,14 +339,14 @@ func TypeToString(intSize int, dateFormat string, e interface{}) string { } ret = string(v) - case "valueTypes.Bool": + case TypeValueTypesBool: fallthrough - case "Bool": + case TypeBool: ret = e.(Bool).String() - case "[]valueTypes.Bool": + case TypeArrayValueTypesBool: fallthrough - case "[]Bool": + case TypeArrayBool: // ret = s.([]Bool) v , err := json.Marshal(e) if err != nil { @@ -272,14 +354,14 @@ func TypeToString(intSize int, dateFormat string, e interface{}) string { } ret = string(v) - case "valueTypes.String": + case TypeValueTypesString: fallthrough - case "String": + case TypeString: ret = strings.Trim(e.(String).String(), ".") - case "[]valueTypes.String": + case TypeArrayValueTypesString: fallthrough - case "[]String": + case TypeArrayString: // ret = s.([]String) v , err := json.Marshal(e) if err != nil { @@ -287,14 +369,14 @@ func TypeToString(intSize int, dateFormat string, e interface{}) string { } ret = string(v) - case "valueTypes.PsKey": + case TypeValueTypesPsKey: fallthrough - case "PsKey": + case TypePsKey: ret = e.(PsKey).Value() - case "[]valueTypes.PsKey": + case TypeArrayValueTypesPsKey: fallthrough - case "[]PsKey": + case TypeArrayPsKey: // ret = s.([]PsKey) v , err := json.Marshal(e) if err != nil { @@ -302,14 +384,14 @@ func TypeToString(intSize int, dateFormat string, e interface{}) string { } ret = string(v) - case "valueTypes.PointId": + case TypeValueTypesPointId: fallthrough - case "PointId": + case TypePointId: ret = e.(PointId).String() - case "[]valueTypes.PointId": + case TypeArrayValueTypesPointId: fallthrough - case "[]PointId": + case TypeArrayPointId: // ret = s.([]PointId) v , err := json.Marshal(e) if err != nil { @@ -317,41 +399,33 @@ func TypeToString(intSize int, dateFormat string, e interface{}) string { } ret = string(v) - case "valueTypes.DateTime": + case TypeValueTypesDateTime: fallthrough - case "DateTime": + case TypeDateTime: ret = e.(DateTime).Format(dateFormat) - case "[]valueTypes.DateTime": + case TypeArrayValueTypesDateTime: fallthrough - case "[]DateTime": + case TypeArrayDateTime: // ret = s.([]DateTime) v , err := json.Marshal(e) if err != nil { break } ret = string(v) - - case "[]string": - // v := strings.Join(s.([]string), ",") - v , err := json.Marshal(e) - if err != nil { - break - } - ret = string(v) } } return ret } -func AnyToUnitValue(e interface{}, unit string, Type string) (UnitValues, bool, bool) { +func AnyToUnitValue(e interface{}, unit string, Type string, dateFormat string) (UnitValues, bool, bool) { var uv UnitValues ok := true isNil := false for range Only.Once { if IsNil(e) { // fmt.Println("DEBUG: AnyToUnitValue(): NIL") - uv = append(uv, SetUnitValueString("", unit, Type + "(nil)")) + uv = append(uv, SetUnitValueString("", unit, Type + "(unknown)")) isNil = true break } @@ -373,7 +447,6 @@ func AnyToUnitValue(e interface{}, unit string, Type string) (UnitValues, bool, Type = "--" } uv = append(uv, SetUnitValueInteger(e.(int64), unit, Type)) - case "float32": if Type == "" { Type = "--" @@ -384,13 +457,11 @@ func AnyToUnitValue(e interface{}, unit string, Type string) (UnitValues, bool, Type = "--" } uv = append(uv, SetUnitValueFloat(e.(float64), unit, Type)) - case "string": if Type == "" { Type = "--" } uv = append(uv, SetUnitValueString(e.(string), unit, Type)) - case "[]string": // v := strings.Join(e.([]string), ",") if Type == "" { @@ -401,105 +472,105 @@ func AnyToUnitValue(e interface{}, unit string, Type string) (UnitValues, bool, j = []byte(fmt.Sprintf("%v", e.([]string))) } uv = append(uv, SetUnitValueString(string(j), unit, Type)) - case "bool": if Type == "" { Type = "--" } uv = append(uv, SetUnitValueBool(e.(bool))) - case "valueTypes.UnitValue": + case TypeValueTypesUnitValue: fallthrough - case "UnitValue": + case TypeUnitValue: if Type == "" { Type = "--" } uv = append(uv, e.(UnitValue)) // uv = uv.UnitValueFix() - case "UnitValues": + case TypeUnitValues: fallthrough - case "[]valueTypes.UnitValue": + case TypeArrayValueTypesUnitValue: fallthrough - case "[]UnitValue": + case TypeArrayUnitValue: for _, val := range e.([]UnitValue) { uv = append(uv, val) } - case "valueTypes.Float": + case TypeValueTypesFloat: fallthrough - case "Float": + case TypeFloat: if Type == "" { - Type = "Float" + Type = TypeFloat } v := e.(Float) uv = append(uv, SetUnitValueFloat(v.Value(), unit, Type)) - case "[]valueTypes.Float": + case TypeArrayValueTypesFloat: fallthrough - case "[]Float": + case TypeArrayFloat: if Type == "" { - Type = "Float" + Type = TypeFloat } v := e.([]Float) for _, val := range v { uv = append(uv, SetUnitValueFloat(val.Value(), unit, Type)) } - case "valueTypes.Integer": + case TypeValueTypesInteger: fallthrough - case "Integer": + case TypeInteger: if Type == "" { - Type = "Integer" + Type = TypeInteger } v := e.(Integer).Value() uv = append(uv, SetUnitValueInteger(v, unit, Type)) - case "[]valueTypes.Integer": + case TypeArrayValueTypesInteger: fallthrough - case "[]Integer": + case TypeArrayInteger: if Type == "" { - Type = "Integer" + Type = TypeInteger } v := e.([]Integer) for _, val := range v { uv = append(uv, SetUnitValueInteger(val.Value(), unit, Type)) } + // HERE IS THE PROBLEM - need to return SOMETHING, even if it's null! - case "valueTypes.Count": + case TypeValueTypesCount: fallthrough - case "Count": + case TypeCount: if Type == "" { - Type = "Count" + Type = TypeCount } v := e.(Count).Value() uv = append(uv, SetUnitValueInteger(v, unit, Type)) - case "[]valueTypes.Count": + case TypeArrayValueTypesCount: fallthrough - case "[]Count": + case TypeArrayCount: if Type == "" { - Type = "Count" + Type = TypeCount } v := e.([]Count) for _, val := range v { uv = append(uv, SetUnitValueInteger(val.Value(), unit, Type)) } - case "valueTypes.Bool": + case TypeValueTypesBool: fallthrough - case "Bool": + case TypeBool: if Type == "" { - Type = "Bool" + Type = TypeBool } v := e.(Bool) uv = append(uv, SetUnitValueBool(v.Value())) - case "[]valueTypes.Bool": + case TypeArrayValueTypesBool: fallthrough - case "[]Bool": + case TypeArrayBool: if Type == "" { - Type = "Bool" + Type = TypeBool } v := e.([]Bool) for _, val := range v { @@ -507,113 +578,305 @@ func AnyToUnitValue(e interface{}, unit string, Type string) (UnitValues, bool, uv = append(uv, SetUnitValueBool(val.Value())) } - case "valueTypes.String": + case TypeValueTypesString: fallthrough - case "String": + case TypeString: if Type == "" { - Type = "String" + Type = TypeString } v := e.(String).String() uv = append(uv, SetUnitValueString(v, unit, Type)) - case "[]valueTypes.String": + case TypeArrayValueTypesString: fallthrough - case "[]String": + case TypeArrayString: if Type == "" { - Type = "String" + Type = TypeString } v := e.([]String) for _, val := range v { uv = append(uv, SetUnitValueString(val.Value(), unit, Type)) } - case "valueTypes.PsKey": + case TypeValueTypesPsKey: fallthrough - case "PsKey": + case TypePsKey: if Type == "" { - Type = "PsKey" + Type = TypePsKey } v := e.(PsKey).Value() uv = append(uv, SetUnitValueString(v, unit, Type)) - case "[]valueTypes.PsKey": + case TypeArrayValueTypesPsKey: fallthrough - case "[]PsKey": + case TypeArrayPsKey: if Type == "" { - Type = "PsKey" + Type = TypePsKey } v := e.([]PsKey) for _, val := range v { uv = append(uv, SetUnitValueString(val.Value(), unit, Type)) } - case "valueTypes.PointId": + case TypeValueTypesPointId: fallthrough - case "PointId": + case TypePointId: if Type == "" { - Type = "PointId" + Type = TypePointId } v := e.(PointId).String() uv = append(uv, SetUnitValueString(v, unit, Type)) - case "[]valueTypes.PointId": + case TypeArrayValueTypesPointId: fallthrough - case "[]PointId": + case TypeArrayPointId: if Type == "" { - Type = "PointId" + Type = TypePointId } v := e.([]PointId) for _, val := range v { uv = append(uv, SetUnitValueString(val.String(), unit, Type)) } - case "valueTypes.DateTime": + case TypeValueTypesDateTime: fallthrough - case "DateTime": + case TypeDateTime: if Type == "" { - Type = "DateTime" + Type = TypeDateTime } - v := e.(DateTime).String() + v := e.(DateTime).Format(dateFormat) uv = append(uv, SetUnitValueString(v, unit, Type)) - case "[]valueTypes.DateTime": + case TypeArrayValueTypesDateTime: fallthrough - case "[]DateTime": + case TypeArrayDateTime: if Type == "" { - Type = "DateTime" + Type = TypeDateTime } v := e.([]DateTime) for _, val := range v { - uv = append(uv, SetUnitValueString(val.String(), unit, Type)) + uv = append(uv, SetUnitValueString(val.Format(dateFormat), unit, Type)) } - case "valueTypes.Time": + case TypeValueTypesTime: fallthrough - case "Time": + case TypeTime: if Type == "" { - Type = "Time" + Type = TypeTime } - v := e.(Time).String() + v := e.(Time).Format(TimeLayout) uv = append(uv, SetUnitValueString(v, unit, Type)) - case "[]valueTypes.Time": + case TypeArrayValueTypesTime: fallthrough - case "[]Time": + case TypeArrayTime: if Type == "" { - Type = "Time" + Type = TypeTime } v := e.([]Time) for _, val := range v { - uv = append(uv, SetUnitValueString(val.String(), unit, Type)) + uv = append(uv, SetUnitValueString(val.Format(TimeLayout), unit, Type)) } default: + uv = append(uv, SetUnitValueString("", unit, Type + "(unknown)")) ok = false } } return uv, isNil, ok } +func AnyToValueString(e interface{}, intSize int, dateFormat string) string { + var ret string + + for range Only.Once { + if IsNil(e) { + break + } + + // fmt.Printf("DEBUG TYPE: %s\n", reflect.TypeOf(e).String()) + switch reflect.TypeOf(e).String() { + case "bool": + ret = fmt.Sprintf("%v", e.(bool)) + case "int": + ret = PrintInt(intSize, e.(int)) + case "int32": + ret = PrintInt(intSize, e.(int32)) + case "int64": + ret = PrintInt(intSize, e.(int64)) + case "float32": + // ret = float64(s.(float32)) + v , err := json.Marshal(e) + if err != nil { + break + } + ret = string(v) + case "float64": + // ret = s.(float64) + v , err := json.Marshal(e) + if err != nil { + break + } + ret = string(v) + case "string": + ret = e.(string) + // ret = strings.Trim(e.(string), ".") + case "[]string": + // v := strings.Join(s.([]string), ",") + v , err := json.Marshal(e) + if err != nil { + break + } + ret = string(v) + + case TypeValueTypesUnitValue: + fallthrough + case TypeUnitValue: + ret = e.(UnitValue).String() + + case TypeUnitValues: + fallthrough + case TypeArrayUnitValue: + fallthrough + case TypeArrayValueTypesUnitValue: + // ret = s.([]UnitValue) + v , err := json.Marshal(e) + if err != nil { + break + } + ret = string(v) + + case TypeValueTypesFloat: + fallthrough + case TypeFloat: + ret = e.(Float).String() + + case TypeArrayValueTypesFloat: + fallthrough + case TypeArrayFloat: + // ret = s.([]Float) + v , err := json.Marshal(e) + if err != nil { + break + } + ret = string(v) + + case TypeValueTypesInteger: + fallthrough + case TypeInteger: + ret = PrintInt(intSize, e.(Integer)) + + case TypeArrayValueTypesInteger: + fallthrough + case TypeArrayInteger: + // ret = s.([]Integer) + v , err := json.Marshal(e) + if err != nil { + break + } + ret = string(v) + + case TypeValueTypesCount: + fallthrough + case TypeCount: + ret = PrintInt(intSize, e.(Count)) + + case TypeArrayValueTypesCount: + fallthrough + case TypeArrayCount: + // ret = s.([]Count) + v , err := json.Marshal(e) + if err != nil { + break + } + ret = string(v) + + case TypeValueTypesBool: + fallthrough + case TypeBool: + ret = e.(Bool).String() + + case TypeArrayValueTypesBool: + fallthrough + case TypeArrayBool: + // ret = s.([]Bool) + v , err := json.Marshal(e) + if err != nil { + break + } + ret = string(v) + + case TypeValueTypesString: + fallthrough + case TypeString: + ret = e.(String).String() + + case TypeArrayValueTypesString: + fallthrough + case TypeArrayString: + // ret = s.([]String) + v , err := json.Marshal(e) + if err != nil { + break + } + ret = string(v) + + case TypeValueTypesPsKey: + fallthrough + case TypePsKey: + ret = e.(PsKey).Value() + + case TypeArrayValueTypesPsKey: + fallthrough + case TypeArrayPsKey: + // ret = s.([]PsKey) + v , err := json.Marshal(e) + if err != nil { + break + } + ret = string(v) + + case TypeValueTypesPointId: + fallthrough + case TypePointId: + ret = e.(PointId).String() + + case TypeArrayValueTypesPointId: + fallthrough + case TypeArrayPointId: + // ret = s.([]PointId) + v , err := json.Marshal(e) + if err != nil { + break + } + ret = string(v) + + case TypeValueTypesDateTime: + fallthrough + case TypeDateTime: + ret = e.(DateTime).Format(dateFormat) + + case TypeArrayValueTypesDateTime: + fallthrough + case TypeArrayDateTime: + // ret = s.([]DateTime) + v , err := json.Marshal(e) + if err != nil { + break + } + ret = string(v) + + case TypeValueTypesTime: + fallthrough + case TypeTime: + ret = e.(Time).Format(dateFormat) + + default: + } + } + return ret +} + // func Float32ToString(num float64) string { // s := fmt.Sprintf("%.6f", num) diff --git a/iSolarCloud/api/valueTypes/uv.go b/iSolarCloud/api/valueTypes/uv.go index 53fde8d41..29a504dc4 100644 --- a/iSolarCloud/api/valueTypes/uv.go +++ b/iSolarCloud/api/valueTypes/uv.go @@ -15,18 +15,20 @@ type UnitValue struct { TypeValue string `json:"type_value"` - float64 `json:"value_float,omitempty"` - int64 `json:"value_int,omitempty"` - bool `json:"value_bool,omitempty"` + *float64 `json:"value_float,omitempty"` + *int64 `json:"value_int,omitempty"` + *bool `json:"value_bool,omitempty"` - isFloat bool + // isFloat bool Valid bool `json:"valid"` } +var zero = int64(0) + func (t *UnitValue) UnitValueFix() UnitValue { switch t.UnitValue { - case "w": - t.UnitValue = "W" + case "w": + t.UnitValue = "W" } switch t.UnitValue { @@ -112,14 +114,14 @@ func (t UnitValue) MarshalJSON() ([]byte, error) { for range Only.Once { t.Valid = false - if t.isFloat { + if t.float64 != nil { // Store result to JSON string data, err = json.Marshal(&struct { Unit string `json:"unit"` Value float64 `json:"value"` }{ Unit: t.UnitValue, - Value: t.float64, + Value: *t.float64, }) if err != nil { break @@ -129,16 +131,32 @@ func (t UnitValue) MarshalJSON() ([]byte, error) { break } - // Store result to JSON string - data, err = json.Marshal(&struct { - Unit string `json:"unit"` - Value int64 `json:"value"` - }{ - Unit: t.UnitValue, - Value: t.int64, - }) - if err != nil { - break + if t.int64 != nil { + // Store result to JSON string + data, err = json.Marshal(&struct { + Unit string `json:"unit"` + Value int64 `json:"value"` + }{ + Unit: t.UnitValue, + Value: *t.int64, + }) + if err != nil { + break + } + } + + if t.bool != nil { + // Store result to JSON string + data, err = json.Marshal(&struct { + Unit string `json:"unit"` + Value bool `json:"value"` + }{ + Unit: t.UnitValue, + Value: *t.bool, + }) + if err != nil { + break + } } t.Valid = true @@ -148,26 +166,102 @@ func (t UnitValue) MarshalJSON() ([]byte, error) { } func (t UnitValue) Value() float64 { - if t.isFloat { - return t.float64 + var ret float64 + for range Only.Once { + if t.float64 != nil { + ret = *t.float64 + break + } + + if t.int64 != nil { + ret = float64(*t.int64) + break + } + + if t.bool != nil { + if *t.bool { + ret = 1 + break + } + ret = 0 + break + } } - return float64(t.int64) + return ret } func (t UnitValue) ValueFloat() float64 { - return t.float64 + if t.float64 == nil { + return 0 + } + return *t.float64 } func (t UnitValue) ValueInt() int64 { - return t.int64 + if t.int64 == nil { + return 0 + } + return *t.int64 } func (t UnitValue) ValueBool() bool { - return t.bool + if t.float64 == nil { + return false + } + return *t.bool } func (t UnitValue) String() string { - return t.StringValue + var ret string + for range Only.Once { + if t.float64 != nil { + ret = strconv.FormatFloat(*t.float64, 'f', -1, 64) + break + } + + if t.int64 != nil { + ret = strconv.FormatInt(*t.int64, 10) + break + } + + if t.bool != nil { + ret = strconv.FormatBool(*t.bool) + break + } + + ret = t.StringValue + } + return ret +} + +func (t UnitValue) MatchFloat(comp float64) bool { + if t.float64 == nil { + return false + } + if *t.float64 == comp { + return true + } + return false +} + +func (t UnitValue) MatchInt(comp int64) bool { + if t.int64 == nil { + return false + } + if *t.int64 == comp { + return true + } + return false +} + +func (t UnitValue) MatchBool(comp bool) bool { + if t.bool == nil { + return false + } + if *t.bool == comp { + return true + } + return false } func (t UnitValue) Unit() string { @@ -178,10 +272,14 @@ func (t UnitValue) Type() string { return t.TypeValue } +var varTrue = true +var varFalse = false func (t *UnitValue) SetString(value string) UnitValue { for range Only.Once { t.StringValue = value - t.int64 = 0 + t.float64 = nil + t.int64 = nil + t.bool = nil t.Valid = false if value == "" { @@ -193,6 +291,15 @@ func (t *UnitValue) SetString(value string) UnitValue { break } + if value == "true" { + t.SetBool(true) + break + } + if value == "false" { + t.SetBool(false) + break + } + if strings.Contains(value, ".") { v, err := strconv.ParseFloat(t.StringValue, 64) if err != nil { @@ -214,11 +321,12 @@ func (t *UnitValue) SetString(value string) UnitValue { func (t *UnitValue) SetInteger(value int64) UnitValue { for range Only.Once { - t.int64 = value - t.float64 = float64(value) - t.isFloat = false + t.int64 = &value + // fv := float64(value); t.float64 = &fv + t.float64 = nil + t.bool = nil t.Valid = true - t.StringValue = strconv.FormatInt(t.int64, 10) + t.StringValue = strconv.FormatInt(*t.int64, 10) } return *t @@ -226,13 +334,15 @@ func (t *UnitValue) SetInteger(value int64) UnitValue { func (t *UnitValue) SetFloat(value float64) UnitValue { for range Only.Once { - t.int64 = int64(value) - t.float64 = value - t.isFloat = true + // iv := int64(value) + // t.int64 = &iv + t.int64 = nil + t.float64 = &value + t.bool = nil t.Valid = true // t.String = strconv.FormatFloat(t.float64, 'f', 12, 64) // t.String = strings.TrimRight(t.String, "0") - t.StringValue = strconv.FormatFloat(t.float64, 'f', -1, 64) + t.StringValue = strconv.FormatFloat(*t.float64, 'f', -1, 64) } return *t @@ -240,19 +350,50 @@ func (t *UnitValue) SetFloat(value float64) UnitValue { func (t *UnitValue) SetBool(value bool) UnitValue { for range Only.Once { - t.isFloat = false t.Valid = true - if value { - t.bool = value - t.float64 = 0 - t.int64 = 0 - t.StringValue = "true" - break + t.float64 = nil + t.int64 = nil + t.bool = &value + t.StringValue = strconv.FormatBool(value) + } + + return *t +} + +func (t *UnitValue) SetBoolString(value string) UnitValue { + for range Only.Once { + t.Valid = true + t.float64 = nil + t.int64 = nil + // t.StringValue = strconv.FormatBool(value) + + switch strings.ToLower(value) { + case "false": + fallthrough + case "no": + fallthrough + case "off": + fallthrough + case "0": + fallthrough + case "": + // fallthrough + // case "--": + t.bool = &varFalse + t.StringValue = "false" + t.Valid = true + + case "true": + fallthrough + case "yes": + fallthrough + case "on": + fallthrough + case "1": + t.bool = &varTrue + t.StringValue = "true" + t.Valid = true } - t.bool = value - t.float64 = 1 - t.int64 = 1 - t.StringValue = "false" } return *t @@ -261,7 +402,6 @@ func (t *UnitValue) SetBool(value bool) UnitValue { func (t *UnitValue) SetUnit(unit string) UnitValue { for range Only.Once { t.UnitValue = unit - // t.Valid = true } return *t diff --git a/iSolarCloud/data.go b/iSolarCloud/data.go index d7bd81dee..e75f83759 100644 --- a/iSolarCloud/data.go +++ b/iSolarCloud/data.go @@ -61,7 +61,7 @@ func (sg *SunGrow) GetEndpoints(endpoints []string, psIds []valueTypes.Integer, } if date.IsZero() { - date = valueTypes.NewDateTime("now") + date = valueTypes.NewDateTime(valueTypes.Now) } // fmt.Printf("FilePrefix: %s\n", date.Original()) // fmt.Printf("String: %s\n", date.String()) diff --git a/iSolarCloud/highlevel.go b/iSolarCloud/highlevel.go index 64139e66b..16fec2d01 100644 --- a/iSolarCloud/highlevel.go +++ b/iSolarCloud/highlevel.go @@ -54,10 +54,10 @@ func (sg *SunGrow) GetPointNamesFromTemplate(template string) api.TemplatePoints pr.Unit = "" } ret = append(ret, api.TemplatePoint { - PsKey: dn, - PointId: pr.PointID, - Description: pr.PointName, - Unit: pr.Unit, + PsKey: dn, + PointId: pr.PointID, + Name: pr.PointName, + Unit: pr.Unit, }) } } @@ -150,7 +150,7 @@ func (sg *SunGrow) GetTemplatePoints(template string) error { sg.Error = table.AddRow( // api.NameDevicePoint(s.PsKey, s.PointId), s.PsKey + "." + s.PointId.String(), - s.Description, + s.Name, s.Unit, ) if sg.Error != nil { @@ -787,6 +787,7 @@ func (sg *SunGrow) GetDevicePoints(psIds ...valueTypes.Integer) error { break } points.AppendMap(data) + // api raw getPowerStationData '{"date_id":"202210","date_type":"2","ps_id":"1171348"}' ep = sg.GetByStruct("AppService.getPowerStationData", getPowerStationData.RequestData{ PsId: psId, DateType: "2", DateID: "202210"}, DefaultCacheTimeout) if sg.Error != nil { @@ -799,6 +800,7 @@ func (sg *SunGrow) GetDevicePoints(psIds ...valueTypes.Integer) error { break } points.AppendMap(data) + // api raw getPowerStationData '{"date_id":"2022","date_type":"3","ps_id":"1171348"}' ep = sg.GetByStruct("AppService.getPowerStationData", getPowerStationData.RequestData{ PsId: psId, DateType: "3", DateID: "2022"}, DefaultCacheTimeout) if sg.Error != nil { @@ -1086,7 +1088,7 @@ func (sg *SunGrow) GetDevices(print bool) (getDeviceList.Devices, error) { DeviceModelID: valueTypes.SetIntegerValue(0), TypeName: valueTypes.SetStringValue("Ps Id"), DeviceState: psId.PsHealthStatus, - DevStatus: psId.PsStatus.String(), + DevStatus: psId.PsStatus, Uuid: valueTypes.SetIntegerValue(0), // PsFaultStatus: d.PsFaultStatus, diff --git a/mmHa/struct.go b/mmHa/struct.go index 13e5bd357..ef7d56579 100644 --- a/mmHa/struct.go +++ b/mmHa/struct.go @@ -449,7 +449,7 @@ func (m *Mqtt) GetLastReset(pointType string) string { if !pt.Valid { break } - if pt.TimeSpan == "" { + if pt.UpdateFreq == "" { break } ret = pt.WhenReset()