Skip to content

Commit f43c389

Browse files
committed
* the status is now retained
* sensor commands can now be retained (configurable)
1 parent 949e8c2 commit f43c389

File tree

5 files changed

+11
-22
lines changed

5 files changed

+11
-22
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ Create a configuration file named "config.json"
3838
"sensor": [{
3939
"name": "Free Memory",
4040
"topic": "tele/__DEVICE_ID__/memory/free",
41+
"retained": false,
4142
"unit": "kB", //used for hassio
4243
"icon": "hass:eye", //used for hassio
4344
"interval": "10s",

cmd/mqtt-executor/config.go

+1
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ func (c *applicationConfig) GetMQTTOpts(
9292

9393
if c.TopicConfigurations.Availability != nil {
9494
opts.WillEnabled = true
95+
opts.WillRetained = true
9596
opts.WillQos = byte(*c.PublishQOS)
9697
opts.WillPayload = []byte(c.TopicConfigurations.Availability.Payload.Unavailable)
9798
opts.WillTopic = c.TopicConfigurations.Availability.Topic

internal/mqtt/config/topic.go

+3-7
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ type TopicConfigurations struct {
1717
}
1818

1919
type Availability struct {
20-
Topic string `json:"topic"`
21-
Payload availabilityPayload `json:"payload"`
22-
Interval *Interval `json:"interval"`
20+
Topic string `json:"topic"`
21+
Payload availabilityPayload `json:"payload"`
2322
}
2423
type availabilityPayload struct {
2524
Available string `json:"available"`
@@ -36,6 +35,7 @@ type Trigger struct {
3635
type Sensor struct {
3736
Name string `json:"name"`
3837
ResultTopic string `json:"topic"`
38+
Retained bool `json:"retained"`
3939
Interval Interval `json:"interval"`
4040
Unit string `json:"unit"`
4141
Icon string `json:"icon"`
@@ -68,10 +68,6 @@ func LoadTopicConfiguration(configFilePath, deviceId string) (TopicConfiguration
6868
//replace DEVICE_ID
6969
if topicConfig.Availability != nil {
7070
topicConfig.Availability.Topic = strings.Replace(topicConfig.Availability.Topic, "__DEVICE_ID__", deviceId, -1)
71-
if topicConfig.Availability.Interval == nil {
72-
defaultInterval := Interval(30 * time.Second)
73-
topicConfig.Availability.Interval = &defaultInterval
74-
}
7571
if topicConfig.Availability.Payload.Available == "" {
7672
topicConfig.Availability.Payload.Available = "Online"
7773
}

internal/mqtt/sensor.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ func (s *SensorWorker) runSensor(ctx context.Context, publishQOS byte, sensorCon
5151
func (s *SensorWorker) executeCommand(ctx context.Context, publishQOS byte, sensorConf config.Sensor) {
5252
output, execErr := s.Executor.ExecuteCommandWithContext(sensorConf.Command.Name, sensorConf.Command.Arguments, ctx)
5353
if execErr != nil {
54-
s.MqttClient.Publish(sensorConf.ResultTopic, publishQOS, false, "<FAILED>;"+execErr.Error())
54+
s.MqttClient.Publish(sensorConf.ResultTopic, publishQOS, sensorConf.Retained, "<FAILED>;"+execErr.Error())
5555
return
5656
}
5757

58-
s.MqttClient.Publish(sensorConf.ResultTopic, publishQOS, false, output)
58+
s.MqttClient.Publish(sensorConf.ResultTopic, publishQOS, sensorConf.Retained, output)
5959
}
6060

6161
func (s *SensorWorker) Close(timeout time.Duration) error {

internal/mqtt/status.go

+4-13
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,16 @@ func (s *StatusWorker) Initialise(availabilityConfigs config.Availability) {
2929
func (s *StatusWorker) runStatus(ctx context.Context, availabilityConfig config.Availability) {
3030
defer s.waitGroup.Done()
3131
defer func() {
32-
token := s.MqttClient.Publish(availabilityConfig.Topic, byte(1), false, availabilityConfig.Payload.Unavailable)
32+
token := s.MqttClient.Publish(availabilityConfig.Topic, byte(1), true, availabilityConfig.Payload.Unavailable)
3333

3434
//we should wait for the last state publish (graceful shutdown dont trigger the mqtt-last-will!)
3535
token.Wait()
3636
}()
3737

38-
//first one
39-
s.MqttClient.Publish(availabilityConfig.Topic, byte(1), false, availabilityConfig.Payload.Available)
38+
s.MqttClient.Publish(availabilityConfig.Topic, byte(1), true, availabilityConfig.Payload.Available)
4039

41-
ticker := time.Tick(time.Duration(*availabilityConfig.Interval))
42-
for {
43-
//wait until next tick or shutdown
44-
select {
45-
case <-ticker:
46-
s.MqttClient.Publish(availabilityConfig.Topic, byte(1), false, availabilityConfig.Payload.Available)
47-
case <-ctx.Done():
48-
return
49-
}
50-
}
40+
//wait until shutdown
41+
<-ctx.Done()
5142
}
5243

5344
func (s *StatusWorker) Close(timeout time.Duration) error {

0 commit comments

Comments
 (0)