ionex data is actually predictions 1 day ahead so get the current day not just the last one in the file list
This commit is contained in:
parent
e324c077d2
commit
4687210542
|
@ -53,4 +53,6 @@ Unit: `(10^16 el) / m^2`
|
||||||
|
|
||||||
VTEC, or Vertical TEC, is a specific type of TEC measurement that is taken along a path extending
|
VTEC, or Vertical TEC, is a specific type of TEC measurement that is taken along a path extending
|
||||||
vertically from the Earth's surface to the edge of the atmosphere. So essentially, VTEC is a subset of TEC, with the
|
vertically from the Earth's surface to the edge of the atmosphere. So essentially, VTEC is a subset of TEC, with the
|
||||||
difference lying in the specific path along which the measurement is taken.
|
difference lying in the specific path along which the measurement is taken.
|
||||||
|
|
||||||
|
Updated hourly.
|
|
@ -1,4 +1,5 @@
|
||||||
import datetime
|
import datetime
|
||||||
|
import logging
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
|
@ -43,7 +44,9 @@ def fetch_latest_ionex(username: str, password: str):
|
||||||
day_urls = [element.get_attribute('href') for element in day_elements]
|
day_urls = [element.get_attribute('href') for element in day_elements]
|
||||||
|
|
||||||
# Load the latest day.
|
# Load the latest day.
|
||||||
driver.get(day_urls[-1])
|
today_url = day_urls[-2] # last element is predictions for tomorrow so we want the second to last one
|
||||||
|
logging.info(f'Using day {today_url.split("/")[-1]}')
|
||||||
|
driver.get(today_url)
|
||||||
|
|
||||||
# Find our file.
|
# Find our file.
|
||||||
file_elements = driver.find_elements(By.XPATH, '//a[@class="archiveItemText"]')
|
file_elements = driver.find_elements(By.XPATH, '//a[@class="archiveItemText"]')
|
||||||
|
|
19
main.py
19
main.py
|
@ -2,12 +2,13 @@ import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import paho.mqtt.client as mqtt
|
import paho.mqtt.client as mqtt
|
||||||
|
|
||||||
from lib.cddis_fetch import fetch_latest_ionex
|
from lib.cddis_fetch import fetch_latest_ionex
|
||||||
from lib.tecmap import get_tecmaps, plot_tec_map
|
from lib.tecmap import get_tecmaps, plot_tec_map, parse_ionex_datetime
|
||||||
|
|
||||||
logging.basicConfig(level=logging.INFO)
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
|
||||||
|
@ -35,7 +36,6 @@ if not CDDIS_USERNAME or not CDDIS_PASSWORD:
|
||||||
client = mqtt.Client(client_id=MQTT_CLIENT_ID)
|
client = mqtt.Client(client_id=MQTT_CLIENT_ID)
|
||||||
if MQTT_USERNAME and MQTT_PASSWORD:
|
if MQTT_USERNAME and MQTT_PASSWORD:
|
||||||
client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)
|
client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)
|
||||||
logging.info("Username and password set.")
|
|
||||||
client.will_set(MQTT_TOPIC_PREFIX + "/status", payload="Offline", qos=1, retain=True) # set LWT
|
client.will_set(MQTT_TOPIC_PREFIX + "/status", payload="Offline", qos=1, retain=True) # set LWT
|
||||||
client.connect(MQTT_BROKER_HOST, port=MQTT_BROKER_PORT)
|
client.connect(MQTT_BROKER_HOST, port=MQTT_BROKER_PORT)
|
||||||
client.loop_start()
|
client.loop_start()
|
||||||
|
@ -48,18 +48,23 @@ def publish(topic: str, msg):
|
||||||
if status == 0:
|
if status == 0:
|
||||||
logging.info(f"Sent {msg} to topic {topic_expanded}")
|
logging.info(f"Sent {msg} to topic {topic_expanded}")
|
||||||
else:
|
else:
|
||||||
logging.error(f"Failed to send message to topic {topic_expanded}")
|
logging.error(f"Failed to send message to topic {topic_expanded}: {result}")
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
while True:
|
while True:
|
||||||
|
# TODO: tick every second and execute runs if it's time.
|
||||||
|
# TODO: get TEC map every 15 min and serve from URL https://services.swpc.noaa.gov/images/animations/natec-ustec/ustec_tec/latest.png?time=1716232652000
|
||||||
|
utc_hr = datetime.utcnow().hour
|
||||||
logging.info('Fetching latest IONEX data')
|
logging.info('Fetching latest IONEX data')
|
||||||
|
logging.info(f'Using hour {utc_hr}')
|
||||||
ionex_data = fetch_latest_ionex(CDDIS_USERNAME, CDDIS_PASSWORD)
|
ionex_data = fetch_latest_ionex(CDDIS_USERNAME, CDDIS_PASSWORD)
|
||||||
tec_data = []
|
avg_tec = None
|
||||||
for tecmap, epoch in get_tecmaps(ionex_data):
|
for tecmap, epoch in get_tecmaps(ionex_data):
|
||||||
avg_tec = np.mean(plot_tec_map(tecmap, [float(LON_RANGE_MIN), float(LON_RANGE_MAX)], [float(LAT_RANGE_MIN), float(LAT_RANGE_MAX)]))
|
if parse_ionex_datetime(epoch).hour == utc_hr:
|
||||||
tec_data.append(avg_tec)
|
avg_tec = np.mean(plot_tec_map(tecmap, [float(LON_RANGE_MIN), float(LON_RANGE_MAX)], [float(LAT_RANGE_MIN), float(LAT_RANGE_MAX)]))
|
||||||
latest = round(tec_data[-1], 1)
|
break
|
||||||
|
latest = round(avg_tec, 1)
|
||||||
publish('vtec', latest)
|
publish('vtec', latest)
|
||||||
time.sleep(1800)
|
time.sleep(1800)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue