Neanderfunk-Karte (beta): meshviewer, yanic, unifi_respondd

Neue Karte für den Neanderfunk, noch beta: https://neander.map.freifunk.space/.

Unten, was in meshviewer, yanic und unifi_respondd anders ist als upstream und was drumherum läuft.
Je Punkt ein gepinnter Commit, dazu der Stand upstream.
Die Forks werden per Merge auf den Upstream-Stand nachgezogen, lokale Änderungen bleiben je Funktion ein Commit (git log --no-merges --first-parent).

meshviewer

  • Fork: Neanderfunk/meshviewer, Branch neanderfunk, AGPL-3.0 wie das Original. Gepinnt: GitHub - Neanderfunk/meshviewer at f34bd2398b3a5850473a3a8a5e2f1d5a83d220bb · GitHub
  • Basis: freifunk/meshviewer df76ed7 (26.09.2026), aktueller Stand, einschließlich externer GeoJSON per URL (#476).
  • Je Funktion ein Commit, erklärt in NEANDERFUNK.md im Fork. Alle neuen Konfigurationsschlüssel sind optional, ohne sie verhält sich der Branch wie das Original.

Features

Bugfixes

Stand upstream (freifunk/meshviewer, 28.09.2026)

  • Airtime: #28 „integrate features from hopglass“, geschlossen 09.09.2023, der Punkt „showing Radio Channel (and Airtime) on map“ darin NICHT abgehakt.
  • Diagramme: #388 „[FEATURE] add client side rendered charts“, gemergt 16.06.2026, das ist der Grafana-Weg, auf dem prometheus-direct aufsetzt. Offen: #402 (Link zu Grafana), #403 (Zeitformat bei kurzen Zeiträumen), PR #417 (InfluxDB ALIAS BY für mehrere Reihen).
  • Dark Theme: #423 invertInDarkMode, gemergt 07.08.2026. Zu Beschriftungsfarben je Theme nichts.
  • Verwandt, nicht dasselbe: #82 (Link auf Knoten-Subdomain), offen seit 24.12.2023.
  • Zu WMS, Koordinatenzeile, Statistik-Links, Zahnrad, Pause im Hintergrund, Kopierknopf und Startausschnitt kein Issue und kein PR gefunden.

Limits

  • Diagramme, Airtime und Wertezeilen benötigen eine Prometheus-API, die der Browser erreicht. Bei uns derselbe Host unter /nf/prom/, nur lesend.
  • Airtime kennt nur die Bänder, die yanic kennt: 11g (2,4 GHz) und 11a (5 GHz). 6 GHz fehlt (noch).
  • Geprüft nur auf unserer Instanz, mit Firefox und headless Chromium; die Handyansicht nur für den Startausschnitt (400 px).
  • Die Pause im Hintergrund umgeht einen Firefox-Bug: Firefox 149, drei Kartentabs über Stunden, 35, 10 und 11 GB je Tab, davon laut about:memory 11,1 GB heap/committed/unused-pages/dirty bei 0,8 GB belegt. Chromium über 60 Aktualisierungen: Heap konstant 21 bis 26 MB. Offen als Mozilla-Bug 2070900 (NEW seit 10.09.2026). Behebt Mozilla ihn, fliegt die Pause wieder raus.
  • meshviewer.json bei 1716 Knoten: 1,9 MB, mit gzip 299 KB, einmal pro Minute.

yanic

Features

Bugfixes

Stand upstream (Codeberg FreifunkBremen/yanic, 28.09.2026)

  • Unicast: #21 (PR, Unicast an Knoten, die auf den Multicast nicht antworteten) 2017 ungemergt geschlossen, das Verhalten steckt heute trotzdem in yanic (sendUnicasts); #13 und #121 geschlossen. Offen #209 (Zielport einstellbar, 04.01.2022). Zu Adressen aus einer Datei nichts.
  • Zusatzfelder: #171 (PR, custom respondd fields), gemergt 29.12.2019; #142 (Kanal und Airtime in meshviewer.json), geschlossen 14.04.2022. Ob #171 unsere Werte schon in den Influx-Ausgang bringen würde, ist nicht geprüft.
  • Links: #149 (gleicher TQ in beide Richtungen), geschlossen 04.01.2019; #239 (PR, link type everywhere), gemergt 29.06.2025; offen #218 (is_active für Links, 02.02.2023). Zu per Proxy gemeldeten APs und doppelt gezählten Clients nichts.
  • Entfernen: #81 (PR, contrib/yanic-remove-node, ein Skript für die Zustandsdatei), gemergt 02.11.2017. Zu einem Auftragsverzeichnis im laufenden Betrieb nichts.
  • Aliase: nichts; #50 betrifft nur das hopglass-Ausgabeformat.
  • Kontext: offen #156 „Should yanic be also a respondd daemon“ (21.01.2019).

Limits

  • statistics.neanderfunk liest nur Felder unseres Pakets, anderswo gibt es die nicht. Alles andere ist generisch.
  • seeds ist bei uns derzeit nicht aktiv.
  • Die AP-Erkennung hängt allein an software.firmware.base. Der Router eines AP ist der batman-Nachbar, den der AP meldet; stimmt die Zuordnung beim Proxy nicht, stimmt auch die Korrektur nicht.
  • Aliase und Entfernen sind nur mit unserem eigenen Service-Menü geprüft, mit einer echten hopglass-Aliasdatei nicht.

unifi_respondd

  • Fork: Neanderfunk/unifi_respondd, Branch neanderfunk, GPL-3.0 wie das Original. Gepinnt: GitHub - Neanderfunk/unifi_respondd at 6a0ef19520e9f87a34b2683cb8def825ea8b4e21 · GitHub
  • Basis: freifunkMUC/unifi_respondd 6976651 (18.09.2026), zugleich der aktuelle Stand von upstream main.
  • Je Funktion ein Commit, erklärt in NEANDERFUNK.md. 113 Tests am Endstand grün. Ohne offloader_by_ap und interfaces verhält sich der Fork bis auf die Bugfixes wie upstream.

Features

Bugfixes

  • Null Island. APs ohne SNMP Location standen bei 0/0 im Golf von Guinea, Karten mit berechnetem Ausschnitt zogen ihn bis dorthin auf. Upstream setzt lat, lon = 0, 0 als Vorgabe. Fix: kein Ort statt 0/0, auch bei eingetragener 0/0; der AP steht dann in Liste und Graph an seinem Router, nur nicht auf der Karte. Ohne Koordinaten kein Ort statt 0/0 · Neanderfunk/unifi_respondd@727951f · GitHub
  • Airtime 0 %. In rx/tx standen Bytezähler der SSIDs statt Funkzeit, beim 2,4-GHz-Band sogar die des 5-GHz-Bandes, active fehlte. Fix: Airtime aus dem Controller, siehe oben.
  • Sendefehler beendeten den Dienst. Scheiterte sendto, beendete die Exception den Prozess, systemd startete ihn nach 30 s neu. Bei uns alle fünf Minuten, Ursache eine volle IPv6-Neighbour-Tabelle (EINVAL). Fix: protokollieren, mit dem nächsten Paket weiter. Sendefehler beenden nicht mehr den Dienst · Neanderfunk/unifi_respondd@4b445cc · GitHub

Stand upstream (freifunkMUC/unifi_respondd, 28.09.2026)

  • Ort: #95 (leere SNMP Location nicht geocoden) und #97 (Rekursion begrenzen), beide gemergt 18.09.2026; #9 (Koordinaten aus SNMP Location), gemergt 02.01.2022. Zu Verzicht auf Nominatim, Himmelsrichtungen, DMS oder 0/0 nichts.
  • Funk: #41 (wireless infos), gemergt 13.05.2024; #50 (tx/rx_bytes), gemergt 25.08.2025. Zu Airtime aus radio_table_stats nichts.
  • Router: #22 (neighbour/offloader), gemergt 10.01.2022; #35 (Link zum Offloader fehlt manchmal), geschlossen 24.08.2022. Zu einer Zuordnung je AP nichts.
  • Domains: #24 (domain add), gemergt 13.01.2022; #39 (fallback domain), gemergt 26.10.2024. Zu mehreren Interfaces und site_code nichts.
  • Controller: #21 (einmal fragen), gemergt 07.01.2022; #98 (Site überspringen bei Fehler), gemergt 18.09.2026; offen PR #96 (Session wiederverwenden).
  • Abstürze: #36, geschlossen 23.01.2025 mit #43; #37 (systemd-Workaround), gemergt 31.03.2022. Zu sendto nichts.
  • Offen, würden beim Nachziehen unsere Commits berühren: PR #94 (Multi-Controller, omada), PR #71 (provider-agnostisch: UniFi, Omada, UISP), PR #70 (Abstract Base Classes).

Limits

  • Die Zuordnung AP zu Router ist an unsere Infrastruktur gebunden: Sie entsteht aus den Translation Tables unseres Mapservers. Die Liste der Herstellerpräfixe darin ist gepflegt, nicht vollständig.
  • APs ohne gemessenen Router meldet der Dienst nicht; ein falscher Router wäre schlimmer als ein fehlender AP. Out-of-band verwaltete Installationen lassen sich so nicht messen.
  • 6 GHz fehlt, yanic kennt nur 11g und 11a. Am 25.09.2026 meldete keiner der 545 APs ein aktives 6-GHz-Modul.
  • Noise liefert der Controller nicht. Airtime ist so alt wie die Daten des Controllers, einige Minuten.
  • Geprüft mit einem Controller und nur auf unserer Instanz. Im Feld nur Nordhalbkugel und östliche Längen, der Rest mit Tests.
  • Zahlen, 25.09.2026, erste Messung nach Inbetriebnahme: 544 APs online, 1021 Clients an APs; Summe aller Clients rund 3050, ohne das Abziehen beim Router wären es rund 4000 gewesen.

Zeitreihen, Grafana, Mapserver

  • Repo: Neanderfunk/mapserver, BSD-3-Clause: Einrichtungsskripte je Schicht, Generatoren für yanic-, meshviewer- und nginx-Konfiguration, die Grafana-Dashboards als Generator, Checkmk-Checks, Doku. Baut die drei Forks aus deren Branch neanderfunk. Gepinnt: GitHub - Neanderfunk/mapserver at 11fcd8599d6aeb1b5c89194d8ca2d04eadc49b83 · GitHub
  • Unverändert aus Paketen bzw. festen Upstream-Commits: VictoriaMetrics 1.112.0 (Debian trixie), Grafana 13.2.2, mesh-announce 40be9a1, Tunneldigger-Client 9a9a427 (C).

Zeitreihen

  • yanic schreibt über den Influx-Ausgang nach VictoriaMetrics, Metriknamen <measurement>_<feld>, etwa node_load, link_tq, node_airtime11g.chan_util. Aufbewahrung 400 Tage.
  • Beim Empfang verworfen: owner (Kontaktangaben, yanic kennt für diesen Ausgang kein no_owner) und Frequenz-Labels. Ein Kanalwechsel erzeugte sonst jedes Mal eine neue Zeitreihe, ein Gerät kam so an einem Tag auf 16. Die Frequenz bleibt als Messwert.
  • Lesend öffentlich: https://neander.map.freifunk.space/nf/prom/api/v1/, freigegeben nur query, query_range, series, labels, label/<name>/values, export, status/tsdb, federate; alles andere 403. Dieselbe Quelle, aus der das Knotenfenster zeichnet.
  • 89 643 Zeitreihen (28.09.2026).

Grafana

  • Grafana, ohne Anmeldung lesbar.
  • Dashboards Knoten (aus dem Knotenfenster verlinkt), Domain, Community (oben im Reiter Statistik verlinkt), Supernode. Erzeugt per Skript (zeitreihe/grafana/dashboard-erzeugen.py), nicht von Hand gepflegt.
  • Community: Gluon-Knoten und Supernodes als große Zahlen, Verläufe für Firmware, Hardware und Targets, Traffic nur einmal gezählt statt Knoten- und Supernode-Seite addiert.

Mapserver

  • Eine Karte für alle 48 Domains, alle Konfiguration aus einer Domaintabelle, ein meshviewer-Build.
  • Tunnel je Domain, im Mesh nur ein fragender Knoten: kein gw_mode, keine Clients, kein DHCP, kein Forwarding, nur Link-Local, accept_ra aus, feste lokal verwaltete MACs, ein sprechender Name am Broker.
  • mesh-announce antwortet für den Mapserver als map-neanderfunk-<domaincode>, sonst wäre er für jede andere Karte ein Knoten ohne Daten. Teilt Port 1001 mit unifi_respondd.
  • Startausschnitt ohne Ausreißer: Knoten bis 25 km Abstand bilden eine Gruppe, auch über Ketten; es zählen die größte Gruppe und jede ab 10 % der Knoten; 0/0 zählt nie. Bei 1002 Knoten mit Ort liegen 977 im Kern. Startausschnitt ohne Ausreisser · Neanderfunk/mapserver@875dd68 · GitHub
  • Service-Menü hinter Authentik, nur für Betreuende: Offline-Knoten entfernen, Koordinaten überschreiben oder von der Karte nehmen, Namen ändern, mit Verlauf. Technisch über aliases_path und remove_dir in yanic.
  • Adresse im Koordinaten-Picker über einen eigenen Proxy mit Cache statt direkt aus dem Browser an Nominatim: weiter geht nur Breite und Länge auf 5 Nachkommastellen, höchstens eine Anfrage je Sekunde, Cache 30 Tage.
  • Auslieferung mit gzip seit 27.09.2026; die Debian-Vorgabe von nginx komprimiert nur text/html.
  • IPv6-Neighbour-Tabelle: gc_thresh3 1024 (Debian-Vorgabe) reicht bei 43 batman-Instanzen nicht, sendto scheiterte mit EINVAL. Jetzt 16384.

Limits

  • Keine Vektorkarten, Grundkarte sind Rasterkacheln über unseren Kachel-Proxy plus WMS NRW.
  • Eine zweite Installation aus dem Repo from scratch hat es nicht gegeben, die Einrichtungsskripte sind hier nur einmal durchgelaufen.

Feedback von Nachnutzenden erwünscht.