aprs.me/lib/parser/weather_helpers.ex
2025-06-23 10:53:34 -05:00

116 lines
3.1 KiB
Elixir

defmodule Parser.WeatherHelpers do
@moduledoc """
Weather field extraction helpers for APRS.
"""
@spec extract_timestamp(String.t()) :: String.t() | nil
def extract_timestamp(weather_data) do
case Regex.run(~r/^(\d{6}[hz\/])/, weather_data) do
[_, timestamp] -> timestamp
nil -> nil
end
end
@spec remove_timestamp(String.t()) :: String.t()
def remove_timestamp(weather_data) do
case Regex.run(~r/^\d{6}[hz\/]/, weather_data) do
[timestamp] -> String.replace(weather_data, timestamp, "")
nil -> weather_data
end
end
@spec parse_wind_direction(String.t()) :: integer() | nil
def parse_wind_direction(weather_data) do
case Regex.run(~r/(\d{3})\//, weather_data) do
[_, direction] -> String.to_integer(direction)
nil -> nil
end
end
@spec parse_wind_speed(String.t()) :: integer() | nil
def parse_wind_speed(weather_data) do
case Regex.run(~r/\/(\d{3})/, weather_data) do
[_, speed] -> String.to_integer(speed)
nil -> nil
end
end
@spec parse_wind_gust(String.t()) :: integer() | nil
def parse_wind_gust(weather_data) do
case Regex.run(~r/g(\d{3})/, weather_data) do
[_, gust] -> String.to_integer(gust)
nil -> nil
end
end
@spec parse_temperature(String.t()) :: integer() | nil
def parse_temperature(weather_data) do
case Regex.run(~r/t(-?\d{3})/, weather_data) do
[_, temp] -> String.to_integer(temp)
nil -> nil
end
end
@spec parse_rainfall_1h(String.t()) :: integer() | nil
def parse_rainfall_1h(weather_data) do
case Regex.run(~r/r(\d{3})/, weather_data) do
[_, rain] -> String.to_integer(rain)
nil -> nil
end
end
@spec parse_rainfall_24h(String.t()) :: integer() | nil
def parse_rainfall_24h(weather_data) do
case Regex.run(~r/p(\d{3})/, weather_data) do
[_, rain] -> String.to_integer(rain)
nil -> nil
end
end
@spec parse_rainfall_since_midnight(String.t()) :: integer() | nil
def parse_rainfall_since_midnight(weather_data) do
case Regex.run(~r/P(\d{3})/, weather_data) do
[_, rain] -> String.to_integer(rain)
nil -> nil
end
end
@spec parse_humidity(String.t()) :: integer() | nil
def parse_humidity(weather_data) do
case Regex.run(~r/h(\d{2})/, weather_data) do
[_, humidity] ->
val = String.to_integer(humidity)
normalize_humidity(val)
nil ->
nil
end
end
defp normalize_humidity(0), do: 100
defp normalize_humidity(val), do: val
@spec parse_pressure(String.t()) :: float() | nil
def parse_pressure(weather_data) do
case Regex.run(~r/b(\d{5})/, weather_data) do
[_, pressure] -> String.to_integer(pressure) / 10.0
nil -> nil
end
end
@spec parse_luminosity(String.t()) :: integer() | nil
def parse_luminosity(weather_data) do
case Regex.run(~r/[lL](\d{3})/, weather_data) do
[_, luminosity] -> String.to_integer(luminosity)
nil -> nil
end
end
@spec parse_snow(String.t()) :: integer() | nil
def parse_snow(weather_data) do
case Regex.run(~r/s(\d{3})/, weather_data) do
[_, snow] -> String.to_integer(snow)
nil -> nil
end
end
end