diff --git a/main.go b/main.go index e583db1..1961a7d 100644 --- a/main.go +++ b/main.go @@ -213,7 +213,7 @@ func renameSensor(w http.ResponseWriter, r *http.Request) { return } // Republish discovery for this sensor - if err := mqttClient.PublishSensorDiscovery(sensor.Protocol, sensor.Model, sensor.ID); err != nil { + if err := mqttClient.PublishSensorDiscovery(sensor); err != nil { log.Printf("Error republishing sensor discovery: %v", err) } w.WriteHeader(http.StatusOK) diff --git a/pkg/mqtt/discovery.go b/pkg/mqtt/discovery.go index 2761db2..4d8782a 100644 --- a/pkg/mqtt/discovery.go +++ b/pkg/mqtt/discovery.go @@ -6,7 +6,6 @@ import ( "log" "git.k7n.net/mats/go-telldus/pkg/datastore" - "git.k7n.net/mats/go-telldus/pkg/telldus" ) // HADevice represents a device in Home Assistant MQTT discovery @@ -110,52 +109,29 @@ func (c *Client) PublishDeviceDiscovery(deviceID int) error { // publishSensorDiscovery publishes discovery for all sensors func (c *Client) publishSensorDiscovery() error { - var protocol, model string - var id, dataTypes int - ret := telldus.Sensor(&protocol, &model, &id, &dataTypes) - - for ret == 0 { - sensor, err := c.store.GetSensorByIdentity(protocol, model, id) - if err != nil || sensor.Hidden { - log.Printf("Sensor %s %s %d not in DB or hidden, skipping", protocol, model, id) - ret = telldus.Sensor(&protocol, &model, &id, &dataTypes) + for sensor := range c.store.ListSensors() { + if sensor.Hidden { + log.Printf("Sensor %s %s %d is hidden, skipping", sensor.Protocol, sensor.Model, sensor.ID) continue } - - if err := c.publishSensorDiscoveryForSensor(sensor, dataTypes); err != nil { - log.Printf("Error publishing discovery for sensor %s %s %d: %v", protocol, model, id, err) + if err := c.PublishSensorDiscovery(sensor); err != nil { + log.Printf("Error publishing discovery for sensor %s %s %d: %v", sensor.Protocol, sensor.Model, sensor.ID, err) } - - ret = telldus.Sensor(&protocol, &model, &id, &dataTypes) } + return nil } // PublishSensorDiscovery publishes Home Assistant discovery for a single sensor -func (c *Client) PublishSensorDiscovery(protocol, model string, id int) error { - sensor, err := c.store.GetSensorByIdentity(protocol, model, id) - if err != nil { - return fmt.Errorf("sensor %s %s %d not found: %w", protocol, model, id, err) - } +func (c *Client) PublishSensorDiscovery(sensor *datastore.Sensor) error { - // Get current data types from telldus - var p, m string - var sensorID, dataTypes int - ret := telldus.Sensor(&p, &m, &sensorID, &dataTypes) + return c.publishSensorDiscoveryForSensor(sensor) - // Find matching sensor - for ret == 0 { - if p == protocol && m == model && sensorID == id { - return c.publishSensorDiscoveryForSensor(sensor, dataTypes) - } - ret = telldus.Sensor(&p, &m, &sensorID, &dataTypes) - } - - return fmt.Errorf("sensor %s %s %d not found in telldus", protocol, model, id) + // return fmt.Errorf("sensor %s %s %d not found in telldus", protocol, model, id) } // publishSensorDiscoveryForSensor publishes discovery messages for a sensor's data types -func (c *Client) publishSensorDiscoveryForSensor(sensor *datastore.Sensor, dataTypes int) error { +func (c *Client) publishSensorDiscoveryForSensor(sensor *datastore.Sensor) error { sensorDevice := HADevice{ Identifiers: []string{fmt.Sprintf("telldus_sensor_%s_%s_%d", sensor.Protocol, sensor.Model, sensor.ID)}, Name: sensor.Name, @@ -163,7 +139,7 @@ func (c *Client) publishSensorDiscoveryForSensor(sensor *datastore.Sensor, dataT Model: fmt.Sprintf("%s %s", sensor.Protocol, sensor.Model), } - if dataTypes&telldus.DataTypeTemperature != 0 && sensor.TemperatureUniqueID != "" { + if sensor.TemperatureUniqueID != "" { discovery := SensorDiscovery{ Platform: "mqtt", Name: fmt.Sprintf("%s Temperature", sensor.Name), @@ -184,7 +160,7 @@ func (c *Client) publishSensorDiscoveryForSensor(sensor *datastore.Sensor, dataT c.client.Publish(topic, 0, true, payload) } - if dataTypes&telldus.DataTypeHumidity != 0 && sensor.HumidityUniqueID != "" { + if sensor.HumidityUniqueID != "" { discovery := SensorDiscovery{ Platform: "mqtt", Name: fmt.Sprintf("%s Humidity", sensor.Name),