protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _configurationService.ReadCommandSettings(_mqttPublisher); _configurationService.ReadSensorSettings(_mqttPublisher); while (!_mqttPublisher.IsConnected) { _logger.LogInformation($"Connecting to MQTT broker..."); await Task.Delay(2000); } _logger.LogInformation("Connected. Sending auto discovery messages."); _mqttPublisher.AnnounceAvailability("sensor"); foreach (AbstractSensor sensor in _configurationService.ConfiguredSensors.ToList()) { sensor.PublishAutoDiscoveryConfigAsync(); } foreach (AbstractCommand command in _configurationService.ConfiguredCommands.ToList()) { command.PublishAutoDiscoveryConfigAsync(); } while (!stoppingToken.IsCancellationRequested) { _logger.LogDebug("Worker running at: {time}", DateTimeOffset.Now); // announce autodiscovery every 30 seconds if (_mqttPublisher.LastAvailabilityAnnounce < DateTime.UtcNow.AddSeconds(-10)) { _mqttPublisher.AnnounceAvailability("sensor"); } foreach (AbstractSensor sensor in _configurationService.ConfiguredSensors.ToList()) { try { await sensor.PublishStateAsync(); } catch (Exception ex) { Log.Logger.Warning("Sensor failed: " + sensor.Name, ex); } } foreach (AbstractCommand command in _configurationService.ConfiguredCommands.ToList()) { try { await command.PublishStateAsync(); } catch (Exception ex) { Log.Logger.Warning("Command state failed: " + command.Name, ex); } } // announce autodiscovery every 30 seconds if (_mqttPublisher.LastConfigAnnounce < DateTime.UtcNow.AddSeconds(-30)) { foreach (AbstractSensor sensor in _configurationService.ConfiguredSensors.ToList()) { sensor.PublishAutoDiscoveryConfigAsync(); } foreach (AbstractCommand command in _configurationService.ConfiguredCommands.ToList()) { command.PublishAutoDiscoveryConfigAsync(); } } await Task.Delay(1000, stoppingToken); } }