# Datenpunkte

Der Adapter bringt keine feste Liste an Datenpunkten mit. Er fragt den NUT-Server, was Ihre USV meldet (`LIST VAR`),
und baut den Baum aus der Antwort — zwei verschiedene USV-Modelle ergeben also zwei verschiedene Bäume. Was folgt,
erklärt die Teile, die immer gleich sind, und wie aus einer NUT-Variablen ein ioBroker-Datenpunkt wird.

Jeder Datenpunkt trägt eine kurze Erklärung in `common.desc`, und Wertelisten, Statustexte und Schweregrade erscheinen
in Ihrer ioBroker-Systemsprache.

## Vom NUT-Namen zur Objekt-ID

NUT benennt seine Variablen mit Punkten: `battery.charge.low`. ioBroker nutzt Punkte für die Hierarchie, deshalb bildet
der Adapter das ab:

- der **erste** Punkt trennt den Kanal ab — `battery`
- jeder weitere Punkt wird zum Bindestrich — `charge-low`

`battery.charge.low` landet damit unter `ups0.battery.charge-low`, und der Befehl `test.battery.start` unter
`ups0.commands.test-battery-start`. Eine Variable ganz ohne Punkt hat keinen Kanal und wird direkt unter dem Gerät
angelegt.

Den echten NUT-Namen behält der Adapter intern, damit ein Schreibvorgang den richtigen Namen an den Server
zurückschickt — auch dort, wo die Abbildung nicht umkehrbar ist (Dreiphasen-Namen wie `input.L1-L2.voltage` enthalten
selbst einen Bindestrich).

## Adapterweite Datenpunkte

| Datenpunkt             | Bedeutung                                                                                                     |
| ---------------------- | ------------------------------------------------------------------------------------------------------------- |
| `info.connection`      | Der Adapter spricht mit dem NUT-Server. Über die Zugangsdaten sagt das nichts.                                |
| `info.upsTotal`        | Wie viele USVen der Server anbietet.                                                                          |
| `info.upsReachable`    | Wie viele davon die letzte Abfrage beantwortet haben.                                                         |
| `info.allUpsReachable` | Ein Wert statt jedes Geräts. **Falsch**, solange gar nichts gefunden wurde — „0 von 0" ist nicht „alles gut". |
| `notify`               | Beschreibbarer Auslöser. Jeder Schreibvorgang fragt sofort ab; siehe häufige Fragen.                          |

## Je USV

Jede USV am Server wird ein Gerät. Ihr Name kommt aus dem `desc`, das Sie in der `ups.conf` des Servers gesetzt haben;
ohne einen solchen nimmt der Adapter Hersteller und Modell aus der USV selbst.

### `info`

| Datenpunkt  | Bedeutung                                                                                                                                                                                                                       |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `reachable` | Diese USV hat die letzte Abfrage beantwortet. Der Wert trägt auch das Online-Symbol am Geräteobjekt und geht auf falsch, wenn der Adapter stoppt — ein gestoppter Adapter darf nicht weiter behaupten, es sei alles in Ordnung. |
| `notify`    | Das letzte upsmon-Ereignis, das dieser USV zugeordnet wurde.                                                                                                                                                                    |

### `status` — der ausgewertete Zustand

NUT meldet den Zustand einer USV als eine Zeichenkette aus Kürzeln, z. B. `OL CHRG`. Damit lässt sich in einem Skript
schlecht arbeiten, deshalb zerlegt der Adapter sie:

| Datenpunkt        | Bedeutung                                                                                                                                                                                                                            |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `raw`             | Die Originalzeichenkette, unverändert.                                                                                                                                                                                               |
| `display`         | Dieselbe Information als lesbarer Text in Ihrer Sprache, z. B. „Am Netz, Lädt".                                                                                                                                                      |
| `severity`        | Eine einzige Zahl, 0–4 (siehe unten).                                                                                                                                                                                                |
| 19 Wahrheitswerte | Je einer pro bekanntem Statusflag: `online`, `onBattery`, `lowBattery`, `charging`, `discharging`, `replaceBattery`, `overloaded`, `bypass`, `calibrating`, `forcedShutdown`, `alarm`, `ecoMode`, `testing`, `overheat` und weitere. |

`charging` und `discharging` werden zusätzlich aus `battery.charger.status` gefüllt, weil manche USV-Modelle den
Ladezustand dort melden statt über die Flags `CHRG`/`DISCHRG`.

Ein Kürzel, das der Adapter nicht kennt, geht **nicht** verloren — es bleibt in `raw` und `display` sichtbar. Die
NUT-Spezifikation erlaubt Treibern ausdrücklich eigene Kürzel, und für jedes einen Wahrheitswert zu erfinden wäre
geraten.

#### Schweregrade

| Stufe | Bedeutung | Ausgelöst durch                               |
| ----- | --------- | --------------------------------------------- |
| 0     | OK        | Am Netz                                       |
| 1     | Info      | Spannung wird gesenkt/angehoben, Kalibrierung |
| 2     | Warnung   | Auf Batterie, Batterie tauschen, Bypass       |
| 3     | Kritisch  | Auf Batterie **und** Batterie schwach         |
| 4     | Notfall   | Erzwungene Abschaltung                        |
| leer  | —         | Keine Stromquelle im Status                   |

Der Schweregrad beschreibt ausschließlich die **Stromversorgungslage**. Störungsflags wie `overloaded`, `alarm` und
`off` heben ihn bewusst nicht an — sie haben eigene Wahrheitswerte, und sie einzurechnen würde eine einzige Zahl zwei
verschiedene Dinge bedeuten lassen. Ein Status, der gar keine Stromquelle nennt (`OFF` allein, `WAIT` beim Start des
Treibers, eine PDU ohne Status), lässt den Schweregrad leer, statt „OK“ zu behaupten.

### Die Messkanäle

Welche davon existieren, hängt ganz von Ihrem USV-Treiber ab:

| Kanal     | Enthält                                                                   |
| --------- | ------------------------------------------------------------------------- |
| `battery` | Ladung, Restlaufzeit, Spannung, Typ, Temperatur                           |
| `device`  | Hersteller, Modell, Seriennummer, Gerätetyp                               |
| `driver`  | Welcher NUT-Treiber diese USV bedient, seine Version und Parameter        |
| `input`   | Was vom Netz ankommt — Spannung, Frequenz, Umschaltschwellen              |
| `output`  | Was die USV abgibt — Spannung, Frequenz, Strom                            |
| `ups`     | Die USV selbst — Last, Leistung, Temperatur, Verzögerungen, Countdowns    |
| `outlet`  | Schaltbare Ausgänge und Ausgangsgruppen, falls das Modell sie hat         |
| `ambient` | Umgebungssensoren, falls die USV oder ein angeschlossener EMP sie liefert |

Werte werden in dem Typ gespeichert, der sie wirklich sind: Zahlen als Zahlen mit Einheit (V, Hz, A, Ah, %, W, VA, s,
min, °C, °), Ja/Nein-Angaben als Wahrheitswerte, feste Vokabulare (`enabled`/`disabled`/`muted`,
`charging`/`discharging`/…) als Auswahllisten. Ein Messwert, der ohne Zahl ankommt, bleibt ein Zahl-Datenpunkt und ist
**leer**: Treiber schreiben Wörter wie `LoadTooLow` oder `NA` hinein (oder gar nichts), um „gerade kein Messwert“ zu
sagen — ein Zustand, kein Fehler. Alles andere, das keine Zahl ist — etwa `26,9` mit Komma —, bleibt mit einer Warnung
leer, statt als Müll gespeichert zu werden; mit Text kann kein Diagramm etwas anfangen.

Countdowns (`ups.timer.shutdown` und Geschwister) sind **leer**, solange kein Countdown läuft. Treiber sagen das
unterschiedlich — die einen melden `-1`, die anderen das Wort `NotActive` —, und weder „minus eine Sekunde" noch ein
Textfehler wären brauchbar.

### `commands`

Je eine Taste pro Befehl, den die USV anbietet — angelegt nur, wenn **Befehle aktivieren** an ist _und_ Zugangsdaten
hinterlegt sind. Ein Tastendruck schickt `INSTCMD` und setzt sich selbst zurück. Eine USV ohne Befehle bekommt keinen
Kanal `commands`; eine Taste, deren Befehl der Treiber nicht mehr listet, wird entfernt.

`commands.execute` führt einen Befehl **mit Wert** aus, geschrieben wie bei `upscmd`: `load.off.delay 120`. Es gelten
dieselben Regeln wie für die Tasten, und der Wert ist ein einzelnes Wort.

Ein Warnzeichen am Anfang der Erklärung markiert jeden Befehl, der angeschlossenen Geräten den Strom nehmen, sie
ungeschützt lassen oder den NUT-Treiber beenden kann: die Last, eine Steckdose oder eine Steckdosengruppe abschalten
oder neu starten, jedes `shutdown.*`, `bypass.start`, `input.off`, die Treiberbefehle, die den Treiber beenden, und das rohe
Register-Schreiben `experimental.ve-direct.set`. Etwas
**ein**schalten ist nie markiert.

## Wem diese Objekte gehören

Name, Beschreibung, Typ, Rolle und Einheit aller Datenpunkte gehören dem Adapter — eine Umbenennung im Objektbaum wird
beim nächsten Abgleich zurückgesetzt. Ihre **Aufzeichnungseinstellungen** und Ihre **Raum- und Funktionszuordnungen**
sind die Ausnahme: Die gehören Ihnen, werden nie angefasst, und wenn der Adapter einen eigenen Datenpunkt umbenennt,
wandern beide mit.

Jedes Gerät zeigt ein Piktogramm für seinen NUT-Gerätetyp (USV, PDU, Solar-Laderegler, Netzteil, Umschalter); ein
Gerätetyp, den NUT nicht dokumentiert, lässt das Symbol, wie es ist.

Eine USV, die vom NUT-Server verschwindet, wird sofort als nicht erreichbar markiert und verliert ihre Objekte nach drei
Abfragen ohne sie — ein Neustart des Servers oder eine neu geladene `ups.conf` kostet nicht ihre Historie. Beim Start des
Adapters wird eine USV, die der Server nicht listet, sofort entfernt.
