From 94e817ac5ea4367111d9e8326cdc6614729b6d90 Mon Sep 17 00:00:00 2001 From: Kyle Hurd Date: Sat, 13 Sep 2025 17:48:41 -0400 Subject: [PATCH] Brightness is configurable; Allows for skipping over LEDs; --- src/metar_map/__main__.py | 24 +++++++++++++++++------- src/metar_map/client.py | 19 +++++++++++++++++-- src/metar_map/static/config.yaml | 1 + 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/metar_map/__main__.py b/src/metar_map/__main__.py index ee3db04..00dc2ae 100644 --- a/src/metar_map/__main__.py +++ b/src/metar_map/__main__.py @@ -7,20 +7,30 @@ if __name__ == "__main__": config = load_config() - icao_codes: list[str] = config.get("icao_codes", []) + raw_icao_codes: list[str] = config.get("icao_codes", []) refresh_time: int = int(config.get("refresh_time", 1800)) + brightness: float = float(config.get("brightness", 0.15)) + led_map = [ + (i, code) for i, code in enumerate(raw_icao_codes) if code and code.strip() + ] + filtered_icao_codes = [code for _, code in led_map] client = MetarClient() builder = LEDPatternBuilder() - controller = LEDController(num_leds=len(icao_codes)) + controller = LEDController(num_leds=len(raw_icao_codes), brightness=brightness) logger = Logger() - logger.info(f"Metar Map started up with the following settings:") + logger.info("Metar Map started up with the following settings:") logger.info(f"{config}") try: while True: - metar_data = client.get_metar(icao_codes) - for i, data in enumerate(metar_data): + metar_data = client.get_metar(filtered_icao_codes) + metar_lookup = {d.icao: d for d in metar_data if d.icao} + for led_index, icao in led_map: + data = metar_lookup.get(icao) logger.debug("----------------------------------------") - logger.debug(f"Index: {i}") + logger.debug(f"LED Index: {led_index} ICAO: {icao}") + if not data: + logger.warning(f"No METAR data for `{icao}`. Skipping...") + continue if data.flight_category is None: logger.warning( f"Flight category for `{data.icao}` was None. Skipping..." @@ -31,7 +41,7 @@ lightning=data.lightning, snow=bool(data.snow), ) - controller.update_patterns(i, patterns) + controller.update_patterns(led_index, patterns) logger.debug(f"ICAO: {data.icao}") logger.debug(f"Flight Category: {data.flight_category}") for pattern in patterns: diff --git a/src/metar_map/client.py b/src/metar_map/client.py index e281018..7073eba 100644 --- a/src/metar_map/client.py +++ b/src/metar_map/client.py @@ -2,6 +2,7 @@ from typing import Optional import requests +from metar_map.logger import Logger from metar_map.config import load_config @@ -29,6 +30,7 @@ def __init__(self, config_path: Optional[str] = None): config = load_config(config_path=config_path) self.base_url: str = config.get("base_url", "") self.metar_endpoint: str = config.get("endpoints", {}).get("metar", "") + self._logger = Logger() def get_metar(self, ids: list[str]) -> list[MetarData]: """ @@ -37,9 +39,10 @@ def get_metar(self, ids: list[str]) -> list[MetarData]: try: ids_param = ",".join(ids) url = f"{self.base_url}{self.metar_endpoint}?ids={ids_param}&format=json" + self._logger.debug(f"Making request for metar data with url `{url}`") response = requests.get(url, timeout=10) response.raise_for_status() - return [ + payload = [ MetarData( icao=item.get("icaoId"), name=item.get("name"), @@ -53,5 +56,17 @@ def get_metar(self, ids: list[str]) -> list[MetarData]: ) for item in response.json() ] - except Exception: + self._logger.debug(f"Payload: {payload}") + return payload + except Exception as e: + self._logger.error(f"An error occurred querying for metar data: {e}") return [] + + +if __name__ == "__main__": + client = MetarClient() + config = load_config() + codes = config.get("icao_codes", []) + for code in codes: + print(f"- {code}") + print(client.get_metar(config.get("icao_codes", []))) diff --git a/src/metar_map/static/config.yaml b/src/metar_map/static/config.yaml index 83dfa64..2a989fd 100644 --- a/src/metar_map/static/config.yaml +++ b/src/metar_map/static/config.yaml @@ -21,6 +21,7 @@ icao_codes: - KRDU - KCLT refresh_time: 1800 +brightness: 0.15 led_patterns: VFR: color: GREEN