diff --git a/release-notes.md b/release-notes.md
index 75eb8961..86d7f590 100644
--- a/release-notes.md
+++ b/release-notes.md
@@ -1,4 +1,7 @@
Changes since v2.0.1 include:
+- stage2: add additional aggregator links to the stage2 feeder home page
+- stage2: add links to dump978 for micro feeders providing UAT978 data
+- stage2: add links to live traffic and stats when showing the micro feeders connected to a stage2
- stage2: allow more systems to be used as micro feeder by allowing host,port,protocol triplets - this allows for example to use a planefiner device as micro feeder
- stage2: fix bug that prevent user from updating the stage2 name
- stage2: fix rbfeeder script to grab serial from the correct log
diff --git a/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/app.py b/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/app.py
index 75c2be89..dee28789 100644
--- a/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/app.py
+++ b/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/app.py
@@ -938,6 +938,14 @@ def agg_status(self, agg, idx=0):
"adsbxfeederid": self._d.env_by_tags("adsbxfeederid").list_get(idx),
}
)
+ elif agg == "adsblol":
+ return json.dumps(
+ {
+ "beast": status.beast,
+ "mlat": status.mlat,
+ "adsblollink": self._d.env_by_tags("adsblol_link").list_get(idx),
+ }
+ )
return json.dumps({"beast": status.beast, "mlat": status.mlat})
@check_restart_lock
diff --git a/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/templates/index.html b/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/templates/index.html
index 75c71ced..51b87f81 100644
--- a/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/templates/index.html
+++ b/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/templates/index.html
@@ -265,24 +265,32 @@
Additional aggregator links
ADSB.lol feeder introduction
+ {% for idx in ns.site_indices %}
+ {% if list_is_enabled("adsblol", idx) %}
+ {% if idx == 0 %}
personal ADSB.lol URL with the planes you are sending
+ {% else %}
+ {{ list_value_by_tag('site_name', idx) }} personal ADSB.lol URL
+ {% endif %}
ADSB.lol
- MLAT feeder map
+ href="https://mlat.adsb.lol/syncmap/#lat={{ list_value_by_tag('lat', idx) }}#lon={{ list_value_by_tag('lng', idx) }}#zoom=10">ADSB.lol
+ MLAT feeder map for the area around {{ list_value_by_tag('site_name', idx) }}
- {% if is_enabled('stage2') %}
- (only those of your feeders that have MLAT privacy disabled will be shown)
- {% else %}
- {% if list_is_enabled("mlat_privacy", 0) %}
- (since you have MLAT privacy enabled, your feeder won't be shown)
- {% else %}
- (your feeder will be at an approximate location as {{ list_value_by_tag('site_name', 0) }})
- {% endif %}
- {% endif %}
+ {% endif %}
+ {% endfor %}
+ {% if is_enabled('stage2') %}
+ (on the MLAT maps only feeders that have MLAT privacy disabled will be shown)
+ {% else %}
+ {% if list_is_enabled("mlat_privacy", 0) %}
+ (since you have MLAT privacy enabled, your feeder won't be shown)
+ {% else %}
+ (your feeder will be at an approximate location as {{ list_value_by_tag('site_name', 0) }})
+ {% endif %}
+ {% endif %}
@@ -391,9 +422,21 @@ Additional aggregator links
} else {
$("#" + agg + "span" + idx).addClass('text-dark')
}
+ if (agg == "adsblol") {
+ if (idx > 0) {
+ console.log("set adsblol-link" + idx + " to " + data["adsblollink"])
+ $("#adsblol-link-" + idx).attr("href", data["adsblollink"])
+ }
+ }
if (agg == "adsbx") {
- $("#adsbxstatlink").attr("href", "https://www.adsbexchange.com/api/feeders/?feed=" + data["adsbxfeederid"])
- $("#adsbxmaplink").attr("href", "https://globe.adsbexchange.com/?feed=" + data["adsbxfeederid"])
+ if (idx == 0) {
+ $("#adsbxstatlink").attr("href", "https://www.adsbexchange.com/api/feeders/?feed=" + data["adsbxfeederid"])
+ $("#adsbxmaplink").attr("href", "https://globe.adsbexchange.com/?feed=" + data["adsbxfeederid"])
+ } else {
+ console.log("set adsbxstatlink" + idx)
+ $("#adsbxstatlink_" + idx).attr("href", "https://www.adsbexchange.com/api/feeders/?feed=" + data["adsbxfeederid"])
+ $("#adsbxmaplink_" + idx).attr("href", "https://globe.adsbexchange.com/?feed=" + data["adsbxfeederid"])
+ }
}
});
}
diff --git a/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/utils/agg_status.py b/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/utils/agg_status.py
index 3d31dab7..6b9f0c7a 100644
--- a/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/utils/agg_status.py
+++ b/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/utils/agg_status.py
@@ -89,15 +89,15 @@ def check(self):
if lolclients:
lolbeast = lolclients.get("beast")
lolmlat = lolclients.get("mlat")
- self._beast = (
- T.Yes
- if isinstance(lolbeast, list)
- and any(
- b.get("uuid", "xxxxxxxx-xxxx-")[:14] == uuid[:14]
- for b in lolbeast
- )
- else T.No
- )
+ self._beast = T.No
+ if isinstance(lolbeast, list):
+ for entry in lolbeast:
+ if entry.get("uuid", "xxxxxxxx-xxxx-")[:14] == uuid[:14]:
+ self._beast = T.Yes
+ self._d.env_by_tags("adsblol_link").list_set(
+ self._idx, entry.get("adsblol_my_url")
+ )
+ break
self._mlat = (
T.Yes
if isinstance(lolmlat, list)
@@ -108,6 +108,7 @@ def check(self):
else T.No
)
self._last_check = datetime.now()
+
else:
print_err(f"adsblol returned status {status}")
if self._agg == "flyitaly":
diff --git a/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/utils/data.py b/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/utils/data.py
index a9f53e08..7ffff6af 100644
--- a/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/utils/data.py
+++ b/src/modules/adsb-feeder/filesystem/root/opt/adsb/adsb-setup/utils/data.py
@@ -172,6 +172,7 @@ def proxy_routes(self):
# Ultrafeeder config, used for all 4 types of Ultrafeeder instances
Env("FEEDER_ULTRAFEEDER_CONFIG", tags=["ultrafeeder_config"]),
Env("ADSBLOL_UUID", default=[""], tags=["adsblol_uuid"]),
+ Env("ADSBLOL_LINK", default=[""], tags=["adsblol_link"]),
Env("ULTRAFEEDER_UUID", default=[""], tags=["ultrafeeder_uuid"]),
Env("MLAT_PRIVACY", default=[False], tags=["mlat_privacy", "is_enabled"]),
Env(