diff --git a/src/HASS.Agent/HASS.Agent/Controls/Configuration/ConfigMqtt.Designer.cs b/src/HASS.Agent/HASS.Agent/Controls/Configuration/ConfigMqtt.Designer.cs index d404552a..d5c734f6 100644 --- a/src/HASS.Agent/HASS.Agent/Controls/Configuration/ConfigMqtt.Designer.cs +++ b/src/HASS.Agent/HASS.Agent/Controls/Configuration/ConfigMqtt.Designer.cs @@ -57,7 +57,6 @@ private void InitializeComponent() this.LblClientId = new System.Windows.Forms.Label(); this.NumMqttPort = new Syncfusion.Windows.Forms.Tools.NumericUpDownExt(); this.PbShow = new System.Windows.Forms.PictureBox(); - this.CbIgnoreGracePeriod = new System.Windows.Forms.CheckBox(); this.CbEnableMqtt = new System.Windows.Forms.CheckBox(); this.LblMqttDisabledWarning = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.NumMqttPort)).BeginInit(); @@ -476,23 +475,6 @@ private void InitializeComponent() this.LblMqttDisabledWarning.Text = Languages.ConfigMqtt_LblMqttDisabledWarning; this.LblMqttDisabledWarning.Visible = false; // - // CbIgnoreGracePeriod - // - this.CbIgnoreGracePeriod.AccessibleDescription = "Ignore grace period after waking up from hibernation."; - this.CbIgnoreGracePeriod.AccessibleName = "Ignore grace period"; - this.CbIgnoreGracePeriod.AccessibleRole = AccessibleRole.CheckButton; - this.CbIgnoreGracePeriod.AutoSize = true; - this.CbIgnoreGracePeriod.Checked = false; - this.CbIgnoreGracePeriod.CheckState = CheckState.Unchecked; - this.CbIgnoreGracePeriod.Font = new Font("Segoe UI", 10F); - this.CbIgnoreGracePeriod.Location = new Point(59, 612); - this.CbIgnoreGracePeriod.Name = "CbIgnoreGracePeriod"; - this.CbIgnoreGracePeriod.Size = new Size(354, 23); - this.CbIgnoreGracePeriod.TabIndex = 103; - this.CbIgnoreGracePeriod.Text = Languages.ConfigMqtt_CbIgnoreGracePeriod; - this.CbIgnoreGracePeriod.UseVisualStyleBackColor = true; - this.CbIgnoreGracePeriod.CheckedChanged += new System.EventHandler(this.CbIgnoreGracePeriod_CheckedChanged); - // // ConfigMqtt // this.AccessibleDescription = "Panel containing the MQTT client configuration."; @@ -501,7 +483,6 @@ private void InitializeComponent() this.AutoScaleDimensions = new SizeF(96F, 96F); this.AutoScaleMode = AutoScaleMode.Dpi; this.BackColor = Color.FromArgb(45, 45, 48); - this.Controls.Add(CbIgnoreGracePeriod); this.Controls.Add(LblMqttDisabledWarning); this.Controls.Add(CbEnableMqtt); this.Controls.Add(PbShow); @@ -571,6 +552,5 @@ private void InitializeComponent() private PictureBox PbShow; internal CheckBox CbEnableMqtt; private Label LblMqttDisabledWarning; - internal CheckBox CbIgnoreGracePeriod; } } diff --git a/src/HASS.Agent/HASS.Agent/Controls/Configuration/ConfigMqtt.cs b/src/HASS.Agent/HASS.Agent/Controls/Configuration/ConfigMqtt.cs index cf85f27d..7949b70d 100644 --- a/src/HASS.Agent/HASS.Agent/Controls/Configuration/ConfigMqtt.cs +++ b/src/HASS.Agent/HASS.Agent/Controls/Configuration/ConfigMqtt.cs @@ -61,10 +61,5 @@ private void CbEnableMqtt_CheckedChanged(object sender, EventArgs e) { LblMqttDisabledWarning.Visible = CbEnableMqtt.CheckState != CheckState.Checked; } - - private void CbIgnoreGracePeriod_CheckedChanged(object sender, EventArgs e) - { - - } } } diff --git a/src/HASS.Agent/HASS.Agent/Forms/Configuration.cs b/src/HASS.Agent/HASS.Agent/Forms/Configuration.cs index b82a4261..0db1af3b 100644 --- a/src/HASS.Agent/HASS.Agent/Forms/Configuration.cs +++ b/src/HASS.Agent/HASS.Agent/Forms/Configuration.cs @@ -328,7 +328,6 @@ private void LoadSettings() _mqtt.CbAllowUntrustedCertificates.CheckState = Variables.AppSettings.MqttAllowUntrustedCertificates ? CheckState.Checked : CheckState.Unchecked; _mqtt.CbUseRetainFlag.CheckState = Variables.AppSettings.MqttUseRetainFlag ? CheckState.Checked : CheckState.Unchecked; _mqtt.CbUseWebSocket.CheckState = Variables.AppSettings.MqttUseWebSocket ? CheckState.Checked : CheckState.Unchecked; - _mqtt.CbIgnoreGracePeriod.CheckState = Variables.AppSettings.MqttIgnoreGracePeriod ? CheckState.Checked : CheckState.Unchecked; // updates _updates.CbUpdates.CheckState = Variables.AppSettings.CheckForUpdates ? CheckState.Checked : CheckState.Unchecked; @@ -436,7 +435,6 @@ private async Task StoreSettingsAsync() Variables.AppSettings.MqttAllowUntrustedCertificates = _mqtt.CbAllowUntrustedCertificates.CheckState == CheckState.Checked; Variables.AppSettings.MqttUseRetainFlag = _mqtt.CbUseRetainFlag.CheckState == CheckState.Checked; Variables.AppSettings.MqttUseWebSocket = _mqtt.CbUseWebSocket.CheckState == CheckState.Checked; - Variables.AppSettings.MqttIgnoreGracePeriod = _mqtt.CbIgnoreGracePeriod.CheckState == CheckState.Checked; // mqtt -> service await SettingsManager.SendMqttSettingsToServiceAsync(); diff --git a/src/HASS.Agent/HASS.Agent/MQTT/MqttManager.cs b/src/HASS.Agent/HASS.Agent/MQTT/MqttManager.cs index e266db46..109965a0 100644 --- a/src/HASS.Agent/HASS.Agent/MQTT/MqttManager.cs +++ b/src/HASS.Agent/HASS.Agent/MQTT/MqttManager.cs @@ -36,8 +36,8 @@ public class MqttManager : IMqttManager { private IManagedMqttClient _mqttClient = null; - private bool _disconnectionNotified = false; private bool _connectingFailureNotified = false; + private Stopwatch _disconnectedTimer = null; private MqttStatus _status = MqttStatus.Connecting; @@ -132,53 +132,21 @@ private async Task OnMqttDisconnected(MqttClientDisconnectedEventArgs arg) { _isReady = false; - Variables.MainForm?.SetMqttStatus(ComponentStatus.Connecting); - - var gracePeriod = Variables.AppSettings.DisconnectedGracePeriodSeconds; - - // give the connection the grace period to recover - var runningTimer = Stopwatch.StartNew(); - while (runningTimer.Elapsed.TotalSeconds < gracePeriod) + if (Variables.ShuttingDown) { - await Task.Delay(TimeSpan.FromSeconds(5)); - - if (IsConnected()) - { - _isReady = true; - - if (_status == MqttStatus.Connected) - return; - - _status = MqttStatus.Connected; - Variables.MainForm?.SetMqttStatus(ComponentStatus.Ok); - Log.Information("[MQTT] Reconnected from disconnection"); - - return; - } - - if (Variables.AppSettings.MqttIgnoreGracePeriod) - { - var lastResumed = SystemStateManager.LastEventOccurrence.TryGetValue(SystemStateEvent.Resume, out var lastResumeEventDate); - if (lastResumed && DateTime.Now < lastResumeEventDate.AddSeconds(gracePeriod)) - { - Log.Information("[MQTT] System resumed less than {gracePeriod} seconds ago, ignoring grace period on disconnection"); - break; - } - } - } - - // nope, call it - _status = MqttStatus.Disconnected; - Variables.MainForm?.SetMqttStatus(ComponentStatus.Stopped); - - // log if we're not shutting down, but only once - if (Variables.ShuttingDown || _disconnectionNotified) + Variables.MainForm?.SetMqttStatus(ComponentStatus.Stopped); + _status = MqttStatus.Disconnected; return; + } - _disconnectionNotified = true; + Variables.MainForm?.SetMqttStatus(ComponentStatus.Connecting); + _status = MqttStatus.Connecting; - Variables.MainForm?.ShowToolTip(Languages.MqttManager_ToolTip_Disconnected, true); - Log.Warning("[MQTT] Disconnected: {reason}", arg.Reason.ToString()); + if (_disconnectedTimer == null) + { + _disconnectedTimer = Stopwatch.StartNew(); + Log.Warning("[MQTT] Disconnected: {reason}", arg.Reason.ToString()); + } } /// @@ -186,61 +154,23 @@ private async Task OnMqttDisconnected(MqttClientDisconnectedEventArgs arg) /// private async Task OnMqttConnectionFailed(ConnectingFailedEventArgs arg) { - Variables.MainForm?.SetMqttStatus(ComponentStatus.Connecting); - var gracePeriod = Variables.AppSettings.DisconnectedGracePeriodSeconds; - - // give the connection the grace period to recover - var runningTimer = Stopwatch.StartNew(); - while (runningTimer.Elapsed.TotalSeconds < gracePeriod) - { - await Task.Delay(TimeSpan.FromSeconds(5)); - - if (IsConnected()) - { - // recovered - if (_status == MqttStatus.Connected) - return; - - _status = MqttStatus.Connected; - Variables.MainForm?.SetMqttStatus(ComponentStatus.Ok); - Log.Information("[MQTT] Reconnected from failed connection"); - - return; - } - - if (Variables.AppSettings.MqttIgnoreGracePeriod) - { - var lastResumed = SystemStateManager.LastEventOccurrence.TryGetValue(SystemStateEvent.Resume, out var lastResumeEventDate); - if (lastResumed && DateTime.Now < lastResumeEventDate.AddSeconds(gracePeriod)) - { - Log.Information("[MQTT] System resumed more than {gracePeriod} seconds ago, ignoring grace period on connection failed"); - break; - } - } + if (_disconnectedTimer?.Elapsed.TotalSeconds > gracePeriod && !_connectingFailureNotified) + { + Variables.MainForm?.ShowToolTip(Languages.MqttManager_ToolTip_Disconnected, true); + Variables.MainForm?.ShowToolTip(Languages.MqttManager_ToolTip_ConnectionFailed, true); + _connectingFailureNotified = true; + + var excMsg = arg.Exception.ToString(); + if (excMsg.Contains("SocketException")) + Log.Error("[MQTT] Error while connecting: {err}", arg.Exception.Message); + else if (excMsg.Contains("MqttCommunicationTimedOutException")) + Log.Error("[MQTT] Error while connecting: {err}", "Connection timed out"); + else if (excMsg.Contains("NotAuthorized")) + Log.Error("[MQTT] Error while connecting: {err}", "Not authorized, check your credentials."); + else + Log.Fatal(arg.Exception, "[MQTT] Error while connecting: {err}", arg.Exception.Message); } - - // nope, call it - _status = MqttStatus.Error; - Variables.MainForm?.SetMqttStatus(ComponentStatus.Failed); - - // log only once - if (_connectingFailureNotified) - return; - - _connectingFailureNotified = true; - - var excMsg = arg.Exception.ToString(); - if (excMsg.Contains("SocketException")) - Log.Error("[MQTT] Error while connecting: {err}", arg.Exception.Message); - else if (excMsg.Contains("MqttCommunicationTimedOutException")) - Log.Error("[MQTT] Error while connecting: {err}", "Connection timed out"); - else if (excMsg.Contains("NotAuthorized")) - Log.Error("[MQTT] Error while connecting: {err}", "Not authorized, check your credentials."); - else - Log.Fatal(arg.Exception, "[MQTT] Error while connecting: {err}", arg.Exception.Message); - - Variables.MainForm?.ShowToolTip(Languages.MqttManager_ToolTip_ConnectionFailed, true); } private Task OnMqttConnected(MqttClientConnectedEventArgs arg) @@ -249,8 +179,9 @@ private Task OnMqttConnected(MqttClientConnectedEventArgs arg) Variables.MainForm?.SetMqttStatus(ComponentStatus.Ok); Log.Information("[MQTT] Connected"); - // reset error notifications - _disconnectionNotified = false; + Task.Run(async () => await AnnounceAvailabilityAsync()); + + _disconnectedTimer = null; _connectingFailureNotified = false; return Task.CompletedTask; @@ -282,7 +213,6 @@ public async void ReloadConfiguration() // reset state _status = MqttStatus.Connecting; Variables.MainForm?.SetMqttStatus(ComponentStatus.Connecting); - _disconnectionNotified = false; _connectingFailureNotified = false; Log.Information("[MQTT] Initializing .."); @@ -307,7 +237,6 @@ private async void StartClient(ManagedMqttClientOptions options) try { await _mqttClient.StartAsync(options); - InitialRegistration(); } catch (MqttConnectingFailedException ex) { @@ -323,23 +252,6 @@ private async void StartClient(ManagedMqttClientOptions options) } } - /// - /// Announce our general availability - /// - private async void InitialRegistration() - { - if (!Variables.AppSettings.MqttEnabled || _mqttClient == null) - return; - - while (!IsConnected()) - await Task.Delay(2000); - - await AnnounceAvailabilityAsync(); - _isReady = true; - - Log.Information("[MQTT] Initial registration completed"); - } - /// /// Prepares info for the device we're running on /// @@ -525,6 +437,8 @@ public async Task AnnounceAvailabilityAsync(bool offline = false) .WithRetainFlag(Variables.AppSettings.MqttUseRetainFlag); await _mqttClient.InternalClient.PublishAsync(integrationMsgBuilder.Build()); + + _isReady = true; } else { @@ -895,4 +809,4 @@ private static void HandleActionReceived(MqttApplicationMessage applicationMessa command.TurnOnWithAction(payload); } } -} +} \ No newline at end of file diff --git a/src/HASS.Agent/HASS.Agent/Models/Config/AppSettings.cs b/src/HASS.Agent/HASS.Agent/Models/Config/AppSettings.cs index c5de6e89..b00faf46 100644 --- a/src/HASS.Agent/HASS.Agent/Models/Config/AppSettings.cs +++ b/src/HASS.Agent/HASS.Agent/Models/Config/AppSettings.cs @@ -81,7 +81,6 @@ public AppSettings() public bool MqttUseRetainFlag { get; set; } = true; public string MqttRootCertificate { get; set; } = string.Empty; public string MqttClientCertificate { get; set; } = string.Empty; - public bool MqttIgnoreGracePeriod { get; set; } = false; public bool NfcScanningEnabled { get; set; } = false; public string NfcSelectedScanner { get; set; } = string.Empty; diff --git a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.Designer.cs b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.Designer.cs index b79f442b..e892e9c5 100644 --- a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.Designer.cs +++ b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.Designer.cs @@ -582,7 +582,8 @@ internal static string CommandsManager_MonitorWakeCommandDescription { ///- Special keys go between { }, like {TAB} or {UP} /// ///- Put a + in front of a key to add SHIFT, ^ for CTRL and % for ALT. So, +C is SHIFT-C. Or, +(CD) is SHIFT-C and SHIFT-D, while +CD is SHIFT-C and D - /// /// [rest of string was truncated]";. + /// + /// [rest of string was truncated]";. /// internal static string CommandsManager_MultipleKeysCommandDescription { get { @@ -2418,15 +2419,6 @@ internal static string ConfigMqtt_CbEnableMqtt { } } - /// - /// Looks up a localized string similar to Ignore grace period after waking up from hibernation. - /// - internal static string ConfigMqtt_CbIgnoreGracePeriod { - get { - return ResourceManager.GetString("ConfigMqtt_CbIgnoreGracePeriod", resourceCulture); - } - } - /// /// Looks up a localized string similar to &TLS. /// diff --git a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.de.resx b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.de.resx index 33f53638..ed1c1c12 100644 --- a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.de.resx +++ b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.de.resx @@ -3496,9 +3496,6 @@ Die Bildschirmnummer hängt von der Systemkonfiguration ab – beginnt bei 0.Legt den Standard-Audioeingang für das System fest (einschließlich des Standard-Kommunikationsgeräts). Als Payload benötigen Sie den Namen des Audiogeräts. - - Ignorieren Sie die Schonfrist nach dem Aufwachen aus dem Ruhezustand - Verwenden Sie ein modernes Taskleistensymbol diff --git a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.en.resx b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.en.resx index d41bfa3c..564a0169 100644 --- a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.en.resx +++ b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.en.resx @@ -3392,9 +3392,6 @@ Screen number depends on system configuration - starts at 0. Sets the default audio input for the system (including default communication device). Requires audio device name as a payload. - - Ignore grace period after waking up from hibernation - Use modern tray icon diff --git a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.es.resx b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.es.resx index f7bcab92..03fa293c 100644 --- a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.es.resx +++ b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.es.resx @@ -3372,9 +3372,6 @@ El número de pantalla depende de la configuración del sistema: comienza en 0.< Establece la entrada de audio predeterminada para el sistema (incluido el dispositivo de comunicación predeterminado). Necesita el nombre del dispositivo de audio como carga útil. - - Ignorar el período de gracia después de despertar de la hibernación - Utilice el icono de bandeja moderno diff --git a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.fr.resx b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.fr.resx index 7a293a1a..a5208f74 100644 --- a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.fr.resx +++ b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.fr.resx @@ -3396,9 +3396,6 @@ Le numéro d'écran dépend de la configuration du système - commence à 0.Définit l'entrée audio par défaut du système (y compris le périphérique de communication par défaut). Vous avez besoin du nom du périphérique audio comme charge utile. - - Ignorer la période de grâce après la sortie de l'hibernation - Utiliser l'icône de la barre d'état moderne diff --git a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.nl.resx b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.nl.resx index 25a14e7a..6b3f74e7 100644 --- a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.nl.resx +++ b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.nl.resx @@ -3393,9 +3393,6 @@ Schermnummer is afhankelijk van de systeemconfiguratie - begint bij 0. Stelt de standaardaudio-invoer in voor het systeem (inclusief het standaardcommunicatieapparaat). U hebt de naam van het audioapparaat nodig als payload. - - Negeer de respijtperiode na het ontwaken uit de winterslaap - Gebruik het moderne ladepictogram diff --git a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.pl.resx b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.pl.resx index 50cd749e..b29796a6 100644 --- a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.pl.resx +++ b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.pl.resx @@ -3482,9 +3482,6 @@ Numer ekranu zależy od konfiguracji systemu – zaczyna się od 0. Ustawia domyślne wejście audio dla systemu (w tym domyślne urządzenie komunikacyjne). Wymaga nazwy urządzenia audio jako ładunku. - - Ignoruj okres karencji po przebudzeniu ze stanu hibernacji - Użyj nowoczesnej ikony w zasobniku diff --git a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.pt-br.resx b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.pt-br.resx index efa65bd2..b793b6ed 100644 --- a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.pt-br.resx +++ b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.pt-br.resx @@ -3418,9 +3418,6 @@ O número da tela depende da configuração do sistema – começa em 0. Define a entrada de áudio padrão para o sistema (incluindo o dispositivo de comunicação padrão). Você precisa do nome do dispositivo de áudio como carga útil. - - Ignorar o período de carência após sair da hibernação - Use o ícone moderno da bandeja diff --git a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.resx b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.resx index 97b13dc7..dfb1a9f9 100644 --- a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.resx +++ b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.resx @@ -3390,9 +3390,6 @@ Screen number depends on system configuration - starts at 0. Sets the default audio input for the system (including default communication device). Requires audio device name as a payload. - - Ignore grace period after waking up from hibernation - Use modern tray icon diff --git a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.ru.resx b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.ru.resx index 5092bec3..60efcf8a 100644 --- a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.ru.resx +++ b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.ru.resx @@ -3442,9 +3442,6 @@ Home Assistant. Устанавливает аудиовход по умолчанию для системы (включая устройство связи по умолчанию). В качестве полезной нагрузки требуется имя аудиоустройства. - - Игнорировать льготный период после выхода из спящего режима - Использовать современный значок в трее diff --git a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.sl.resx b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.sl.resx index b59e91c9..a7feaeb7 100644 --- a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.sl.resx +++ b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.sl.resx @@ -3521,9 +3521,6 @@ Zahteva ime zvočne naprave kot tovor. Nastavi privzeti zvočni vhod za sistem (vključno s privzeto komunikacijsko napravo). Ime zvočne naprave potrebujete kot obremenitev. - - Po prebujanju iz mirovanja prezrite obdobje odloga - Uporabi sodobno ikono pladnja diff --git a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.tr.resx b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.tr.resx index d2e9d83e..3e45b237 100644 --- a/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.tr.resx +++ b/src/HASS.Agent/HASS.Agent/Resources/Localization/Languages.tr.resx @@ -2988,9 +2988,6 @@ Ekran numarası sistem konfigürasyonuna bağlıdır - 0'dan başlar. Sistem için varsayılan ses girişini ayarlar (varsayılan iletişim cihazı dahil). Yük olarak ses cihazı adına ihtiyacınız vardır. - - Hazırda bekletme modundan uyandıktan sonra ek süreyi göz ardı et - Modern tepsi simgesini kullan