v2.2.1 - better raw data handling

This commit is contained in:
MickMake 2022-04-29 16:36:18 +10:00
parent 388ef9de2a
commit 13d65b9fb1
29 changed files with 2180 additions and 1088 deletions

134
.idea/workspace.xml generated
View File

@ -5,13 +5,30 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="76adadc9-ae71-42a6-82a1-66dbc8ecb14c" name="Changes" comment=""> <list default="true" id="76adadc9-ae71-42a6-82a1-66dbc8ecb14c" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/mmHa/const.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/cmd/cmd_api.go" beforeDir="false" afterPath="$PROJECT_DIR$/cmd/cmd_api.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/cmd/cmd_data.go" beforeDir="false" afterPath="$PROJECT_DIR$/cmd/cmd_data.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/cmd/cmd_data_sub.go" beforeDir="false" afterPath="$PROJECT_DIR$/cmd/cmd_data_sub.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/cmd/cmd_mqtt.go" beforeDir="false" afterPath="$PROJECT_DIR$/cmd/cmd_mqtt.go" afterDir="false" /> <change beforePath="$PROJECT_DIR$/cmd/cmd_mqtt.go" beforeDir="false" afterPath="$PROJECT_DIR$/cmd/cmd_mqtt.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/examples.txt" beforeDir="false" afterPath="$PROJECT_DIR$/examples.txt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/go.mod" beforeDir="false" afterPath="$PROJECT_DIR$/go.mod" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/AppService/getPowerDeviceModelTree/data.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/AppService/getPowerDeviceModelTree/data.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/AppService/getPowerDevicePointInfo/data.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/AppService/getPowerDevicePointInfo/data.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/AppService/getPowerDevicePointInfo/struct.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/AppService/getPowerDevicePointInfo/struct.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/AppService/getPowerDevicePointNames/data.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/AppService/getPowerDevicePointNames/data.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/AppService/getPsDetailWithPsType/data.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/AppService/getPsDetailWithPsType/data.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/AppService/getPsList/data.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/AppService/getPsList/data.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/AppService/queryDeviceList/data.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/AppService/queryDeviceList/data.go" afterDir="false" /> <change beforePath="$PROJECT_DIR$/iSolarCloud/AppService/queryDeviceList/data.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/AppService/queryDeviceList/data.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/AppService/queryDeviceRealTimeDataByPsKeys/data.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/AppService/queryDeviceRealTimeDataByPsKeys/data.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/api/apiReflect/reflect.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/api/apiReflect/reflect.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/api/nullEndPoint/struct.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/api/nullEndPoint/struct.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/api/struct_endpoint.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/api/struct_endpoint.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/api/struct_points.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/api/struct_points.go" afterDir="false" /> <change beforePath="$PROJECT_DIR$/iSolarCloud/api/struct_points.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/api/struct_points.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/api/struct_template_points.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/api/struct_template_points.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/api/types.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/api/types.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/highlevel.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/highlevel.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/iSolarCloud/struct.go" beforeDir="false" afterPath="$PROJECT_DIR$/iSolarCloud/struct.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/mmHa/binary_sensor.go" beforeDir="false" afterPath="$PROJECT_DIR$/mmHa/binary_sensor.go" afterDir="false" /> <change beforePath="$PROJECT_DIR$/mmHa/binary_sensor.go" beforeDir="false" afterPath="$PROJECT_DIR$/mmHa/binary_sensor.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/mmHa/lights.go" beforeDir="false" afterPath="$PROJECT_DIR$/mmHa/lights.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/mmHa/sensors.go" beforeDir="false" afterPath="$PROJECT_DIR$/mmHa/sensors.go" afterDir="false" /> <change beforePath="$PROJECT_DIR$/mmHa/sensors.go" beforeDir="false" afterPath="$PROJECT_DIR$/mmHa/sensors.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/mmHa/struct.go" beforeDir="false" afterPath="$PROJECT_DIR$/mmHa/struct.go" afterDir="false" /> <change beforePath="$PROJECT_DIR$/mmHa/struct.go" beforeDir="false" afterPath="$PROJECT_DIR$/mmHa/struct.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/mmHa/switch.go" beforeDir="false" afterPath="$PROJECT_DIR$/mmHa/switch.go" afterDir="false" /> <change beforePath="$PROJECT_DIR$/mmHa/switch.go" beforeDir="false" afterPath="$PROJECT_DIR$/mmHa/switch.go" afterDir="false" />
@ -80,7 +97,7 @@
<configuration name="GoSungrow" type="GoApplicationRunConfiguration" factoryName="Go Application"> <configuration name="GoSungrow" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="GoSungrow" /> <module name="GoSungrow" />
<working_directory value="$PROJECT_DIR$" /> <working_directory value="$PROJECT_DIR$" />
<parameters value="mqtt run" /> <parameters value="api raw getPowerDevicePointInfo '{&quot;id&quot;:&quot;1&quot;}'" />
<kind value="PACKAGE" /> <kind value="PACKAGE" />
<package value="$PROJECT_DIR$" /> <package value="$PROJECT_DIR$" />
<directory value="$PROJECT_DIR$" /> <directory value="$PROJECT_DIR$" />
@ -88,23 +105,6 @@
<output_directory value="$PROJECT_DIR$/bin" /> <output_directory value="$PROJECT_DIR$/bin" />
<method v="2" /> <method v="2" />
</configuration> </configuration>
<configuration default="true" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="GoSungrow" />
<working_directory value="$PROJECT_DIR$" />
<kind value="FILE" />
<directory value="$PROJECT_DIR$" />
<filePath value="$PROJECT_DIR$" />
<method v="2" />
</configuration>
<configuration default="true" type="GoTestRunConfiguration" factoryName="Go Test">
<module name="GoSungrow" />
<working_directory value="$PROJECT_DIR$" />
<kind value="DIRECTORY" />
<directory value="$PROJECT_DIR$" />
<filePath value="$PROJECT_DIR$" />
<framework value="gotest" />
<method v="2" />
</configuration>
</component> </component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" /> <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TypeScriptGeneratedFilesManager"> <component name="TypeScriptGeneratedFilesManager">
@ -153,12 +153,12 @@
</line-breakpoint> </line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint"> <line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/AppService/queryDeviceList/data.go</url> <url>file://$PROJECT_DIR$/iSolarCloud/AppService/queryDeviceList/data.go</url>
<line>201</line> <line>207</line>
<option name="timeStamp" value="202" /> <option name="timeStamp" value="202" />
</line-breakpoint> </line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint"> <line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/api/struct_endpoint.go</url> <url>file://$PROJECT_DIR$/iSolarCloud/api/struct_endpoint.go</url>
<line>105</line> <line>118</line>
<option name="timeStamp" value="217" /> <option name="timeStamp" value="217" />
</line-breakpoint> </line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint"> <line-breakpoint enabled="true" type="DlvLineBreakpoint">
@ -206,14 +206,9 @@
<line>260</line> <line>260</line>
<option name="timeStamp" value="511" /> <option name="timeStamp" value="511" />
</line-breakpoint> </line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/api/struct_points.go</url>
<line>289</line>
<option name="timeStamp" value="523" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint"> <line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/highlevel.go</url> <url>file://$PROJECT_DIR$/iSolarCloud/highlevel.go</url>
<line>518</line> <line>521</line>
<option name="timeStamp" value="570" /> <option name="timeStamp" value="570" />
</line-breakpoint> </line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint"> <line-breakpoint enabled="true" type="DlvLineBreakpoint">
@ -238,7 +233,7 @@
</line-breakpoint> </line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint"> <line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/highlevel.go</url> <url>file://$PROJECT_DIR$/iSolarCloud/highlevel.go</url>
<line>658</line> <line>662</line>
<option name="timeStamp" value="619" /> <option name="timeStamp" value="619" />
</line-breakpoint> </line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint"> <line-breakpoint enabled="true" type="DlvLineBreakpoint">
@ -271,13 +266,90 @@
<line>273</line> <line>273</line>
<option name="timeStamp" value="668" /> <option name="timeStamp" value="668" />
</line-breakpoint> </line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/AppService/queryDeviceList/data.go</url>
<line>566</line>
<option name="timeStamp" value="672" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/cmd/cmd_mqtt.go</url>
<line>369</line>
<option name="timeStamp" value="697" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/api/struct_data.go</url>
<line>189</line>
<option name="timeStamp" value="726" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/api/apiReflect/reflect.go</url>
<line>636</line>
<option name="timeStamp" value="735" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/api/apiReflect/reflect.go</url>
<line>667</line>
<option name="timeStamp" value="739" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/AppService/getPsList/data.go</url>
<line>322</line>
<option name="timeStamp" value="773" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/AppService/getPsList/data.go</url>
<line>255</line>
<option name="timeStamp" value="774" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/cmd/cmd_mqtt.go</url>
<line>461</line>
<option name="timeStamp" value="775" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/AppService/queryDeviceList/data.go</url>
<line>332</line>
<option name="timeStamp" value="788" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/AppService/queryDeviceList/data.go</url>
<line>326</line>
<option name="timeStamp" value="790" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/highlevel.go</url>
<line>350</line>
<option name="timeStamp" value="796" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/highlevel.go</url>
<line>341</line>
<option name="timeStamp" value="804" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/cmd/cmd_api.go</url>
<line>179</line>
<option name="timeStamp" value="808" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/struct.go</url>
<line>121</line>
<option name="timeStamp" value="813" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DlvLineBreakpoint">
<url>file://$PROJECT_DIR$/iSolarCloud/api/struct_endpoint.go</url>
<line>107</line>
<option name="timeStamp" value="816" />
</line-breakpoint>
</breakpoints> </breakpoints>
</breakpoint-manager> </breakpoint-manager>
<watches-manager> <watches-manager>
<configuration name="GoApplicationRunConfiguration"> <configuration name="GoApplicationRunConfiguration">
<watch expression="cmdDataSave" language="go" /> <watch expression="dm.Order[len(dm.Order)-1]" language="go" />
<watch expression="dm.Entries[dm.Order[len(dm.Order)-1]]" language="go" />
<watch expression="Cmd" language="go" /> <watch expression="Cmd" language="go" />
<watch expression="payload.LastReset" language="go" /> <watch expression="e.ApiRoot" language="go" />
<watch expression="ret.ApiRoot" language="go" />
</configuration> </configuration>
</watches-manager> </watches-manager>
</component> </component>

View File

@ -183,7 +183,16 @@ func cmdApiGetFunc(_ *cobra.Command, args []string) {
break break
} }
Cmd.Error = Cmd.SunGrow.GetByJson(args[0], args[1]).GetError() ep := Cmd.SunGrow.GetByJson(args[0], args[1])
if Cmd.SunGrow.Error != nil {
Cmd.Error = Cmd.SunGrow.Error
break
}
if Cmd.Error != nil {
break
}
Cmd.Error = ep.GetError()
if Cmd.Error != nil { if Cmd.Error != nil {
break break
} }
@ -200,7 +209,16 @@ func cmdApiRawFunc(_ *cobra.Command, args []string) {
break break
} }
Cmd.Error = Cmd.SunGrow.GetByJson(args[0], args[1]).GetError() ep := Cmd.SunGrow.GetByJson(args[0], args[1])
if Cmd.SunGrow.Error != nil {
Cmd.Error = Cmd.SunGrow.Error
break
}
if Cmd.Error != nil {
break
}
Cmd.Error = ep.GetError()
if Cmd.Error != nil { if Cmd.Error != nil {
break break
} }
@ -217,7 +235,16 @@ func cmdApiSaveFunc(_ *cobra.Command, args []string) {
break break
} }
Cmd.Error = Cmd.SunGrow.GetByJson(args[0], args[1]).GetError() ep := Cmd.SunGrow.GetByJson(args[0], args[1])
if Cmd.SunGrow.Error != nil {
Cmd.Error = Cmd.SunGrow.Error
break
}
if Cmd.Error != nil {
break
}
Cmd.Error = ep.GetError()
if Cmd.Error != nil { if Cmd.Error != nil {
break break
} }

View File

@ -61,10 +61,11 @@ func AttachCmdData(cmd *cobra.Command) *cobra.Command {
AttachCmdDataTemplate(cmdDataGet) AttachCmdDataTemplate(cmdDataGet)
AttachCmdDataTemplatePoints(cmdDataGet) AttachCmdDataTemplatePoints(cmdDataGet)
AttachCmdDataPoints(cmdDataGet) AttachCmdDataPoints(cmdDataGet)
AttachCmdDataPointNames(cmdDataGet) AttachCmdDataTemplates(cmdDataGet)
AttachCmdDataMqtt(cmdDataGet) AttachCmdDataMqtt(cmdDataGet)
AttachCmdDataRealTime(cmdDataGet) AttachCmdDataRealTime(cmdDataGet)
AttachCmdDataPsDetails(cmdDataGet) AttachCmdDataPsDetails(cmdDataGet)
AttachCmdDataPointNames(cmdDataGet)
// ******************************************************************************** // ********************************************************************************
var cmdDataRaw = &cobra.Command{ var cmdDataRaw = &cobra.Command{
@ -85,7 +86,7 @@ func AttachCmdData(cmd *cobra.Command) *cobra.Command {
AttachCmdDataStats(cmdDataRaw) AttachCmdDataStats(cmdDataRaw)
AttachCmdDataTemplate(cmdDataRaw) AttachCmdDataTemplate(cmdDataRaw)
AttachCmdDataPoints(cmdDataRaw) AttachCmdDataPoints(cmdDataRaw)
AttachCmdDataPointNames(cmdDataRaw) AttachCmdDataTemplates(cmdDataRaw)
AttachCmdDataMqtt(cmdDataRaw) AttachCmdDataMqtt(cmdDataRaw)
AttachCmdDataRealTime(cmdDataRaw) AttachCmdDataRealTime(cmdDataRaw)
AttachCmdDataPsDetails(cmdDataRaw) AttachCmdDataPsDetails(cmdDataRaw)
@ -109,10 +110,11 @@ func AttachCmdData(cmd *cobra.Command) *cobra.Command {
AttachCmdDataStats(cmdDataSave) AttachCmdDataStats(cmdDataSave)
AttachCmdDataTemplate(cmdDataSave) AttachCmdDataTemplate(cmdDataSave)
AttachCmdDataPoints(cmdDataSave) AttachCmdDataPoints(cmdDataSave)
AttachCmdDataPointNames(cmdDataSave) AttachCmdDataTemplates(cmdDataSave)
AttachCmdDataMqtt(cmdDataSave) AttachCmdDataMqtt(cmdDataSave)
AttachCmdDataRealTime(cmdDataSave) AttachCmdDataRealTime(cmdDataSave)
AttachCmdDataPsDetails(cmdDataSave) AttachCmdDataPsDetails(cmdDataSave)
AttachCmdDataPointNames(cmdDataSave)
// ******************************************************************************** // ********************************************************************************
var cmdDataGraph = &cobra.Command{ var cmdDataGraph = &cobra.Command{

View File

@ -95,7 +95,7 @@ func AttachCmdDataPoints(cmd *cobra.Command) *cobra.Command {
return cmd return cmd
} }
func AttachCmdDataPointNames(cmd *cobra.Command) *cobra.Command { func AttachCmdDataTemplates(cmd *cobra.Command) *cobra.Command {
// ******************************************************************************** // ********************************************************************************
var c = &cobra.Command{ var c = &cobra.Command{
Use: "templates", Use: "templates",
@ -185,3 +185,25 @@ func AttachCmdDataPsDetails(cmd *cobra.Command) *cobra.Command {
return cmd return cmd
} }
func AttachCmdDataPointNames(cmd *cobra.Command) *cobra.Command {
// ********************************************************************************
var c = &cobra.Command{
Use: "point-names",
Aliases: []string{"names"},
Short: fmt.Sprintf("Get iSolarCloud point names."),
Long: fmt.Sprintf("Get iSolarCloud point names."),
DisableFlagParsing: false,
DisableFlagsInUseLine: false,
PreRunE: Cmd.SunGrowArgs,
RunE: func(cmd *cobra.Command, args []string) error {
_ = SwitchOutput(cmd)
return Cmd.SunGrow.GetPointNames(args...)
},
Args: cobra.MinimumNArgs(0),
}
cmd.AddCommand(c)
c.Example = PrintExamples(c, "")
return cmd
}

View File

@ -292,22 +292,33 @@ func Update1(newDay bool) error {
if newDay { if newDay {
LogPrintDate("New day: Configuring %d entries in HASSIO.\n", len(data.Entries)) LogPrintDate("New day: Configuring %d entries in HASSIO.\n", len(data.Entries))
for _, r := range data.Entries { for _, o := range data.Order {
r := data.Entries[o]
fmt.Printf("C") fmt.Printf("C")
re := mmHa.EntityConfig { re := mmHa.EntityConfig {
Type: r.ValueType.Type, Name: r.Point.Id, // PointName,
Name: r.ValueType.Id, // PointName,
SubName: "", SubName: "",
ParentId: r.ValueType.PsKey, ParentId: r.EndPoint,
ParentName: "", ParentName: "",
UniqueId: r.PointId, UniqueId: r.Point.Id,
FullName: r.ValueType.Description, FullId: r.Point.FullId,
Units: r.Unit, Units: r.Point.Unit,
ValueName: r.PointId, ValueName: r.Point.Name,
DeviceClass: "", DeviceClass: "",
StateClass: r.Point.Type,
Value: r.Value, Value: r.Value,
// Icon: "",
// ValueTemplate: "",
// LastReset: "",
// LastResetValueTemplate: "",
} }
// if re.LastResetValueTemplate != "" {
// fmt.Printf("HEY\n")
// }
Cmd.Error = Cmd.Mqtt.BinarySensorPublishConfig(re) Cmd.Error = Cmd.Mqtt.BinarySensorPublishConfig(re)
if Cmd.Error != nil { if Cmd.Error != nil {
break break
@ -322,19 +333,24 @@ func Update1(newDay bool) error {
} }
LogPrintDate("Updating %d entries to HASSIO.\n", len(data.Entries)) LogPrintDate("Updating %d entries to HASSIO.\n", len(data.Entries))
for _, r := range data.Entries { for _, o := range data.Order {
r := data.Entries[o]
fmt.Printf("U") fmt.Printf("U")
re := mmHa.EntityConfig { re := mmHa.EntityConfig {
Type: r.ValueType.Type, Name: r.Point.Id, // PointName,
Name: r.ValueType.Id, // PointName,
SubName: "", SubName: "",
ParentId: r.ValueType.PsKey, ParentId: r.EndPoint,
ParentName: "", ParentName: "",
UniqueId: r.PointId, UniqueId: r.Point.Id,
FullName: r.ValueType.Description, // UniqueId: r.Id,
Units: r.Unit, FullId: r.Point.FullId,
ValueName: r.PointId, // FullName: r.Point.Name,
Units: r.Point.Unit,
ValueName: r.Point.Name,
// ValueName: r.Id,
DeviceClass: "", DeviceClass: "",
StateClass: r.Point.Type,
Value: r.Value, Value: r.Value,
} }
@ -369,20 +385,25 @@ func Update2(newDay bool) error {
if newDay { if newDay {
LogPrintDate("New day: Configuring %d entries in HASSIO.\n", len(data.Entries)) LogPrintDate("New day: Configuring %d entries in HASSIO.\n", len(data.Entries))
for _, r := range data.Entries { for _, o := range data.Order {
r := data.Entries[o]
fmt.Printf("C") fmt.Printf("C")
re := mmHa.EntityConfig { re := mmHa.EntityConfig {
Type: r.ValueType.Type, Name: r.Point.Id, // PointName,
Name: r.ValueType.Id, // PointName,
SubName: "", SubName: "",
ParentId: r.ValueType.PsKey, ParentId: r.EndPoint,
ParentName: "", ParentName: "",
UniqueId: r.PointId, UniqueId: r.Point.Id,
FullName: r.ValueType.Description, // UniqueId: r.Id,
Units: r.Unit, FullId: r.Point.FullId,
ValueName: r.PointId, // FullName: r.Point.Name,
Units: r.Point.Unit,
ValueName: r.Point.Name,
// ValueName: r.Id,
DeviceClass: "", DeviceClass: "",
StateClass: r.Point.Type,
Value: r.Value, Value: r.Value,
} }
@ -400,20 +421,25 @@ func Update2(newDay bool) error {
} }
LogPrintDate("Updating %d entries to HASSIO.\n", len(data.Entries)) LogPrintDate("Updating %d entries to HASSIO.\n", len(data.Entries))
for _, r := range data.Entries { for _, o := range data.Order {
r := data.Entries[o]
fmt.Printf("U") fmt.Printf("U")
re := mmHa.EntityConfig { re := mmHa.EntityConfig {
Type: r.ValueType.Type, Name: r.Point.Id, // PointName,
Name: r.ValueType.Id, // PointName,
SubName: "", SubName: "",
ParentId: r.ValueType.PsKey, ParentId: r.EndPoint,
ParentName: "", ParentName: "",
UniqueId: r.PointId, UniqueId: r.Point.Id,
FullName: r.ValueType.Description, // UniqueId: r.Id,
Units: r.Unit, FullId: r.Point.FullId,
ValueName: r.PointId, // FullName: r.Point.Name,
Units: r.Point.Unit,
ValueName: r.Point.Name,
// ValueName: r.Id,
DeviceClass: "", DeviceClass: "",
StateClass: r.Point.Type,
Value: r.Value, Value: r.Value,
} }

View File

@ -99,3 +99,15 @@ sensor.sungrow_total_load_active_power == sensor.sungrow_total_active_power
./bin/GoSungrow data save template 8042 20220212 ./bin/GoSungrow data save template 8042 20220212
./bin/GoSungrow get raw template 20220202 ./bin/GoSungrow get raw template 20220202
./bin/GoSungrow get template 8042 20220212 ./bin/GoSungrow get template 8042 20220212
################################################################################
"energy_flow"
1 / 3 - PV2Load && PV2Battery
"1" - PV to Load
"3" - Battery to Load
"5" - PV to Battery

1
go.mod
View File

@ -4,6 +4,7 @@ go 1.17
require ( require (
github.com/acarl005/textcol v0.0.0 github.com/acarl005/textcol v0.0.0
github.com/davecgh/go-spew v1.1.1
github.com/eclipse/paho.mqtt.golang v1.3.5 github.com/eclipse/paho.mqtt.golang v1.3.5
github.com/go-co-op/gocron v1.13.0 github.com/go-co-op/gocron v1.13.0
github.com/go-git/go-billy/v5 v5.3.1 github.com/go-git/go-billy/v5 v5.3.1

View File

@ -10,7 +10,7 @@ const Url = "/v1/devService/getPowerDeviceModelTree"
const Disabled = true const Disabled = true
type RequestData struct { type RequestData struct {
// DeviceType string `json:"device_type" required:"true"` Id string `json:"id" required:"true"`
} }
func (rd RequestData) IsValid() error { func (rd RequestData) IsValid() error {

View File

@ -2,15 +2,14 @@ package getPowerDevicePointInfo
import ( import (
"GoSungrow/iSolarCloud/api/apiReflect" "GoSungrow/iSolarCloud/api/apiReflect"
"errors"
"fmt" "fmt"
) )
const Url = "/v1/reportService/getPowerDevicePointInfo" const Url = "/v1/reportService/getPowerDevicePointInfo"
const Disabled = true const Disabled = false
type RequestData struct { type RequestData struct {
// DeviceType string `json:"device_type" required:"true"` Id string `json:"id" required:"true"`
} }
func (rd RequestData) IsValid() error { func (rd RequestData) IsValid() error {
@ -24,17 +23,23 @@ func (rd RequestData) Help() string {
type ResultData struct { type ResultData struct {
Dummy string `json:"dummy"` DeviceType int64 `json:"device_type" PointId:"device_type" PointType:""`
ID int64 `json:"id" PointId:"id" PointType:""`
Period int64 `json:"period" PointId:"period" PointType:""`
PointID int64 `json:"point_id" PointId:"point_id" PointType:""`
PointName string `json:"point_name" PointId:"point_name" PointType:""`
ShowPointName string `json:"show_point_name" PointId:"show_point_name" PointType:""`
TranslationID int64 `json:"translation_id" PointId:"translation_id" PointType:""`
} }
func (e *ResultData) IsValid() error { func (e *ResultData) IsValid() error {
var err error var err error
switch { // switch {
case e.Dummy == "": // case e.Dummy == "":
break // break
default: // default:
err = errors.New(fmt.Sprintf("unknown error '%s'", e.Dummy)) // err = errors.New(fmt.Sprintf("unknown error '%s'", e.Dummy))
} // }
return err return err
} }

View File

@ -24,6 +24,7 @@ type EndPoint struct {
api.EndPointStruct api.EndPointStruct
Request Request Request Request
Response Response Response Response
RawResponse []byte
} }
// Request - Holds the api.RequestCommon and user RequestData structures. See data.go for request fields. // Request - Holds the api.RequestCommon and user RequestData structures. See data.go for request fields.
@ -127,7 +128,8 @@ func (e EndPoint) Call() api.EndPoint {
// GetJsonData - Get the JSON representation of ResultData, either as condensed or "pretty". // GetJsonData - Get the JSON representation of ResultData, either as condensed or "pretty".
func (e EndPoint) GetJsonData(raw bool) output.Json { func (e EndPoint) GetJsonData(raw bool) output.Json {
if raw { if raw {
return output.Json(e.ApiRoot.Body) // return output.GetAsPrettyJson(string(e.RawResponse))
return output.Json(e.RawResponse)
} else { } else {
return output.GetAsPrettyJson(e.Response.ResultData) return output.GetAsPrettyJson(e.Response.ResultData)
} }
@ -247,6 +249,7 @@ func (e EndPoint) IsRequestValid() error {
// (Used by the web call method.) // (Used by the web call method.)
func (e EndPoint) SetResponse(ref []byte) api.EndPoint { func (e EndPoint) SetResponse(ref []byte) api.EndPoint {
for range Only.Once { for range Only.Once {
e.RawResponse = ref
e.Error = json.Unmarshal(ref, &e.Response) e.Error = json.Unmarshal(ref, &e.Response)
if e.Error != nil { if e.Error != nil {
break break

View File

@ -19,6 +19,11 @@ const (
DeviceType11 = "11" DeviceType11 = "11"
DeviceType14 = "14" DeviceType14 = "14"
DeviceType17 = "17" DeviceType17 = "17"
DeviceType23 = "23"
DeviceType26 = "26"
DeviceType37 = "37"
DeviceType41 = "41"
DeviceType47 = "47"
) )
var DeviceTypes = []string{ var DeviceTypes = []string{
@ -30,6 +35,11 @@ var DeviceTypes = []string{
DeviceType11, DeviceType11,
DeviceType14, DeviceType14,
DeviceType17, DeviceType17,
DeviceType23,
DeviceType26,
DeviceType37,
DeviceType41,
DeviceType47,
} }
type RequestData struct { type RequestData struct {

View File

@ -196,7 +196,7 @@ func (e *EndPoint) GetDataTable() output.Table {
_ = table.AddRow( _ = table.AddRow(
now, now,
api.NameDevicePoint(e.Response.ResultData.PsPsKey, n), api.NameDevicePoint(e.Response.ResultData.PsPsKey, n),
p.Description, p.Name,
keys[n].Value, keys[n].Value,
p.Unit, p.Unit,
keys[n].Unit, keys[n].Unit,
@ -207,7 +207,7 @@ func (e *EndPoint) GetDataTable() output.Table {
_ = table.AddRow( _ = table.AddRow(
now, now,
api.NameDevicePoint(e.Response.ResultData.PsPsKey, n), api.NameDevicePoint(e.Response.ResultData.PsPsKey, n),
api.UpperCase(n), api.PointToName(n),
keys[n].Value, keys[n].Value,
keys[n].Unit, keys[n].Unit,
keys[n].Unit, keys[n].Unit,
@ -226,7 +226,7 @@ func (e *EndPoint) GetDataTable() output.Table {
_ = table.AddRow( _ = table.AddRow(
now, now,
api.NameDevicePoint(sid.PsKey, n), api.NameDevicePoint(sid.PsKey, n),
p.Description, p.Name,
keys[n].Value, keys[n].Value,
p.Unit, p.Unit,
keys[n].Unit, keys[n].Unit,
@ -237,7 +237,7 @@ func (e *EndPoint) GetDataTable() output.Table {
_ = table.AddRow( _ = table.AddRow(
now, now,
api.NameDevicePoint(sid.PsKey, n), api.NameDevicePoint(sid.PsKey, n),
api.UpperCase(n), api.PointToName(n),
keys[n].Value, keys[n].Value,
keys[n].Unit, keys[n].Unit,
keys[n].Unit, keys[n].Unit,
@ -261,8 +261,8 @@ func (e *EndPoint) GetDataTable() output.Table {
return table return table
} }
func (e *EndPoint) GetData() api.Data { func (e *EndPoint) GetData() api.DataMap {
var ret api.Data var ret api.DataMap
// for range Only.Once { // for range Only.Once {
// index := 0 // index := 0

View File

@ -6,7 +6,6 @@ import (
"GoSungrow/iSolarCloud/api/apiReflect" "GoSungrow/iSolarCloud/api/apiReflect"
"GoSungrow/iSolarCloud/api/output" "GoSungrow/iSolarCloud/api/output"
"fmt" "fmt"
"strconv"
"time" "time"
) )
@ -27,35 +26,35 @@ func (rd RequestData) Help() string {
type ResultData struct { type ResultData struct {
PageList []struct { PageList []struct {
AlarmCount int64 `json:"alarm_count"` AlarmCount int64 `json:"alarm_count" PointId:"alarm_count" PointType:"PointTypeBoot"`
AlarmDevCount int64 `json:"alarm_dev_count"` AlarmDevCount int64 `json:"alarm_dev_count" PointId:"alarm_dev_count" PointType:"PointTypeBoot"`
AreaID interface{} `json:"area_id"` AreaID interface{} `json:"area_id" PointId:"area_id" PointType:""`
AreaType interface{} `json:"area_type"` AreaType interface{} `json:"area_type" PointId:"area_type" PointType:""`
ArrearsStatus int64 `json:"arrears_status"` ArrearsStatus int64 `json:"arrears_status" PointId:"arrears_status" PointType:""`
BuildDate string `json:"build_date"` BuildDate string `json:"build_date" PointId:"build_date" PointType:""`
BuildStatus int64 `json:"build_status"` BuildStatus int64 `json:"build_status" PointId:"build_status" PointType:""`
Co2Reduce api.UnitValue `json:"co2_reduce"` Co2Reduce api.UnitValue `json:"co2_reduce" PointId:"co2_reduce" PointType:""`
Co2ReduceTotal api.UnitValue `json:"co2_reduce_total"` Co2ReduceTotal api.UnitValue `json:"co2_reduce_total" PointId:"co2_reduce_total" PointType:"PointTypeTotal"`
CurrPower api.UnitValue `json:"curr_power"` CurrPower api.UnitValue `json:"curr_power" PointId:"curr_power" PointType:""`
DailyIrradiation api.UnitValue `json:"daily_irradiation"` DailyIrradiation api.UnitValue `json:"daily_irradiation" PointId:"daily_irradiation" PointType:"PointTypeDaily"`
DailyIrradiationVirgin interface{} `json:"daily_irradiation_virgin"` DailyIrradiationVirgin interface{} `json:"daily_irradiation_virgin" PointId:"daily_irradiation_virgin" PointType:"PointTypeDaily"`
DesignCapacity string `json:"design_capacity"` DesignCapacity string `json:"design_capacity" PointId:"design_capacity" PointType:""`
DesignCapacityUnit string `json:"design_capacity_unit"` DesignCapacityUnit string `json:"design_capacity_unit" PointId:"design_capacity_unit" PointType:""`
DesignCapacityVirgin float64 `json:"design_capacity_virgin"` DesignCapacityVirgin float64 `json:"design_capacity_virgin" PointId:"design_capacity_virgin" PointType:""`
EquivalentHour api.UnitValue `json:"equivalent_hour"` EquivalentHour api.UnitValue `json:"equivalent_hour" PointId:"equivalent_hour" PointType:"PointTypeDaily"`
EsDisenergy api.UnitValue `json:"es_disenergy"` EsDisenergy api.UnitValue `json:"es_discharge_energy" PointId:"es_discharge_energy" PointAlias:"p83089" PointType:""`
EsEnergy api.UnitValue `json:"es_energy"` EsEnergy api.UnitValue `json:"es_energy" PointId:"es_energy" PointAlias:"p83120" PointType:""`
EsPower api.UnitValue `json:"es_power"` EsPower api.UnitValue `json:"es_power" PointId:"es_power" PointAlias:"p83081" PointType:""`
EsTotalDisenergy api.UnitValue `json:"es_total_disenergy"` EsTotalDisenergy api.UnitValue `json:"es_total_discharge_energy" PointId:"es_total_discharge_energy" PointAlias:"p83095" PointType:"PointTypeTotal"`
EsTotalEnergy api.UnitValue `json:"es_total_energy"` EsTotalEnergy api.UnitValue `json:"es_total_energy" PointId:"es_total_energy" PointAlias:"p83127" PointType:"PointTypeTotal"`
ExpectInstallDate string `json:"expect_install_date"` ExpectInstallDate string `json:"expect_install_date" PointId:"expect_install_date" PointType:""`
FaultAlarmOfflineDevCount int64 `json:"fault_alarm_offline_dev_count"` FaultAlarmOfflineDevCount int64 `json:"fault_alarm_offline_dev_count" PointId:"fault_alarm_offline_dev_count" PointType:""`
FaultCount int64 `json:"fault_count"` FaultCount int64 `json:"fault_count" PointId:"fault_count" PointType:""`
FaultDevCount int64 `json:"fault_dev_count"` FaultDevCount int64 `json:"fault_dev_count" PointId:"fault_dev_count" PointType:""`
GcjLatitude string `json:"gcj_latitude"` GcjLatitude string `json:"gcj_latitude" PointId:"gcj_latitude" PointType:""`
GcjLongitude string `json:"gcj_longitude"` GcjLongitude string `json:"gcj_longitude" PointId:"gcj_longitude" PointType:""`
GprsLatitude interface{} `json:"gprs_latitude"` GprsLatitude interface{} `json:"gprs_latitude" PointId:"gprs_latitude" PointType:""`
GprsLongitude interface{} `json:"gprs_longitude"` GprsLongitude interface{} `json:"gprs_longitude" PointId:"gprs_longitude" PointType:""`
Images []struct { Images []struct {
FileID int64 `json:"file_id"` FileID int64 `json:"file_id"`
ID int64 `json:"id"` ID int64 `json:"id"`
@ -66,90 +65,90 @@ type ResultData struct {
PsID int64 `json:"ps_id"` PsID int64 `json:"ps_id"`
PsUnitUUID interface{} `json:"ps_unit_uuid"` PsUnitUUID interface{} `json:"ps_unit_uuid"`
} `json:"images"` } `json:"images"`
InstallDate string `json:"install_date"` InstallDate string `json:"install_date" PointId:"install_date" PointType:""`
InstalledPowerMap api.UnitValue `json:"installed_power_map"` InstalledPowerMap api.UnitValue `json:"installed_power_map" PointId:"installed_power_map" PointType:""`
InstalledPowerVirgin float64 `json:"installed_power_virgin"` InstalledPowerVirgin float64 `json:"installed_power_virgin" PointId:"installed_power_virgin" PointType:""`
InstallerAlarmCount int64 `json:"installer_alarm_count"` InstallerAlarmCount int64 `json:"installer_alarm_count" PointId:"installer_alarm_count" PointType:""`
InstallerFaultCount int64 `json:"installer_fault_count"` InstallerFaultCount int64 `json:"installer_fault_count" PointId:"installer_fault_count" PointType:""`
InstallerPsFaultStatus int64 `json:"installer_ps_fault_status"` InstallerPsFaultStatus int64 `json:"installer_ps_fault_status" PointId:"installer_ps_fault_status" PointType:""`
IsBankPs int64 `json:"is_bank_ps"` IsBankPs int64 `json:"is_bank_ps" PointId:"is_bank_ps" PointType:""`
IsTuv int64 `json:"is_tuv"` IsTuv int64 `json:"is_tuv" PointId:"is_tuv" PointType:""`
JoinYearInitElec float64 `json:"join_year_init_elec"` JoinYearInitElec float64 `json:"join_year_init_elec" PointId:"join_year_init_elec" PointType:""`
Latitude float64 `json:"latitude"` Latitude float64 `json:"latitude" PointId:"latitude" PointType:""`
Location string `json:"location"` Location string `json:"location" PointId:"location" PointType:""`
Longitude float64 `json:"longitude"` Longitude float64 `json:"longitude" PointId:"longitude" PointType:""`
MapLatitude string `json:"map_latitude"` MapLatitude string `json:"map_latitude" PointId:"map_latitude" PointType:""`
MapLongitude string `json:"map_longitude"` MapLongitude string `json:"map_longitude" PointId:"map_longitude" PointType:""`
MlpeFlag int64 `json:"mlpe_flag"` MlpeFlag int64 `json:"mlpe_flag" PointId:"mlpe_flag" PointType:""`
Nmi interface{} `json:"nmi"` Nmi interface{} `json:"nmi" PointId:"nmi" PointType:""`
OfflineDevCount int64 `json:"offline_dev_count"` OfflineDevCount int64 `json:"offline_dev_count" PointId:"offline_dev_count" PointType:""`
OperateYear interface{} `json:"operate_year"` OperateYear interface{} `json:"operate_year" PointId:"operate_year" PointType:""`
OperationBusName interface{} `json:"operation_bus_name"` OperationBusName interface{} `json:"operation_bus_name" PointId:"operation_bus_name" PointType:""`
OwnerAlarmCount int64 `json:"owner_alarm_count"` OwnerAlarmCount int64 `json:"owner_alarm_count" PointId:"owner_alarm_count" PointType:""`
OwnerFaultCount int64 `json:"owner_fault_count"` OwnerFaultCount int64 `json:"owner_fault_count" PointId:"owner_fault_count" PointType:""`
OwnerPsFaultStatus int64 `json:"owner_ps_fault_status"` OwnerPsFaultStatus int64 `json:"owner_ps_fault_status" PointId:"owner_ps_fault_status" PointType:""`
P83022y string `json:"p83022y"` P83022y string `json:"p83022y" PointId:"P83022" PointType:""`
P83046 interface{} `json:"p83046"` P83046 interface{} `json:"p83046" PointId:"p83046" PointType:""`
P83048 interface{} `json:"p83048"` P83048 interface{} `json:"p83048" PointId:"p83048" PointType:""`
P83049 interface{} `json:"p83049"` P83049 interface{} `json:"p83049" PointId:"p83049" PointType:""`
P83050 interface{} `json:"p83050"` P83050 interface{} `json:"p83050" PointId:"p83050" PointType:""`
P83051 interface{} `json:"p83051"` P83051 interface{} `json:"p83051" PointId:"p83051" PointType:""`
P83054 interface{} `json:"p83054"` P83054 interface{} `json:"p83054" PointId:"p83054" PointType:""`
P83055 interface{} `json:"p83055"` P83055 interface{} `json:"p83055" PointId:"p83055" PointType:""`
P83067 interface{} `json:"p83067"` P83067 interface{} `json:"p83067" PointId:"p83067" PointType:""`
P83070 interface{} `json:"p83070"` P83070 interface{} `json:"p83070" PointId:"p83070" PointType:""`
P83076 float64 `json:"p83076"` P83076 float64 `json:"p83076" PointId:"p83076" PointType:""` // Dupe of PvPower
P83077 float64 `json:"p83077"` P83077 float64 `json:"p83077" PointId:"p83077" PointType:""`
P83081 float64 `json:"p83081"` P83081 float64 `json:"p83081" PointId:"p83081" PointType:""` // Dupe of EsPower
P83089 float64 `json:"p83089"` P83089 float64 `json:"p83089" PointId:"p83089" PointType:""` // Dupe of EsDisenergy
P83095 float64 `json:"p83095"` P83095 float64 `json:"p83095" PointId:"p83095" PointType:""` // Dupe of EsTotalDisenergy
P83118 float64 `json:"p83118"` P83118 float64 `json:"p83118" PointId:"p83118" PointType:""` // Dupe of UseEnergy
P83120 float64 `json:"p83120"` P83120 float64 `json:"p83120" PointId:"p83120" PointType:""` // Dupe of EsEnergy
P83127 float64 `json:"p83127"` P83127 float64 `json:"p83127" PointId:"p83127" PointType:""` // Dupe of EsTotalEnergy
ParamCo2 float64 `json:"param_co2"` ParamCo2 float64 `json:"param_co2" PointId:"param_co2" PointType:""`
ParamCoal float64 `json:"param_coal"` ParamCoal float64 `json:"param_coal" PointId:"param_coal" PointType:""`
ParamIncome float64 `json:"param_income"` ParamIncome float64 `json:"param_income" PointId:"param_income" PointType:""`
ParamMeter float64 `json:"param_meter"` ParamMeter float64 `json:"param_meter" PointId:"param_meter" PointType:""`
ParamNox float64 `json:"param_nox"` ParamNox float64 `json:"param_nox" PointId:"param_nox" PointType:""`
ParamPowder float64 `json:"param_powder"` ParamPowder float64 `json:"param_powder" PointId:"param_powder" PointType:""`
ParamSo2 float64 `json:"param_so2"` ParamSo2 float64 `json:"param_so2" PointId:"param_so2" PointType:""`
ParamTree float64 `json:"param_tree"` ParamTree float64 `json:"param_tree" PointId:"param_tree" PointType:""`
ParamWater float64 `json:"param_water"` ParamWater float64 `json:"param_water" PointId:"param_water" PointType:""`
PrScale string `json:"pr_scale"` PrScale string `json:"pr_scale" PointId:"pr_scale" PointType:""`
Producer interface{} `json:"producer"` Producer interface{} `json:"producer" PointId:"producer" PointType:""`
PsCountryID int64 `json:"ps_country_id"` PsCountryID int64 `json:"ps_country_id" PointId:"ps_country_id" PointType:""`
PsFaultStatus int64 `json:"ps_fault_status"` PsFaultStatus int64 `json:"ps_fault_status" PointId:"ps_fault_status" PointType:""`
PsHealthStatus string `json:"ps_health_status"` PsHealthStatus string `json:"ps_health_status" PointId:"ps_health_status" PointType:""`
PsHolder string `json:"ps_holder"` PsHolder string `json:"ps_holder" PointId:"ps_holder" PointType:""`
PsID int64 `json:"ps_id"` PsID int64 `json:"ps_id" PointId:"ps_id" PointType:""`
PsIsNotInit string `json:"ps_is_not_init"` PsIsNotInit string `json:"ps_is_not_init" PointId:"ps_is_not_init" PointType:""`
PsName string `json:"ps_name"` PsName string `json:"ps_name" PointId:"ps_name" PointType:""`
PsShortName string `json:"ps_short_name"` PsShortName string `json:"ps_short_name" PointId:"ps_short_name" PointType:""`
PsStatus int64 `json:"ps_status"` PsStatus int64 `json:"ps_status" PointId:"ps_status" PointType:""`
PsTimezone string `json:"ps_timezone"` PsTimezone string `json:"ps_timezone" PointId:"ps_timezone" PointType:""`
PsType int64 `json:"ps_type"` PsType int64 `json:"ps_type" PointId:"ps_type" PointType:""`
PvEnergy api.UnitValue `json:"pv_energy"` PvEnergy api.UnitValue `json:"pv_energy" PointId:"pv_energy" PointAlias:"p83077" PointType:""`
PvPower api.UnitValue `json:"pv_power"` PvPower api.UnitValue `json:"pv_power" PointId:"pv_power" PointAlias:"p83076" PointType:""`
Radiation api.UnitValue `json:"radiation"` Radiation api.UnitValue `json:"radiation" PointId:"radiation" PointType:""`
RadiationVirgin interface{} `json:"radiation_virgin"` RadiationVirgin interface{} `json:"radiation_virgin" PointId:"radiation_virgin" PointType:""`
RecoreCreateTime string `json:"recore_create_time"` RecoreCreateTime string `json:"recore_create_time" PointId:"recore_create_time" PointType:""`
SafeStartDate string `json:"safe_start_date"` SafeStartDate string `json:"safe_start_date" PointId:"safe_start_date" PointType:""`
ShareType string `json:"share_type"` ShareType string `json:"share_type" PointId:"share_type" PointType:""`
ShippingAddress string `json:"shipping_address"` ShippingAddress string `json:"shipping_address" PointId:"shipping_address" PointType:""`
ShippingZipCode string `json:"shipping_zip_code"` ShippingZipCode string `json:"shipping_zip_code" PointId:"shipping_zip_code" PointType:""`
TodayEnergy api.UnitValue `json:"today_energy"` TodayEnergy api.UnitValue `json:"today_energy" PointId:"today_energy" PointType:"PointTypeDaily"`
TodayIncome api.UnitValue `json:"today_income"` TodayIncome api.UnitValue `json:"today_income" PointId:"today_income" PointType:"PointTypeDaily"`
TotalCapcity api.UnitValue `json:"total_capcity"` TotalCapcity api.UnitValue `json:"total_capacity" PointId:"total_capacity" PointType:"PointTypeTotal"`
TotalEnergy api.UnitValue `json:"total_energy"` TotalEnergy api.UnitValue `json:"total_energy" PointId:"total_energy" PointType:"PointTypeTotal"`
TotalIncome api.UnitValue `json:"total_income"` TotalIncome api.UnitValue `json:"total_income" PointId:"total_income" PointType:"PointTypeTotal"`
TotalInitCo2Accelerate float64 `json:"total_init_co2_accelerate"` TotalInitCo2Accelerate float64 `json:"total_init_co2_accelerate" PointId:"total_init_co2_accelerate" PointType:"PointTypeTotal"`
TotalInitElec float64 `json:"total_init_elec"` TotalInitElec float64 `json:"total_init_elec" PointId:"total_init_elec" PointType:"PointTypeTotal"`
TotalInitProfit float64 `json:"total_init_profit"` TotalInitProfit float64 `json:"total_init_profit" PointId:"total_init_profit" PointType:"PointTypeTotal"`
UseEnergy api.UnitValue `json:"use_energy"` UseEnergy api.UnitValue `json:"use_energy" PointId:"use_energy" PointAlias:"p83118" PointType:""`
ValidFlag int64 `json:"valid_flag"` ValidFlag int64 `json:"valid_flag" PointId:"valid_flag" PointType:""`
WgsLatitude float64 `json:"wgs_latitude"` WgsLatitude float64 `json:"wgs_latitude" PointId:"wgs_latitude" PointType:""`
WgsLongitude float64 `json:"wgs_longitude"` WgsLongitude float64 `json:"wgs_longitude" PointId:"wgs_longitude" PointType:""`
ZipCode string `json:"zip_code"` ZipCode string `json:"zip_code" PointId:"zip_code" PointType:""`
} `json:"pageList"` } `json:"pageList"`
RowCount int64 `json:"rowCount"` RowCount int64 `json:"rowCount"`
} }
@ -239,12 +238,12 @@ func (e *EndPoint) GetPsId() int64 {
return e.Response.ResultData.GetPsId() return e.Response.ResultData.GetPsId()
} }
func (e *EndPoint) GetData() api.Data { func (e *EndPoint) GetData() api.DataMap {
return e.Response.ResultData.GetData() return e.Response.ResultData.GetData()
} }
func (e *ResultData) GetData() api.Data { func (e *ResultData) GetData() api.DataMap {
var ret api.Data entries := api.NewDataMap()
for range Only.Once { for range Only.Once {
i := len(e.PageList) i := len(e.PageList)
@ -252,50 +251,51 @@ func (e *ResultData) GetData() api.Data {
break break
} }
now := api.NewDateTime(time.Now().Round(5 * time.Minute).Format(api.DtLayoutZeroSeconds)) // now := api.NewDateTime(time.Now().Round(5 * time.Minute).Format(api.DtLayoutZeroSeconds))
for _, p := range e.PageList { for _, p := range e.PageList {
psId := strconv.FormatInt(p.PsID, 10) // psId := strconv.FormatInt(p.PsID, 10)
entries.StructToPoints("", p)
ret.Entries = append(ret.Entries, add(now, psId, "p83077", "Pv Energy", p.PvEnergy, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"p83077"}, now, p.PvEnergy.Value)
ret.Entries = append(ret.Entries, add(now, psId, "p83089", "Es Discharge Energy", p.EsDisenergy, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"p83089"}, now, p.EsDisenergy.Value)
ret.Entries = append(ret.Entries, add(now, psId, "p83095", "Es Total Discharge Energy", p.EsTotalDisenergy, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"p83095"}, now, p.EsTotalDisenergy.Value)
ret.Entries = append(ret.Entries, add(now, psId, "p83118", "Use Energy", p.UseEnergy, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"p83118"}, now, p.UseEnergy.Value)
ret.Entries = append(ret.Entries, add(now, psId, "p83120", "Es Energy", p.EsEnergy, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"p83120"}, now, p.EsEnergy.Value)
ret.Entries = append(ret.Entries, add(now, psId, "p83127", "Es Total Energy", p.EsTotalEnergy, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"p83127"}, now, p.EsTotalEnergy.Value)
ret.Entries = append(ret.Entries, add(now, psId, "p83076", "Pv Power", p.PvPower, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"p83076"}, now, p.PvPower.Value)
ret.Entries = append(ret.Entries, add(now, psId, "p83081", "Es Power", p.EsPower, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"p83081"}, now, p.EsPower.Value)
//
ret.Entries = append(ret.Entries, add(now, psId, "co2_reduce", "Co2 Reduce", p.Co2Reduce, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"co2_reduce", Unit:p.Co2Reduce.Unit}, now, p.Co2Reduce.Value)
ret.Entries = append(ret.Entries, add(now, psId, "co2_reduce_total", "Co2 Reduce Total", p.Co2ReduceTotal, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"co2_reduce_total", Unit:p.Co2ReduceTotal.Unit}, now, p.Co2ReduceTotal.Value)
ret.Entries = append(ret.Entries, add(now, psId, "curr_power", "Curr Power", p.CurrPower, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"curr_power", Unit:p.CurrPower.Unit}, now, p.CurrPower.Value)
ret.Entries = append(ret.Entries, add(now, psId, "daily_irradiation", "Daily Irradiation", p.DailyIrradiation, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"daily_irradiation", Unit:p.DailyIrradiation.Unit}, now, p.DailyIrradiation.Value)
ret.Entries = append(ret.Entries, add(now, psId, "equivalent_hour", "Equivalent Hour", p.EquivalentHour, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"equivalent_hour", Unit:p.EquivalentHour.Unit}, now, p.EquivalentHour.Value)
ret.Entries = append(ret.Entries, add(now, psId, "installed_power_map", "Installed Power Map", p.InstalledPowerMap, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"installed_power_map", Unit:p.InstalledPowerMap.Unit}, now, p.InstalledPowerMap.Value)
ret.Entries = append(ret.Entries, add(now, psId, "radiation", "Radiation", p.Radiation, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"radiation", Unit:p.Radiation.Unit}, now, p.Radiation.Value)
ret.Entries = append(ret.Entries, add(now, psId, "today_energy", "Today Energy", p.TodayEnergy, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"today_energy", Unit:p.TodayEnergy.Unit}, now, p.TodayEnergy.Value)
ret.Entries = append(ret.Entries, add(now, psId, "today_income", "Today Income", p.TodayIncome, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"today_income", Unit:p.TodayIncome.Unit}, now, p.TodayIncome.Value)
ret.Entries = append(ret.Entries, add(now, psId, "total_capacity", "Total Capacity", p.TotalCapcity, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"total_capacity", Unit:p.TotalCapcity.Unit}, now, p.TotalCapcity.Value)
ret.Entries = append(ret.Entries, add(now, psId, "total_energy", "Total Energy", p.TotalEnergy, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"total_energy", Unit:p.TotalEnergy.Unit}, now, p.TotalEnergy.Value)
ret.Entries = append(ret.Entries, add(now, psId, "total_income", "Total Income", p.TotalIncome, len(ret.Entries))) // entries.AddEntry(api.Point{PsKey: "virtual", Id:"total_income", Unit:p.TotalIncome.Unit}, now, p.TotalIncome.Value)
//
ret.Entries = append(ret.Entries, addValue(now, psId, "build_date", "Build Date", p.BuildDate, len(ret.Entries))) // entries.AddString(now, psId, "build_date", "", p.BuildDate)
ret.Entries = append(ret.Entries, addIntValue(now, psId, "build_status", "Build Status", p.BuildStatus, len(ret.Entries))) // entries.AddInt(now, psId, "build_status", "", p.BuildStatus)
ret.Entries = append(ret.Entries, addFloatValue(now, psId, "latitude", "Latitude", p.Latitude, len(ret.Entries))) // entries.AddFloat(now, psId, "latitude", "", p.Latitude)
ret.Entries = append(ret.Entries, addFloatValue(now, psId, "longitude", "Longitude", p.Longitude, len(ret.Entries))) // entries.AddFloat(now, psId, "longitude", "", p.Longitude)
ret.Entries = append(ret.Entries, addValue(now, psId, "location", "Location", p.Location, len(ret.Entries))) // entries.AddString(now, psId, "location", "", p.Location)
//
ret.Entries = append(ret.Entries, addIntValue(now, psId, "installer_ps_fault_status", "Installer PS Fault Status", p.InstallerPsFaultStatus, len(ret.Entries))) // entries.AddInt(now, psId, "installer_ps_fault_status", "", p.InstallerPsFaultStatus)
ret.Entries = append(ret.Entries, addIntValue(now, psId, "owner_ps_fault_status", "Owner PS Fault Status", p.OwnerPsFaultStatus, len(ret.Entries))) // entries.AddInt(now, psId, "owner_ps_fault_status", "", p.OwnerPsFaultStatus)
ret.Entries = append(ret.Entries, addIntValue(now, psId, "ps_fault_status", "PS Fault Status", p.PsFaultStatus, len(ret.Entries))) // entries.AddInt(now, psId, "ps_fault_status", "", p.PsFaultStatus)
ret.Entries = append(ret.Entries, addValue(now, psId, "ps_health_status", "PS Health Status", p.PsHealthStatus, len(ret.Entries))) // entries.AddString(now, psId, "ps_health_status", "", p.PsHealthStatus)
//
ret.Entries = append(ret.Entries, addValue(now, psId, "ps_holder", "PS Holder", p.PsHolder, len(ret.Entries))) // entries.AddString(now, psId, "ps_holder", "", p.PsHolder)
ret.Entries = append(ret.Entries, addIntValue(now, psId, "ps_id", "PS Id", p.PsID, len(ret.Entries))) // entries.AddInt(now, psId, "ps_id", "", p.PsID)
ret.Entries = append(ret.Entries, addValue(now, psId, "ps_name", "PS Name", p.PsName, len(ret.Entries))) // entries.AddString(now, psId, "ps_name", "", p.PsName)
ret.Entries = append(ret.Entries, addValue(now, psId, "ps_short_name", "PS Short Name", p.PsShortName, len(ret.Entries))) // entries.AddString(now, psId, "ps_short_name", "", p.PsShortName)
ret.Entries = append(ret.Entries, addIntValue(now, psId, "ps_status", "PS Status", p.PsStatus, len(ret.Entries))) // entries.AddInt(now, psId, "ps_status", "", p.PsStatus)
ret.Entries = append(ret.Entries, addIntValue(now, psId, "ps_type", "PS Type", p.PsType, len(ret.Entries))) // entries.AddInt(now, psId, "ps_type", "", p.PsType)
// ret = append(ret, []string{now, "Pv Energy", p.PvEnergy.Value, p.PvEnergy.Unit}) // p83077 // ret = append(ret, []string{now, "Pv Energy", p.PvEnergy.Value, p.PvEnergy.Unit}) // p83077
// ret = append(ret, []string{now, "Es Discharge Energy", p.EsDisenergy.Value, p.EsDisenergy.Unit}) // p83089 // ret = append(ret, []string{now, "Es Discharge Energy", p.EsDisenergy.Value, p.EsDisenergy.Unit}) // p83089
@ -320,86 +320,111 @@ func (e *ResultData) GetData() api.Data {
// ret = append(ret, []string{now, "Total Income", p.TotalIncome.Value, p.TotalIncome.Unit}) // ret = append(ret, []string{now, "Total Income", p.TotalIncome.Value, p.TotalIncome.Unit})
} }
} }
return ret return entries
}
func addState(now api.DateTime, point string, name string, state bool, index int) api.DataEntry {
return add(now, "virtual", point, name, api.UnitValue{ Value: fmt.Sprintf("%v", state) }, index)
// return api.DataEntry {
// Date: now,
// PointId: api.NameDevicePoint("virtual", point),
// PointGroupName: "Virtual",
// PointName: name,
// Value: fmt.Sprintf("%v", state),
// Unit: "binary",
// ValueType: &api.Point{
// PsKey: "virtual",
// Id: point,
// Description: name,
// Unit: "binary",
// Type: "PointTypeInstant",
// },
// Index: index,
// }
}
func addValue(now api.DateTime, psId string, point string, name string, value string, index int) api.DataEntry {
return add(now, psId, point, name, api.UnitValue{ Value: value }, index)
// vt := api.GetPoint(psId, point)
// if !vt.Valid {
// vt = &api.Point{
// PsKey: psId,
// Id: point,
// Description: name,
// Unit: "",
// Type: "PointTypeInstant",
// }
// }
// return api.DataEntry {
// Date: now,
// PointId: api.NameDevicePoint(psId, point),
// PointGroupName: "Summary",
// PointName: name,
// Value: value,
// Unit: "",
// ValueType: vt,
// Index: index,
// }
}
func addIntValue(now api.DateTime, psId string, point string, name string, value int64, index int) api.DataEntry {
return add(now, psId, point, name, api.UnitValue{ Value: strconv.FormatInt(value, 10) }, index)
}
func addFloatValue(now api.DateTime, psId string, point string, name string, value float64, index int) api.DataEntry {
return add(now, psId, point, name, api.UnitValue{ Value: api.Float64ToString(value) }, index)
}
func add(now api.DateTime, psId string, point string, name string, value api.UnitValue, index int) api.DataEntry {
vt := api.GetPoint(psId, point)
if !vt.Valid {
vt = &api.Point{
PsKey: psId,
Id: point,
Description: name,
Unit: value.Unit,
Type: "PointTypeInstant",
}
}
return api.DataEntry {
Date: now,
PointId: api.NameDevicePoint(psId, point),
PointGroupName: "Virtual",
PointName: name,
Value: value.Value,
Unit: value.Unit,
ValueType: vt,
Index: index,
}
} }
// func add(now api.DateTime, psId string, pid string, name string, p api.UnitValue) api.DataEntry {
//
// vt := api.GetPoint(psId, pid)
// if !vt.Valid {
// vt = &api.Point {
// PsKey: psId,
// Id: pid,
// Description: name,
// Unit: p.Unit,
// Type: "PointTypeInstant",
// }
// }
// fv, _ := strconv.ParseFloat(p.Value, 64)
// return api.DataEntry {
// Date: now,
// PointId: api.NameDevicePoint(psId, pid),
// PointGroupName: "Virtual",
// PointName: name,
// Value: p.Value,
// ValueFloat: fv,
// Unit: p.Unit,
// ValueType: vt,
// Index: 0,
// }
// }
//
// func addState(now api.DateTime, point string, name string, state bool) api.DataEntry {
// return add(now, "virtual", point, name, api.UnitValue{ Value: fmt.Sprintf("%v", state) })
//
// // return api.DataEntry {
// // Date: now,
// // PointId: api.NameDevicePoint("virtual", point),
// // PointGroupName: "Virtual",
// // PointName: name,
// // Value: fmt.Sprintf("%v", state),
// // Unit: "binary",
// // ValueType: &api.Point{
// // PsKey: "virtual",
// // Id: point,
// // Description: name,
// // Unit: "binary",
// // Type: "PointTypeInstant",
// // },
// // Index: index,
// // }
// }
//
// func addValue(now api.DateTime, psId string, point string, name string, value string) api.DataEntry {
// return add(now, psId, point, name, api.UnitValue{ Value: value })
// // vt := api.GetPoint(psId, point)
// // if !vt.Valid {
// // vt = &api.Point{
// // PsKey: psId,
// // Id: point,
// // Description: name,
// // Unit: "",
// // Type: "PointTypeInstant",
// // }
// // }
// // return api.DataEntry {
// // Date: now,
// // PointId: api.NameDevicePoint(psId, point),
// // PointGroupName: "Summary",
// // PointName: name,
// // Value: value,
// // Unit: "",
// // ValueType: vt,
// // Index: index,
// // }
// }
//
// func addIntValue(now api.DateTime, psId string, point string, name string, value int64) api.DataEntry {
// return add(now, psId, point, name, api.UnitValue{ Value: strconv.FormatInt(value, 10) })
// }
//
// func addFloatValue(now api.DateTime, psId string, point string, name string, value float64) api.DataEntry {
// return add(now, psId, point, name, api.UnitValue{ Value: api.Float64ToString(value) })
// }
//
// func add2(now api.DateTime, psId string, point string, name string, value api.UnitValue) api.DataEntry {
// vt := api.GetPoint(psId, point)
// if !vt.Valid {
// vt = &api.Point{
// PsKey: psId,
// Id: point,
// Description: name,
// Unit: value.Unit,
// Type: "PointTypeInstant",
// }
// }
// return api.DataEntry {
// Date: now,
// PointId: api.NameDevicePoint(psId, point),
// PointGroupName: "Virtual",
// PointName: name,
// Value: value.Value,
// Unit: value.Unit,
// ValueType: vt,
// Index: 0,
// }
// }
//
// func (e *ResultData) GetData() [][]string { // func (e *ResultData) GetData() [][]string {
// var ret [][]string // var ret [][]string
// for range Only.Once { // for range Only.Once {

File diff suppressed because it is too large Load Diff

View File

@ -108,8 +108,8 @@ func (e *EndPoint) GetDataTable() output.Table {
return table return table
} }
func (e *EndPoint) GetData() api.Data { func (e *EndPoint) GetData() api.DataMap {
var ret api.Data var ret api.DataMap
// for range Only.Once { // for range Only.Once {
// index := 0 // index := 0

View File

@ -6,7 +6,9 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"github.com/davecgh/go-spew/spew"
"hash/fnv" "hash/fnv"
"runtime"
"strconv" "strconv"
// "github.com/google/uuid" // "github.com/google/uuid"
@ -211,25 +213,25 @@ func PrintHeader(i interface{}) string {
s := reflect.ValueOf(i) // .Elem() s := reflect.ValueOf(i) // .Elem()
typeOf := s.Type() typeOf := s.Type()
switch s.Kind().String() { switch s.Kind().String() {
case "string": case "string":
ret = fmt.Sprintf("%v", s) ret = fmt.Sprintf("%v", s)
default: default:
for id := 0; id < s.NumField(); id++ { for id := 0; id < s.NumField(); id++ {
// value := fmt.Sprintf("%v", s.Field(id).Interface()) // value := fmt.Sprintf("%v", s.Field(id).Interface())
// if value == "" { // if value == "" {
// continue // continue
// } // }
ret += fmt.Sprintf("%s (%s),", ret += fmt.Sprintf("%s (%s),",
typeOf.Field(id).Name, typeOf.Field(id).Name,
typeOf.Field(id).Tag.Get("json"), typeOf.Field(id).Tag.Get("json"),
) )
// fmt.Printf("%d: %s %s = %v\n", // fmt.Printf("%d: %s %s = %v\n",
// i, // i,
// typeOfT.Field(i).Name, // typeOfT.Field(i).Name,
// s.Field(i).Type(), // s.Field(i).Type(),
// s.Field(i).Interface(), // s.Field(i).Interface(),
// ) // )
} }
} }
return ret return ret
@ -599,6 +601,73 @@ func GetFingerprint(ref interface{}) string {
return ret return ret
} }
type DataStructureMap map[string]DataStructure
type DataStructure struct {
Json string
PointId string
PointType string
PointUnit string
PointDevice string
PointName string
}
func GetCallerPackage(skip int) string {
var ret string
if pc, _, _, ok := runtime.Caller(skip); ok {
funcName := runtime.FuncForPC(pc).Name()
slash := strings.LastIndexByte(funcName, '/')
if slash < 0 {
slash = 0
}
dot := strings.IndexByte(funcName, '.')
ret = funcName[slash+1:dot]
}
return ret
}
func GetTagPointType(ref interface{}) DataStructureMap {
ret := make(DataStructureMap)
for range Only.Once {
// required := GetOptionsRequired(ref)
vo := reflect.ValueOf(ref)
to := reflect.TypeOf(ref)
spew.Dump(&vo)
spew.Dump(&to)
// Iterate over all available fields and read the tag value
for i := 0; i < vo.NumField(); i++ {
fieldTo := to.Field(i)
spew.Dump(&fieldTo)
// j := fieldTo.Tag.Get("json")
// pid := fieldTo.Tag.Get("json")
name := fieldTo.Name
foo := DataStructure{
Json: fieldTo.Tag.Get("json"),
PointDevice: fieldTo.Tag.Get("PointDevice"),
PointId: fieldTo.Tag.Get("PointId"),
PointName: fieldTo.Tag.Get("PointName"),
PointUnit: fieldTo.Tag.Get("PointUnit"),
PointType: fieldTo.Tag.Get("PointType"),
}
ret[name] = foo
// fieldVo := vo.Field(i)
// value := fmt.Sprintf("%v", fieldVo.Interface())
// if value == "" {
// err = errors.New(fmt.Sprintf("option '%s' is empty", fieldTo.Name))
// break
// }
}
}
return ret
}
func hash(s string) uint32 { func hash(s string) uint32 {
h := fnv.New32a() h := fnv.New32a()
_, _ = h.Write([]byte(s)) _, _ = h.Write([]byte(s))

27
iSolarCloud/api/funcs.go Normal file
View File

@ -0,0 +1,27 @@
package api
import (
"strings"
)
func CleanString(s string) string {
// var ret string
var result strings.Builder
for i := 0; i < len(s); i++ {
b := s[i]
if ('a' <= b && b <= 'z') ||
('A' <= b && b <= 'Z') ||
('0' <= b && b <= '9') ||
(b == '-') ||
(b == '_') ||
(b == '.') ||
b == ' ' {
result.WriteByte(b)
}
}
// dupes := regexp.MustCompile(`\s+`)
// ret = dupes.ReplaceAllString(result.String(), )
return result.String()
}

View File

@ -24,6 +24,7 @@ type EndPoint struct {
api.EndPointStruct api.EndPointStruct
Request Request Request Request
Response Response Response Response
RawResponse []byte
} }
// Request - Holds the api.RequestCommon and user RequestData structures. See data.go for request fields. // Request - Holds the api.RequestCommon and user RequestData structures. See data.go for request fields.
@ -127,7 +128,8 @@ func (e EndPoint) Call() api.EndPoint {
// GetJsonData - Get the JSON representation of ResultData, either as condensed or "pretty". // GetJsonData - Get the JSON representation of ResultData, either as condensed or "pretty".
func (e EndPoint) GetJsonData(raw bool) output.Json { func (e EndPoint) GetJsonData(raw bool) output.Json {
if raw { if raw {
return output.Json(e.ApiRoot.Body) // return output.GetAsPrettyJson(string(e.RawResponse))
return output.Json(e.RawResponse)
} else { } else {
return output.GetAsPrettyJson(e.Response.ResultData) return output.GetAsPrettyJson(e.Response.ResultData)
} }
@ -247,6 +249,7 @@ func (e EndPoint) IsRequestValid() error {
// (Used by the web call method.) // (Used by the web call method.)
func (e EndPoint) SetResponse(ref []byte) api.EndPoint { func (e EndPoint) SetResponse(ref []byte) api.EndPoint {
for range Only.Once { for range Only.Once {
e.RawResponse = ref
e.Error = json.Unmarshal(ref, &e.Response) e.Error = json.Unmarshal(ref, &e.Response)
if e.Error != nil { if e.Error != nil {
break break

View File

@ -0,0 +1,798 @@
package api
import (
"GoSungrow/Only"
"GoSungrow/iSolarCloud/api/apiReflect"
"fmt"
"github.com/davecgh/go-spew/spew"
"reflect"
"strconv"
"time"
)
const (
PointTypeInstant = "instant"
PointTypeBoot = "boot"
PointTypeDaily = "daily"
PointTypeMonthly = "monthly"
PointTypeYearly = "yearly"
PointTypeTotal = "total"
)
type DataMap struct {
Entries map[string]DataEntry
Order []string
}
type DataEntry struct {
EndPoint string `json:"endpoint"`
Point *Point `json:"point"`
Date DateTime `json:"date"`
// Id string `json:"id"`
// GroupName string `json:"group_name"`
// Name string `json:"name"`
// Unit string `json:"unit"`
Value string `json:"value"`
ValueFloat float64 `json:"value_float"`
Index int `json:"index"`
}
func NewDataMap() DataMap {
return DataMap{ Entries: make(map[string]DataEntry)}
}
// func (dm *DataMap) Add(point string, entry DataEntry) {
// dm.Entries[point] = entry
// dm.Order = append(dm.Order, point)
// }
func (dm *DataMap) StructToPoints(endpoint string, ref interface{}) {
for range Only.Once {
if endpoint == "" {
endpoint = apiReflect.GetCallerPackage(2)
}
now := NewDateTime(time.Now().Round(5 * time.Minute).Format(DtLayoutZeroSeconds))
vo := reflect.ValueOf(ref)
to := reflect.TypeOf(ref)
// Iterate over all available fields and read the tag value
for i := 0; i < vo.NumField(); i++ {
fieldTo := to.Field(i)
valueTo := vo.Field(i).Interface()
spew.Dump(&fieldTo)
j := fieldTo.Tag.Get("json")
pid := fieldTo.Tag.Get("json")
if (j != "") && (pid == "") {
pid = j
} else if (pid != "") && (j == "") {
j = pid
}
name := fieldTo.Tag.Get("PointName")
if name == "" {
name = PointToName(pid)
}
device := fieldTo.Tag.Get("PointDevice")
if device == "" {
device = "virtual"
}
var ignore bool
if fieldTo.Tag.Get("PointIgnore") != "" {
ignore = true
}
fullName := JoinDevicePoint(device, pid)
unit := fieldTo.Tag.Get("PointUnit")
var uv UnitValue
if unit == "" {
bar := fieldTo.Type.Name()
fmt.Printf("bar:%v\n", bar)
fmt.Println("")
switch bar {
case "int":
uv.Unit = "integer"
uv.ValueInt = valueTo.(int64)
uv.Value = strconv.FormatInt(uv.ValueInt, 10)
case "int32":
uv.Unit = "integer"
uv.ValueInt = valueTo.(int64)
uv.Value = strconv.FormatInt(uv.ValueInt, 10)
case "int64":
uv.Unit = "integer"
uv.ValueInt = valueTo.(int64)
uv.Value = strconv.FormatInt(uv.ValueInt, 10)
case "float32":
uv.Unit = "float"
uv.ValueFloat = float64(valueTo.(float32))
uv.Value = Float64ToString(uv.ValueFloat)
case "float64":
uv.Unit = "float"
uv.ValueFloat = valueTo.(float64)
uv.Value = Float64ToString(uv.ValueFloat)
case "string":
uv.Unit = "string"
uv.Value = valueTo.(string)
case "UnitValue":
fallthrough
case "api.UnitValue":
uv = valueTo.(UnitValue)
uv = uv.UnitValueFix()
default:
ignore = true
}
}
if ignore {
continue
}
// foo := apiReflect.DataStructure {
// Json: j,
// PointDevice: device,
// PointId: pid,
// PointName: name,
// PointUnit: uv.Unit,
// PointType: fieldTo.Tag.Get("PointType"),
// }
// ret[fieldTo.Name] = foo
p := Point {
EndPoint: endpoint,
FullId: fullName,
PsKey: device,
Id: pid,
GroupName: "",
Name: name,
Unit: uv.Unit,
Type: fieldTo.Tag.Get("PointType"),
Valid: true,
}
dm.AddEntry(p, now, uv.Value)
alias := fieldTo.Tag.Get("PointAlias")
if alias != "" {
p.FullId = NameDevicePoint(device, alias)
p.Id = alias
dm.AddEntry(p, now, uv.Value)
}
// spew.Dump(&foo)
// fieldVo := vo.Field(i)
// value := fmt.Sprintf("%v", fieldVo.Interface())
// if value == "" {
// err = errors.New(fmt.Sprintf("option '%s' is empty", fieldTo.Name))
// break
// }
}
}
}
func (dm *DataMap) GetEntry(entry string) DataEntry {
ret := dm.Entries[entry]
return ret
}
func (dm *DataMap) CopyEntry(entry string) *DataEntry {
ret := dm.Entries[entry]
return &ret
// return &DataEntry {
// Date: DateTime{},
// Point: nil,
// Value: "",
// ValueFloat: 0,
// Index: 0,
// }
}
func (dm *DataMap) GetFloatValue(entry string) float64 {
return dm.Entries[entry].ValueFloat
}
func (dm *DataMap) LowerUpper(lower string, upper string) float64 {
l := dm.GetEntry(lower)
u := dm.GetEntry(upper)
if l.ValueFloat > 0 {
return 0 - l.ValueFloat
}
return u.ValueFloat
}
func (dm *DataMap) GetPercent(value string, max string) float64 {
v := dm.GetEntry(value)
m := dm.GetEntry(max)
return GetPercent(v.ValueFloat, m.ValueFloat)
}
func (dm *DataMap) GetValue(refname string) float64 {
v := dm.GetEntry(refname)
return v.ValueFloat
}
// func (dm *DataMap) FromRefAddState(refname string, psId string, point string, name string) {
// v := dm.GetEntry(refname)
// dm.Entries[point] = v.CreateState(psId, point, name)
// dm.Order = append(dm.Order, point)
// }
// func (dm *DataMap) AddVirtualValue(refname string, point string, name string, value float64) {
// v := dm.GetEntry(refname)
// dm.Entries[point] = v.CreateFloat(VirtualPsId, point, name, value)
// dm.Order = append(dm.Order, point)
// }
//
// func (ref *DataMap) AddUnitValue(refname string, point string, name string, value UnitValue) {
// v := ref.GetEntry(refname)
// ref.Entries[point] = v.FromRefAddFloat("virtual", point, name, value.Value)
// ref.Order = append(ref.Order, point)
// }
func (dm *DataMap) Add(point string, de DataEntry) {
for range Only.Once {
// point := de.ValueType.Id
de.Index = len(dm.Entries)
dm.Entries[point] = de
dm.Order = append(dm.Order, point)
if _, ok := Points[point]; ok {
break
}
Points[point] = *de.Point
}
}
func (dm *DataMap) AddEntry(point Point, date DateTime, value string) {
for range Only.Once {
unit := point.Unit // Save unit.
// Match to a previously defined point.
p := GetPoint(point.PsKey, point.Id)
if p == nil {
point = *p
}
if point.PsKey == "" {
point.PsKey = "virtual"
}
if point.Name == "" {
point.Name = PointToName(point.Id)
}
if point.FullId == "" {
point.FullId = JoinDevicePoint(point.PsKey, point.Id)
}
ref := CreateUnitValue(value, unit)
point.Unit = ref.Unit
point.Valid = true
// foo := Point {
// PsKey: psId,
// Id: "total_income",
// Unit: p.TotalIncome.Unit,
// Type: PointTypeTotal,
// }
//
// p := GetPoint(point.PsKey, point.Id)
// if p == nil {
// fmt.Printf("Found point already: %s.%s\n", p.PsKey, p.Id)
// fmt.Println("&point")
// spew.Dump(&point)
// fmt.Println("&p")
// spew.Dump(&p)
// // dm.Add(point.Id, CreateDataEntryUnitValue(date, point.PsKey, point.Id, point.Name, ref))
// // if p.Name == "" {
// // p.Name = PointToName(point.Id)
// // }
// // p = CreatePoint(psId, point, name, value.Unit)
// // break
// }
dm.Add(JoinDevicePoint(point.EndPoint, point.Id), DataEntry {
EndPoint: point.EndPoint,
Point: &point,
Date: date,
Value: ref.Value,
ValueFloat: ref.ValueFloat,
})
}
}
// func (dm *DataMap) AddPointAlias(refPoint Point, point Point) {
// for range Only.Once {
// p := GetPoint(refPoint.PsKey, refPoint.Id)
// if p != nil {
// fmt.Printf("Found point already: %s.%s\n", p.PsKey, p.Id)
// fmt.Println("&point")
// spew.Dump(&point)
// fmt.Println("&p")
// spew.Dump(&p)
// break
// }
//
// if p.PsKey == "" {
// p.PsKey = "virtual"
// }
// if p.Name == "" {
// p.Name = PointToName(point.Id)
// }
// if p.FullId == "" {
// p.FullId = JoinDevicePoint(point.PsKey, point.Id)
// }
// ref := CreateUnitValue(value, p.Unit)
// p.Unit = ref.Unit
// p.Valid = true
//
// dm.Add(point.Id, DataEntry {
// Date: date,
// Point: p,
// Value: ref.Value,
// ValueFloat: ref.ValueFloat,
// })
// }
// }
func (dm *DataMap) FromRefAddAlias2(refname string, psId string, point string, name string) {
de := dm.GetEntry(refname)
dm.Add(point, de.CreateAlias(psId, point, name))
}
func (dm *DataMap) AddEntryFromRef(refPoint Point, point Point, date DateTime, value string) {
for range Only.Once {
p := GetPoint(refPoint.PsKey, refPoint.Id)
if p != nil {
fmt.Printf("Found point already: %s.%s\n", p.PsKey, p.Id)
fmt.Println("&point")
spew.Dump(&point)
fmt.Println("&p")
spew.Dump(&p)
break
}
if point.PsKey == "" {
point.PsKey = "virtual"
}
if point.Name == "" {
point.Name = PointToName(point.Id)
}
if point.FullId == "" {
point.FullId = JoinDevicePoint(point.PsKey, point.Id)
}
ref := CreateUnitValue(value, point.Unit)
point.Unit = ref.Unit
point.Valid = true
dm.Add(point.Id, DataEntry {
Date: date,
Point: p,
Value: ref.Value,
ValueFloat: ref.ValueFloat,
})
}
}
func JoinDevicePoint(device string, point string) string {
var ret string
for range Only.Once {
if device == "" {
device = "virtual"
}
ret = device + "." + point
}
return ret
}
func (dm *DataMap) AddUnitValue(endpoint string, psId string, point string, name string, date DateTime, ref UnitValue) {
for range Only.Once {
if endpoint == "" {
endpoint = apiReflect.GetCallerPackage(2)
}
ref = ref.UnitValueFix()
p := GetPoint(psId, point)
if p == nil {
// No UV found. Create one.
dm.Add(point, CreateDataEntryUnitValue(date, psId, point, name, ref))
break
}
if p.Unit == "" {
p.Unit = ref.Unit
}
if p.Name == "" {
p.Name = name
}
if p.Name == "" {
p.Name = PointToName(point)
}
dm.Add(point, DataEntry {
Date: date,
Point: p,
Value: ref.Value,
ValueFloat: ref.ValueFloat,
})
}
}
func (dm *DataMap) AddFloat(psId string, point string, name string, date DateTime, value float64) {
for range Only.Once {
fvs := Float64ToString(value)
p := GetPoint(psId, point)
if p == nil {
// No UV found. Create one.
dm.Add(point, CreateDataEntryUnitValue(date, psId, point, name, CreateUnitValue(fvs, "float")))
break
}
ref := CreateUnitValue(fvs, p.Unit)
if ref.Unit != p.Unit {
fmt.Printf("OOOPS: Unit mismatch - %f %s != %f %s\n", value, p.Unit, ref.ValueFloat, ref.Unit)
p.Unit = ref.Unit
}
dm.Add(point, DataEntry {
Date: date,
Point: p,
Value: ref.Value,
ValueFloat: ref.ValueFloat,
})
}
de := CreateDataEntryUnitValue(date, psId, point, name, UnitValue {
Unit: "float",
Value: fmt.Sprintf("%f", value),
ValueFloat: 0,
})
dm.Add(point, de)
}
func (dm *DataMap) AddString(psId string, point string, name string, date DateTime, value string) {
dm.Add(point, CreateDataEntryString(date, psId, point, name, value))
}
func (dm *DataMap) AddInt(psId string, point string, name string, date DateTime, value int64) {
de := CreateDataEntryUnitValue(date, psId, point, name, UnitValue {
Unit: "int",
Value: fmt.Sprintf("%d", value),
ValueFloat: float64(value),
})
dm.Add(point, de)
}
// func (dm *DataMap) AddVirtualAliasFromRef(refname string, point string, name string) {
// de := dm.GetEntry(refname)
// dm.Add(point, de.CreateAlias("virtual", point, name))
// }
func (dm *DataMap) FromRefAddAlias(refname string, psId string, point string, name string) {
de := dm.GetEntry(refname)
dm.Add(point, de.CreateAlias(psId, point, name))
}
func (dm *DataMap) FromRefAddState(refname string, psId string, point string, name string) {
v := dm.GetEntry(refname)
dm.Add(point, v.CreateState(psId, point, name))
}
func (dm *DataMap) FromRefAddFloat(refname string, psId string, point string, name string, value float64) {
de := dm.GetEntry(refname)
dm.Add(point, de.CreateFloat(psId, point, name, value))
}
func (dm *DataMap) CopyPoint(refname string, psId string, point string, name string, value float64) {
de := dm.GetEntry(refname)
dm.Add(point, de.CreateFloat(psId, point, name, value))
}
func (de *DataEntry) CreateAlias(psId string, point string, name string) DataEntry {
if name == "" {
name = PointToName(point)
}
de.Point.FullId = NameDevicePoint(psId, point)
de.Point.PsKey = psId
de.Point.Id = point
de.Point.Name = name
de.Point.GroupName = psId
de.Point.Valid = true
de.Index = 0
return *de
}
func (de *DataEntry) CreateFloat(psId string, point string, name string, value float64) DataEntry {
if name == "" {
name = PointToName(point)
}
de2 := de.CreateAlias(psId, point, name)
uv := CreateUnitValue(Float64ToString(value), de2.Point.Unit)
de2.Value = uv.Value
de2.ValueFloat = uv.ValueFloat
return de2
// if name == "" {
// name = PointToName(point)
// }
//
// return DataEntry {
// Date: de.Date,
// Value: Float64ToString(v),
// ValueFloat: v,
// Point: &Point {
// FullId: NameDevicePoint(psId, point),
// GroupName: psId,
// PsKey: psId,
// Id: point,
// Name: name,
// Unit: u,
// Type: "",
// Valid: true,
// },
// Index: 0,
// }
}
func (de *DataEntry) CreateState(psId string, point string, name string) DataEntry {
if name == "" {
name = PointToName(point)
}
de2 := de.CreateAlias(psId, point, name)
de2.Value = fmt.Sprintf("%v", IsActive(de.ValueFloat))
de2.ValueFloat = 0
de2.Point.Unit = "binary"
return de2
// return DataEntry {
// Date: de.Date,
// Value: fmt.Sprintf("%v", IsActive(de.ValueFloat)),
// ValueFloat: 0,
// Point: &Point {
// FullId: NameDevicePoint(psId, point),
// PsKey: psId,
// Id: point,
// GroupName: psId,
// Name: name,
// Unit: "binary",
// Type: "",
// Valid: true,
// },
// Index: 0,
// }
}
func (de *DataEntry) UpdateMeta(date *DateTime, psId string, point string, name string) {
if date != nil {
de.Date = *date
}
if name == "" {
name = PointToName(point)
}
de.Point.FullId = NameDevicePoint(psId, point)
de.Point.PsKey = psId
de.Point.Id = point
de.Point.Name = name
de.Point.GroupName = psId
de.Index = 0
}
func CreateDataEntryActive(date DateTime, psId string, point string, name string, value float64) DataEntry {
p := GetPoint(psId, point)
if p == nil {
if name == "" {
name = PointToName(point)
}
p = CreatePoint(psId, point, name, "state")
}
return DataEntry {
Date: date,
Value: fmt.Sprintf("%v", IsActive(value)),
ValueFloat: 0,
Point: p,
Index: 0,
}
}
func CreateDataEntryString(date DateTime, psId string, point string, name string, value string) DataEntry {
p := GetPoint(psId, point)
if p == nil {
if name == "" {
name = PointToName(point)
}
p = CreatePoint(psId, point, name, "string")
}
return DataEntry {
Date: date,
Value: value,
ValueFloat: 0,
Point: p,
Index: 0,
}
}
func CreateDataEntryUnitValue(date DateTime, psId string, point string, name string, value UnitValue) DataEntry {
value = value.UnitValueFix()
p := GetPoint(psId, point)
if p == nil {
if name == "" {
name = PointToName(point)
}
p = CreatePoint(psId, point, name, value.Unit)
}
return DataEntry {
Date: date,
Value: value.Value,
ValueFloat: value.ValueFloat,
Point: p,
Index: 0,
}
}
func CreatePoint(psId string, point string, name string, unit string) *Point {
if name == "" {
name = PointToName(point)
}
return &Point {
FullId: NameDevicePoint(psId, point),
PsKey: psId,
Id: point,
GroupName: psId,
Name: name,
Unit: unit,
Type: "",
Valid: true,
}
}
func CreateUnitValue(value string, unit string) UnitValue {
ret := UnitValue {
Unit: unit,
Value: value,
}
return ret.UnitValueFix()
}
func (ref *UnitValue) UnitValueFix() UnitValue {
if ref.Unit == "W" {
fvs, err := DivideByThousand(ref.Value)
// fv, err := strconv.ParseFloat(p.Value, 64)
// fv = fv / 1000
if err == nil {
// p.Value = fmt.Sprintf("%.3f", fv)
ref.Value = fvs
ref.Unit = "kW"
}
}
if ref.Unit == "Wh" {
fvs, err := DivideByThousand(ref.Value)
// fv, err := strconv.ParseFloat(p.Value, 64)
// fv = fv / 1000
if err == nil {
// p.Value = fmt.Sprintf("%.3f", fv)
ref.Value = fvs
ref.Unit = "kWh"
}
}
ref.ValueFloat, _ = strconv.ParseFloat(ref.Value, 64)
return *ref
}
func (ref *UnitValue) UnitValueToPoint(psId string, point string, name string) *Point {
uv := ref.UnitValueFix()
// u := ref.Unit
//
// if ref.Unit == "W" {
// fvs, err := DivideByThousand(ref.Value)
// // fv, err := strconv.ParseFloat(p.Value, 64)
// // fv = fv / 1000
// if err == nil {
// // p.Value = fmt.Sprintf("%.3f", fv)
// ref.Value = fvs
// ref.Unit = "kW"
// }
// }
//
// if ref.Unit == "Wh" {
// fvs, err := DivideByThousand(ref.Value)
// // fv, err := strconv.ParseFloat(p.Value, 64)
// // fv = fv / 1000
// if err == nil {
// // p.Value = fmt.Sprintf("%.3f", fv)
// ref.Value = fvs
// ref.Unit = "kWh"
// }
// }
if name == "" {
name = PointToName(point)
}
vt := GetPoint(psId, point)
if !vt.Valid {
vt = &Point {
PsKey: psId,
Id: point,
Name: name,
Unit: uv.Unit,
Type: "PointTypeInstant",
Valid: true,
}
}
return vt
}
func IsActive(value float64) bool {
if (value > 0.01) || (value < -0.01) {
return true
}
return false
}
func GetPercent(value float64, max float64) float64 {
if max == 0 {
return 0
}
return (value / max) * 100
}
// // entries.AddVirtualValue("DailyTotalLoad", "DailyPvEnergyPercent", "daily_pv_energy_percent", "Daily PV Energy Percent", value)
// func NameToRefName(name string) string {
// var ret string // "Daily PV Energy Percent"
// ret = strings.ReplaceAll(name, " ", "_")
// ret = strings.ToLower(ret)
// return ret
// }
//
// func (upper *DataEntry) LowerUpper(lower DataEntry) float64 {
// if lower.ValueFloat > 0 {
// return 0 - lower.ValueFloat
// }
// return upper.ValueFloat
// }
//
// Type string
// Name string
// SubName string
//
// ParentId string
// ParentName string
//
// UniqueId string
// FullName string
// Units string
// ValueName string
// DeviceClass string
//
// Value string

View File

@ -11,7 +11,8 @@ import (
type EndPointName string type EndPointName string
type EndPointStruct struct { type EndPointStruct struct {
ApiRoot Web `json:"-"` ApiRoot Web `json:"-"`
RawResponse []byte
Area AreaName `json:"area"` Area AreaName `json:"area"`
Name EndPointName `json:"name"` Name EndPointName `json:"name"`
@ -102,6 +103,18 @@ func (ep EndPointStruct) String() string {
return ret return ret
} }
func (ep EndPointStruct) ResponseAsJson(raw bool, r interface{}) output.Json {
var ret output.Json
for range Only.Once {
if raw {
ret = output.GetAsPrettyJson(r)
break
}
ret = output.GetAsPrettyJson(r)
}
return ret
}
func MarshalJSON(endpoint EndPoint) ([]byte, error) { func MarshalJSON(endpoint EndPoint) ([]byte, error) {
e := endpoint.SetError("") e := endpoint.SetError("")
j, err := json.Marshal(&struct { j, err := json.Marshal(&struct {

View File

@ -8,23 +8,21 @@ import (
"time" "time"
) )
const ( const (
PointTypeInstant = "instant" VirtualPsId = "virtual"
PointTypeDaily = "daily"
PointTypeMonthly = "monthly"
PointTypeYearly = "yearly"
PointTypeTotal = "total"
) )
type Point struct { type Point struct {
PsKey string EndPoint string `json:"endpoint"`
Id string FullId string `json:"full_id"`
Description string PsKey string `json:"ps_key"`
Unit string Id string `json:"id"`
Type string GroupName string `json:"group_name"`
Valid bool Name string `json:"name"`
Unit string `json:"unit"`
Type string `json:"type"`
Valid bool `json:"valid"`
} }
type PointsMap map[string]Point type PointsMap map[string]Point
@ -40,6 +38,7 @@ func ResolvePoint(point string) *Point {
return Points.Resolve(point) return Points.Resolve(point)
} }
// p1 // p1
// p1001 // p1001
// p1002 // p1002
@ -100,148 +99,188 @@ func ResolvePoint(point string) *Point {
// Points Discovered points from the API // Points Discovered points from the API
var Points = PointsMap { var Points = PointsMap {
"p13001": { PsKey: "1129147_14_1_1", Id: "p13001", Description: "MPPT1 Voltage", Unit: "V", Type: PointTypeInstant }, // Added manually
// "p83022y": { PsKey: "virtual", Id: "p83022", Name: "", Unit: "kWh", Type: PointTypeInstant },
// "p83076": { PsKey: "virtual", Id: "p83076", Name: "Pv Power", Unit: "kWh", Type: PointTypeInstant },
// "p83077": { PsKey: "virtual", Id: "p83077", Name: "Pv Energy", Unit: "kWh", Type: PointTypeInstant },
// "p83081": { PsKey: "virtual", Id: "p83081", Name: "Es Power", Unit: "kWh", Type: PointTypeInstant },
// "p83089": { PsKey: "virtual", Id: "p83089", Name: "Es Discharge Energy", Unit: "kWh", Type: PointTypeInstant },
// "p83095": { PsKey: "virtual", Id: "p83095", Name: "Es Total Discharge Energy", Unit: "kWh", Type: PointTypeTotal },
// "p83118": { PsKey: "virtual", Id: "p83118", Name: "Use Energy", Unit: "kWh", Type: PointTypeInstant },
// "p83120": { PsKey: "virtual", Id: "p83120", Name: "Es Energy", Unit: "kWh", Type: PointTypeInstant },
// "p83127": { PsKey: "virtual", Id: "p83127", Name: "Es Total Energy", Unit: "kWh", Type: PointTypeTotal },
"p13012": { PsKey: "1129147_14_1_1", Id: "p13012", Description: "Total Reactive Power", Unit: "kvar", Type: PointTypeDaily }, // "co2_reduce": { PsKey: "virtual", Id: "co2_reduce", Name: "co2_reduce", Unit: "FOO", Type: PointTypeInstant },
// "co2_reduce_total": { PsKey: "virtual", Id: "co2_reduce_total", Name: "co2_reduce_total", Unit: "FOO", Type: PointTypeTotal },
// "curr_power": { PsKey: "virtual", Id: "curr_power", Name: "curr_power", Unit: "FOO", Type: PointTypeInstant },
// "daily_irradiation": { PsKey: "virtual", Id: "daily_irradiation", Name: "daily_irradiation", Unit: "FOO", Type: PointTypeDaily },
// "equivalent_hour": { PsKey: "virtual", Id: "equivalent_hour", Name: "equivalent_hour", Unit: "FOO", Type: PointTypeDaily },
// "installed_power_map": { PsKey: "virtual", Id: "installed_power_map", Name: "installed_power_map", Unit: "FOO", Type: PointTypeInstant },
// "radiation": { PsKey: "virtual", Id: "radiation", Name: "radiation", Unit: "FOO", Type: PointTypeInstant },
// "today_energy": { PsKey: "virtual", Id: "today_energy", Name: "today_energy", Unit: "FOO", Type: PointTypeDaily },
// "today_income": { PsKey: "virtual", Id: "today_income", Name: "today_income", Unit: "FOO", Type: PointTypeDaily },
// "total_capacity": { PsKey: "virtual", Id: "total_capacity", Name: "total_capacity", Unit: "FOO", Type: PointTypeTotal },
// "total_energy": { PsKey: "virtual", Id: "total_energy", Name: "total_energy", Unit: "FOO", Type: PointTypeTotal },
// "total_income": { PsKey: "virtual", Id: "total_income", Name: "total_income", Unit: "FOO", Type: PointTypeTotal },
// Added manually
"p13105": { PsKey: "1129147_14_1_1", Id: "p13105", Description: "MPPT2 Voltage", Unit: "V", Type: PointTypeInstant },
"p13122": { PsKey: "1129147_14_1_1", Id: "p13122", Description: "Daily Feed-in Energy", Unit: "kWh", Type: PointTypeDaily }, "p13001": { PsKey: "1129147_14_1_1", Id: "p13001", Name: "MPPT1 Voltage", Unit: "V", Type: PointTypeInstant },
"p13125": { PsKey: "1129147_14_1_1", Id: "p13125", Description: "Total Feed-in Energy", Unit: "kWh", Type: PointTypeTotal }, "p13012": { PsKey: "1129147_14_1_1", Id: "p13012", Name: "Total Reactive Power", Unit: "kvar", Type: PointTypeDaily },
"p13138": { PsKey: "1129147_14_1_1", Id: "p13138", Description: "Battery Voltage", Unit: "V", Type: PointTypeInstant }, "p13105": { PsKey: "1129147_14_1_1", Id: "p13105", Name: "MPPT2 Voltage", Unit: "V", Type: PointTypeInstant },
"p13144": { PsKey: "1129147_14_1_1", Id: "p13144", Description: "Daily Self-consumption Rate", Unit: "%", Type: PointTypeDaily }, "p13122": { PsKey: "1129147_14_1_1", Id: "p13122", Name: "Daily Feed-in Energy", Unit: "kWh", Type: PointTypeDaily },
"p13157": { PsKey: "1129147_14_1_1", Id: "p13157", Description: "Phase A Voltage", Unit: "V", Type: PointTypeInstant }, "p13125": { PsKey: "1129147_14_1_1", Id: "p13125", Name: "Total Feed-in Energy", Unit: "kWh", Type: PointTypeTotal },
"p13158": { PsKey: "1129147_14_1_1", Id: "p13158", Description: "Phase B Voltage", Unit: "V", Type: PointTypeInstant }, "p13138": { PsKey: "1129147_14_1_1", Id: "p13138", Name: "Battery Voltage", Unit: "V", Type: PointTypeInstant },
"p13159": { PsKey: "1129147_14_1_1", Id: "p13159", Description: "Phase C Voltage", Unit: "V", Type: PointTypeInstant }, "p13144": { PsKey: "1129147_14_1_1", Id: "p13144", Name: "Daily Self-consumption Rate", Unit: "%", Type: PointTypeDaily },
"p13161": { PsKey: "1129147_14_1_1", Id: "p13161", Description: "Bus Voltage", Unit: "V", Type: PointTypeInstant }, "p13157": { PsKey: "1129147_14_1_1", Id: "p13157", Name: "Phase A Voltage", Unit: "V", Type: PointTypeInstant },
"p13173": { PsKey: "1129147_14_1_1", Id: "p13173", Description: "Daily Feed-in Energy (PV)", Unit: "kWh", Type: PointTypeDaily },
"p13175": { PsKey: "1129147_14_1_1", Id: "p13175", Description: "Total Feed-in Energy (PV)", Unit: "kWh", Type: PointTypeTotal },
"p13002": { PsKey: "1129147_14_1_1", Id: "p13002", Description: "MPPT1 Current", Unit: "A", Type: PointTypeInstant },
"p13003": { PsKey: "1129147_14_1_1", Id: "p13003", Description: "Total DC Power", Unit: "kW" },
"p13007": { PsKey: "1129147_14_1_1", Id: "p13007", Description: "Grid Frequency", Unit: "Hz", Type: PointTypeInstant },
"p13008": { PsKey: "1129147_14_1_1", Id: "p13008", Description: "Phase A Current", Unit: "A", Type: PointTypeInstant },
"p13009": { PsKey: "1129147_14_1_1", Id: "p13009", Description: "Phase B Current", Unit: "A", Type: PointTypeInstant },
"p13010": { PsKey: "1129147_14_1_1", Id: "p13010", Description: "Phase C Current", Unit: "A", Type: PointTypeInstant },
"p13011": { PsKey: "1129147_14_1_1", Id: "p13011", Description: "Total Active Power", Unit: "kW" },
"p13013": { PsKey: "1129147_14_1_1", Id: "p13013", Description: "Total Power Factor", Unit: "" },
"p13018": { PsKey: "1129147_14_1_1", Id: "p13018", Description: "Total Apparent Power", Unit: "VA" },
"p13019": { PsKey: "1129147_14_1_1", Id: "p13019", Description: "Internal Air Temperature", Unit: "℃", Type: PointTypeInstant },
"p13028": { PsKey: "1129147_14_1_1", Id: "p13028", Description: "Daily Battery Charging Energy", Unit: "kWh", Type: PointTypeDaily },
"p13029": { PsKey: "1129147_14_1_1", Id: "p13029", Description: "Daily Battery Discharging Energy", Unit: "kWh", Type: PointTypeDaily },
"p13034": { PsKey: "1129147_14_1_1", Id: "p13034", Description: "Total Battery Charging Energy", Unit: "kWh" , Type: PointTypeTotal },
"p13035": { PsKey: "1129147_14_1_1", Id: "p13035", Description: "Total Battery Discharging Energy", Unit: "kWh" , Type: PointTypeTotal },
"p13106": { PsKey: "1129147_14_1_1", Id: "p13106", Description: "MPPT2 Current", Unit: "A", Type: PointTypeInstant },
"p13112": { PsKey: "1129147_14_1_1", Id: "p13112", Description: "Daily PV Yield", Unit: "kWh", Type: PointTypeDaily },
"p13116": { PsKey: "1129147_14_1_1", Id: "p13116", Description: "Daily Load Energy Consumption from PV", Unit: "kWh", Type: PointTypeDaily },
"p13119": { PsKey: "1129147_14_1_1", Id: "p13119", Description: "Total Load Active Power", Unit: "kW" },
"p13121": { PsKey: "1129147_14_1_1", Id: "p13121", Description: "Total Export Active Power", Unit: "kW" },
"p13126": { PsKey: "1129147_14_1_1", Id: "p13126", Description: "Battery Charging Power", Unit: "kW" },
"p13130": { PsKey: "1129147_14_1_1", Id: "p13130", Description: "Total Load Energy Consumption", Unit: "kWh" , Type: PointTypeTotal },
"p13134": { PsKey: "1129147_14_1_1", Id: "p13134", Description: "Total PV Yield", Unit: "kWh" , Type: PointTypeTotal },
"p13137": { PsKey: "1129147_14_1_1", Id: "p13137", Description: "Total Load Energy Consumption from PV", Unit: "kWh" , Type: PointTypeTotal },
"p13139": { PsKey: "1129147_14_1_1", Id: "p13139", Description: "Battery Current", Unit: "A", Type: PointTypeInstant },
"p13140": { PsKey: "1129147_14_1_1", Id: "p13140", Description: "Battery Capacity(kWh)", Unit: "kWh" },
"p13141": { PsKey: "1129147_14_1_1", Id: "p13141", Description: "Battery Level (SOC)", Unit: "%", Type: PointTypeInstant },
"p13142": { PsKey: "1129147_14_1_1", Id: "p13142", Description: "Battery Health (SOH)", Unit: "%", Type: PointTypeInstant },
"p13143": { PsKey: "1129147_14_1_1", Id: "p13143", Description: "Battery Temperature", Unit: "℃", Type: PointTypeInstant },
"p13147": { PsKey: "1129147_14_1_1", Id: "p13147", Description: "Daily Purchased Energy", Unit: "kWh", Type: PointTypeDaily },
"p13148": { PsKey: "1129147_14_1_1", Id: "p13148", Description: "Total Purchased Energy", Unit: "kWh", Type: PointTypeTotal },
"p13149": { PsKey: "1129147_14_1_1", Id: "p13149", Description: "Purchased Power", Unit: "kW" },
"p13150": { PsKey: "1129147_14_1_1", Id: "p13150", Description: "Battery Discharging Power", Unit: "kW" },
"p13160": { PsKey: "1129147_14_1_1", Id: "p13160", Description: "Array Insulation Resistance", Unit: "kΩ", Type: PointTypeInstant },
"p13162": { PsKey: "1129147_14_1_1", Id: "p13162", Description: "Max. Charging Current (BMS)", Unit: "A", Type: PointTypeInstant },
"p13163": { PsKey: "1129147_14_1_1", Id: "p13163", Description: "Max. Discharging Current (BMS)", Unit: "A", Type: PointTypeInstant },
"p13174": { PsKey: "1129147_14_1_1", Id: "p13174", Description: "Daily Battery Charging Energy from PV", Unit: "kWh", Type: PointTypeDaily },
"p13176": { PsKey: "1129147_14_1_1", Id: "p13176", Description: "Total Battery Charging Energy from PV", Unit: "kWh", Type: PointTypeTotal },
"p13199": { PsKey: "1129147_14_1_1", Id: "p13199", Description: "Daily Load Energy Consumption", Unit: "kWh", Type: PointTypeDaily },
"p18062": { PsKey: "1129147_14_1_1", Id: "p18062", Description: "Phase A Backup Current", Unit: "A", Type: PointTypeInstant },
"p18063": { PsKey: "1129147_14_1_1", Id: "p18063", Description: "Phase B Backup Current", Unit: "A", Type: PointTypeInstant },
"p18064": { PsKey: "1129147_14_1_1", Id: "p18064", Description: "Phase C Backup Current", Unit: "A", Type: PointTypeInstant },
"p18065": { PsKey: "1129147_14_1_1", Id: "p18065", Description: "Phase A Backup Power", Unit: "kW" },
"p18066": { PsKey: "1129147_14_1_1", Id: "p18066", Description: "Phase B Backup Power", Unit: "kW" },
"p18067": { PsKey: "1129147_14_1_1", Id: "p18067", Description: "Phase C Backup Power", Unit: "kW" },
"p18068": { PsKey: "1129147_14_1_1", Id: "p18068", Description: "Total Backup Power", Unit: "kW" },
"p83001": { PsKey: "1129147_11_0_0", Id: "p83001", Description: "Inverter AC Power Normalization", Unit: "kW/kWp" },
"p83002": { PsKey: "1129147_11_0_0", Id: "p83002", Description: "Inverter AC Power", Unit: "kW" },
"p83004": { PsKey: "1129147_11_0_0", Id: "p83004", Description: "Inverter Total Yield", Unit: "kWh" },
"p83005": { PsKey: "1129147_11_0_0", Id: "p83005", Description: "Daily Equivalent Hours of Meter", Unit: "h", Type: PointTypeDaily },
"p83006": { PsKey: "1129147_11_0_0", Id: "p83006", Description: "Meter Daily Yield", Unit: "kWh" },
"p83007": { PsKey: "1129147_11_0_0", Id: "p83007", Description: "Meter PR", Unit: "%", Type: PointTypeInstant },
"p83008": { PsKey: "1129147_11_0_0", Id: "p83008", Description: "Daily Equivalent Hours of Inverter", Unit: "h", Type: PointTypeDaily },
"p83009": { PsKey: "1129147_11_0_0", Id: "p83009", Description: "Daily Yield by Inverter", Unit: "kWh", Type: PointTypeDaily },
"p83010": { PsKey: "1129147_11_0_0", Id: "p83010", Description: "Inverter PR", Unit: "%", Type: PointTypeInstant },
"p83013": { PsKey: "1129147_11_0_0", Id: "p83013", Description: "Daily Irradiation", Unit: "Wh/m2" },
"p83016": { PsKey: "1129147_11_0_0", Id: "p83016", Description: "Plant Ambient Temperature", Unit: "℃", Type: PointTypeInstant },
"p83017": { PsKey: "1129147_11_0_0", Id: "p83017", Description: "Plant Module Temperature", Unit: "℃", Type: PointTypeInstant },
"p83018": { PsKey: "1129147_11_0_0", Id: "p83018", Description: "Daily Yield (Theoretical)", Unit: "kWh", Type: PointTypeDaily },
"p83019": { PsKey: "1129147_11_0_0", Id: "p83019", Description: "Power/Installed Power of Plant", Unit: "%", Type: PointTypeInstant },
"p83020": { PsKey: "1129147_11_0_0", Id: "p83020", Description: "Meter Total Yield", Unit: "kWh" },
"p83021": { PsKey: "1129147_11_0_0", Id: "p83021", Description: "Accumulative Power Consumption by Meter", Unit: "kWh" },
"p83022": { PsKey: "1129147_11_0_0", Id: "p83022", Description: "Daily Yield of Plant", Unit: "kWh", Type: PointTypeDaily },
"p83023": { PsKey: "1129147_11_0_0", Id: "p83023", Description: "Plant PR", Unit: "%", Type: PointTypeInstant },
"p83024": { PsKey: "1129147_11_0_0", Id: "p83024", Description: "Plant Total Yield", Unit: "kWh" },
"p83025": { PsKey: "1129147_11_0_0", Id: "p83025", Description: "Plant Equivalent Hours", Unit: "h" },
"p83032": { PsKey: "1129147_11_0_0", Id: "p83032", Description: "Meter AC Power", Unit: "kW" },
"p83033": { PsKey: "1129147_11_0_0", Id: "p83033", Description: "Plant Power", Unit: "kW" },
"p83097": { PsKey: "1129147_11_0_0", Id: "p83097", Description: "Daily Load Energy Consumption from PV", Unit: "kWh", Type: PointTypeDaily },
"p83100": { PsKey: "1129147_11_0_0", Id: "p83100", Description: "Total Load Energy Consumption from PV", Unit: "kWh" },
"p83102": { PsKey: "1129147_11_0_0", Id: "p83102", Description: "Daily Purchased Energy", Unit: "kWh", Type: PointTypeDaily },
"p83105": { PsKey: "1129147_11_0_0", Id: "p83105", Description: "Total Purchased Energy", Unit: "kWh" },
"p83106": { PsKey: "1129147_11_0_0", Id: "p83106", Description: "Load Power", Unit: "kW" },
"p83124": { PsKey: "1129147_11_0_0", Id: "p83124", Description: "Total Load Energy Consumption", Unit: "MWh" },
"p83128": { PsKey: "1129147_11_0_0", Id: "p83128", Description: "Total Active Power of Optical Storage", Unit: "kW" },
"p83129": { PsKey: "1129147_11_0_0", Id: "p83129", Description: "Battery SOC", Unit: "%", Type: PointTypeInstant },
"p83233": { PsKey: "1129147_11_0_0", Id: "p83233", Description: "Total field maximum rechargeable power", Unit: "MW" },
"p83234": { PsKey: "1129147_11_0_0", Id: "p83234", Description: "Total field maximum dischargeable power", Unit: "MW" },
"p83235": { PsKey: "1129147_11_0_0", Id: "p83235", Description: "Total field chargeable energy", Unit: "MWh" },
"p83236": { PsKey: "1129147_11_0_0", Id: "p83236", Description: "Total field dischargeable energy", Unit: "MWh" },
"p83237": { PsKey: "1129147_11_0_0", Id: "p83237", Description: "Total field energy storage maximum reactive power", Unit: "MW" },
"p83238": { PsKey: "1129147_11_0_0", Id: "p83238", Description: "Total field energy storage active power", Unit: "MW" },
"p83239": { PsKey: "1129147_11_0_0", Id: "p83239", Description: "Total field reactive power", Unit: "Mvar" },
"p83241": { PsKey: "1129147_11_0_0", Id: "p83241", Description: "Total field charge capacity", Unit: "MWh" },
"p83242": { PsKey: "1129147_11_0_0", Id: "p83242", Description: "Total field discharge capacity", Unit: "MWh" },
"p83243": { PsKey: "1129147_11_0_0", Id: "p83243", Description: "Total field daily charge capacity", Unit: "MWh" },
"p83244": { PsKey: "1129147_11_0_0", Id: "p83244", Description: "Total field daily discharge capacity", Unit: "MWh" },
"p83252": { PsKey: "1129147_11_0_0", Id: "p83252", Description: "Battery Level (SOC)", Unit: "%", Type: PointTypeInstant },
"p83419": { PsKey: "1129147_11_0_0", Id: "p83419", Description: "Daily Highest Inverter Power/Inverter Installed Capacity", Unit: "%" },
"p83420": { PsKey: "1129147_11_0_0", Id: "p83420", Description: "Current Power/Inverter Installed Capacity", Unit: "%", Type: PointTypeInstant },
"p83549": { PsKey: "1129147_11_0_0", Id: "p83549", Description: "Grid active power", Unit: "kW" },
"p23014": { PsKey: "1129147_22_247_1", Id: "p23014", Description: "WLAN Signal Strength", Unit: "" }, "p13158": { PsKey: "1129147_14_1_1", Id: "p13158", Name: "Phase B Voltage", Unit: "V", Type: PointTypeInstant },
"p13159": { PsKey: "1129147_14_1_1", Id: "p13159", Name: "Phase C Voltage", Unit: "V", Type: PointTypeInstant },
"p13161": { PsKey: "1129147_14_1_1", Id: "p13161", Name: "Bus Voltage", Unit: "V", Type: PointTypeInstant },
"p13173": { PsKey: "1129147_14_1_1", Id: "p13173", Name: "Daily Feed-in Energy (PV)", Unit: "kWh", Type: PointTypeDaily },
"p13175": { PsKey: "1129147_14_1_1", Id: "p13175", Name: "Total Feed-in Energy (PV)", Unit: "kWh", Type: PointTypeTotal },
"p13002": { PsKey: "1129147_14_1_1", Id: "p13002", Name: "MPPT1 Current", Unit: "A", Type: PointTypeInstant },
"p13003": { PsKey: "1129147_14_1_1", Id: "p13003", Name: "Total DC Power", Unit: "kW" },
"p13007": { PsKey: "1129147_14_1_1", Id: "p13007", Name: "Grid Frequency", Unit: "Hz", Type: PointTypeInstant },
"p13008": { PsKey: "1129147_14_1_1", Id: "p13008", Name: "Phase A Current", Unit: "A", Type: PointTypeInstant },
"p13009": { PsKey: "1129147_14_1_1", Id: "p13009", Name: "Phase B Current", Unit: "A", Type: PointTypeInstant },
"p13010": { PsKey: "1129147_14_1_1", Id: "p13010", Name: "Phase C Current", Unit: "A", Type: PointTypeInstant },
"p13011": { PsKey: "1129147_14_1_1", Id: "p13011", Name: "Total Active Power", Unit: "kW" },
"p13013": { PsKey: "1129147_14_1_1", Id: "p13013", Name: "Total Power Factor", Unit: "" },
"p13018": { PsKey: "1129147_14_1_1", Id: "p13018", Name: "Total Apparent Power", Unit: "VA" },
"p13019": { PsKey: "1129147_14_1_1", Id: "p13019", Name: "Internal Air Temperature", Unit: "℃", Type: PointTypeInstant },
"p13028": { PsKey: "1129147_14_1_1", Id: "p13028", Name: "Daily Battery Charging Energy", Unit: "kWh", Type: PointTypeDaily },
"p13029": { PsKey: "1129147_14_1_1", Id: "p13029", Name: "Daily Battery Discharging Energy", Unit: "kWh", Type: PointTypeDaily },
"p13034": { PsKey: "1129147_14_1_1", Id: "p13034", Name: "Total Battery Charging Energy", Unit: "kWh" , Type: PointTypeTotal },
"p13035": { PsKey: "1129147_14_1_1", Id: "p13035", Name: "Total Battery Discharging Energy", Unit: "kWh" , Type: PointTypeTotal },
"p13106": { PsKey: "1129147_14_1_1", Id: "p13106", Name: "MPPT2 Current", Unit: "A", Type: PointTypeInstant },
"p13112": { PsKey: "1129147_14_1_1", Id: "p13112", Name: "Daily PV Yield", Unit: "kWh", Type: PointTypeDaily },
"p13116": { PsKey: "1129147_14_1_1", Id: "p13116", Name: "Daily Load Energy Consumption from PV", Unit: "kWh", Type: PointTypeDaily },
"p13119": { PsKey: "1129147_14_1_1", Id: "p13119", Name: "Total Load Active Power", Unit: "kW" },
"p13121": { PsKey: "1129147_14_1_1", Id: "p13121", Name: "Total Export Active Power", Unit: "kW" },
"p13126": { PsKey: "1129147_14_1_1", Id: "p13126", Name: "Battery Charging Power", Unit: "kW" },
"p13130": { PsKey: "1129147_14_1_1", Id: "p13130", Name: "Total Load Energy Consumption", Unit: "kWh" , Type: PointTypeTotal },
"p13134": { PsKey: "1129147_14_1_1", Id: "p13134", Name: "Total PV Yield", Unit: "kWh" , Type: PointTypeTotal },
"p13137": { PsKey: "1129147_14_1_1", Id: "p13137", Name: "Total Load Energy Consumption from PV", Unit: "kWh" , Type: PointTypeTotal },
"p13139": { PsKey: "1129147_14_1_1", Id: "p13139", Name: "Battery Current", Unit: "A", Type: PointTypeInstant },
"p13140": { PsKey: "1129147_14_1_1", Id: "p13140", Name: "Battery Capacity(kWh)", Unit: "kWh" },
"p13141": { PsKey: "1129147_14_1_1", Id: "p13141", Name: "Battery Level (SOC)", Unit: "%", Type: PointTypeInstant },
"p13142": { PsKey: "1129147_14_1_1", Id: "p13142", Name: "Battery Health (SOH)", Unit: "%", Type: PointTypeInstant },
"p13143": { PsKey: "1129147_14_1_1", Id: "p13143", Name: "Battery Temperature", Unit: "℃", Type: PointTypeInstant },
"p13147": { PsKey: "1129147_14_1_1", Id: "p13147", Name: "Daily Purchased Energy", Unit: "kWh", Type: PointTypeDaily },
"p13148": { PsKey: "1129147_14_1_1", Id: "p13148", Name: "Total Purchased Energy", Unit: "kWh", Type: PointTypeTotal },
"p13149": { PsKey: "1129147_14_1_1", Id: "p13149", Name: "Purchased Power", Unit: "kW" },
"p13150": { PsKey: "1129147_14_1_1", Id: "p13150", Name: "Battery Discharging Power", Unit: "kW" },
"p13160": { PsKey: "1129147_14_1_1", Id: "p13160", Name: "Array Insulation Resistance", Unit: "kΩ", Type: PointTypeInstant },
"p13162": { PsKey: "1129147_14_1_1", Id: "p13162", Name: "Max. Charging Current (BMS)", Unit: "A", Type: PointTypeInstant },
"p13163": { PsKey: "1129147_14_1_1", Id: "p13163", Name: "Max. Discharging Current (BMS)", Unit: "A", Type: PointTypeInstant },
"p13174": { PsKey: "1129147_14_1_1", Id: "p13174", Name: "Daily Battery Charging Energy from PV", Unit: "kWh", Type: PointTypeDaily },
"p13176": { PsKey: "1129147_14_1_1", Id: "p13176", Name: "Total Battery Charging Energy from PV", Unit: "kWh", Type: PointTypeTotal },
"p13199": { PsKey: "1129147_14_1_1", Id: "p13199", Name: "Daily Load Energy Consumption", Unit: "kWh", Type: PointTypeDaily },
"p18062": { PsKey: "1129147_14_1_1", Id: "p18062", Name: "Phase A Backup Current", Unit: "A", Type: PointTypeInstant },
"p18063": { PsKey: "1129147_14_1_1", Id: "p18063", Name: "Phase B Backup Current", Unit: "A", Type: PointTypeInstant },
"p18064": { PsKey: "1129147_14_1_1", Id: "p18064", Name: "Phase C Backup Current", Unit: "A", Type: PointTypeInstant },
"p18065": { PsKey: "1129147_14_1_1", Id: "p18065", Name: "Phase A Backup Power", Unit: "kW" },
"p18066": { PsKey: "1129147_14_1_1", Id: "p18066", Name: "Phase B Backup Power", Unit: "kW" },
"p18067": { PsKey: "1129147_14_1_1", Id: "p18067", Name: "Phase C Backup Power", Unit: "kW" },
"p18068": { PsKey: "1129147_14_1_1", Id: "p18068", Name: "Total Backup Power", Unit: "kW" },
"p83001": { PsKey: "1129147_11_0_0", Id: "p83001", Name: "Inverter AC Power Normalization", Unit: "kW/kWp" },
"p83002": { PsKey: "1129147_11_0_0", Id: "p83002", Name: "Inverter AC Power", Unit: "kW" },
"p83004": { PsKey: "1129147_11_0_0", Id: "p83004", Name: "Inverter Total Yield", Unit: "kWh" },
"p83005": { PsKey: "1129147_11_0_0", Id: "p83005", Name: "Daily Equivalent Hours of Meter", Unit: "h", Type: PointTypeDaily },
"p83006": { PsKey: "1129147_11_0_0", Id: "p83006", Name: "Meter Daily Yield", Unit: "kWh" },
"p83007": { PsKey: "1129147_11_0_0", Id: "p83007", Name: "Meter PR", Unit: "%", Type: PointTypeInstant },
"p83008": { PsKey: "1129147_11_0_0", Id: "p83008", Name: "Daily Equivalent Hours of Inverter", Unit: "h", Type: PointTypeDaily },
"p83009": { PsKey: "1129147_11_0_0", Id: "p83009", Name: "Daily Yield by Inverter", Unit: "kWh", Type: PointTypeDaily },
"p83010": { PsKey: "1129147_11_0_0", Id: "p83010", Name: "Inverter PR", Unit: "%", Type: PointTypeInstant },
"p83013": { PsKey: "1129147_11_0_0", Id: "p83013", Name: "Daily Irradiation", Unit: "Wh/m2" },
"p83016": { PsKey: "1129147_11_0_0", Id: "p83016", Name: "Plant Ambient Temperature", Unit: "℃", Type: PointTypeInstant },
"p83017": { PsKey: "1129147_11_0_0", Id: "p83017", Name: "Plant Module Temperature", Unit: "℃", Type: PointTypeInstant },
"p83018": { PsKey: "1129147_11_0_0", Id: "p83018", Name: "Daily Yield (Theoretical)", Unit: "kWh", Type: PointTypeDaily },
"p83019": { PsKey: "1129147_11_0_0", Id: "p83019", Name: "Power/Installed Power of Plant", Unit: "%", Type: PointTypeInstant },
"p83020": { PsKey: "1129147_11_0_0", Id: "p83020", Name: "Meter Total Yield", Unit: "kWh" },
"p83021": { PsKey: "1129147_11_0_0", Id: "p83021", Name: "Accumulative Power Consumption by Meter", Unit: "kWh" },
"p83022": { PsKey: "1129147_11_0_0", Id: "p83022", Name: "Daily Yield of Plant", Unit: "kWh", Type: PointTypeDaily },
"p83023": { PsKey: "1129147_11_0_0", Id: "p83023", Name: "Plant PR", Unit: "%", Type: PointTypeInstant },
"p83024": { PsKey: "1129147_11_0_0", Id: "p83024", Name: "Plant Total Yield", Unit: "kWh" },
"p83025": { PsKey: "1129147_11_0_0", Id: "p83025", Name: "Plant Equivalent Hours", Unit: "h" },
"p83032": { PsKey: "1129147_11_0_0", Id: "p83032", Name: "Meter AC Power", Unit: "kW" },
"p83033": { PsKey: "1129147_11_0_0", Id: "p83033", Name: "Plant Power", Unit: "kW" },
"p83097": { PsKey: "1129147_11_0_0", Id: "p83097", Name: "Daily Load Energy Consumption from PV", Unit: "kWh", Type: PointTypeDaily },
"p83100": { PsKey: "1129147_11_0_0", Id: "p83100", Name: "Total Load Energy Consumption from PV", Unit: "kWh" },
"p83102": { PsKey: "1129147_11_0_0", Id: "p83102", Name: "Daily Purchased Energy", Unit: "kWh", Type: PointTypeDaily },
"p83105": { PsKey: "1129147_11_0_0", Id: "p83105", Name: "Total Purchased Energy", Unit: "kWh" },
"p83106": { PsKey: "1129147_11_0_0", Id: "p83106", Name: "Load Power", Unit: "kW" },
"p83124": { PsKey: "1129147_11_0_0", Id: "p83124", Name: "Total Load Energy Consumption", Unit: "MWh" },
"p83128": { PsKey: "1129147_11_0_0", Id: "p83128", Name: "Total Active Power of Optical Storage", Unit: "kW" },
"p83129": { PsKey: "1129147_11_0_0", Id: "p83129", Name: "Battery SOC", Unit: "%", Type: PointTypeInstant },
"p83233": { PsKey: "1129147_11_0_0", Id: "p83233", Name: "Total field maximum rechargeable power", Unit: "MW" },
"p83234": { PsKey: "1129147_11_0_0", Id: "p83234", Name: "Total field maximum dischargeable power", Unit: "MW" },
"p83235": { PsKey: "1129147_11_0_0", Id: "p83235", Name: "Total field chargeable energy", Unit: "MWh" },
"p83236": { PsKey: "1129147_11_0_0", Id: "p83236", Name: "Total field dischargeable energy", Unit: "MWh" },
"p83237": { PsKey: "1129147_11_0_0", Id: "p83237", Name: "Total field energy storage maximum reactive power", Unit: "MW" },
"p83238": { PsKey: "1129147_11_0_0", Id: "p83238", Name: "Total field energy storage active power", Unit: "MW" },
"p83239": { PsKey: "1129147_11_0_0", Id: "p83239", Name: "Total field reactive power", Unit: "Mvar" },
"p83241": { PsKey: "1129147_11_0_0", Id: "p83241", Name: "Total field charge capacity", Unit: "MWh" },
"p83242": { PsKey: "1129147_11_0_0", Id: "p83242", Name: "Total field discharge capacity", Unit: "MWh" },
"p83243": { PsKey: "1129147_11_0_0", Id: "p83243", Name: "Total field daily charge capacity", Unit: "MWh" },
"p83244": { PsKey: "1129147_11_0_0", Id: "p83244", Name: "Total field daily discharge capacity", Unit: "MWh" },
"p83252": { PsKey: "1129147_11_0_0", Id: "p83252", Name: "Battery Level (SOC)", Unit: "%", Type: PointTypeInstant },
"p83419": { PsKey: "1129147_11_0_0", Id: "p83419", Name: "Daily Highest Inverter Power/Inverter Installed Capacity", Unit: "%" },
"p83420": { PsKey: "1129147_11_0_0", Id: "p83420", Name: "Current Power/Inverter Installed Capacity", Unit: "%", Type: PointTypeInstant },
"p83549": { PsKey: "1129147_11_0_0", Id: "p83549", Name: "Grid active power", Unit: "kW" },
"p23014": { PsKey: "1129147_22_247_1", Id: "p23014", Name: "WLAN Signal Strength", Unit: "" },
} }
func (pm PointsMap) Get(device string, point string) *Point {
dp := device + "." + SetPoint(point)
if p, ok := pm[dp]; ok {
p.Valid = true
p.FullId = NameDevicePoint(device, point)
return &p
}
func GetPoint(device string, point string) *Point { dp = SetPoint(point)
return Points.Get(device, point) if p, ok := pm[dp]; ok {
p.Valid = true
p.FullId = NameDevicePoint(device, point)
return &p
}
return &Point {
FullId: NameDevicePoint(device, point),
PsKey: device,
Id: dp,
Name: "",
Unit: "",
Type: "",
Valid: false,
}
} }
func GetPointInt(device string, point int64) *Point { func (pm PointsMap) GetDevicePoint(devicePoint string) *Point {
return Points.Get(device, strconv.FormatInt(point, 10)) ret := &Point{}
for range Only.Once {
s := strings.Split(devicePoint, ".")
if len(s) < 2 {
break
}
ret = pm.Get(s[0], s[1])
}
return ret
} }
func GetDevicePoint(devicePoint string) *Point {
return Points.GetDevicePoint(devicePoint)
}
// func GetPointName(device string, point int64) string {
// return fmt.Sprintf("%s.%d", device, point)
// }
func NameDevicePointInt(device string, point int64) string {
return fmt.Sprintf("%s.%d", device, point)
}
func NameDevicePoint(device string, point string) string {
return fmt.Sprintf("%s.%s", device, point)
}
func (p *Point) WhenReset() string { func (p *Point) WhenReset() string {
var ret string var ret string
@ -290,41 +329,6 @@ func (p Point) String() string {
return p.Type return p.Type
} }
func (pm PointsMap) Get(device string, point string) *Point {
dp := device + ".p" + strings.TrimPrefix(point, "p")
if p, ok := pm[dp]; ok {
p.Valid = true
return &p
}
dp = "p" + strings.TrimPrefix(point, "p")
if p, ok := pm[dp]; ok {
p.Valid = true
return &p
}
return &Point {
PsKey: device,
Id: dp,
Description: "",
Unit: "",
Type: "",
Valid: false,
}
}
func (pm PointsMap) GetDevicePoint(devicePoint string) *Point {
ret := &Point{}
for range Only.Once {
s := strings.Split(devicePoint, ".")
if len(s) < 2 {
break
}
ret = pm.Get(s[0], s[1])
}
return ret
}
func (p Point) IsInstant() bool { func (p Point) IsInstant() bool {
if p.Type == PointTypeInstant { if p.Type == PointTypeInstant {
return true return true
@ -361,39 +365,45 @@ func (p Point) IsTotal() bool {
} }
func UpperCase(s string) string { func GetPoint(device string, point string) *Point {
return Points.Get(device, point)
}
func GetPointInt(device string, point int64) *Point {
return Points.Get(device, strconv.FormatInt(point, 10))
}
func GetDevicePoint(devicePoint string) *Point {
return Points.GetDevicePoint(devicePoint)
}
// func GetPointName(device string, point int64) string {
// return fmt.Sprintf("%s.%d", device, point)
// }
func NameDevicePointInt(device string, point int64) string {
return fmt.Sprintf("%s.%d", device, point)
}
func NameDevicePoint(device string, point string) string {
return fmt.Sprintf("%s.%s", device, point)
}
func SetPoint(point string) string {
for range Only.Once {
p := strings.TrimPrefix(point, "p")
_, err := strconv.ParseInt(p, 10, 64)
if err == nil {
point = "p" + p
break
}
}
return point
}
func PointToName(s string) string {
s = CleanString(s)
s = strings.ReplaceAll(s, "_", " ") s = strings.ReplaceAll(s, "_", " ")
s = strings.Title(s) s = strings.Title(s)
return s return s
} }
type Data struct {
Entries []DataEntry
}
type DataEntry struct {
Date DateTime `json:"date"`
PointId string `json:"point_id"`
PointGroupName string `json:"point_group_name"`
PointName string `json:"point_name"`
Value string `json:"value"`
Unit string `json:"unit"`
ValueType *Point `json:"value_type"`
Index int `json:"index"`
}
// Type string
// Name string
// SubName string
//
// ParentId string
// ParentName string
//
// UniqueId string
// FullName string
// Units string
// ValueName string
// DeviceClass string
//
// Value string

View File

@ -56,7 +56,8 @@ func CreatePoints(points []string) TemplatePoints {
for _, p := range points { for _, p := range points {
pa := strings.Split(p, ".") pa := strings.Split(p, ".")
if len(pa) == 2 { if len(pa) == 2 {
pa[1] = "p" + strings.TrimPrefix(pa[1], "p") pa[1] = SetPoint(pa[1])
// pa[1] = "p" + strings.TrimPrefix(pa[1], "p")
ret = append(ret, TemplatePoint{ ret = append(ret, TemplatePoint{
Description: "", Description: "",
PsKey: pa[0], PsKey: pa[0],
@ -68,8 +69,3 @@ func CreatePoints(points []string) TemplatePoints {
} }
return ret return ret
} }
func SetPointName(pskey string, point string) string {
point = strings.TrimPrefix(point, "p")
return pskey + ".p" + point
}

View File

@ -13,7 +13,8 @@ import (
type UnitValue struct { type UnitValue struct {
Unit string `json:"unit"` Unit string `json:"unit"`
Value string `json:"value"` Value string `json:"value"`
Point *Point `json:"point"` ValueFloat float64 `json:"value_float,omitempty"`
ValueInt int64 `json:"value_int,omitempty"`
} }
type UnitValues []UnitValue type UnitValues []UnitValue
type UnitValueMap map[string]UnitValue type UnitValueMap map[string]UnitValue

View File

@ -124,7 +124,7 @@ func (sg *SunGrow) GetTemplatePoints(template string) error {
table := output.NewTable() table := output.NewTable()
sg.Error = table.SetHeader( sg.Error = table.SetHeader(
"Point Id", "PointStruct Id",
"Description", "Description",
"Unit", "Unit",
) )
@ -337,9 +337,12 @@ func (sg *SunGrow) QueryPs(psId int64) getPsList.EndPoint {
return ret return ret
} }
func (sg *SunGrow) GetPointNames() error { func (sg *SunGrow) GetPointNames(devices ...string) error {
for range Only.Once { for range Only.Once {
for _, dt := range getPowerDevicePointNames.DeviceTypes { if len(devices) == 0 {
devices = getPowerDevicePointNames.DeviceTypes
}
for _, dt := range devices {
ep := sg.GetByStruct( ep := sg.GetByStruct(
"AppService.getPowerDevicePointNames", "AppService.getPowerDevicePointNames",
getPowerDevicePointNames.RequestData{DeviceType: dt}, getPowerDevicePointNames.RequestData{DeviceType: dt},
@ -548,6 +551,7 @@ func (sg *SunGrow) GetPointData(date string, pointNames api.TemplatePoints) erro
return sg.Error return sg.Error
} }
func (sg *SunGrow) GetPsId() (int64, error) { func (sg *SunGrow) GetPsId() (int64, error) {
var ret int64 var ret int64

View File

@ -126,18 +126,18 @@ func (sg *SunGrow) GetByJson(endpoint string, request string) api.EndPoint {
} }
switch { switch {
case sg.OutputType.IsNone(): case sg.OutputType.IsNone():
case sg.OutputType.IsFile(): case sg.OutputType.IsFile():
sg.Error = ret.WriteDataFile() sg.Error = ret.WriteDataFile()
case sg.OutputType.IsRaw(): case sg.OutputType.IsRaw():
fmt.Println(ret.GetJsonData(true)) fmt.Println(ret.GetJsonData(true))
case sg.OutputType.IsJson(): case sg.OutputType.IsJson():
fmt.Println(ret.GetJsonData(false)) fmt.Println(ret.GetJsonData(false))
default: default:
} }
} }
return ret return ret

View File

@ -31,9 +31,9 @@ func (m *Mqtt) BinarySensorPublishConfig(config EntityConfig) error {
payload := BinarySensor { payload := BinarySensor {
Device: device, Device: device,
Name: JoinStrings(m.Device.Name, config.ParentName, config.FullName), Name: JoinStrings(m.Device.Name, config.ParentName, config.FullId),
StateTopic: JoinStringsForTopic(m.binarySensorPrefix, st, "state"), StateTopic: JoinStringsForTopic(m.binarySensorPrefix, st, "state"),
StateClass: "measurement", StateClass: config.StateClass,
UniqueId: st, UniqueId: st,
UnitOfMeasurement: config.Units, UnitOfMeasurement: config.Units,
DeviceClass: config.DeviceClass, DeviceClass: config.DeviceClass,

View File

@ -15,13 +15,16 @@ func (m *Mqtt) SensorPublishConfig(config EntityConfig) error {
break break
} }
// LastReset := m.GetLastReset(config.UniqueId) // if config.LastReset == "" {
// LastResetValueTemplate := "" // config.LastReset = m.GetLastReset(config.UniqueId)
// if LastReset != "" { // }
// LastResetValueTemplate = "{{ value_json.last_reset | as_datetime() }}" // if config.LastReset != "" {
// if config.LastResetValueTemplate == "" {
// config.LastResetValueTemplate = "{{ value_json.last_reset | as_datetime() }}"
// }
// // LastResetValueTemplate = "{{ value_json.last_reset | int | timestamp_local | as_datetime }}" // // LastResetValueTemplate = "{{ value_json.last_reset | int | timestamp_local | as_datetime }}"
// } // }
//
// switch config.Units { // switch config.Units {
// case "MW": // case "MW":
// fallthrough // fallthrough
@ -76,10 +79,10 @@ func (m *Mqtt) SensorPublishConfig(config EntityConfig) error {
payload := Sensor { payload := Sensor {
Device: device, Device: device,
Name: JoinStrings(m.Device.Name, config.ParentName, config.FullName), Name: JoinStrings(m.Device.Name, config.ParentName, config.FullId),
StateTopic: JoinStringsForTopic(m.sensorPrefix, st, "state"), StateTopic: JoinStringsForTopic(m.sensorPrefix, st, "state"),
// StateTopic: m.GetSensorStateTopic(name, config.SubName),m.EntityPrefix, m.Device.FullName, config.SubName // StateTopic: m.GetSensorStateTopic(name, config.SubName),m.EntityPrefix, m.Device.FullName, config.SubName
StateClass: "measurement", StateClass: config.StateClass,
UniqueId: st, UniqueId: st,
UnitOfMeasurement: config.Units, UnitOfMeasurement: config.Units,
DeviceClass: config.DeviceClass, DeviceClass: config.DeviceClass,
@ -129,7 +132,7 @@ func (m *Mqtt) SensorPublishValue(config EntityConfig) error {
st := JoinStringsForId(m.Device.Name, config.ParentId, config.Name) st := JoinStringsForId(m.Device.Name, config.ParentId, config.Name)
payload := MqttState { payload := MqttState {
LastReset: m.GetLastReset(config.UniqueId), LastReset: m.GetLastReset(config.FullId),
Value: config.Value, Value: config.Value,
} }
st = JoinStringsForTopic(m.sensorPrefix, st, "state") st = JoinStringsForTopic(m.sensorPrefix, st, "state")
@ -192,10 +195,10 @@ func (m *Mqtt) PublishSensorValues(configs []EntityConfig) error {
if topic == "" { if topic == "" {
topic = JoinStringsForId(m.Device.Name, oid.ParentName, oid.Name) topic = JoinStringsForId(m.Device.Name, oid.ParentName, oid.Name)
} }
if _, ok := cs[oid.Type]; !ok { if _, ok := cs[oid.StateClass]; !ok {
cs[oid.Type] = make(Fields) cs[oid.StateClass] = make(Fields)
} }
cs[oid.Type][oid.ValueName] = oid.Value cs[oid.StateClass][oid.ValueName] = oid.Value
} }
for n, c := range cs { for n, c := range cs {

View File

@ -434,6 +434,9 @@ func (m *Mqtt) GetLastReset(pointType string) string {
if !pt.Valid { if !pt.Valid {
break break
} }
if pt.Type == "" {
break
}
ret = pt.WhenReset() ret = pt.WhenReset()
} }
@ -442,18 +445,19 @@ func (m *Mqtt) GetLastReset(pointType string) string {
type EntityConfig struct { type EntityConfig struct {
Type string // Type string
Name string Name string
SubName string SubName string
ParentId string ParentId string
ParentName string ParentName string
UniqueId string UniqueId string
FullName string FullId string
Units string Units string
ValueName string ValueName string
DeviceClass string DeviceClass string
StateClass string
Icon string Icon string
Value string Value string
@ -478,9 +482,13 @@ func (config *EntityConfig) IsSensor() bool {
if config.IsLight() { if config.IsLight() {
break break
} }
if config.Units == "" { // if config.Value != "" {
break // ok = true
} // break
// }
// if config.Units == "" {
// break
// }
ok = true ok = true
} }
@ -613,14 +621,30 @@ func (config *EntityConfig) FixConfig() {
break break
} }
pt := api.GetDevicePoint(config.UniqueId) pt := api.GetDevicePoint(config.FullId)
if !pt.Valid { if !pt.Valid {
break break
} }
config.LastReset = pt.WhenReset()
if config.StateClass == "instant" {
config.StateClass = "measurement"
break
}
if config.StateClass == "" {
config.StateClass = "measurement"
break
}
config.LastReset = pt.WhenReset()
config.LastResetValueTemplate = SetDefault(config.LastResetValueTemplate, "{{ value_json.last_reset | as_datetime() }}") config.LastResetValueTemplate = SetDefault(config.LastResetValueTemplate, "{{ value_json.last_reset | as_datetime() }}")
// config.LastResetValueTemplate = SetDefault(config.LastResetValueTemplate, "{{ value_json.last_reset | int | timestamp_local | as_datetime }}") // config.LastResetValueTemplate = SetDefault(config.LastResetValueTemplate, "{{ value_json.last_reset | int | timestamp_local | as_datetime }}")
if config.LastReset == "" {
config.StateClass = "measurement"
break
}
config.StateClass = "total"
} }
} }

View File

@ -25,7 +25,7 @@ func (m *Mqtt) SwitchPublishConfig(config EntityConfig) error {
payload := Switch { payload := Switch {
Device: device, Device: device,
Name: JoinStrings(m.Device.Name, config.ParentName, config.FullName), Name: JoinStrings(m.Device.Name, config.ParentName, config.FullId),
StateTopic: JoinStringsForTopic(m.binarySensorPrefix, st, "state"), StateTopic: JoinStringsForTopic(m.binarySensorPrefix, st, "state"),
CommandTopic: JoinStringsForTopic(m.binarySensorPrefix, st, "cmd"), CommandTopic: JoinStringsForTopic(m.binarySensorPrefix, st, "cmd"),
UniqueId: st, UniqueId: st,
@ -34,6 +34,8 @@ func (m *Mqtt) SwitchPublishConfig(config EntityConfig) error {
PayloadOn: "true", PayloadOn: "true",
PayloadOff: "false", PayloadOff: "false",
StateOn: "true",
StateOff: "false",
ValueTemplate: config.ValueTemplate, ValueTemplate: config.ValueTemplate,
Icon: config.Icon, Icon: config.Icon,
@ -52,8 +54,6 @@ func (m *Mqtt) SwitchPublishConfig(config EntityConfig) error {
// Optimistic: false, // Optimistic: false,
// PayloadAvailable: "", // PayloadAvailable: "",
// PayloadNotAvailable: "", // PayloadNotAvailable: "",
// StateOff: "",
// StateOn: "",
} }
ct := JoinStringsForTopic(m.binarySensorPrefix, st, "config") ct := JoinStringsForTopic(m.binarySensorPrefix, st, "config")