Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [Script] Die sprechende Kaffeemaschine – Home Connect

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.3k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.3k

[Script] Die sprechende Kaffeemaschine – Home Connect

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
11 Beiträge 4 Kommentatoren 1.3k Aufrufe 7 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • arteckA Offline
    arteckA Offline
    arteck
    Developer Most Active
    schrieb am zuletzt editiert von arteck
    #2

    der adapter ist gut aber

    8b81f7c9-8d6a-4a19-aace-6ae1335dad91-grafik.png

    der hängt an der Kaffemaschiene

    SIEMENS-TI909701HC-68A40E188708

    der Trockner und die Spüllmaschiene wird erkannt

    der ist leer
    8dfdbada-a33a-4d1b-958e-7238cef8a04e-grafik.png

    irgendwas wird da nicht zusammen geparsed

    zigbee hab ich, zwave auch, nuc's genauso und HA auch

    B 1 Antwort Letzte Antwort
    0
    • arteckA arteck

      der adapter ist gut aber

      8b81f7c9-8d6a-4a19-aace-6ae1335dad91-grafik.png

      der hängt an der Kaffemaschiene

      SIEMENS-TI909701HC-68A40E188708

      der Trockner und die Spüllmaschiene wird erkannt

      der ist leer
      8dfdbada-a33a-4d1b-958e-7238cef8a04e-grafik.png

      irgendwas wird da nicht zusammen geparsed

      B Offline
      B Offline
      Bongo
      schrieb am zuletzt editiert von
      #3

      @arteck
      Ja, da stimmt was nicht. Bitte mit Debug log auf Github melden.

      Gruß
      Bongo

      Script - Die sprechende Kaffeemaschine – Home Connect
      Script - JUDO Wasserenthärtung - Connectivity-Modul API

      arteckA 1 Antwort Letzte Antwort
      0
      • B Bongo

        @arteck
        Ja, da stimmt was nicht. Bitte mit Debug log auf Github melden.

        arteckA Offline
        arteckA Offline
        arteck
        Developer Most Active
        schrieb am zuletzt editiert von
        #4

        @bongo sagte in Die sprechende Kaffeemaschine – Home Connect:

        @arteck
        Ja, da stimmt was nicht. Bitte mit Debug log auf Github melden.

        gmacht..

        hab direkt die Lösung geposted

        zigbee hab ich, zwave auch, nuc's genauso und HA auch

        1 Antwort Letzte Antwort
        2
        • B Bongo

          Vielleicht ist das Programm für den Einen oder Anderen hilfreich. Deshalb möchte ich es der Community zur Verfügung stellen.

          Ziel - Was kann das Programm?

          • Kaffeemaschine über Sprachassistenten ein- und ausschalten.
          • Status und Hinweise der Kaffeemaschine soll über einen Sprachassistenten ausgegeben werden.
          • Wechselnde Sprachausgaben für bestimmte Statusmeldungen.
          • Favoriten (Profil) der Kaffeespezialitäten (Kaffee Crema, Cappuccino, …) mit unterschiedlichen Parametern (Kaffeemenge, Wassertemperatur, …) erstellen.
          • Kaffeefavoriten per Sprachassistent ausgeben.
          • Pflegestatus (Entkalken, Reinigen, Wasserfilter wechseln) bereitstellen für Ausgabe mit Sprachassistenten oder VIS.

          Vorraussetzung

          • Eine Home Connect kompatible Kaffeemaschine.
            Getestet wurde das Script mit der Kaffeemaschine Siemens EQ.9 plus connect s500. Vermutlich funktioniert es auch mit ähnlichen Kaffeemaschinen von Siemens oder vielleicht auch mit Kaffeemaschinen von anderen Herstellern. Das wurde aber nicht getestet. Wenn ihr das Script benutzt, bitte um ein Feedback mit welcher Kaffeemaschine.
          • Adapter cloudless-homeconnect
            Der Adapter ist (noch) nicht im ioBroker Repository. Deshalb muss er über die Katze installiert werden.
            https://github.com/eifel-tech/ioBroker.cloudless-homeconnect
            Eine Instanz wird mit dem + am Adapter zugefügt.
            Der Adapter steuert die Kaffeemaschine ohne Cloud wie es zum Beispiel für die Home Connect APP notwendig ist. Nur beim ersten Start der Instanz wird eine Konfiguration aus der Cloud geladen. Deshalb ist eine Anmeldung an der Home Connect Cloud nötig.
          • Adapter iot
            Für Geräte-Erstellung in Alexa.
            Nach dem ersten Start des Scripts oder nach Änderung der Favoriten können über Alexa die neuen Geräte gesucht werden.
          • Adapter alexa2
            Für Sprachbefehle und Sprachausgabe.
            Tipp: Wenn man für den Sprachbefehl „Alexa, Erichs Kaffee ein“ unschick findet, kann man eine Routine „Erichs Kaffee“ erstellen, was das entsprechende „Gerät“ einschaltet.
          • Einstellung in der Javascript Instanz:
            Kommando "setObject" erlauben - muss aktiviert sein.

          Bedienung und Konfiguration

          • Vor dem ersten Start bitte die Voraussetzungen prüfen.
          • Im Programm im Abschnitt Settings die Variablen der Kanäle und Datenpunkte richtig setzen.
            ** In myConfig eventuell den Smartnamen nach eigenen Vorlieben ändern.
            ** In myProfile die Favoriten der Kaffeespezialitäten definieren.
            ** In myPowerState die Texte für Kaffeemaschine Ein/Aus definieren.
            ** In myStatus die Texte für die Statusmeldungen anpassen.
          • Programm starten.
          • Nach dem Start unter 0_userdata.0.Home-Connect.Kaffeemaschine.Profile die Kaffeespezialität konfigurieren.

          Bekannte Probleme

          • Betrifft Datenpunkt DisplayName für eine gespeicherte Kaffeespezialität
            Ich vermute, dass dieser Wert im Display der Kaffeemaschine erscheinen soll. Tut es aber bei meiner Kaffeemaschine nicht. Eventuell könnte es bei einem anderen Model angezeigt werden.

          Script Home-Connect-Kaffeemaschine.js:

          //
          // Home-Connect-Kaffeemaschine.js
          //
          // 09.10.2024 Version 1.0
          // Initialversion
          //
          // 23.11.2024 Version 1.1
          // Datenpunkt ob Pflege notwendig.
          // Text für Pflegestatus angepasst.
          //
          // 24.12.2024 Version 1.2
          // ack=false für Adapter-Datenpunkte
          //
          // 06.01.2025 Version 1.3
          // Verbindungen in den Status
          //
          // 17.11.2025 Version 1.4
          // Pflegestatus maintenance-speak mit Event erweitert: "DeviceDescalingBlockage": ["Die Kaffeemaschine ist gesperrt. Bitte entkalken!"],
          // Die Event-Statustexte geändert und erweitert.
          //  
          //--------------------------- Settings ------------------------
          const hcInstanz =     "cloudless-homeconnect.0";																														
          const hcDevice =      hcInstanz+".SIEMENS-TI9558X1DE-xxxxxxxxxxxx";    // Kanal für Kaffemaschine im cloudless-homeconnect
          const echoSpeak =     "alexa2.0.Echo-Devices.xxxxxxxxxxxxxxxx.Commands.speak";      // speak-Datenpunkt des Echo-Device für die Sprachausgabe im alexa2
          const dpUserdata =    "0_userdata.0.Home-Connect.Kaffeemaschine";                   // Namespace im Userdata
          //
          // Datenpunkte im 0_userdata
          //
          const myConfig = {
            "row": [
              {
                "dp": "status-speak",                         // Datenpunkt für Statusmeldungen
                "name": "Displaymeldung für Sprachassistent",
                "read": true, "write": true,
                "type": "string", "role": "value",
                "value": "", "unit": "",
                "smartName": ""
              },
              {
                "dp": "maintenance",                          // Datenpunkt ob Pflege notwendig - Version 1.1
                "name": "Pflege notwendig?",
                "read": true, "write": false,
                "type": "boolean", "role": "switch",
                "value": false, "unit": "",
                "smartName": ""
              },
              {
                "dp": "maintenance-speak",                    // Datenpunkt für Pflegeanfrage
                "name": "Status der Kaffeemaschine",
                "read": true, "write": true,
                "type": "string", "role": "value",
                "value": "", "unit": "",
                "smartName": ""
              },
              {
                "dp": "kaffeemaschine",                       // Datenpunkt für Ein/Aus
                "name": "Kaffemaschine Ein/Aus",
                "read": true, "write": true,
                "type": "boolean", "role": "switch",
                "value": false, "unit": "",
                "smartName": { de: "Kaffeemaschine, Kaffee" , // Smartname für iot zur Übergabe an Alexa
                                  smartType: "SWITCH"}
              }
            ]
          }
          //
          // Datenpunkte für Profile (Favoriten) im 0_userdata
          //
          const myProfile = {
              "row": [
                  {
                      "profile": "Erich1",                    // beliebiger Favoritenname
                      "DisplayName": "Erichs Kaffee Crema",
                      "Program": "Beverage_Coffee",           // Kaffeespezialität aus cloudless-homeconnect.0.SIEMENS-TI9558X1DE-68A40E7DD334.Program
                      "smartName": { de: "Erichs Kaffee",     // Smartname für iot zur Übergabe an Alexa
                                      smartType: "SWITCH" },
                  },
                  {
                      "profile": "Erich2",
                      "DisplayName": "Erichs Cappuccino",
                      "Program": "Beverage_Cappuccino",
                      "smartName": { de: "Erichs Cappuccino",
                                      smartType: "SWITCH" },
                  },
                  {
                      "profile": "Sonja1",
                      "DisplayName": "Sonjas Kaffee Crema",
                      "Program": "Beverage_Coffee",
                      "smartName": { de: "Sonjas Kaffee",
                                      smartType: "SWITCH" },
                  },
                  {
                      "profile": "Sonja2",
                      "DisplayName": "Sonjas großer Kaffee Crema",
                      "Program": "Beverage_Coffee",
                      "smartName": { de: "Sonjas großer Kaffee",
                                      smartType: "SWITCH" },
                  }
              ]
          }
          //
          // Texte zum Anpassen für Ein/Aus
          // Texte im Array mit Komma getrennt werden zufällig wiedergegeben.
          //
          const myPowerState ={
              "2": ["Is <emphasis>schowieder</emphasis> Kaffeezeit!", "Is schowieder Kaffee!"],   // On
              "3": ["Pfiat di.","Servus.","An scheener Kaffee!"],                                             // Standby
          };
          //
          // Texte zum Anpassen der Statusmeldungen. Mögliche Status für andere Maschinen
          // zu finden unter dem Datenpunkt deiner Kaffeemaschine:
          // cloudless-homeconnect.0.SIEMENS-TI9558X1DE-xxxxxxxx.Event
          // Texte im Array mit Komma getrennt werden zufällig wiedergegeben.
          //
          const myStatus = {
              "AdjustGrindSetting": [""],
              "BeanContainerEmpty": ["Bohnenbehälter ist leer. Bitte auffüllen."],
              "BrewingUnitIsMissing": [""],
              "CallHotline": [""],
              "CleanBrewingUnit": ["Bitte Brüheinheit reinigen und einfetten."],
              "CleanFillWaterTank": ["Bitte Wassertank gründlich spülen, gegebenenfalls Filter wieder einsetzen und Wasser in Tank füllen und einsetzen."],
              "CleanMilkTank": ["Bitte Milchbehälter reinigen."],
              "CloseDoor": ["Bitte Türe schließen."],
              "CoffeeOutletMissing": [""],
              "CustomerServiceRequest": [""],
              "DeactivatePlaylist": [""],
              "DeviceDescalingBlockage": ["Die Kaffeemaschine ist gesperrt. Bitte entkalken!"],
              "DeviceDescalingOverdue": ["Entkalken der Kaffeemaschine ist überfällig! Die Kaffeemaschine wird demnächst gesperrt."],
              "DeviceIsToCold4C": [""],
              "DeviceShouldBeCalcNCleaned": ["Bitte Kaffemaschine entkalken und reinigen."],
              "DeviceShouldBeCleaned": ["Bitte Kaffeemaschine reinigen."],
              "DeviceShouldBeDescaled": ["Bitte Kaffeemaschine entkalken."],
              "DripTrayFull": ["Tropfschale ist voll. Bitte leeren."],
              "DripTrayNotInserted": ["Bitte Tropfschale einsetzten."],
              "EmptyDripTray": ["Bitte Tropfschalen leeren und wieder einsetzen."],
              "EmptyDripTrayRemoveContainer": ["Bitte 1-Liter-Behälter entfernen, Tropfschalen leeren und wieder einsetzen."],
              "EmptyMilkTank": ["Milchbehälter ist leer. Bitte auffüllen."],
              "Enjoy": ["Genieße deinen Kaffee.","Möge Dein Kaffee stark und Dein Montag kurz sein.","Alles vor dem ersten Kaffee ist Notwehr.",
              "Du könntest auf Kaffee verzichten. Aber du bist kein Aufgeber.","Guter Kaffee ist wie gute Musik – beides berührt die Seele.",
              "Mit Kaffee und Humor kommt man allem Stress zuvor.","Es sprüht Dein Geist nur träge Funken, hast Du noch nicht Kaffee getrunken.",
              "Ein guter Tag beginnt mit Kaffee und einem Lächeln.","Halte Kurs und trink Kaffee, dann wird das schon!","Wach zu werden und zu leben, beginnt mit Kaffee.",
              "Jede Tasse Kaffee ist eine frische Chance.","Leben passiert, Kaffee hilft."],
              "FillDescaler": ["Bitte 0,5 Liter warmes wasser und Entkalkungsmittel in den Wassertank geben und Wassertank wieder einsetzen."],
              "InsertWaterFilter": ["Bitte neuen Wasserfilter einsetzen, Wassertank füllen und wieder einsetzen."],
              "MilkContainerConnected": [""],
              "MilkContainerRemoved": ["Hast du den Milchbeälter entfernt?"],
              "MilkReminder": ["Ich erinnere dich, den Milchbehälter zu entfernen."],
              "MilkStillOK": [""],
              "MilkTubeRemoved": [""],
              "NotEnoughPomaceCapacityForThisKindOfBeverage": [""],
              "NotEnoughWaterForThisKindOfBeverage": ["Nicht genügend Wasser für dieses Getränk vorhanden. Bitte auffüllen."],
              "PlaceContainerUnderOutlet": ["Bitte einen 1-Liter-Behälter unter dem Auslauf stellen und bestätigen."],
              "PlaceEmptyGlassUnderOutlet": [""],
              "PowerSupplyError": [""],
              "PressOnOff": [""],
              "ProgramFinished": ["Das Programm ist beendet. Du hast es geschafft."],
              "RefillEmptyBeanContainer": ["Bitte Bohnenbehälter auffüllen."],
              "RefillEmptyWaterTank": ["Bitte Wassertank auffüllen."],
              "RefillRemovedMilkContainer": [""],
              "RemoveContainerUnderOutlet": ["Bitte Behälter unter dem Auslass entfernen."],
              "RemoveMilkContainer": ["Bitte Milchbehälter entfernen."],
              "RemoveWaterFilter": ["Falls vorhanden, bitte Wasserfilter entfernen und bestätigen."],
              "RestartAppliance": [""],
              "ServiceProgramFinished": ["Das Programm ist erfolgreich beendet. Vielen Dank für die Bemühungen."],
              "SoftwareUpdateAvailable": ["Ein Softwareupdate ist verfügbar."],
              "SoftwareUpdateSuccessful": ["Das Softwareupdate ist installiert."],
              "SpecialRinsing": ["Spülen ist notwendig."],
              "SwitchOffPower30sekBackOn": [""],
              "SystemHasRunDry": ["Das System ist trocken gefahren. Bitte Wasser nachfüllen oder Filter entfernen."],
              "ThrowCleaningDiscInTheDrawer": ["Bitte gib eine Reinigungstablette in das Fach für Pulverkaffee und bestätige."],
              "UnderOverVoltage": [""],
              "WaterFilterShouldBeChanged": ["Der Wasserfilter muss gewechselt werden."],
              "WaterTankEmpty": ["Der Wassertank ist leer. Bitte auffüllen."],
              "WaterTankNearlyEmpty": ["Der Wassertank ist fast leer. Für das Spülen reicht es noch."],
              "WaterTankNotInserted": ["Bitte Wassertank einsetzen."],
          }
          //--------------------------- Settings end ---------------------
          const hcEvent =       hcDevice+".Event";
          const hcProgram =     hcDevice+".Program";
          const hcStatus =      hcDevice+".Status";
          const hcPowerState =  hcDevice+".Setting.PowerState";
          const dpProfile =     dpUserdata+".Profile";
          const hcconnected =   hcDevice+".General.connected";
          const hcconnection =  hcInstanz+".info.connection";
          
          init();
          async function init() {
              await createMyConfig(myConfig, dpUserdata);
              await createMyProfile(myProfile, dpProfile);
              await sleep(5 * 1000); // 5 Sekunden Pause
              //
              // Datenpunkt für Start der Kaffeeausgabe im Profile triggern
              //
              on({ id: [].concat(Array.prototype.slice.apply($(dpProfile + ".*.Start"))), change: 'any' }, async (dp) => {
                  if (getState(dp.id).val) {
                      // Wenn Start = true
                      var length = dp.id.split(".").length;
                      var program = dp.id.split(".")[length - 2]; // Programmordnername
                      var parameter = dp.id.split(".").pop();
                      var srcFolder = dp.id.replace("." + parameter, ""); // Programmordner ID
                      // Datenpunkte im Quellverzeichnis/Userdata scannen
                      $(srcFolder + ".*").each(function (id, i) {
                          //console.log(id);
                          var parameter = id.split(".").pop();
                          // Parameter übertragen
                          if (parameter != "Start") {
                              var value = getState(id).val;
                              var hcProgramID = hcProgram + "." + program + "." + parameter;
                              setState(hcProgramID, value, false);
                          }
                      })
                      await sleep(1 * 1000); // 1 Sekunden Pause
                      var hcProgramID = hcProgram + "." + program + ".Start";
                      setState(hcProgramID, true, false);
                  }
              });
              //
              // Datenpunkte für Event/Statusansagen triggern bei Änderung
              //
              const mySelector = $(hcEvent + ".*");
              mySelector.on(async function (dp) { // triggert bei Wertänderung der Datenpunkte des Selectors
                  var event = dp.id.substring(hcEvent.length + 1,)
          
                  if (typeof myStatus[event] !== "undefined" && myStatus[event] != "") {
                      if (dp.state.val == 1) {
                          var text = await randomText(myStatus[event]);
                          setMyState(dpUserdata + "." + "status-speak", text);
                      }
                  } else {
                      console.log("Keine Übersetzung für: " + event);
                  }
              });
              //
          					  
          	  
              // Pflege Status triggern
              //                                // Version 1.4
              const maintenance = [hcEvent + "DeviceDescalingBlockage" + hcEvent + ".DeviceDescalingOverdue", hcEvent + ".DeviceShouldBeCleaned",
                          hcEvent + ".DeviceShouldBeCalcNCleaned", hcEvent + ".WaterFilterShouldBeChanged",
                          hcEvent + ".DeviceShouldBeDescaled",
                          hcStatus + ".BeverageCountdownDescaling",hcStatus + ".BeverageCountdownCleaning",
                          hcStatus + ".BeverageCountdownCalcNClean",hcStatus + ".BeverageCountdownWaterfilter",
                          hcconnected, hcconnection];
              on({ id: maintenance, change: "ne" }, async (dp) => { // triggert bei Änderung der Datenpunkte
                  var maintenanceSpeak = "";
                  var connectSpeak = "";
                  let text="";
                  let maintenance = false;    // Version 1.1
                  // Verbindung prüfen. Version 1.3
                  if (!getState(hcconnected).val){
                      connectSpeak = connectSpeak + "Keine Socketverbindung zur Kaffeemaschine. ";
                  }
                  if (!getState(hcconnection).val){
                      connectSpeak = connectSpeak + "Mit einem Gerät nicht verbunden. ";
                  }
                  // Plegestatus prüfen
                  if(getState(hcEvent + ".DeviceDescalingBlockage").val){  // Version 1.4
                      text = await randomText(myStatus["DeviceDescalingBlockage"]);
                      maintenanceSpeak = maintenanceSpeak + text+" ";
                      maintenance = true;     // Version 1.1
                  } else if (getState(hcEvent + ".DeviceDescalingOverdue").val){
                      text = await randomText(myStatus["DeviceDescalingOverdue"]);
                      maintenanceSpeak = maintenanceSpeak + text+" ";
                      maintenance = true;     // Version 1.1
                  } else if (getState(hcEvent + ".DeviceShouldBeCleaned").val){
                      text = await randomText(myStatus["DeviceShouldBeCleaned"]);
                      maintenanceSpeak = maintenanceSpeak + text+" ";
                      maintenance = true;     // Version 1.1
                  } else if (getState(hcEvent + ".DeviceShouldBeCalcNCleaned").val){
                      text = await randomText(myStatus["DeviceShouldBeCalcNCleaned"]);
                      maintenanceSpeak = maintenanceSpeak + text+" ";
                      maintenance = true;     // Version 1.1
                  } else if (getState(hcEvent + ".DeviceShouldBeDescaled").val){
                      text = await randomText(myStatus["DeviceShouldBeDescaled"]);
                      maintenanceSpeak = maintenanceSpeak + text+" ";
                      maintenance = true;     // Version 1.1
                  } else if (getState(hcEvent + ".WaterFilterShouldBeChanged").val){
                      text = await randomText(myStatus["WaterFilterShouldBeChanged"]);
                      maintenanceSpeak = maintenanceSpeak + text+" ";
                      maintenance = true;     // Version 1.1
                  } else {
                      maintenanceSpeak = "Keine Pflegemaßnahmen für die Kaffeemaschine notwendig.";
                  }
                  // Pflege notwendig     Version 1.1
                  setMyState(dpUserdata + "." + "maintenance", maintenance);
                  // Calc’nClean
                  let dummy = getState(hcStatus + ".BeverageCountdownCalcNClean").val;
                  let countCups = dummy;
                  let nextMaitenance = "";
                  if (dummy > 0){                         // Version 1.1
                      countCups = dummy;
                      nextMaitenance = "Calc’nClean notwendig in "+countCups+" Tassen.";
                  }
                  // Entkalken
                  dummy = getState(hcStatus + ".BeverageCountdownDescaling").val;
                  if (dummy < countCups && dummy > 0){    // Version 1.1
                      countCups = dummy;
                      nextMaitenance = "Entkalken notwendig in "+countCups+" Tassen.";
                  }
                  // Reinigen
                  dummy = getState(hcStatus + ".BeverageCountdownCleaning").val;
                  if (dummy < countCups && dummy > 0){    // Version 1.1
                      countCups = dummy;
                      nextMaitenance = "Reinigen notwendig in "+countCups+" Tassen.";
                  }
                  // Wasserfilter
                  dummy = getState(hcStatus + ".BeverageCountdownWaterfilter").val;
                  if (dummy < countCups && dummy > 0){    // Version 1.1
                      countCups = dummy;
                      nextMaitenance = "Wasserfilter wechseln in "+countCups+" Tassen.";
                  }
                  maintenanceSpeak = connectSpeak+maintenanceSpeak + " " +nextMaitenance;
                  setMyState(dpUserdata + "." + "maintenance-speak", maintenanceSpeak);
              });
              //
              // PowerState triggern
              //
              on({ id: hcPowerState, change: "ne" }, async (dp) => { // triggert bei Änderung der Datenpunkte
                  if (typeof myPowerState[dp.state.val] !== "undefined" && myPowerState[dp.state.val] != "") {
                      var text = await randomText(myPowerState[dp.state.val]);
                      setState(echoSpeak, text, false);
                  }
              });
              //
              // Datenpunkt für Kaffeemaschine triggern bei Aktualisierung
              //
              on({ id: dpUserdata + ".kaffeemaschine", change: "any" }, async (dp) => { // triggert bei Aktualisierung der Datenpunkte
                  if (dp.state.val) {
                      setState(hcPowerState, 2, false);   // On
                  } else {
                      setState(hcPowerState, 3, false);   // Standby
                  }
              });
              //
              // Datenpunkt für Speak triggern bei Aktualisierung
              //
              on({ id: dpUserdata + ".status-speak", change: "any" }, async (dp) => { // triggert bei Aktualisierung der Datenpunkte
                  setState(echoSpeak, dp.state.val, false);
              });
          }
          /**
           * Objekte erzeugen
           * @param {Object} MyConfig Json-Objekt
           * @param {String} dpUserdata Workspace
           */
          async function createMyConfig(MyConfig, dpUserdata) {
            // Config scannen
            for (let i = 0; i < MyConfig.row.length; i++) {
              //console.log('Erzeuge: '+myConfig.row[i].dp);
              await createMyState(dpUserdata+"."+myConfig.row[i].dp, myConfig.row[i].name, myConfig.row[i].name, myConfig.row[i].read, myConfig.row[i].write, myConfig.row[i].type, myConfig.row[i].role, myConfig.row[i].unit, myConfig.row[i].smartName, myConfig.row[i].value);
          
            }
          }
          /**
           * Profile Objekte erzeugen
           * @param {Object} myProfile Json-Objekt
           * @param {String} dpProfile Workspace
           */
          async function createMyProfile(myProfile, dpProfile) {
            // Profile scannen
            for (let i = 0; i < myProfile.row.length; i++) {
              //console.log('Erzeuge Profil: '+myProfile.row[i].profile);
              var srcid = hcProgram+"."+myProfile.row[i].Program;
              var dstid = dpProfile+"."+myProfile.row[i].profile+"."+myProfile.row[i].Program;
              // Datenpunkte im Quellverzeichnis scannen
              $(srcid+".*").each(async function(id) { 
                  //console.log("id: "+id);
                  var obj = getObject(id);
                  if(obj && obj.type === 'state') {
                      var lastElement = id.split(".").pop();  // letztes Element des Datenpunktes
                      setObject(dstid+"."+lastElement, obj);
                      if ( !existsState(dstid+"."+lastElement)) {
                          if (lastElement == "Start"){
                              obj.common.smartName = myProfile.row[i].smartName;
                          }
                          setTimeout(function() {
                              setState(dstid+"."+lastElement, obj.common.def,true);
                          }, 200);
                      }
                  };
              })
              await sleep(1*1000);
          //    console.log(dstid+".DisplayName: ->"+myProfile.row[i].DisplayName);
              setState(dstid+".DisplayName", myProfile.row[i].DisplayName,true);
            }
          }
          /**
           * Zufälliger Text
           * @param {Array} text - Array aus mehreren Texten
           * @returns {String} return - gibt einen zufälligen Text aus dem Array zurück
           */
          async function randomText(text) {
              var length = text.length;
              var min = 0;
              var max = length-1;
              var zahl = Math.floor(Math.random() * (max - min + 1)) + min;
              return text[zahl];
          }
          /**
           * Objekt setzen
           * @param {String} state Objektpfad
           * @param {any} value Inhalt  
           */
          async function setMyState(state, value) {
            setState(state, value, true);
          }
          /**
           * Objekt erzeugen
           * @param {String} state Objektpfad
           * @param {String} name Name des Objektes
           * @param {String} desc Beschreibung des Objektes
           * @param {String} type Type des Objektes string,number
           * @param {Boolean} read Leserechte des Objektes
           * @param {Boolean} write Schreibrechte des Objektes
           * @param {String} role Rolle des Objektes button,...
           * @param {String} unit Rolle des Objektes button,...
           * @param {Object} smartName Smartname für Alexa
           * @param {any} value Inhalt  
           */
          async function createMyState(state, name, desc, read, write, type, role, unit, smartName, value) {
            if (type == "number") {
                //value = Number(value);
                await createStateAsync(state, 0, {
                    name: name,
                    desc: desc,
                    read: read,
                    write: write,
                    type: type,
                    role: role,
                    unit: unit
                });
            } else {
                if (smartName == "") {
                    // ohne Smartnamen
                    await createStateAsync(state, value, {
                        name: name,
                        desc: desc,
                        read: read,
                        write: write,
                        type: type,
                        role: role,
                        unit: unit
                    });
                } else {
                    await createStateAsync(state, value, {
                        // mit Smartnamen
                        name: name,
                        desc: desc,
                        read: read,
                        write: write,
                        type: type,
                        role: role,
                        unit: unit,
                        smartName: smartName
                    });
                }
            }
          }
          

          Benutzung auf eigene Gefahr.
          Support kann ich nur eingeschränkt bieten.
          Über Feedback würde ich mich freuen.

          View

          Als kostenlose Zugabe eine View für die Vis :-)
          Kaffeemaschine Vis.gif

          Voraussetzung

          • Adapter Material Design Widgets
            Für mich das flexibelste und beste Material Widget.
          • Vis 1
            Leider findet sich niemand, der die Material Design Widgets in Vis 2 anpasst. Das ist sehr schade. Für mich ist das unverzichtbar, deshalb muss ich bei Vis 1 bleiben.

          View CardHaushaltEGKücheKaffee.json:
          CardHaushaltEGKücheKaffee.json

          • Edit 14.12.2024
            Neue Version 1.1
            Vis View korrigiert und neue Gif-Animation.
          • Edit 24.12.2024
            Neue Version 1.2
            ack=false für Adapter-Datenpunkte.
          • Edit 17.11.2025
            Version 1.3
            Verbindungen in den Status
            Version 1.4
            Pflegestatus maintenance-speak mit Event erweitert: "DeviceDescalingBlockage": ["Die Kaffeemaschine ist gesperrt. Bitte entkalken!"],
            Die Event-Statustexte geändert und erweitert.
            Vis erweitert Pflegestatus „Kaffeemaschine gesperrt“ und „Entkalken überfällig“.
            Das Gif zur Dokumentation wurde nicht angepasst.
          FabioF Offline
          FabioF Offline
          Fabio
          schrieb am zuletzt editiert von
          #5

          @bongo super und dann ohne Cloud ;-) das schau ich mir auch noch an.
          Vielen Dank dir.

          Herzliche Grüße
          Fabio

          Iobroker:

          • Für mich persöhnlich, gibt es nichts besseres, ich liebe es.

          • Das hat unser Smarthome erst zu Smarthome gemacht.

          • Du wächst mit ioBroker und ioBroker wächst mit dir.

          • Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

          1 Antwort Letzte Antwort
          1
          • B Offline
            B Offline
            Bongo
            schrieb am zuletzt editiert von Bongo
            #6

            Ich habe noch ein paar Änderungen gemacht:

            • Ein kleiner Bugfix.
            • Ein neuer Datenpunkt maintenance. Ich benutze das in meinem Sprachbefehl "Status Haus", wo geöffnete Fenster, schwache Batterien usw. ausgegeben werden. Wenn maintenance=true ist eine Pflege der Kaffeemaschine nötig und der Text in maintenance-speak wird in der Sprachausgabe mit ausgegeben.
            • Statusmeldungen etwas angepasst.

            Gruß
            Bongo

            Script - Die sprechende Kaffeemaschine – Home Connect
            Script - JUDO Wasserenthärtung - Connectivity-Modul API

            1 Antwort Letzte Antwort
            1
            • B Bongo

              Vielleicht ist das Programm für den Einen oder Anderen hilfreich. Deshalb möchte ich es der Community zur Verfügung stellen.

              Ziel - Was kann das Programm?

              • Kaffeemaschine über Sprachassistenten ein- und ausschalten.
              • Status und Hinweise der Kaffeemaschine soll über einen Sprachassistenten ausgegeben werden.
              • Wechselnde Sprachausgaben für bestimmte Statusmeldungen.
              • Favoriten (Profil) der Kaffeespezialitäten (Kaffee Crema, Cappuccino, …) mit unterschiedlichen Parametern (Kaffeemenge, Wassertemperatur, …) erstellen.
              • Kaffeefavoriten per Sprachassistent ausgeben.
              • Pflegestatus (Entkalken, Reinigen, Wasserfilter wechseln) bereitstellen für Ausgabe mit Sprachassistenten oder VIS.

              Vorraussetzung

              • Eine Home Connect kompatible Kaffeemaschine.
                Getestet wurde das Script mit der Kaffeemaschine Siemens EQ.9 plus connect s500. Vermutlich funktioniert es auch mit ähnlichen Kaffeemaschinen von Siemens oder vielleicht auch mit Kaffeemaschinen von anderen Herstellern. Das wurde aber nicht getestet. Wenn ihr das Script benutzt, bitte um ein Feedback mit welcher Kaffeemaschine.
              • Adapter cloudless-homeconnect
                Der Adapter ist (noch) nicht im ioBroker Repository. Deshalb muss er über die Katze installiert werden.
                https://github.com/eifel-tech/ioBroker.cloudless-homeconnect
                Eine Instanz wird mit dem + am Adapter zugefügt.
                Der Adapter steuert die Kaffeemaschine ohne Cloud wie es zum Beispiel für die Home Connect APP notwendig ist. Nur beim ersten Start der Instanz wird eine Konfiguration aus der Cloud geladen. Deshalb ist eine Anmeldung an der Home Connect Cloud nötig.
              • Adapter iot
                Für Geräte-Erstellung in Alexa.
                Nach dem ersten Start des Scripts oder nach Änderung der Favoriten können über Alexa die neuen Geräte gesucht werden.
              • Adapter alexa2
                Für Sprachbefehle und Sprachausgabe.
                Tipp: Wenn man für den Sprachbefehl „Alexa, Erichs Kaffee ein“ unschick findet, kann man eine Routine „Erichs Kaffee“ erstellen, was das entsprechende „Gerät“ einschaltet.
              • Einstellung in der Javascript Instanz:
                Kommando "setObject" erlauben - muss aktiviert sein.

              Bedienung und Konfiguration

              • Vor dem ersten Start bitte die Voraussetzungen prüfen.
              • Im Programm im Abschnitt Settings die Variablen der Kanäle und Datenpunkte richtig setzen.
                ** In myConfig eventuell den Smartnamen nach eigenen Vorlieben ändern.
                ** In myProfile die Favoriten der Kaffeespezialitäten definieren.
                ** In myPowerState die Texte für Kaffeemaschine Ein/Aus definieren.
                ** In myStatus die Texte für die Statusmeldungen anpassen.
              • Programm starten.
              • Nach dem Start unter 0_userdata.0.Home-Connect.Kaffeemaschine.Profile die Kaffeespezialität konfigurieren.

              Bekannte Probleme

              • Betrifft Datenpunkt DisplayName für eine gespeicherte Kaffeespezialität
                Ich vermute, dass dieser Wert im Display der Kaffeemaschine erscheinen soll. Tut es aber bei meiner Kaffeemaschine nicht. Eventuell könnte es bei einem anderen Model angezeigt werden.

              Script Home-Connect-Kaffeemaschine.js:

              //
              // Home-Connect-Kaffeemaschine.js
              //
              // 09.10.2024 Version 1.0
              // Initialversion
              //
              // 23.11.2024 Version 1.1
              // Datenpunkt ob Pflege notwendig.
              // Text für Pflegestatus angepasst.
              //
              // 24.12.2024 Version 1.2
              // ack=false für Adapter-Datenpunkte
              //
              // 06.01.2025 Version 1.3
              // Verbindungen in den Status
              //
              // 17.11.2025 Version 1.4
              // Pflegestatus maintenance-speak mit Event erweitert: "DeviceDescalingBlockage": ["Die Kaffeemaschine ist gesperrt. Bitte entkalken!"],
              // Die Event-Statustexte geändert und erweitert.
              //  
              //--------------------------- Settings ------------------------
              const hcInstanz =     "cloudless-homeconnect.0";																														
              const hcDevice =      hcInstanz+".SIEMENS-TI9558X1DE-xxxxxxxxxxxx";    // Kanal für Kaffemaschine im cloudless-homeconnect
              const echoSpeak =     "alexa2.0.Echo-Devices.xxxxxxxxxxxxxxxx.Commands.speak";      // speak-Datenpunkt des Echo-Device für die Sprachausgabe im alexa2
              const dpUserdata =    "0_userdata.0.Home-Connect.Kaffeemaschine";                   // Namespace im Userdata
              //
              // Datenpunkte im 0_userdata
              //
              const myConfig = {
                "row": [
                  {
                    "dp": "status-speak",                         // Datenpunkt für Statusmeldungen
                    "name": "Displaymeldung für Sprachassistent",
                    "read": true, "write": true,
                    "type": "string", "role": "value",
                    "value": "", "unit": "",
                    "smartName": ""
                  },
                  {
                    "dp": "maintenance",                          // Datenpunkt ob Pflege notwendig - Version 1.1
                    "name": "Pflege notwendig?",
                    "read": true, "write": false,
                    "type": "boolean", "role": "switch",
                    "value": false, "unit": "",
                    "smartName": ""
                  },
                  {
                    "dp": "maintenance-speak",                    // Datenpunkt für Pflegeanfrage
                    "name": "Status der Kaffeemaschine",
                    "read": true, "write": true,
                    "type": "string", "role": "value",
                    "value": "", "unit": "",
                    "smartName": ""
                  },
                  {
                    "dp": "kaffeemaschine",                       // Datenpunkt für Ein/Aus
                    "name": "Kaffemaschine Ein/Aus",
                    "read": true, "write": true,
                    "type": "boolean", "role": "switch",
                    "value": false, "unit": "",
                    "smartName": { de: "Kaffeemaschine, Kaffee" , // Smartname für iot zur Übergabe an Alexa
                                      smartType: "SWITCH"}
                  }
                ]
              }
              //
              // Datenpunkte für Profile (Favoriten) im 0_userdata
              //
              const myProfile = {
                  "row": [
                      {
                          "profile": "Erich1",                    // beliebiger Favoritenname
                          "DisplayName": "Erichs Kaffee Crema",
                          "Program": "Beverage_Coffee",           // Kaffeespezialität aus cloudless-homeconnect.0.SIEMENS-TI9558X1DE-68A40E7DD334.Program
                          "smartName": { de: "Erichs Kaffee",     // Smartname für iot zur Übergabe an Alexa
                                          smartType: "SWITCH" },
                      },
                      {
                          "profile": "Erich2",
                          "DisplayName": "Erichs Cappuccino",
                          "Program": "Beverage_Cappuccino",
                          "smartName": { de: "Erichs Cappuccino",
                                          smartType: "SWITCH" },
                      },
                      {
                          "profile": "Sonja1",
                          "DisplayName": "Sonjas Kaffee Crema",
                          "Program": "Beverage_Coffee",
                          "smartName": { de: "Sonjas Kaffee",
                                          smartType: "SWITCH" },
                      },
                      {
                          "profile": "Sonja2",
                          "DisplayName": "Sonjas großer Kaffee Crema",
                          "Program": "Beverage_Coffee",
                          "smartName": { de: "Sonjas großer Kaffee",
                                          smartType: "SWITCH" },
                      }
                  ]
              }
              //
              // Texte zum Anpassen für Ein/Aus
              // Texte im Array mit Komma getrennt werden zufällig wiedergegeben.
              //
              const myPowerState ={
                  "2": ["Is <emphasis>schowieder</emphasis> Kaffeezeit!", "Is schowieder Kaffee!"],   // On
                  "3": ["Pfiat di.","Servus.","An scheener Kaffee!"],                                             // Standby
              };
              //
              // Texte zum Anpassen der Statusmeldungen. Mögliche Status für andere Maschinen
              // zu finden unter dem Datenpunkt deiner Kaffeemaschine:
              // cloudless-homeconnect.0.SIEMENS-TI9558X1DE-xxxxxxxx.Event
              // Texte im Array mit Komma getrennt werden zufällig wiedergegeben.
              //
              const myStatus = {
                  "AdjustGrindSetting": [""],
                  "BeanContainerEmpty": ["Bohnenbehälter ist leer. Bitte auffüllen."],
                  "BrewingUnitIsMissing": [""],
                  "CallHotline": [""],
                  "CleanBrewingUnit": ["Bitte Brüheinheit reinigen und einfetten."],
                  "CleanFillWaterTank": ["Bitte Wassertank gründlich spülen, gegebenenfalls Filter wieder einsetzen und Wasser in Tank füllen und einsetzen."],
                  "CleanMilkTank": ["Bitte Milchbehälter reinigen."],
                  "CloseDoor": ["Bitte Türe schließen."],
                  "CoffeeOutletMissing": [""],
                  "CustomerServiceRequest": [""],
                  "DeactivatePlaylist": [""],
                  "DeviceDescalingBlockage": ["Die Kaffeemaschine ist gesperrt. Bitte entkalken!"],
                  "DeviceDescalingOverdue": ["Entkalken der Kaffeemaschine ist überfällig! Die Kaffeemaschine wird demnächst gesperrt."],
                  "DeviceIsToCold4C": [""],
                  "DeviceShouldBeCalcNCleaned": ["Bitte Kaffemaschine entkalken und reinigen."],
                  "DeviceShouldBeCleaned": ["Bitte Kaffeemaschine reinigen."],
                  "DeviceShouldBeDescaled": ["Bitte Kaffeemaschine entkalken."],
                  "DripTrayFull": ["Tropfschale ist voll. Bitte leeren."],
                  "DripTrayNotInserted": ["Bitte Tropfschale einsetzten."],
                  "EmptyDripTray": ["Bitte Tropfschalen leeren und wieder einsetzen."],
                  "EmptyDripTrayRemoveContainer": ["Bitte 1-Liter-Behälter entfernen, Tropfschalen leeren und wieder einsetzen."],
                  "EmptyMilkTank": ["Milchbehälter ist leer. Bitte auffüllen."],
                  "Enjoy": ["Genieße deinen Kaffee.","Möge Dein Kaffee stark und Dein Montag kurz sein.","Alles vor dem ersten Kaffee ist Notwehr.",
                  "Du könntest auf Kaffee verzichten. Aber du bist kein Aufgeber.","Guter Kaffee ist wie gute Musik – beides berührt die Seele.",
                  "Mit Kaffee und Humor kommt man allem Stress zuvor.","Es sprüht Dein Geist nur träge Funken, hast Du noch nicht Kaffee getrunken.",
                  "Ein guter Tag beginnt mit Kaffee und einem Lächeln.","Halte Kurs und trink Kaffee, dann wird das schon!","Wach zu werden und zu leben, beginnt mit Kaffee.",
                  "Jede Tasse Kaffee ist eine frische Chance.","Leben passiert, Kaffee hilft."],
                  "FillDescaler": ["Bitte 0,5 Liter warmes wasser und Entkalkungsmittel in den Wassertank geben und Wassertank wieder einsetzen."],
                  "InsertWaterFilter": ["Bitte neuen Wasserfilter einsetzen, Wassertank füllen und wieder einsetzen."],
                  "MilkContainerConnected": [""],
                  "MilkContainerRemoved": ["Hast du den Milchbeälter entfernt?"],
                  "MilkReminder": ["Ich erinnere dich, den Milchbehälter zu entfernen."],
                  "MilkStillOK": [""],
                  "MilkTubeRemoved": [""],
                  "NotEnoughPomaceCapacityForThisKindOfBeverage": [""],
                  "NotEnoughWaterForThisKindOfBeverage": ["Nicht genügend Wasser für dieses Getränk vorhanden. Bitte auffüllen."],
                  "PlaceContainerUnderOutlet": ["Bitte einen 1-Liter-Behälter unter dem Auslauf stellen und bestätigen."],
                  "PlaceEmptyGlassUnderOutlet": [""],
                  "PowerSupplyError": [""],
                  "PressOnOff": [""],
                  "ProgramFinished": ["Das Programm ist beendet. Du hast es geschafft."],
                  "RefillEmptyBeanContainer": ["Bitte Bohnenbehälter auffüllen."],
                  "RefillEmptyWaterTank": ["Bitte Wassertank auffüllen."],
                  "RefillRemovedMilkContainer": [""],
                  "RemoveContainerUnderOutlet": ["Bitte Behälter unter dem Auslass entfernen."],
                  "RemoveMilkContainer": ["Bitte Milchbehälter entfernen."],
                  "RemoveWaterFilter": ["Falls vorhanden, bitte Wasserfilter entfernen und bestätigen."],
                  "RestartAppliance": [""],
                  "ServiceProgramFinished": ["Das Programm ist erfolgreich beendet. Vielen Dank für die Bemühungen."],
                  "SoftwareUpdateAvailable": ["Ein Softwareupdate ist verfügbar."],
                  "SoftwareUpdateSuccessful": ["Das Softwareupdate ist installiert."],
                  "SpecialRinsing": ["Spülen ist notwendig."],
                  "SwitchOffPower30sekBackOn": [""],
                  "SystemHasRunDry": ["Das System ist trocken gefahren. Bitte Wasser nachfüllen oder Filter entfernen."],
                  "ThrowCleaningDiscInTheDrawer": ["Bitte gib eine Reinigungstablette in das Fach für Pulverkaffee und bestätige."],
                  "UnderOverVoltage": [""],
                  "WaterFilterShouldBeChanged": ["Der Wasserfilter muss gewechselt werden."],
                  "WaterTankEmpty": ["Der Wassertank ist leer. Bitte auffüllen."],
                  "WaterTankNearlyEmpty": ["Der Wassertank ist fast leer. Für das Spülen reicht es noch."],
                  "WaterTankNotInserted": ["Bitte Wassertank einsetzen."],
              }
              //--------------------------- Settings end ---------------------
              const hcEvent =       hcDevice+".Event";
              const hcProgram =     hcDevice+".Program";
              const hcStatus =      hcDevice+".Status";
              const hcPowerState =  hcDevice+".Setting.PowerState";
              const dpProfile =     dpUserdata+".Profile";
              const hcconnected =   hcDevice+".General.connected";
              const hcconnection =  hcInstanz+".info.connection";
              
              init();
              async function init() {
                  await createMyConfig(myConfig, dpUserdata);
                  await createMyProfile(myProfile, dpProfile);
                  await sleep(5 * 1000); // 5 Sekunden Pause
                  //
                  // Datenpunkt für Start der Kaffeeausgabe im Profile triggern
                  //
                  on({ id: [].concat(Array.prototype.slice.apply($(dpProfile + ".*.Start"))), change: 'any' }, async (dp) => {
                      if (getState(dp.id).val) {
                          // Wenn Start = true
                          var length = dp.id.split(".").length;
                          var program = dp.id.split(".")[length - 2]; // Programmordnername
                          var parameter = dp.id.split(".").pop();
                          var srcFolder = dp.id.replace("." + parameter, ""); // Programmordner ID
                          // Datenpunkte im Quellverzeichnis/Userdata scannen
                          $(srcFolder + ".*").each(function (id, i) {
                              //console.log(id);
                              var parameter = id.split(".").pop();
                              // Parameter übertragen
                              if (parameter != "Start") {
                                  var value = getState(id).val;
                                  var hcProgramID = hcProgram + "." + program + "." + parameter;
                                  setState(hcProgramID, value, false);
                              }
                          })
                          await sleep(1 * 1000); // 1 Sekunden Pause
                          var hcProgramID = hcProgram + "." + program + ".Start";
                          setState(hcProgramID, true, false);
                      }
                  });
                  //
                  // Datenpunkte für Event/Statusansagen triggern bei Änderung
                  //
                  const mySelector = $(hcEvent + ".*");
                  mySelector.on(async function (dp) { // triggert bei Wertänderung der Datenpunkte des Selectors
                      var event = dp.id.substring(hcEvent.length + 1,)
              
                      if (typeof myStatus[event] !== "undefined" && myStatus[event] != "") {
                          if (dp.state.val == 1) {
                              var text = await randomText(myStatus[event]);
                              setMyState(dpUserdata + "." + "status-speak", text);
                          }
                      } else {
                          console.log("Keine Übersetzung für: " + event);
                      }
                  });
                  //
              					  
              	  
                  // Pflege Status triggern
                  //                                // Version 1.4
                  const maintenance = [hcEvent + "DeviceDescalingBlockage" + hcEvent + ".DeviceDescalingOverdue", hcEvent + ".DeviceShouldBeCleaned",
                              hcEvent + ".DeviceShouldBeCalcNCleaned", hcEvent + ".WaterFilterShouldBeChanged",
                              hcEvent + ".DeviceShouldBeDescaled",
                              hcStatus + ".BeverageCountdownDescaling",hcStatus + ".BeverageCountdownCleaning",
                              hcStatus + ".BeverageCountdownCalcNClean",hcStatus + ".BeverageCountdownWaterfilter",
                              hcconnected, hcconnection];
                  on({ id: maintenance, change: "ne" }, async (dp) => { // triggert bei Änderung der Datenpunkte
                      var maintenanceSpeak = "";
                      var connectSpeak = "";
                      let text="";
                      let maintenance = false;    // Version 1.1
                      // Verbindung prüfen. Version 1.3
                      if (!getState(hcconnected).val){
                          connectSpeak = connectSpeak + "Keine Socketverbindung zur Kaffeemaschine. ";
                      }
                      if (!getState(hcconnection).val){
                          connectSpeak = connectSpeak + "Mit einem Gerät nicht verbunden. ";
                      }
                      // Plegestatus prüfen
                      if(getState(hcEvent + ".DeviceDescalingBlockage").val){  // Version 1.4
                          text = await randomText(myStatus["DeviceDescalingBlockage"]);
                          maintenanceSpeak = maintenanceSpeak + text+" ";
                          maintenance = true;     // Version 1.1
                      } else if (getState(hcEvent + ".DeviceDescalingOverdue").val){
                          text = await randomText(myStatus["DeviceDescalingOverdue"]);
                          maintenanceSpeak = maintenanceSpeak + text+" ";
                          maintenance = true;     // Version 1.1
                      } else if (getState(hcEvent + ".DeviceShouldBeCleaned").val){
                          text = await randomText(myStatus["DeviceShouldBeCleaned"]);
                          maintenanceSpeak = maintenanceSpeak + text+" ";
                          maintenance = true;     // Version 1.1
                      } else if (getState(hcEvent + ".DeviceShouldBeCalcNCleaned").val){
                          text = await randomText(myStatus["DeviceShouldBeCalcNCleaned"]);
                          maintenanceSpeak = maintenanceSpeak + text+" ";
                          maintenance = true;     // Version 1.1
                      } else if (getState(hcEvent + ".DeviceShouldBeDescaled").val){
                          text = await randomText(myStatus["DeviceShouldBeDescaled"]);
                          maintenanceSpeak = maintenanceSpeak + text+" ";
                          maintenance = true;     // Version 1.1
                      } else if (getState(hcEvent + ".WaterFilterShouldBeChanged").val){
                          text = await randomText(myStatus["WaterFilterShouldBeChanged"]);
                          maintenanceSpeak = maintenanceSpeak + text+" ";
                          maintenance = true;     // Version 1.1
                      } else {
                          maintenanceSpeak = "Keine Pflegemaßnahmen für die Kaffeemaschine notwendig.";
                      }
                      // Pflege notwendig     Version 1.1
                      setMyState(dpUserdata + "." + "maintenance", maintenance);
                      // Calc’nClean
                      let dummy = getState(hcStatus + ".BeverageCountdownCalcNClean").val;
                      let countCups = dummy;
                      let nextMaitenance = "";
                      if (dummy > 0){                         // Version 1.1
                          countCups = dummy;
                          nextMaitenance = "Calc’nClean notwendig in "+countCups+" Tassen.";
                      }
                      // Entkalken
                      dummy = getState(hcStatus + ".BeverageCountdownDescaling").val;
                      if (dummy < countCups && dummy > 0){    // Version 1.1
                          countCups = dummy;
                          nextMaitenance = "Entkalken notwendig in "+countCups+" Tassen.";
                      }
                      // Reinigen
                      dummy = getState(hcStatus + ".BeverageCountdownCleaning").val;
                      if (dummy < countCups && dummy > 0){    // Version 1.1
                          countCups = dummy;
                          nextMaitenance = "Reinigen notwendig in "+countCups+" Tassen.";
                      }
                      // Wasserfilter
                      dummy = getState(hcStatus + ".BeverageCountdownWaterfilter").val;
                      if (dummy < countCups && dummy > 0){    // Version 1.1
                          countCups = dummy;
                          nextMaitenance = "Wasserfilter wechseln in "+countCups+" Tassen.";
                      }
                      maintenanceSpeak = connectSpeak+maintenanceSpeak + " " +nextMaitenance;
                      setMyState(dpUserdata + "." + "maintenance-speak", maintenanceSpeak);
                  });
                  //
                  // PowerState triggern
                  //
                  on({ id: hcPowerState, change: "ne" }, async (dp) => { // triggert bei Änderung der Datenpunkte
                      if (typeof myPowerState[dp.state.val] !== "undefined" && myPowerState[dp.state.val] != "") {
                          var text = await randomText(myPowerState[dp.state.val]);
                          setState(echoSpeak, text, false);
                      }
                  });
                  //
                  // Datenpunkt für Kaffeemaschine triggern bei Aktualisierung
                  //
                  on({ id: dpUserdata + ".kaffeemaschine", change: "any" }, async (dp) => { // triggert bei Aktualisierung der Datenpunkte
                      if (dp.state.val) {
                          setState(hcPowerState, 2, false);   // On
                      } else {
                          setState(hcPowerState, 3, false);   // Standby
                      }
                  });
                  //
                  // Datenpunkt für Speak triggern bei Aktualisierung
                  //
                  on({ id: dpUserdata + ".status-speak", change: "any" }, async (dp) => { // triggert bei Aktualisierung der Datenpunkte
                      setState(echoSpeak, dp.state.val, false);
                  });
              }
              /**
               * Objekte erzeugen
               * @param {Object} MyConfig Json-Objekt
               * @param {String} dpUserdata Workspace
               */
              async function createMyConfig(MyConfig, dpUserdata) {
                // Config scannen
                for (let i = 0; i < MyConfig.row.length; i++) {
                  //console.log('Erzeuge: '+myConfig.row[i].dp);
                  await createMyState(dpUserdata+"."+myConfig.row[i].dp, myConfig.row[i].name, myConfig.row[i].name, myConfig.row[i].read, myConfig.row[i].write, myConfig.row[i].type, myConfig.row[i].role, myConfig.row[i].unit, myConfig.row[i].smartName, myConfig.row[i].value);
              
                }
              }
              /**
               * Profile Objekte erzeugen
               * @param {Object} myProfile Json-Objekt
               * @param {String} dpProfile Workspace
               */
              async function createMyProfile(myProfile, dpProfile) {
                // Profile scannen
                for (let i = 0; i < myProfile.row.length; i++) {
                  //console.log('Erzeuge Profil: '+myProfile.row[i].profile);
                  var srcid = hcProgram+"."+myProfile.row[i].Program;
                  var dstid = dpProfile+"."+myProfile.row[i].profile+"."+myProfile.row[i].Program;
                  // Datenpunkte im Quellverzeichnis scannen
                  $(srcid+".*").each(async function(id) { 
                      //console.log("id: "+id);
                      var obj = getObject(id);
                      if(obj && obj.type === 'state') {
                          var lastElement = id.split(".").pop();  // letztes Element des Datenpunktes
                          setObject(dstid+"."+lastElement, obj);
                          if ( !existsState(dstid+"."+lastElement)) {
                              if (lastElement == "Start"){
                                  obj.common.smartName = myProfile.row[i].smartName;
                              }
                              setTimeout(function() {
                                  setState(dstid+"."+lastElement, obj.common.def,true);
                              }, 200);
                          }
                      };
                  })
                  await sleep(1*1000);
              //    console.log(dstid+".DisplayName: ->"+myProfile.row[i].DisplayName);
                  setState(dstid+".DisplayName", myProfile.row[i].DisplayName,true);
                }
              }
              /**
               * Zufälliger Text
               * @param {Array} text - Array aus mehreren Texten
               * @returns {String} return - gibt einen zufälligen Text aus dem Array zurück
               */
              async function randomText(text) {
                  var length = text.length;
                  var min = 0;
                  var max = length-1;
                  var zahl = Math.floor(Math.random() * (max - min + 1)) + min;
                  return text[zahl];
              }
              /**
               * Objekt setzen
               * @param {String} state Objektpfad
               * @param {any} value Inhalt  
               */
              async function setMyState(state, value) {
                setState(state, value, true);
              }
              /**
               * Objekt erzeugen
               * @param {String} state Objektpfad
               * @param {String} name Name des Objektes
               * @param {String} desc Beschreibung des Objektes
               * @param {String} type Type des Objektes string,number
               * @param {Boolean} read Leserechte des Objektes
               * @param {Boolean} write Schreibrechte des Objektes
               * @param {String} role Rolle des Objektes button,...
               * @param {String} unit Rolle des Objektes button,...
               * @param {Object} smartName Smartname für Alexa
               * @param {any} value Inhalt  
               */
              async function createMyState(state, name, desc, read, write, type, role, unit, smartName, value) {
                if (type == "number") {
                    //value = Number(value);
                    await createStateAsync(state, 0, {
                        name: name,
                        desc: desc,
                        read: read,
                        write: write,
                        type: type,
                        role: role,
                        unit: unit
                    });
                } else {
                    if (smartName == "") {
                        // ohne Smartnamen
                        await createStateAsync(state, value, {
                            name: name,
                            desc: desc,
                            read: read,
                            write: write,
                            type: type,
                            role: role,
                            unit: unit
                        });
                    } else {
                        await createStateAsync(state, value, {
                            // mit Smartnamen
                            name: name,
                            desc: desc,
                            read: read,
                            write: write,
                            type: type,
                            role: role,
                            unit: unit,
                            smartName: smartName
                        });
                    }
                }
              }
              

              Benutzung auf eigene Gefahr.
              Support kann ich nur eingeschränkt bieten.
              Über Feedback würde ich mich freuen.

              View

              Als kostenlose Zugabe eine View für die Vis :-)
              Kaffeemaschine Vis.gif

              Voraussetzung

              • Adapter Material Design Widgets
                Für mich das flexibelste und beste Material Widget.
              • Vis 1
                Leider findet sich niemand, der die Material Design Widgets in Vis 2 anpasst. Das ist sehr schade. Für mich ist das unverzichtbar, deshalb muss ich bei Vis 1 bleiben.

              View CardHaushaltEGKücheKaffee.json:
              CardHaushaltEGKücheKaffee.json

              • Edit 14.12.2024
                Neue Version 1.1
                Vis View korrigiert und neue Gif-Animation.
              • Edit 24.12.2024
                Neue Version 1.2
                ack=false für Adapter-Datenpunkte.
              • Edit 17.11.2025
                Version 1.3
                Verbindungen in den Status
                Version 1.4
                Pflegestatus maintenance-speak mit Event erweitert: "DeviceDescalingBlockage": ["Die Kaffeemaschine ist gesperrt. Bitte entkalken!"],
                Die Event-Statustexte geändert und erweitert.
                Vis erweitert Pflegestatus „Kaffeemaschine gesperrt“ und „Entkalken überfällig“.
                Das Gif zur Dokumentation wurde nicht angepasst.
              sigi234S Online
              sigi234S Online
              sigi234
              Forum Testing Most Active
              schrieb am zuletzt editiert von
              #7

              @bongo
              Sag mal geht das Skript auch für Geschirrspüler, bzw kannst du das anpassen?

              Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
              Immer Daten sichern!

              B 1 Antwort Letzte Antwort
              0
              • sigi234S sigi234

                @bongo
                Sag mal geht das Skript auch für Geschirrspüler, bzw kannst du das anpassen?

                B Offline
                B Offline
                Bongo
                schrieb am zuletzt editiert von
                #8

                @sigi234
                Ich habe noch einen Geschirrspüler und einem Backofen von Siemens über Home-Connect.
                Da wird das Programm für die Kaffeemaschine sicher nicht funktionieren. Aber ich plane auch für diese Geräte ein Script zu machen. Wird aber noch dauern :-)

                Gruß
                Bongo

                Script - Die sprechende Kaffeemaschine – Home Connect
                Script - JUDO Wasserenthärtung - Connectivity-Modul API

                sigi234S 1 Antwort Letzte Antwort
                2
                • B Offline
                  B Offline
                  Bongo
                  schrieb am zuletzt editiert von
                  #9

                  Beim Entkalken hab ich die Events getraced und die entsprechenden Sprachtexte nochmal geändert bzw. erweitert. Und noch ein paar kleinigkeiten:

                  • Version 1.3
                    Verbindungen in den Status
                  • Version 1.4
                    Pflegestatus maintenance-speak mit Event erweitert: "DeviceDescalingBlockage": ["Die Kaffeemaschine ist gesperrt. Bitte entkalken!"],
                    Die Event-Statustexte geändert und erweitert.
                    Vis erweitert Pflegestatus „Kaffeemaschine gesperrt“ und „Entkalken überfällig“.
                    Das Gif zur Dokumentation wurde nicht angepasst.

                  Gruß
                  Bongo

                  Script - Die sprechende Kaffeemaschine – Home Connect
                  Script - JUDO Wasserenthärtung - Connectivity-Modul API

                  1 Antwort Letzte Antwort
                  1
                  • B Bongo

                    @sigi234
                    Ich habe noch einen Geschirrspüler und einem Backofen von Siemens über Home-Connect.
                    Da wird das Programm für die Kaffeemaschine sicher nicht funktionieren. Aber ich plane auch für diese Geräte ein Script zu machen. Wird aber noch dauern :-)

                    sigi234S Online
                    sigi234S Online
                    sigi234
                    Forum Testing Most Active
                    schrieb am zuletzt editiert von
                    #10

                    @Bongo said in [Script] Die sprechende Kaffeemaschine – Home Connect:

                    @sigi234
                    Ich habe noch einen Geschirrspüler und einem Backofen von Siemens über Home-Connect.
                    Da wird das Programm für die Kaffeemaschine sicher nicht funktionieren. Aber ich plane auch für diese Geräte ein Script zu machen. Wird aber noch dauern :-)

                    Hallo, hast du schon ein Skript für den GS?

                    Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                    Immer Daten sichern!

                    B 1 Antwort Letzte Antwort
                    0
                    • sigi234S sigi234

                      @Bongo said in [Script] Die sprechende Kaffeemaschine – Home Connect:

                      @sigi234
                      Ich habe noch einen Geschirrspüler und einem Backofen von Siemens über Home-Connect.
                      Da wird das Programm für die Kaffeemaschine sicher nicht funktionieren. Aber ich plane auch für diese Geräte ein Script zu machen. Wird aber noch dauern :-)

                      Hallo, hast du schon ein Skript für den GS?

                      B Offline
                      B Offline
                      Bongo
                      schrieb am zuletzt editiert von
                      #11

                      @sigi234 said in [Script] Die sprechende Kaffeemaschine – Home Connect:

                      @Bongo said in [Script] Die sprechende Kaffeemaschine – Home Connect:

                      @sigi234
                      Ich habe noch einen Geschirrspüler und einem Backofen von Siemens über Home-Connect.
                      Da wird das Programm für die Kaffeemaschine sicher nicht funktionieren. Aber ich plane auch für diese Geräte ein Script zu machen. Wird aber noch dauern :-)

                      Hallo, hast du schon ein Skript für den GS?

                      Nein, dazu bin ich noch nicht gekommen.

                      Gruß
                      Bongo

                      Script - Die sprechende Kaffeemaschine – Home Connect
                      Script - JUDO Wasserenthärtung - Connectivity-Modul API

                      1 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      656

                      Online

                      32.4k

                      Benutzer

                      81.4k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe