diff --git a/configurations/homie/modules/home-assistant/netdaemon/.version b/configurations/homie/modules/home-assistant/netdaemon/.version
index 9bdc9f23..21b0cea4 100644
--- a/configurations/homie/modules/home-assistant/netdaemon/.version
+++ b/configurations/homie/modules/home-assistant/netdaemon/.version
@@ -1 +1 @@
-25.10.0
+25.14.0
diff --git a/configurations/homie/modules/home-assistant/netdaemon/HomeAssistantGenerated b/configurations/homie/modules/home-assistant/netdaemon/HomeAssistantGenerated
index 40492764..f1c3a0e8 100644
--- a/configurations/homie/modules/home-assistant/netdaemon/HomeAssistantGenerated
+++ b/configurations/homie/modules/home-assistant/netdaemon/HomeAssistantGenerated
@@ -1,7 +1,7 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
-// Generated using NetDaemon CodeGenerator nd-codegen v25.10.0.0
-//   At: 2025-03-17T13:40:06.4067016-04:00
+// Generated using NetDaemon CodeGenerator nd-codegen v25.14.0.0
+//   At: 2025-04-13T14:46:15.2933502-04:00
 //
 // *** Make sure the version of the codegen tool and your nugets NetDaemon.* have the same version.***
 // You can use following command to keep it up to date with the latest version:
@@ -324,7 +324,7 @@ public partial class AssistSatelliteEntities
 
     /// <summary>Enumerates all assist_satellite entities currently registered (at runtime) in Home Assistant as AssistSatelliteEntity</summary>
     public IEnumerable<AssistSatelliteEntity> EnumerateAll() => _haContext.GetAllEntities().Where(e => e.EntityId.StartsWith("assist_satellite.")).Select(e => new AssistSatelliteEntity(e));
-    ///<summary>Assist satellite</summary>
+    ///<summary>M5Stack Atom Echo 31196c Assist satellite</summary>
     public AssistSatelliteEntity M5stackAtomEcho31196cAssistSatellite => new(_haContext, "assist_satellite.m5stack_atom_echo_31196c_assist_satellite");
 }
 
@@ -460,6 +460,7 @@ public partial class DeviceTrackerEntities
     public DeviceTrackerEntity Mc20001070702B39d => new(_haContext, "device_tracker.mc200_01_070702_b39d");
     public DeviceTrackerEntity Mc20001142816Ce44 => new(_haContext, "device_tracker.mc200_01_142816_ce44");
     public DeviceTrackerEntity Mc200011585562218 => new(_haContext, "device_tracker.mc200_01_158556_2218");
+    public DeviceTrackerEntity Mc200011595051493 => new(_haContext, "device_tracker.mc200_01_159505_1493");
     public DeviceTrackerEntity Mc20001177515458e => new(_haContext, "device_tracker.mc200_01_177515_458e");
     ///<summary>Pixel 8</summary>
     public DeviceTrackerEntity Pixel8 => new(_haContext, "device_tracker.pixel_8");
@@ -764,6 +765,8 @@ public partial class SensorEntities
     ///<summary>Estimated distance</summary>
     public NumericSensorEntity Mc200011585562218EstimatedDistance => new(_haContext, "sensor.mc200_01_158556_2218_estimated_distance");
     ///<summary>Estimated distance</summary>
+    public NumericSensorEntity Mc200011595051493EstimatedDistance => new(_haContext, "sensor.mc200_01_159505_1493_estimated_distance");
+    ///<summary>Estimated distance</summary>
     public NumericSensorEntity Mc20001177515458eEstimatedDistance => new(_haContext, "sensor.mc200_01_177515_458e_estimated_distance");
     ///<summary>Pixel 8 Battery level</summary>
     public NumericSensorEntity Pixel8BatteryLevel => new(_haContext, "sensor.pixel_8_battery_level");
@@ -1249,6 +1252,9 @@ public partial record MediaPlayerAttributes
 
     [JsonPropertyName("volume_step")]
     public double? VolumeStep { get; init; }
+
+    [JsonPropertyName("sp_play_time_remaining_est")]
+    public object? SpPlayTimeRemainingEst { get; init; }
 }
 
 public partial record AssistSatelliteEntity : Entity<AssistSatelliteEntity, EntityState<AssistSatelliteAttributes>, AssistSatelliteAttributes>
@@ -2861,7 +2867,7 @@ public partial class CastServices
 
     ///<summary>Shows a dashboard view on a Chromecast device.</summary>
     ///<param name="entityId">Media player entity to show the dashboard view on.</param>
-    ///<param name="dashboardPath">The URL path of the dashboard to show. eg: lovelace-cast</param>
+    ///<param name="dashboardPath">The URL path of the dashboard to show, defaults to lovelace if not specified. eg: lovelace-cast</param>
     ///<param name="viewPath">The URL path of the dashboard view to show. eg: downstairs</param>
     public void ShowLovelaceView(string entityId, string dashboardPath, string? viewPath = null)
     {
@@ -2875,7 +2881,7 @@ public partial record CastShowLovelaceViewParameters
     [JsonPropertyName("entity_id")]
     public string? EntityId { get; init; }
 
-    ///<summary>The URL path of the dashboard to show. eg: lovelace-cast</summary>
+    ///<summary>The URL path of the dashboard to show, defaults to lovelace if not specified. eg: lovelace-cast</summary>
     [JsonPropertyName("dashboard_path")]
     public string? DashboardPath { get; init; }
 
@@ -3366,39 +3372,39 @@ public partial class FfmpegServices
         _haContext = haContext;
     }
 
-    ///<summary>Sends a restart command to a ffmpeg based sensor.</summary>
+    ///<summary>Sends a restart command to an FFmpeg-based sensor.</summary>
     public void Restart(FfmpegRestartParameters data)
     {
         _haContext.CallService("ffmpeg", "restart", null, data);
     }
 
-    ///<summary>Sends a restart command to a ffmpeg based sensor.</summary>
+    ///<summary>Sends a restart command to an FFmpeg-based sensor.</summary>
     ///<param name="entityId">Name of entity that will restart. Platform dependent.</param>
     public void Restart(string? entityId = null)
     {
         _haContext.CallService("ffmpeg", "restart", null, new FfmpegRestartParameters { EntityId = entityId });
     }
 
-    ///<summary>Sends a start command to a ffmpeg based sensor.</summary>
+    ///<summary>Sends a start command to an FFmpeg-based sensor.</summary>
     public void Start(FfmpegStartParameters data)
     {
         _haContext.CallService("ffmpeg", "start", null, data);
     }
 
-    ///<summary>Sends a start command to a ffmpeg based sensor.</summary>
+    ///<summary>Sends a start command to an FFmpeg-based sensor.</summary>
     ///<param name="entityId">Name of entity that will start. Platform dependent.</param>
     public void Start(string? entityId = null)
     {
         _haContext.CallService("ffmpeg", "start", null, new FfmpegStartParameters { EntityId = entityId });
     }
 
-    ///<summary>Sends a stop command to a ffmpeg based sensor.</summary>
+    ///<summary>Sends a stop command to an FFmpeg-based sensor.</summary>
     public void Stop(FfmpegStopParameters data)
     {
         _haContext.CallService("ffmpeg", "stop", null, data);
     }
 
-    ///<summary>Sends a stop command to a ffmpeg based sensor.</summary>
+    ///<summary>Sends a stop command to an FFmpeg-based sensor.</summary>
     ///<param name="entityId">Name of entity that will stop. Platform dependent.</param>
     public void Stop(string? entityId = null)
     {
@@ -3481,7 +3487,7 @@ public partial class HomeassistantServices
         _haContext.CallService("homeassistant", "check_config", null, data);
     }
 
-    ///<summary>Reload all YAML configuration that can be reloaded without restarting Home Assistant.</summary>
+    ///<summary>Reloads all YAML configuration that can be reloaded without restarting Home Assistant.</summary>
     public void ReloadAll(object? data = null)
     {
         _haContext.CallService("homeassistant", "reload_all", null, data);
@@ -4691,7 +4697,7 @@ public partial class MqttServices
     ///<summary>Publishes a message to an MQTT topic.</summary>
     ///<param name="topic">Topic to publish to. eg: /homeassistant/hello</param>
     ///<param name="payload">The payload to publish. Publishes an empty message if not provided. eg: The temperature is {{ states(&apos;sensor.temperature&apos;) }}</param>
-    ///<param name="evaluatePayload">When `payload` is a Python bytes literal, evaluate the bytes literal and publish the raw data.</param>
+    ///<param name="evaluatePayload">If &apos;Payload&apos; is a Python bytes literal, evaluate the bytes literal and publish the raw data.</param>
     ///<param name="qos">Quality of Service to use. 0: At most once. 1: At least once. 2: Exactly once.</param>
     ///<param name="retain">If the message should have the retain flag set. If set, the broker stores the most recent message on a topic.</param>
     public void Publish(string topic, object? payload = null, bool? evaluatePayload = null, object? qos = null, bool? retain = null)
@@ -4727,7 +4733,7 @@ public partial record MqttPublishParameters
     [JsonPropertyName("payload")]
     public object? Payload { get; init; }
 
-    ///<summary>When `payload` is a Python bytes literal, evaluate the bytes literal and publish the raw data.</summary>
+    ///<summary>If &apos;Payload&apos; is a Python bytes literal, evaluate the bytes literal and publish the raw data.</summary>
     [JsonPropertyName("evaluate_payload")]
     public bool? EvaluatePayload { get; init; }
 
@@ -6838,6 +6844,38 @@ public partial class SpotifyplusServices
         return _haContext.CallServiceWithResponseAsync("spotifyplus", "get_featured_playlists", null, new SpotifyplusGetFeaturedPlaylistsParameters { EntityId = entityId, Limit = limit, Offset = offset, Country = country, Locale = locale, Timestamp = timestamp, LimitTotal = limitTotal, SortResult = sortResult });
     }
 
+    ///<summary>Get vibrant color palette values from the specified image source.</summary>
+    public void GetImageVibrantColors(SpotifyplusGetImageVibrantColorsParameters data)
+    {
+        _haContext.CallService("spotifyplus", "get_image_vibrant_colors", null, data);
+    }
+
+    ///<summary>Get vibrant color palette values from the specified image source.</summary>
+    ///<param name="entityId">Entity ID of the SpotifyPlus device that will make the request to the Spotify Web API. eg: media_player.spotifyplus_username</param>
+    ///<param name="imageSource">The image source to extract color palette information from.  If the prefix of the value is `http:` or `https:`, then the image is downloaded from the url.  This can also point to a filename on the local file system.  If null, the currently playing Spotify track image url is used.  Example = `https://i.scdn.co/image/ab67616d0000b2733deaee5f76ab2da15dd8db86`, `c:/image1.jpg` eg: https://i.scdn.co/image/ab67616d0000b2733deaee5f76ab2da15dd8db86</param>
+    ///<param name="colorCount">The number of colors in the initial palette from which swatches will be generated.  Default is 64; Range is 1 to 256. eg: 64</param>
+    ///<param name="colorQuality">Controls the processing time and quality of the palette generation.  A lower value (e.g. 1) results in higher quality but takes more processing time, while a higher value (e.g. 5) is faster but may result in a lower-quality palette.  Default is 5; Range is 1 to 10. eg: 5</param>
+    public void GetImageVibrantColors(string entityId, string? imageSource = null, double? colorCount = null, double? colorQuality = null)
+    {
+        _haContext.CallService("spotifyplus", "get_image_vibrant_colors", null, new SpotifyplusGetImageVibrantColorsParameters { EntityId = entityId, ImageSource = imageSource, ColorCount = colorCount, ColorQuality = colorQuality });
+    }
+
+    ///<summary>Get vibrant color palette values from the specified image source.</summary>
+    public Task<JsonElement?> GetImageVibrantColorsAsync(SpotifyplusGetImageVibrantColorsParameters data)
+    {
+        return _haContext.CallServiceWithResponseAsync("spotifyplus", "get_image_vibrant_colors", null, data);
+    }
+
+    ///<summary>Get vibrant color palette values from the specified image source.</summary>
+    ///<param name="entityId">Entity ID of the SpotifyPlus device that will make the request to the Spotify Web API. eg: media_player.spotifyplus_username</param>
+    ///<param name="imageSource">The image source to extract color palette information from.  If the prefix of the value is `http:` or `https:`, then the image is downloaded from the url.  This can also point to a filename on the local file system.  If null, the currently playing Spotify track image url is used.  Example = `https://i.scdn.co/image/ab67616d0000b2733deaee5f76ab2da15dd8db86`, `c:/image1.jpg` eg: https://i.scdn.co/image/ab67616d0000b2733deaee5f76ab2da15dd8db86</param>
+    ///<param name="colorCount">The number of colors in the initial palette from which swatches will be generated.  Default is 64; Range is 1 to 256. eg: 64</param>
+    ///<param name="colorQuality">Controls the processing time and quality of the palette generation.  A lower value (e.g. 1) results in higher quality but takes more processing time, while a higher value (e.g. 5) is faster but may result in a lower-quality palette.  Default is 5; Range is 1 to 10. eg: 5</param>
+    public Task<JsonElement?> GetImageVibrantColorsAsync(string entityId, string? imageSource = null, double? colorCount = null, double? colorQuality = null)
+    {
+        return _haContext.CallServiceWithResponseAsync("spotifyplus", "get_image_vibrant_colors", null, new SpotifyplusGetImageVibrantColorsParameters { EntityId = entityId, ImageSource = imageSource, ColorCount = colorCount, ColorQuality = colorQuality });
+    }
+
     ///<summary>Get information about a user&apos;s available Spotify Connect player devices.  Some device models are not supported and will not be listed in the API response.</summary>
     public void GetPlayerDevices(SpotifyplusGetPlayerDevicesParameters data)
     {
@@ -7358,6 +7396,34 @@ public partial class SpotifyplusServices
         return _haContext.CallServiceWithResponseAsync("spotifyplus", "get_track", null, new SpotifyplusGetTrackParameters { EntityId = entityId, TrackId = trackId });
     }
 
+    ///<summary>Get audio feature information for a single track identified by its unique Spotify ID.</summary>
+    public void GetTrackAudioFeatures(SpotifyplusGetTrackAudioFeaturesParameters data)
+    {
+        _haContext.CallService("spotifyplus", "get_track_audio_features", null, data);
+    }
+
+    ///<summary>Get audio feature information for a single track identified by its unique Spotify ID.</summary>
+    ///<param name="entityId">Entity ID of the SpotifyPlus device that will make the request to the Spotify Web API. eg: media_player.spotifyplus_username</param>
+    ///<param name="trackId">The Spotify ID of the track.  Example = `1kWUud3vY5ij5r62zxpTRy`.  If null, the currently playing track uri id value is used. eg: 7ouMYWpwJ422jRcDASZB7P</param>
+    public void GetTrackAudioFeatures(string entityId, string? trackId = null)
+    {
+        _haContext.CallService("spotifyplus", "get_track_audio_features", null, new SpotifyplusGetTrackAudioFeaturesParameters { EntityId = entityId, TrackId = trackId });
+    }
+
+    ///<summary>Get audio feature information for a single track identified by its unique Spotify ID.</summary>
+    public Task<JsonElement?> GetTrackAudioFeaturesAsync(SpotifyplusGetTrackAudioFeaturesParameters data)
+    {
+        return _haContext.CallServiceWithResponseAsync("spotifyplus", "get_track_audio_features", null, data);
+    }
+
+    ///<summary>Get audio feature information for a single track identified by its unique Spotify ID.</summary>
+    ///<param name="entityId">Entity ID of the SpotifyPlus device that will make the request to the Spotify Web API. eg: media_player.spotifyplus_username</param>
+    ///<param name="trackId">The Spotify ID of the track.  Example = `1kWUud3vY5ij5r62zxpTRy`.  If null, the currently playing track uri id value is used. eg: 7ouMYWpwJ422jRcDASZB7P</param>
+    public Task<JsonElement?> GetTrackAudioFeaturesAsync(string entityId, string? trackId = null)
+    {
+        return _haContext.CallServiceWithResponseAsync("spotifyplus", "get_track_audio_features", null, new SpotifyplusGetTrackAudioFeaturesParameters { EntityId = entityId, TrackId = trackId });
+    }
+
     ///<summary>Get a list of the tracks saved in the current Spotify user&apos;s &apos;Your Library&apos;.</summary>
     public void GetTrackFavorites(SpotifyplusGetTrackFavoritesParameters data)
     {
@@ -8461,6 +8527,19 @@ public partial class SpotifyplusServices
         _haContext.CallService("spotifyplus", "test_token_expire", null, new SpotifyplusTestTokenExpireParameters { EntityId = entityId });
     }
 
+    ///<summary>Triggers a scan interval sequence, which will update HA State values from content currently being played on the user&apos;s Spotify account.</summary>
+    public void TriggerScanInterval(SpotifyplusTriggerScanIntervalParameters data)
+    {
+        _haContext.CallService("spotifyplus", "trigger_scan_interval", null, data);
+    }
+
+    ///<summary>Triggers a scan interval sequence, which will update HA State values from content currently being played on the user&apos;s Spotify account.</summary>
+    ///<param name="entityId">Entity ID of the SpotifyPlus device that will make the request to the Spotify Web API. eg: media_player.spotifyplus_username</param>
+    public void TriggerScanInterval(string entityId)
+    {
+        _haContext.CallService("spotifyplus", "trigger_scan_interval", null, new SpotifyplusTriggerScanIntervalParameters { EntityId = entityId });
+    }
+
     ///<summary>Remove the current user as a follower of one or more artists.</summary>
     public void UnfollowArtists(SpotifyplusUnfollowArtistsParameters data)
     {
@@ -8511,7 +8590,7 @@ public partial class SpotifyplusServices
 
     ///<summary>Set level used for volume step services.</summary>
     ///<param name="entityId">Entity ID of the SpotifyPlus device that will make the request to the Spotify Web API. eg: media_player.spotifyplus_username</param>
-    ///<param name="level">Level percentage to adjust the volume by. Default is 0.1, range is 0.1 to 1.0. eg: 0.05</param>
+    ///<param name="level">Level percentage to adjust the volume by. Default is 0.10 (e.g. 10 percent), range is 0.01 to 1.00 (e.g. 1 to 100 percent). eg: 0.05</param>
     public void VolumeSetStep(string entityId, double? level = null)
     {
         _haContext.CallService("spotifyplus", "volume_set_step", null, new SpotifyplusVolumeSetStepParameters { EntityId = entityId, Level = level });
@@ -9248,6 +9327,25 @@ public partial record SpotifyplusGetFeaturedPlaylistsParameters
     public bool? SortResult { get; init; }
 }
 
+public partial record SpotifyplusGetImageVibrantColorsParameters
+{
+    ///<summary>Entity ID of the SpotifyPlus device that will make the request to the Spotify Web API. eg: media_player.spotifyplus_username</summary>
+    [JsonPropertyName("entity_id")]
+    public string? EntityId { get; init; }
+
+    ///<summary>The image source to extract color palette information from.  If the prefix of the value is `http:` or `https:`, then the image is downloaded from the url.  This can also point to a filename on the local file system.  If null, the currently playing Spotify track image url is used.  Example = `https://i.scdn.co/image/ab67616d0000b2733deaee5f76ab2da15dd8db86`, `c:/image1.jpg` eg: https://i.scdn.co/image/ab67616d0000b2733deaee5f76ab2da15dd8db86</summary>
+    [JsonPropertyName("image_source")]
+    public string? ImageSource { get; init; }
+
+    ///<summary>The number of colors in the initial palette from which swatches will be generated.  Default is 64; Range is 1 to 256. eg: 64</summary>
+    [JsonPropertyName("color_count")]
+    public double? ColorCount { get; init; }
+
+    ///<summary>Controls the processing time and quality of the palette generation.  A lower value (e.g. 1) results in higher quality but takes more processing time, while a higher value (e.g. 5) is faster but may result in a lower-quality palette.  Default is 5; Range is 1 to 10. eg: 5</summary>
+    [JsonPropertyName("color_quality")]
+    public double? ColorQuality { get; init; }
+}
+
 public partial record SpotifyplusGetPlayerDevicesParameters
 {
     ///<summary>Entity ID of the SpotifyPlus device that will make the request to the Spotify Web API. eg: media_player.spotifyplus_username</summary>
@@ -9568,6 +9666,17 @@ public partial record SpotifyplusGetTrackParameters
     public string? TrackId { get; init; }
 }
 
+public partial record SpotifyplusGetTrackAudioFeaturesParameters
+{
+    ///<summary>Entity ID of the SpotifyPlus device that will make the request to the Spotify Web API. eg: media_player.spotifyplus_username</summary>
+    [JsonPropertyName("entity_id")]
+    public string? EntityId { get; init; }
+
+    ///<summary>The Spotify ID of the track.  Example = `1kWUud3vY5ij5r62zxpTRy`.  If null, the currently playing track uri id value is used. eg: 7ouMYWpwJ422jRcDASZB7P</summary>
+    [JsonPropertyName("track_id")]
+    public string? TrackId { get; init; }
+}
+
 public partial record SpotifyplusGetTrackFavoritesParameters
 {
     ///<summary>Entity ID of the SpotifyPlus device that will make the request to the Spotify Web API. eg: media_player.spotifyplus_username</summary>
@@ -10609,6 +10718,13 @@ public partial record SpotifyplusTestTokenExpireParameters
     public string? EntityId { get; init; }
 }
 
+public partial record SpotifyplusTriggerScanIntervalParameters
+{
+    ///<summary>Entity ID of the SpotifyPlus device that will make the request to the Spotify Web API. eg: media_player.spotifyplus_username</summary>
+    [JsonPropertyName("entity_id")]
+    public string? EntityId { get; init; }
+}
+
 public partial record SpotifyplusUnfollowArtistsParameters
 {
     ///<summary>Entity ID of the SpotifyPlus device that will make the request to the Spotify Web API. eg: media_player.spotifyplus_username</summary>
@@ -10648,7 +10764,7 @@ public partial record SpotifyplusVolumeSetStepParameters
     [JsonPropertyName("entity_id")]
     public string? EntityId { get; init; }
 
-    ///<summary>Level percentage to adjust the volume by. Default is 0.1, range is 0.1 to 1.0. eg: 0.05</summary>
+    ///<summary>Level percentage to adjust the volume by. Default is 0.10 (e.g. 10 percent), range is 0.01 to 1.00 (e.g. 1 to 100 percent). eg: 0.05</summary>
     [JsonPropertyName("level")]
     public double? Level { get; init; }
 }
diff --git a/configurations/homie/modules/home-assistant/netdaemon/deps.json b/configurations/homie/modules/home-assistant/netdaemon/deps.json
index 3d6a0655..f1bb6b59 100644
--- a/configurations/homie/modules/home-assistant/netdaemon/deps.json
+++ b/configurations/homie/modules/home-assistant/netdaemon/deps.json
@@ -1,8 +1,8 @@
 [
   {
     "pname": "Cronos",
-    "version": "0.9.0",
-    "hash": "sha256-yDYBfqSXqvT/VPUf6UT3XOgqqPmOMYqhjCBxpF5i15c="
+    "version": "0.10.0",
+    "hash": "sha256-Y5R1QfcxuL8F3l0bjv+Tpcdj/fdWw6o8Bhkx1FcBLYQ="
   },
   {
     "pname": "FuzzySharp",
@@ -26,13 +26,13 @@
   },
   {
     "pname": "Microsoft.Extensions.Configuration",
-    "version": "9.0.3",
-    "hash": "sha256-p1KEkbl1h3dJkBZQUMK2Jt1vbm/NGIHqLEr7QrLYIbg="
+    "version": "9.0.4",
+    "hash": "sha256-01yWDq/dHgU1Trx2OqVsXK/yobwVTClJXB07LrPc8lU="
   },
   {
     "pname": "Microsoft.Extensions.Configuration.Abstractions",
-    "version": "9.0.3",
-    "hash": "sha256-OjL0pzW+Wsp0KSrqawYHdtIf8w0XqvY8USEbptgP6dI="
+    "version": "9.0.4",
+    "hash": "sha256-5hwq73FCWAJJ8Yb1VHaaryJJhUUiVsetPTrPLlo8N9o="
   },
   {
     "pname": "Microsoft.Extensions.Configuration.Binder",
@@ -41,38 +41,38 @@
   },
   {
     "pname": "Microsoft.Extensions.Configuration.Binder",
-    "version": "9.0.3",
-    "hash": "sha256-KxYOzATIl0qI8MScHL9BYsCB3dvqoNDCrraiquBHMVs="
+    "version": "9.0.4",
+    "hash": "sha256-l+qlHrdrqgvnveSMCO4qQx1QObAe5lMl80a4Kc3idzw="
   },
   {
     "pname": "Microsoft.Extensions.Configuration.CommandLine",
-    "version": "9.0.3",
-    "hash": "sha256-0z+CJuEuYc4SFBGxwXckB/HgTEmgr+ywsnU6T1C66Mw="
+    "version": "9.0.4",
+    "hash": "sha256-usXy7P5VIBusWSmI1WxpXwwDN404TTZveBoUAlJRWEQ="
   },
   {
     "pname": "Microsoft.Extensions.Configuration.EnvironmentVariables",
-    "version": "9.0.3",
-    "hash": "sha256-YvePNihtcG6L8d7Eql411e8spMOBsRpB0iwQg9itNG4="
+    "version": "9.0.4",
+    "hash": "sha256-9agLzJpXM8i24WSB2pIGaIkQL9fyuIBGK14a1jpH/Vk="
   },
   {
     "pname": "Microsoft.Extensions.Configuration.FileExtensions",
-    "version": "9.0.3",
-    "hash": "sha256-DjGT2t5/MS/iKkZDFyjnFdm+JJe6yW80tJKTttbjQXQ="
+    "version": "9.0.4",
+    "hash": "sha256-i6BP99iTLEVt7aSw2Fu0ogUnY6FlVMat+BMIlndHCkQ="
   },
   {
     "pname": "Microsoft.Extensions.Configuration.Json",
-    "version": "9.0.3",
-    "hash": "sha256-OJkergyDbEuCbycoqClt1Sbrc533NHIFsoldJN7jzuw="
+    "version": "9.0.4",
+    "hash": "sha256-scTrZeY5CKX9kMcN7MYQPJVgEFwDTvO+JOk+G3wXrjs="
   },
   {
     "pname": "Microsoft.Extensions.Configuration.UserSecrets",
-    "version": "9.0.3",
-    "hash": "sha256-x+6bybeuD4GPwAael14uCUeKduXPm5oYygeTshc44vg="
+    "version": "9.0.4",
+    "hash": "sha256-gEYqIFucwNp+4paaEjNkiqGCDG09etqVa8UcclNU17g="
   },
   {
     "pname": "Microsoft.Extensions.DependencyInjection",
-    "version": "9.0.3",
-    "hash": "sha256-/gAk+YbJT1/XjMfPBrEg9wUbljA0g1vFJuE+mFOPwV0="
+    "version": "9.0.4",
+    "hash": "sha256-ck7PqIL/3vodYky+d7YX218n+detOoEjZeMr1EqTFPg="
   },
   {
     "pname": "Microsoft.Extensions.DependencyInjection.Abstractions",
@@ -81,8 +81,8 @@
   },
   {
     "pname": "Microsoft.Extensions.DependencyInjection.Abstractions",
-    "version": "9.0.3",
-    "hash": "sha256-90HSc8MgyemdtRTBN7Indq62DRaqI2mjai9iV/pi/o4="
+    "version": "9.0.4",
+    "hash": "sha256-6WcGpsAYRhrpHloEom0oVP7Ff4Gh/O1XWJETJJ3LvEQ="
   },
   {
     "pname": "Microsoft.Extensions.DependencyModel",
@@ -91,33 +91,33 @@
   },
   {
     "pname": "Microsoft.Extensions.Diagnostics",
-    "version": "9.0.3",
-    "hash": "sha256-QE0N1+LrQ+/msQXuv1oEi/MewRiNwsTPY1t4iqqgRAc="
+    "version": "9.0.4",
+    "hash": "sha256-fmRuxerdHGVDFFJMpBv9DIzofBSxjLLsi1GvaGq1dUc="
   },
   {
     "pname": "Microsoft.Extensions.Diagnostics.Abstractions",
-    "version": "9.0.3",
-    "hash": "sha256-9JS73UfRg7iLAHmWWzR2eWy5/C/rUXmi5kovp8PPPWA="
+    "version": "9.0.4",
+    "hash": "sha256-VgBfZLr/tqAOCW3i8g8lTgdpLU/g5vHfcOUpyoQESig="
   },
   {
     "pname": "Microsoft.Extensions.FileProviders.Abstractions",
-    "version": "9.0.3",
-    "hash": "sha256-tDQKHWti1NDgBx0HaHUHJzw9QGjLW/gBJwzJHD6K/S0="
+    "version": "9.0.4",
+    "hash": "sha256-OkAq+1NUG0d1Ww6zT/hZWcPB5+fCr8AJIWmkpX7CQxU="
   },
   {
     "pname": "Microsoft.Extensions.FileProviders.Physical",
-    "version": "9.0.3",
-    "hash": "sha256-whUFED9ESf4gj9/BQzE/L4fsaCg/KIJqiO8dS9TZgNw="
+    "version": "9.0.4",
+    "hash": "sha256-whn/jRYaH56Lha20yChG5wgIllttTq2EtOwyDW+ZDO4="
   },
   {
     "pname": "Microsoft.Extensions.FileSystemGlobbing",
-    "version": "9.0.3",
-    "hash": "sha256-zmhFxXHNHD3zD/RM5OhrWZ9r8jttQei5cuN3R16zOH8="
+    "version": "9.0.4",
+    "hash": "sha256-lzNTCxATfJvnsl1hlAxhI4cibixYYBq99fK9b9tEo0A="
   },
   {
     "pname": "Microsoft.Extensions.Hosting",
-    "version": "9.0.3",
-    "hash": "sha256-Qxz6Lva9KSBUosj3t6UYFS9szJCBsoB1um7h+iIxBGM="
+    "version": "9.0.4",
+    "hash": "sha256-qb3bcAbLnBvc91p/+C6K7P8g2Fd9yRVvPOvIzGFSu/g="
   },
   {
     "pname": "Microsoft.Extensions.Hosting.Abstractions",
@@ -126,13 +126,13 @@
   },
   {
     "pname": "Microsoft.Extensions.Hosting.Abstractions",
-    "version": "9.0.3",
-    "hash": "sha256-fHVKYwO7bJ+9ZQmPxxYcMahR/v28dhJzg77BPiOLbAI="
+    "version": "9.0.4",
+    "hash": "sha256-eEw2h6S0m8Wb52hWo/31uCA5NQbPn/7veYpzNhkzyl0="
   },
   {
     "pname": "Microsoft.Extensions.Http",
-    "version": "9.0.3",
-    "hash": "sha256-Hjl8xEwZc3nzyq5I0YJ3fNRyhQFhhvJxWuSxO1g/yDE="
+    "version": "9.0.4",
+    "hash": "sha256-gciOa0FAKivI5f/dzbsbS5HniIx9TJ4BTeBZ9In+fAo="
   },
   {
     "pname": "Microsoft.Extensions.Logging",
@@ -141,8 +141,8 @@
   },
   {
     "pname": "Microsoft.Extensions.Logging",
-    "version": "9.0.3",
-    "hash": "sha256-w1cKHraJW+i7avhTseoJ+u0parEAJ7r51E2qvsuXZDA="
+    "version": "9.0.4",
+    "hash": "sha256-Vj+NGOamKeuMrLNUWlVKFFkz7IKGIv6h1A5X4CK9D5E="
   },
   {
     "pname": "Microsoft.Extensions.Logging.Abstractions",
@@ -151,93 +151,93 @@
   },
   {
     "pname": "Microsoft.Extensions.Logging.Abstractions",
-    "version": "9.0.3",
-    "hash": "sha256-f/K3A9NPpCOTGlyha5DJf+OIjfAVWu+dJ4rAqQ+3sso="
+    "version": "9.0.4",
+    "hash": "sha256-n0ZRhQ7U/5Kv1hVqUXGoa5gfrhzcy77yFhfonjq6VFc="
   },
   {
     "pname": "Microsoft.Extensions.Logging.Configuration",
-    "version": "9.0.3",
-    "hash": "sha256-u9Un3Bc+Cbj2E8u2etU+KPPv3IbCKgCAY/SCAGK6+LE="
+    "version": "9.0.4",
+    "hash": "sha256-WzinyQZzj7ty00RrCGsGxwDYJlsta74M5UP0ajGTWCE="
   },
   {
     "pname": "Microsoft.Extensions.Logging.Console",
-    "version": "9.0.3",
-    "hash": "sha256-bDHxUjuO4d63GXbDoD9Hdo8AvAke0/r38hzctAWQUqc="
+    "version": "9.0.4",
+    "hash": "sha256-tofh2lKZm+FvMp0Fx9JOXltOpDSutbGLhspdAM27USQ="
   },
   {
     "pname": "Microsoft.Extensions.Logging.Debug",
-    "version": "9.0.3",
-    "hash": "sha256-6BHyJWgaIF3HiwD3mAzhYmqNdDYoOrvKvpL2nkCEoJA="
+    "version": "9.0.4",
+    "hash": "sha256-W1L3jKzyeyTli94+N/Di3YtYtfv9usDFdtEnJUzvF+c="
   },
   {
     "pname": "Microsoft.Extensions.Logging.EventLog",
-    "version": "9.0.3",
-    "hash": "sha256-V7GTnl5AN30H62mBKL5S52n5LGycHI1V3tfa5t5xcrA="
+    "version": "9.0.4",
+    "hash": "sha256-TQkN+RM5qSHMM4WxXTbEbK5I2j8aBoC/3YvtjBA0gG8="
   },
   {
     "pname": "Microsoft.Extensions.Logging.EventSource",
-    "version": "9.0.3",
-    "hash": "sha256-WJ2DfDPI58fshDpK8TR3LwYLnVmMN2pW927fOzQIQX0="
+    "version": "9.0.4",
+    "hash": "sha256-fp+/DPSm7gb34634p7ADtMQh8ascCE8ny0A1fCDdQfY="
   },
   {
     "pname": "Microsoft.Extensions.Options",
-    "version": "9.0.3",
-    "hash": "sha256-h4CLVA1cZdte8hd/bcb5dsi61MhAAScHRZU4LR2W5Z8="
+    "version": "9.0.4",
+    "hash": "sha256-QyjtRCG+L9eyH/UWHf/S+7/ZiSOmuGNoKGO9nlXmjxI="
   },
   {
     "pname": "Microsoft.Extensions.Options.ConfigurationExtensions",
-    "version": "9.0.3",
-    "hash": "sha256-FjYrMjnkEplPTYoHUVU94zXIuVsjL5AcGHb/zYkh138="
+    "version": "9.0.4",
+    "hash": "sha256-fhI6GGzVC5edaS/QEdl+2WL8/P6u/+wyq9nkLW17X64="
   },
   {
     "pname": "Microsoft.Extensions.Primitives",
-    "version": "9.0.3",
-    "hash": "sha256-iBwolNt6Lb2OqjDWBVnUj8vZDSID9EQw/JPI1xcuFus="
+    "version": "9.0.4",
+    "hash": "sha256-v/Ygyo1TMTUbnhdQSV2wzD4FOgAEWd1mpESo3kZ557g="
   },
   {
     "pname": "NetDaemon.AppModel",
-    "version": "25.10.0",
-    "hash": "sha256-w/8c8aJ5lECUostbTu1CvNTXsiUJAdNtDgOwE+uN/UI="
+    "version": "25.14.0",
+    "hash": "sha256-RqEOhacR+59wdEKAd1D520uPy23CRXmLQxtD/hPvcu0="
   },
   {
     "pname": "NetDaemon.AppModel.SourceDeployedApps",
-    "version": "25.10.0",
-    "hash": "sha256-z5QFepPMgr6d1epflotWE+HdMuNv2Yqwls4GOqs7imU="
+    "version": "25.14.0",
+    "hash": "sha256-XODlBGMWsHxN9dNoWsgSwE0yJCQGDnyKV32AYBL+j+4="
   },
   {
     "pname": "NetDaemon.Client",
-    "version": "25.10.0",
-    "hash": "sha256-TnqNlTd+drun0uTKcBtiFI8OCOqZOdpn2c1trUaJ0PM="
+    "version": "25.14.0",
+    "hash": "sha256-tUY4eROBFTClXhci2kc8kPLSTZ9stp/dF63h9G+MJg4="
   },
   {
     "pname": "NetDaemon.Extensions.Logging",
-    "version": "25.10.0",
-    "hash": "sha256-TTl73Ujhz+GaB/Muzn7Fn6hFTDNzho9+wT+B7RVRuok="
+    "version": "25.14.0",
+    "hash": "sha256-f2FFwx0iC7Tkxv/P+1gldvzeTgUl7L2rNURk5wnVjFk="
   },
   {
     "pname": "NetDaemon.Extensions.Scheduling",
-    "version": "25.10.0",
-    "hash": "sha256-WbqCc54WdlJPWhAgQTW5kt5yQ79rNLzTcnPZ0OdfaOU="
+    "version": "25.14.0",
+    "hash": "sha256-+QYyW8Pmob7a5A6ViI/WSpnWr88ql/Z9arr42c48Iec="
   },
   {
     "pname": "NetDaemon.Extensions.Tts",
-    "version": "25.10.0",
-    "hash": "sha256-U74jbDOXm0O0LOK7HMxREDx5MrJn7h5aoOJSCxepVQs="
+    "version": "25.14.0",
+    "hash": "sha256-jwY4P1veQHSmYjp5hGifDGzlohrZeNXEj9DFh1cdrBc="
   },
   {
     "pname": "NetDaemon.HassModel",
-    "version": "25.10.0",
-    "hash": "sha256-/n2kVDwVrYOMDB9FrI/umTPcFWIichnrD3tIQhzpAN8="
+    "version": "25.14.0",
+    "hash": "sha256-dbmf4RM3MJ2z/S4Sev6GGQitW25KTGPE3RajJsvXFGg="
   },
   {
     "pname": "NetDaemon.HassModel.Integration",
-    "version": "25.10.0",
-    "hash": "sha256-2FIf9FwTOe308a+N6zEd3OGPpp8BbHdNLga6XyCKemo="
+    "version": "25.14.0",
+    "hash": "sha256-jc1LbrAi3y0OoltcDWmJED16DDw0m+YSSEN/3GDiwSI="
   },
   {
     "pname": "NetDaemon.Runtime",
-    "version": "25.10.0",
-    "hash": "sha256-lyAhLhu6v++Y1sKSd7BiWmDioIqA/noY3zJOVbxeX14="
+    "version": "25.14.0",
+    "hash": "sha256-erU1iZOwq7lmkDyctiiC9Yl9hw3ZUgx8t0Q94sHjJZA="
   },
   {
     "pname": "Serilog",
@@ -296,13 +296,13 @@
   },
   {
     "pname": "System.Diagnostics.EventLog",
-    "version": "9.0.3",
-    "hash": "sha256-wtDQ7MXGFuqjKJgfcvkosxjjxBd4e6rR9/H0jUS8PlM="
+    "version": "9.0.4",
+    "hash": "sha256-afF72ywJo/vfJXt2XiI8Lf2zKcvn0F/p280P1w3Fmk4="
   },
   {
     "pname": "System.IO.Pipelines",
-    "version": "9.0.3",
-    "hash": "sha256-JV50VXnofGfL8lB/vNIpJstoBJper9tsXcjNFwGqL68="
+    "version": "9.0.4",
+    "hash": "sha256-4E3H0n6UloSxvN41xi7hltJb9+hfaFbqwb/eOQOfNsI="
   },
   {
     "pname": "System.Reactive",
diff --git a/configurations/homie/modules/home-assistant/netdaemon/images/netdaemon.nix b/configurations/homie/modules/home-assistant/netdaemon/images/netdaemon.nix
index c55a8997..90369e4d 100644
--- a/configurations/homie/modules/home-assistant/netdaemon/images/netdaemon.nix
+++ b/configurations/homie/modules/home-assistant/netdaemon/images/netdaemon.nix
@@ -1,8 +1,8 @@
 pkgs:
 pkgs.dockerTools.pullImage rec {
   imageName = "netdaemon/netdaemon5";
-  imageDigest = "sha256:3290c3a8112e0abb076d9a16e1b20e31c5a97e425cb4578e7406007f443dccb5";
-  hash = "sha256-W/MlJejTpHsJfF+JyUKYKFoSUhvSS827IWpjYZQ0Tj0=";
+  imageDigest = "sha256:f1685239cd48f3d728f393d86975f954a954e2f64bad197cb534a66fafaddd55";
+  hash = "sha256-KF6QLKuO8O2jE70dOprE8lfCnXvbhfk2XYp76pGXujE=";
   finalImageName = imageName;
-  finalImageTag = "25.10.0";
+  finalImageTag = "25.14.0";
 }
diff --git a/configurations/homie/modules/home-assistant/netdaemon/netdaemon.csproj b/configurations/homie/modules/home-assistant/netdaemon/netdaemon.csproj
index a7359d39..4e26c536 100644
--- a/configurations/homie/modules/home-assistant/netdaemon/netdaemon.csproj
+++ b/configurations/homie/modules/home-assistant/netdaemon/netdaemon.csproj
@@ -24,15 +24,15 @@
     </Target>
 
     <ItemGroup>
-        <PackageReference Include="NetDaemon.AppModel" Version="25.10.0" />
-        <PackageReference Include="NetDaemon.AppModel.SourceDeployedApps" Version="25.10.0" />
-        <PackageReference Include="NetDaemon.Runtime" Version="25.10.0" />
-        <PackageReference Include="NetDaemon.HassModel" Version="25.10.0" />
-        <PackageReference Include="NetDaemon.HassModel.Integration" Version="25.10.0" />
-        <PackageReference Include="NetDaemon.Client" Version="25.10.0" />
-        <PackageReference Include="NetDaemon.Extensions.Scheduling" Version="25.10.0" />
-        <PackageReference Include="NetDaemon.Extensions.Logging" Version="25.10.0" />
-        <PackageReference Include="NetDaemon.Extensions.Tts" Version="25.10.0" />
+        <PackageReference Include="NetDaemon.AppModel" Version="25.14.0" />
+        <PackageReference Include="NetDaemon.AppModel.SourceDeployedApps" Version="25.14.0" />
+        <PackageReference Include="NetDaemon.Runtime" Version="25.14.0" />
+        <PackageReference Include="NetDaemon.HassModel" Version="25.14.0" />
+        <PackageReference Include="NetDaemon.HassModel.Integration" Version="25.14.0" />
+        <PackageReference Include="NetDaemon.Client" Version="25.14.0" />
+        <PackageReference Include="NetDaemon.Extensions.Scheduling" Version="25.14.0" />
+        <PackageReference Include="NetDaemon.Extensions.Logging" Version="25.14.0" />
+        <PackageReference Include="NetDaemon.Extensions.Tts" Version="25.14.0" />
         <PackageReference Include="FuzzySharp" Version="2.0.2" />
     </ItemGroup>
 </Project>