Skip to content

ZiggyMeter REST-API

Öffentliche API von ZiggyMeter.

Authentifizierung

Die ZiggyMeter-API verwendet die HTTP-Bearer-Authentifizierung. Fordern Sie über den Login-Endpunkt einen kurzlebigen Zugriffs-Token an und senden Sie diesen bei nachfolgenden Anfragen im Authorization-Header mit.

Hinweise

  • Tokens laufen nach expires_in_secs ab. Nach Ablauf müssen Sie sich erneut authentifizieren.
  • Fehlende oder ungültige Tokens führen zu 401 Unauthorized.
  • Verwenden Sie immer den exakten Header-Namen Authorization mit dem Wert Bearer <token>.

Ausnahmen

  • POST /api/v1/system/login erfordert keinen Token.
  • POST /api/v1/system/password erfordert keinen Token (es validiert stattdessen old_password).

System-API (/api/v1/system)

POST /api/v1/system/login

Login. Gibt einen Autorisierungs-Token zurück.

json
{
    "username": "username",
    "password": "password"
}
FeldTypBeschreibung
usernamestringBenutzername
passwordstringPasswort

Antwort

json
{
    "token": "vKEsedeLOBqLoSYYiWVrOF9To8T2RNK0ZV91aUwW",
    "expires_in_secs": 3600
}
FeldTypBeschreibung
tokenstringAutorisierungs-Token
expires_in_secsintegerVerbleibende Gültigkeit in Sekunden

POST /api/v1/system/logout

Logout

Antworten

  • 200 OK mit leerem Body

GET /api/v1/system/version

Firmware-Version abrufen.

Antwort

json
{
    "firmware": {
        "version": "1.0.320",
        "date": "Jan  3 2026",
        "time": "11:50:00"
    },
    "frontend": {
        "version": "1.0.320",
        "date": "Jan  3 2026",
        "time": "11:36:31"
    },
    "build_number": 320,
    "upgrade_url": "https://fw.ziggymeter.com/"
}
FeldTypBeschreibung
firmwareobjectDetails zur Firmware-Version
firmware.versionstringFirmware-Version
firmware.datestringBuild-Datum der Firmware
firmware.timestringBuild-Uhrzeit der Firmware
frontendobjectDetails zur Frontend-Version
frontend.versionstringFrontend-Version
frontend.datestringBuild-Datum des Frontends
frontend.timestringBuild-Uhrzeit des Frontends
build_numberintegerBuild-Nummer
upgrade_urlstringURL für Firmware-Upgrades

GET /api/v1/system/status

Gerätestatus abrufen.

Antworten

json
{
    "battery_voltage": 0,
    "usb_voltage": 5.146,
    "battery_powered": false,
    "battery_status": 0,
    "device_temperature": 26.6,
    "zigbee_enabled": false,
    "wifi_enabled": true,
    "home_assistant_enabled": false
}
FeldTypBeschreibung
battery_voltagenumberBatteriespannung
usb_voltagenumberUSB-Spannung
battery_poweredbooleanOb das Gerät batteriebetrieben ist
battery_statusintegerBatteriestand in Prozent
device_temperaturenumberGerätetemperatur (°C)
zigbee_enabledbooleanZigbee-Integration aktiviert
wifi_enabledbooleanWLAN aktiviert
home_assistant_enabledbooleanHome Assistant-Integration aktiviert

POST /api/v1/system/reboot

Gerät neu starten.

Antworten

  • 200 OK mit leerem Body. Das Gerät startet sofort neu, was zum Abbruch aktueller Verbindungen führt.

POST /api/v1/system/factory_reset

Werkseinstellungen wiederherstellen. Dadurch werden alle Konfigurationen, einschließlich WLAN und Admin-Passwort, gelöscht und das Gerät neu gestartet.

Antworten

  • 200 OK mit leerem Body. Das Gerät startet neu und kehrt in den ursprünglichen Einrichtungszustand zurück.

POST /api/v1/system/password

Admin-Passwort ändern.

Dieser Endpunkt erfordert kein Bearer-Token. Er validiert old_password.

Request Body

json
{
    "old_password": "old",
    "new_password": "new"
}
FeldTypBeschreibung
old_passwordstringAktuelles Admin-Passwort
new_passwordstringNeues Admin-Passwort

Antworten

  • 200 OK mit leerem Body
  • 400 Bad Request, wenn JSON-Felder fehlen
  • 403 Forbidden, wenn old_password ungültig ist

POST /api/v1/system/ota

Firmware-Update-Image senden. Nach erfolgreicher Übertragung startet das Gerät neu und führt das Update durch. Das Gerät wird nur aktualisiert, wenn das gesamte Image übertragen wurde. Eine fehlgeschlagene Übertragung wird ignoriert und macht das Gerät nicht funktionsunfähig.

TIP

Begrenzen Sie bei Übertragungsproblemen die Übertragungsrate. Siehe API.

Request Body

Binäre Firmware-Image-Daten (kein JSON, rohe Binärdaten).

Antworten

  • 200 OK mit leerem Body bei erfolgreicher Übertragung und Update-Start.
  • 401 Unauthorized, wenn das Token fehlt oder ungültig ist.
  • 500 Internal Server Error, wenn das Update fehlschlägt.

Netzwerk-API (/api/v1/network)

GET /api/v1/network/status

Netzwerkstatus abrufen.

Antworten

json
{
    "ip": "192.168.20.242",
    "netmask": "255.255.255.0",
    "gateway": "192.168.20.1",
    "hostname": "ZiggyMeter-1234",
    "dhcp": true,
    "ssid": "wifinetname",
    "rssi": -89,
    "channel": 4,
    "authmode": 3,
    "ap_mode": false
}
FeldTypBeschreibung
ipstringIP-Adresse
netmaskstringNetzmaske
gatewaystringGateway-IP-Adresse
hostnamestringGeräte-Hostname
dhcpbooleanDHCP aktiviert
ssidstringWLAN-SSID
rssiintegerSignalstärke
channelintegerWLAN-Kanal
authmodeintegerAuthentifizierungsmodus
ap_modebooleanAccess Point-Modus

GET /api/v1/network/scan

WLAN-Netzwerke suchen.

Antwort

json
{
    "hostname": "ZiggyMeter-1234",
    "networks": [
        {
            "ssid": "Star-XYZ123",
            "bssid": "A1B2C3D4E5F6",
            "rssi": -87,
            "channel": 4,
            "authmode": 7
        },
        {
            "ssid": "HomeNet-5G",
            "bssid": "F0E1D2C3B4A5",
            "rssi": -88,
            "channel": 4,
            "authmode": 3
        },
        {
            "ssid": "GuestWiFi",
            "bssid": "9A8B7C6D5E4F",
            "rssi": -93,
            "channel": 6,
            "authmode": 3
        },
        {
            "ssid": "OfficeSecure",
            "bssid": "1F2E3D4C5B6A",
            "rssi": -94,
            "channel": 13,
            "authmode": 3
        }
    ]
}
FeldTypBeschreibung
hostnamestringGeräte-Hostname
networksarrayListe der verfügbaren WLAN-Netzwerke
networks[].ssidstringNetzwerk-SSID
networks[].bssidstringNetzwerk-BSSID (MAC-Adresse)
networks[].rssiintegerSignalstärke (RSSI)
networks[].channelintegerWLAN-Kanal
networks[].authmodeintegerAuthentifizierungsmodus

POST /api/v1/network/wifi

WLAN-Konfiguration senden.

Request Body

FeldTypBeschreibung
ssidstringWLAN-SSID (erforderlich, 1-31 Zeichen)
passwordstringWLAN-Passwort (erforderlich, bis zu 63 Zeichen)
dhcpbooleanDHCP aktivieren (erforderlich)
hostnamestringGeräte-Hostname (optional, nicht leerer String bis zu 31 Zeichen)
ipstringStatische IP-Adresse (erforderlich, wenn DHCP falsch, gültige IP)
netmaskstringNetzmaske (erforderlich, wenn DHCP falsch, gültige IP)
gatewaystringGateway-IP-Adresse (erforderlich, wenn DHCP falsch, gültige IP)
applybooleanEinstellungen sofort übernehmen (optional, Standard ist falsch)

Antworten

json
{
    "ssid": "iot-net",
    "dhcp": true,
    "hostname": "ziggymeter1",
    "ip": "192.168.8.177",
    "netmask": "255.255.255.0",
    "gateway": "192.168.8.1"
}
FeldTypBeschreibung
ssidstringKonfigurierte WLAN-SSID
dhcpbooleanDHCP-Status
hostnamestringKonfigurierter Hostname
ipstringAktuelle/Statische IP-Adresse
netmaskstringAktuelle/Statische Netzmaske
gatewaystringAktuelle/Statische Gateway-IP

WARNING

Wenn apply auf true gesetzt ist, versucht das Gerät sofort, eine Verbindung zum neuen Netzwerk herzustellen. Dies führt zum Abbruch der aktuellen Verbindung.

POST /api/v1/network/ap

Access Point-Konfiguration senden.

Request Body

FeldTypBeschreibung
ap_ssidstringAccess Point-SSID (optional, 1-31 Zeichen)
ap_passwordstringAccess Point-Passwort (optional, 8-63 Zeichen)
ap_enabledbooleanAccess Point-Modus aktivieren (optional)
applybooleanEinstellungen sofort übernehmen (optional, Standard ist falsch)

Antworten

json
{
    "ap_ssid": "ZiggyMeter-1234",
    "ap_enabled": true
}
FeldTypBeschreibung
ap_ssidstringKonfigurierte AP-SSID
ap_enabledbooleanAP-Modus Status

Zigbee-API (/api/v1/zigbee)

GET /api/v1/zigbee/config

Zigbee-Konfiguration abrufen.

Antwort

json
{
    "enabled": false,
    "channel": 11,
    "short_address": 0,
    "extended_pan_id": "00124b0000000000",
    "pan_id": 0
}
FeldTypBeschreibung
enabledbooleanZigbee aktiviert/deaktiviert (aus gespeicherter Konf.)
channelintegerAktueller Zigbee-Kanal
short_addressintegerAktuelle Zigbee-Kurzadresse
extended_pan_idstringAktuelle Zigbee Extended PAN ID (16 Hex-Zeichen)
pan_idintegerAktuelle Zigbee PAN ID

POST /api/v1/zigbee/config

Zigbee-Konfiguration festlegen.

Request Body

json
{
    "enabled": true
}
FeldTypBeschreibung
enabledbooleanZigbee-Unterstützung aktivieren oder deaktivieren

Antworten

  • 200 OK mit leerem Body

POST /api/v1/zigbee/reset

Zigbee-Reset auslösen. Nach dem Reset ist das interne Zigbee-Modul des Geräts gelöscht und bereit, einem neuen Zigbee-Netzwerk beizutreten.

Antworten

  • 200 OK mit leerem Body. Die aktuelle Zigbee-Kopplung geht verloren.

POST /api/v1/zigbee/map

Zigbee-Konfiguration senden, um spezifische Zigbee-Datenpunkte den OBIS-Codes des Zählers zuzuweisen.

Request Body

json
{
    "mapping": [
        {
            "obis": "1-0:15.8.0",
            "mode": 0,
            "mapping_id": "07020000"
        },
        {
            "obis": "15.8.2",
            "mode": 1,
            "mapping_id": "07020001"
        }
    ]
}
FeldTypBeschreibung
mappingarrayListe der OBIS-zu-Zigbee-Mapping-Einträge
mapping[].obisstringZu mappenden OBIS-Code (z. B. 1.8.0 oder 1-0:15.8.0)
mapping[].modeintegerVergleichsmodus: 0 (vollständiger OBIS-Code), 1 (kurzer OBIS-Code)
mapping[].mapping_idstringZigbee-Mapping-ID (8 Hex-Zeichen, z. B. 07020000; Cluster + ID)

Antworten

  • 200 OK mit leerem Body
  • 401 Unauthorized, wenn das Token fehlt oder ungültig ist
  • 400 Bad Request, wenn die JSON-Struktur ungültig ist

Home Assistant-API (/api/v1/hass)

GET /api/v1/hass

Home Assistant-Konfiguration abrufen.

Antwort

json
{
    "enabled": false,
    "url": "https://home-assistant.local:8123",
    "cert_max_size": 10239
}
FeldTypBeschreibung
enabledbooleanOb die Home Assistant-Integration aktiviert ist
urlstringHome Assistant-URL (nur vorhanden, wenn aktiviert)
cert_max_sizeintegerMaximale Größe des Home Assistant-Zertifikats in Bytes

POST /api/v1/hass

Home Assistant-Konfiguration festlegen.

Request Body

FeldTypBeschreibung
enabledbooleanHome Assistant-Integration aktivieren oder deaktivieren
urlstringServer-URL von Home Assistant (erforderlich, wenn aktiviert)
tokenstringLanglebiges Zugriffstoken von Home Assistant (erforderlich, wenn aktiviert)
langstringSprache für OBIS-Beschreibungen (optional, Standard 'en', wenn aktiviert)
certstringPEM-Zertifikat für HTTPS-Verbindung (optional, wird gelöscht, wenn nicht angegeben)

Antworten

json
{
    "enabled": true,
    "url": "https://home-assistant.local:8123",
    "cert_max_size": 10239
}
FeldTypBeschreibung
enabledbooleanOb die Integration aktiviert ist
urlstringZiel-URL von Home Assistant
cert_max_sizeintegerMaximal unterstützte Zertifikatsgröße

GET /api/v1/hass/send

Test-Veröffentlichung an Home Assistant senden.

Antwort

json
{
    "retcode": 0,
    "http_status_code": 200
}
FeldTypBeschreibung
retcodeintegerRückgabecode (0 bedeutet Erfolg)
http_status_codeintegerVon Home Assistant zurückgegebener HTTP-Statuscode

Fehler

  • 400 Bad Request, wenn Home Assistant nicht aktiviert ist

Zähler-API (IEC 62056-21) (/api/v1/iec62056)

GET /api/v1/iec62056/read

Zählerauslesung auslösen und Werte zurückgeben.

Antworten

200

Gibt die JSON-Struktur mit Zählerdetails und einem Array von OBIS-Ablesungen zurück.

json
{
    "protocol": "IEC62056-21",
    "meter_id": "/XXX6\\2YYYYYY",
    "mode": "C",
    "baudrate": 9600,
    "timestamp": 293209783,
    "status": 1,
    "readings": [
        {
            "obis_long": "0-0:C.1.0",
            "obis": "C.1.0",
            "value1": "12345678",
            "value2": "",
            "value1_number": null,
            "value1_unit": "",
            "medium": 0,
            "channel": 0,
            "billing_period": null,
            "mapping_id": "00000000",
            "en": "Meter serial number"
        },
        {
            "obis_long": "1-0:15.8.0",
            "obis": "15.8.0",
            "value1": "00000001000.657*kWh",
            "value2": "",
            "value1_number": 1000.657,
            "value1_unit": "kWh",
            "medium": 1,
            "channel": 0,
            "billing_period": null,
            "mapping_id": "07020000",
            "en": "Absolute active energy total"
        }
    ]
}
FeldTypBeschreibung
protocolstringVerwendetes Protokoll (IEC62056-21)
meter_idstringZählerkennung aus dem Identifikationstelegramm des Zählers
modestringKommunikationsmodus (z. B. 'C' oder 'D')
baudrateintegerFür die Kommunikation verwendete Baudrate
timestampintegerEpoch-Zeitstempel der Ablesung
statusintegerAuslesestatus-Code (0 = Erfolg, andere Werte deuten auf Fehler hin)
readingsarrayArray von OBIS-Ablesungen
readings[].obis_longstringVollständiger OBIS-Code (z. B. 1-0:1.8.0)
readings[].obisstringKurzer OBIS-Code (z. B. 1.8.0)
readings[].value1stringPrimärer Wert, wie vom Zähler empfangen
readings[].value2stringSekundärer Wert (z. B. Zeitstempel des Maximums), falls vorhanden
readings[].value1_numbernumber|nullGeparster numerischer Wert von value1
readings[].value1_unitstringEinheit für value1 (z. B. 'kWh', 'kW', 'V')
readings[].mediuminteger|nullMedium-Kennung
readings[].channelinteger|nullKanal-Kennung
readings[].billing_periodinteger|nullAbrechnungsperioden-Kennung
readings[].mapping_idstringZigbee-Mapping-ID (8 Hex-Zeichen, z. B. 07020000), oder 00000000 falls nicht gemappt
readings[].enstring|nullEnglische Beschreibung des OBIS-Codes
500
  • Meter timeout: Die Auslesung wurde nicht innerhalb des erwarteten Zeitrahmens abgeschlossen (~45s).
  • Meter error: Der Zähler gab eine Fehlermeldung zurück.

GET /api/v1/iec62056/last

Letzte verfügbare Zählerstände abrufen (löst keine neue Auslesung aus).

Antworten

200

Gleiches Antwortschema wie GET /api/v1/iec62056/read.

GET /api/v1/iec62056/config

Zählerkonfiguration abrufen.

Antworten

json
{
    "mode_d_enabled": false,
    "mode_d_baudrate": 2400,
    "baudrate_max": 9600,
    "schedule_min": 1,
    "battery": false
}
FeldTypBeschreibung
mode_d_enabledbooleanOb IEC 62056 Modus D aktiviert ist
mode_d_baudrateintegerBaudrate für Modus-D-Kommunikation
baudrate_maxintegerMaximal unterstützte Baudrate
schedule_minintegerMindestintervall für Ablesezeitplan (Minuten)
batterybooleanOb der Zähler batteriebetrieben ist

POST /api/v1/iec62056/config

Zählerkonfiguration senden.

Request Body

FeldTypBeschreibung
mode_d_enabledbooleanIEC 62056 Modus D aktivieren oder deaktivieren
mode_d_baudrateintegerBaudrate für Modus-D-Kommunikation (muss eine gültige Baudrate sein)
baudrate_maxintegerMaximal unterstützte Baudrate (muss eine gültige Baudrate sein)
batterybooleanOb der Zähler batteriebetrieben ist
schedule_minintegerMindestintervall für Ablesezeitplan in Minuten (Minimum -1)

Antworten

json
{
    "mode_d_enabled": false,
    "mode_d_baudrate": 2400,
    "baudrate_max": 9600,
    "schedule_min": 5,
    "battery": false
}
FeldTypBeschreibung
mode_d_enabledbooleanIEC 62056 Modus D Status
mode_d_baudrateintegerKonfigurierte Modus-D-Baudrate
baudrate_maxintegerMaximale Kommunikations-Baudrate
schedule_minintegerIntervall für Ablesezeitplan (Minuten)
batterybooleanBatteriebetriebs-Flag