2022-10-19 01:37:11 +11:00

706 lines
36 KiB
Go

package queryDeviceList
import (
"GoSungrow/iSolarCloud/api"
"GoSungrow/iSolarCloud/api/apiReflect"
"GoSungrow/iSolarCloud/api/valueTypes"
"github.com/MickMake/GoUnify/Only"
"fmt"
)
const Url = "/v1/devService/queryDeviceList"
const Disabled = false
type RequestData struct {
PsId valueTypes.Integer `json:"ps_id" required:"true"`
}
func (rd RequestData) IsValid() error {
return apiReflect.VerifyOptionsRequired(rd)
}
func (rd RequestData) Help() string {
ret := fmt.Sprintf("")
return ret
}
type ResultData struct {
DevCountByStatusMap struct {
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" PointId:"device_types" PointUpdateFreq:"UpdateFreqBoot"`
// DevTypeDefinition struct {
// One string `json:"1"`
// One0 string `json:"10"`
// One1 string `json:"11"`
// One2 string `json:"12"`
// One3 string `json:"13"`
// One4 string `json:"14"`
// One5 string `json:"15"`
// One6 string `json:"16"`
// One7 string `json:"17"`
// One8 string `json:"18"`
// One9 string `json:"19"`
// Two0 string `json:"20"`
// Two1 string `json:"21"`
// Two2 string `json:"22"`
// Two3 string `json:"23"`
// Two4 string `json:"24"`
// Two5 string `json:"25"`
// Two6 string `json:"26"`
// Two8 string `json:"28"`
// Two9 string `json:"29"`
// Three string `json:"3"`
// Three0 string `json:"30"`
// Three1 string `json:"31"`
// Three2 string `json:"32"`
// Three3 string `json:"33"`
// Three4 string `json:"34"`
// Three5 string `json:"35"`
// Three6 string `json:"36"`
// Three7 string `json:"37"`
// Three8 string `json:"38"`
// Three9 string `json:"39"`
// Four string `json:"4"`
// Four0 string `json:"40"`
// Four1 string `json:"41"`
// Four2 string `json:"42"`
// Four3 string `json:"43"`
// Four4 string `json:"44"`
// Four5 string `json:"45"`
// Four6 string `json:"46"`
// Four7 string `json:"47"`
// Four8 string `json:"48"`
// Five string `json:"5"`
// Five0 string `json:"50"`
// Six string `json:"6"`
// Seven string `json:"7"`
// Eight string `json:"8"`
// Nine string `json:"9"`
// Nine9 string `json:"99"`
// } `json:"dev_type_definition"`
PageList []struct {
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" PointUpdateFreq:"UpdateFreqBoot"`
DataFlagDetail valueTypes.Integer `json:"data_flag_detail" PointId:"data_flag_detail"`
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" PointUpdateFreq:"UpdateFreqInstant"`
TimeZone valueTypes.String `json:"time_zone" PointUpdateFreq:"UpdateFreqInstant"`
} `json:"psTimezoneInfo"`
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" 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 PointStruct struct {
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 {
var err error
// switch {
// case e.Dummy == "":
// break
// default:
// err = errors.New(fmt.Sprintf("unknown error '%s'", e.Dummy))
// }
return err
}
func (e *ResultData) GetDataByName(name string) []PointStruct {
var ret []PointStruct
for range Only.Once {
i := len(e.PageList)
if i == 0 {
break
}
for _, p := range e.PageList {
if p.DeviceName.Value() != name {
continue
}
ret = p.PointData
break
}
}
return ret
}
func (e *EndPoint) GetData() api.DataMap {
entries := api.NewDataMap()
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
pkg := apiReflect.GetName("", *e)
// name := api.JoinWithDots(0, "", pkg) // , e.Request.PsId)
dt := valueTypes.NewDateTime(valueTypes.Now)
entries.StructToPoints(e.Response.ResultData, pkg, e.Request.PsId.String(), dt)
if len(entries.Map) == 0 {
break
}
e.GetEnergyStorageSystem(entries)
e.GetCommunicationModule(entries)
e.GetBattery(entries)
}
return entries
}
func (e *EndPoint) GetEnergyStorageSystem(entries api.DataMap) {
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
pkg := apiReflect.GetName("", *e)
var devices []string
/*
PVPower - TotalDcPower
PVPowerToBattery - BatteryChargingPower
PVPowerToLoad - TotalDcPower - BatteryChargingPower - TotalExportActivePower
PVPowerToGrid - TotalExportActivePower
LoadPower - TotalLoadActivePower
BatteryPowerToLoad - BatteryDischargingPower
BatteryPowerToGrid - ?
GridPower - lowerUpper(PVPowerToGrid, GridPowerToLoad)
GridPowerToLoad - PurchasedPower
GridPowerToBattery - ?
YieldSelfConsumption - DailyLoadEnergyConsumptionFromPv
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) {
// }
}
// 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)
// BatteryChargingPower
battery_charge_power := entries.CopyPoint(srcEndpoint + ".p13126.value", dstEndpoint, "battery_charge_power", "")
// BatteryDischargingPower
battery_discharge_power := entries.CopyPoint(srcEndpoint + ".p13150.value", dstEndpoint, "battery_discharge_power", "")
// Daily PV Yield
daily_pv_energy := entries.CopyPoint(srcEndpoint + ".p13112.value", dstEndpoint, "daily_pv_energy", "")
// DailyBatteryChargingEnergyFromPv
pv_battery_charge_energy := entries.CopyPoint(srcEndpoint + ".p13174.value", dstEndpoint, "pv_battery_charge_energy", "")
// DailyBatteryDischargingEnergy
battery_discharge := entries.CopyPoint(srcEndpoint + ".p13029.value", dstEndpoint, "battery_discharge", "")
// 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), "", "")
// 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())
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())
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())
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())
// 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())
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", "")
}
}
}