🏷️Enums, Aliase und Historie

Drei Werkzeuge, die aus einem Haufen Datenpunkte ein benutzbares Smart Home machen: Räume und Funktionen zum Gruppieren, Aliase als stabile Namen und Verläufe für Diagramme.

🧮Enums: Räume × Funktionen

Ein Enum ist ein Objekt unter enum.… mit einer Mitgliederliste. Standardmäßig gibt es enum.rooms und enum.functions. Visualisierungen, Sprachassistenten und Skripte nutzen sie, um z. B. „alle Lichter im Wohnzimmer“ zu finden.
Raum \ Funktion

Zahl = Datenpunkte in dieser Kombination. Zeile/Spalte anklicken filtert nur nach Raum bzw. Funktion (nochmals klicken hebt auf).

Selektor im JavaScript-Adapter
$('state(rooms=Wohnzimmer)(functions=Licht)').each((id) => log(id));
// 3 Treffer
  • Deckenlampe Wohnzimmer
    shelly.0.shellyplus1#0a1b2c3d4e01#1.Relay0.Switch
  • Stehlampe an/aus
    zigbee.0.00158d0000000a01.state
  • Stehlampe Helligkeit
    zigbee.0.00158d0000000a01.brightness
Das Enum-Objekt
{
"_id": "enum.rooms.wohnzimmer",
"type": "enum",
"common": {
"name": "Wohnzimmer",
"members": [
"shelly.0.shellyplus1#0a1b2c3d4e01#1",
"zigbee.0.00158d0000000a01",
"hm-rpc.0.MUSTER0001.1"
]
},
"native": {}
}

Mitglieder dürfen Geräte, Kanäle oder einzelne States sein. Ein Gerät als Mitglied nimmt alle seine States mit.

🔗Aliase (alias.0)

Ein Alias ist ein State unter alias.0, der den Wert eines anderen States spiegelt – optional umgerechnet. Der Wert kommt vom Ziel, Name, Rolle und Einheit vom Alias.

↔️ Umrechnung über min/max

Ziel zigbee.0…brightness hat 0–100 %, der Alias 0–255. ioBroker rechnet linear um.

Alias liest 102 = 40 / 100 × 255
Ziel erhält 78,43 % = 200 / 255 × 100

Beispiel aus der Doku: Ziel 0–255, Alias 0–100 → Lesen von 10 ergibt 3,92…, Schreiben von 10 ergibt 25,5 (als Test hinterlegt).

🧮 Eigene Formel: °C → °F

common.alias.read enthält einen Ausdruck mit val.

val * 9 / 5 + 32 → 71,24 °F
{
"_id": "alias.0.Bad.Temperatur",
"type": "state",
"common": {
"alias": {
"id": "zigbee.0.00158d0000000b01.temperature",
"read": "val * 9 / 5 + 32"
},
"unit": "°F",
"role": "value.temperature"
}
}

🔁 Warum überhaupt Aliase?

  • ▸ Gerätetausch: Neues Thermostat = neue Seriennummer = neue ID. Zeigt der Alias auf das neue Gerät, laufen Skripte und Oberflächen weiter.
  • ▸ Einheitliche Struktur: alias.0.Wohnzimmer.Licht statt shelly.0.shellyplus1#…#1.Relay0.Switch.
  • ▸ Beide Richtungen: Lesen spiegelt das Ziel, Schreiben leitet an das Ziel weiter. Auch Trigger auf den Alias verhalten sich wie auf das Original.
  • ▸ native ist bei Aliasen immer leer – alles steht in common. Getrennte IDs für Lesen/Schreiben sind möglich (alias.id.read/.write).

📈Historie: history, sql, influxdb

Verlaufsdaten werden pro Datenpunkt eingeschaltet. Die Einstellungen stehen im Objekt selbst – in common.custom unter dem Namen der History-Instanz.
💡 history
Speichert in JSON-Dateien im ioBroker-Verzeichnis – ohne weitere Software. Gut für kleinere Installationen.
✅ sql
Schreibt in eine SQL-Datenbank: MySQL/MariaDB, PostgreSQL, SQLite oder MS-SQL. Auswertbar mit normalen SQL-Werkzeugen.
⚠️ influxdb
Zeitreihendatenbank, beliebt in Kombination mit Grafana für Dashboards über lange Zeiträume.
gespeichert: 91 von 578 Rohwerten (16 %)
Isttemperatur Wohnzimmer (°C)Solltemperatur Wohnzimmer (°C)
16,717,919,120,321,518:0022:0002:0006:0010:0014:0018:00IstSoll

Erfundene Beispielkurven für 23.09. 18:00 bis 24.09. 18:00 Uhr (alle 5 Minuten ein Rohwert). Punkte werden gezeichnet, sobald nur noch wenige gespeichert sind. Mit „nur Änderungen“ bleibt z. B. von der Solltemperatur nur 21 → 17 → 21 übrig; die Linie gilt bis zur nächsten Änderung weiter.

// Ausschnitt aus dem Objekt des Datenpunkts
"common": {
  "name": "Isttemperatur Wohnzimmer",
  "custom": {
    "history.0": {
      "enabled": true,
      "changesOnly": true,      // nur bei Wertänderung speichern
      "debounceTime": 0,        // Entprellen in ms
      "retention": 31536000     // Vorhaltezeit in s (365 Tage)
    }
  }
}
// Verlauf im Skript abfragen (JavaScript-Adapter)
sendTo('history.0', 'getHistory', {
    id: 'hm-rpc.0.MUSTER0001.1.ACTUAL_TEMPERATURE',
    options: {
        start: Date.now() - 24 * 3600 * 1000,
        end: Date.now(),
        aggregate: 'average',   // oder 'min', 'max', 'minmax', 'none' …
        step: 3600 * 1000       // Stundenwerte
    }
}, (result) => log(JSON.stringify(result.result)));