Zum Inhalt springen

Shelly ohne Home Assistant

Wallbox-Daten vom Shelly direkt an Kilonaut senden — ganz ohne Home Assistant.

Wird deine Wallbox von einem Shelly gemessen, kann der Shelly die Ladung selbst an Kilonaut schicken — mit einem kleinen Skript direkt auf dem Gerät. Kein Server, kein Home Assistant, keine Cloud dazwischen.

Voraussetzung ist ein Shelly mit Scripting, also Gen2 oder neuer (z. B. Shelly Pro EM, Pro 3EM, Plus 1PM). Der ältere Gen1 Shelly EM kann leider keine Skripte ausführen.

So funktioniert’s

Das Skript liest Leistung und Energiezähler deines Shelly aus und erkennt an der Leistung, ob geladen wird. Beim Start erscheint die Live-Kachel „lädt gerade", während des Ladens wird die Leistungskurve aufgebaut, und am Ende wird ein fertiger Ladevorgang angelegt — die geladenen kWh sind die Differenz des Energiezählers zwischen Start und Ende.

  1. 1 In den Einstellungen unter „API & Home Assistant" einen Token erstellen
  2. 2 In der Shelly-Weboberfläche: Scripts → „Add script"
  3. 3 Das Skript unten einfügen, deinen Token eintragen und ggf. die Sensor-Komponente an dein Gerät anpassen
  4. 4 Speichern, starten und „Run on startup" aktivieren
// Kilonaut · Shelly -> Kilonaut (ohne Home Assistant)
// Einfuegen unter: Shelly-Weboberflaeche -> Scripts -> Add script.
// Nur Gen2+/Plus/Pro mit Scripting (z. B. Pro EM, Pro 3EM, Plus 1PM).

let CONFIG = {
  token: "HIER-DEIN-KILONAUT-TOKEN",   // aus Einstellungen -> API & Home Assistant
  api:   "https://kilonaut.de/api/v1",
  thresholdW:  1400,     // ab dieser Leistung gilt "laedt gerade"
  heartbeatMs: 20000,    // Live-Intervall in ms (>= 10000)
  // Sensor-Komponente je nach Geraet:
  //   Pro EM / Pro 3EM  ->  powerId "em:0",     energyId "emdata:0"
  //   Plus 1PM / Plus 1 ->  powerId "switch:0", energyId "switch:0"
  powerId:  "em:0",
  energyId: "emdata:0",
};

let charging = false, startWh = 0, startedAt = "";

function measure() {
  let p = Shelly.getComponentStatus(CONFIG.powerId);
  let e = Shelly.getComponentStatus(CONFIG.energyId);
  let powerW  = (p.act_power !== undefined) ? p.act_power : p.apower;
  let energyWh = (e.total_act !== undefined) ? e.total_act
               : (e.aenergy !== undefined)   ? e.aenergy.total : 0;
  return { powerW: powerW || 0, energyWh: energyWh || 0 };
}

function post(path, body) {
  Shelly.call("HTTP.Request", {
    method: "POST",
    url: CONFIG.api + path,
    headers: { "Authorization": "Bearer " + CONFIG.token,
               "Content-Type": "application/json" },
    body: JSON.stringify(body),
  });
}

Timer.set(CONFIG.heartbeatMs, true, function () {
  let m = measure();
  let isCharging = m.powerW > CONFIG.thresholdW;

  post("/charging/status", {
    charging: isCharging,
    energy_kwh: charging ? (m.energyWh - startWh) / 1000 : 0,
    power_kw: m.powerW / 1000,
    location_type: "home",
  });

  if (!charging && isCharging) {                 // Ladestart
    charging = true; startWh = m.energyWh; startedAt = new Date().toISOString();
  } else if (charging && !isCharging) {          // Ladeende -> Session senden
    charging = false;
    let kwh = (m.energyWh - startWh) / 1000;
    if (kwh > 0.1) {
      Shelly.call("HTTP.Request", {
        method: "POST",
        url: CONFIG.api + "/sessions",
        headers: { "Authorization": "Bearer " + CONFIG.token,
                   "Content-Type": "application/json",
                   "Idempotency-Key": "shelly-" + startedAt },
        body: JSON.stringify({
          started_at: startedAt,
          ended_at: new Date().toISOString(),
          energy_kwh: kwh,
          location_type: "home",
          charge_type: "ac",
        }),
      });
    }
  }
});

Sensor-Komponente je Gerät: Pro EM / Pro 3EM nutzen „em:0" und „emdata:0", Plus 1PM nutzt „switch:0". Sende Heartbeats nicht öfter als alle 10 Sekunden. Kurze Ladepausen können sonst als Ende gewertet werden — passe notfalls die Schwelle an.

Eine noch komfortablere Variante ganz ohne Skript — nur mit einer Zustimmung in der Shelly-Cloud — ist perspektivisch denkbar, sobald Kilonaut das anbietet. Für heute ist das Skript der zuverlässige Weg.

Noch Fragen?

Schau in die häufigen Fragen oder melde dich über das Impressum.