Datenreferenz & Node-Spezifikation

Beschreibt alle Felder, die ein Node oder Link in einer externen JSON-Datei (data/*.json) benötigt, um korrekt platziert, gerendert und animiert zu werden. Modelle werden über dataUrl in MODEL_PRESETS[] verknüpft oder aus der Registry models.json geladen.

Inhalt
  1. Node-Typen
  2. Node-Felder
  3. Link-Felder
  4. Modell-Konfiguration
  5. Platzierungslogik
  6. Vollständige Beispiele
  7. WebSocket-Statusupdates

1 · Node-Typen

switch

Netzwerk-Switch. Wird als flacher Zylinder mit Antennen-Pins gerendert. Dient als Stern-Verteiler pro Etage / Sohle.

host

Server, Workstation, Drucker oder sonstiges Endgerät. Würfel-Geometrie mit Leuchtring.

accesspoint

WLAN Access Point. Disc-Körper + Antenne + radiale Heatmap auf dem Etagenboden. Benötigt wifiDbm.

2 · Node-Felder

Pflichtfelder (alle Node-Typen)

FeldTypPflichtBeschreibung
id string PFLICHT Eindeutiger Bezeichner. Wird für Links als Referenz (source/target) und für WebSocket-Updates (host-Feld) verwendet. Keine Leerzeichen, keine Sonderzeichen außer - und _.
label string PFLICHT Anzeigename im 3D-Label, Inspector und Problemliste. Kann Leerzeichen und Umlaute enthalten.
type string PFLICHT Node-Typ: switch · host · accesspoint. Steuert Geometrie, Größe und Heatmap-Rendering.
status string PFLICHT Initialer Monitoring-Status: ok warning critical down unknown. Wird durch WebSocket-Updates überschrieben.
floor string PFLICHT Etagenbezeichnung – muss exakt einem label in MODEL_PRESETS[].floors[] entsprechen (z.B. "SOHLE 1", "2. OG", "ÜBERTAGE"). Steuert Sichtbarkeit bei Etagenfilter.

Positionierung – Gebäude-Modell (type: 'building')

Gebäudemodelle verwenden statische Szenen-Koordinaten. Kein Geo-Projektion. Y-Werte werden von buildFloors() generiert (FLOOR_STEP = 35 Szeneneinheiten pro Etage).
FeldTypPflichtBeschreibung
xnumber PFLICHT Horizontale Position (Ost/West) in Szeneneinheiten. Typischer Bereich: −60 … +60.
ynumber PFLICHT Vertikale Position. Muss dem Y-Wert der zugehörigen Etage entsprechen.
Formel: y = −(n−1)·17.5 + etage_index·35
Beispiel 4 Etagen: EG=−52.5, 1.OG=−17.5, 2.OG=+17.5, 3.OG=+52.5
znumber PFLICHT Horizontale Position (Nord/Süd) in Szeneneinheiten. Typischer Bereich: −60 … +60.

Positionierung – Gruben-Modell (type: 'mine')

Grubenmodelle projizieren GPS-Koordinaten auf die Szene. X/Y/Z werden automatisch berechnet. Größter Cluster pro Sohle wird auf SCENE_MAX = 180 Einheiten normiert.
FeldTypPflichtBeschreibung
latnumber PFLICHT Breitengrad (WGS84), z.B. 51.4750. Wird relativ zum Modell-Referenzpunkt projiziert.
lonnumber PFLICHT Längengrad (WGS84), z.B. 9.2900.
x, y, znumber OPTIONAL Können als Fallback angegeben werden, werden bei Geo-Projektion ignoriert. Nützlich für Hybrid-Datensätze.

Optionale Felder

FeldTypPflichtBeschreibung
wifiDbmnumber NUR accesspoint Signalstärke in dBm (negativ). Steuert den Radius der Heatmap auf dem Etagenboden.
Mapping: −30 dBm → 48 Szeneneinheiten (stark) bis −90 dBm → 8 Szeneneinheiten (schwach).
Typische Werte: −40 (sehr gut) · −60 (gut) · −75 (schwach).

4 · Modell-Konfiguration

Modelle werden in MODEL_PRESETS[] in app.js definiert oder über models.json nachgeladen. Node-/Link-Daten liegen in externen JSON-Dateien und werden per dataUrl referenziert.

Gebäudemodell-Felder (type: 'building')

FeldTypBeschreibung
idstringEindeutiger Bezeichner (URL-Hash).
namestringAnzeigename im Modell-Dialog und OSM-Karte.
type'building'Statische Koordinaten, Etagenplatten, Kabelkanal-Tunnel.
floorCountnumberAnzahl Etagen (EG + OGs). Min 2, Max 20.
floorHeightnumberEtagenhöhe in Metern (nur Sub-Label).
widthnumberGebäudebreite in Metern (Etagenplatte).
lengthnumberGebäudelänge in Metern (Etagenplatte).
lat, lonnumberGPS-Koordinate — erscheint als Marker auf der OSM-Übersichtskarte.
dataUrlstringPfad zur JSON-Datendatei, z.B. 'data/building.json'. Wird gecacht.

Grubenmodell-Felder (type: 'mine')

FeldTypBeschreibung
idstringEindeutiger Bezeichner.
namestringAnzeigename.
type'mine'Geo-Projektion über lat/lon, Stollen-Tunnel-Glow.
floorHeightnumberTeufendifferenz pro Sohle in Metern (Sub-Label: „−300 m").
lat, lonnumberSchacht-Referenzkoordinate für Geo-Projektion + OSM-Marker.
floors[]arraySohlen-Liste: { label, sub }. Label muss exakt dem floor-Feld der Nodes entsprechen.
dataUrlstringPfad zur JSON-Datendatei, z.B. 'data/grube1.json'.

Datacenter-Felder (type: 'datacenter')

FeldTypBeschreibung
idstringEindeutiger Bezeichner.
namestringAnzeigename.
type'datacenter'Rack-Layout, Server-Meshes, Link-Visualisierung deaktiviert.
widthnumberRaumbreite in Metern.
lengthnumberRaumlänge in Metern.
rowsnumberAnzahl Rack-Reihen (A, B, C …).
racksPerRownumberRacks pro Reihe.
rackUnitsnumberHöheneinheiten pro Rack (Standard: 42 HE).
dataUrlstringPfad zur JSON-Datendatei, z.B. 'data/dc1.json'.

Y-Werte der Etagen

Der Abstand zwischen Etagen ist fest: FLOOR_STEP = 35 Szeneneinheiten.
Gebäude wachsen nach oben (EG unten), Gruben nach unten (ÜBERTAGE oben).
ModellEtageY bei 4 EtagenY bei 6 Etagen
building EG / 0. Etage−52.5−87.5
1. OG−17.5−52.5
2. OG+17.5−17.5
3. OG+52.5+17.5
mine ÜBERTAGE+52.5+87.5
SOHLE 1+17.5+52.5
SOHLE 2−17.5+17.5
SOHLE 3−52.5−17.5

5 · Platzierungslogik

Grubenmodell – Geo-Projektion

Lat/Lon wird relativ zum Modell-Referenzpunkt (cfg.lat, cfg.lon) in Meter-Offsets umgerechnet (Mercator-Näherung), dann auf den größten Cluster der Sohle normiert (max. 180 Szeneneinheiten breit). Der Cluster-Schwerpunkt wird auf (0, floor.y, 0) zentriert.

Faustregel: Je weiter Nodes auf einer Sohle geografisch auseinanderliegen, desto größer die Szene auf dieser Sohle. Kleinere Cluster (andere Sohlen) werden proportional kleiner dargestellt.

Gebäudemodell – Statische Koordinaten

X/Y/Z werden direkt als Szeneneinheiten übernommen. Der Empfangskorridor für Etagen-Sichtbarkeit beträgt ±8 Szeneneinheiten um den Etagen-Y-Wert.

Tunnel-Auto-Erkennung (Grubenmodell)

TUNNEL_MIN_DIST = 30 Szeneneinheiten

Bedingung: srcFloor.includes('SOHLE') && tgtFloor.includes('SOHLE')
&& start.distanceTo(end) > 30

TubeGeometry + Glow-Shell statt einfacher Linie

6 · Vollständige Beispiele

Switch – Grubenmodell (Geo)

// Gilt für: mines, Geo-Projektion über lat/lon
{
  id:     'core-sw-s1',
  label:  'CORE-SW-SOHLE1',
  type:   'switch',
  status: 'ok',
  floor:  'SOHLE 1',       // muss exakt mit floors[].label übereinstimmen
  lat: 51.5050,            // WGS84 Breitengrad
  lon: 9.3350,             // WGS84 Längengrad
}

Host – Gebäudemodell (statisch)

// Gilt für: buildings, direkte Szenen-Koordinaten
{
  id:     'ws-2-01',
  label:  'WS-2-01',
  type:   'host',
  status: 'ok',
  floor:  '2. OG',         // buildFloors() → y ≈ +17.5 bei 4 Etagen
  x: -32, y: 18, z: -20,   // y exakt auf Etagen-Y setzen (±8 Toleranz)
}

AccessPoint – mit Heatmap

{
  id:      'ap-og2-01',
  label:   'AP-2OG-01',
  type:    'accesspoint',
  status:  'ok',
  floor:   '2. OG',
  x: 0, y: 18, z: -12,
  wifiDbm: -41,             // −30 (max) … −90 (min) → Radius 48 … 8
}

Link mit Tunnel-Optik (explizit)

{
  source: 'sw-og2',
  target: 'ws-2-01',
  status: 'ok',
  tunnel: true,             // Kabelkanal-Glow (Gebäude) oder Stollen-Glow (Grube)
}

Portal-Node (Modell-Verknüpfung)

// linkedModel verweist auf die id eines anderen Modells.
// → pulsierendes ⇒-Label + "Innenansicht öffnen"-Button im Inspector.
{
  id:           'portal-to-dc',
  label:        'Datacenter-Raum',
  type:         'host',
  status:       'ok',
  floor:        'EG',
  x: -35, y: -52, z: -35,
  linkedModel:  'dc1',       // id des Ziel-Modells
}

Server-Node (Datacenter)

// type:'server' → flaches 1HE-Mesh mit Status-LED.
// Y-Achse: 0 = Rack-Boden, 8 = Rack-Decke (42 HE ≙ 8 Szeneneinheiten)
{
  id:     'web-dc-01',
  label:  'web-dc-01',
  type:   'server',
  status: 'ok',
  floor:  'Datacenter',
  x: -13, y: 1.0, z: 0,   // y ≈ 1–2: unteres Drittel, 4–5: Mitte, 6–7: oben
}

Eigenes Modell-Preset (externe Datei)

// In MODEL_PRESETS[] in app.js eintragen:
{
  id:          'werk-nord',
  name:        'Werk Nord',
  type:        'mine',
  floorHeight: 250,
  lat: 51.48, lon: 9.31,
  floors: [
    { label: 'ÜBERTAGE', sub: 'Schachtanlage' },
    { label: 'SOHLE 1',  sub: '−250 m' },
    { label: 'SOHLE 2',  sub: '−500 m' },
  ],
  dataUrl: 'data/werk-nord.json',  // externe JSON-Datei (gecacht nach erstem Laden)
}

// data/werk-nord.json (Struktur):
{ "nodes": [ /* Node-Objekte */ ], "links": [ /* Link-Objekte */ ] }

7 · WebSocket-Statusupdates

Die Karte kann Live-Statusupdates über WebSocket empfangen. Verbindung herstellen mit:

// In app.js – Zeile am Ende der Datei auskommentieren:
app.connectWS('ws://nagios-server:8008/ws/map/my-map');

Erwartetes Nachrichtenformat (JSON):

{
  "type":  "status_update",
  "hosts": [
    { "id": "core-sw-s1", "status": "ok"       },
    { "id": "web-01",     "status": "critical" },
    { "id": "fw-01",      "status": "down"     }
  ]
}
Hinweis: Das Feld id im WebSocket-Update muss exakt der id des entsprechenden Nodes im geladenen Datensatz entsprechen. Unbekannte IDs werden stillschweigend ignoriert.

Bei einem Statuswechsel auf critical oder down werden automatisch Pulsringe um den betroffenen Node gespawnt.

8 · Externe Datendateien & Registry

Alle Node-/Link-Daten liegen als separate JSON-Dateien im Ordner data/. Das ermöglicht beliebig viele Standorte ohne app.js anzufassen.

Dateistruktur

v3/
├── app.js
├── index.html
├── models.json          ← optionale externe Registry
└── data/
    ├── building.json
    ├── dc1.json
    ├── grube1.json
    └── grube2.json

JSON-Dateiformat (data/*.json)

{
  "nodes": [ /* Node-Objekte – identisch zu inline-Daten */ ],
  "links": [ /* Link-Objekte */ ]
}

Modell-Registry (models.json)

Optionale externe Liste aller Modelle. Wird über ModelManager.loadRegistry('models.json') geladen (im Boot-Abschnitt von app.js auskommentiert). Format: Array von Modell-Preset-Objekten mit dataUrl statt inline-data.

[
  {
    "id":       "grube1",
    "name":     "Grube 1 · Heringen",
    "type":     "mine",
    "lat": 50.8922, "lon": 9.8979,
    "dataUrl":  "data/grube1.json",
    "floors": [ /* ... */ ]
  }
]
Bereits in MODEL_PRESETS[] vorhandene IDs werden beim Registry-Laden übersprungen — keine Duplikate.

9 · Tastatur-Shortcuts & UI

Taste / AktionFunktion
MOSM-Übersichtskarte öffnen / schließen
Ctrl+FHost-Suche fokussieren
EscapeInspector schließen · 2D-Modus verlassen · Cockpit beenden · Suche leeren
MausradZoom
Linke Maustaste ziehenSzene drehen (deaktiviert Auto-Orbit)
Rechte Maustaste ziehenSzene verschieben
Node anklickenInspector öffnen
Etagen-Button (rechts)2D-Grundrissansicht der Etage

HUD-Buttons

ButtonFunktion
🗺OSM-Übersichtskarte (alle Standorte mit lat/lon als Marker)
?Diese Dokumentationsseite
Cockpit-Modus (nur Hosts mit Problem)
⚑ nProblemliste (alle kritischen / down Hosts)
Modellname ▾Modell wechseln / neues Modell anlegen
Auto-OrbitKamera-Rotation ein/aus
ORBIT RADIUSAbstand der Orbit-Kamera (30–250 Szeneneinheiten)
FLOW SPEEDGeschwindigkeit der Datenfluss-Animation auf Links