package device import ( "context" "fmt" "git.quimbo.fr/nicolas/mqtt" "github.com/rs/zerolog" ) type Subscriber func(string, int, func(context.Context, mqtt.Message)) context.CancelFunc type DeviceManager struct { devices map[string]*Device subscriber Subscriber sub_cancel map[string]context.CancelFunc PubChan chan Message } func NewDeviceManager(pubchan chan Message, subscriber Subscriber) *DeviceManager { return &DeviceManager{ devices: make(map[string]*Device), sub_cancel: make(map[string]context.CancelFunc), subscriber: subscriber, PubChan: pubchan, } } func (m *DeviceManager) Get(name string) (*Device, bool) { device, ok := m.devices[name] return device, ok } func (m *DeviceManager) Add(device Device) error { if _, prs := m.devices[device.Name]; prs { return fmt.Errorf("device %s already exist", device.Name) } m.devices[device.Name] = &device // subscribe to state topic topic, err := device.ListenTopic() if err != nil { return err } if topic != "" { cancel := m.subscriber(topic, 2, device.onMessage) m.sub_cancel[device.Name] = cancel } return nil } func (m *DeviceManager) Delete(name string) error { return nil } func (m *DeviceManager) SetSettings(name string, settings DeviceSettings) error { device, ok := m.devices[name] if !ok { return fmt.Errorf("Not existings device %s", name) } device.Settings = settings return nil } func (m *DeviceManager) SetState(name string, state DeviceState) error { device, ok := m.devices[name] if !ok { return fmt.Errorf("Not existings device %s", name) } device.State = state return nil } func (m *DeviceManager) Check(ctx context.Context, name string) error { logger := zerolog.Ctx(ctx) device, ok := m.devices[name] if !ok { return fmt.Errorf("Device %s don't exist", name) } err := device.CheckSetpoint(logger, m.PubChan) if err != nil { logger.Error().Err(err).Msg("") return err } return nil } func (m *DeviceManager) CheckAll(ctx context.Context) error { logger := zerolog.Ctx(ctx) for _, device := range m.devices { err := device.CheckSetpoint(logger, m.PubChan) if err != nil { logger.Error().Err(err).Msg("") return err } } return nil }