ablesio Smart Home
Zur App →
Dein Smart Home kennt die Stände von Wechselrichter, Wallbox und Co. längst – ablesio rechnet daraus Kosten, Prognosen und Ersparnis. Mit dem ioBroker-Adapter fließt beides automatisch hin und her.
Aktuelle Zählerstände und die Prognose für 3, 6 und 12 Monate – inklusive Kosten – als Datenpunkte für Dashboards und Automationen.
Stände direkt vom Gerät an ablesio – z.B. der Gesamtertrag deines Balkonkraftwerks. Unveränderte Werte werden übersprungen, fallende abgefangen.
Fällige Ablesungen, Tarifwechsel, „Heizöl nachbestellen" – und bei Ölheizung der Füllstand mit „reicht bis …".
Ein eigener Token nur für deinen Haushalt, im Profil jederzeit widerrufbar. Verbindung ausschließlich per HTTPS zu ablesio.
Anderes System? Die Smart-Home-API (REST) steht allen offen, die ablesio Ultimate nutzen.

Version 0.9.0 · MIT-Lizenz · Node.js ≥ 18, js-controller ≥ 4, Admin ≥ 6
In ablesio unter Profil → 🔌 Smart-Home-Integration → „+ Neuen Token erstellen". Der Token wird nur einmal angezeigt – gleich kopieren.

Auf der Kommandozeile deines ioBroker-Servers:
iobroker url https://ablesio.de/downloads/iobroker/iobroker.ablesio-0.9.0.tgz
iobroker add ablesio
Alternativ im ioBroker-Admin unter Adapter → Expertenmodus → Adapter aus eigener URL installieren → Benutzerdefiniert die URL eintragen.
Aktualisieren: denselben iobroker url …-Befehl mit der neuen Adresse ausführen – die Einstellungen der Instanz bleiben erhalten, die Instanz startet neu.
Token in die Instanz-Einstellungen eintragen, speichern – fertig. Nach wenigen Sekunden erscheinen deine Zähler unter ablesio.0.meters.

| Datenpunkt | Bedeutung |
|---|---|
value, lastReadingAt | aktueller Zählerstand und wann abgelesen |
submitReading ✏️ | neuen Stand hierhin schreiben (ack = false) → wird an ablesio übermittelt |
lastSubmitStatus | ok: …, übersprungen: unverändert oder Fehler: … |
due | Ablesung fällig |
forecast.next3Months … next12Months | erwarteter Verbrauch, jeweils mit …Cost in Euro |
tank.levelLiters, tank.percent, tank.runoutLabel | nur Heizöl: Tankinhalt, Füllstand, „reicht bis" |
Dazu reminders.count/text/json mit allen offenen Erinnerungen sowie info.connection und info.lastSync.
Wer zwei Wärmeerzeuger hat – etwa eine Wärmepumpe und eine Klimaanlage, die im Übergang heizt –, kann ablesio melden lassen, wann welcher lief. In den Instanz-Einstellungen „Wärmeerzeuger melden“ einschalten und die Liste ausfüllen: Name, Datenpunkt, Art (Wärmepumpe, Klimaanlage oder Warmwasser). Ein Datenpunkt gilt als „an“, wenn er true oder größer 0 ist; Zahlen werden mit ihrem Wert gemeldet. Gemeldet werden nur Wechsel und alle 3 Stunden ein Stützwert, gebündelt mit der normalen Meldung; ist ablesio nicht erreichbar, puffert der Adapter bis zu 2000 Wechsel (heat.queued) und sendet sie nach.
| Name (Vorgabe) | Datenpunkt | Art |
|---|---|---|
| Erdwärmepumpe Heizen | 0_userdata.0.heizung.wp_heizen | Wärmepumpe |
| Erdwärmepumpe Warmwasser | 0_userdata.0.heizung.wp_warmwasser | Warmwasser |
| Klimaanlage Wohnzimmer | 0_userdata.0.heizung.klima_heizt | Klimaanlage |
In ablesio unter Geräte → Heizung & Wetter → Wärmeerzeuger ordnest du jedem Erzeuger den Zähler (z. B. Zählertyp Wärmepumpe) oder Messstecker zu, der seinen Strom misst. Dann siehst du die Laufphasen als Bänder unter Raum- und Außentemperatur, Laufzeit, Strom, Kosten und Kosten je Heizgradtag – und mit ablesio Labs, bis zu welcher Außentemperatur die Klimaanlage günstiger heizt.
Läuft ein Erzeuger mit Sonnenstrom, kostet er weniger. Schalte dafür in den Instanz-Einstellungen zusätzlich „PV-Überschuss melden“ ein und wähle den Datenpunkt mit dem Überschuss in Watt (positiv = Überschuss), vorbelegt ist 0_userdata.0.heizung.ueberschuss. Der Adapter liest ihn jede Minute und meldet nur Änderungen ab 100 W, einen Wechsel über 0 W und alle 3 Stunden einen Stützwert. In ablesio stellst du in der Karte „Wärmeerzeuger“ ein, ab welchem Überschuss Strom als Sonnenstrom zählt (Vorgabe 0 W). Sonnenstrom kostet dort den Einspeisepreis deines Einspeisezählers – das ist die Vergütung, die dir entgeht; ohne Einspeisevertrag 0 €. Die Tabelle zeigt ihn als „davon Sonnenstrom“.
In derselben Karte gibt es mit ablesio Labs den Regler „Klima bevorzugen, auch wenn sie bis zu X % teurer ist“ (Vorgabe 15 %). Die Empfehlung zeigt dann zwei Werte: mit Vorsprung und rein nach Kosten. Den Wert mit Vorsprung holt der Adapter jede Stunde ab, sobald „Wärmeerzeuger melden“ an ist:
| Datenpunkt | Bedeutung |
|---|---|
ablesio.0.heating.climateUntilC | Die Klimaanlage lohnt sich bis zu dieser Außentemperatur (°C), mit Vorsprung; null = noch keine Empfehlung |
ablesio.0.heating.recommendationText | die Empfehlung als Satz – oder was noch fehlt (etwa „Messwochen“) |
ablesio.0.heating.dataDays.heatPump, …airConditioner | Tage, an denen fast nur dieses Gerät geheizt hat |
ablesio.0.heating.lastUpdate | wann zuletzt abgeholt |
Ein Steuerskript kann climateUntilC als Schwelle übernehmen. Ist der Wert null, behält es am besten seine eigene Schwelle. Bei einem Fehler bleiben die letzten Werte stehen. Liefen beide Geräte bisher bei zu unterschiedlichen Außentemperaturen, sagt die Karte, bei welcher Temperatur die Klimaanlage ein paar Wochen probeweise mitlaufen sollte („Messwochen“).

Version 0.6.0 · ab Home Assistant 2024.4 (Ablo als Symbol ab 2026.3)
custom_components/ablesio nach config/custom_components/ kopieren, Home Assistant neu starten.Optionen (ablesio → Konfigurieren, alle standardmäßig aus):
| Entität | Bedeutung |
|---|---|
sensor.…_zahlerstand | aktueller Stand (Energie-Dashboard-tauglich), Attribute meter_id und meter_number |
sensor.…_prognose_12_monate, …_kostenprognose_12_monate | erwarteter Verbrauch und Kosten |
binary_sensor.…_ablesung_fallig | Ablesung fällig |
Dienst ablesio.submit_reading | Stand übermitteln – per Zählernummer (meter_number) oder ID (meter_id) |
nur Heizöl: …_tankinhalt, …_tankfullstand, …_heizol_reicht_bis | Tank |

Version 5.1.0 · für openHAB 5.1 (Java 21)
addons/ deines openHAB kopieren – openHAB lädt sie von selbst.| Kanal | Bedeutung |
|---|---|
value, lastReading | aktueller Stand und Zeitpunkt |
submitReading ✏️ | Befehl mit dem neuen Stand senden → wird übermittelt |
lastSubmitStatus | ok: …, übersprungen: unverändert oder Fehler: … |
due, forecast12Months, forecastCost12Months | fällig, Prognose und Kosten |
nur Heizöl: tankLevel, tankPercent, tankRunout, reorder | Tank |

für Shelly ab Gen2 (Plus, Pro, Gen3, Gen4) · ohne Cloud · auch ohne Ultimate
| Modell (Beispiele) | Hinweis |
|---|---|
| Shelly Plug PM Gen3 | ⭐ misst nur, kein Schalter – ideal zum Messen, niemand schaltet das Gerät versehentlich ab |
| Shelly Plug S MTR Gen3 · Plug M Gen3 ↗ Anzeige | messen und schalten (Matter) – gut für drinnen |
| Shelly Outdoor Plug S Gen3 ↗ Anzeige | für draußen (IP44) – z. B. Teichpumpe, Weihnachtsbeleuchtung |
| Shelly PM Mini (Gen3/Gen4), Plus-Geräte mit Messung | Unterputz, z. B. für fest angeschlossene Verbraucher |
Werbung: Partnerlinks – als Amazon-Partner verdient ablesio an qualifizierten Verkäufen. Für dich ändert sich am Preis nichts.
Miss ein einzelnes Gerät und finde heraus, was es dich im Jahr kostet – auch nachts im Standby. Der Stecker meldet seinen Zählerstand stündlich selbst an ablesio.
| Was ablesio zeigt | Bedeutung |
|---|---|
| Ø Leistung | Durchschnitt über die Zeit an dieser Station |
| Grundlast nachts | typische Leistung zwischen 0 und 5 Uhr – was das Gerät zieht, obwohl es niemand nutzt |
| pro Jahr | hochgerechnete Kosten mit deinem Strompreis |
| Kurve · Detektiv-Board | Leistung der letzten 7 Tage mit Vorwoche · alle Stationen nach Kosten sortiert (unter „Gesamt Strom") |
Home Assistant, ioBroker und openHAB können statt des Scripts denselben Melde-Link nutzen: POST mit {"total_wh": …}. Eine Messsteckdose zählt nicht zu deinem Hausverbrauch.
für Smart-Home-Fans · ablesio Ultimate · auf eigenes Risiko
Deine Shellys hängen schon an Home Assistant oder ioBroker? Dann braucht es kein Script im Shelly: Dein System schickt die Zählerstände selbst an ablesio – gesammelt, mit Puffer, und es schickt nach, wenn eine Meldung fehlschlägt. Die Energieräuber-Jagd rechnet damit genauso wie mit dem Shelly-Script.
⚠️ Die Skripte sind Beispiele, die du an dein System anpassen musst. Wer Schlüssel und Geheimnis kennt, kann Werte für deine Messsteckdosen melden – halte beides privat. Unten findest du je System eine Anleitung zum Aufklappen (mit Platzhaltern statt deiner Daten).
// ablesio Energieräuber-Jagd – ioBroker (Adapter „JavaScript“). Auf eigenes Risiko.
// Liest alle 15 Min. die Energiezähler (Wh) der Shellys, puffert bei Fehlern (bis 500 Werte) und meldet signiert an ablesio.
const crypto = require('crypto');
const URL = "https://api.ablesio.de/api/plug-bulk", KEY = "ak_DEIN_SCHLUESSEL", SECRET = "DEIN_GEHEIMNIS";
const MAP = { // ioBroker-Datenpunkt (Energie in Wh) → ablesio-Zähler
"sensor.kuehlschrank_energy": "mtr_KENNUNG_1" // Kühlschrank-Stecker,
"sensor.detektiv_energy": "mtr_KENNUNG_2" // Detektiv-Stecker
};
let queue = [];
async function measure() {
const ts = Math.floor(Date.now() / 1000);
for (const [dp, meter] of Object.entries(MAP)) { const s = getState(dp); if (s && s.val !== null && s.val !== undefined) queue.push({ meter, ts, total_wh: Number(s.val) }); }
queue = queue.slice(-500);
if (!queue.length) return;
const batch = queue.slice(0, 200), body = JSON.stringify({ version: 1, readings: batch }), t = String(Math.floor(Date.now() / 1000));
const sig = 'sha256=' + crypto.createHmac('sha256', SECRET).update(t + '.' + body).digest('hex');
try {
const r = await httpPostAsync(URL, body, { headers: { 'Content-Type': 'application/json', 'X-Ablesio-Key': KEY, 'X-Ablesio-Timestamp': t, 'X-Ablesio-Signature': sig }, timeout: 20000 });
if (r.responseCode === 200) queue.splice(0, batch.length); else log('ablesio: HTTP ' + r.responseCode + ' ' + r.data, 'warn');
} catch (e) { log('ablesio: ' + e, 'warn'); } // bleibt im Puffer, nächster Versuch in 15 Min.
}
schedule('*/15 * * * *', measure);
measure();
https://api.ablesio.de/api/plug-bulk.settings.js crypto freigeben (siehe Kommentar im Script) und Node-RED neu starten.// ablesio Energieräuber-Jagd – Node-RED „function“-Node (für Home Assistant oder ioBroker). Auf eigenes Risiko.
// Eingang: msg.topic = Entity/Datenpunkt, msg.payload = Energie in Wh (z. B. alle 15 Min. per „inject“ + „current state“).
// Ausgang → „http request“-Node (Methode: POST, URL: https://api.ablesio.de/api/plug-bulk, „Nachricht bestimmt Kopfzeilen“). Puffer liegt im Flow-Kontext.
const crypto = global.get('crypto') || require('crypto'); // ggf. in settings.js: functionGlobalContext: { crypto: require('crypto') }
const KEY = "ak_DEIN_SCHLUESSEL", SECRET = "DEIN_GEHEIMNIS";
const MAP = {
"sensor.kuehlschrank_energy": "mtr_KENNUNG_1" // Kühlschrank-Stecker,
"sensor.detektiv_energy": "mtr_KENNUNG_2" // Detektiv-Stecker
};
let q = flow.get('ablesio_queue') || [];
if (msg.topic === 'ablesio_ok') { q.splice(0, msg.count || 0); flow.set('ablesio_queue', q); return null; } // Rückmeldung des „http request“-Nodes bei 200
if (MAP[msg.topic] && msg.payload !== null) q.push({ meter: MAP[msg.topic], ts: Math.floor(Date.now() / 1000), total_wh: Number(msg.payload) });
q = q.slice(-500); flow.set('ablesio_queue', q);
const batch = q.slice(0, 200), body = JSON.stringify({ version: 1, readings: batch }), t = String(Math.floor(Date.now() / 1000));
msg.headers = { 'Content-Type': 'application/json', 'X-Ablesio-Key': KEY, 'X-Ablesio-Timestamp': t,
'X-Ablesio-Signature': 'sha256=' + crypto.createHmac('sha256', SECRET).update(t + '.' + body).digest('hex') };
msg.payload = body; msg.count = batch.length;
return msg;
*/15 * * * * python3 ablesio.py#!/usr/bin/env python3
# ablesio Energieräuber-Jagd – Python (z. B. per Cron alle 15 Min. auf dem Raspberry Pi, liest Home Assistant über dessen REST-API). Auf eigenes Risiko.
# Puffer in einer Datei: fehlgeschlagene Meldungen werden beim nächsten Lauf nachgeschickt.
import hmac, hashlib, json, time, urllib.request, pathlib
URL, KEY, SECRET = "https://api.ablesio.de/api/plug-bulk", "ak_DEIN_SCHLUESSEL", "DEIN_GEHEIMNIS"
HA_URL, HA_TOKEN = "http://homeassistant.local:8123", "DEIN_LANGLEBIGER_HA_TOKEN"
MAP = { # Home-Assistant-Entity (Energie in Wh oder kWh) → ablesio-Zähler
"sensor.kuehlschrank_energy": "mtr_KENNUNG_1", # Kühlschrank-Stecker,
"sensor.detektiv_energy": "mtr_KENNUNG_2", # Detektiv-Stecker
}
QUEUE = pathlib.Path.home() / ".ablesio_queue.json"
q = json.loads(QUEUE.read_text()) if QUEUE.exists() else []
for entity, meter in MAP.items():
try:
r = urllib.request.urlopen(urllib.request.Request(f"{HA_URL}/api/states/{entity}", headers={"Authorization": f"Bearer {HA_TOKEN}"}), timeout=10)
st = json.load(r); val = float(st["state"]); unit = st.get("attributes", {}).get("unit_of_measurement", "Wh")
q.append({"meter": meter, "ts": int(time.time()), "total_wh" if unit == "Wh" else "total_kwh": val})
except Exception as e: print("HA:", entity, e)
q = q[-500:]
if q:
batch = q[:200]; body = json.dumps({"version": 1, "readings": batch}).encode(); t = str(int(time.time()))
sig = "sha256=" + hmac.new(SECRET.encode(), t.encode() + b"." + body, hashlib.sha256).hexdigest()
try:
urllib.request.urlopen(urllib.request.Request(URL, data=body, method="POST", headers={"Content-Type": "application/json", "X-Ablesio-Key": KEY, "X-Ablesio-Timestamp": t, "X-Ablesio-Signature": sig}), timeout=20)
q = q[len(batch):]
except Exception as e: print("ablesio:", e) # bleibt im Puffer
QUEUE.write_text(json.dumps(q))
#!/bin/sh
# ablesio Energieräuber-Jagd – Test mit curl + openssl (ein Wert). Auf eigenes Risiko.
URL="https://api.ablesio.de/api/plug-bulk"; KEY="ak_DEIN_SCHLUESSEL"; SECRET="DEIN_GEHEIMNIS"; T=$(date +%s)
BODY='{"version":1,"readings":[{"meter":"MTR_ID","ts":'$T',"total_wh":12345.6}]}'
SIG="sha256=$(printf '%s.%s' "$T" "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | sed 's/^.* //')"
curl -s -X POST "$URL" -H "Content-Type: application/json" -H "X-Ablesio-Key: $KEY" -H "X-Ablesio-Timestamp: $T" -H "X-Ablesio-Signature: $SIG" -d "$BODY"
Ein Shelly zwischen Steckdose und Wechselrichter misst den Ertrag – in ablesio als Messsteckdose am Einspeisezähler. Richtig rum einstecken: Kommen tagsüber keine Werte, den Shelly um 180° gedreht einstecken. Hat dein Wechselrichter eine eigene Messung, zeigt ablesio einen Abgleich (bis ± 5 % ist üblich). Ausführlich im Ratgeber „Dumme Wechselrichter mit ablesio integrieren“.
Der Zwischenstecker-Schaltaktor mit Leistungsmessung lässt sich über ioBroker oder Home Assistant genauso nutzen wie ein Shelly – z. B. ein Jahr und länger fest am Trockner. Sein Energiezähler fängt nach jedem Ausstecken oder Stromausfall wieder bei 0 an und läuft bei 838,86 kWh über. ablesio rechnet beides heraus: Ein Neustart bei 0 zählt ab dem neuen Stand weiter, ein Überlauf wird exakt verrechnet – der Gesamtverbrauch bleibt richtig. Verloren geht höchstens, was zwischen der letzten Meldung und dem Ausstecken verbraucht wurde (bei Meldungen alle 15 Minuten also höchstens eine Viertelstunde).
hm-rpc.0.<Seriennummer>.2.ENERGY_COUNTER (Kanal 2, Einheit Wh) in die MAP des ioBroker-Scripts.| Teil | Inhalt |
|---|---|
| Adresse | POST https://api.ablesio.de/api/plug-bulk |
X-Ablesio-Key | dein Schlüssel (ak_…) |
X-Ablesio-Timestamp | Unixzeit – höchstens 5 Minuten Abweichung |
X-Ablesio-Signature | sha256= + HMAC-SHA256(Geheimnis, Zeitstempel + „.“ + Body) – das Geheimnis wird nie mitgeschickt |
| Body | {"version": 1, "readings": [{"meter": "mtr_…", "ts": 1727700000, "total_wh": 12345.6}]} · bis 1.000 Werte · statt meter auch die gebundene Shelly-ID als device |
| Antwort | gespeicherte und verworfene Werte je Zähler, unbekannte Zähler – Wiederholungen speichern nichts doppelt |
Gesamtertrag eines Growatt-Wechselrichters einmal pro Woche automatisch übermitteln – Schritt für Schritt.
Zur Anleitung →Den Gesamtertrag jeden Sonntag mit einer Automation übermitteln – per Zählernummer.
Zur Anleitung →Things, Items und eine Regel, die den Gesamtertrag jeden Sonntag übermittelt.
Zur Anleitung →