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.
switchNetzwerk-Switch. Wird als flacher Zylinder mit Antennen-Pins gerendert. Dient als Stern-Verteiler pro Etage / Sohle.
hostServer, Workstation, Drucker oder sonstiges Endgerät. Würfel-Geometrie mit Leuchtring.
accesspointWLAN Access Point. Disc-Körper + Antenne + radiale Heatmap auf dem Etagenboden. Benötigt wifiDbm.
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
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. |
type: 'building')buildFloors() generiert (FLOOR_STEP = 35 Szeneneinheiten pro Etage).
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
x | number |
PFLICHT | Horizontale Position (Ost/West) in Szeneneinheiten. Typischer Bereich: −60 … +60. |
y | number |
PFLICHT | Vertikale Position. Muss dem Y-Wert der zugehörigen Etage entsprechen. Formel: y = −(n−1)·17.5 + etage_index·35Beispiel 4 Etagen: EG=−52.5, 1.OG=−17.5, 2.OG=+17.5, 3.OG=+52.5 |
z | number |
PFLICHT | Horizontale Position (Nord/Süd) in Szeneneinheiten. Typischer Bereich: −60 … +60. |
type: 'mine')SCENE_MAX = 180 Einheiten normiert.
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
lat | number |
PFLICHT | Breitengrad (WGS84), z.B. 51.4750. Wird relativ zum Modell-Referenzpunkt projiziert. |
lon | number |
PFLICHT | Längengrad (WGS84), z.B. 9.2900. |
x, y, z | number |
OPTIONAL | Können als Fallback angegeben werden, werden bei Geo-Projektion ignoriert. Nützlich für Hybrid-Datensätze. |
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
wifiDbm | number |
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). |
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
source | string |
PFLICHT | Node-ID des Quell-Knotens. |
target | string |
PFLICHT | Node-ID des Ziel-Knotens. |
status | string |
PFLICHT | Link-Status: ok warning critical down unknown. Steuert Farbe der Linie und des Funken. |
tunnel | boolean |
OPTIONAL |
true → Link wird als leuchtende Tunnel-/Kabelkanal-Röhre gerendert (TubeGeometry + Glow-Shell).Auto-Erkennung Grubenmodell: Wenn beide Nodes auf einer Sohle liegen und die 3D-Distanz > TUNNEL_MIN_DIST (Standard: 30 Szeneneinheiten), wird automatisch tunnel:true angewendet.Gebäudemodell: muss explizit gesetzt werden (Kabelkanal-Optik, Bogen nach oben). |
| Parameter | Grubenmodell (Stollen) | Gebäudemodell (Kabelkanal) |
|---|---|---|
| Bogenrichtung | nach unten (−4 u) | nach oben (+3 u, Decke) |
| Innenrohr-Radius | 0.65 Szeneneinheiten | 0.25 Szeneneinheiten |
| Glow-Shell-Radius | 3.2 Szeneneinheiten | 1.4 Szeneneinheiten |
| Erkennung | automatisch (beide SOHLE + Distanz) | explizit tunnel:true |
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.
type: 'building')| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Eindeutiger Bezeichner (URL-Hash). |
name | string | Anzeigename im Modell-Dialog und OSM-Karte. |
type | 'building' | Statische Koordinaten, Etagenplatten, Kabelkanal-Tunnel. |
floorCount | number | Anzahl Etagen (EG + OGs). Min 2, Max 20. |
floorHeight | number | Etagenhöhe in Metern (nur Sub-Label). |
width | number | Gebäudebreite in Metern (Etagenplatte). |
length | number | Gebäudelänge in Metern (Etagenplatte). |
lat, lon | number | GPS-Koordinate — erscheint als Marker auf der OSM-Übersichtskarte. |
dataUrl | string | Pfad zur JSON-Datendatei, z.B. 'data/building.json'. Wird gecacht. |
type: 'mine')| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Eindeutiger Bezeichner. |
name | string | Anzeigename. |
type | 'mine' | Geo-Projektion über lat/lon, Stollen-Tunnel-Glow. |
floorHeight | number | Teufendifferenz pro Sohle in Metern (Sub-Label: „−300 m"). |
lat, lon | number | Schacht-Referenzkoordinate für Geo-Projektion + OSM-Marker. |
floors[] | array | Sohlen-Liste: { label, sub }. Label muss exakt dem floor-Feld der Nodes entsprechen. |
dataUrl | string | Pfad zur JSON-Datendatei, z.B. 'data/grube1.json'. |
type: 'datacenter')| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Eindeutiger Bezeichner. |
name | string | Anzeigename. |
type | 'datacenter' | Rack-Layout, Server-Meshes, Link-Visualisierung deaktiviert. |
width | number | Raumbreite in Metern. |
length | number | Raumlänge in Metern. |
rows | number | Anzahl Rack-Reihen (A, B, C …). |
racksPerRow | number | Racks pro Reihe. |
rackUnits | number | Höheneinheiten pro Rack (Standard: 42 HE). |
dataUrl | string | Pfad zur JSON-Datendatei, z.B. 'data/dc1.json'. |
| Modell | Etage | Y bei 4 Etagen | Y 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 |
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.
X/Y/Z werden direkt als Szeneneinheiten übernommen. Der Empfangskorridor für Etagen-Sichtbarkeit beträgt ±8 Szeneneinheiten um den Etagen-Y-Wert.
// 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 }
// 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) }
{
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
}
{
source: 'sw-og2',
target: 'ws-2-01',
status: 'ok',
tunnel: true, // Kabelkanal-Glow (Gebäude) oder Stollen-Glow (Grube)
}
// 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 }
// 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 }
// 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 */ ] }
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" }
]
}
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.
Alle Node-/Link-Daten liegen als separate JSON-Dateien im Ordner data/.
Das ermöglicht beliebig viele Standorte ohne app.js anzufassen.
v3/
├── app.js
├── index.html
├── models.json ← optionale externe Registry
└── data/
├── building.json
├── dc1.json
├── grube1.json
└── grube2.json
data/*.json){
"nodes": [ /* Node-Objekte – identisch zu inline-Daten */ ],
"links": [ /* Link-Objekte */ ]
}
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": [ /* ... */ ]
}
]
MODEL_PRESETS[] vorhandene IDs werden beim Registry-Laden
übersprungen — keine Duplikate.
| Taste / Aktion | Funktion |
|---|---|
M | OSM-Übersichtskarte öffnen / schließen |
Ctrl+F | Host-Suche fokussieren |
Escape | Inspector schließen · 2D-Modus verlassen · Cockpit beenden · Suche leeren |
| Mausrad | Zoom |
| Linke Maustaste ziehen | Szene drehen (deaktiviert Auto-Orbit) |
| Rechte Maustaste ziehen | Szene verschieben |
| Node anklicken | Inspector öffnen |
| Etagen-Button (rechts) | 2D-Grundrissansicht der Etage |
| Button | Funktion |
|---|---|
| 🗺 | OSM-Übersichtskarte (alle Standorte mit lat/lon als Marker) |
| ? | Diese Dokumentationsseite |
| ⚡ | Cockpit-Modus (nur Hosts mit Problem) |
| ⚑ n | Problemliste (alle kritischen / down Hosts) |
| Modellname ▾ | Modell wechseln / neues Modell anlegen |
| Auto-Orbit | Kamera-Rotation ein/aus |
| ORBIT RADIUS | Abstand der Orbit-Kamera (30–250 Szeneneinheiten) |
| FLOW SPEED | Geschwindigkeit der Datenfluss-Animation auf Links |