diff --git a/lib/aprsme_web/live/weather_live/callsign_view.ex b/lib/aprsme_web/live/weather_live/callsign_view.ex
index c932a6b..9be2f17 100644
--- a/lib/aprsme_web/live/weather_live/callsign_view.ex
+++ b/lib/aprsme_web/live/weather_live/callsign_view.ex
@@ -195,6 +195,20 @@ defmodule AprsmeWeb.WeatherLive.CallsignView do
rain_since_midnight: {&WeatherUnits.format_rain/2, " "}
}
+ @doc """
+ Checks if a weather field has a valid value (not nil, "N/A", or empty).
+ """
+ def has_weather_field?(packet, field) do
+ value = PacketUtils.get_weather_field(packet, field)
+
+ case value do
+ nil -> false
+ "N/A" -> false
+ "" -> false
+ _ -> true
+ end
+ end
+
@doc """
Formats weather values with appropriate units based on locale.
"""
@@ -202,8 +216,21 @@ defmodule AprsmeWeb.WeatherLive.CallsignView do
value = PacketUtils.get_weather_field(packet, key)
case value do
+ nil ->
+ nil
+
"N/A" ->
- "N/A"
+ nil
+
+ value when is_number(value) ->
+ case @weather_formatters[key] do
+ {formatter, separator} ->
+ {converted_value, unit} = formatter.(value, locale)
+ "#{converted_value}#{separator}#{unit}"
+
+ nil ->
+ "#{value}"
+ end
value when is_binary(value) ->
case @weather_formatters[key] do
@@ -214,12 +241,15 @@ defmodule AprsmeWeb.WeatherLive.CallsignView do
"#{converted_value}#{separator}#{unit}"
:error ->
- value
+ nil
end
nil ->
"#{value}"
end
+
+ _ ->
+ nil
end
end
end
diff --git a/lib/aprsme_web/live/weather_live/callsign_view.html.heex b/lib/aprsme_web/live/weather_live/callsign_view.html.heex
index bd5a66a..e87e743 100644
--- a/lib/aprsme_web/live/weather_live/callsign_view.html.heex
+++ b/lib/aprsme_web/live/weather_live/callsign_view.html.heex
@@ -86,58 +86,75 @@
<% end %>
-
-
{gettext("Temperature")}
-
- {format_weather_value(@weather_packet, :temperature, @locale)}
-
-
-
-
{gettext("Humidity")}
-
- {PacketUtils.get_weather_field(@weather_packet, :humidity)}%
-
-
-
-
{gettext("Wind")}
-
- {PacketUtils.get_weather_field(@weather_packet, :wind_direction)}° @ {format_weather_value(
- @weather_packet,
- :wind_speed,
- @locale
- )}
-
-
-
-
{gettext("Gusts")}
-
- {format_weather_value(@weather_packet, :wind_gust, @locale)}
-
-
-
-
{gettext("Pressure")}
-
- {PacketUtils.get_weather_field(@weather_packet, :pressure)} hPa
-
-
-
-
{gettext("Rain (1h)")}
-
- {format_weather_value(@weather_packet, :rain_1h, @locale)}
-
-
-
-
{gettext("Rain (24h)")}
-
- {format_weather_value(@weather_packet, :rain_24h, @locale)}
-
-
-
-
{gettext("Rain (since midnight)")}
-
- {format_weather_value(@weather_packet, :rain_since_midnight, @locale)}
-
-
+ <%= if has_weather_field?(@weather_packet, :temperature) do %>
+
+
{gettext("Temperature")}
+
+ {format_weather_value(@weather_packet, :temperature, @locale)}
+
+
+ <% end %>
+ <%= if has_weather_field?(@weather_packet, :humidity) do %>
+
+
{gettext("Humidity")}
+
+ {PacketUtils.get_weather_field(@weather_packet, :humidity)}%
+
+
+ <% end %>
+ <%= if has_weather_field?(@weather_packet, :wind_direction) || has_weather_field?(@weather_packet, :wind_speed) do %>
+
+
{gettext("Wind")}
+
+ <%= if has_weather_field?(@weather_packet, :wind_direction) do %>
+ {PacketUtils.get_weather_field(@weather_packet, :wind_direction)}°
+ <% end %>
+ <%= if has_weather_field?(@weather_packet, :wind_speed) do %>
+ @ {format_weather_value(@weather_packet, :wind_speed, @locale)}
+ <% end %>
+
+
+ <% end %>
+ <%= if has_weather_field?(@weather_packet, :wind_gust) do %>
+
+
{gettext("Gusts")}
+
+ {format_weather_value(@weather_packet, :wind_gust, @locale)}
+
+
+ <% end %>
+ <%= if has_weather_field?(@weather_packet, :pressure) do %>
+
+
{gettext("Pressure")}
+
+ {PacketUtils.get_weather_field(@weather_packet, :pressure)} hPa
+
+
+ <% end %>
+ <%= if has_weather_field?(@weather_packet, :rain_1h) do %>
+
+
{gettext("Rain (1h)")}
+
+ {format_weather_value(@weather_packet, :rain_1h, @locale)}
+
+
+ <% end %>
+ <%= if has_weather_field?(@weather_packet, :rain_24h) do %>
+
+
{gettext("Rain (24h)")}
+
+ {format_weather_value(@weather_packet, :rain_24h, @locale)}
+
+
+ <% end %>
+ <%= if has_weather_field?(@weather_packet, :rain_since_midnight) do %>
+
+
{gettext("Rain (since midnight)")}
+
+ {format_weather_value(@weather_packet, :rain_since_midnight, @locale)}
+
+
+ <% end %>
{gettext("Raw Packet")}