mirror of
https://github.com/zvx-echo6/meshai.git
synced 2026-08-26 17:31:34 +00:00
chore: remove dead modules and orphaned fixtures (-2,952 LOC) (#142)
* chore: remove dead mesh_sources.py module
Superseded by mesh_data_store.py, whose docstring states it "replaces
mesh_sources.py with a clean three-layer architecture." No remaining
inbound imports (absolute or relative) repo-wide; the only surviving
references to "mesh_sources" are to the unrelated config YAML section
of the same name, which is untouched.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore: remove dead region_tagger.py module
Only reference to "region_tagger" repo-wide was inside its own
module docstring usage example; no live imports found.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore: remove empty meshai/cli package
Package contained only a docstring, no code. No imports of
meshai.cli found anywhere; console entry point is meshai.main:main
(pyproject.toml), and packaging (tool.setuptools.packages.find,
include = ["meshai*"]) has no explicit reference to the cli
subpackage. No MANIFEST.in/setup.py/setup.cfg exist to update.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore: remove orphaned swpc/swpc_last golden fixtures
63 files (40 in fixtures/swpc/, 23 in fixtures/swpc_last/) never
loaded by any test. harness/goldens.py's load_fixtures(hazard) is
the only generic fixture loader and is never called with "swpc" or
"swpc_last" (only "avalanche", "nws", "nws_last", "quake"). The sole
remaining textual reference, a provenance comment in
test_swpc_refactor.py:162 ("Fixture mirrors swpc_last/0003.json..."),
is left untouched.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Matt Johnson <mj@k7zvx.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
f4b717f351
commit
391a6316ad
66 changed files with 0 additions and 2952 deletions
|
|
@ -1 +0,0 @@
|
|||
"""CLI tools for MeshAI."""
|
||||
|
|
@ -1,544 +0,0 @@
|
|||
"""Mesh data source manager with deduplication and normalization."""
|
||||
|
||||
import logging
|
||||
import time
|
||||
from typing import Optional
|
||||
|
||||
from .config import MeshSourceConfig
|
||||
from .sources.meshview import MeshviewSource
|
||||
from .sources.meshmonitor_data import MeshMonitorDataSource
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Meshtastic role enum mapping (integer -> string)
|
||||
# From meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role
|
||||
MESHTASTIC_ROLE_MAP = {
|
||||
0: "CLIENT",
|
||||
1: "CLIENT_MUTE",
|
||||
2: "ROUTER",
|
||||
3: "ROUTER_CLIENT",
|
||||
4: "REPEATER",
|
||||
5: "TRACKER",
|
||||
6: "SENSOR",
|
||||
7: "TAK",
|
||||
8: "CLIENT_HIDDEN",
|
||||
9: "LOST_AND_FOUND",
|
||||
10: "TAK_TRACKER",
|
||||
11: "ROUTER_LATE",
|
||||
12: "CLIENT_BASE",
|
||||
}
|
||||
|
||||
|
||||
def _normalize_node(node: dict) -> dict:
|
||||
"""Normalize a node dict to consistent field names and formats."""
|
||||
result = dict(node)
|
||||
|
||||
# === ROLE NORMALIZATION ===
|
||||
role = node.get("role")
|
||||
if role is None:
|
||||
result["role"] = "UNKNOWN"
|
||||
elif isinstance(role, int):
|
||||
result["role"] = MESHTASTIC_ROLE_MAP.get(role, f"UNKNOWN_{role}")
|
||||
elif isinstance(role, str):
|
||||
result["role"] = role.upper()
|
||||
else:
|
||||
result["role"] = str(role).upper()
|
||||
|
||||
# === GPS NORMALIZATION ===
|
||||
lat = None
|
||||
if "latitude" in node and node["latitude"] is not None:
|
||||
lat = node["latitude"]
|
||||
elif "last_lat" in node and node["last_lat"] is not None:
|
||||
lat = node["last_lat"]
|
||||
if isinstance(lat, int) and abs(lat) > 1000:
|
||||
lat = lat / 1e7
|
||||
elif "lat" in node and node["lat"] is not None:
|
||||
lat = node["lat"]
|
||||
|
||||
lon = None
|
||||
if "longitude" in node and node["longitude"] is not None:
|
||||
lon = node["longitude"]
|
||||
elif "last_long" in node and node["last_long"] is not None:
|
||||
lon = node["last_long"]
|
||||
if isinstance(lon, int) and abs(lon) > 1000:
|
||||
lon = lon / 1e7
|
||||
elif "lon" in node and node["lon"] is not None:
|
||||
lon = node["lon"]
|
||||
elif "lng" in node and node["lng"] is not None:
|
||||
lon = node["lng"]
|
||||
|
||||
if lat is not None and lon is not None:
|
||||
if abs(lat) < 0.001 and abs(lon) < 0.001:
|
||||
lat = None
|
||||
lon = None
|
||||
|
||||
result["latitude"] = lat
|
||||
result["longitude"] = lon
|
||||
|
||||
# === TIMESTAMP NORMALIZATION ===
|
||||
ts = None
|
||||
if "last_seen_us" in node and node["last_seen_us"] is not None:
|
||||
val = node["last_seen_us"]
|
||||
if isinstance(val, (int, float)) and val > 0:
|
||||
ts = val / 1_000_000
|
||||
|
||||
if ts is None:
|
||||
for field in ("lastHeard", "last_heard", "last_seen", "lastSeen", "updated_at"):
|
||||
if field in node and node[field] is not None:
|
||||
val = node[field]
|
||||
if isinstance(val, (int, float)) and val > 0:
|
||||
if val > 1e15:
|
||||
ts = val / 1_000_000
|
||||
elif val > 1e12:
|
||||
ts = val / 1_000
|
||||
else:
|
||||
ts = float(val)
|
||||
break
|
||||
|
||||
result["last_heard"] = ts
|
||||
|
||||
# === HARDWARE MODEL NORMALIZATION ===
|
||||
hw = None
|
||||
if "hw_model" in node and isinstance(node["hw_model"], str):
|
||||
hw = node["hw_model"]
|
||||
elif "hwModel" in node and isinstance(node["hwModel"], str):
|
||||
hw = node["hwModel"]
|
||||
if hw is None:
|
||||
if "hw_model" in node and node["hw_model"] is not None:
|
||||
hw = node["hw_model"]
|
||||
elif "hwModel" in node and node["hwModel"] is not None:
|
||||
hw = node["hwModel"]
|
||||
|
||||
if hw is not None:
|
||||
result["hw_model"] = hw
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def _extract_node_num(node: dict) -> int | None:
|
||||
"""Extract numeric node ID from various formats."""
|
||||
# Try numeric fields first
|
||||
for field in ("nodeNum", "num", "node_num"):
|
||||
if field in node:
|
||||
val = node[field]
|
||||
if isinstance(val, int):
|
||||
return val
|
||||
if isinstance(val, str) and val.isdigit():
|
||||
return int(val)
|
||||
|
||||
# Try hex node_id field
|
||||
if "node_id" in node:
|
||||
nid = node["node_id"]
|
||||
if isinstance(nid, str):
|
||||
hex_str = nid.lstrip("!")
|
||||
try:
|
||||
return int(hex_str, 16)
|
||||
except ValueError:
|
||||
pass
|
||||
elif isinstance(nid, int):
|
||||
return nid
|
||||
|
||||
# Try generic id field (but NOT database row IDs)
|
||||
if "id" in node:
|
||||
val = node["id"]
|
||||
if isinstance(val, int):
|
||||
# Database row IDs are small; Meshtastic node numbers are large
|
||||
if val > 100000:
|
||||
return val
|
||||
if isinstance(val, str):
|
||||
if val.startswith("!"):
|
||||
hex_str = val.lstrip("!")
|
||||
try:
|
||||
return int(hex_str, 16)
|
||||
except ValueError:
|
||||
pass
|
||||
elif len(val) == 8:
|
||||
try:
|
||||
return int(val, 16)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def _normalize_edge_key(edge: dict) -> tuple[int, int] | None:
|
||||
"""Normalize edge to a canonical (from_num, to_num) tuple."""
|
||||
from_num = edge.get("from_node") or edge.get("from") or edge.get("from_num")
|
||||
to_num = edge.get("to_node") or edge.get("to") or edge.get("to_num")
|
||||
|
||||
if from_num is None or to_num is None:
|
||||
return None
|
||||
|
||||
if isinstance(from_num, str):
|
||||
if from_num.isdigit():
|
||||
from_num = int(from_num)
|
||||
else:
|
||||
try:
|
||||
from_num = int(from_num.lstrip("!"), 16)
|
||||
except ValueError:
|
||||
return None
|
||||
|
||||
if isinstance(to_num, str):
|
||||
if to_num.isdigit():
|
||||
to_num = int(to_num)
|
||||
else:
|
||||
try:
|
||||
to_num = int(to_num.lstrip("!"), 16)
|
||||
except ValueError:
|
||||
return None
|
||||
|
||||
return (min(from_num, to_num), max(from_num, to_num))
|
||||
|
||||
|
||||
class MeshSourceManager:
|
||||
"""Manages multiple mesh data sources with deduplication."""
|
||||
|
||||
def __init__(self, source_configs: list[MeshSourceConfig]):
|
||||
self._sources: dict[str, MeshviewSource | MeshMonitorDataSource] = {}
|
||||
|
||||
for cfg in source_configs:
|
||||
if not cfg.enabled:
|
||||
continue
|
||||
|
||||
name = cfg.name
|
||||
if not name:
|
||||
logger.warning("Skipping source with empty name")
|
||||
continue
|
||||
|
||||
if name in self._sources:
|
||||
logger.warning(f"Duplicate source name '{name}', skipping")
|
||||
continue
|
||||
|
||||
try:
|
||||
if cfg.type == "meshview":
|
||||
self._sources[name] = MeshviewSource(
|
||||
url=cfg.url,
|
||||
refresh_interval=cfg.refresh_interval,
|
||||
)
|
||||
logger.info(f"Created Meshview source '{name}' -> {cfg.url}")
|
||||
|
||||
elif cfg.type == "meshmonitor":
|
||||
self._sources[name] = MeshMonitorDataSource(
|
||||
url=cfg.url,
|
||||
api_token=cfg.api_token,
|
||||
refresh_interval=cfg.refresh_interval,
|
||||
)
|
||||
logger.info(f"Created MeshMonitor source '{name}' -> {cfg.url}")
|
||||
|
||||
else:
|
||||
logger.warning(f"Unknown source type '{cfg.type}' for '{name}'")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to create source '{name}': {e}")
|
||||
|
||||
def refresh_all(self) -> int:
|
||||
refreshed = 0
|
||||
for name, source in self._sources.items():
|
||||
try:
|
||||
if source.maybe_refresh():
|
||||
refreshed += 1
|
||||
except Exception as e:
|
||||
logger.error(f"Error refreshing source '{name}': {e}")
|
||||
return refreshed
|
||||
|
||||
def get_source(self, name: str) -> Optional[MeshviewSource | MeshMonitorDataSource]:
|
||||
return self._sources.get(name)
|
||||
|
||||
def get_all_nodes(self) -> list[dict]:
|
||||
"""Get deduplicated nodes from all sources with _node_num field."""
|
||||
nodes_by_num: dict[int, dict] = {}
|
||||
|
||||
for name, source in self._sources.items():
|
||||
for node in source.nodes:
|
||||
normalized = _normalize_node(node)
|
||||
node_num = _extract_node_num(normalized)
|
||||
|
||||
if node_num is None:
|
||||
normalized["_sources"] = [name]
|
||||
pseudo_key = -len(nodes_by_num) - 1
|
||||
nodes_by_num[pseudo_key] = normalized
|
||||
continue
|
||||
|
||||
# BUG 1 FIX: Store _node_num on the normalized dict
|
||||
normalized["_node_num"] = node_num
|
||||
|
||||
if node_num in nodes_by_num:
|
||||
existing = nodes_by_num[node_num]
|
||||
if name not in existing["_sources"]:
|
||||
existing["_sources"].append(name)
|
||||
for key, value in normalized.items():
|
||||
if key not in ("_sources", "_node_num") and value is not None:
|
||||
existing[key] = value
|
||||
else:
|
||||
normalized["_sources"] = [name]
|
||||
nodes_by_num[node_num] = normalized
|
||||
|
||||
return list(nodes_by_num.values())
|
||||
|
||||
def get_all_edges(self) -> list[dict]:
|
||||
edges_by_key: dict[tuple[int, int], dict] = {}
|
||||
|
||||
for name, source in self._sources.items():
|
||||
if not isinstance(source, MeshviewSource):
|
||||
continue
|
||||
|
||||
for edge in source.edges:
|
||||
edge_key = _normalize_edge_key(edge)
|
||||
if edge_key is None:
|
||||
tagged = dict(edge)
|
||||
tagged["_sources"] = [name]
|
||||
pseudo_key = (-len(edges_by_key) - 1, 0)
|
||||
edges_by_key[pseudo_key] = tagged
|
||||
continue
|
||||
|
||||
if edge_key in edges_by_key:
|
||||
existing = edges_by_key[edge_key]
|
||||
if name not in existing["_sources"]:
|
||||
existing["_sources"].append(name)
|
||||
for key, value in edge.items():
|
||||
if key != "_sources" and value is not None:
|
||||
existing[key] = value
|
||||
else:
|
||||
tagged = dict(edge)
|
||||
tagged["_sources"] = [name]
|
||||
edges_by_key[edge_key] = tagged
|
||||
|
||||
return list(edges_by_key.values())
|
||||
|
||||
def get_all_telemetry(self) -> list[dict]:
|
||||
telemetry_by_key: dict[tuple[int, float], dict] = {}
|
||||
|
||||
for name, source in self._sources.items():
|
||||
if not isinstance(source, MeshMonitorDataSource):
|
||||
continue
|
||||
|
||||
for item in source.telemetry:
|
||||
node_num = _extract_node_num(item)
|
||||
timestamp = item.get("timestamp") or item.get("time") or item.get("ts")
|
||||
|
||||
if node_num is None or timestamp is None:
|
||||
tagged = dict(item)
|
||||
tagged["_sources"] = [name]
|
||||
pseudo_key = (-len(telemetry_by_key) - 1, 0.0)
|
||||
telemetry_by_key[pseudo_key] = tagged
|
||||
continue
|
||||
|
||||
key = (node_num, float(timestamp))
|
||||
|
||||
if key in telemetry_by_key:
|
||||
existing = telemetry_by_key[key]
|
||||
if name not in existing["_sources"]:
|
||||
existing["_sources"].append(name)
|
||||
for k, v in item.items():
|
||||
if k != "_sources" and v is not None:
|
||||
existing[k] = v
|
||||
else:
|
||||
tagged = dict(item)
|
||||
tagged["_sources"] = [name]
|
||||
telemetry_by_key[key] = tagged
|
||||
|
||||
return list(telemetry_by_key.values())
|
||||
|
||||
def get_all_traceroutes(self) -> list[dict]:
|
||||
all_traceroutes = []
|
||||
for name, source in self._sources.items():
|
||||
if isinstance(source, MeshMonitorDataSource):
|
||||
for item in source.traceroutes:
|
||||
tagged = dict(item)
|
||||
tagged["_sources"] = [name]
|
||||
all_traceroutes.append(tagged)
|
||||
return all_traceroutes
|
||||
|
||||
def get_all_channels(self) -> list[dict]:
|
||||
all_channels = []
|
||||
for name, source in self._sources.items():
|
||||
if isinstance(source, MeshMonitorDataSource):
|
||||
for item in source.channels:
|
||||
tagged = dict(item)
|
||||
tagged["_sources"] = [name]
|
||||
all_channels.append(tagged)
|
||||
return all_channels
|
||||
|
||||
def get_status(self) -> list[dict]:
|
||||
status_list = []
|
||||
for name, source in self._sources.items():
|
||||
status = {
|
||||
"name": name,
|
||||
"type": "meshview" if isinstance(source, MeshviewSource) else "meshmonitor",
|
||||
"enabled": True,
|
||||
"is_loaded": source.is_loaded,
|
||||
"last_refresh": source.last_refresh,
|
||||
"last_error": source.last_error,
|
||||
"node_count": len(source.nodes),
|
||||
}
|
||||
|
||||
if isinstance(source, MeshviewSource):
|
||||
status["edge_count"] = len(source.edges)
|
||||
elif isinstance(source, MeshMonitorDataSource):
|
||||
status["telemetry_count"] = len(source.telemetry)
|
||||
status["traceroute_count"] = len(source.traceroutes)
|
||||
status["channel_count"] = len(source.channels)
|
||||
|
||||
status_list.append(status)
|
||||
|
||||
return status_list
|
||||
|
||||
def get_stats_by_source(self) -> dict[str, dict]:
|
||||
stats = {}
|
||||
for name, source in self._sources.items():
|
||||
source_stats = {
|
||||
"node_count": len(source.nodes),
|
||||
"is_loaded": source.is_loaded,
|
||||
"last_refresh": source.last_refresh,
|
||||
}
|
||||
|
||||
if isinstance(source, MeshviewSource):
|
||||
source_stats["edge_count"] = len(source.edges)
|
||||
source_stats["type"] = "meshview"
|
||||
elif isinstance(source, MeshMonitorDataSource):
|
||||
source_stats["telemetry_count"] = len(source.telemetry)
|
||||
source_stats["traceroute_count"] = len(source.traceroutes)
|
||||
source_stats["channel_count"] = len(source.channels)
|
||||
source_stats["type"] = "meshmonitor"
|
||||
|
||||
stats[name] = source_stats
|
||||
|
||||
return stats
|
||||
|
||||
def get_dedup_stats(self) -> dict:
|
||||
raw_nodes = sum(len(s.nodes) for s in self._sources.values())
|
||||
raw_edges = sum(
|
||||
len(s.edges) for s in self._sources.values()
|
||||
if isinstance(s, MeshviewSource)
|
||||
)
|
||||
|
||||
dedup_nodes = len(self.get_all_nodes())
|
||||
dedup_edges = len(self.get_all_edges())
|
||||
|
||||
return {
|
||||
"raw_node_count": raw_nodes,
|
||||
"dedup_node_count": dedup_nodes,
|
||||
"node_duplicates": raw_nodes - dedup_nodes,
|
||||
"raw_edge_count": raw_edges,
|
||||
"dedup_edge_count": dedup_edges,
|
||||
"edge_duplicates": raw_edges - dedup_edges,
|
||||
}
|
||||
|
||||
def get_all_packets(self) -> list[dict]:
|
||||
packets_by_id: dict[int, dict] = {}
|
||||
|
||||
for name, source in self._sources.items():
|
||||
if not isinstance(source, MeshMonitorDataSource):
|
||||
continue
|
||||
|
||||
if not hasattr(source, "packets"):
|
||||
continue
|
||||
|
||||
for pkt in source.packets:
|
||||
packet_id = pkt.get("packet_id") or pkt.get("id")
|
||||
if packet_id is None:
|
||||
from_node = pkt.get("from_node") or pkt.get("from")
|
||||
ts = pkt.get("timestamp") or pkt.get("rxTime")
|
||||
portnum = pkt.get("portnum")
|
||||
if from_node and ts:
|
||||
packet_id = hash((from_node, ts, portnum))
|
||||
else:
|
||||
packet_id = -len(packets_by_id) - 1
|
||||
|
||||
if packet_id in packets_by_id:
|
||||
existing = packets_by_id[packet_id]
|
||||
if name not in existing["_sources"]:
|
||||
existing["_sources"].append(name)
|
||||
else:
|
||||
tagged = dict(pkt)
|
||||
tagged["_sources"] = [name]
|
||||
packets_by_id[packet_id] = tagged
|
||||
|
||||
return list(packets_by_id.values())
|
||||
|
||||
def get_traffic_stats(self) -> dict[str, dict]:
|
||||
stats = {}
|
||||
|
||||
for name, source in self._sources.items():
|
||||
source_stats = {}
|
||||
|
||||
if isinstance(source, MeshviewSource):
|
||||
if hasattr(source, "stats") and source.stats:
|
||||
data = source.stats.get("data", [])
|
||||
source_stats["hourly_counts"] = data
|
||||
total = sum(item.get("count", 0) for item in data)
|
||||
source_stats["total_packets"] = total
|
||||
source_stats["packets_per_hour"] = total / len(data) if data else 0
|
||||
|
||||
if hasattr(source, "counts") and source.counts:
|
||||
source_stats["total_seen"] = source.counts.get("total_seen", 0)
|
||||
source_stats["total_packets_all_time"] = source.counts.get("total_packets", 0)
|
||||
|
||||
elif isinstance(source, MeshMonitorDataSource):
|
||||
if hasattr(source, "network_stats") and source.network_stats:
|
||||
ns = source.network_stats
|
||||
source_stats["total_nodes"] = ns.get("totalNodes", 0)
|
||||
source_stats["active_nodes"] = ns.get("activeNodes", 0)
|
||||
source_stats["traceroute_count"] = ns.get("tracerouteCount", 0)
|
||||
source_stats["last_updated"] = ns.get("lastUpdated", 0)
|
||||
|
||||
if hasattr(source, "packets") and source.packets:
|
||||
portnum_counts: dict[str, int] = {}
|
||||
for pkt in source.packets:
|
||||
portnum = pkt.get("portnum_name") or str(pkt.get("portnum", "UNKNOWN"))
|
||||
portnum_counts[portnum] = portnum_counts.get(portnum, 0) + 1
|
||||
source_stats["packets_by_portnum"] = portnum_counts
|
||||
source_stats["packet_count"] = len(source.packets)
|
||||
|
||||
if source_stats:
|
||||
stats[name] = source_stats
|
||||
|
||||
return stats
|
||||
|
||||
def get_solar_data(self) -> list[dict]:
|
||||
all_solar = []
|
||||
for name, source in self._sources.items():
|
||||
if isinstance(source, MeshMonitorDataSource):
|
||||
if hasattr(source, "solar") and source.solar:
|
||||
for item in source.solar:
|
||||
tagged = dict(item)
|
||||
tagged["_sources"] = [name]
|
||||
all_solar.append(tagged)
|
||||
return all_solar
|
||||
|
||||
def get_network_stats(self) -> dict[str, dict]:
|
||||
stats = {}
|
||||
|
||||
for name, source in self._sources.items():
|
||||
source_stats = {}
|
||||
|
||||
if isinstance(source, MeshviewSource):
|
||||
if hasattr(source, "counts") and source.counts:
|
||||
source_stats.update(source.counts)
|
||||
source_stats["node_count"] = len(source.nodes)
|
||||
source_stats["edge_count"] = len(source.edges)
|
||||
|
||||
elif isinstance(source, MeshMonitorDataSource):
|
||||
if hasattr(source, "network_stats") and source.network_stats:
|
||||
source_stats.update(source.network_stats)
|
||||
if hasattr(source, "topology") and source.topology:
|
||||
source_stats["topology"] = source.topology
|
||||
source_stats["node_count"] = len(source.nodes)
|
||||
source_stats["telemetry_count"] = len(source.telemetry)
|
||||
source_stats["traceroute_count"] = len(source.traceroutes)
|
||||
source_stats["channel_count"] = len(source.channels)
|
||||
if hasattr(source, "packets"):
|
||||
source_stats["packet_count"] = len(source.packets)
|
||||
|
||||
if source_stats:
|
||||
stats[name] = source_stats
|
||||
|
||||
return stats
|
||||
|
||||
@property
|
||||
def source_count(self) -> int:
|
||||
return len(self._sources)
|
||||
|
||||
@property
|
||||
def source_names(self) -> list[str]:
|
||||
return list(self._sources.keys())
|
||||
|
|
@ -1,160 +0,0 @@
|
|||
"""Region tagger for mapping coordinates and NWS zones to regions.
|
||||
|
||||
This module provides functions to:
|
||||
- Map lat/lon coordinates to the nearest configured region
|
||||
- Map NWS zone codes to matching regions
|
||||
|
||||
Usage:
|
||||
from meshai.notifications.region_tagger import tag_by_coordinates, tag_by_nws_zone
|
||||
from meshai.config import RegionAnchor
|
||||
|
||||
regions = [
|
||||
RegionAnchor(name="South Western ID", lat=43.615, lon=-116.2023,
|
||||
nws_zones=["IDZ016", "IDZ030"]),
|
||||
RegionAnchor(name="Magic Valley", lat=42.5558, lon=-114.4701,
|
||||
nws_zones=["IDZ031"]),
|
||||
]
|
||||
|
||||
# Find region by coordinates
|
||||
region = tag_by_coordinates(43.6, -116.2, regions)
|
||||
# Returns: "South Western ID"
|
||||
|
||||
# Find regions by NWS zone
|
||||
regions = tag_by_nws_zone("IDZ016", regions)
|
||||
# Returns: ["South Western ID"]
|
||||
"""
|
||||
|
||||
import math
|
||||
from typing import Optional
|
||||
|
||||
# Import RegionAnchor type for annotations
|
||||
# Actual import happens at function call time to avoid circular imports
|
||||
from typing import TYPE_CHECKING
|
||||
if TYPE_CHECKING:
|
||||
from meshai.config import RegionAnchor
|
||||
|
||||
|
||||
# Earth radius in miles (mean radius)
|
||||
EARTH_RADIUS_MILES = 3958.8
|
||||
|
||||
|
||||
def haversine_distance(lat1: float, lon1: float, lat2: float, lon2: float) -> float:
|
||||
"""Calculate the great-circle distance between two points on Earth.
|
||||
|
||||
Uses the haversine formula for accuracy on a spherical Earth model.
|
||||
|
||||
Args:
|
||||
lat1: Latitude of first point in degrees
|
||||
lon1: Longitude of first point in degrees
|
||||
lat2: Latitude of second point in degrees
|
||||
lon2: Longitude of second point in degrees
|
||||
|
||||
Returns:
|
||||
Distance in miles
|
||||
"""
|
||||
# Convert to radians
|
||||
lat1_rad = math.radians(lat1)
|
||||
lat2_rad = math.radians(lat2)
|
||||
lon1_rad = math.radians(lon1)
|
||||
lon2_rad = math.radians(lon2)
|
||||
|
||||
# Differences
|
||||
dlat = lat2_rad - lat1_rad
|
||||
dlon = lon2_rad - lon1_rad
|
||||
|
||||
# Haversine formula
|
||||
a = math.sin(dlat / 2) ** 2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(dlon / 2) ** 2
|
||||
c = 2 * math.asin(math.sqrt(a))
|
||||
|
||||
return EARTH_RADIUS_MILES * c
|
||||
|
||||
|
||||
def tag_by_coordinates(
|
||||
lat: float,
|
||||
lon: float,
|
||||
regions: list, # list[RegionAnchor]
|
||||
radius_miles: float = 25.0,
|
||||
) -> Optional[str]:
|
||||
"""Return the name of the nearest region within radius_miles.
|
||||
|
||||
Finds the closest region anchor to the given coordinates. If the
|
||||
closest anchor is within radius_miles, returns its name. Otherwise
|
||||
returns None.
|
||||
|
||||
Args:
|
||||
lat: Latitude of the point to tag
|
||||
lon: Longitude of the point to tag
|
||||
regions: List of RegionAnchor objects to search
|
||||
radius_miles: Maximum distance to consider (default 25 miles)
|
||||
|
||||
Returns:
|
||||
Name of the nearest region within range, or None if no match
|
||||
"""
|
||||
if not regions:
|
||||
return None
|
||||
|
||||
closest_region = None
|
||||
closest_distance = float("inf")
|
||||
|
||||
for region in regions:
|
||||
# Skip regions without valid coordinates
|
||||
region_lat = getattr(region, "lat", None)
|
||||
region_lon = getattr(region, "lon", None)
|
||||
|
||||
if region_lat is None or region_lon is None:
|
||||
continue
|
||||
if region_lat == 0.0 and region_lon == 0.0:
|
||||
# Treat (0, 0) as unset coordinates
|
||||
continue
|
||||
|
||||
distance = haversine_distance(lat, lon, region_lat, region_lon)
|
||||
|
||||
if distance < closest_distance:
|
||||
closest_distance = distance
|
||||
closest_region = region
|
||||
|
||||
# Check if closest is within radius
|
||||
if closest_region is not None and closest_distance <= radius_miles:
|
||||
return getattr(closest_region, "name", None)
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def tag_by_nws_zone(
|
||||
zone_code: str,
|
||||
regions: list, # list[RegionAnchor]
|
||||
) -> list[str]:
|
||||
"""Return all region names whose nws_zones list contains zone_code.
|
||||
|
||||
Multiple regions can match the same zone (a zone may span multiple
|
||||
configured regions).
|
||||
|
||||
Args:
|
||||
zone_code: NWS zone code to match (e.g., "IDZ016")
|
||||
regions: List of RegionAnchor objects to search
|
||||
|
||||
Returns:
|
||||
List of region names that contain this zone, empty if no matches
|
||||
"""
|
||||
if not zone_code or not regions:
|
||||
return []
|
||||
|
||||
# Normalize zone code to uppercase for case-insensitive matching
|
||||
zone_upper = zone_code.upper().strip()
|
||||
|
||||
matching_regions = []
|
||||
|
||||
for region in regions:
|
||||
region_zones = getattr(region, "nws_zones", None)
|
||||
if not region_zones:
|
||||
continue
|
||||
|
||||
# Check if zone matches any in this region's list (case-insensitive)
|
||||
for rz in region_zones:
|
||||
if rz.upper().strip() == zone_upper:
|
||||
region_name = getattr(region, "name", None)
|
||||
if region_name:
|
||||
matching_regions.append(region_name)
|
||||
break # Don't add same region twice
|
||||
|
||||
return matching_regions
|
||||
36
work/tests/fixtures/swpc/0000.json
vendored
36
work/tests/fixtures/swpc/0000.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:15:00Z|>=1 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:15:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:15:00Z|>=1 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:15:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:15:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 28.766672134399414,
|
||||
"energy": ">=1 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0001.json
vendored
36
work/tests/fixtures/swpc/0001.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:15:00Z|>=10 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:15:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:15:00Z|>=10 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:15:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:15:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.30123627185821533,
|
||||
"energy": ">=10 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0002.json
vendored
36
work/tests/fixtures/swpc/0002.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:15:00Z|>=100 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:15:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:15:00Z|>=100 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:15:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:15:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.1961589753627777,
|
||||
"energy": ">=100 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0003.json
vendored
36
work/tests/fixtures/swpc/0003.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:15:00Z|>=30 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:15:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:15:00Z|>=30 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:15:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:15:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.19939908385276794,
|
||||
"energy": ">=30 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0004.json
vendored
36
work/tests/fixtures/swpc/0004.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:15:00Z|>=5 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:15:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:15:00Z|>=5 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:15:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:15:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.3074222505092621,
|
||||
"energy": ">=5 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0005.json
vendored
36
work/tests/fixtures/swpc/0005.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:15:00Z|>=50 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:15:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:15:00Z|>=50 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:15:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:15:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.19789846241474152,
|
||||
"energy": ">=50 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0006.json
vendored
36
work/tests/fixtures/swpc/0006.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:15:00Z|>=500 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:15:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:15:00Z|>=500 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:15:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:15:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.19208531081676483,
|
||||
"energy": ">=500 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0007.json
vendored
36
work/tests/fixtures/swpc/0007.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:15:00Z|>=60 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:15:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:15:00Z|>=60 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:15:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:15:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.19741536676883698,
|
||||
"energy": ">=60 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0008.json
vendored
36
work/tests/fixtures/swpc/0008.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:20:00Z|>=1 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:20:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:20:00Z|>=1 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:20:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:20:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 27.786531448364258,
|
||||
"energy": ">=1 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0009.json
vendored
36
work/tests/fixtures/swpc/0009.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:20:00Z|>=10 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:20:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:20:00Z|>=10 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:20:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:20:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.2485874593257904,
|
||||
"energy": ">=10 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0010.json
vendored
36
work/tests/fixtures/swpc/0010.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:20:00Z|>=100 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:20:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:20:00Z|>=100 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:20:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:20:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.1894887238740921,
|
||||
"energy": ">=100 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0011.json
vendored
36
work/tests/fixtures/swpc/0011.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:20:00Z|>=30 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:20:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:20:00Z|>=30 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:20:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:20:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.19734397530555725,
|
||||
"energy": ">=30 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0012.json
vendored
36
work/tests/fixtures/swpc/0012.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:20:00Z|>=5 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:20:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:20:00Z|>=5 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:20:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:20:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.2579914927482605,
|
||||
"energy": ">=5 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0013.json
vendored
36
work/tests/fixtures/swpc/0013.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:20:00Z|>=50 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:20:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:20:00Z|>=50 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:20:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:20:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.19125120341777802,
|
||||
"energy": ">=50 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0014.json
vendored
36
work/tests/fixtures/swpc/0014.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:20:00Z|>=500 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:20:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:20:00Z|>=500 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:20:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:20:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.18541516363620758,
|
||||
"energy": ">=500 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0015.json
vendored
36
work/tests/fixtures/swpc/0015.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:20:00Z|>=60 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:20:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:20:00Z|>=60 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:20:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:20:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.19072958827018738,
|
||||
"energy": ">=60 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0016.json
vendored
36
work/tests/fixtures/swpc/0016.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:25:00Z|>=1 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:25:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:25:00Z|>=1 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:25:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:25:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 27.72285270690918,
|
||||
"energy": ">=1 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0017.json
vendored
36
work/tests/fixtures/swpc/0017.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:25:00Z|>=10 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:25:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:25:00Z|>=10 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:25:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:25:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.28919678926467896,
|
||||
"energy": ">=10 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0018.json
vendored
36
work/tests/fixtures/swpc/0018.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:25:00Z|>=100 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:25:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:25:00Z|>=100 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:25:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:25:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.1840660572052002,
|
||||
"energy": ">=100 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0019.json
vendored
36
work/tests/fixtures/swpc/0019.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:25:00Z|>=30 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:25:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:25:00Z|>=30 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:25:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:25:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.18692995607852936,
|
||||
"energy": ">=30 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0020.json
vendored
36
work/tests/fixtures/swpc/0020.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:25:00Z|>=5 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:25:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:25:00Z|>=5 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:25:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:25:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.43121543526649475,
|
||||
"energy": ">=5 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0021.json
vendored
36
work/tests/fixtures/swpc/0021.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:25:00Z|>=50 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:25:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:25:00Z|>=50 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:25:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:25:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.1857948750257492,
|
||||
"energy": ">=50 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0022.json
vendored
36
work/tests/fixtures/swpc/0022.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:25:00Z|>=500 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:25:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:25:00Z|>=500 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:25:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:25:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.17474256455898285,
|
||||
"energy": ">=500 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0023.json
vendored
36
work/tests/fixtures/swpc/0023.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:25:00Z|>=60 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:25:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:25:00Z|>=60 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:25:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:25:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.18532411754131317,
|
||||
"energy": ">=60 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0024.json
vendored
36
work/tests/fixtures/swpc/0024.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:30:00Z|>=1 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:30:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:30:00Z|>=1 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:30:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:30:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 27.166194915771484,
|
||||
"energy": ">=1 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0025.json
vendored
36
work/tests/fixtures/swpc/0025.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:30:00Z|>=10 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:30:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:30:00Z|>=10 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:30:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:30:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.3429813086986542,
|
||||
"energy": ">=10 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0026.json
vendored
36
work/tests/fixtures/swpc/0026.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:30:00Z|>=100 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:30:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:30:00Z|>=100 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:30:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:30:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.23083794116973877,
|
||||
"energy": ">=100 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0027.json
vendored
36
work/tests/fixtures/swpc/0027.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:30:00Z|>=30 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:30:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:30:00Z|>=30 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:30:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:30:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.23371955752372742,
|
||||
"energy": ">=30 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0028.json
vendored
36
work/tests/fixtures/swpc/0028.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:30:00Z|>=5 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:30:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:30:00Z|>=5 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:30:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:30:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.39393070340156555,
|
||||
"energy": ">=5 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0029.json
vendored
36
work/tests/fixtures/swpc/0029.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:30:00Z|>=50 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:30:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:30:00Z|>=50 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:30:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:30:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.23256810009479523,
|
||||
"energy": ">=50 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0030.json
vendored
36
work/tests/fixtures/swpc/0030.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:30:00Z|>=500 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:30:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:30:00Z|>=500 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:30:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:30:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.226764515042305,
|
||||
"energy": ">=500 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0031.json
vendored
36
work/tests/fixtures/swpc/0031.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:30:00Z|>=60 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:30:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:30:00Z|>=60 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:30:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:30:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.23209738731384277,
|
||||
"energy": ">=60 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0032.json
vendored
36
work/tests/fixtures/swpc/0032.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:35:00Z|>=1 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:35:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:35:00Z|>=1 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:35:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:35:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 27.50701141357422,
|
||||
"energy": ">=1 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0033.json
vendored
36
work/tests/fixtures/swpc/0033.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:35:00Z|>=10 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:35:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:35:00Z|>=10 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:35:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:35:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.22531083226203918,
|
||||
"energy": ">=10 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0034.json
vendored
36
work/tests/fixtures/swpc/0034.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:35:00Z|>=100 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:35:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:35:00Z|>=100 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:35:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:35:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.16947858035564423,
|
||||
"energy": ">=100 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0035.json
vendored
36
work/tests/fixtures/swpc/0035.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:35:00Z|>=30 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:35:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:35:00Z|>=30 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:35:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:35:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.17234553396701813,
|
||||
"energy": ">=30 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0036.json
vendored
36
work/tests/fixtures/swpc/0036.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:35:00Z|>=5 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:35:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:35:00Z|>=5 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:35:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:35:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.22996729612350464,
|
||||
"energy": ">=5 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0037.json
vendored
36
work/tests/fixtures/swpc/0037.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:35:00Z|>=50 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:35:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:35:00Z|>=50 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:35:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:35:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.1712087243795395,
|
||||
"energy": ">=50 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0038.json
vendored
36
work/tests/fixtures/swpc/0038.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:35:00Z|>=500 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:35:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:35:00Z|>=500 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:35:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:35:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.1654052734375,
|
||||
"energy": ">=500 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
36
work/tests/fixtures/swpc/0039.json
vendored
36
work/tests/fixtures/swpc/0039.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-06-27T20:35:00Z|>=60 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-06-27T20:35:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-06-27T20:35:00Z|>=60 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-06-27T20:35:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-06-27T20:35:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.17073801159858704,
|
||||
"energy": ">=60 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196490
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0000.json
vendored
35
work/tests/fixtures/swpc_last/0000.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "A20F|2026-06-28 10:41:25.723",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-06-28T10:41:25.723000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "A20F|2026-06-28 10:41:25.723",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-06-28T10:41:25.723000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "A20F",
|
||||
"issue_datetime": "2026-06-28 10:41:25.723",
|
||||
"message": "Space Weather Message Code: WATA20\r\nSerial Number: 1114\r\nIssue Time: 2026 Jun 28 1041 UTC\r\n\r\nWATCH: Geomagnetic Storm Category G1 Predicted \nHighest Storm Level Predicted by Day:\nJun 28: None (Below G1) Jun 29: G1 (Minor) Jun 30: G1 (Minor) \nTHIS SUPERSEDES ANY/ALL PRIOR WATCHES IN EFFECT\nComment: \r\n\n\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 60 degrees Geomagnetic Latitude.\r\nInduced Currents - Weak power grid fluctuations can occur.\r\nSpacecraft - Minor impact on satellite operations possible.\r\nAurora - Aurora may be visible at high latitudes, i.e., northern tier of the U.S. such as northern Michigan and Maine."
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.a20f",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0001.json
vendored
35
work/tests/fixtures/swpc_last/0001.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "P11W|2026-06-30 16:36:36.953",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-06-30T16:36:36.953000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "P11W|2026-06-30 16:36:36.953",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-06-30T16:36:36.953000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "P11W",
|
||||
"issue_datetime": "2026-06-30 16:36:36.953",
|
||||
"message": "Space Weather Message Code: WARPX1\r\nSerial Number: 627\r\nIssue Time: 2026 Jun 30 1636 UTC\r\n\r\nCANCEL WARNING: Proton 10MeV Integral Flux above 10pfu expected \nCancel Serial Number: 626\nOriginal Issue Time: 2026 Jun 30 1600 UTC\nConditions no longer justify warning.\r\n\nConditions no longer justify warning.NOAA Scale: S1 - Minor"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.p11w",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0002.json
vendored
35
work/tests/fixtures/swpc_last/0002.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "TIVA|2026-06-03 01:43:20.793",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-06-03T01:43:20.793000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "TIVA|2026-06-03 01:43:20.793",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-06-03T01:43:20.793000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "TIVA",
|
||||
"issue_datetime": "2026-06-03 01:43:20.793",
|
||||
"message": "Space Weather Message Code: ALTTP4\r\nSerial Number: 710\r\nIssue Time: 2026 Jun 03 0143 UTC\r\n\r\nALERT: Type IV Radio Emission \nBegin Time: 2026 Jun 03 0122 UTC\nComment: \r\n\n"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.tiva",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0003.json
vendored
35
work/tests/fixtures/swpc_last/0003.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "XX0S|2026-06-03 11:59:48.137",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-06-03T11:59:48.137000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "XX0S|2026-06-03 11:59:48.137",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-06-03T11:59:48.137000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "XX0S",
|
||||
"issue_datetime": "2026-06-03 11:59:48.137",
|
||||
"message": "Space Weather Message Code: SUMX01\r\nSerial Number: 218\r\nIssue Time: 2026 Jun 03 1159 UTC\r\n\r\nSUMMARY: X-ray Event exceeded X1 \nBegin Time: 2026 Jun 03 1119 UTC\nMaximum Time: 2026 Jun 03 1128 UTC\nEnd Time: 2026 Jun 03 1135 UTC\nXray Class: X1.0\nOptical Class: \nLocation: N17W19\nNoaa Scale: R3 - Strong\nComment: GOES-18 outage so using GOES-19\n\r\n\nGOES-18 outage so using GOES-19NOAA Scale: R3 - Strong\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact consists of large portions of the sunlit side of Earth, strongest at the sub-solar point.\r\nRadio - Wide area blackout of HF (high frequency) radio communication for about an hour."
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.xx0s",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0004.json
vendored
35
work/tests/fixtures/swpc_last/0004.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "A50F|2026-06-03 14:52:28.343",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-06-03T14:52:28.343000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "A50F|2026-06-03 14:52:28.343",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-06-03T14:52:28.343000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "A50F",
|
||||
"issue_datetime": "2026-06-03 14:52:28.343",
|
||||
"message": "Space Weather Message Code: WATA50\r\nSerial Number: 98\r\nIssue Time: 2026 Jun 03 1452 UTC\r\n\r\nWATCH: Geomagnetic Storm Category G3 Predicted \nHighest Storm Level Predicted by Day:\nJun 04: G3 (Strong) Jun 05: G3 (Strong) Jun 06: None (Below G1) \nTHIS SUPERSEDES ANY/ALL PRIOR WATCHES IN EFFECT\nComment: \r\n\n"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.a50f",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0005.json
vendored
35
work/tests/fixtures/swpc_last/0005.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "MSIS|2026-06-05 05:13:38.727",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-06-05T05:13:38.727000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "MSIS|2026-06-05 05:13:38.727",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-06-05T05:13:38.727000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "MSIS",
|
||||
"issue_datetime": "2026-06-05 05:13:38.727",
|
||||
"message": "Space Weather Message Code: SUMSUD\r\nSerial Number: 300\r\nIssue Time: 2026 Jun 05 0513 UTC\r\n\r\nSUMMARY: Geomagnetic Sudden Impulse \nObserved: 2026 Jun 05 0511 UTC\nDeviation: 70 nT\nStation: MEA\nComment: \r\n\n"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.msis",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0006.json
vendored
35
work/tests/fixtures/swpc_last/0006.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "SGIW|2026-07-03 11:38:06.157",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-07-03T11:38:06.157000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "SGIW|2026-07-03 11:38:06.157",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-07-03T11:38:06.157000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "SGIW",
|
||||
"issue_datetime": "2026-07-03 11:38:06.157",
|
||||
"message": "Space Weather Message Code: WARSUD\r\nSerial Number: 256\r\nIssue Time: 2026 Jul 03 1138 UTC\r\n\r\nWARNING: Geomagnetic Sudden Impulse expected \nValid From: 2026 Jul 03 1157 UTC\nValid To: 2026 Jul 03 1227 UTC\nIp Shock: 2026-07-03 11:20\nComment: \r\n\n"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.sgiw",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0007.json
vendored
35
work/tests/fixtures/swpc_last/0007.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "XM5A|2026-07-03 19:00:40.987",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-07-03T19:00:40.987000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "XM5A|2026-07-03 19:00:40.987",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-07-03T19:00:40.987000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "XM5A",
|
||||
"issue_datetime": "2026-07-03 19:00:40.987",
|
||||
"message": "Space Weather Message Code: ALTXMF\r\nSerial Number: 537\r\nIssue Time: 2026 Jul 03 1900 UTC\r\n\r\nALERT: X-Ray Flux exceeded M5 \nThreshold Reached: 2026 Jul 03 1856 UTC\nNoaa Scale: R2 - Moderate\nComment: \r\n\nNOAA Scale: R2 - Moderate\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact centered on sub-solar point on the sunlit side of Earth. Extent of blackout of HF (high frequency) radio communication dependent upon current X-ray Flux intensity. For real-time information on affected area and expected duration please see http://www.swpc.noaa.gov/products/d-region-absorption-predictions-d-rap."
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.xm5a",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0008.json
vendored
35
work/tests/fixtures/swpc_last/0008.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "XM5S|2026-07-03 19:11:28.970",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-07-03T19:11:28.970000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "XM5S|2026-07-03 19:11:28.970",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-07-03T19:11:28.970000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "XM5S",
|
||||
"issue_datetime": "2026-07-03 19:11:28.970",
|
||||
"message": "Space Weather Message Code: SUMXM5\r\nSerial Number: 323\r\nIssue Time: 2026 Jul 03 1911 UTC\r\n\r\nSUMMARY: X-ray Event exceeded M5 \nBegin Time: 2026 Jul 03 1857 UTC\nMaximum Time: 2026 Jul 03 1859 UTC\nEnd Time: 2026 Jul 04 1903 UTC\nXray Class: M6.3\nOptical Class: \nLocation: S06W46\nNoaa Scale: R2 - Moderate\nComment: \r\n\nNOAA Scale: R2 - Moderate\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact centered primarily on sub-solar point on the sunlit side of Earth.\r\nRadio - Limited blackout of HF (high frequency) radio communication for tens of minutes."
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.xm5s",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0009.json
vendored
35
work/tests/fixtures/swpc_last/0009.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "A30F|2026-06-05 18:52:32.167",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-06-05T18:52:32.167000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "A30F|2026-06-05 18:52:32.167",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-06-05T18:52:32.167000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "A30F",
|
||||
"issue_datetime": "2026-06-05 18:52:32.167",
|
||||
"message": "Space Weather Message Code: WATA30\r\nSerial Number: 274\r\nIssue Time: 2026 Jun 05 1852 UTC\r\n\r\nWATCH: Geomagnetic Storm Category G2 Predicted \nHighest Storm Level Predicted by Day:\nJun 06: G2 (Moderate) Jun 07: None (Below G1) Jun 08: None (Below G1) \nTHIS SUPERSEDES ANY/ALL PRIOR WATCHES IN EFFECT\nComment: \r\n\n\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 55 degrees Geomagnetic Latitude.\r\nInduced Currents - Power grid fluctuations can occur. High-latitude power systems may experience voltage alarms.\r\nSpacecraft - Satellite orientation irregularities may occur; increased drag on low Earth-orbit satellites is possible.\r\nRadio - HF (high frequency) radio propagation can fade at higher latitudes.\r\nAurora - Aurora may be seen as low as New York to Wisconsin to Washington state."
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.a30f",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0010.json
vendored
35
work/tests/fixtures/swpc_last/0010.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "K04A|2026-07-03 20:54:38.663",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-07-03T20:54:38.663000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "K04A|2026-07-03 20:54:38.663",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-07-03T20:54:38.663000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "K04A",
|
||||
"issue_datetime": "2026-07-03 20:54:38.663",
|
||||
"message": "Space Weather Message Code: ALTK04\r\nSerial Number: 2670\r\nIssue Time: 2026 Jul 03 2054 UTC\r\n\r\nALERT: Geomagnetic K-index of 4 \nThreshold Reached: 2026 Jul 03 2049 UTC\nSynoptic Period: 1800-2100\nActive Warning: YES\nComment: \r\n\n\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 65 degrees Geomagnetic Latitude.\r\nInduced Currents - Weak power grid fluctuations can occur.\r\nAurora - Aurora may be visible at high latitudes such as Canada and Alaska."
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.k04a",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0011.json
vendored
35
work/tests/fixtures/swpc_last/0011.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "K07W|2026-07-04 05:01:32.633",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-07-04T05:01:32.633000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 3,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "K07W|2026-07-04 05:01:32.633",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-07-04T05:01:32.633000Z",
|
||||
"expires": null,
|
||||
"severity": 3,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "K07W",
|
||||
"issue_datetime": "2026-07-04 05:01:32.633",
|
||||
"message": "Space Weather Message Code: WARK07\r\nSerial Number: 151\r\nIssue Time: 2026 Jul 04 0501 UTC\r\n\r\nWARNING: Geomagnetic K-index of 7 or greater expected \nValid From: 2026 Jul 04 0500 UTC\nValid To: 2026 Jul 05 1200 UTC\nWarning Conditions: Onset\nNoaa Scale: G3 - Greater\nComment: \r\n\nNOAA Scale: G3 - Greater"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.k07w",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0012.json
vendored
35
work/tests/fixtures/swpc_last/0012.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "K07A|2026-07-04 05:10:10.740",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-07-04T05:10:10.740000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 3,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "K07A|2026-07-04 05:10:10.740",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-07-04T05:10:10.740000Z",
|
||||
"expires": null,
|
||||
"severity": 3,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "K07A",
|
||||
"issue_datetime": "2026-07-04 05:10:10.740",
|
||||
"message": "Space Weather Message Code: ALTK07\r\nSerial Number: 218\r\nIssue Time: 2026 Jul 04 0509 UTC\r\n\r\nALERT: Geomagnetic K-index of 7 \nThreshold Reached: 2026 Jul 04 0509 UTC\nSynoptic Period: 0300-0600\nActive Warning: YES\nNoaa Scale: G3 - Strong\nComment: \r\n\nNOAA Scale: G3 - Strong"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.k07a",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0013.json
vendored
35
work/tests/fixtures/swpc_last/0013.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "K06W|2026-07-04 13:57:38.983",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-07-04T13:57:38.983000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 2,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "K06W|2026-07-04 13:57:38.983",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-07-04T13:57:38.983000Z",
|
||||
"expires": null,
|
||||
"severity": 2,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "K06W",
|
||||
"issue_datetime": "2026-07-04 13:57:38.983",
|
||||
"message": "Space Weather Message Code: WARK06\r\nSerial Number: 665\r\nIssue Time: 2026 Jul 04 1357 UTC\r\n\r\nWARNING: Geomagnetic K-index of 6 expected \nValid From: 2026 Jul 04 1356 UTC\nValid To: 2026 Jul 05 2100 UTC\nWarning Conditions: Onset\nNoaa Scale: G2 - Moderate\nComment: \r\n\nNOAA Scale: G2 - Moderate\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 55 degrees Geomagnetic Latitude.\r\nInduced Currents - Power grid fluctuations can occur. High-latitude power systems may experience voltage alarms.\r\nSpacecraft - Satellite orientation irregularities may occur; increased drag on low Earth-orbit satellites is possible.\r\nRadio - HF (high frequency) radio propagation can fade at higher latitudes.\r\nAurora - Aurora may be seen as low as New York to Wisconsin to Washington state."
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.k06w",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0014.json
vendored
35
work/tests/fixtures/swpc_last/0014.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "K05W|2026-07-04 14:12:48.350",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-07-04T14:12:48.350000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 1,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "K05W|2026-07-04 14:12:48.350",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-07-04T14:12:48.350000Z",
|
||||
"expires": null,
|
||||
"severity": 1,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "K05W",
|
||||
"issue_datetime": "2026-07-04 14:12:48.350",
|
||||
"message": "Space Weather Message Code: WARK05\r\nSerial Number: 2248\r\nIssue Time: 2026 Jul 04 1412 UTC\r\n\r\nEXTENDED WARNING: Geomagnetic K-index of 5 expected\nExtension to Serial Number: 2247\nValid From: 2026 Jul 04 0100 UTC\nNow Valid Until: 2026 Jul 04 2359 UTC\nWarning Condition: Persistence\n\r\n\nNOAA Scale: G1 - Minor\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 60 degrees Geomagnetic Latitude.\r\nInduced Currents - Weak power grid fluctuations can occur.\r\nSpacecraft - Minor impact on satellite operations possible.\r\nAurora - Aurora may be visible at high latitudes, i.e., northern tier of the U.S. such as northern Michigan and Maine."
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.k05w",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0015.json
vendored
35
work/tests/fixtures/swpc_last/0015.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "K04W|2026-07-04 14:21:41.873",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-07-04T14:21:41.873000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "K04W|2026-07-04 14:21:41.873",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-07-04T14:21:41.873000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "K04W",
|
||||
"issue_datetime": "2026-07-04 14:21:41.873",
|
||||
"message": "Space Weather Message Code: WARK04\r\nSerial Number: 5377\r\nIssue Time: 2026 Jul 04 1421 UTC\r\n\r\nEXTENDED WARNING: Geomagnetic K-index of 4 expected\nExtension to Serial Number: 5376\nValid From: 2026 Jul 03 1209 UTC\nNow Valid Until: 2026 Jul 05 0300 UTC\nWarning Condition: Persistence\n\r\n\n\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 65 degrees Geomagnetic Latitude.\r\nInduced Currents - Weak power grid fluctuations can occur.\r\nAurora - Aurora may be visible at high latitudes such as Canada and Alaska."
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.k04w",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0016.json
vendored
35
work/tests/fixtures/swpc_last/0016.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "BHIS|2026-06-06 14:14:05.560",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-06-06T14:14:05.560000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "BHIS|2026-06-06 14:14:05.560",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-06-06T14:14:05.560000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "BHIS",
|
||||
"issue_datetime": "2026-06-06 14:14:05.560",
|
||||
"message": "Space Weather Message Code: SUM10R\r\nSerial Number: 918\r\nIssue Time: 2026 Jun 06 1414 UTC\r\n\r\nSUMMARY: 10cm Radio Burst \nBegin Time: 2026 Jun 06 1344 UTC\nMaximum Time: 2026 Jun 06 1344 UTC\nEnd Time: 2026 Jun 06 1359 UTC\nPeak Flux: 190 sfu\nDuration: 5 minutes\nLatest Penticton Noon Flux: 141 sfu\nComment: \r\n\n"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.bhis",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0017.json
vendored
35
work/tests/fixtures/swpc_last/0017.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "TIIA|2026-06-06 14:15:12.373",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-06-06T14:15:12.373000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "TIIA|2026-06-06 14:15:12.373",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-06-06T14:15:12.373000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "TIIA",
|
||||
"issue_datetime": "2026-06-06 14:15:12.373",
|
||||
"message": "Space Weather Message Code: ALTTP2\r\nSerial Number: 1498\r\nIssue Time: 2026 Jun 06 1415 UTC\r\n\r\nALERT: Type II Radio Emission \nBegin Time: 2026 Jun 06 1347 UTC\nEstimate Velocity: 838 km/s\nComment: \r\n\n"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.tiia",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0018.json
vendored
35
work/tests/fixtures/swpc_last/0018.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "K05A|2026-07-04 16:14:30.417",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-07-04T16:14:30.417000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 1,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "K05A|2026-07-04 16:14:30.417",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-07-04T16:14:30.417000Z",
|
||||
"expires": null,
|
||||
"severity": 1,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "K05A",
|
||||
"issue_datetime": "2026-07-04 16:14:30.417",
|
||||
"message": "Space Weather Message Code: ALTK05\r\nSerial Number: 2036\r\nIssue Time: 2026 Jul 04 1614 UTC\r\n\r\nALERT: Geomagnetic K-index of 5 \nThreshold Reached: 2026 Jul 04 1610 UTC\nSynoptic Period: 1500-1800\nActive Warning: YES\nNoaa Scale: G1 - Minor\nComment: \r\n\nNOAA Scale: G1 - Minor\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 60 degrees Geomagnetic Latitude.\r\nInduced Currents - Weak power grid fluctuations can occur.\r\nSpacecraft - Minor impact on satellite operations possible.\r\nAurora - Aurora may be visible at high latitudes, i.e., northern tier of the U.S. such as northern Michigan and Maine."
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.k05a",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0019.json
vendored
35
work/tests/fixtures/swpc_last/0019.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "K06A|2026-07-04 17:00:15.597",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-07-04T17:00:15.597000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 2,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "K06A|2026-07-04 17:00:15.597",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-07-04T17:00:15.597000Z",
|
||||
"expires": null,
|
||||
"severity": 2,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "K06A",
|
||||
"issue_datetime": "2026-07-04 17:00:15.597",
|
||||
"message": "Space Weather Message Code: ALTK06\r\nSerial Number: 723\r\nIssue Time: 2026 Jul 04 1700 UTC\r\n\r\nALERT: Geomagnetic K-index of 6 \nThreshold Reached: 2026 Jul 04 1655 UTC\nSynoptic Period: 1500-1800\nActive Warning: YES\nNoaa Scale: G2 - Moderate\nComment: \r\n\nNOAA Scale: G2 - Moderate\r\n\r\nNOAA Space Weather Scale descriptions can be found at\r\nwww.swpc.noaa.gov/noaa-scales-explanation\r\n\r\nPotential Impacts: Area of impact primarily poleward of 55 degrees Geomagnetic Latitude.\r\nInduced Currents - Power grid fluctuations can occur. High-latitude power systems may experience voltage alarms.\r\nSpacecraft - Satellite orientation irregularities may occur; increased drag on low Earth-orbit satellites is possible.\r\nRadio - HF (high frequency) radio propagation can fade at higher latitudes.\r\nAurora - Aurora may be seen as low as New York to Wisconsin to Washington state."
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.k06a",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
35
work/tests/fixtures/swpc_last/0020.json
vendored
35
work/tests/fixtures/swpc_last/0020.json
vendored
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "EF3A|2026-06-06 16:55:22.263",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.alert.v1",
|
||||
"time": "2026-06-06T16:55:22.263000+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.alert",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "EF3A|2026-06-06 16:55:22.263",
|
||||
"adapter": "swpc_alerts",
|
||||
"category": "space.alert",
|
||||
"time": "2026-06-06T16:55:22.263000Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"product_id": "EF3A",
|
||||
"issue_datetime": "2026-06-06 16:55:22.263",
|
||||
"message": "Space Weather Message Code: ALTEF3\r\nSerial Number: 3695\r\nIssue Time: 2026 Jun 06 1655 UTC\r\n\r\nALERT: Electron 2MeV Integral Flux exceeded 1000pfu \nThreshold Reached: 2026 Jun 06 1640 UTC\nStation: GOES-19\nComment: Yesterday's max: 536 pfu\n\r\n\nYesterday's max: 536 pfu"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.alert.ef3a",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
36
work/tests/fixtures/swpc_last/0021.json
vendored
36
work/tests/fixtures/swpc_last/0021.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-07-04T15:00:00",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.kindex.v1",
|
||||
"time": "2026-07-04T15:00:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.kindex",
|
||||
"centralseverity": 1,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-07-04T15:00:00",
|
||||
"adapter": "swpc_kindex",
|
||||
"category": "space.kindex",
|
||||
"time": "2026-07-04T15:00:00Z",
|
||||
"expires": null,
|
||||
"severity": 1,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-07-04T15:00:00",
|
||||
"Kp": 5.67,
|
||||
"a_running": 67,
|
||||
"station_count": 7
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.kindex",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
36
work/tests/fixtures/swpc_last/0022.json
vendored
36
work/tests/fixtures/swpc_last/0022.json
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"envelope": {
|
||||
"id": "2026-07-04T20:10:00Z|>=60 MeV",
|
||||
"source": "central.echo6.co",
|
||||
"type": "central.space.proton_flux.v1",
|
||||
"time": "2026-07-04T20:10:00+00:00",
|
||||
"datacontenttype": "application/json",
|
||||
"centralschemaversion": "1.0",
|
||||
"centralcategory": "space.proton_flux",
|
||||
"centralseverity": 0,
|
||||
"specversion": "1.0",
|
||||
"data": {
|
||||
"id": "2026-07-04T20:10:00Z|>=60 MeV",
|
||||
"adapter": "swpc_protons",
|
||||
"category": "space.proton_flux",
|
||||
"time": "2026-07-04T20:10:00Z",
|
||||
"expires": null,
|
||||
"severity": 0,
|
||||
"geo": {
|
||||
"centroid": null,
|
||||
"bbox": null,
|
||||
"regions": [],
|
||||
"primary_region": null,
|
||||
"geometry": null
|
||||
},
|
||||
"data": {
|
||||
"time_tag": "2026-07-04T20:10:00Z",
|
||||
"satellite": 18,
|
||||
"flux": 0.16377367079257965,
|
||||
"energy": ">=60 MeV"
|
||||
}
|
||||
}
|
||||
},
|
||||
"subject": "central.space.proton_flux",
|
||||
"captured_epoch": 1783196500
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue