Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. DerT

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    D
    • Profile
    • Following 0
    • Followers 0
    • Topics 13
    • Posts 62
    • Best 4
    • Groups 2

    DerT

    @DerT

    Forum Testing

    7
    Reputation
    36
    Profile views
    62
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    DerT Follow
    Forum Testing Starter

    Best posts made by DerT

    • RE: Rhasspy Offline Sprachsteuerung

      Wie bereits angekündigt stelle ich nun mal meine Lösung vor und habe noch ein Paar Fragen wie Ihr gewisse Dinge gelöst habt.

      Die Übergabe der JSON an ioBroker erfolgt nun doch wieder über MQTT.
      (Nachdem ich meinen ioBroker komplett neu installiert habe gab es keinen Fehler mehr 😬 )

      Das Skript kann aktuell die folgenden Aufgaben übernehmen

      • Objekt in einem bestimmten Raum schalten
      • Objekt ohne den Raum schalten.
        In diesem Fall wird zuerst im Raum in dem der rhasspy steht nach dem Objekt gesucht
        Falls im Raum kein Objekt mit diesem Namen gefunden wurde wird global danach gesucht
        Wenn es global nur ein Objekt gibt wird dieses geschalten.

      sentences.ini

      [changeLightRoom]
      ([schalte] | [mach]) ([das] | [die]) ($objects){objectName} [im] ($rooms){room} ($states){state}
      
      [changeState]
      ([schalte] | [mach]) ([das] | [die] | [den]) ($objects){objectName} ($states){state}
      

      sentences.ini

      [changeLightRoom]
      ([schalte] | [mach]) ([das] | [die]) ($objects){objectName} [im] ($rooms){room} ($states){state}
      
      [changeState]
      ([schalte] | [mach]) ([das] | [die] | [den]) ($objects){objectName} ($states){state}
      

      slot - objects

      Highboard 
      Stehlampe
      Bett
      Herd
      Licht
      Spiegel
      Wohnwand
      Indirekte Licht
      Spüle
      Schrank
      blablabla
      

      slot - rooms

      Schlafzimmer
      Küche
      Klo
      Büro
      Esszimmer
      Bad
      Wohnzimmer
      

      slot - states

      ein
      an
      aus
      

      Durch diese Definition sind alle Daten die später vom Skript verarbeitet werden in Slots.

      Das Herzstück des ganzen ist das Javascript.
      Der Code ist kommentiert, hoffe meine Kommentare sind nicht zu verwirrend.

      //##########################################################################
      // Rhasspy-intents via MQTT empfangen und entspr.Datenpunkte setzen/schalten
      //##########################################################################
      let http = require('http');
      
      /*
      Definition meiner Räume und der jeweiligen Objekte darin
      Die Struktur sieht dabei wie folgt aus.
      Im Intent der übermittelt wird sind sowohl der Raum Name als auch der Objektname als Slot enthalten.
      Beide werden dann vom Skript verwendet um den korrekten Datenpunkt herauszufinden.
      */
      const rooms = {
          "Büro": {
              "Licht": "sonoff.0.ShellyV1_13.POWER",
          },
          "Wohnzimmer": {
              "Licht": "sonoff.0.ShellyV1_06.POWER",
              "Stehlampe": "OwnDevices.0.433mhzPlugs.10011.PlugC",
              "Wohnwand": "OwnDevices.0.433mhzPlugs.10011.PlugB",
              "Rollo": ""
          },
          "Bad": {
              "Licht": "sonoff.0.ShellyV1_05.POWER",
              "Spiegel": "sonoff.0.ShellyV1_11.POWER",
              "Indirekte Licht": "sonoff.0.SonoffBasic_02.POWER"
          },
          "Esszimmer": {
              "Licht": "sonoff.0.ShellyV1_03.POWER",
              "Highboard": "sonoff.0.SonoffS26_3.POWER"
          },
          "Küche": {
              "Licht": "hm-rpc.1.000858A9960E7A.4.STATE",
              "Spüle": "sonoff.0.ShellyV1_02.POWER",
              "Herd": "sonoff.0.ShellyV1_01.POWER"
          },
          "Schlafzimmer": {
              "Licht": "sonoff.0.ShellyV1_09.POWER",
              "Schrank": "sonoff.0.ShellyV1_10.POWER",
              "Bett": "sonoff.0.SonoffBasic_01.POWER",
              "Rollo": ""
          },
          "Klo": {
              "Licht": "sonoff.0.ShellyV1_04.POWER"
          }
      }
      
      //In diesem  json werden nötige Informationen zu allen rhasspys abgelget.
      const rhasspySites = {
          "testpi": {
              room: "Büro",
              host: "testpi.angl.loc",
              httpPort: "12101"
          }
      }
      
      
      //************************ Functions *********************
      //Mit dieser Funktion werden Strings in einen Boolschen Wert umgewandelt
      //Wenn der Wert in 'trueValues' enthalten ist wird 'true' zurückgegeben. 
      //Wenn nicht, wird 'false' zurückgegeben
      function convertStateToBool(state) {
          const trueValues = ['ein', 'an'];
          return trueValues.includes(state);
      }
      
      //Reukursives durchsuchen eines JSON Objektes
      //© https://gist.github.com/shakhal/3cf5402fc61484d58c8d
      function findValues(obj, key) {
          return findValuesHelper(obj, key, []);
      }
      
      //Reukursives durchsuchen eines JSON Objektes
      //© https://gist.github.com/shakhal/3cf5402fc61484d58c8d
      function findValuesHelper(obj, key, list) {
          if (!obj) return list;
          if (obj instanceof Array) {
              for (var i in obj) {
                  list = list.concat(findValuesHelper(obj[i], key, []));
              }
              return list;
          }
          if (obj[key]) list.push(obj[key]);
      
          if ((typeof obj == "object") && (obj !== null)) {
              var children = Object.keys(obj);
              if (children.length > 0) {
                  for (i = 0; i < children.length; i++) {
                      list = list.concat(findValuesHelper(obj[children[i]], key, []));
                  }
              }
          }
          return list;
      }
      
      //Generiert ein JSON-Objekt mit allen wichtigen Informationen für die Funktionen im Skript.
      //Dies dient vor allem dazu den späteren Code lesbarer zu machen.
      //Beisipel Ergebnis
      /*
      {
         "slots":{
            "objectName":"Stehlampe",
            "state":"aus"
         },
         "intentName":"changeState",
         "siteId":"testpi"
      }
      */
      function extractIntentData(message) {
          const parsedMessage = JSON.parse(message);
          let extractedJSON = {};
          extractedJSON.slots = {};
          extractedJSON.intentName = parsedMessage.intent.intentName;
          extractedJSON.siteId = parsedMessage.siteId;
      
          parsedMessage.slots.forEach(slot => {
              extractedJSON.slots[slot.slotName] = slot.value.value;
          });
      
          return extractedJSON;
      }
      
      //Damit kann jeder Rhasspy sprechen
      function speakRhasspy(text, rhasspySiteId) {
          console.log(rhasspySiteId);
          const rhasspy = rhasspySites[rhasspySiteId];
          const options = {
              host: rhasspy.host,
              port: rhasspy.httpPort,
              path: "/api/text-to-speech",
              method: 'POST',
              headers: {
                  'User-Agent': 'ioBroker',
                  'Content-Type': 'text/plain',
              }
          }
      
          let req = http.request(options);
          req.on('error', function (e) {
              console.error('ERROR: ' + e.message, "warn");
          });
          req.write(text);
          req.end();
      }
      
      
      //In dieser Variablen werden alle Funktionen gepsiechert die später aufgerufen werden.
      //Dies dient dazu den anfallenden Code zu minimieren.
      //Die Funktionen haben immer den selben Namen wie die Intents in rhasspy und werden auch darauf basierend aufgerufen.
      const callFunctions = {
          //Ändert den Wert eines ioBroker Datenpunktes in einem bestimmten Raum.
          changeLightRoom: function (json) {
              const objectName = json.slots.objectName;
              const roomName = json.slots.room;
              const state = convertStateToBool(json.slots.state);
      
      
              //Nur wenn alle 3 Werte vorhanden sind wird der Zustand geändert
              if (typeof roomName != 'undefined' && typeof state != 'undefined' && typeof objectName != 'undefined') {
                  const room = rooms[roomName];
      
                  if (typeof room != 'undefined') {
                      const lightId = room[objectName];
                      if (typeof lightId != 'undefined') {
                          setState(lightId, state);
                      }
                      else {
                          speakRhasspy(`Ich konnte ${objectName} nicht finden`, json.siteId);
                          console.warn(`can not find object '${objectName}' in room '${roomName}'`);
                      }
                  }
                  else {
                      speakRhasspy(`Ich konnte den Raum ${roomName} nicht finden`, json.siteId);
                      console.warn(`can not find room '${roomName}' in list of rooms`);
                  }
      
              }
              else {
                  speakRhasspy(`Etwas ist schief gelaufen`, json.siteId);
                  console.warn(`rhasspy intent '${json.intentName}' from '${json.siteId}' slots not complete | room = '${roomName}' | state = '${state}' | objectName = '${objectName}'`);
              }
          },
          //Ändert des Wert eines ioBroker Datenpunktes auf Basis des Raumes in welchem der Rhasspy sich befindet.
          //Wenn in diesem Raum kein objekt mit diesem Name ist wird rekursiv in allen Räumen danach geuscht.
          //Wenn dann nur ein Objekt mit diesem Namen gefunden wird, wird dieses geschalten.
          changeState: function (json) {
              const objectName = json.slots.objectName;
              const state = convertStateToBool(json.slots.state);
              const site = rhasspySites[json.siteId];
              const room = rooms[site.room];
              let lightId = room[objectName];
      
              if (typeof lightId === 'undefined') {
                  //Prüfen ob es mehr als ein Objekt mit diesem Namen gibt
                  const objects = findValues(rooms, objectName);
      
                  if (objects.length === 1) {
                      lightId = objects[0];
                  }
                  else if (objects.length > 1) {
                      speakRhasspy(`Es gibt mehrere Objekte mit dem Namen ${objectName}`, json.siteId);
                      console.warn(`rhasspy intent '${json.intentName}' from '${json.siteId}' - more than one object found with name '${objectName}'`);
                  }
                  else {
                      speakRhasspy(`Ich konnte ${objectName} nicht finden`, json.siteId);
                      console.warn(`rhasspy intent '${json.intentName}' from '${json.siteId}' - no object found with name '${objectName}'`);
                  }
              }
      
              if (typeof lightId != 'undefined' && typeof state != 'undefined') {
                  setState(lightId, state);
              }
              else {
                  speakRhasspy(`Etwas ist schief gelaufen`, json.siteId);
                  console.warn(`rhasspy intent '${json.intentName}' from '${json.siteId}' slots not complete | lightId = '${lightId}' | state = '${state}'`);
              }
          }
      }
      //************************ Functions *********************
      
      //************************ Events ************************
      //Wird beim auslösen jedes Intents getriggert
      on({ id: /mqtt\.0\.hermes\.intent\..*/, change: "any" }, function (obj) {
          const extractedJSON = extractIntentData(obj.state.val);
          const intentName = extractedJSON.intentName;
          const callFunction = callFunctions[intentName];
      
          if (typeof callFunction != 'undefined') {
              callFunction(extractedJSON);
          }
          else {
              console.error(`Rhasspy: Funktion ist nicht definiert --> Fehler bei Intent ${intentName}`);
          }
      });
      //************************ Events ************************
      

      Würde mich freuen wenn Ihr mal eure Meinung dazu sagt 🙂

      Außerdem habe ich noch ein paar Fragen.

      1. Mit welchen Wakword System arbeitet Ihr? Ich bekomme Smowboy nicht zum laufen 😞
      2. Welches text-2-speach System nutzt ihr? Bei Espeak hört sich das total schlecht an und wirkt als ob es englisch ist.
      3. Habt Ihr Musikdienste wie Spotify und oder Radio eingebunden?

      Liebe Grüße und schöne Wochenende

      posted in Off Topic
      D
      DerT
    • RE: RolloMotor Smart Home

      Hi,

      ich habe das ganze mit normalen Rohrmotoren aus dem Baumarkt und einem Shelly 2.5 gelöst.

      Pro:

      • Der Rohrmotor ist egal und kann auch ausgetauscht werden
      • Es gibt trotzdem noch einen Wandschalter

      Contra:

      • Etwas mehr Aufwand

      Wenn du mehr dazu wissen willst, frag ruhig.

      Ps.
      Warum zwei Rohrmotoren und nicht einen der mehr Zugkraft hat?
      Ist deine Markise so schwer?

      Gruß
      Thomas

      posted in Hardware
      D
      DerT
    • RE: Rhasspy Offline Sprachsteuerung

      @LichtAn
      Bei mir ist es genauso.

      Habe einen Fehler aus GitHub aufegmacht.
      https://github.com/rhasspy/rhasspy/issues/86

      DerT94 created this issue in rhasspy/rhasspy

      closed snowboy dosen't work - timeout #86

      posted in Off Topic
      D
      DerT
    • RE: Rhasspy Offline Sprachsteuerung

      @Xsev @LichtAn
      Habe den Fehler mit snowboy gefunden.
      Wenn die Datei, welche in der profile.json angegeben wird nicht vorhanden ist, startet der snowboy Dienst nicht.
      Dann kommt der Fehler.
      Ich habe die profile.json angepasst und dort den Namen meiner Datei angegeben.
      Nach einem neustart des docker containers funktionierte alles einwandfrei.

      profile.json

      ...
          "wake": {
              "snowboy": {
                  "model": "computer.pmdl"
              },
              "system": "snowboy"
          }
      }
      ...
      
      posted in Off Topic
      D
      DerT

    Latest posts made by DerT

    • RE: SONOFF NSPanel mit Lovelace UI

      Hallo Zusammen,

      ich hab das ganze mal Testweise bei mir aufgebaut und eine Frage zu den Hardware Buttons.

      Irgendwie steig ich beim Beispiel nicht ganz durch..

      //-------EN: Start Settings for Hardware Button, if used in software (Rule2) --------------------------------------
          // DE: Konfiguration des linken Schalters des NSPanels
          // EN: Configuration of the left switch of the NSPanel
          button1: {
              // DE: Mögliche Werte wenn Rule2 definiert: 'page', 'toggle', 'set' - Wenn nicht definiert --> mode: null
              // EN: Possible values if Rule2 defined: 'page', 'toggle', 'set' - If not defined --> mode: null
              mode: 'page',
              // DE: Zielpage - Verwendet wenn mode = page
              // EN: Target page - Used if mode = page
              page: null,
              // DE: Zielentity - Verwendet wenn mode = set oder toggle
              // EN: Target entity - Used if mode = set or toggle
              entity: null,
              // DE: Zielwert - Verwendet wenn mode = set
              // EN: Target value - Used if mode = set
              setValue: null
          },
      
          // DE: Konfiguration des rechten Schalters des NSPanels
          // EN: Configuration of the right switch of the NSPanel
          button2: {
              mode: null,
              page: null,
              entity: null,
              setValue: null
          },
      //--------- DE: Ende - Einstellungen für Hardware Button, wenn Sie softwareseitig genutzt werden (Rule2) -------------
      
      

      Gibt es dazu noch irgendwo was im Wiki das ich nicht gefunden habe? Die Regel habe ich eingestellt.
      Konkret habe ich zwei Szenarien die ich gerne mal testen würde.

      1. Mit den Buttons durch die Menüs navigieren
      2. Temperatur an einem Thermostat reduzieren bzw. erhöhen.
      posted in Hardware
      D
      DerT
    • RE: Welches Wandthermostat für Fußbodenheizung

      @sborg Danke für das Feedback.

      Dann werde ich mir wohl mal ein NSPanel zum testen besorgen.
      Bietet ja noch ein paar mehr Vorteile als nur ein teures Thermostat zu sein 🙂

      posted in Hardware
      D
      DerT
    • RE: Der "ultimative" ioBroker Lovelace Leitfaden/Dokumentation

      Hi, ist die Version 1.3 noch aktuell?
      Habe in Thread zwar nichts neueres gefunden, wollte aber auf Nummer sicher gehen und nachfragen.

      posted in ioBroker Allgemein
      D
      DerT
    • Welches Wandthermostat für Fußbodenheizung

      Hallo zusammen,

      ich bin aktuell auf der Suche nach einem Wandthermostat für die Fußbodenheizung.
      Dabei möchte ich dieses nach Möglichkeit ohne über eine Cloud zu gehen in ioBroker einbinden.
      Aktuell sehe ich dafür keinen anderen Weg als ein Tuya Thermostat zu kaufen, hoffen es ist ein ESP drin und da Tasmota drauf zu flashen.

      Hat jemand eine "bessere" Idee? Ich hätte auch kein Problem damit nur eine Bedieneinheit an die Wand zu hängen und die gesamte Logik in ioBroker abzubilden.
      Allerdings finde ich dazu noch weniger als zum Thema Thermostat mit Tuya drin.

      Wie habt ihr das so bei euch realisiert?

      Gruß
      T

      posted in Hardware
      D
      DerT
    • RE: PiHole - Namensauflösung lokales Netz

      @thomas-braun
      Würde testweise alle Einträge aus PiHole entfernen, das conditional forwording raus nehmen und PiHole den DHCP Dienst übernehmen lassen.
      Je Nachdem wieviele Geräte du hast und musst du aber beim einstellen des Bereichs aufpassen.
      Deine FB vergibt aktuell Adressen von 192.168.178.20-192.168.178.200.
      Wenn du PiHole nun den selben Bereich verteilen lässt kann es in der Übergangsphase zu duplizierten IPs im Netz kommen.
      Am besten stellst du in PiHole einen Bereich von 192.168.178.201 - 192.168.178.250 ein. (Vorausgesetzt du hast keine statisch konfigurierten IPs in diesem Bereich.) Nach 11 Tagen kannst du den Bereich dann größer machen. Solltest du mehr wie 50 Geräte haben musst du den Bereich schon von Anfang an größer machen. Ich würde aber von hinten erweitern. Also zum Beispiel 192.168.178.180-192.168.178.250.

      @thomas-braun sagte in PiHole - Namensauflösung lokales Netz:

      Ich kapier es nicht:

      pi@mysterium:~ $ arp -a | grep -i Nuki
      nuki-bridge.fritz.box (192.168.178.35) at dc:91:bf:4b:03:20 [ether] on eth0
      Nuki-Bridge-1192B2C1.fritz.box (192.168.178.33) at 5c:cf:7f:5f:a9:b2 [ether] on eth0
      

      Ich hab nur eine nuki Bridge, in der FritzBox unter der 192.168.178.33 eingetragen.
      Wo kommt der alte Eintrag zur 192.168.178.35 her? Ich glaube da lag die mal.

      Ich hab gestern die letzten Labor-Version für meine FritzBox 6660 eingespielt, seither spinnt hier alles.

      In dem Fall würde ich erstmal das zurück bauen. Labor Versionen können immer für komische Phänomene sorgen.

      posted in Off Topic
      D
      DerT
    • RE: PiHole - Namensauflösung lokales Netz

      @thomas-braun
      Hi,

      wie sind die DHCP Einstellungen der FRITZ!Box?
      Wie wurde der DNS im Pi hole eingestellt?

      Gibt es einen Grund, dass du PiHole nicht auch DHCP machen lässt?

      Gruß
      Thomas

      posted in Off Topic
      D
      DerT
    • Welche Aktoren und Sensoren für zukünftige Projekte

      Hallo zusammen,

      ich setzte aktuell hauptsächlich Shellys ein und habe damit fast jedes Licht Smart gemacht. Daneben noch ein paar ESP basierte Geräte (Wemos, NodeMCU, Sonoff). Nun steht in den nächsten Jahren vermutlich ein größeres Umbauprojekt an in dem ich ein „neues“ SmartHome aufbauen muss. Ich überlege nun immer wieder auf welcher Basis ich die Aktoren aufbauen möchte. Zwar bin ich mit den Shellys zufrieden möchte mir aber auch andere Geräte anschauen um Vergleiche anzustellen. Vor allem was kabelgebundene Aktoren angeht tappe ich noch etwas im Dunkeln. Grundsätzlich ist der ioBroker als Zentrale gesetzt. Ich bräuchte also streng genommen kein komplett System wie loxone sondern, „nur“ Aktoren die ich schalten kann. Aber genau an dem Punkt fehlen mir die Stichworte, nachdem ich suchen kann. Kennt jemand von euch das ein oder andere System, mit dem ich mich mal näher befassen könnte?

      Gruß

      Thomas

      posted in Hardware
      D
      DerT
    • RE: Verkaufe 6 Zigbee Heizungsthermostate (TS0601)

      Sind sie Thermostate noch zu haben?

      posted in Marktplatz
      D
      DerT
    • RE: LOLA smart Deckenleuchte (medion) in iobroker

      @kusselin sagte in LOLA smart Deckenleuchte (medion) in iobroker:

      @dert hi, wie gesagt.....wenn ich die lampe per iobroker oder App schalten will muss der Schalter imme ein sein..sonst hat die lampe kein Strom udn somit keine Verbindung richtig? udn wenn halt die Tochter nach hause kommt und dann unwissend den Lichtschalter wieder bestätigt ist alles weg...

      Oder...ich baue halt einen Shelly 1 zb hinter den schalter dann gehts richtig?

      Jain, bitte nicht zu einfach vorstellen.
      Ich weiß nicht welche Erfahrung du mit 230V hast. Aber bitte nicht daran rum probieren ohne zu wissen was du tust.

      Prinzipiell könntest du deinen Lichtschalter mit einem Shelly Smart machen.
      Das sorgt aber trotzdem nicht dafür, dass deine Lampe dauerhaft Strom hat.
      Du hast aber verschiedene Optionen.

      Du könnest folgendes machen
      Den Shelly nicht als Relais sondern nur als Input verwenden und es im ioBroker so programmieren, dass beim drücken des Lichtschalters der Datenpunkt der Lampe geschalten wird. Allerdings könntest du dann dein Licht nicht mehr schalten wenn dein ioBroker ausfällt.

      posted in Einbindung von Geräten
      D
      DerT
    • RE: LOLA smart Deckenleuchte (medion) in iobroker

      @kusselin
      Connectivity steht auf false. Ist die Lampe mit Alexa verbunden? Lässt sie sich da schalten? Werden die Datenpunkte dann aktualisiert? Steht etwas im Log wenn du versucht den Datenpunkt zu schalten ?

      posted in Einbindung von Geräten
      D
      DerT
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo