Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Integration einer Ambientika-Lüftungsanlage

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    704

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    18
    1
    5.8k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.5k

Integration einer Ambientika-Lüftungsanlage

Scheduled Pinned Locked Moved JavaScript
5 Posts 4 Posters 488 Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    djlex
    wrote on last edited by djlex
    #1

    Hallo zusammen,

    ich möchte hier ein kurzes Skript vorstellen, mit dem sich die Daten einer Ambientika-Lüftungsanlage (Smart-Geräte von Ambientika) in ioBroker auslesen lassen. Das Skript basiert auf Code, der in diesem GitHub-Repository dokumentiert ist. Es authentifiziert sich zunächst bei der Ambientika-API, ruft den Status der Lüftungsanlage ab und schreibt die Messwerte bzw. Geräteeinstellungen in einzelne ioBroker-Datenpunkte.

    Voraussetzungen
    ioBroker mit installiertem JavaScript-Adapter
    axios als npm-Paket in der JavaScript-Adapter-Umgebung Zugangsdaten für die Ambientika-Cloud (Benutzername und Passwort)
    Seriennummer des jeweiligen Ambientika-Geräts
    Funktionsweise des Skripts
    Authentifizierung:
    Über die Methode authenticate() wird ein POST-Request an die Ambientika-API gesendet. Bei erfolgreicher Anmeldung liefert die API einen JWT‑Token zurück.
    Gerätestatus abrufen:
    Nach der Authentifizierung wird über getDeviceStatus() ein GET-Request an /device/device-status geschickt, um den aktuellen Status des Lüftungsgeräts (Temperatur, Luftfeuchtigkeit, Lüftergeschwindigkeit etc.) zu erhalten.
    Datenpunkte in ioBroker:
    Die empfangenen Werte werden in separate Datenpunkte geschrieben (z. B. ambientika.temperature für die Temperatur). Damit lässt sich jeder Messwert in ioBroker individuell weiterverarbeiten oder visualisieren.
    Automatischer Ablauf:
    Ein setInterval(updateAmbientikaData, 60000) ruft alle 60 Sekunden die Aktualisierung auf. So bleiben die Datenpunkte in ioBroker immer auf dem neuesten Stand.
    Skript-Code
    Das folgende Skript wird im ioBroker-JavaScript-Adapter (als JavaScript-Datei oder direkt im Skript-Editor) hinterlegt und ausgeführt. Achtet darauf, die Platzhalter (DEIN_BENUTZERNAME, DEIN_PASSWORT, DEINE_DEVICE_SERIAL_NUMBER) durch eure echten Werte zu ersetzen. Außerdem muss die Konstante host ggf. an eure Instanz angepasst werden, falls sich an der API-URL etwas ändert.

    // Ambientika-Integration in ioBroker mittels axios (muss in Deiner ioBroker-Umgebung installiert sein)
    const axios = require('axios');
    
    // Konfiguration (bitte anpassen)
    const host = "https://app.ambientika.eu:4521";
    const username = "DEIN_BENUTZERNAME";
    const password = "DEIN_PASSWORT";
    const deviceSerialNumber = "DEINE_DEVICE_SERIAL_NUMBER";
    
    // Mapping für fanSpeed: "Low" -> 0, "Medium" -> 1, "High" -> 2
    const fanSpeedMapping = {
        "Low": 0,
        "Medium": 1,
        "High": 2
    };
    
    // Datenpunkte anlegen
    createState("ambientika.authStatus", { name: "Authentifizierungsstatus", type: "string", role: "state" }, "", true);
    createState("ambientika.operatingMode", { name: "Betriebsmodus", type: "string", role: "state" }, "", true);
    createState("ambientika.fanSpeed", { name: "Lüftergeschwindigkeit", type: "number", role: "value" }, 0, true);
    createState("ambientika.humidityLevel", { name: "Luftfeuchtigkeitsstufe", type: "string", role: "state" }, "", true);
    createState("ambientika.lightSensorLevel", { name: "Licht-Sensor-Level", type: "string", role: "state" }, "", true);
    createState("ambientika.temperature", { name: "Temperatur", type: "number", role: "value", unit: "°C" }, 0, true);
    createState("ambientika.humidity", { name: "Luftfeuchtigkeit", type: "number", role: "value", unit: "%" }, 0, true);
    createState("ambientika.airQuality", { name: "Luftqualität", type: "string", role: "state" }, "", true);
    createState("ambientika.humidityAlarm", { name: "Feuchtigkeitsalarm", type: "boolean", role: "indicator" }, false, true);
    createState("ambientika.filtersStatus", { name: "Filterstatus", type: "string", role: "state" }, "", true);
    createState("ambientika.nightAlarm", { name: "Nachtalarm", type: "boolean", role: "indicator" }, false, true);
    createState("ambientika.deviceRole", { name: "Geräterolle", type: "string", role: "state" }, "", true);
    createState("ambientika.lastOperatingMode", { name: "Letzter Betriebsmodus", type: "string", role: "state" }, "", true);
    createState("ambientika.packetType", { name: "Pakettyp", type: "string", role: "state" }, "", true);
    createState("ambientika.deviceType", { name: "Gerätetyp", type: "string", role: "state" }, "", true);
    createState("ambientika.deviceSerialNumber", { name: "Geräteseriennummer", type: "string", role: "state" }, "", true);
    
    // Funktion zur Authentifizierung
    async function authenticate() {
        try {
            const response = await axios.post(`${host}/users/authenticate`, {
                username: username,
                password: password
            });
            if (response.status === 200) {
                setState("ambientika.authStatus", "Authentifiziert", true);
                return { id: response.data.id, token: response.data.jwtToken };
            } else {
                setState("ambientika.authStatus", "Authentifizierung fehlgeschlagen", true);
                throw new Error("Authentifizierung fehlgeschlagen, Status: " + response.status);
            }
        } catch (error) {
            setState("ambientika.authStatus", "Fehler: " + error.message, true);
            throw error;
        }
    }
    
    // Funktion zum Abrufen des Gerätestatus
    async function getDeviceStatus(authData) {
        try {
            const response = await axios.get(`${host}/device/device-status`, {
                headers: { "Authorization": "Bearer " + authData.token },
                params: { deviceSerialNumber: deviceSerialNumber }
            });
            if (response.status === 200) {
                return response.data;
            } else {
                throw new Error("Statusabfrage fehlgeschlagen, Status: " + response.status);
            }
        } catch (error) {
            throw error;
        }
    }
    
    // Hauptfunktion zur Aktualisierung der Ambientika-Daten
    async function updateAmbientikaData() {
        try {
            const authData = await authenticate();
            const statusData = await getDeviceStatus(authData);
    
            // Setzen der einzelnen Datenpunkte, ggf. Umwandlung der Werte
            setState("ambientika.operatingMode", statusData.operatingMode, true);
    
            // Umwandlung des fanSpeed-Werts von String in Zahl
            let fanSpeedValue = fanSpeedMapping[statusData.fanSpeed] !== undefined ? fanSpeedMapping[statusData.fanSpeed] : 0;
            setState("ambientika.fanSpeed", fanSpeedValue, true);
    
            setState("ambientika.humidityLevel", statusData.humidityLevel, true);
            setState("ambientika.lightSensorLevel", statusData.lightSensorLevel, true);
            setState("ambientika.temperature", statusData.temperature, true);
            setState("ambientika.humidity", statusData.humidity, true);
            setState("ambientika.airQuality", statusData.airQuality, true);
            setState("ambientika.humidityAlarm", statusData.humidityAlarm, true);
            setState("ambientika.filtersStatus", statusData.filtersStatus, true);
            setState("ambientika.nightAlarm", statusData.nightAlarm, true);
            setState("ambientika.deviceRole", statusData.deviceRole, true);
            setState("ambientika.lastOperatingMode", statusData.lastOperatingMode, true);
            setState("ambientika.packetType", statusData.packetType, true);
            setState("ambientika.deviceType", statusData.deviceType, true);
            setState("ambientika.deviceSerialNumber", statusData.deviceSerialNumber, true);
    
            log("Ambientika-Daten aktualisiert: " + JSON.stringify(statusData));
        } catch (error) {
            log("Fehler beim Aktualisieren der Ambientika-Daten: " + error.message, "error");
        }
    }
    
    // Aktualisierung alle 60 Sekunden; initialer Abruf erfolgt sofort
    setInterval(updateAmbientikaData, 60000);
    updateAmbientikaData();
    

    Hinweise & Tipps
    Fehlermeldungen: Sollten Warnungen bzgl. falscher Typen im ioBroker-Log erscheinen, prüft, ob alle Datenpunkte (z. B. „fanSpeed“) den passenden Typ haben. Im Skript erfolgt bereits eine Umwandlung von String zu Zahl über das fanSpeedMapping.
    Zusätzliche Anpassungen: Wer weitere Werte benötigt oder bestimmte Betriebsmodi (z. B. „change-mode“) ansteuern möchte, kann den Code leicht erweitern. Die Ambientika-API bietet weitere Endpunkte, die über axios aufgerufen werden können.
    Intervall anpassen: Falls ein 60‑Sekunden-Intervall zu hoch oder zu niedrig ist, lässt sich das in der letzten Zeile mit setInterval(...) ändern.
    Ich hoffe, das Skript hilft euch, Ambientika-Geräte problemlos in ioBroker einzubinden. Solltet ihr Fragen oder Ergänzungen haben, meldet euch gerne!

    Viel Erfolg beim Ausprobieren!

    edit: Github Repo

    HomoranH mcm1957M J 3 Replies Last reply
    0
    • D djlex

      Hallo zusammen,

      ich möchte hier ein kurzes Skript vorstellen, mit dem sich die Daten einer Ambientika-Lüftungsanlage (Smart-Geräte von Ambientika) in ioBroker auslesen lassen. Das Skript basiert auf Code, der in diesem GitHub-Repository dokumentiert ist. Es authentifiziert sich zunächst bei der Ambientika-API, ruft den Status der Lüftungsanlage ab und schreibt die Messwerte bzw. Geräteeinstellungen in einzelne ioBroker-Datenpunkte.

      Voraussetzungen
      ioBroker mit installiertem JavaScript-Adapter
      axios als npm-Paket in der JavaScript-Adapter-Umgebung Zugangsdaten für die Ambientika-Cloud (Benutzername und Passwort)
      Seriennummer des jeweiligen Ambientika-Geräts
      Funktionsweise des Skripts
      Authentifizierung:
      Über die Methode authenticate() wird ein POST-Request an die Ambientika-API gesendet. Bei erfolgreicher Anmeldung liefert die API einen JWT‑Token zurück.
      Gerätestatus abrufen:
      Nach der Authentifizierung wird über getDeviceStatus() ein GET-Request an /device/device-status geschickt, um den aktuellen Status des Lüftungsgeräts (Temperatur, Luftfeuchtigkeit, Lüftergeschwindigkeit etc.) zu erhalten.
      Datenpunkte in ioBroker:
      Die empfangenen Werte werden in separate Datenpunkte geschrieben (z. B. ambientika.temperature für die Temperatur). Damit lässt sich jeder Messwert in ioBroker individuell weiterverarbeiten oder visualisieren.
      Automatischer Ablauf:
      Ein setInterval(updateAmbientikaData, 60000) ruft alle 60 Sekunden die Aktualisierung auf. So bleiben die Datenpunkte in ioBroker immer auf dem neuesten Stand.
      Skript-Code
      Das folgende Skript wird im ioBroker-JavaScript-Adapter (als JavaScript-Datei oder direkt im Skript-Editor) hinterlegt und ausgeführt. Achtet darauf, die Platzhalter (DEIN_BENUTZERNAME, DEIN_PASSWORT, DEINE_DEVICE_SERIAL_NUMBER) durch eure echten Werte zu ersetzen. Außerdem muss die Konstante host ggf. an eure Instanz angepasst werden, falls sich an der API-URL etwas ändert.

      // Ambientika-Integration in ioBroker mittels axios (muss in Deiner ioBroker-Umgebung installiert sein)
      const axios = require('axios');
      
      // Konfiguration (bitte anpassen)
      const host = "https://app.ambientika.eu:4521";
      const username = "DEIN_BENUTZERNAME";
      const password = "DEIN_PASSWORT";
      const deviceSerialNumber = "DEINE_DEVICE_SERIAL_NUMBER";
      
      // Mapping für fanSpeed: "Low" -> 0, "Medium" -> 1, "High" -> 2
      const fanSpeedMapping = {
          "Low": 0,
          "Medium": 1,
          "High": 2
      };
      
      // Datenpunkte anlegen
      createState("ambientika.authStatus", { name: "Authentifizierungsstatus", type: "string", role: "state" }, "", true);
      createState("ambientika.operatingMode", { name: "Betriebsmodus", type: "string", role: "state" }, "", true);
      createState("ambientika.fanSpeed", { name: "Lüftergeschwindigkeit", type: "number", role: "value" }, 0, true);
      createState("ambientika.humidityLevel", { name: "Luftfeuchtigkeitsstufe", type: "string", role: "state" }, "", true);
      createState("ambientika.lightSensorLevel", { name: "Licht-Sensor-Level", type: "string", role: "state" }, "", true);
      createState("ambientika.temperature", { name: "Temperatur", type: "number", role: "value", unit: "°C" }, 0, true);
      createState("ambientika.humidity", { name: "Luftfeuchtigkeit", type: "number", role: "value", unit: "%" }, 0, true);
      createState("ambientika.airQuality", { name: "Luftqualität", type: "string", role: "state" }, "", true);
      createState("ambientika.humidityAlarm", { name: "Feuchtigkeitsalarm", type: "boolean", role: "indicator" }, false, true);
      createState("ambientika.filtersStatus", { name: "Filterstatus", type: "string", role: "state" }, "", true);
      createState("ambientika.nightAlarm", { name: "Nachtalarm", type: "boolean", role: "indicator" }, false, true);
      createState("ambientika.deviceRole", { name: "Geräterolle", type: "string", role: "state" }, "", true);
      createState("ambientika.lastOperatingMode", { name: "Letzter Betriebsmodus", type: "string", role: "state" }, "", true);
      createState("ambientika.packetType", { name: "Pakettyp", type: "string", role: "state" }, "", true);
      createState("ambientika.deviceType", { name: "Gerätetyp", type: "string", role: "state" }, "", true);
      createState("ambientika.deviceSerialNumber", { name: "Geräteseriennummer", type: "string", role: "state" }, "", true);
      
      // Funktion zur Authentifizierung
      async function authenticate() {
          try {
              const response = await axios.post(`${host}/users/authenticate`, {
                  username: username,
                  password: password
              });
              if (response.status === 200) {
                  setState("ambientika.authStatus", "Authentifiziert", true);
                  return { id: response.data.id, token: response.data.jwtToken };
              } else {
                  setState("ambientika.authStatus", "Authentifizierung fehlgeschlagen", true);
                  throw new Error("Authentifizierung fehlgeschlagen, Status: " + response.status);
              }
          } catch (error) {
              setState("ambientika.authStatus", "Fehler: " + error.message, true);
              throw error;
          }
      }
      
      // Funktion zum Abrufen des Gerätestatus
      async function getDeviceStatus(authData) {
          try {
              const response = await axios.get(`${host}/device/device-status`, {
                  headers: { "Authorization": "Bearer " + authData.token },
                  params: { deviceSerialNumber: deviceSerialNumber }
              });
              if (response.status === 200) {
                  return response.data;
              } else {
                  throw new Error("Statusabfrage fehlgeschlagen, Status: " + response.status);
              }
          } catch (error) {
              throw error;
          }
      }
      
      // Hauptfunktion zur Aktualisierung der Ambientika-Daten
      async function updateAmbientikaData() {
          try {
              const authData = await authenticate();
              const statusData = await getDeviceStatus(authData);
      
              // Setzen der einzelnen Datenpunkte, ggf. Umwandlung der Werte
              setState("ambientika.operatingMode", statusData.operatingMode, true);
      
              // Umwandlung des fanSpeed-Werts von String in Zahl
              let fanSpeedValue = fanSpeedMapping[statusData.fanSpeed] !== undefined ? fanSpeedMapping[statusData.fanSpeed] : 0;
              setState("ambientika.fanSpeed", fanSpeedValue, true);
      
              setState("ambientika.humidityLevel", statusData.humidityLevel, true);
              setState("ambientika.lightSensorLevel", statusData.lightSensorLevel, true);
              setState("ambientika.temperature", statusData.temperature, true);
              setState("ambientika.humidity", statusData.humidity, true);
              setState("ambientika.airQuality", statusData.airQuality, true);
              setState("ambientika.humidityAlarm", statusData.humidityAlarm, true);
              setState("ambientika.filtersStatus", statusData.filtersStatus, true);
              setState("ambientika.nightAlarm", statusData.nightAlarm, true);
              setState("ambientika.deviceRole", statusData.deviceRole, true);
              setState("ambientika.lastOperatingMode", statusData.lastOperatingMode, true);
              setState("ambientika.packetType", statusData.packetType, true);
              setState("ambientika.deviceType", statusData.deviceType, true);
              setState("ambientika.deviceSerialNumber", statusData.deviceSerialNumber, true);
      
              log("Ambientika-Daten aktualisiert: " + JSON.stringify(statusData));
          } catch (error) {
              log("Fehler beim Aktualisieren der Ambientika-Daten: " + error.message, "error");
          }
      }
      
      // Aktualisierung alle 60 Sekunden; initialer Abruf erfolgt sofort
      setInterval(updateAmbientikaData, 60000);
      updateAmbientikaData();
      

      Hinweise & Tipps
      Fehlermeldungen: Sollten Warnungen bzgl. falscher Typen im ioBroker-Log erscheinen, prüft, ob alle Datenpunkte (z. B. „fanSpeed“) den passenden Typ haben. Im Skript erfolgt bereits eine Umwandlung von String zu Zahl über das fanSpeedMapping.
      Zusätzliche Anpassungen: Wer weitere Werte benötigt oder bestimmte Betriebsmodi (z. B. „change-mode“) ansteuern möchte, kann den Code leicht erweitern. Die Ambientika-API bietet weitere Endpunkte, die über axios aufgerufen werden können.
      Intervall anpassen: Falls ein 60‑Sekunden-Intervall zu hoch oder zu niedrig ist, lässt sich das in der letzten Zeile mit setInterval(...) ändern.
      Ich hoffe, das Skript hilft euch, Ambientika-Geräte problemlos in ioBroker einzubinden. Solltet ihr Fragen oder Ergänzungen haben, meldet euch gerne!

      Viel Erfolg beim Ausprobieren!

      edit: Github Repo

      HomoranH Do not disturb
      HomoranH Do not disturb
      Homoran
      Global Moderator Administrators
      wrote on last edited by
      #2

      @djlex sagte in Integration einer Ambientika-Lüftungsanlage:

      Das Skript basiert auf Code, der in diesem GitHub-Repository dokumentiert ist.

      welchem?

      kein Support per PN! - Fragen im Forum stellen -
      Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
      Das Forum freut sich über eine Spende. Benutzt dazu den Spendenbutton oben rechts. Danke!
      der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

      1 Reply Last reply
      0
      • D djlex

        Hallo zusammen,

        ich möchte hier ein kurzes Skript vorstellen, mit dem sich die Daten einer Ambientika-Lüftungsanlage (Smart-Geräte von Ambientika) in ioBroker auslesen lassen. Das Skript basiert auf Code, der in diesem GitHub-Repository dokumentiert ist. Es authentifiziert sich zunächst bei der Ambientika-API, ruft den Status der Lüftungsanlage ab und schreibt die Messwerte bzw. Geräteeinstellungen in einzelne ioBroker-Datenpunkte.

        Voraussetzungen
        ioBroker mit installiertem JavaScript-Adapter
        axios als npm-Paket in der JavaScript-Adapter-Umgebung Zugangsdaten für die Ambientika-Cloud (Benutzername und Passwort)
        Seriennummer des jeweiligen Ambientika-Geräts
        Funktionsweise des Skripts
        Authentifizierung:
        Über die Methode authenticate() wird ein POST-Request an die Ambientika-API gesendet. Bei erfolgreicher Anmeldung liefert die API einen JWT‑Token zurück.
        Gerätestatus abrufen:
        Nach der Authentifizierung wird über getDeviceStatus() ein GET-Request an /device/device-status geschickt, um den aktuellen Status des Lüftungsgeräts (Temperatur, Luftfeuchtigkeit, Lüftergeschwindigkeit etc.) zu erhalten.
        Datenpunkte in ioBroker:
        Die empfangenen Werte werden in separate Datenpunkte geschrieben (z. B. ambientika.temperature für die Temperatur). Damit lässt sich jeder Messwert in ioBroker individuell weiterverarbeiten oder visualisieren.
        Automatischer Ablauf:
        Ein setInterval(updateAmbientikaData, 60000) ruft alle 60 Sekunden die Aktualisierung auf. So bleiben die Datenpunkte in ioBroker immer auf dem neuesten Stand.
        Skript-Code
        Das folgende Skript wird im ioBroker-JavaScript-Adapter (als JavaScript-Datei oder direkt im Skript-Editor) hinterlegt und ausgeführt. Achtet darauf, die Platzhalter (DEIN_BENUTZERNAME, DEIN_PASSWORT, DEINE_DEVICE_SERIAL_NUMBER) durch eure echten Werte zu ersetzen. Außerdem muss die Konstante host ggf. an eure Instanz angepasst werden, falls sich an der API-URL etwas ändert.

        // Ambientika-Integration in ioBroker mittels axios (muss in Deiner ioBroker-Umgebung installiert sein)
        const axios = require('axios');
        
        // Konfiguration (bitte anpassen)
        const host = "https://app.ambientika.eu:4521";
        const username = "DEIN_BENUTZERNAME";
        const password = "DEIN_PASSWORT";
        const deviceSerialNumber = "DEINE_DEVICE_SERIAL_NUMBER";
        
        // Mapping für fanSpeed: "Low" -> 0, "Medium" -> 1, "High" -> 2
        const fanSpeedMapping = {
            "Low": 0,
            "Medium": 1,
            "High": 2
        };
        
        // Datenpunkte anlegen
        createState("ambientika.authStatus", { name: "Authentifizierungsstatus", type: "string", role: "state" }, "", true);
        createState("ambientika.operatingMode", { name: "Betriebsmodus", type: "string", role: "state" }, "", true);
        createState("ambientika.fanSpeed", { name: "Lüftergeschwindigkeit", type: "number", role: "value" }, 0, true);
        createState("ambientika.humidityLevel", { name: "Luftfeuchtigkeitsstufe", type: "string", role: "state" }, "", true);
        createState("ambientika.lightSensorLevel", { name: "Licht-Sensor-Level", type: "string", role: "state" }, "", true);
        createState("ambientika.temperature", { name: "Temperatur", type: "number", role: "value", unit: "°C" }, 0, true);
        createState("ambientika.humidity", { name: "Luftfeuchtigkeit", type: "number", role: "value", unit: "%" }, 0, true);
        createState("ambientika.airQuality", { name: "Luftqualität", type: "string", role: "state" }, "", true);
        createState("ambientika.humidityAlarm", { name: "Feuchtigkeitsalarm", type: "boolean", role: "indicator" }, false, true);
        createState("ambientika.filtersStatus", { name: "Filterstatus", type: "string", role: "state" }, "", true);
        createState("ambientika.nightAlarm", { name: "Nachtalarm", type: "boolean", role: "indicator" }, false, true);
        createState("ambientika.deviceRole", { name: "Geräterolle", type: "string", role: "state" }, "", true);
        createState("ambientika.lastOperatingMode", { name: "Letzter Betriebsmodus", type: "string", role: "state" }, "", true);
        createState("ambientika.packetType", { name: "Pakettyp", type: "string", role: "state" }, "", true);
        createState("ambientika.deviceType", { name: "Gerätetyp", type: "string", role: "state" }, "", true);
        createState("ambientika.deviceSerialNumber", { name: "Geräteseriennummer", type: "string", role: "state" }, "", true);
        
        // Funktion zur Authentifizierung
        async function authenticate() {
            try {
                const response = await axios.post(`${host}/users/authenticate`, {
                    username: username,
                    password: password
                });
                if (response.status === 200) {
                    setState("ambientika.authStatus", "Authentifiziert", true);
                    return { id: response.data.id, token: response.data.jwtToken };
                } else {
                    setState("ambientika.authStatus", "Authentifizierung fehlgeschlagen", true);
                    throw new Error("Authentifizierung fehlgeschlagen, Status: " + response.status);
                }
            } catch (error) {
                setState("ambientika.authStatus", "Fehler: " + error.message, true);
                throw error;
            }
        }
        
        // Funktion zum Abrufen des Gerätestatus
        async function getDeviceStatus(authData) {
            try {
                const response = await axios.get(`${host}/device/device-status`, {
                    headers: { "Authorization": "Bearer " + authData.token },
                    params: { deviceSerialNumber: deviceSerialNumber }
                });
                if (response.status === 200) {
                    return response.data;
                } else {
                    throw new Error("Statusabfrage fehlgeschlagen, Status: " + response.status);
                }
            } catch (error) {
                throw error;
            }
        }
        
        // Hauptfunktion zur Aktualisierung der Ambientika-Daten
        async function updateAmbientikaData() {
            try {
                const authData = await authenticate();
                const statusData = await getDeviceStatus(authData);
        
                // Setzen der einzelnen Datenpunkte, ggf. Umwandlung der Werte
                setState("ambientika.operatingMode", statusData.operatingMode, true);
        
                // Umwandlung des fanSpeed-Werts von String in Zahl
                let fanSpeedValue = fanSpeedMapping[statusData.fanSpeed] !== undefined ? fanSpeedMapping[statusData.fanSpeed] : 0;
                setState("ambientika.fanSpeed", fanSpeedValue, true);
        
                setState("ambientika.humidityLevel", statusData.humidityLevel, true);
                setState("ambientika.lightSensorLevel", statusData.lightSensorLevel, true);
                setState("ambientika.temperature", statusData.temperature, true);
                setState("ambientika.humidity", statusData.humidity, true);
                setState("ambientika.airQuality", statusData.airQuality, true);
                setState("ambientika.humidityAlarm", statusData.humidityAlarm, true);
                setState("ambientika.filtersStatus", statusData.filtersStatus, true);
                setState("ambientika.nightAlarm", statusData.nightAlarm, true);
                setState("ambientika.deviceRole", statusData.deviceRole, true);
                setState("ambientika.lastOperatingMode", statusData.lastOperatingMode, true);
                setState("ambientika.packetType", statusData.packetType, true);
                setState("ambientika.deviceType", statusData.deviceType, true);
                setState("ambientika.deviceSerialNumber", statusData.deviceSerialNumber, true);
        
                log("Ambientika-Daten aktualisiert: " + JSON.stringify(statusData));
            } catch (error) {
                log("Fehler beim Aktualisieren der Ambientika-Daten: " + error.message, "error");
            }
        }
        
        // Aktualisierung alle 60 Sekunden; initialer Abruf erfolgt sofort
        setInterval(updateAmbientikaData, 60000);
        updateAmbientikaData();
        

        Hinweise & Tipps
        Fehlermeldungen: Sollten Warnungen bzgl. falscher Typen im ioBroker-Log erscheinen, prüft, ob alle Datenpunkte (z. B. „fanSpeed“) den passenden Typ haben. Im Skript erfolgt bereits eine Umwandlung von String zu Zahl über das fanSpeedMapping.
        Zusätzliche Anpassungen: Wer weitere Werte benötigt oder bestimmte Betriebsmodi (z. B. „change-mode“) ansteuern möchte, kann den Code leicht erweitern. Die Ambientika-API bietet weitere Endpunkte, die über axios aufgerufen werden können.
        Intervall anpassen: Falls ein 60‑Sekunden-Intervall zu hoch oder zu niedrig ist, lässt sich das in der letzten Zeile mit setInterval(...) ändern.
        Ich hoffe, das Skript hilft euch, Ambientika-Geräte problemlos in ioBroker einzubinden. Solltet ihr Fragen oder Ergänzungen haben, meldet euch gerne!

        Viel Erfolg beim Ausprobieren!

        edit: Github Repo

        mcm1957M Online
        mcm1957M Online
        mcm1957
        wrote on last edited by
        #3

        @djlex said in Integration einer Ambientika-Lüftungsanlage:

        (z. B. Installation per npm install axios im Verzeichnis /opt/iobroker/node_modules/iobroker.javascript/ oder dem entsprechenden Pfad eurer Installation)

        Von einer manuellen Installation mittels npm in ein ioBroker-Verzeichnis ist DRINGEND abzuraten

        Entwicklung u Betreuung: envertech-pv, hoymiles-ms, ns-client, pid, snmp Adapter;
        Support Repositoryverwaltung.

        Wer 'nen Kaffee spendieren will: https://paypal.me

        LESEN - gute Forenbeitrage

        1 Reply Last reply
        0
        • D Offline
          D Offline
          djlex
          wrote on last edited by
          #4

          Hallo

          Danke für die Hinweise. Ich hab es angepasst.

          ich bin kein Programmieren ich hab es mit chatgpt so angepasst das beim mir funktioniert.

          Wollte nur mit der Community teilen die Vielleicht sowas suchen.

          Vielleicht kann auch jemand ein Adapter mit diesen Informationen Bauen.

          Mit freundlichen Grüssen

          1 Reply Last reply
          1
          • D djlex

            Hallo zusammen,

            ich möchte hier ein kurzes Skript vorstellen, mit dem sich die Daten einer Ambientika-Lüftungsanlage (Smart-Geräte von Ambientika) in ioBroker auslesen lassen. Das Skript basiert auf Code, der in diesem GitHub-Repository dokumentiert ist. Es authentifiziert sich zunächst bei der Ambientika-API, ruft den Status der Lüftungsanlage ab und schreibt die Messwerte bzw. Geräteeinstellungen in einzelne ioBroker-Datenpunkte.

            Voraussetzungen
            ioBroker mit installiertem JavaScript-Adapter
            axios als npm-Paket in der JavaScript-Adapter-Umgebung Zugangsdaten für die Ambientika-Cloud (Benutzername und Passwort)
            Seriennummer des jeweiligen Ambientika-Geräts
            Funktionsweise des Skripts
            Authentifizierung:
            Über die Methode authenticate() wird ein POST-Request an die Ambientika-API gesendet. Bei erfolgreicher Anmeldung liefert die API einen JWT‑Token zurück.
            Gerätestatus abrufen:
            Nach der Authentifizierung wird über getDeviceStatus() ein GET-Request an /device/device-status geschickt, um den aktuellen Status des Lüftungsgeräts (Temperatur, Luftfeuchtigkeit, Lüftergeschwindigkeit etc.) zu erhalten.
            Datenpunkte in ioBroker:
            Die empfangenen Werte werden in separate Datenpunkte geschrieben (z. B. ambientika.temperature für die Temperatur). Damit lässt sich jeder Messwert in ioBroker individuell weiterverarbeiten oder visualisieren.
            Automatischer Ablauf:
            Ein setInterval(updateAmbientikaData, 60000) ruft alle 60 Sekunden die Aktualisierung auf. So bleiben die Datenpunkte in ioBroker immer auf dem neuesten Stand.
            Skript-Code
            Das folgende Skript wird im ioBroker-JavaScript-Adapter (als JavaScript-Datei oder direkt im Skript-Editor) hinterlegt und ausgeführt. Achtet darauf, die Platzhalter (DEIN_BENUTZERNAME, DEIN_PASSWORT, DEINE_DEVICE_SERIAL_NUMBER) durch eure echten Werte zu ersetzen. Außerdem muss die Konstante host ggf. an eure Instanz angepasst werden, falls sich an der API-URL etwas ändert.

            // Ambientika-Integration in ioBroker mittels axios (muss in Deiner ioBroker-Umgebung installiert sein)
            const axios = require('axios');
            
            // Konfiguration (bitte anpassen)
            const host = "https://app.ambientika.eu:4521";
            const username = "DEIN_BENUTZERNAME";
            const password = "DEIN_PASSWORT";
            const deviceSerialNumber = "DEINE_DEVICE_SERIAL_NUMBER";
            
            // Mapping für fanSpeed: "Low" -> 0, "Medium" -> 1, "High" -> 2
            const fanSpeedMapping = {
                "Low": 0,
                "Medium": 1,
                "High": 2
            };
            
            // Datenpunkte anlegen
            createState("ambientika.authStatus", { name: "Authentifizierungsstatus", type: "string", role: "state" }, "", true);
            createState("ambientika.operatingMode", { name: "Betriebsmodus", type: "string", role: "state" }, "", true);
            createState("ambientika.fanSpeed", { name: "Lüftergeschwindigkeit", type: "number", role: "value" }, 0, true);
            createState("ambientika.humidityLevel", { name: "Luftfeuchtigkeitsstufe", type: "string", role: "state" }, "", true);
            createState("ambientika.lightSensorLevel", { name: "Licht-Sensor-Level", type: "string", role: "state" }, "", true);
            createState("ambientika.temperature", { name: "Temperatur", type: "number", role: "value", unit: "°C" }, 0, true);
            createState("ambientika.humidity", { name: "Luftfeuchtigkeit", type: "number", role: "value", unit: "%" }, 0, true);
            createState("ambientika.airQuality", { name: "Luftqualität", type: "string", role: "state" }, "", true);
            createState("ambientika.humidityAlarm", { name: "Feuchtigkeitsalarm", type: "boolean", role: "indicator" }, false, true);
            createState("ambientika.filtersStatus", { name: "Filterstatus", type: "string", role: "state" }, "", true);
            createState("ambientika.nightAlarm", { name: "Nachtalarm", type: "boolean", role: "indicator" }, false, true);
            createState("ambientika.deviceRole", { name: "Geräterolle", type: "string", role: "state" }, "", true);
            createState("ambientika.lastOperatingMode", { name: "Letzter Betriebsmodus", type: "string", role: "state" }, "", true);
            createState("ambientika.packetType", { name: "Pakettyp", type: "string", role: "state" }, "", true);
            createState("ambientika.deviceType", { name: "Gerätetyp", type: "string", role: "state" }, "", true);
            createState("ambientika.deviceSerialNumber", { name: "Geräteseriennummer", type: "string", role: "state" }, "", true);
            
            // Funktion zur Authentifizierung
            async function authenticate() {
                try {
                    const response = await axios.post(`${host}/users/authenticate`, {
                        username: username,
                        password: password
                    });
                    if (response.status === 200) {
                        setState("ambientika.authStatus", "Authentifiziert", true);
                        return { id: response.data.id, token: response.data.jwtToken };
                    } else {
                        setState("ambientika.authStatus", "Authentifizierung fehlgeschlagen", true);
                        throw new Error("Authentifizierung fehlgeschlagen, Status: " + response.status);
                    }
                } catch (error) {
                    setState("ambientika.authStatus", "Fehler: " + error.message, true);
                    throw error;
                }
            }
            
            // Funktion zum Abrufen des Gerätestatus
            async function getDeviceStatus(authData) {
                try {
                    const response = await axios.get(`${host}/device/device-status`, {
                        headers: { "Authorization": "Bearer " + authData.token },
                        params: { deviceSerialNumber: deviceSerialNumber }
                    });
                    if (response.status === 200) {
                        return response.data;
                    } else {
                        throw new Error("Statusabfrage fehlgeschlagen, Status: " + response.status);
                    }
                } catch (error) {
                    throw error;
                }
            }
            
            // Hauptfunktion zur Aktualisierung der Ambientika-Daten
            async function updateAmbientikaData() {
                try {
                    const authData = await authenticate();
                    const statusData = await getDeviceStatus(authData);
            
                    // Setzen der einzelnen Datenpunkte, ggf. Umwandlung der Werte
                    setState("ambientika.operatingMode", statusData.operatingMode, true);
            
                    // Umwandlung des fanSpeed-Werts von String in Zahl
                    let fanSpeedValue = fanSpeedMapping[statusData.fanSpeed] !== undefined ? fanSpeedMapping[statusData.fanSpeed] : 0;
                    setState("ambientika.fanSpeed", fanSpeedValue, true);
            
                    setState("ambientika.humidityLevel", statusData.humidityLevel, true);
                    setState("ambientika.lightSensorLevel", statusData.lightSensorLevel, true);
                    setState("ambientika.temperature", statusData.temperature, true);
                    setState("ambientika.humidity", statusData.humidity, true);
                    setState("ambientika.airQuality", statusData.airQuality, true);
                    setState("ambientika.humidityAlarm", statusData.humidityAlarm, true);
                    setState("ambientika.filtersStatus", statusData.filtersStatus, true);
                    setState("ambientika.nightAlarm", statusData.nightAlarm, true);
                    setState("ambientika.deviceRole", statusData.deviceRole, true);
                    setState("ambientika.lastOperatingMode", statusData.lastOperatingMode, true);
                    setState("ambientika.packetType", statusData.packetType, true);
                    setState("ambientika.deviceType", statusData.deviceType, true);
                    setState("ambientika.deviceSerialNumber", statusData.deviceSerialNumber, true);
            
                    log("Ambientika-Daten aktualisiert: " + JSON.stringify(statusData));
                } catch (error) {
                    log("Fehler beim Aktualisieren der Ambientika-Daten: " + error.message, "error");
                }
            }
            
            // Aktualisierung alle 60 Sekunden; initialer Abruf erfolgt sofort
            setInterval(updateAmbientikaData, 60000);
            updateAmbientikaData();
            

            Hinweise & Tipps
            Fehlermeldungen: Sollten Warnungen bzgl. falscher Typen im ioBroker-Log erscheinen, prüft, ob alle Datenpunkte (z. B. „fanSpeed“) den passenden Typ haben. Im Skript erfolgt bereits eine Umwandlung von String zu Zahl über das fanSpeedMapping.
            Zusätzliche Anpassungen: Wer weitere Werte benötigt oder bestimmte Betriebsmodi (z. B. „change-mode“) ansteuern möchte, kann den Code leicht erweitern. Die Ambientika-API bietet weitere Endpunkte, die über axios aufgerufen werden können.
            Intervall anpassen: Falls ein 60‑Sekunden-Intervall zu hoch oder zu niedrig ist, lässt sich das in der letzten Zeile mit setInterval(...) ändern.
            Ich hoffe, das Skript hilft euch, Ambientika-Geräte problemlos in ioBroker einzubinden. Solltet ihr Fragen oder Ergänzungen haben, meldet euch gerne!

            Viel Erfolg beim Ausprobieren!

            edit: Github Repo

            J Offline
            J Offline
            jomifa
            wrote on last edited by
            #5

            @djlex
            Hallo,
            ich habe deine Anpassung von Home Assistant an den iobroker hier gefunden. Kannst du auch die Datenpunkte über die API schreiben? Was bietet die API noch für Datenpunkte? Gibt es dazu eine Übersicht?

            Grüße

            1 Reply Last reply
            0
            • HomoranH Homoran hat dieses Thema am aufgespalten

            Hello! It looks like you're interested in this conversation, but you don't have an account yet.

            Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

            With your input, this post could be even better 💗

            Register Login
            Reply
            • Reply as topic
            Log in to reply
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes


            Support us

            ioBroker
            Community Adapters
            Donate

            519

            Online

            32.7k

            Users

            82.6k

            Topics

            1.3m

            Posts
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
            ioBroker Community 2014-2025
            logo
            • Login

            • Don't have an account? Register

            • Login or register to search.
            • First post
              Last post
            0
            • Home
            • Recent
            • Tags
            • Unread 0
            • Categories
            • Unreplied
            • Popular
            • GitHub
            • Docu
            • Hilfe