GoSungrow/mmHa/options.go

158 lines
2.9 KiB
Go
Raw Permalink Normal View History

2022-12-20 20:28:51 +11:00
package mmHa
import (
"GoSungrow/iSolarCloud/api/GoStruct/valueTypes"
"errors"
"github.com/MickMake/GoUnify/Only"
mqtt "github.com/eclipse/paho.mqtt.golang"
2022-12-23 18:16:12 +11:00
"sync"
2022-12-20 20:28:51 +11:00
)
type Options struct {
2022-12-23 18:16:12 +11:00
mu sync.Mutex
2022-12-20 20:28:51 +11:00
Map map[string]Option
}
type Option struct {
Config *EntityConfig
Handler mqtt.MessageHandler
Values []string
}
func (m *Mqtt) SetOption(id string, name string, fn mqtt.MessageHandler, options ...string) error {
for range Only.Once {
m.err = m.UserOptions.SetOption(id, name, fn, options...)
if m.err != nil {
break
}
ec := m.UserOptions.EntityConfig(id)
m.err = m.SelectPublishConfig(*ec, fn)
if m.err != nil {
break
}
}
return m.err
}
func (m *Mqtt) SetOptionValue(id string, value string) error {
for range Only.Once {
m.err = m.UserOptions.SetOptionValue(id, value)
if m.err != nil {
break
}
ec := m.UserOptions.EntityConfig(id)
m.err = m.SelectPublishValue(*ec)
if m.err != nil {
break
}
}
return m.err
}
func (m *Mqtt) GetOption(id string) string {
return m.UserOptions.GetOption(id)
}
const OptionEnabled = "Enabled"
const OptionDisabled = "Disabled"
2022-12-23 18:16:12 +11:00
func (m *Options) New() {
for range Only.Once {
m.mu.Lock()
//goland:noinspection GoDeferInLoop
defer m.mu.Unlock()
m.Map = make(map[string]Option, 0)
}
}
2022-12-20 20:28:51 +11:00
func (m *Options) SetOption(id string, name string, handler mqtt.MessageHandler, values ...string) error {
var err error
for range Only.Once {
if len(values) == 0 {
values = []string{OptionEnabled, OptionDisabled}
}
2022-12-23 18:16:12 +11:00
m.mu.Lock()
//goland:noinspection GoDeferInLoop
defer m.mu.Unlock()
2022-12-20 20:28:51 +11:00
m.Map[id] = Option {
Config: &EntityConfig {
Name: "Option " + name,
FullId: JoinStringsForId("option", id),
Icon: "mdi:format-list-group",
// ValueTemplate: `{"value": "{{ value }}"}`,
2022-12-23 18:16:12 +11:00
ValueTemplate: `{{ value }}`,
2022-12-20 20:28:51 +11:00
Units: LabelSelect,
ParentName: "options",
Options: values,
},
Handler: handler,
Values: values,
}
}
return err
}
func (m *Options) SetOptionValue(id string, value string) error {
var err error
for range Only.Once {
2022-12-23 18:16:12 +11:00
m.mu.Lock()
//goland:noinspection GoDeferInLoop
defer m.mu.Unlock()
2022-12-20 20:28:51 +11:00
if _, ok := m.Map[id]; !ok {
err = errors.New("not exist")
break
}
if m.Map[id].Config.Value == nil {
uv := valueTypes.SetUnitValueString("", "", value)
m.Map[id].Config.Value = &uv
break
}
m.Map[id].Config.Value.SetString(value)
}
return err
}
func (m *Options) GetOption(id string) string {
var ret string
for range Only.Once {
2022-12-23 18:16:12 +11:00
m.mu.Lock()
//goland:noinspection GoDeferInLoop
defer m.mu.Unlock()
2022-12-20 20:28:51 +11:00
if value, ok := m.Map[id]; ok {
ret = value.Config.Value.String()
break
}
}
return ret
}
func (m *Options) EntityConfig(id string) *EntityConfig {
var ret *EntityConfig
for range Only.Once {
2022-12-23 18:16:12 +11:00
m.mu.Lock()
//goland:noinspection GoDeferInLoop
defer m.mu.Unlock()
2022-12-20 20:28:51 +11:00
if r, ok := m.Map[id]; ok {
ret = r.Config
break
}
}
return ret
}