diff --git a/lib/aprsme/packet.ex b/lib/aprsme/packet.ex index 63e566d..38f36df 100644 --- a/lib/aprsme/packet.ex +++ b/lib/aprsme/packet.ex @@ -296,12 +296,39 @@ defmodule Aprsme.Packet do data_extended end - %{} - |> put_symbol_fields(combined_data) - |> extract_weather_data(combined_data) - |> put_weather_fields(combined_data) - |> put_equipment_fields(combined_data) - |> put_message_fields(combined_data) + result = + %{} + |> put_symbol_fields(combined_data) + |> extract_weather_data(combined_data) + |> put_weather_fields(combined_data) + |> put_equipment_fields(combined_data) + |> put_message_fields(combined_data) + + # If any weather fields are present, set data_type to "weather" + weather_fields = [ + :temperature, + :humidity, + :wind_speed, + :wind_direction, + :wind_gust, + :pressure, + :rain_1h, + :rain_24h, + :rain_since_midnight, + :snow + ] + + has_weather = + Enum.any?(weather_fields, fn field -> + v = result[field] || result[to_string(field)] + not is_nil(v) + end) + + if has_weather and (result[:data_type] != "weather" and result["data_type"] != "weather") do + Map.put(result, :data_type, "weather") + else + result + end end defp put_symbol_fields(map, data_extended) do diff --git a/lib/aprsme/packets.ex b/lib/aprsme/packets.ex index ecd3675..c94a528 100644 --- a/lib/aprsme/packets.ex +++ b/lib/aprsme/packets.ex @@ -413,7 +413,7 @@ defmodule Aprsme.Packets do def get_weather_packets(callsign, start_time, end_time, opts \\ %{}) do limit = Map.get(opts, :limit, 500) - base_query = from(p in Packet, order_by: [asc: p.received_at]) + base_query = from(p in Packet, order_by: [desc: p.received_at]) query = base_query diff --git a/lib/aprsme_web/live/weather_live/callsign_view.ex b/lib/aprsme_web/live/weather_live/callsign_view.ex index 99ef422..f75243f 100644 --- a/lib/aprsme_web/live/weather_live/callsign_view.ex +++ b/lib/aprsme_web/live/weather_live/callsign_view.ex @@ -48,10 +48,13 @@ defmodule AprsmeWeb.WeatherLive.CallsignView do end defp get_latest_weather_packet(callsign) do - # Get the most recent packet for this callsign that is a weather report - %{callsign: callsign, limit: 10} - |> Packets.get_recent_packets() - |> Enum.find(&PacketUtils.weather_packet?/1) + # Get weather packets from the last 7 days to find the most recent one + end_time = DateTime.utc_now() + start_time = DateTime.add(end_time, -7 * 24 * 3600, :second) + + callsign + |> Packets.get_weather_packets(start_time, end_time, %{limit: 1}) + |> List.first() end defp get_weather_history(callsign, start_time, end_time) do 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 e546bc1..9f66fad 100644 --- a/lib/aprsme_web/live/weather_live/callsign_view.html.heex +++ b/lib/aprsme_web/live/weather_live/callsign_view.html.heex @@ -1,158 +1,245 @@ <%= if @weather_packet do %> -