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

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Off Topic
  4. Rhasspy Offline Sprachsteuerung

NEWS

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

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

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

Rhasspy Offline Sprachsteuerung

Geplant Angeheftet Gesperrt Verschoben Off Topic
403 Beiträge 30 Kommentatoren 100.2k Aufrufe 47 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.
  • tobetobeT tobetobe

    @joergeli

    Guten Morgen Jörg,

    da kann man mal wieder sehen, wie wichtig Ersatzspieler für die Teamleistung sind :+1:
    Da muss ich doch gleich mal meinen mqtt.1 reaktivieren. Wobei das, glaube ich, mein Problem nicht löst, wie ich aus em ganzen JSON Gewusel meine relevanten Slots herausgefiltert bekomme.

    Die von dir geschilderten Nebeneffekte mit wav usw hatte ich auch bereits mal gesehen. Mir ist noch nicht ganz klar, welche Relevanz das hat, und ob man diese ggf ausgefiltert bekommt, wenn man UDP konfiguriert. Das wollte ich mir auch noch anschauen. Dein Hinweis zum richtigen Definieren der Subscription bzw der Prefixes m Client ist naürlich richtig. Allerdings wird hier ja nur an der Datensenke gefiltert, erzeugt wird der ganze Müll an der Datenquelle trotzdem. Wann läuft einem da die SD voll?

    Auf alle Fälle wieder ein großer Schritt nach vorne. Vielen Dank und noch einen schönen Sonntag

    Thomas

    joergeliJ Offline
    joergeliJ Offline
    joergeli
    schrieb am zuletzt editiert von joergeli
    #190

    @tobetobe

    Hallo Thomas,

    ich habe den Test-Raspi mit Rhasspy 2.5-pre jetzt auf dem gleichen Stand, wie meinen Raspi mit der 2.4.19.
    Eins vorweg: Außer einem kleinen Geschwindigkeits-Vorteil kann ich keine großartigen Änderungen/Vorteile erkennen.

    Aber der Reihe nach:
    1.) Ich habe bemerkt, daß auf dem 2.5er-Raspi ebenfalls ein Mosquitto (Port 1883) läuft, also nicht nur der interne Broker auf Port 12183. Keine Ahnung, ob der immer vorhanden ist, ich habe ihn jedenfalls nicht wissentlich installiert.

    Ich habe daraufhin in Rhasppy einen externen MQTT aber mit der lokalen IP und Port 1883 eingestellt.
    In mqtt.1 ebenfalls die entspr. IP und Port 1883 eingetragen.
    ---> Intents kommen unter mqtt.1 an.

    Dann noch mal in Rhasspy den internen MQTT (Port 12183) aktiviert, aber auf den kann sich mqtt.1 nicht verbinden.
    Ich vermute, weil der im Docker-Container läuft und deshalb nicht erreichbar ist.

    2.) In ioBroker mqtt.1-Client folgende Topics subscribed:
    hermes/intent/#, hermes/hotword/#,hermes/asr/#,hermes/dialogueManager/#, hermes/nlu/#
    Ich habe bewußt nicht hermes/# genommen, weil ja dann - wie bereits erwähnt - die Datenpunkte zugemüllt werden.
    BTW:
    @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

    Allerdings wird hier ja nur an der Datensenke gefiltert, erzeugt wird der ganze Müll an der Datenquelle trotzdem. Wann läuft einem da die SD voll?

    Bist Du Dir sicher, daß der Müll in der Datenquelle gespeichert wird?
    Ich glaube nicht, denn dort gibt es ja keine ioBroker-Datenpunkte in denen gespeichert werden könnte.
    Wenn jeder MQTT-Broker die Topics, die er published, speichern würde, müsste jedes System irgendwann in die Knie gezwungen werden. Just my 2 cents.

    3.) Topics mit JS aufbereiten:
    Ich weiß, Du verwendest lieber Node Red, aber ich glaube, auch damit wirst Du um JS nicht ganz herumkommen.
    In Node Red kannst Du zwar Funktionsblöcke verwenden, die Dir das entspr. JSON aufdröseln, aber ich meine, das wird innerhalb der Funktionsblöcke ebenfalls mit JS programmiert.

    Ich weiß, daß Deine Sentences/Slots anders aufgebaut sind als meine (ich verwende keine Slots), will Dir aber trotzdem an einem Besíspiel zeigen, wie ich es gelöst habe:
    Mein "Lampen"-Sentence:

    [Lampen]
    lampen_name = (moodlight |stimmungslicht|fernsehlicht|esstischlampe|essecke|wandspots|regal|couchjoerg|couchrenate|hydro|ledcube|radio ) {name}
    lampen_state = (ein | aus) {state}
    schalte [ (die | den | das )]  <lampen_name> <lampen_state>
    

    gesprochenes Kommando: Snowboy, schalte die Wandspots ein....

    --> erzeugtes JSON:

    {
        "intent": {
            "name": "Lampen",
            "confidence": 1
        },
        "entities": [
            {
                "entity": "name",
                "value": "wandspots",
                "value_details": {
                    "kind": "Unknown",
                    "value": "wandspots"
                },
                "raw_value": "wandspots",
                "start": 12,
                "end": 21,
                "raw_start": 12,
                "raw_end": 21
            },
            {
                "entity": "state",
                "value": "ein",
                "value_details": {
                    "kind": "Unknown",
                    "value": "ein"
                },
                "raw_value": "ein",
                "start": 22,
                "end": 25,
                "raw_start": 22,
                "raw_end": 25
            }
        ],
        "slots": {
            "name": "wandspots",
            "state": "ein"
        },
        "text": "schalte die wandspots ein",
        "raw_text": "schalte die wandspots ein",
        "tokens": [
            "schalte",
            "die",
            "wandspots",
            "ein"
        ],
        "raw_tokens": [
            "schalte",
            "die",
            "wandspots",
            "ein"
        ],
        "wakeword_id": "snowboy"
    }
    

    In einem JS drösele ich jetzt das Intent "Lampen" auf:

    const lampen     = 'mqtt.1.hermes.intent.Lampen'       // Lampen, bzw. Funksteckdosen
    
    //______________________________________________
    // Lampen, bzw. Funksteckdosen
    on({id: lampen, change: "any"},function(obj) {
        let empf_code = getState(lampen).val ;
        //log ("EMPF-CODE: " + empf_code);
        let empf_json = JSON.parse(empf_code);
    
      
        let name = empf_json.slots[0].value.value;
         //log ("name: " + name);
        let state = empf_json.slots[1].value.value;
         //log ("state: " + state);
    
     if(name == "wandspots" && state == "ein") { 
        setState ('hm-rpc.2.CUX4000001.7.PRESS_LONG', true); 
        setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Wandspots_An', true);
     }
    else if(name == "wandspots" && state == "aus") { 
        setState ('hm-rpc.2.CUX4000001.7.PRESS_SHORT', true); 
        setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Wandspots_Aus', true);
    }
    
    else if(name == "regal" && state == "ein") { 
        setState ('hm-rpc.2.CUX4000001.1.PRESS_LONG', true); 
        setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_An', true);
     }
    else if(name == "regal" && state == "aus") { 
        setState ('hm-rpc.2.CUX4000001.1.PRESS_SHORT', true); 
        setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_Aus', true);
    }
    
    else if(name == "couchjoerg" && state == "ein") {
        setState ('hm-rpc.2.CUX4000001.10.PRESS_LONG', true);
        setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_An', true);
    }
    else if(name == "couchjoerg" && state == "aus") {
        setState ('hm-rpc.2.CUX4000001.10.PRESS_SHORT', true);
        setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_Aus', true);
    }
    
    else if(name == "couchrenate" && state == "ein") {
        setState ('hm-rpc.2.CUX4000001.3.PRESS_LONG', true);
        setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_An', true);   
    }
    else if(name == "couchrenate" && state == "aus") {
        setState ('hm-rpc.2.CUX4000001.3.PRESS_SHORT', true);
        setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_Aus', true);
    }
    
    else if(name == "hydro" && state == "ein") {
        setState ('hm-rpc.2.CUX4000001.8.PRESS_LONG', true);
        setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_An', true);     
    }
    else if(name == "hydro" && state == "aus") {
        setState ('hm-rpc.2.CUX4000001.8.PRESS_SHORT', true);
        setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_Aus', true);    
    }
    
    else if(name == "ledcube" && state == "ein") {
        setState ('hm-rpc.2.CUX4000001.5.PRESS_LONG', true);
        setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.LED-Wuerfel_An', true);     
    }
    else if(name == "ledcube" && state == "aus") {
        setState ('hm-rpc.2.CUX4000001.5.PRESS_SHORT', true);
        setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.LED-Wuerfel_Aus', true);    
    }
    
    else if(name == "essecke" && state == "ein") {
        setState ('hm-rpc.2.CUX4000001.2.PRESS_LONG', true); 
        setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Essecke_An', true);
    }
    else if(name == "essecke" && state == "aus") {
        setState ('hm-rpc.2.CUX4000001.2.PRESS_SHORT', true);
        setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Essecke_Aus', true);
    }
    
    else if(name == "esstischlampe" && state == "ein") { setState ('shelly.0.SHSW-1#2C7AEF#1.Relay0.Switch', true); }
    else if(name == "esstischlampe" && state == "aus") { setState ('shelly.0.SHSW-1#2C7AEF#1.Relay0.Switch', false); }
    
    else if(name == "fernsehlicht" && state == "ein") { fernsehlicht_ein(); }
    else if(name == "fernsehlicht" && state == "aus") { fernsehlicht_aus(); }
    
    else if(name == "radio" && state == "ein") { setState ('javascript.0.Silvercrest.On', true); }
    else if(name == "radio" && state == "aus") { setState ('javascript.0.Silvercrest.On', false); }
    
    
    //log ( name + " ist " + state );
    sendTo("paw.0",'Tablet_Jörg',{tts: name + " wurde " + state + "geschaltet" }); 
    });
    
    

    Beachte in der 1. Zeile den Datenpunkt mqtt.1.hermes.intent.Lampen
    Wenn sich dieser Datenpunkt ändert ( on({id: lampen, change: "any"},function(obj) { ......,
    dann parse den Empfangscode.
    Fülle aus dem geparsten Code die beiden Variablen name und state:

     let name = empf_json.slots[0].value.value;
         //log ("name: " + name);
        let state = empf_json.slots[1].value.value;
         //log ("state: " + state);
    

    Prüfe anhand der beiden Variablen, was passieren soll:

    #z.B.:
     if(name == "wandspots" && state == "ein") { 
        setState ('hm-rpc.2.CUX4000001.7.PRESS_LONG', true); 
     }
    
    

    Wenn also name=wandspots und state=ein, setState ('hm-rpc.2.CUX4000001.7.PRESS_LONG', true);
    Somit werden meine Wandspots über hm-rpc eingeschaltet.

    Die anderen Lampen werden mit den weiteren else if-Bedingungen geprüft.

    Hinweis bei mir werden die intents je nach Bedingung in verschiedenenen Datenpunkten gespeichert:

    const rolladen   = 'mqtt.1.hermes.intent.Rolladen'     // Rolladen
    const lampen     = 'mqtt.1.hermes.intent.Lampen'       // Lampen, bzw. Funksteckdosen
    const drucker    = 'mqtt.1.hermes.intent.Drucker'      // 3D Drucker
    const fenster    = 'mqtt.1.hermes.intent.Fenster'      // Anzahl offene Fenster
    const regen      = 'mqtt.1.hermes.intent.Regen'        // Regen heute
    const ereignis   = 'mqtt.1.hermes.intent.Ereignis'     // Heutige Termine
    const zeit       = 'mqtt.1.hermes.intent.Zeit'         // Uhrzeit
    const datum      = 'mqtt.1.hermes.intent.Datum'        // Datum
    const temperatur = 'mqtt.1.hermes.intent.Temperatur'   // Temperatur
    

    Ich glaube mich zu erinnern, daß Du immer im gleichen Datenpunkt speicherst und dann entspr. weiter auswertest.
    Mein Beispiel sollte nur erläutern, wie man das empfangene JSON aufsplitten kann:

     let name = empf_json.slots[0].value.value;
         //log ("name: " + name);
        let state = empf_json.slots[1].value.value;
         //log ("state: " + state);
    

    Das hat mich ziemlich Zeit gekostet, da das JSON ein mehrdimensionales Array ist und ich in dieser Form kein entspr. Beispiel im Internet finden konnte. Ich konnte das nur mir Try & Error und log name/state herausfinden.

    3.) Wakeword-Erkennung:
    Das mache ich wie bei der 2.4.19, aber jetzt über die entspr. Hermes-Datenpunkte.
    Es erfolgt bei mir nur eine entspr. Sprachausgabe mittels PAW-Adapter auf meinem Tablet.

    //################################################################################################
    // WakeWord-Erkennung
    const wake   = 'mqtt.1.hermes.asr.startListening'      // Wakeword erkannt
    const befehl = 'mqtt.1.hermes.asr.textCaptured'      // Text erkannt
    const unbekannt = 'mqtt.1.hermes.nlu.intentNotRecognized' // Text nicht erkannt
    
    on({id: wake, change: "any"},function(obj) {
        wakeword();       
    });
    
    on({id: befehl, change: "any"},function(obj) {
        befehl_empf();   
    });
    
    on({id: unbekannt, change: "any"},function(obj) {
        nicht_erkannt();
    });
    
    
    function wakeword(){
        lautstaerke(); // Lautstaerke Tablet auf 15 setzen
        sendTo("paw.0",'Tablet_Jörg',{tts: "ja"  }); // Sprachausgabe mittels PAW-Adapter auf Tablet/Smartphone
    }
    
    function befehl_empf(){ 
        lautstaerke(); // Lautstaerke auf 15 setzen
        sendTo("paw.0",'Tablet_Jörg',{tts: "Moment bitte,    "  }); // Sprachausgabe mittels PAW-Adapter auf Tablet/Smartphone
    }
    
    function nicht_erkannt(){ 
        lautstaerke(); // Lautstaerke auf 15 setzen
        sendTo("paw.0",'Tablet_Jörg',{tts: "Entschuldigung, ich habe dich leider nicht verstanden" });
    }
    
    // Ende WakeWord-ErkennungsScript
    //################################################################################################
    

    4.) Hermes-LED-Control
    Habe ich nicht zum Laufen bekommen.
    Ich bekomme immer eine Fehlermeldung "Configuration File not found", wenn ich den HLC-Service starte.
    Googeln nach doesem Problem hat nichts gebracht, da es jemand anderes auch hatte, aber beim Autor KiboOst wohl noch nie aufgetreten ist und er somit keine Lösung anbieten konnte

    Also mache ich das wie gehabt über mein "LED-Ring-Workaround"-Python Script (was aber wohl mit Deinem Matrix Voice nicht funktioniert). Im Python-Script habe ich dazu ebenfalls die neuen HERMES-Datenpunkte eingetragen.

    5.) Direkte Sprachausgabe via pico-TTS:
    Habe ich nicht getestet und werde es wohl auch nicht verwenden, da mir die Sprachausgabe über mein Tablet ausreicht.

    6.) mqtt.1-Instanz trennt und verbindet sich häufig
    das habe ich immer noch (s. auch Screenshot in vorigem Post)
    das habe ich pragmatisch "gelöst", in dem ich das Logging der mqtt.1-Instanz von "info" auf "warn" umgestellt habe, damit mir das ioBroker-Log nicht zugemüllt wird. (Nicht schön, aber quick and dirty)

    Fazit:
    Rhasspy 2.5-pre läuft (mit Klimmzügen) jetzt zwar, aber vom Hocker reißt es mich gegenüber der 2.4.19 nicht.
    Für mich pers. nur eine Aufhübschung des GUI und ein kleiner Geschwindigkeitsvorteil und mehr Konfigurationsaufwand seitens ioBroker/MQTT.
    Bei mir bleibt die 2.5er jedenfalls erst mal auf dem Test-Raspi
    Evtl. bringt es für Dich ja Vorteile, weil Du mit Master/Satellit arbeitest?

    Gruß
    Jörg

    tobetobeT 1 Antwort Letzte Antwort
    0
    • joergeliJ joergeli

      @tobetobe

      Hallo Thomas,

      ich habe den Test-Raspi mit Rhasspy 2.5-pre jetzt auf dem gleichen Stand, wie meinen Raspi mit der 2.4.19.
      Eins vorweg: Außer einem kleinen Geschwindigkeits-Vorteil kann ich keine großartigen Änderungen/Vorteile erkennen.

      Aber der Reihe nach:
      1.) Ich habe bemerkt, daß auf dem 2.5er-Raspi ebenfalls ein Mosquitto (Port 1883) läuft, also nicht nur der interne Broker auf Port 12183. Keine Ahnung, ob der immer vorhanden ist, ich habe ihn jedenfalls nicht wissentlich installiert.

      Ich habe daraufhin in Rhasppy einen externen MQTT aber mit der lokalen IP und Port 1883 eingestellt.
      In mqtt.1 ebenfalls die entspr. IP und Port 1883 eingetragen.
      ---> Intents kommen unter mqtt.1 an.

      Dann noch mal in Rhasspy den internen MQTT (Port 12183) aktiviert, aber auf den kann sich mqtt.1 nicht verbinden.
      Ich vermute, weil der im Docker-Container läuft und deshalb nicht erreichbar ist.

      2.) In ioBroker mqtt.1-Client folgende Topics subscribed:
      hermes/intent/#, hermes/hotword/#,hermes/asr/#,hermes/dialogueManager/#, hermes/nlu/#
      Ich habe bewußt nicht hermes/# genommen, weil ja dann - wie bereits erwähnt - die Datenpunkte zugemüllt werden.
      BTW:
      @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

      Allerdings wird hier ja nur an der Datensenke gefiltert, erzeugt wird der ganze Müll an der Datenquelle trotzdem. Wann läuft einem da die SD voll?

      Bist Du Dir sicher, daß der Müll in der Datenquelle gespeichert wird?
      Ich glaube nicht, denn dort gibt es ja keine ioBroker-Datenpunkte in denen gespeichert werden könnte.
      Wenn jeder MQTT-Broker die Topics, die er published, speichern würde, müsste jedes System irgendwann in die Knie gezwungen werden. Just my 2 cents.

      3.) Topics mit JS aufbereiten:
      Ich weiß, Du verwendest lieber Node Red, aber ich glaube, auch damit wirst Du um JS nicht ganz herumkommen.
      In Node Red kannst Du zwar Funktionsblöcke verwenden, die Dir das entspr. JSON aufdröseln, aber ich meine, das wird innerhalb der Funktionsblöcke ebenfalls mit JS programmiert.

      Ich weiß, daß Deine Sentences/Slots anders aufgebaut sind als meine (ich verwende keine Slots), will Dir aber trotzdem an einem Besíspiel zeigen, wie ich es gelöst habe:
      Mein "Lampen"-Sentence:

      [Lampen]
      lampen_name = (moodlight |stimmungslicht|fernsehlicht|esstischlampe|essecke|wandspots|regal|couchjoerg|couchrenate|hydro|ledcube|radio ) {name}
      lampen_state = (ein | aus) {state}
      schalte [ (die | den | das )]  <lampen_name> <lampen_state>
      

      gesprochenes Kommando: Snowboy, schalte die Wandspots ein....

      --> erzeugtes JSON:

      {
          "intent": {
              "name": "Lampen",
              "confidence": 1
          },
          "entities": [
              {
                  "entity": "name",
                  "value": "wandspots",
                  "value_details": {
                      "kind": "Unknown",
                      "value": "wandspots"
                  },
                  "raw_value": "wandspots",
                  "start": 12,
                  "end": 21,
                  "raw_start": 12,
                  "raw_end": 21
              },
              {
                  "entity": "state",
                  "value": "ein",
                  "value_details": {
                      "kind": "Unknown",
                      "value": "ein"
                  },
                  "raw_value": "ein",
                  "start": 22,
                  "end": 25,
                  "raw_start": 22,
                  "raw_end": 25
              }
          ],
          "slots": {
              "name": "wandspots",
              "state": "ein"
          },
          "text": "schalte die wandspots ein",
          "raw_text": "schalte die wandspots ein",
          "tokens": [
              "schalte",
              "die",
              "wandspots",
              "ein"
          ],
          "raw_tokens": [
              "schalte",
              "die",
              "wandspots",
              "ein"
          ],
          "wakeword_id": "snowboy"
      }
      

      In einem JS drösele ich jetzt das Intent "Lampen" auf:

      const lampen     = 'mqtt.1.hermes.intent.Lampen'       // Lampen, bzw. Funksteckdosen
      
      //______________________________________________
      // Lampen, bzw. Funksteckdosen
      on({id: lampen, change: "any"},function(obj) {
          let empf_code = getState(lampen).val ;
          //log ("EMPF-CODE: " + empf_code);
          let empf_json = JSON.parse(empf_code);
      
        
          let name = empf_json.slots[0].value.value;
           //log ("name: " + name);
          let state = empf_json.slots[1].value.value;
           //log ("state: " + state);
      
       if(name == "wandspots" && state == "ein") { 
          setState ('hm-rpc.2.CUX4000001.7.PRESS_LONG', true); 
          setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Wandspots_An', true);
       }
      else if(name == "wandspots" && state == "aus") { 
          setState ('hm-rpc.2.CUX4000001.7.PRESS_SHORT', true); 
          setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Wandspots_Aus', true);
      }
      
      else if(name == "regal" && state == "ein") { 
          setState ('hm-rpc.2.CUX4000001.1.PRESS_LONG', true); 
          setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_An', true);
       }
      else if(name == "regal" && state == "aus") { 
          setState ('hm-rpc.2.CUX4000001.1.PRESS_SHORT', true); 
          setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_Aus', true);
      }
      
      else if(name == "couchjoerg" && state == "ein") {
          setState ('hm-rpc.2.CUX4000001.10.PRESS_LONG', true);
          setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_An', true);
      }
      else if(name == "couchjoerg" && state == "aus") {
          setState ('hm-rpc.2.CUX4000001.10.PRESS_SHORT', true);
          setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_Aus', true);
      }
      
      else if(name == "couchrenate" && state == "ein") {
          setState ('hm-rpc.2.CUX4000001.3.PRESS_LONG', true);
          setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_An', true);   
      }
      else if(name == "couchrenate" && state == "aus") {
          setState ('hm-rpc.2.CUX4000001.3.PRESS_SHORT', true);
          setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_Aus', true);
      }
      
      else if(name == "hydro" && state == "ein") {
          setState ('hm-rpc.2.CUX4000001.8.PRESS_LONG', true);
          setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_An', true);     
      }
      else if(name == "hydro" && state == "aus") {
          setState ('hm-rpc.2.CUX4000001.8.PRESS_SHORT', true);
          setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_Aus', true);    
      }
      
      else if(name == "ledcube" && state == "ein") {
          setState ('hm-rpc.2.CUX4000001.5.PRESS_LONG', true);
          setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.LED-Wuerfel_An', true);     
      }
      else if(name == "ledcube" && state == "aus") {
          setState ('hm-rpc.2.CUX4000001.5.PRESS_SHORT', true);
          setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.LED-Wuerfel_Aus', true);    
      }
      
      else if(name == "essecke" && state == "ein") {
          setState ('hm-rpc.2.CUX4000001.2.PRESS_LONG', true); 
          setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Essecke_An', true);
      }
      else if(name == "essecke" && state == "aus") {
          setState ('hm-rpc.2.CUX4000001.2.PRESS_SHORT', true);
          setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Essecke_Aus', true);
      }
      
      else if(name == "esstischlampe" && state == "ein") { setState ('shelly.0.SHSW-1#2C7AEF#1.Relay0.Switch', true); }
      else if(name == "esstischlampe" && state == "aus") { setState ('shelly.0.SHSW-1#2C7AEF#1.Relay0.Switch', false); }
      
      else if(name == "fernsehlicht" && state == "ein") { fernsehlicht_ein(); }
      else if(name == "fernsehlicht" && state == "aus") { fernsehlicht_aus(); }
      
      else if(name == "radio" && state == "ein") { setState ('javascript.0.Silvercrest.On', true); }
      else if(name == "radio" && state == "aus") { setState ('javascript.0.Silvercrest.On', false); }
      
      
      //log ( name + " ist " + state );
      sendTo("paw.0",'Tablet_Jörg',{tts: name + " wurde " + state + "geschaltet" }); 
      });
      
      

      Beachte in der 1. Zeile den Datenpunkt mqtt.1.hermes.intent.Lampen
      Wenn sich dieser Datenpunkt ändert ( on({id: lampen, change: "any"},function(obj) { ......,
      dann parse den Empfangscode.
      Fülle aus dem geparsten Code die beiden Variablen name und state:

       let name = empf_json.slots[0].value.value;
           //log ("name: " + name);
          let state = empf_json.slots[1].value.value;
           //log ("state: " + state);
      

      Prüfe anhand der beiden Variablen, was passieren soll:

      #z.B.:
       if(name == "wandspots" && state == "ein") { 
          setState ('hm-rpc.2.CUX4000001.7.PRESS_LONG', true); 
       }
      
      

      Wenn also name=wandspots und state=ein, setState ('hm-rpc.2.CUX4000001.7.PRESS_LONG', true);
      Somit werden meine Wandspots über hm-rpc eingeschaltet.

      Die anderen Lampen werden mit den weiteren else if-Bedingungen geprüft.

      Hinweis bei mir werden die intents je nach Bedingung in verschiedenenen Datenpunkten gespeichert:

      const rolladen   = 'mqtt.1.hermes.intent.Rolladen'     // Rolladen
      const lampen     = 'mqtt.1.hermes.intent.Lampen'       // Lampen, bzw. Funksteckdosen
      const drucker    = 'mqtt.1.hermes.intent.Drucker'      // 3D Drucker
      const fenster    = 'mqtt.1.hermes.intent.Fenster'      // Anzahl offene Fenster
      const regen      = 'mqtt.1.hermes.intent.Regen'        // Regen heute
      const ereignis   = 'mqtt.1.hermes.intent.Ereignis'     // Heutige Termine
      const zeit       = 'mqtt.1.hermes.intent.Zeit'         // Uhrzeit
      const datum      = 'mqtt.1.hermes.intent.Datum'        // Datum
      const temperatur = 'mqtt.1.hermes.intent.Temperatur'   // Temperatur
      

      Ich glaube mich zu erinnern, daß Du immer im gleichen Datenpunkt speicherst und dann entspr. weiter auswertest.
      Mein Beispiel sollte nur erläutern, wie man das empfangene JSON aufsplitten kann:

       let name = empf_json.slots[0].value.value;
           //log ("name: " + name);
          let state = empf_json.slots[1].value.value;
           //log ("state: " + state);
      

      Das hat mich ziemlich Zeit gekostet, da das JSON ein mehrdimensionales Array ist und ich in dieser Form kein entspr. Beispiel im Internet finden konnte. Ich konnte das nur mir Try & Error und log name/state herausfinden.

      3.) Wakeword-Erkennung:
      Das mache ich wie bei der 2.4.19, aber jetzt über die entspr. Hermes-Datenpunkte.
      Es erfolgt bei mir nur eine entspr. Sprachausgabe mittels PAW-Adapter auf meinem Tablet.

      //################################################################################################
      // WakeWord-Erkennung
      const wake   = 'mqtt.1.hermes.asr.startListening'      // Wakeword erkannt
      const befehl = 'mqtt.1.hermes.asr.textCaptured'      // Text erkannt
      const unbekannt = 'mqtt.1.hermes.nlu.intentNotRecognized' // Text nicht erkannt
      
      on({id: wake, change: "any"},function(obj) {
          wakeword();       
      });
      
      on({id: befehl, change: "any"},function(obj) {
          befehl_empf();   
      });
      
      on({id: unbekannt, change: "any"},function(obj) {
          nicht_erkannt();
      });
      
      
      function wakeword(){
          lautstaerke(); // Lautstaerke Tablet auf 15 setzen
          sendTo("paw.0",'Tablet_Jörg',{tts: "ja"  }); // Sprachausgabe mittels PAW-Adapter auf Tablet/Smartphone
      }
      
      function befehl_empf(){ 
          lautstaerke(); // Lautstaerke auf 15 setzen
          sendTo("paw.0",'Tablet_Jörg',{tts: "Moment bitte,    "  }); // Sprachausgabe mittels PAW-Adapter auf Tablet/Smartphone
      }
      
      function nicht_erkannt(){ 
          lautstaerke(); // Lautstaerke auf 15 setzen
          sendTo("paw.0",'Tablet_Jörg',{tts: "Entschuldigung, ich habe dich leider nicht verstanden" });
      }
      
      // Ende WakeWord-ErkennungsScript
      //################################################################################################
      

      4.) Hermes-LED-Control
      Habe ich nicht zum Laufen bekommen.
      Ich bekomme immer eine Fehlermeldung "Configuration File not found", wenn ich den HLC-Service starte.
      Googeln nach doesem Problem hat nichts gebracht, da es jemand anderes auch hatte, aber beim Autor KiboOst wohl noch nie aufgetreten ist und er somit keine Lösung anbieten konnte

      Also mache ich das wie gehabt über mein "LED-Ring-Workaround"-Python Script (was aber wohl mit Deinem Matrix Voice nicht funktioniert). Im Python-Script habe ich dazu ebenfalls die neuen HERMES-Datenpunkte eingetragen.

      5.) Direkte Sprachausgabe via pico-TTS:
      Habe ich nicht getestet und werde es wohl auch nicht verwenden, da mir die Sprachausgabe über mein Tablet ausreicht.

      6.) mqtt.1-Instanz trennt und verbindet sich häufig
      das habe ich immer noch (s. auch Screenshot in vorigem Post)
      das habe ich pragmatisch "gelöst", in dem ich das Logging der mqtt.1-Instanz von "info" auf "warn" umgestellt habe, damit mir das ioBroker-Log nicht zugemüllt wird. (Nicht schön, aber quick and dirty)

      Fazit:
      Rhasspy 2.5-pre läuft (mit Klimmzügen) jetzt zwar, aber vom Hocker reißt es mich gegenüber der 2.4.19 nicht.
      Für mich pers. nur eine Aufhübschung des GUI und ein kleiner Geschwindigkeitsvorteil und mehr Konfigurationsaufwand seitens ioBroker/MQTT.
      Bei mir bleibt die 2.5er jedenfalls erst mal auf dem Test-Raspi
      Evtl. bringt es für Dich ja Vorteile, weil Du mit Master/Satellit arbeitest?

      Gruß
      Jörg

      tobetobeT Offline
      tobetobeT Offline
      tobetobe
      schrieb am zuletzt editiert von
      #191

      Hallo Jörg,

      @joergeli said in Rhasspy Offline Sprachsteuerung:

      ich habe den Test-Raspi mit Rhasspy 2.5-pre jetzt auf dem gleichen Stand, wie meinen Raspi mit der 2.4.19.

      Respekt, da hast du sicher einiges an Zeit investiert. Toller Erfolg - Glückwunsch! Ich hänge noch hinterher, da ich mich zunächst einmal mit mqtt und dem Aufbau von Aufrufen/Abfragen beschäftigt habe...

      @joergeli said in Rhasspy Offline Sprachsteuerung:

      2.5er-Raspi ebenfalls ein Mosquitto (Port 1883) läuft,

      Davon hatte ich im Forum gelesen. Da ich dies nie nachgestellt habe, konnte ich den damit verbundenen Vorteil nicht erkennen. Gut, dass du ihn jetzt aufgezeigt hast (den Vorteil).

      @joergeli said in Rhasspy Offline Sprachsteuerung:

      Bist Du Dir sicher, daß der Müll in der Datenquelle gespeichert wird?

      Nein, ich weiß ja nicht, wie programmiert wurde. Von daher war es nur eine Vermutung und eine Frage, die ich mir gestellt habe. Wenn der mqtt.1 Client das alles speichern würde, wäre es allerdings auch nicht besser. Heißt für mich momentan nur, dass ich das im Auge behalten möchte.

      @joergeli said in Rhasspy Offline Sprachsteuerung:

      3.) Topics mit JS aufbereiten:
      Ich weiß, Du verwendest lieber Node Red
      Nein, nein, das ist durchaus überhaupt nicht so. Meine gesamten Rhasspy-Skripts basieren auf JS. Diese versuche ich seit Tagen erfolglos umzubauen. Ich verstehe von JS nur zu wenig, nicht im Prinzip, aber bei der richtigen, fehlerfreien Syntax. Deshalb habe ich gesagt, dass es mir leichter fallen würde, die alte Funktionalität mit Nodered wieder herzustellen, was ich aber gar nicht will. Ich will meine JS Skripte umbauen und weiter verwenden.

      Deine Beispiele dürften mir dabei nun wesentlich weiterhelfen. Herzlichen Dank dafür.

      @joergeli said in Rhasspy Offline Sprachsteuerung:

      Ich glaube mich zu erinnern, daß Du immer im gleichen Datenpunkt speicherst

      Nein, auch ich habe unterschiedliche Datenpunkte für die verschiedenen Aktionen. Allerdings rufe ich sehr ähnliche Funktionen, zB ChangeLight, ChangeDimmer, ChangeBlind mit Wildcart auf, also mit Change*. Und danach fische auch ich die Slots heraus, die aber je nach Inhalt von "*" unterschiedlich sein können. Das macht aber für mcih auch nicht so den großen Unterschied. Wichtig ist, dass ich das mit der Adressierung der Intents und dem Auslesen der Slots wieder hinbekomme. Mit deinen Hinweisen sehe ich aber nun, wie es gehen könnte. Getestet habe ich bislang noch nichts...

      @joergeli said in Rhasspy Offline Sprachsteuerung:

      3.) Wakeword-Erkennung:
      Das mache ich wie bei der 2.4.19, aber jetzt über die entspr. Hermes-Datenpunkte.
      Das ist für mich auch eine der wichtigen Funktionen, die ich in 2.4.19 schon hatte. Deine Ausführung stimmt mich ebenfalls hoffnungsvoll.

      @joergeli said in Rhasspy Offline Sprachsteuerung:

      4.) Hermes-LED-Control

      Hat für mich momentan auch Priorität 99. Die Skripte und Wakeword haben Vorrang.

      @joergeli said in Rhasspy Offline Sprachsteuerung:

      5.) Direkte Sprachausgabe via pico-TTS:

      Sprachausgabe war unter 2.4.19 ebenfalls kein (Software)Problem. Knifflig war die richtige Hardware-Einstellung zu finden. Ich hoffe, ich bekomme das wieder hin.

      @joergeli said in Rhasspy Offline Sprachsteuerung:

      6.) mqtt.1-Instanz trennt und verbindet sich häufig

      Das Problem hatte ich beim Testen zwischenzeitlich auch einmal. Allerdings konnte ich es relativ eindeutig mit hohem Verkehrsaufkommen korellieren. Ich habe dann auch die Topics reduziert (die standen zum Annähern ans Thema zunächst einfach auf #) und das Problem war behoben. Mit meinem Odroid habe ich allerdings auch eine ganz andere Verarbeitungsleistung zur Verfügung, als du mit deinem Pi4. Kann sein, dass der bei Last empfindlicher reagiert.

      @joergeli said in Rhasspy Offline Sprachsteuerung:

      Evtl. bringt es für Dich ja Vorteile, weil Du mit Master/Satellit arbeitest?

      Kann sein. ich habe mir zum Lernen, besser Verstehen usw einen zweiten Satelliten (Pi3 mit 3€ Mikrofon) aufgebaut. Der Setup war ein Klacks und die Performance ist ebenfalls sehr gut.

      Nun will ich testen!!!

      Beste Grüße
      tobetobe

      joergeliJ 1 Antwort Letzte Antwort
      0
      • tobetobeT tobetobe

        Hallo Jörg,

        @joergeli said in Rhasspy Offline Sprachsteuerung:

        ich habe den Test-Raspi mit Rhasspy 2.5-pre jetzt auf dem gleichen Stand, wie meinen Raspi mit der 2.4.19.

        Respekt, da hast du sicher einiges an Zeit investiert. Toller Erfolg - Glückwunsch! Ich hänge noch hinterher, da ich mich zunächst einmal mit mqtt und dem Aufbau von Aufrufen/Abfragen beschäftigt habe...

        @joergeli said in Rhasspy Offline Sprachsteuerung:

        2.5er-Raspi ebenfalls ein Mosquitto (Port 1883) läuft,

        Davon hatte ich im Forum gelesen. Da ich dies nie nachgestellt habe, konnte ich den damit verbundenen Vorteil nicht erkennen. Gut, dass du ihn jetzt aufgezeigt hast (den Vorteil).

        @joergeli said in Rhasspy Offline Sprachsteuerung:

        Bist Du Dir sicher, daß der Müll in der Datenquelle gespeichert wird?

        Nein, ich weiß ja nicht, wie programmiert wurde. Von daher war es nur eine Vermutung und eine Frage, die ich mir gestellt habe. Wenn der mqtt.1 Client das alles speichern würde, wäre es allerdings auch nicht besser. Heißt für mich momentan nur, dass ich das im Auge behalten möchte.

        @joergeli said in Rhasspy Offline Sprachsteuerung:

        3.) Topics mit JS aufbereiten:
        Ich weiß, Du verwendest lieber Node Red
        Nein, nein, das ist durchaus überhaupt nicht so. Meine gesamten Rhasspy-Skripts basieren auf JS. Diese versuche ich seit Tagen erfolglos umzubauen. Ich verstehe von JS nur zu wenig, nicht im Prinzip, aber bei der richtigen, fehlerfreien Syntax. Deshalb habe ich gesagt, dass es mir leichter fallen würde, die alte Funktionalität mit Nodered wieder herzustellen, was ich aber gar nicht will. Ich will meine JS Skripte umbauen und weiter verwenden.

        Deine Beispiele dürften mir dabei nun wesentlich weiterhelfen. Herzlichen Dank dafür.

        @joergeli said in Rhasspy Offline Sprachsteuerung:

        Ich glaube mich zu erinnern, daß Du immer im gleichen Datenpunkt speicherst

        Nein, auch ich habe unterschiedliche Datenpunkte für die verschiedenen Aktionen. Allerdings rufe ich sehr ähnliche Funktionen, zB ChangeLight, ChangeDimmer, ChangeBlind mit Wildcart auf, also mit Change*. Und danach fische auch ich die Slots heraus, die aber je nach Inhalt von "*" unterschiedlich sein können. Das macht aber für mcih auch nicht so den großen Unterschied. Wichtig ist, dass ich das mit der Adressierung der Intents und dem Auslesen der Slots wieder hinbekomme. Mit deinen Hinweisen sehe ich aber nun, wie es gehen könnte. Getestet habe ich bislang noch nichts...

        @joergeli said in Rhasspy Offline Sprachsteuerung:

        3.) Wakeword-Erkennung:
        Das mache ich wie bei der 2.4.19, aber jetzt über die entspr. Hermes-Datenpunkte.
        Das ist für mich auch eine der wichtigen Funktionen, die ich in 2.4.19 schon hatte. Deine Ausführung stimmt mich ebenfalls hoffnungsvoll.

        @joergeli said in Rhasspy Offline Sprachsteuerung:

        4.) Hermes-LED-Control

        Hat für mich momentan auch Priorität 99. Die Skripte und Wakeword haben Vorrang.

        @joergeli said in Rhasspy Offline Sprachsteuerung:

        5.) Direkte Sprachausgabe via pico-TTS:

        Sprachausgabe war unter 2.4.19 ebenfalls kein (Software)Problem. Knifflig war die richtige Hardware-Einstellung zu finden. Ich hoffe, ich bekomme das wieder hin.

        @joergeli said in Rhasspy Offline Sprachsteuerung:

        6.) mqtt.1-Instanz trennt und verbindet sich häufig

        Das Problem hatte ich beim Testen zwischenzeitlich auch einmal. Allerdings konnte ich es relativ eindeutig mit hohem Verkehrsaufkommen korellieren. Ich habe dann auch die Topics reduziert (die standen zum Annähern ans Thema zunächst einfach auf #) und das Problem war behoben. Mit meinem Odroid habe ich allerdings auch eine ganz andere Verarbeitungsleistung zur Verfügung, als du mit deinem Pi4. Kann sein, dass der bei Last empfindlicher reagiert.

        @joergeli said in Rhasspy Offline Sprachsteuerung:

        Evtl. bringt es für Dich ja Vorteile, weil Du mit Master/Satellit arbeitest?

        Kann sein. ich habe mir zum Lernen, besser Verstehen usw einen zweiten Satelliten (Pi3 mit 3€ Mikrofon) aufgebaut. Der Setup war ein Klacks und die Performance ist ebenfalls sehr gut.

        Nun will ich testen!!!

        joergeliJ Offline
        joergeliJ Offline
        joergeli
        schrieb am zuletzt editiert von
        #192

        @tobetobe
        Hallo Thomas,

        ich wollte - hauptsächlich mir selber noch mal klar machen - , wie ich beim Parsen des json-codes auf meine Parameter, die ich ja nur durch Try & Error herausgefunden habe, gekommen bin:

        let name = empf_json.slots[0].value.value;
        let state = empf_json.slots[1].value.value;
        

        Also, Rhasspy gibt bei "schalte die wandspots ein" folgendes Intent JSON aus ( in Rhasspy GUI Click auf "Show JSON"):

        {
            "intent": {
                "name": "Lampen",
                "confidence": 1
            },
            "entities": [
                {
                    "entity": "name",
                    "value": "wandspots",
                    "value_details": {
                        "kind": "Unknown",
                        "value": "wandspots"
                    },
                    "raw_value": "wandspots",
                    "start": 12,
                    "end": 21,
                    "raw_start": 12,
                    "raw_end": 21
                },
                {
                    "entity": "state",
                    "value": "ein",
                    "value_details": {
                        "kind": "Unknown",
                        "value": "ein"
                    },
                    "raw_value": "ein",
                    "start": 22,
                    "end": 25,
                    "raw_start": 22,
                    "raw_end": 25
                }
            ],
            "slots": {
                "name": "wandspots",
                "state": "ein"
            },
            "text": "schalte die wandspots ein",
            "raw_text": "schalte die wandspots ein",
            "tokens": [
                "schalte",
                "die",
                "wandspots",
                "ein"
            ],
            "raw_tokens": [
                "schalte",
                "die",
                "wandspots",
                "ein"
            ],
            "wakeword_id": "snowboy"
        }
        

        Wenn ich das dann in JS mit

        log ("EMPF-CODE: " + empf_code);
        

        anzeigen lasse, gibt das ein (für menschliche Augen) unleserliches JSON aus:

        EMPF-CODE: {"input": "schalte die wandspots ein", "intent": {"intentName": "Lampen", "confidenceScore": 1.0}, "siteId": "volti", "id": null, "slots": [{"entity": "name", "value": {"kind": "Unknown", "value": "wandspots"}, "slotName": "name", "rawValue": "wandspots", "confidence": 1.0, "range": {"start": 12, "end": 21, "rawStart": 12, "rawEnd": 21}}, {"entity": "state", "value": {"kind": "Unknown", "value": "ein"}, "slotName": "state", "rawValue": "ein", "confidence": 1.0, "range": {"start": 22, "end": 25, "rawStart": 22, "rawEnd": 25}}], "sessionId": "volti-snowboy-c1906f0e-4a6e-4540-a5a5-6f542f3bae33", "customData": null, "asrTokens": [[{"value": "schalte", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 7, "time": null}, {"value": "die", "confidence": 1.0, "rangeStart": 8, "rangeEnd": 11, "time": null}, {"value": "wandspots", "confidence": 1.0, "rangeStart": 12, "rangeEnd": 21, "time": null}, {"value": "ein", "confidence": 1.0, "rangeStart": 22, "rangeEnd": 25, "time": null}]], "asrConfidence": null, "rawInput": "schalte die wandspots ein", "wakewordId": "snowboy"}
        

        Deshalb habe ich mir die Mühe gemacht, dieses JSON in eine Textdatei zu kopieren und mit Notepad++ zu strukturieren (d.h. Zeilenumbrüche einfügen und die entspr. Klammern halbwegs untereinander darzustellen), damit man es besser lesen kann. Da wurde mir dann auch klar, woher die beiden Parameter kommen:

        EMPF-CODE:
        {
        "input":	"schalte die wandspots ein",
        "intent": 	{	"intentName": "Lampen",
        				"confidenceScore": 1.0
        			},
        "siteId": "volti",
        "id": null,
        "slots": [
        			{ //<--- slots[0]
        				"entity": "name",
        				"value": { //<---slots[0].value
        							"kind": "Unknown",
        							"value": "wandspots"	//<------- = slots[0].value.value
        						},
        				"slotName": "name",
        				"rawValue": "wandspots",
        				"confidence": 1.0,
        				"range": {
        							"start": 12,
        							"end": 21,
        							"rawStart": 12,
        							"rawEnd": 21
        						}
        			},
        			{ //<--- slots[1]
        				"entity": "state",
        				"value": {  //<---slots[1].value
        							"kind": "Unknown",
        							"value": "ein"		//<------- = slots[1].value.value
        						},
        				"slotName": "state",
        				"rawValue": "ein",
        				"confidence": 1.0,
        				"range": {
        							"start": 22,
        							"end": 25,
        							"rawStart": 22,
        							"rawEnd": 25
        						}
        			}
        		],
        "sessionId": "volti-snowboy-36f74062-40c8-47eb-a05c-96d87fd476fb",
        "customData": null,
        "asrTokens": [
        				[
        					{
        						"value": "schalte",
        						"confidence": 1.0,
        						"rangeStart": 0,
        						"rangeEnd": 7,
        						"time": null
        					},
        					{
        						"value": "die",
        						"confidence": 1.0,
        						"rangeStart": 8,
        						"rangeEnd": 11,
        						"time": null
        					},
        					{
        						"value": "wandspots",
        						"confidence": 1.0,
        						"rangeStart": 12,
        						"rangeEnd": 21,
        						"time": null
        					},
        					{
        						"value": "ein",
        						"confidence": 1.0,
        						"rangeStart": 22,
        						"rangeEnd": 25,
        						"time": null
        					}
        				]
        			],
        "asrConfidence": null,
        "rawInput": "schalte die wandspots ein",
        "wakewordId": "snowboy"
        }
        

        Das komische dabei ist nur, daß im Intent JSON von Rhasspy folgendes steht:

            "slots": {
                "name": "wandspots",
                "state": "ein"
            },
        

        somit hatte ich zuerst vermutet, daß die Parameter so aussehen müssten:

        let name = empf_json.slots.name;
        let state = empf_json.slots.state;
        

        dem ist aber nicht so, wie man jetzt im strukturierten Code erkennen kann.
        Auch der Begriff

        "entities": [ //als Mehrzahl
        

        taucht im strukturierten Code nicht auf - für mich recht merkwürdig.

        Fazit:
        Im JS das empfangene JSON mitloggen und - auch wenn es Mühe macht - das JSON in eine Textdatei kopieren und manuell strukturieren. Das führt wohl am schnellsten zum Ziel, um die entspr. Parameter auszufiltern.

        Gruß
        Jörg

        tobetobeT 1 Antwort Letzte Antwort
        0
        • joergeliJ joergeli

          @tobetobe
          Hallo Thomas,

          ich wollte - hauptsächlich mir selber noch mal klar machen - , wie ich beim Parsen des json-codes auf meine Parameter, die ich ja nur durch Try & Error herausgefunden habe, gekommen bin:

          let name = empf_json.slots[0].value.value;
          let state = empf_json.slots[1].value.value;
          

          Also, Rhasspy gibt bei "schalte die wandspots ein" folgendes Intent JSON aus ( in Rhasspy GUI Click auf "Show JSON"):

          {
              "intent": {
                  "name": "Lampen",
                  "confidence": 1
              },
              "entities": [
                  {
                      "entity": "name",
                      "value": "wandspots",
                      "value_details": {
                          "kind": "Unknown",
                          "value": "wandspots"
                      },
                      "raw_value": "wandspots",
                      "start": 12,
                      "end": 21,
                      "raw_start": 12,
                      "raw_end": 21
                  },
                  {
                      "entity": "state",
                      "value": "ein",
                      "value_details": {
                          "kind": "Unknown",
                          "value": "ein"
                      },
                      "raw_value": "ein",
                      "start": 22,
                      "end": 25,
                      "raw_start": 22,
                      "raw_end": 25
                  }
              ],
              "slots": {
                  "name": "wandspots",
                  "state": "ein"
              },
              "text": "schalte die wandspots ein",
              "raw_text": "schalte die wandspots ein",
              "tokens": [
                  "schalte",
                  "die",
                  "wandspots",
                  "ein"
              ],
              "raw_tokens": [
                  "schalte",
                  "die",
                  "wandspots",
                  "ein"
              ],
              "wakeword_id": "snowboy"
          }
          

          Wenn ich das dann in JS mit

          log ("EMPF-CODE: " + empf_code);
          

          anzeigen lasse, gibt das ein (für menschliche Augen) unleserliches JSON aus:

          EMPF-CODE: {"input": "schalte die wandspots ein", "intent": {"intentName": "Lampen", "confidenceScore": 1.0}, "siteId": "volti", "id": null, "slots": [{"entity": "name", "value": {"kind": "Unknown", "value": "wandspots"}, "slotName": "name", "rawValue": "wandspots", "confidence": 1.0, "range": {"start": 12, "end": 21, "rawStart": 12, "rawEnd": 21}}, {"entity": "state", "value": {"kind": "Unknown", "value": "ein"}, "slotName": "state", "rawValue": "ein", "confidence": 1.0, "range": {"start": 22, "end": 25, "rawStart": 22, "rawEnd": 25}}], "sessionId": "volti-snowboy-c1906f0e-4a6e-4540-a5a5-6f542f3bae33", "customData": null, "asrTokens": [[{"value": "schalte", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 7, "time": null}, {"value": "die", "confidence": 1.0, "rangeStart": 8, "rangeEnd": 11, "time": null}, {"value": "wandspots", "confidence": 1.0, "rangeStart": 12, "rangeEnd": 21, "time": null}, {"value": "ein", "confidence": 1.0, "rangeStart": 22, "rangeEnd": 25, "time": null}]], "asrConfidence": null, "rawInput": "schalte die wandspots ein", "wakewordId": "snowboy"}
          

          Deshalb habe ich mir die Mühe gemacht, dieses JSON in eine Textdatei zu kopieren und mit Notepad++ zu strukturieren (d.h. Zeilenumbrüche einfügen und die entspr. Klammern halbwegs untereinander darzustellen), damit man es besser lesen kann. Da wurde mir dann auch klar, woher die beiden Parameter kommen:

          EMPF-CODE:
          {
          "input":	"schalte die wandspots ein",
          "intent": 	{	"intentName": "Lampen",
          				"confidenceScore": 1.0
          			},
          "siteId": "volti",
          "id": null,
          "slots": [
          			{ //<--- slots[0]
          				"entity": "name",
          				"value": { //<---slots[0].value
          							"kind": "Unknown",
          							"value": "wandspots"	//<------- = slots[0].value.value
          						},
          				"slotName": "name",
          				"rawValue": "wandspots",
          				"confidence": 1.0,
          				"range": {
          							"start": 12,
          							"end": 21,
          							"rawStart": 12,
          							"rawEnd": 21
          						}
          			},
          			{ //<--- slots[1]
          				"entity": "state",
          				"value": {  //<---slots[1].value
          							"kind": "Unknown",
          							"value": "ein"		//<------- = slots[1].value.value
          						},
          				"slotName": "state",
          				"rawValue": "ein",
          				"confidence": 1.0,
          				"range": {
          							"start": 22,
          							"end": 25,
          							"rawStart": 22,
          							"rawEnd": 25
          						}
          			}
          		],
          "sessionId": "volti-snowboy-36f74062-40c8-47eb-a05c-96d87fd476fb",
          "customData": null,
          "asrTokens": [
          				[
          					{
          						"value": "schalte",
          						"confidence": 1.0,
          						"rangeStart": 0,
          						"rangeEnd": 7,
          						"time": null
          					},
          					{
          						"value": "die",
          						"confidence": 1.0,
          						"rangeStart": 8,
          						"rangeEnd": 11,
          						"time": null
          					},
          					{
          						"value": "wandspots",
          						"confidence": 1.0,
          						"rangeStart": 12,
          						"rangeEnd": 21,
          						"time": null
          					},
          					{
          						"value": "ein",
          						"confidence": 1.0,
          						"rangeStart": 22,
          						"rangeEnd": 25,
          						"time": null
          					}
          				]
          			],
          "asrConfidence": null,
          "rawInput": "schalte die wandspots ein",
          "wakewordId": "snowboy"
          }
          

          Das komische dabei ist nur, daß im Intent JSON von Rhasspy folgendes steht:

              "slots": {
                  "name": "wandspots",
                  "state": "ein"
              },
          

          somit hatte ich zuerst vermutet, daß die Parameter so aussehen müssten:

          let name = empf_json.slots.name;
          let state = empf_json.slots.state;
          

          dem ist aber nicht so, wie man jetzt im strukturierten Code erkennen kann.
          Auch der Begriff

          "entities": [ //als Mehrzahl
          

          taucht im strukturierten Code nicht auf - für mich recht merkwürdig.

          Fazit:
          Im JS das empfangene JSON mitloggen und - auch wenn es Mühe macht - das JSON in eine Textdatei kopieren und manuell strukturieren. Das führt wohl am schnellsten zum Ziel, um die entspr. Parameter auszufiltern.

          Gruß
          Jörg

          tobetobeT Offline
          tobetobeT Offline
          tobetobe
          schrieb am zuletzt editiert von
          #193

          @joergeli
          Guten Morgen Jörg,

          ich bin gestern nicht soweit gekommen, wie ich wollte. Begonnen habe ich mit dem neuesten pull. Danach ging erst einmal garnichts mehr und ich musste die Grundfunktionen (Wakeword erkennen, Befehl entgegennehmen und Befehl verstehen) zunächst wiederherstellen. Was mir dabei geholfen hat, ist die Art, wie bei meinem Master/Sat-System die Docker-Prozesse gestartet werden. Bei mir beginnen die Aufrufe mit:

          docker run -it     -v "$HOME/...
          

          Der schöne Vorteil ist, dass man im Terminal nun alles mitverfolgen kann, was passiert, da sämtliche DEBUGs und Fehler gelistet werden. So fiel mir auf, dass auf meinem Sat irgendwelche Daten PingPong spielten. Ich musste den mqtt.1 Client abschalten, danach war es gut.

          Von daher würde ich dir auch empfehlen, mal mit diesen Parametern zu starten.

          Nun stehe ich vor der Frage, ob ich entweder meine Skripte so umbaue, dass sie alles direkt bei meinem Mosquitto abholen, oder wie ich ggf die Parameter des mqtt.1 Client verändern muss, damit dieses PingPong nicht stattfindet.

          Im ersten Fall müsste ich alles so aufbauen, wie du das mit require(http) gemacht hast, halt nur mit require(mqtt). Der zweite Fall wäre einfacher, da ich in der bekannten ioBroker-Adressierung bleibe.

          Alles nur hinderliche Steine auf dem Weg nach vorne...

          So, nun zu deinem letzten Post.

          @joergeli said in Rhasspy Offline Sprachsteuerung:

          Parameter, die ich ja nur durch Try & Error herausgefunden habe

          Mit denen liegst du ja schon mal garnicht so falsch. Was du mit direkter Adressierung [0] und [1] machst, passiert bei mir übrigens durch den Aufruf der Schleife, die die Ergebnisse der Abfragen an den entsprechenden Stellen in das Array schreibt.:

              var intentResult = 'mqtt.1.hermes.intent.Change*';
              var intentArray = [];
          
              for(var i = 0; i < intentResult.length; i++)
              {
              console.log(intentResult[i]);
              intentArray.push(intentResult[i]);
              }
          

          Das aber nur am Rande.

          @joergeli said in Rhasspy Offline Sprachsteuerung:

          Rhasspy gibt bei "schalte die wandspots ein" folgendes Intent JSON aus ( in Rhasspy GUI Click auf "Show JSON"):

          Diese Ausgabe darfst du nicht mit den JSON-Rohdaten verwechseln. Sie ist bereits von Rhasspy aufbereitet, damit es diese schön leserliche Struktur gibt. Durch die Aufbereitung kommt auch der Begriff "entities" im Plural herein, der ja in den Rohdaten nicht auftaucht, wie du richtig erkannt hast.

          @joergeli said in Rhasspy Offline Sprachsteuerung:

          Deshalb habe ich mir die Mühe gemacht, ... Da wurde mir dann auch klar, woher die beiden Parameter kommen:

          Absolut hilfreich. Die gleiche, oder zumindest eine sehr ähnliche Ausgabe dieses Roh-JSON bekommst du übrigens auch im Terminal, sodass du dir den separaten Aufruf sparen kannst.

          @joergeli said in Rhasspy Offline Sprachsteuerung:

          Das komische dabei ist nur, daß im Intent JSON von Rhasspy folgendes steht:

          Nachvolliziehbar, da diese Daten ja für diese Darstellung aufbereitet wurden. Im Prinzip ist dies also eine Liste der im Befehl verwendeten Slots, die wiederum jeweils aus der Entity (vor dem Doppelpunkt) und dem Value (nach dem Doppelpunkt) bestehen. Also erster Slot Entity "name" mit dem Value "Wandspots" und zweiter Slot mit Entity "state" mit dem Value "ein".

          Soweit verstehe ich das alles. Ich hoffe, meine Überlegungen konnten dir weiter helfen.

          Grüße
          Thomas

          Beste Grüße
          tobetobe

          joergeliJ 1 Antwort Letzte Antwort
          0
          • tobetobeT tobetobe

            @joergeli
            Guten Morgen Jörg,

            ich bin gestern nicht soweit gekommen, wie ich wollte. Begonnen habe ich mit dem neuesten pull. Danach ging erst einmal garnichts mehr und ich musste die Grundfunktionen (Wakeword erkennen, Befehl entgegennehmen und Befehl verstehen) zunächst wiederherstellen. Was mir dabei geholfen hat, ist die Art, wie bei meinem Master/Sat-System die Docker-Prozesse gestartet werden. Bei mir beginnen die Aufrufe mit:

            docker run -it     -v "$HOME/...
            

            Der schöne Vorteil ist, dass man im Terminal nun alles mitverfolgen kann, was passiert, da sämtliche DEBUGs und Fehler gelistet werden. So fiel mir auf, dass auf meinem Sat irgendwelche Daten PingPong spielten. Ich musste den mqtt.1 Client abschalten, danach war es gut.

            Von daher würde ich dir auch empfehlen, mal mit diesen Parametern zu starten.

            Nun stehe ich vor der Frage, ob ich entweder meine Skripte so umbaue, dass sie alles direkt bei meinem Mosquitto abholen, oder wie ich ggf die Parameter des mqtt.1 Client verändern muss, damit dieses PingPong nicht stattfindet.

            Im ersten Fall müsste ich alles so aufbauen, wie du das mit require(http) gemacht hast, halt nur mit require(mqtt). Der zweite Fall wäre einfacher, da ich in der bekannten ioBroker-Adressierung bleibe.

            Alles nur hinderliche Steine auf dem Weg nach vorne...

            So, nun zu deinem letzten Post.

            @joergeli said in Rhasspy Offline Sprachsteuerung:

            Parameter, die ich ja nur durch Try & Error herausgefunden habe

            Mit denen liegst du ja schon mal garnicht so falsch. Was du mit direkter Adressierung [0] und [1] machst, passiert bei mir übrigens durch den Aufruf der Schleife, die die Ergebnisse der Abfragen an den entsprechenden Stellen in das Array schreibt.:

                var intentResult = 'mqtt.1.hermes.intent.Change*';
                var intentArray = [];
            
                for(var i = 0; i < intentResult.length; i++)
                {
                console.log(intentResult[i]);
                intentArray.push(intentResult[i]);
                }
            

            Das aber nur am Rande.

            @joergeli said in Rhasspy Offline Sprachsteuerung:

            Rhasspy gibt bei "schalte die wandspots ein" folgendes Intent JSON aus ( in Rhasspy GUI Click auf "Show JSON"):

            Diese Ausgabe darfst du nicht mit den JSON-Rohdaten verwechseln. Sie ist bereits von Rhasspy aufbereitet, damit es diese schön leserliche Struktur gibt. Durch die Aufbereitung kommt auch der Begriff "entities" im Plural herein, der ja in den Rohdaten nicht auftaucht, wie du richtig erkannt hast.

            @joergeli said in Rhasspy Offline Sprachsteuerung:

            Deshalb habe ich mir die Mühe gemacht, ... Da wurde mir dann auch klar, woher die beiden Parameter kommen:

            Absolut hilfreich. Die gleiche, oder zumindest eine sehr ähnliche Ausgabe dieses Roh-JSON bekommst du übrigens auch im Terminal, sodass du dir den separaten Aufruf sparen kannst.

            @joergeli said in Rhasspy Offline Sprachsteuerung:

            Das komische dabei ist nur, daß im Intent JSON von Rhasspy folgendes steht:

            Nachvolliziehbar, da diese Daten ja für diese Darstellung aufbereitet wurden. Im Prinzip ist dies also eine Liste der im Befehl verwendeten Slots, die wiederum jeweils aus der Entity (vor dem Doppelpunkt) und dem Value (nach dem Doppelpunkt) bestehen. Also erster Slot Entity "name" mit dem Value "Wandspots" und zweiter Slot mit Entity "state" mit dem Value "ein".

            Soweit verstehe ich das alles. Ich hoffe, meine Überlegungen konnten dir weiter helfen.

            Grüße
            Thomas

            joergeliJ Offline
            joergeliJ Offline
            joergeli
            schrieb am zuletzt editiert von
            #194

            @tobetobe
            Hallo Thomas,

            ich habe den Rhasspy-Docker mal in debug-Modus ( docker run -it -p ......) gestartet.
            Bei mir findet aber kein "PingPong" statt, sondern es tut sich - wie erwartet - nur etwas, wenn ich ein Kommando spreche.
            Hier mal meine mqtt.1-Einstellungen:
            mqtt1.jpg
            Ich habe nur "Publish bei Änderung" aktiviert.
            Subscriben tut sich mein mqtt.1 auf den auf dem Rhasspy-Raspi laufenden Mosquitto (Port 1883).

            @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

            Diese Ausgabe darfst du nicht mit den JSON-Rohdaten verwechseln. Sie ist bereits von Rhasspy aufbereitet, damit es diese schön leserliche Struktur gibt.

            OK, verstanden. Das nutzt mir aber nicht wirklich, da ich für die ioBroker-Datenpunkte ja die Rohdaten brauche, oder?

            @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

            Die gleiche, oder zumindest eine sehr ähnliche Ausgabe dieses Roh-JSON bekommst du übrigens auch im Terminal, sodass du dir den separaten Aufruf sparen kannst.

            Naja, das Debug-Log muss man m.E. aber mehrfach inspizieren, um die entspr. Datenpunkte zu erkennen.
            Ist aber eigentlich egal, denn wenn man die Slots einmalig ermittelt hat, gelten sie analog ja auch für die anderen Datenpunkte. Also nur einmaliger Arbeitsaufwand.

            Es führen halt viele Wege nach Rom ...

            Gruß
            Jörg

            tobetobeT 2 Antworten Letzte Antwort
            0
            • joergeliJ joergeli

              @tobetobe
              Hallo Thomas,

              ich habe den Rhasspy-Docker mal in debug-Modus ( docker run -it -p ......) gestartet.
              Bei mir findet aber kein "PingPong" statt, sondern es tut sich - wie erwartet - nur etwas, wenn ich ein Kommando spreche.
              Hier mal meine mqtt.1-Einstellungen:
              mqtt1.jpg
              Ich habe nur "Publish bei Änderung" aktiviert.
              Subscriben tut sich mein mqtt.1 auf den auf dem Rhasspy-Raspi laufenden Mosquitto (Port 1883).

              @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

              Diese Ausgabe darfst du nicht mit den JSON-Rohdaten verwechseln. Sie ist bereits von Rhasspy aufbereitet, damit es diese schön leserliche Struktur gibt.

              OK, verstanden. Das nutzt mir aber nicht wirklich, da ich für die ioBroker-Datenpunkte ja die Rohdaten brauche, oder?

              @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

              Die gleiche, oder zumindest eine sehr ähnliche Ausgabe dieses Roh-JSON bekommst du übrigens auch im Terminal, sodass du dir den separaten Aufruf sparen kannst.

              Naja, das Debug-Log muss man m.E. aber mehrfach inspizieren, um die entspr. Datenpunkte zu erkennen.
              Ist aber eigentlich egal, denn wenn man die Slots einmalig ermittelt hat, gelten sie analog ja auch für die anderen Datenpunkte. Also nur einmaliger Arbeitsaufwand.

              Es führen halt viele Wege nach Rom ...

              Gruß
              Jörg

              tobetobeT Offline
              tobetobeT Offline
              tobetobe
              schrieb am zuletzt editiert von
              #195

              Hallo Jörg,

              @joergeli said in Rhasspy Offline Sprachsteuerung:

              Ich habe nur "Publish bei Änderung" aktiviert.

              Das hat zumindest soweit geholfen, dass der PingPong aufgehört hat. Dafür erhalte ich jetzt die Fehlermeldung

              [ERROR:2020-04-29 20:23:26,640] asyncio: Task exception was never retrieved
              future: <Task finished coro=<HermesClient.publish_all() done, defined at /usr/lib/rhasspy-voltron/rhasspy-hermes/rhasspyhermes/client.py:365> exception=AssertionError('No session')>
              Traceback (most recent call last):
                File "/usr/lib/rhasspy-voltron/rhasspy-hermes/rhasspyhermes/client.py", line 367, in publish_all
                  async for maybe_message in async_generator:
                File "/usr/lib/rhasspy-voltron/rhasspy-dialogue-hermes/rhasspydialogue_hermes/__init__.py", line 649, in on_message
                  async for end_result in self.handle_end(message):
                File "/usr/lib/rhasspy-voltron/rhasspy-dialogue-hermes/rhasspydialogue_hermes/__init__.py", line 361, in handle_end
                  assert self.session is not None, "No session"
              AssertionError: No session
              

              Ich bin diesem Fehler noch nicht weiter nachgegangen. Momentan scheint er mir allerdings nicht besonders relevant zu sein, da die Intents korrekt erkannt werden und der entsprechende Datenpunkt auf dem mqtt.1 wird ebenfalls richtig akzualisiert.Auch hängt sich Rhasspy nicht auf. Soweit also alles gut.

              Dieser Zustand ist für mich ein ganz entscheidender Fortschritt, da ich nun die bestehenden Skripte an mqtt.1 anpassen kann. Ich habe mich heute fast den ganzen Tag mit MQTT und der Subscription von Topics befasst. Das ist eine ganz andere und damit neue Welt, die für mich wesentlich schwieriger zu erschließen ist. Immerhin kommt nach Änderung der Adresse

              Von: mqtt.0.rhasspy.intent.Change*
              Auf; mqtt.1.hermes.intent,change*
              

              im Debug-Fenster der Skript-Engine der komplette JSON-String im Rohformat an. Hier die relevanten Slot-Informationen rauszufischen ist leider aufwändiger, als bei der damaligen Struktur mit mqtt.0.rhasspy. Machbar müsste das aber sein.

              @joergeli said in Rhasspy Offline Sprachsteuerung:

              OK, verstanden. Das nutzt mir aber nicht wirklich, da ich für die ioBroker-Datenpunkte ja die Rohdaten brauche, oder?

              Damit wäre diese Frage eigentlich auch beantwortet: Ja, man braucht die Rohdaten. (Zumindest soweit ich die Sache verstehe).

              Gruß
              Thomas

              Beste Grüße
              tobetobe

              1 Antwort Letzte Antwort
              0
              • joergeliJ joergeli

                @tobetobe
                Hallo Thomas,

                ich habe den Rhasspy-Docker mal in debug-Modus ( docker run -it -p ......) gestartet.
                Bei mir findet aber kein "PingPong" statt, sondern es tut sich - wie erwartet - nur etwas, wenn ich ein Kommando spreche.
                Hier mal meine mqtt.1-Einstellungen:
                mqtt1.jpg
                Ich habe nur "Publish bei Änderung" aktiviert.
                Subscriben tut sich mein mqtt.1 auf den auf dem Rhasspy-Raspi laufenden Mosquitto (Port 1883).

                @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                Diese Ausgabe darfst du nicht mit den JSON-Rohdaten verwechseln. Sie ist bereits von Rhasspy aufbereitet, damit es diese schön leserliche Struktur gibt.

                OK, verstanden. Das nutzt mir aber nicht wirklich, da ich für die ioBroker-Datenpunkte ja die Rohdaten brauche, oder?

                @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                Die gleiche, oder zumindest eine sehr ähnliche Ausgabe dieses Roh-JSON bekommst du übrigens auch im Terminal, sodass du dir den separaten Aufruf sparen kannst.

                Naja, das Debug-Log muss man m.E. aber mehrfach inspizieren, um die entspr. Datenpunkte zu erkennen.
                Ist aber eigentlich egal, denn wenn man die Slots einmalig ermittelt hat, gelten sie analog ja auch für die anderen Datenpunkte. Also nur einmaliger Arbeitsaufwand.

                Es führen halt viele Wege nach Rom ...

                Gruß
                Jörg

                tobetobeT Offline
                tobetobeT Offline
                tobetobe
                schrieb am zuletzt editiert von
                #196

                Hallo Jörg,

                nochmal ein Nachsatz hierzu:

                @joergeli said in Rhasspy Offline Sprachsteuerung:

                denn wenn man die Slots einmalig ermittelt hat,

                Ich habe mich gerade noch ein wenig mit den Nodred Skripten von Kaykoch aus dem Rhaspy-Forum auseinandergesetzt.

                Er adressiert hermes/inten/# und erhält auf den Befehl "Öffne das Badezimmerfenster für 10 Minuten" durch Verarbeitung mit einem kleinen Javascript folgende Ausgabe:

                hermes/intent/OpenWindow : msg : Object
                object
                topic: "hermes/intent/OpenWindow"
                payload: object
                qos: 0
                retain: false
                _msgid: "bbdd6fed.e2e47"
                slots: object
                room: "Satellite1"
                device: "hm-rpc.0.QEQ1234567.1"
                time: 10
                unit: "minuten"
                value: "100"
                state: ".LEVEL"
                

                So sieht das Skript aus:

                var slots = {"room":msg.payload.siteId}
                for (var i in msg.payload.slots)
                     {
                      slots[msg.payload.slots[i].slotName] = msg.payload.slots[i].value.value
                     }
                msg.slots = slots
                
                return msg
                

                Die Länge von slots[i] und damit die Anzahl der Slots hängt vom jeweiligen Befehl ab. Hier habe ich als Beispiel einen langen Befehl mit 5 Slots ausgewählt ("Room" zähle ich nicht mit). Meine Befehle enthalten einen bis 5 Slots, was alles durch dieses kleine Skript abgedeckt wird.

                An diesem Punkt werde ich morgen fortsetzen.

                Gruß
                Thomas

                Beste Grüße
                tobetobe

                joergeliJ 1 Antwort Letzte Antwort
                0
                • tobetobeT tobetobe

                  Hallo Jörg,

                  nochmal ein Nachsatz hierzu:

                  @joergeli said in Rhasspy Offline Sprachsteuerung:

                  denn wenn man die Slots einmalig ermittelt hat,

                  Ich habe mich gerade noch ein wenig mit den Nodred Skripten von Kaykoch aus dem Rhaspy-Forum auseinandergesetzt.

                  Er adressiert hermes/inten/# und erhält auf den Befehl "Öffne das Badezimmerfenster für 10 Minuten" durch Verarbeitung mit einem kleinen Javascript folgende Ausgabe:

                  hermes/intent/OpenWindow : msg : Object
                  object
                  topic: "hermes/intent/OpenWindow"
                  payload: object
                  qos: 0
                  retain: false
                  _msgid: "bbdd6fed.e2e47"
                  slots: object
                  room: "Satellite1"
                  device: "hm-rpc.0.QEQ1234567.1"
                  time: 10
                  unit: "minuten"
                  value: "100"
                  state: ".LEVEL"
                  

                  So sieht das Skript aus:

                  var slots = {"room":msg.payload.siteId}
                  for (var i in msg.payload.slots)
                       {
                        slots[msg.payload.slots[i].slotName] = msg.payload.slots[i].value.value
                       }
                  msg.slots = slots
                  
                  return msg
                  

                  Die Länge von slots[i] und damit die Anzahl der Slots hängt vom jeweiligen Befehl ab. Hier habe ich als Beispiel einen langen Befehl mit 5 Slots ausgewählt ("Room" zähle ich nicht mit). Meine Befehle enthalten einen bis 5 Slots, was alles durch dieses kleine Skript abgedeckt wird.

                  An diesem Punkt werde ich morgen fortsetzen.

                  Gruß
                  Thomas

                  joergeliJ Offline
                  joergeliJ Offline
                  joergeli
                  schrieb am zuletzt editiert von joergeli
                  #197

                  @tobetobe
                  Hallo Thomas,

                  @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                  Die Länge von slots[i] und damit die Anzahl der Slots hängt vom jeweiligen Befehl ab. Hier habe ich als Beispiel einen langen Befehl mit 5 Slots ausgewählt ("Room" zähle ich nicht mit). Meine Befehle enthalten einen bis 5 Slots, was alles durch dieses kleine Skript abgedeckt wird.

                  Das verstehe ich soweit.
                  Du bekommst im Topic "OpenWindow" dann z.B. 5 Datenpunkte zur weiteren Auswertung:

                  device: "hm-rpc.0.QEQ1234567.1"
                  time: 10
                  unit: "minuten"
                  value: "100"
                  state: ".LEVEL"
                  

                  Die Herausforderung bei der weiteren Auswertung wird dann sein - wenn ich nicht zu kompliziert denke:
                  Prüfen, wie viele slots mit was gefüllt/geändert wurden.
                  Könnte ja evtl. auch so aussehen, oder?:

                  device: "xyz"
                  state: "off"
                  

                  Dann müssten bei einem neuen Kommando/Message-Empfang erst mal alle Datenpunkte geleert, bzw. überschrieben werden, weil die vorhandenen Datenpunkte ja weiterhin noch existent sind:

                  device: "xyz"
                  time: ""
                  unit: ""
                  value: ""
                  state: "off"
                  

                  Dann müssten - in diesem Beispiel - nur device und state anhand ihres Inhaltes ausgewertet werden und dann die entspr. Aktion triggern.
                  Da würden dann IMHO sehr viele if-Abfragen benötigt, weil ja auch andere Kombinationen möglich wären (hier mal als Pseudo-Code):

                  if      (device == "xyz" && state == "off"  && time == "" && unit == "" && value == "") { --> schalte device xyz aus}
                  else if (device == "xyz" && state == "on" && time == "" && unit == "" && value == "")  {--> schalte device xyz ein}
                  
                  else if (device == "abc" && state == "off"  && time == "" && unit == "" && value == "")  {--> schalte device abc aus}
                  else if (device == "abc" && state == "on"  && time == "" && unit == "" && value == "")  {--> schalte device abc ein}
                  
                  else if (device == "efg" && state == ""  && time == "" && unit == "" && value == "50")  {--> setze device efg auf 50}
                  else if (device == "efg" && state == ""  && time == "" && unit == "" && value == "100")  {--> setze device efg auf 100}
                  
                  else if (device == "efg" && state == ""  && time == "10" && unit == "sekunden" && value == "50")  {--> setze device efg für 10s auf 50}
                  else if (device == "efg" && state == ""  && time == "30 " && unit == "sekunden" && value == "100")  {--> setze device efg für 30s auf 100}
                  .
                  .
                  etc.
                  .
                  .
                  
                  

                  Das gibt, wenn man es auf diese Weise prüfen würde, einen Wust an möglichen Kombinationen.
                  Ich würde sagen, das ist ein Fall für die JS-Cracks, die das bestimmt eleganter lösen können, als ich.

                  Vorschlag:
                  Einen neuen Thread im Unterforum JavaScript aufmachen mit der Problemstellung - sinngemäß -:
                  Ich habe hier 1-5 Variablen, die in jeder beliebigen Kombination miteinander verknüpft werden könnten.
                  Wie ermittele ich daraus eine eindeutige Ausgabe?

                  Gruß
                  Jörg

                  tobetobeT 4 Antworten Letzte Antwort
                  0
                  • joergeliJ joergeli

                    @tobetobe
                    Hallo Thomas,

                    @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                    Die Länge von slots[i] und damit die Anzahl der Slots hängt vom jeweiligen Befehl ab. Hier habe ich als Beispiel einen langen Befehl mit 5 Slots ausgewählt ("Room" zähle ich nicht mit). Meine Befehle enthalten einen bis 5 Slots, was alles durch dieses kleine Skript abgedeckt wird.

                    Das verstehe ich soweit.
                    Du bekommst im Topic "OpenWindow" dann z.B. 5 Datenpunkte zur weiteren Auswertung:

                    device: "hm-rpc.0.QEQ1234567.1"
                    time: 10
                    unit: "minuten"
                    value: "100"
                    state: ".LEVEL"
                    

                    Die Herausforderung bei der weiteren Auswertung wird dann sein - wenn ich nicht zu kompliziert denke:
                    Prüfen, wie viele slots mit was gefüllt/geändert wurden.
                    Könnte ja evtl. auch so aussehen, oder?:

                    device: "xyz"
                    state: "off"
                    

                    Dann müssten bei einem neuen Kommando/Message-Empfang erst mal alle Datenpunkte geleert, bzw. überschrieben werden, weil die vorhandenen Datenpunkte ja weiterhin noch existent sind:

                    device: "xyz"
                    time: ""
                    unit: ""
                    value: ""
                    state: "off"
                    

                    Dann müssten - in diesem Beispiel - nur device und state anhand ihres Inhaltes ausgewertet werden und dann die entspr. Aktion triggern.
                    Da würden dann IMHO sehr viele if-Abfragen benötigt, weil ja auch andere Kombinationen möglich wären (hier mal als Pseudo-Code):

                    if      (device == "xyz" && state == "off"  && time == "" && unit == "" && value == "") { --> schalte device xyz aus}
                    else if (device == "xyz" && state == "on" && time == "" && unit == "" && value == "")  {--> schalte device xyz ein}
                    
                    else if (device == "abc" && state == "off"  && time == "" && unit == "" && value == "")  {--> schalte device abc aus}
                    else if (device == "abc" && state == "on"  && time == "" && unit == "" && value == "")  {--> schalte device abc ein}
                    
                    else if (device == "efg" && state == ""  && time == "" && unit == "" && value == "50")  {--> setze device efg auf 50}
                    else if (device == "efg" && state == ""  && time == "" && unit == "" && value == "100")  {--> setze device efg auf 100}
                    
                    else if (device == "efg" && state == ""  && time == "10" && unit == "sekunden" && value == "50")  {--> setze device efg für 10s auf 50}
                    else if (device == "efg" && state == ""  && time == "30 " && unit == "sekunden" && value == "100")  {--> setze device efg für 30s auf 100}
                    .
                    .
                    etc.
                    .
                    .
                    
                    

                    Das gibt, wenn man es auf diese Weise prüfen würde, einen Wust an möglichen Kombinationen.
                    Ich würde sagen, das ist ein Fall für die JS-Cracks, die das bestimmt eleganter lösen können, als ich.

                    Vorschlag:
                    Einen neuen Thread im Unterforum JavaScript aufmachen mit der Problemstellung - sinngemäß -:
                    Ich habe hier 1-5 Variablen, die in jeder beliebigen Kombination miteinander verknüpft werden könnten.
                    Wie ermittele ich daraus eine eindeutige Ausgabe?

                    Gruß
                    Jörg

                    tobetobeT Offline
                    tobetobeT Offline
                    tobetobe
                    schrieb am zuletzt editiert von
                    #198

                    @joergeli
                    Guten Morgen,

                    ich kann wegen eines Termins erst im Laufe des Vormittages antworten, habe aber noch einige Überlegungen hierzu

                    Beste Grüße
                    tobetobe

                    1 Antwort Letzte Antwort
                    0
                    • joergeliJ joergeli

                      @tobetobe
                      Hallo Thomas,

                      @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                      Die Länge von slots[i] und damit die Anzahl der Slots hängt vom jeweiligen Befehl ab. Hier habe ich als Beispiel einen langen Befehl mit 5 Slots ausgewählt ("Room" zähle ich nicht mit). Meine Befehle enthalten einen bis 5 Slots, was alles durch dieses kleine Skript abgedeckt wird.

                      Das verstehe ich soweit.
                      Du bekommst im Topic "OpenWindow" dann z.B. 5 Datenpunkte zur weiteren Auswertung:

                      device: "hm-rpc.0.QEQ1234567.1"
                      time: 10
                      unit: "minuten"
                      value: "100"
                      state: ".LEVEL"
                      

                      Die Herausforderung bei der weiteren Auswertung wird dann sein - wenn ich nicht zu kompliziert denke:
                      Prüfen, wie viele slots mit was gefüllt/geändert wurden.
                      Könnte ja evtl. auch so aussehen, oder?:

                      device: "xyz"
                      state: "off"
                      

                      Dann müssten bei einem neuen Kommando/Message-Empfang erst mal alle Datenpunkte geleert, bzw. überschrieben werden, weil die vorhandenen Datenpunkte ja weiterhin noch existent sind:

                      device: "xyz"
                      time: ""
                      unit: ""
                      value: ""
                      state: "off"
                      

                      Dann müssten - in diesem Beispiel - nur device und state anhand ihres Inhaltes ausgewertet werden und dann die entspr. Aktion triggern.
                      Da würden dann IMHO sehr viele if-Abfragen benötigt, weil ja auch andere Kombinationen möglich wären (hier mal als Pseudo-Code):

                      if      (device == "xyz" && state == "off"  && time == "" && unit == "" && value == "") { --> schalte device xyz aus}
                      else if (device == "xyz" && state == "on" && time == "" && unit == "" && value == "")  {--> schalte device xyz ein}
                      
                      else if (device == "abc" && state == "off"  && time == "" && unit == "" && value == "")  {--> schalte device abc aus}
                      else if (device == "abc" && state == "on"  && time == "" && unit == "" && value == "")  {--> schalte device abc ein}
                      
                      else if (device == "efg" && state == ""  && time == "" && unit == "" && value == "50")  {--> setze device efg auf 50}
                      else if (device == "efg" && state == ""  && time == "" && unit == "" && value == "100")  {--> setze device efg auf 100}
                      
                      else if (device == "efg" && state == ""  && time == "10" && unit == "sekunden" && value == "50")  {--> setze device efg für 10s auf 50}
                      else if (device == "efg" && state == ""  && time == "30 " && unit == "sekunden" && value == "100")  {--> setze device efg für 30s auf 100}
                      .
                      .
                      etc.
                      .
                      .
                      
                      

                      Das gibt, wenn man es auf diese Weise prüfen würde, einen Wust an möglichen Kombinationen.
                      Ich würde sagen, das ist ein Fall für die JS-Cracks, die das bestimmt eleganter lösen können, als ich.

                      Vorschlag:
                      Einen neuen Thread im Unterforum JavaScript aufmachen mit der Problemstellung - sinngemäß -:
                      Ich habe hier 1-5 Variablen, die in jeder beliebigen Kombination miteinander verknüpft werden könnten.
                      Wie ermittele ich daraus eine eindeutige Ausgabe?

                      Gruß
                      Jörg

                      tobetobeT Offline
                      tobetobeT Offline
                      tobetobe
                      schrieb am zuletzt editiert von
                      #199

                      @joergeli
                      So, da bin ich wieder.

                      @joergeli said in Rhasspy Offline Sprachsteuerung:

                      Vorschlag:
                      Einen neuen Thread im Unterforum JavaScript aufmachen

                      Find ich gut. Mit meinen Kenntnissen würde ich ewig brauchen. Allerdings sollten wir uns, wenn möglich, auf eine gemeinsame Aufgabenstellung einigen, die die Grundlage für individuelle Anpassungen darstellt. damit wir das Forum nicht überfordern.

                      Dazu zwei ganz zentrale Fragestellungen:

                      1. Wo holen wir die Daten ab? Direkt beim Mosquitto-Broker oder bei einem mqtt-Client, der als Adapter auf ioBroker läuft? Diese Frage hat ganz erheblichen Einfluss auf die Programmierung. Bei Mosquitto geht das über den Befehl "client.on(xxx), bei ioBroker über klassisch "on({id...". Persönlich würde ich Mosquitto aus folgenden Gründen bevorzugen: Eine Instanz weniger, die am Prozess beteiligt ist, um die man sich schon nicht mehr kümmern muss und die auch keine Fehlerquelle mehr darstellt, wenn sie entfällt (ich meine damit mqtt.1 Client). Zudem weniger Last auf ioBroker,

                      2. Welche Daten sollen "abgeholt" werden? Primär geht es doch um die Intents, oder? Wenn deren Procesing fertig programmiert ist, sollten wir selbst in der Lage sein, die kleineren Dinge, wie Wakeword-Erkennung abzuholen. Oder was meinst du? Zu den relevanten Datenpunkten habe ich mir gerade noch einmal die Ergebnisse, die aus Node-Red kommen, angeschaut. Von daher käme ich auf folgende Liste von Datenpunkten, die bereitgestellt werden müssten:

                      a) Allgemeine Objekte:

                      • Der Intent-Name, zB ChangeDimmerLevel (entspricht dem Namen des Sentence aus Rhasspy)

                      • Die SiteID (ggf. für Zukünftiges)

                      b) als Objekte aus den Slots:

                      • n Objekte, die als Variable in ein Array geschrieben werden (zurzeit n = 1 bis 5, sollte aber einfach dynamisch sein, falls man mal etwas an den Sentences ändert, oder neue hinzukommen

                      Im Prinzip würde es doch reichen, wenn uns jemand diese "Abholung" programmiert, nicht wahr? Die Umsetzung der einzelnen Variablen, wenn man sie erst einmal hat, in eine Anweisung an ioBroker sollte dann eigentlich kein Problem mehr darstellen. Dafür haben wir beide ja bereits Code.

                      Was meinst Du?

                      Gruß
                      Thomas

                      Beste Grüße
                      tobetobe

                      joergeliJ 1 Antwort Letzte Antwort
                      0
                      • joergeliJ joergeli

                        @tobetobe
                        Hallo Thomas,

                        @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                        Die Länge von slots[i] und damit die Anzahl der Slots hängt vom jeweiligen Befehl ab. Hier habe ich als Beispiel einen langen Befehl mit 5 Slots ausgewählt ("Room" zähle ich nicht mit). Meine Befehle enthalten einen bis 5 Slots, was alles durch dieses kleine Skript abgedeckt wird.

                        Das verstehe ich soweit.
                        Du bekommst im Topic "OpenWindow" dann z.B. 5 Datenpunkte zur weiteren Auswertung:

                        device: "hm-rpc.0.QEQ1234567.1"
                        time: 10
                        unit: "minuten"
                        value: "100"
                        state: ".LEVEL"
                        

                        Die Herausforderung bei der weiteren Auswertung wird dann sein - wenn ich nicht zu kompliziert denke:
                        Prüfen, wie viele slots mit was gefüllt/geändert wurden.
                        Könnte ja evtl. auch so aussehen, oder?:

                        device: "xyz"
                        state: "off"
                        

                        Dann müssten bei einem neuen Kommando/Message-Empfang erst mal alle Datenpunkte geleert, bzw. überschrieben werden, weil die vorhandenen Datenpunkte ja weiterhin noch existent sind:

                        device: "xyz"
                        time: ""
                        unit: ""
                        value: ""
                        state: "off"
                        

                        Dann müssten - in diesem Beispiel - nur device und state anhand ihres Inhaltes ausgewertet werden und dann die entspr. Aktion triggern.
                        Da würden dann IMHO sehr viele if-Abfragen benötigt, weil ja auch andere Kombinationen möglich wären (hier mal als Pseudo-Code):

                        if      (device == "xyz" && state == "off"  && time == "" && unit == "" && value == "") { --> schalte device xyz aus}
                        else if (device == "xyz" && state == "on" && time == "" && unit == "" && value == "")  {--> schalte device xyz ein}
                        
                        else if (device == "abc" && state == "off"  && time == "" && unit == "" && value == "")  {--> schalte device abc aus}
                        else if (device == "abc" && state == "on"  && time == "" && unit == "" && value == "")  {--> schalte device abc ein}
                        
                        else if (device == "efg" && state == ""  && time == "" && unit == "" && value == "50")  {--> setze device efg auf 50}
                        else if (device == "efg" && state == ""  && time == "" && unit == "" && value == "100")  {--> setze device efg auf 100}
                        
                        else if (device == "efg" && state == ""  && time == "10" && unit == "sekunden" && value == "50")  {--> setze device efg für 10s auf 50}
                        else if (device == "efg" && state == ""  && time == "30 " && unit == "sekunden" && value == "100")  {--> setze device efg für 30s auf 100}
                        .
                        .
                        etc.
                        .
                        .
                        
                        

                        Das gibt, wenn man es auf diese Weise prüfen würde, einen Wust an möglichen Kombinationen.
                        Ich würde sagen, das ist ein Fall für die JS-Cracks, die das bestimmt eleganter lösen können, als ich.

                        Vorschlag:
                        Einen neuen Thread im Unterforum JavaScript aufmachen mit der Problemstellung - sinngemäß -:
                        Ich habe hier 1-5 Variablen, die in jeder beliebigen Kombination miteinander verknüpft werden könnten.
                        Wie ermittele ich daraus eine eindeutige Ausgabe?

                        Gruß
                        Jörg

                        tobetobeT Offline
                        tobetobeT Offline
                        tobetobe
                        schrieb am zuletzt editiert von
                        #200

                        @joergeli

                        Hallo Jörg,

                        im Nachgang zu meinem Posting soeben habe ich mir nochmals meine Ergebnisse des vergangenen Abends zu Gemüte geführt. Ich möchte dir den aktuellen Stand meiner selbst herbeigequälten Ergebnisse nicht vorenthalten.

                        var mqtt = require('mqtt')
                        var client  = mqtt.connect('mqtt://192.xxx')
                        var topic_list='hermes/intent/ChangeDimmerLevel'//, 'hermes/intent/ChangeBlindLevel']
                        var topic_wake   = 'hermes/asr/startListening';
                        var topic_befehl =  'hermes/asr/textCaptured';
                        var topic_unerkannt = 'hermes/nlu/intentNotRecognized';
                        
                        client.subscribe(topic_list,{qos:1});
                        client.subscribe(topic_wake,{qos:1});
                        client.subscribe(topic_befehl,{qos:1});
                        client.subscribe(topic_unerkannt,{qos:1});
                        
                        console.log("connected flag  " + client.connected);
                        
                        //handle incoming messages
                        client.on('packetreceive',function(topic_list, packet){
                        	console.log("message is "+ packet);
                        	console.log("topic is "+ topic_list);
                        });
                        
                        
                        client.on("connect",function(){	
                        console.log("connected  "+ client.connected)});
                        
                        
                        client.on('connect', function () {
                          client.subscribe('presence', function (err) {
                            if (!err) {
                              client.publish('presence', 'Hello mqtt')
                              sendTo("telegram.0", "send", {text: ('published'), chatId: 'nnn'});
                            }
                          })
                        })
                        
                        client.on('message', function (topic_list, message) {
                          // message is Buffer
                          console.log(message.toString())
                          sendTo("telegram.0", "send", {text: (message.toString()), chatId: 'nnn'});
                          changeDimmer();
                        //  client.end()
                        })
                        
                        
                        client.on('message', function (topic_wake, message) {
                          // message is Buffer
                          console.log(message.toString())
                          sendTo("telegram.0", "send", {text: (message.toString()), chatId: 'nnn'});
                          wakeword();
                        //  client.end()
                        })
                        
                        
                        function wakeword(){
                             sendTo("telegram.0", "send", {text: ('Snowboy erkannt'), chatId: 'nnn'});
                                }
                        
                        function changeDimmer(){
                             sendTo("telegram.0", "send", {text: ('Dimmer gesetzt'), chatId: 'nnn'});
                                }
                        

                        Mit diesen Skriptschnipseln bekomme ich immerhin schon mal die JSON-Rohdaten beim Mosquitto abgeholt und ins Debug-Fenster bzw auch an Telegram geschickt. Somit funktioniert der Zugriff auf die Intents schon mal prinzipiell. Ich schaue mal, ob ich nicht auch die Schleife zur Abholung der Slots selbst hinbekomme. Wenn das nix wird, können wir immer noch einen neuen Post eröffnen.

                        Vielleicht möchtest du dies aber auch aufgreifen?

                        Gruß
                        Thomas

                        Beste Grüße
                        tobetobe

                        1 Antwort Letzte Antwort
                        0
                        • joergeliJ joergeli

                          @tobetobe
                          Hallo Thomas,

                          @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                          Die Länge von slots[i] und damit die Anzahl der Slots hängt vom jeweiligen Befehl ab. Hier habe ich als Beispiel einen langen Befehl mit 5 Slots ausgewählt ("Room" zähle ich nicht mit). Meine Befehle enthalten einen bis 5 Slots, was alles durch dieses kleine Skript abgedeckt wird.

                          Das verstehe ich soweit.
                          Du bekommst im Topic "OpenWindow" dann z.B. 5 Datenpunkte zur weiteren Auswertung:

                          device: "hm-rpc.0.QEQ1234567.1"
                          time: 10
                          unit: "minuten"
                          value: "100"
                          state: ".LEVEL"
                          

                          Die Herausforderung bei der weiteren Auswertung wird dann sein - wenn ich nicht zu kompliziert denke:
                          Prüfen, wie viele slots mit was gefüllt/geändert wurden.
                          Könnte ja evtl. auch so aussehen, oder?:

                          device: "xyz"
                          state: "off"
                          

                          Dann müssten bei einem neuen Kommando/Message-Empfang erst mal alle Datenpunkte geleert, bzw. überschrieben werden, weil die vorhandenen Datenpunkte ja weiterhin noch existent sind:

                          device: "xyz"
                          time: ""
                          unit: ""
                          value: ""
                          state: "off"
                          

                          Dann müssten - in diesem Beispiel - nur device und state anhand ihres Inhaltes ausgewertet werden und dann die entspr. Aktion triggern.
                          Da würden dann IMHO sehr viele if-Abfragen benötigt, weil ja auch andere Kombinationen möglich wären (hier mal als Pseudo-Code):

                          if      (device == "xyz" && state == "off"  && time == "" && unit == "" && value == "") { --> schalte device xyz aus}
                          else if (device == "xyz" && state == "on" && time == "" && unit == "" && value == "")  {--> schalte device xyz ein}
                          
                          else if (device == "abc" && state == "off"  && time == "" && unit == "" && value == "")  {--> schalte device abc aus}
                          else if (device == "abc" && state == "on"  && time == "" && unit == "" && value == "")  {--> schalte device abc ein}
                          
                          else if (device == "efg" && state == ""  && time == "" && unit == "" && value == "50")  {--> setze device efg auf 50}
                          else if (device == "efg" && state == ""  && time == "" && unit == "" && value == "100")  {--> setze device efg auf 100}
                          
                          else if (device == "efg" && state == ""  && time == "10" && unit == "sekunden" && value == "50")  {--> setze device efg für 10s auf 50}
                          else if (device == "efg" && state == ""  && time == "30 " && unit == "sekunden" && value == "100")  {--> setze device efg für 30s auf 100}
                          .
                          .
                          etc.
                          .
                          .
                          
                          

                          Das gibt, wenn man es auf diese Weise prüfen würde, einen Wust an möglichen Kombinationen.
                          Ich würde sagen, das ist ein Fall für die JS-Cracks, die das bestimmt eleganter lösen können, als ich.

                          Vorschlag:
                          Einen neuen Thread im Unterforum JavaScript aufmachen mit der Problemstellung - sinngemäß -:
                          Ich habe hier 1-5 Variablen, die in jeder beliebigen Kombination miteinander verknüpft werden könnten.
                          Wie ermittele ich daraus eine eindeutige Ausgabe?

                          Gruß
                          Jörg

                          tobetobeT Offline
                          tobetobeT Offline
                          tobetobe
                          schrieb am zuletzt editiert von
                          #201

                          @joergeli

                          Hallo Jörg,

                          nun zum Feierabend noch der aktuelle Stand der Dinge. Mit dem nachfolgend aufgeführten Skript kann ich miitlerweile alle Intents von "var topic_list" abholen und parsen. Intentname und SiteId werden korrekt ausgelesen und wiedergegeben.

                          Bei den Slots fangen dann die Herausforderungen an. Heute Abend mag ich nicht mehr...

                          var mqtt = require('mqtt')
                          var client  = mqtt.connect('mqtt://192.xxx')
                          var topic_list=['hermes/intent/ChangeDimmerLevel', 'hermes/intent/ChangeBlindLevel', 'hermes/intent/ChangeDeviceState']
                          var topic_wake   = 'hermes/asr/startListening';
                          var topic_befehl =  'hermes/asr/textCaptured';
                          var topic_unerkannt = 'hermes/nlu/intentNotRecognized';
                          
                          client.subscribe(topic_list,{qos:1});
                          client.subscribe(topic_wake,{qos:1});
                          client.subscribe(topic_befehl,{qos:1});
                          client.subscribe(topic_unerkannt,{qos:1});
                          
                          console.log("connected flag  " + client.connected);
                          
                          client.on("connect",function(){	
                          console.log("connected  "+ client.connected)});
                          
                          
                          client.on('message', function (topic_list, message) {
                          // var intentName
                          const obj = JSON.parse(message);
                          console.log(obj);
                            var intentName = obj.intent.intentName;
                            console.log("intentName:"+intentName);  
                            var siteId = obj.siteId;
                            console.log("siteId:"+siteId);
                            var slotsEntity = obj.slots.value;
                            console.log("Entity:"+slotsEntity);
                            //var obj.slots.slotName.value.value
                            var slots = [];
                          //  for (var i in $(obj.slots) {
                          //    slots[obj.slots[i].slotName] = obj.slots[i].value.value
                          //   }
                            
                          //  console.log(obj.slots.slot[1].value)
                          changeDimmer();
                          client.end();
                          })
                          
                          function changeDimmer(){
                               sendTo("telegram.0", "send", {text: ('Dimmer gesetzt'), chatId: 'xxx'});
                                  }
                          

                          Hier noch das Roh-JSON zum Vergleich:

                          
                          {'input':'true die hm-rpc.0.OEQ1234567.1 true .STATE',
                          
                          'intent':{
                          	'intentName':'ChangeDeviceState','confidenceScore':1},
                          	'siteId':'Satellite1','id':'545a2929-23df-4a97-a86e-2f08f1ab530c',
                          
                          'slots':[{
                          	'entity':'device_name_switch','value':{'kind':'Unknown','value':'hm-rpc.0.OEQ1234567.1'},
                          
                          	'slotName':'device','rawValue':'linkekuechenlampe','confidence':1,'range':{'start':9,'end':30,'rawStart':12,'rawEnd':29}},
                          	{'entity':'device_state','value':{'kind':'Unknown','value':'true'},
                          
                          	'slotName':'value','rawValue':'ein','confidence':1,'range':{'start':31,'end':35,'rawStart':30,'rawEnd':33}},
                          	{'entity':'state','value':{'kind':'Unknown','value':'.STATE'},
                          
                          	'slotName':'state','rawValue':'','confidence':1,'range':{'start':36,'end':42,'rawStart':34,'rawEnd':33}}],
                          
                          
                          'sessionId':'545a2929-23df-4a97-a86e-2f08f1ab530c','customData':null,
                          
                          'asrTokens':[[{'value':'true','confidence':1,'rangeStart':0,'rangeEnd':4,'time':null},{'value':'die','confidence':1,'rangeStart':5,'rangeEnd':8,'time':null},{'value':'hm-rpc.0.OEQ1234567.1','confidence':1,'rangeStart':9,'rangeEnd':30,'time':null},{'value':'true','confidence':1,'rangeStart':31,'rangeEnd':35,'time':null},{'value':'.STATE','confidence':1,'rangeStart':36,'rangeEnd':42,'time':null}]],
                          
                          'asrConfidence':null,'rawInput':'schalte die linkekuechenlampe ein','wakewordId':null}
                          

                          Mittlerweile glaube ich, dass der Rest auch noch zu schaffen ist.

                          Ich wünsche einen schönen Abend und einen frohen 1. Mai
                          Thomas

                          Beste Grüße
                          tobetobe

                          1 Antwort Letzte Antwort
                          0
                          • tobetobeT tobetobe

                            @joergeli
                            So, da bin ich wieder.

                            @joergeli said in Rhasspy Offline Sprachsteuerung:

                            Vorschlag:
                            Einen neuen Thread im Unterforum JavaScript aufmachen

                            Find ich gut. Mit meinen Kenntnissen würde ich ewig brauchen. Allerdings sollten wir uns, wenn möglich, auf eine gemeinsame Aufgabenstellung einigen, die die Grundlage für individuelle Anpassungen darstellt. damit wir das Forum nicht überfordern.

                            Dazu zwei ganz zentrale Fragestellungen:

                            1. Wo holen wir die Daten ab? Direkt beim Mosquitto-Broker oder bei einem mqtt-Client, der als Adapter auf ioBroker läuft? Diese Frage hat ganz erheblichen Einfluss auf die Programmierung. Bei Mosquitto geht das über den Befehl "client.on(xxx), bei ioBroker über klassisch "on({id...". Persönlich würde ich Mosquitto aus folgenden Gründen bevorzugen: Eine Instanz weniger, die am Prozess beteiligt ist, um die man sich schon nicht mehr kümmern muss und die auch keine Fehlerquelle mehr darstellt, wenn sie entfällt (ich meine damit mqtt.1 Client). Zudem weniger Last auf ioBroker,

                            2. Welche Daten sollen "abgeholt" werden? Primär geht es doch um die Intents, oder? Wenn deren Procesing fertig programmiert ist, sollten wir selbst in der Lage sein, die kleineren Dinge, wie Wakeword-Erkennung abzuholen. Oder was meinst du? Zu den relevanten Datenpunkten habe ich mir gerade noch einmal die Ergebnisse, die aus Node-Red kommen, angeschaut. Von daher käme ich auf folgende Liste von Datenpunkten, die bereitgestellt werden müssten:

                            a) Allgemeine Objekte:

                            • Der Intent-Name, zB ChangeDimmerLevel (entspricht dem Namen des Sentence aus Rhasspy)

                            • Die SiteID (ggf. für Zukünftiges)

                            b) als Objekte aus den Slots:

                            • n Objekte, die als Variable in ein Array geschrieben werden (zurzeit n = 1 bis 5, sollte aber einfach dynamisch sein, falls man mal etwas an den Sentences ändert, oder neue hinzukommen

                            Im Prinzip würde es doch reichen, wenn uns jemand diese "Abholung" programmiert, nicht wahr? Die Umsetzung der einzelnen Variablen, wenn man sie erst einmal hat, in eine Anweisung an ioBroker sollte dann eigentlich kein Problem mehr darstellen. Dafür haben wir beide ja bereits Code.

                            Was meinst Du?

                            Gruß
                            Thomas

                            joergeliJ Offline
                            joergeliJ Offline
                            joergeli
                            schrieb am zuletzt editiert von joergeli
                            #202

                            Hallo Thomas,

                            @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                            Bei Mosquitto geht das über den Befehl "client.on(xxx), bei ioBroker über klassisch "on({id...". Persönlich würde ich Mosquitto aus folgenden Gründen bevorzugen: Eine Instanz weniger, die am Prozess beteiligt ist, um die man sich schon nicht mehr kümmern muss und die auch keine Fehlerquelle mehr darstellt, wenn sie entfällt (ich meine damit mqtt.1 Client). Zudem weniger Last auf ioBroker,

                            Warum das Rad neu erfinden und es nicht beim MQTT-Client-Adapter belassen?
                            Bist Du sicher, daß dadurch weniger Last ( RAM-Auslastung ? ) verursacht wird ?
                            Letztendlich machen IMHO Deine client.subscribe(topic_list,{.... auch nichts anderes als der Adapter.

                            Für mich stellt sich aber trotzdem nach wie vor die Frage, was ist bei Rhasspy 2.5 anders als bei 2.4.19, wo ja der ioBroker MQTT-Server/Broker-Adapter die Intents automatisch, ohne weiteres Zutun, von selbst angelegt hat

                            Ich hatte ja geschrieben, daß das Ausfiltern der intents, bzw. slots, m.E. das kleinere Übel ist.
                            Die Problematik fängt m.E. mit der Reaktion auf die entspr. Slots an, was je nach Anzahl der Slots auf viele if-Abfragen heraus läuft.

                            Meine Sentences/Slots sind ja nicht so komplex aufgebaut, wie Deine.
                            Ich brauche z.B. keine Dimmer-Werte wie 10% 25%, 40% 50%, 75%, oder Farbwerte wie rot, grün, blau, etc., sondern nur Lampe xy ein/aus.
                            Je mehr Möglichkeiten, bzw. Kombinationen, wie z.B "Dimme Lampe xy auf 50% mit Farbe blau", existieren, desto komplexer, bzw. umfangreicher wird die Auswertung ( = if-Abfragen)

                            Meine einfachen Sachen, wie "Schalte Lampe xy ein/aus" benötigen pro Lampe nur 2 if-Abfragen:

                            if (name == "lampe xy" && state == "ein") {setState ('hm-rpc.2.CUX4000001.7.PRESS_LONG', true);
                            else if(name == "lampe xy" && state == "aus") {  setState ('hm-rpc.2.CUX4000001.7.PRESS_SHORT', true);
                            

                            Ich hänge Dir hier noch mal mein kpl. Auswerte-JS an, welches via mqtt.1 und Rhasspy 2.5-pre einwandfrei funktioniert.

                            Wohlgemerkt: :
                            Ich musste gegenüber dem 2.4.19-Script lediglich auf die entspr. mqtt.1.hermes.intent.xyz abändern und in den on({id:... -Abschnitten alle Variablen name und state auf die neue JSON-Struktur umstellen.

                            let name = empf_json.slots[0].value.value;
                            let state = empf_json.slots[1].value.value;
                            

                            Vielleicht hilft es Dir ja weiter.

                            //##########################################################################
                            // Rhasspy-Voltron-intents via MQTT-Client empfangen und entspr.Datenpunkte setzen/schalten
                            //##########################################################################
                            
                            
                            const szenen     = 'mqtt.1.hermes.intent.Scenes'       // Broadlink-Szenen
                            const rolladen   = 'mqtt.1.hermes.intent.Rolladen'     // Rolladen
                            const lampen     = 'mqtt.1.hermes.intent.Lampen'       // Lampen, bzw. Funksteckdosen
                            const drucker    = 'mqtt.1.hermes.intent.Drucker'      // 3D Drucker
                            const fenster    = 'mqtt.1.hermes.intent.Fenster'      // Anzahl offene Fenster
                            const regen      = 'mqtt.1.hermes.intent.Regen'        // Regen heute
                            const ereignis   = 'mqtt.1.hermes.intent.Ereignis'     // Heutige Termine
                            const zeit       = 'mqtt.1.hermes.intent.Zeit'         // Uhrzeit
                            const datum      = 'mqtt.1.hermes.intent.Datum'        // Datum
                            const temperatur = 'mqtt.1.hermes.intent.Temperatur'   // Temperatur
                            
                            
                            
                            //______________________________________________
                            // Termine
                            on({id: ereignis, change: "any"},function(obj) {
                                let empf_code = getState(ereignis).val ;
                                let empf_json = JSON.parse(empf_code);
                                let state = empf_json.state;
                                    GetEvent();
                            });
                            
                            
                            //______________________________________________
                            // Regen
                            on({id: regen, change: "any"},function(obj) {
                                let empf_code = getState(regen).val ;
                                let empf_json = JSON.parse(empf_code);
                                let state = empf_json.slots[0].value.value;
                                //log ("state: " + state); 
                                if (state == "geregnet") {
                                    GetRain();
                                }
                            });
                            
                            //______________________________________________
                            // Fenster
                            on({id: fenster, change: "any"},function(obj) {
                                let empf_code = getState(fenster).val ;
                                let empf_json = JSON.parse(empf_code);
                                let state = empf_json.slots[0].value.value;
                                //log ("state: " + state); 
                              if (state == "offen" || state == "zu") {
                                    GetWindows();
                                }
                            });
                            
                            
                            //______________________________________________
                            // 3d-Drucker
                            on({id: drucker, change: "any"},function(obj) {
                                let empf_code = getState(drucker).val ;
                                let empf_json = JSON.parse(empf_code);
                                let state = empf_json.slots[0].value.value;
                                //log ("state: " + state);  
                                if (state == "weit") {
                                    GetPrinterTime();
                                }
                            });
                            
                            
                            //______________________________________________
                            // Uhrzeit
                            on({id: zeit, change: "any"},function(obj) {
                                let empf_code = getState(zeit).val ;
                                let empf_json = JSON.parse(empf_code);
                                let name = empf_json.name;
                                let state = empf_json.state;
                                //log ("state: " + state);
                              //if (state == "sp\u00e4t") {
                                    GetCurrentTimeStamp();
                              //  }
                            });
                            
                            //______________________________________________
                            // Datum
                            on({id: datum, change: "any"},function(obj) {
                                let empf_code = getState(datum).val ;
                                    //log ("empf_code: " + empf_code);
                                let empf_json = JSON.parse(empf_code);
                                let intent = empf_json.intent.intentName;
                                //log ("intent: " + intent);
                                 if (intent == "Datum") {
                                    GetCurrentDate();
                                }
                            });
                            
                            
                            
                            
                            //______________________________________________
                            // Temperaturen
                            on({id: temperatur, change: "any"},function(obj) {
                                let empf_code = getState(temperatur).val ;
                                //log ("empf_code: " + empf_code);
                            
                                let empf_json = JSON.parse(empf_code);
                                let state = empf_json.slots[0].value.value;
                                //log ("state: " + state);
                            
                            
                              if (state == "draussen") {
                                let aussentemp_obj = "hm-rpc.2.CUX0100001.1.TEMPERATURE";
                                let aussenfeuchte_obj = "hm-rpc.2.CUX0100001.1.HUMIDITY";
                                let aussentemp_wert = getState(aussentemp_obj).val;
                                let aussenfeuchte_wert = getState(aussenfeuchte_obj).val;
                                let aussentemp_string =  String(aussentemp_wert);
                                let aussenfeuchte_string =  String(aussenfeuchte_wert);
                                let aussentemp = aussentemp_string.replace(".",",");
                                let aussenfeuchte = aussenfeuchte_string.replace(".",",");
                                //log ( " Aussen-Temperatur ist " + aussentemp + " Grad" );
                                sendTo("paw.0",'Tablet_Jörg',{tts: "Es sind " + aussentemp + " Grad draussen bei " + aussenfeuchte + " Prozent Luftfeuchtigkeit" });      
                                 }
                            else if(state == "innen" || state == "wohnzimmer") {
                                let innentemp_obj = "sonoff.0.Kodi-Stecker.AM2301_Temperature";
                                let innentemp_wert = getState(innentemp_obj).val;
                                let innentemp_string =  String(innentemp_wert);
                                let innentemp = innentemp_string.replace(".",",");
                                //log ( " Innen-Temperatur ist " + innentemp + " Grad" );
                                sendTo("paw.0",'Tablet_Jörg',{tts: "Es sind " + innentemp + " Grad im Wohnzimmer" });      
                                 }
                            else if(state == "schlafzimmer") {
                                let schlafzimmer_obj = "javascript.0.DHT22.Schlafzimmer.Temp";
                                let schlafzimmer_wert = getState(schlafzimmer_obj).val;
                                let schlafzimmer_string =  String(schlafzimmer_wert);
                                let schlafzimmer = schlafzimmer_string.replace(".",",");
                                //log ( " Schlafzimmer-Temperatur ist " + schlafzimmer + " Grad" );
                                sendTo("paw.0",'Tablet_Jörg',{tts: "Es sind " + schlafzimmer + " Grad im Schlafzimmer" });      
                                 }
                            else if(state == "badewasser") {
                                let badewasser_obj = "javascript.0.SolarParser.Daten5";
                                let badewasser_wert = getState(badewasser_obj).val;
                                let badewasser_string =  String(badewasser_wert);
                                let badewassertemp = badewasser_string.replace(".",",");
                                //log ( " Badewasser-Temperatur ist " + badewassertemp + " Grad" );
                                sendTo("paw.0",'Tablet_Jörg',{tts: "Das Badewasser hat " + badewassertemp + " Grad" });      
                                 }
                            });
                            
                            //______________________________________________
                            // Lampen, bzw. Funksteckdosen
                            on({id: lampen, change: "any"},function(obj) {
                                let empf_code = getState(lampen).val ;
                                //log ("EMPF-CODE: " + empf_code);
                                let empf_json = JSON.parse(empf_code);
                            
                              
                                let name = empf_json.slots[0].value.value;
                                 //log ("name: " + name);
                                let state = empf_json.slots[1].value.value;
                                 //log ("state: " + state);
                            
                             if(name == "wandspots" && state == "ein") { 
                                setState ('hm-rpc.2.CUX4000001.7.PRESS_LONG', true); 
                                //setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Wandspots_An', true);
                             }
                            else if(name == "wandspots" && state == "aus") { 
                                setState ('hm-rpc.2.CUX4000001.7.PRESS_SHORT', true); 
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Wandspots_Aus', true);
                            }
                            
                            else if(name == "regal" && state == "ein") { 
                                setState ('hm-rpc.2.CUX4000001.1.PRESS_LONG', true); 
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_An', true);
                             }
                            else if(name == "regal" && state == "aus") { 
                                setState ('hm-rpc.2.CUX4000001.1.PRESS_SHORT', true); 
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_Aus', true);
                            }
                            
                            else if(name == "couchjoerg" && state == "ein") {
                                setState ('hm-rpc.2.CUX4000001.10.PRESS_LONG', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_An', true);
                            }
                            else if(name == "couchjoerg" && state == "aus") {
                                setState ('hm-rpc.2.CUX4000001.10.PRESS_SHORT', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_Aus', true);
                            }
                            
                            else if(name == "couchrenate" && state == "ein") {
                                setState ('hm-rpc.2.CUX4000001.3.PRESS_LONG', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_An', true);   
                            }
                            else if(name == "couchrenate" && state == "aus") {
                                setState ('hm-rpc.2.CUX4000001.3.PRESS_SHORT', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_Aus', true);
                            }
                            
                            else if(name == "hydro" && state == "ein") {
                                setState ('hm-rpc.2.CUX4000001.8.PRESS_LONG', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_An', true);     
                            }
                            else if(name == "hydro" && state == "aus") {
                                setState ('hm-rpc.2.CUX4000001.8.PRESS_SHORT', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_Aus', true);    
                            }
                            
                            else if(name == "ledcube" && state == "ein") {
                                setState ('hm-rpc.2.CUX4000001.5.PRESS_LONG', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.LED-Wuerfel_An', true);     
                            }
                            else if(name == "ledcube" && state == "aus") {
                                setState ('hm-rpc.2.CUX4000001.5.PRESS_SHORT', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.LED-Wuerfel_Aus', true);    
                            }
                            
                            else if(name == "essecke" && state == "ein") {
                                setState ('hm-rpc.2.CUX4000001.2.PRESS_LONG', true); 
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Essecke_An', true);
                            }
                            else if(name == "essecke" && state == "aus") {
                                setState ('hm-rpc.2.CUX4000001.2.PRESS_SHORT', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Essecke_Aus', true);
                            }
                            
                            else if(name == "esstischlampe" && state == "ein") { setState ('shelly.0.SHSW-1#2C7AEF#1.Relay0.Switch', true); }
                            else if(name == "esstischlampe" && state == "aus") { setState ('shelly.0.SHSW-1#2C7AEF#1.Relay0.Switch', false); }
                            
                            else if(name == "fernsehlicht" && state == "ein") { fernsehlicht_ein(); }
                            else if(name == "fernsehlicht" && state == "aus") { fernsehlicht_aus(); }
                            
                            else if(name == "radio" && state == "ein") { setState ('javascript.0.Silvercrest.On', true); }
                            else if(name == "radio" && state == "aus") { setState ('javascript.0.Silvercrest.On', false); }
                            
                            
                            //log ( name + " ist " + state );
                            sendTo("paw.0",'Tablet_Jörg',{tts: name + " wurde " + state + "geschaltet" }); 
                            });
                            
                            
                            //______________________________________________
                            // Broadlink-Szenen
                            on({id: szenen, change: "any"},function(obj) {
                                let empf_code = getState(szenen).val ;
                                let empf_json = JSON.parse(empf_code);
                                let name = empf_json.name;
                                let state = empf_json.state;
                                //log ("name: " + name + "  state: " + state);
                            if (name == "schlafen" && state == "gehen"){
                                fernsehlicht_aus();     
                                setState ('broadlink2.0.Scenes.Schlafen', true);
                                sendTo("paw.0",'Tablet_Jörg',{tts: 'Wohnzimmerbeleuchtung und Fernseher werden ausgeschaltet. Gute Nacht.' }); 
                            }
                            else if(name == "fernsehabend" && state == "aktivieren") {    
                                fernsehlicht_ein();  
                                setState ('broadlink2.0.Scenes.Fernsehabend', true);
                                sendTo("paw.0",'Tablet_Jörg',{tts: name + ' wird aktiviert. Ich wünsche gute Unterhaltung.' }); 
                            }
                            });
                            //______________________________________________
                            
                            // Rolladen
                            on({id: rolladen, change: "any"},function(obj) {
                                let empf_code = getState(rolladen).val ;
                                let empf_json = JSON.parse(empf_code);
                            
                            
                                let name = empf_json.slots[0].value.value;
                                 //log ("name: " + name);
                                let state = empf_json.slots[1].value.value;
                                 //log ("state: " + state);
                            
                                 log ("name: " + name + "  state: " + state);
                            if (name == "rolladen" && state == "hochfahren"){
                                setState ('hm-rpc.0.PEQ0505813.1.STATE', true);
                                sendTo("paw.0",'Tablet_Jörg',{tts: name  + ' werden hochgefahren'  });
                            }
                            else if(name == "rolladen" && state == "runterfahren"){
                                setState ('hm-rpc.0.PEQ0505813.3.STATE', true);
                                sendTo("paw.0",'Tablet_Jörg',{tts: name + ' werden runtergefahren' });
                            }
                            else if(name == "rolladen" && state == "stoppen"){
                                setState ('hm-rpc.0.PEQ0505813.2.STATE', true);
                                sendTo("paw.0",'Tablet_Jörg',{tts: name + " werden gestoppt " });
                            }
                            //log ( name + " " + state );
                            });
                            //______________________________________________
                            
                            
                            
                            //################################################################################################
                            // WakeWord-Erkennung
                            const wake   = 'mqtt.1.hermes.asr.startListening'      // Wakeword erkannt
                            const befehl = 'mqtt.1.hermes.asr.textCaptured' // Datenpunkt aendert sich von listening auf loaded, wenn befehl erkannt erkannt wurde
                            const unbekannt = 'mqtt.1.hermes.nlu.intentNotRecognized' // Datenpunkt Intent nicht erkannt
                            
                            on({id: wake, change: "any"},function(obj) {
                                wakeword();
                                     
                            });
                            
                            on({id: befehl, change: "any"},function(obj) {
                                //befehl_empf();   
                            });
                            
                            on({id: unbekannt, change: "any"},function(obj) {
                                nicht_erkannt();
                            });
                            
                            
                            function wakeword(){
                                //setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.SamsungTV_Mute', true);
                                lautstaerke(); // Lautstaerke auf 15 setzen
                                sendTo("paw.0",'Tablet_Jörg',{tts: "ja"  }); // Sprachausgabe mittels PAW-Adapter auf Tablet/Smartphone
                                //sendTo("paw.0",'Tablet_Jörg',{play: true});  // optional default sound anstatt sprachausgabe mittels mittels PAW-Adapter auf Tablet/Smartphone abspielen
                            }
                            
                            function befehl_empf(){ 
                                    setTimeout(function(){
                                //   setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.SamsungTV_Mute', true);
                                //    //log ( "Mute gesetzt " );
                                    }, 10000);
                                lautstaerke(); // Lautstaerke auf 15 setzen
                                sendTo("paw.0",'Tablet_Jörg',{tts: "Moment bitte,    "  }); // Sprachausgabe mittels PAW-Adapter auf Tablet/Smartphone
                            }
                            
                            function nicht_erkannt(){ 
                                //    setTimeout(function(){
                                //    setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.SamsungTV_Mute', true);
                                //    setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.SamsungTV_Mute', true);
                                //    //log ( "Nicht verstanden" );
                                //    }, 6000);
                                lautstaerke(); // Lautstaerke auf 15 setzen
                                sendTo("paw.0",'Tablet_Jörg',{tts: "Entschuldigung, ich habe dich leider nicht verstanden" });
                            }
                            
                            
                            
                            // Ende WakeWord-ErkennungsScript
                            //################################################################################################
                            
                            //__________________________________________________
                            function formatTwoDigits(n) {
                            return n < 10 ? '0' + n : n;
                            }
                            //__________________________________________________
                            function GetCurrentTimeStamp() {
                                var now = new Date();
                                //var hours = now.getHours();
                                //var minutes = now.getMinutes();
                                //var seconds = now.getSeconds();
                            
                                var hours = formatTwoDigits(now.getHours());
                                var minutes = formatTwoDigits(now.getMinutes());
                                var seconds = formatTwoDigits(now.getSeconds());
                            
                                var TimeString = hours + ":" + minutes + ":" + seconds;
                                sendTo("paw.0",'Tablet_Jörg',{tts: "Es ist " + TimeString });
                            }
                            //__________________________________________________
                            function GetCurrentDate() {
                                var datum = new Date();
                                var tag = datum.getDay();
                                var wotag = wochentag(tag);
                                //log(wotag);
                                var now = new Date();
                                var dd = now.getDate();
                            
                                var dd_string =  String(dd);
                                var tagi =""
                                if  (dd_string == "1")  { tagi = "ers";}   
                                else if (dd_string == "3")  { tagi = "drit";}
                                else { tagi = dd_string ;}
                            
                                var mm = now.getMonth()+1;
                                var monat ="";
                                if  (mm == 1)  { monat = "Januar";}   
                            else if (mm == 2)  { monat = "Februar";} 
                            else if (mm == 3)  { monat = "März";} 
                            else if (mm == 4)  { monat = "April";} 
                            else if (mm == 5)  { monat = "Mai";} 
                            else if (mm == 6)  { monat = "Juni";} 
                            else if (mm == 7)  { monat = "Juli";} 
                            else if (mm == 8)  { monat = "August";} 
                            else if (mm == 9)  { monat = "September";} 
                            else if (mm == 10) { monat = "Oktober";} 
                            else if (mm == 11) { monat = "November";} 
                            else if (mm == 12) { monat = "Dezember";} 
                                var yyyy = now.getFullYear();
                            
                                //var DateString = " Heute ist" + wotag + " der  " + dd + "."+ mm +"."+yyyy; 
                                var DateString = " Heute ist" + wotag + ",der  " + tagi + "te "   + monat +" "+ yyyy; 
                                sendTo("paw.0",'Tablet_Jörg',{tts: DateString });
                            }
                            
                            //__________________________________________________
                            function wochentag(i){
                                var tage = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'];
                                var tag = (typeof(i) == 'object') ? i.getDay() : i ;
                                return tage[tag];
                            }
                            //__________________________________________________
                            function fernsehlicht_ein(){
                            //regal an
                                setState ('hm-rpc.2.CUX4000001.1.PRESS_LONG', true); 
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_An', true);
                            //couchjoerg an 
                                setState ('hm-rpc.2.CUX4000001.10.PRESS_LONG', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_An', true);
                            //couchrenate an 
                                setState ('hm-rpc.2.CUX4000001.3.PRESS_LONG', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_An', true);   
                            //hydro an
                                setState ('hm-rpc.2.CUX4000001.8.PRESS_LONG', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_An', true);     
                            }
                            
                            //__________________________________________________
                            function fernsehlicht_aus(){
                            //regal aus
                                setState ('hm-rpc.2.CUX4000001.1.PRESS_SHORT', true); 
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_Aus', true);
                            
                            //couchjoerg aus
                                setState ('hm-rpc.2.CUX4000001.10.PRESS_SHORT', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_Aus', true);
                                
                            //couchrenate aus
                                setState ('hm-rpc.2.CUX4000001.3.PRESS_SHORT', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_Aus', true);
                            
                            //hydro aus
                                setState ('hm-rpc.2.CUX4000001.8.PRESS_SHORT', true);
                                setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_Aus', true);     
                            }
                            //__________________________________________________
                            
                            function GetPrinterTime() {
                                const anycubic_fortschritt = 'octoprint.0.printjob.progress.completion'
                                const anycubic_online = 'octoprint.0.info.connection'
                                const rest = 'javascript.0.OctoPi.Restzeit'
                            
                            
                                var druck_status  = getState(anycubic_online).val;    
                                var druck_fortschritt0  = getState(anycubic_fortschritt).val;
                                var druck_fortschritt   = Math.round(druck_fortschritt0 * 1) / 1; // keine Nachkommastellen ansagen
                            var restzeit  = getState(rest).val;
                            
                            var restzeit0 =restzeit.split(':')[0];
                            var restzeit1 =restzeit.split(':')[1];
                            var restzeit2 =restzeit.split(':')[2];
                            
                            var restzeit_std = parseInt( restzeit0);
                            var restzeit_min = parseInt( restzeit1);
                            var restzeit_sec = parseInt( restzeit2);
                            
                            if (restzeit_std > 1){ var stunde =  restzeit_std + " Stunden, "}
                            if (restzeit_std == 1){ var stunde = " eine Stunde, "}
                            if (restzeit_std == 0){ var stunde = ""}
                            
                            if (restzeit_min > 1){ var minute =  restzeit_min + " Minuten, "}
                            if (restzeit_min == 1){ var minute = " eine Minute, "}
                            if (restzeit_min == 0){ var minute = ""}
                            
                            if (druck_status != false){
                                sendTo("paw.0",'Tablet_Jörg',{tts:  'Der 3 D-Drucker hat ' + druck_fortschritt + 'Prozent des Ausdruckes fertiggestellt. '
                                + 'Es dauert noch ' + stunde + ' ' + minute  + ' und ' +restzeit_sec + ' Sekunden, bis der Ausdruck fertig ist.'  });
                            }
                            else{ sendTo("paw.0",'Tablet_Jörg',{tts: 'Der 3 D-Drucker ist ausgeschaltet'});  }
                            }
                            //__________________________________________________
                            
                            function GetWindows() {
                                const windows = 'hm-rega.0.8240'
                                var fenster_status  = getState(windows).val;
                                //log("Anzahl Fenster: " + fenster_status);
                                if (fenster_status > 1){
                                    sendTo("paw.0",'Tablet_Jörg',{tts:  'Ja, es sind noch  ' + fenster_status + ' Fenster im Haus offen'});
                                }
                                else if(fenster_status == 1) {
                                    sendTo("paw.0",'Tablet_Jörg',{tts:  'Ja, es ist noch ein Fenster im Haus offen'});
                                }
                                else{
                                    sendTo("paw.0",'Tablet_Jörg',{tts:  'Nein , alle Fenster im Haus sind geschlossen'});
                                }
                            }
                            //__________________________________________________
                            
                            function GetRain() {
                                const rain = 'javascript.0.WS2000.Regenmenge'
                                const dauer = 'javascript.0.WS2000.Regendauer'
                                var rain_amount  = getState(rain).val;
                                //log("Regenmenge: " + rain_amount);
                                let rain_amount_string =  String(rain_amount);
                                let rain_today = rain_amount_string.replace(".",",");
                            
                                var rain_duration  = getState(dauer).val;
                                //log("Regendauer: " + rain_duration);
                                let rain_duration_string = String(rain_duration);
                                let duration_today = rain_duration_string.replace(".",",");
                                //log("duration_today: " + duration_today);
                            
                            
                            
                                let dauer_stunden = duration_today.split(':')[0];
                                //log("dauer_stunden :" + dauer_stunden)
                                let dauer_stunden_zahl =  parseInt(dauer_stunden); // String to number
                            
                                let dauer_minuten = duration_today.split(':')[1];
                                let dauer_minuten_zahl =  parseInt(dauer_minuten); // String to number
                                //log("dauer_minuten_zahl: " + dauer_minuten_zahl);
                            
                            
                                let stunden = "";
                                let und = "";
                            
                                //---------------------------------------------------
                            
                                if (dauer_minuten_zahl == 0){ und = ""; dauer_minuten = "";}
                                else if (dauer_minuten_zahl == 1){und = " und ";  dauer_minuten = " eine Minute"; }
                                else if (dauer_minuten_zahl > 1 && dauer_minuten_zahl < 10){und = " und ";  dauer_minuten = dauer_minuten_zahl + " Minuten"; }  
                                else if (dauer_minuten_zahl >= 10){ und = " und ";  dauer_minuten = dauer_minuten_zahl + " Minuten";  }
                            
                                if (dauer_stunden_zahl == 0){ und = ""; dauer_stunden = ""; stunden = "";}
                                else if (dauer_stunden_zahl == 1){ stunden = dauer_stunden_zahl + " Stunde"; }
                                else if (dauer_stunden_zahl > 1) { stunden = dauer_stunden_zahl + " Stunden"; }
                            
                            
                                //log( 'rain_amount: ' + rain_amount + ' duration_today: ' +  duration_today);
                                if (rain_amount > 0){
                                    sendTo("paw.0",'Tablet_Jörg',{tts:  'Ja, es hat heute  ' + rain_today + ' Liter pro Quadratmeter geregnet'});
                                }
                                else if (rain_amount == 0 && dauer_minuten_zahl > 0 ){
                                    sendTo("paw.0",'Tablet_Jörg',{tts:  'Ja, aber es gab nur geringen Niederschlag, der' + stunden + und + dauer_minuten + " gedauert hat" });
                                }
                                else if (rain_amount == 0 ){
                                    sendTo("paw.0",'Tablet_Jörg',{tts:  'Nein, heute war es trocken'});
                                }
                            }
                            //__________________________________________________
                            
                            
                            
                            function GetEvent() {
                                const ereignis0     = 'javascript.0.Geburtstag.Heute0'     // Event0
                                const ereignis1     = 'javascript.0.Geburtstag.Heute1'     // Event1
                                const ereignis2     = 'javascript.0.Geburtstag.Heute2'     // Event2
                                const bio_heute     = 'ical.1.events.0.today.Biomüll'
                                const gelb_heute    = 'ical.1.events.0.today.GelberSack'
                                const papier_heute  = 'ical.1.events.0.today.Papier'
                                const rest_heute    = 'ical.1.events.0.today.Restmüll'
                                const bio_morgen    = 'ical.1.events.1.Biomüll'
                                const gelb_morgen   = 'ical.1.events.1.GelberSack'
                                const papier_morgen = 'ical.1.events.1.Papier'
                                const rest_morgen   = 'ical.1.events.1.Restmüll'
                            
                                var event0          = getState(ereignis0).val;
                                var event1          = getState(ereignis1).val;
                                var event2          = getState(ereignis2).val;
                                var bio_today       = getState(bio_heute).val;
                                var gelb_today      = getState(gelb_heute).val;
                                var papier_today    = getState(papier_heute).val;
                                var rest_today      = getState(rest_heute).val;
                                var bio_tomorrow    = getState(bio_morgen).val;
                                var gelb_tomorrow   = getState(gelb_morgen).val;
                                var papier_tomorrow = getState(papier_morgen).val;
                                var rest_tomorrow   = getState(rest_morgen).val;
                            
                                if (event0 != '' && event0 != 'Heute: Biomüll' && event0 != 'Heute: Gelber Sack' && event0 != 'Heute: Papier' && event0 != 'Heute: Restmüll' ){
                                    sendTo("paw.0",'Tablet_Jörg',{tts: 'Ja, ' + event0 + '. '});
                                }
                            
                                if (event1 != '' && event1 != 'Heute: Biomüll' && event1 != 'Heute: Gelber Sack' && event1 != 'Heute: Papier' && event1 != 'Heute: Restmüll' ){
                                    sendTo("paw.0",'Tablet_Jörg',{tts: ' ' + event1 + '. '});
                                }
                            
                               if (event2 != '' && event2 != 'Heute: Biomüll' && event2 != 'Heute: Gelber Sack' && event2 != 'Heute: Papier' && event2 != 'Heute: Restmüll' ){
                                    sendTo("paw.0",'Tablet_Jörg',{tts: ' ' + event2 + '. '});
                                }
                            
                            
                            //if (bio_today == true || bio_tomorrow == true || gelb_today == true || gelb_tomorrow == true || papier_today == true || papier_tomorrow == true || rest_today == true || rest_tomorrow == true)   {
                            // sendTo("paw.0",'Tablet_Jörg',{tts:  'Es wird Müll abgeholt und zwar: '});
                            //}
                            
                            
                                if (bio_today == true)   { sendTo("paw.0",'Tablet_Jörg',{tts:  ' Heute Biomüll. '}); }
                                if (gelb_today == true)  { sendTo("paw.0",'Tablet_Jörg',{tts:  ' Heute Gelbersack. '}); }
                                if (papier_today == true){ sendTo("paw.0",'Tablet_Jörg',{tts:  ' Heute Papiertonne. '}); }        
                                if (rest_today == true)  { sendTo("paw.0",'Tablet_Jörg',{tts:  ' Heute Restmüll. '}); }          
                                    
                                if (bio_tomorrow == true)    { sendTo("paw.0",'Tablet_Jörg',{tts: ' Morgen Biomüll. '}); }
                                if (gelb_tomorrow == true)   { sendTo("paw.0",'Tablet_Jörg',{tts: ' Morgen Gelbersack. '}); }
                                if (papier_tomorrow == true) { sendTo("paw.0",'Tablet_Jörg',{tts: ' Morgen Papiertonne. '}); }
                                if (rest_tomorrow == true)   { sendTo("paw.0",'Tablet_Jörg',{tts: ' Morgen Restmüll. '}); }
                            
                                if (event0 == '' && event1 == '' && event2 == ''
                                && bio_today == false && gelb_today == false && papier_today == false && rest_today == false
                                && bio_tomorrow == false && gelb_tomorrow == false && papier_tomorrow == false && rest_tomorrow == false
                                 )
                                { sendTo("paw.0",'Tablet_Jörg',{tts:  'Nein , es stehen keine Termine an.'}); }
                            }
                            //__________________________________________________
                            
                            
                            function GetMoodlight() {
                                let empf_code = getState(moodlight).val ;
                                let empf_json = JSON.parse(empf_code);
                                 let moodlight_name = empf_json.name;
                                 let moodelight_state = empf_json.state;
                                //log("moodlight_name: " + moodlight_name);
                                //log("moodelight_state: " + moodelight_state);
                            
                                if (moodelight_state == "regenbogen"){
                                 setState ('javascript.0.wled.brightness', 150);      
                                 setState ('javascript.0.wled.effekt', 9);
                                 setState ('javascript.0.wled.intensity', 128);
                                 setState ('javascript.0.wled.speed', 80);
                                }
                                else if(moodelight_state ==  "polizei") {
                                 setState ('javascript.0.wled.brightness', 80);
                                 setState ('javascript.0.wled.effekt', 49);
                                 setState ('javascript.0.wled.intensity', 94);
                                 setState ('javascript.0.wled.speed', 181);
                                }
                                else if(moodelight_state ==  "running") {
                                 setState ('javascript.0.wled.brightness', 80);
                                 setState ('javascript.0.wled.farbe', "#efec5d");      
                                 setState ('javascript.0.wled.effekt', 15);
                                 setState ('javascript.0.wled.intensity', 156);
                                 setState ('javascript.0.wled.speed', 31);
                                }
                                else if(moodelight_state ==  "wischen") {
                                 setState ('javascript.0.wled.brightness', 80);    
                                 setState ('javascript.0.wled.effekt', 36);
                                 setState ('javascript.0.wled.intensity', 136);
                                 setState ('javascript.0.wled.speed', 232);
                                }
                                else if(moodelight_state ==  "christmas") {
                                 setState ('javascript.0.wled.brightness', 80);     
                                 setState ('javascript.0.wled.effekt', 44);
                                 setState ('javascript.0.wled.intensity', 156);
                                 setState ('javascript.0.wled.speed', 168);
                                }
                                else if(moodelight_state ==  "slowly") {
                                 setState ('javascript.0.wled.brightness', 140);   
                                 setState ('javascript.0.wled.effekt', 63);
                                 setState ('javascript.0.wled.intensity', 220);
                                 setState ('javascript.0.wled.speed', 1);
                                }
                            
                            sendTo("paw.0",'Tablet_Jörg',{tts: "Lichteffekt " + moodelight_state + " wurde aktiviert" }); 
                            }
                            //__________________________________________________
                            
                            
                            
                            
                            // Lautstaerke Tablet_Jörg auf 14 setzen
                            function lautstaerke(){ 
                                sendTo("paw.0",'Tablet_Jörg',{volume: 14});
                            }
                            

                            Die Broadlink-Sachen im Script kannst Du ignorieren, die setzen lediglich einige Icons in meinem VIS.

                            Gruß
                            Jörg

                            joergeliJ tobetobeT 2 Antworten Letzte Antwort
                            0
                            • joergeliJ joergeli

                              Hallo Thomas,

                              @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                              Bei Mosquitto geht das über den Befehl "client.on(xxx), bei ioBroker über klassisch "on({id...". Persönlich würde ich Mosquitto aus folgenden Gründen bevorzugen: Eine Instanz weniger, die am Prozess beteiligt ist, um die man sich schon nicht mehr kümmern muss und die auch keine Fehlerquelle mehr darstellt, wenn sie entfällt (ich meine damit mqtt.1 Client). Zudem weniger Last auf ioBroker,

                              Warum das Rad neu erfinden und es nicht beim MQTT-Client-Adapter belassen?
                              Bist Du sicher, daß dadurch weniger Last ( RAM-Auslastung ? ) verursacht wird ?
                              Letztendlich machen IMHO Deine client.subscribe(topic_list,{.... auch nichts anderes als der Adapter.

                              Für mich stellt sich aber trotzdem nach wie vor die Frage, was ist bei Rhasspy 2.5 anders als bei 2.4.19, wo ja der ioBroker MQTT-Server/Broker-Adapter die Intents automatisch, ohne weiteres Zutun, von selbst angelegt hat

                              Ich hatte ja geschrieben, daß das Ausfiltern der intents, bzw. slots, m.E. das kleinere Übel ist.
                              Die Problematik fängt m.E. mit der Reaktion auf die entspr. Slots an, was je nach Anzahl der Slots auf viele if-Abfragen heraus läuft.

                              Meine Sentences/Slots sind ja nicht so komplex aufgebaut, wie Deine.
                              Ich brauche z.B. keine Dimmer-Werte wie 10% 25%, 40% 50%, 75%, oder Farbwerte wie rot, grün, blau, etc., sondern nur Lampe xy ein/aus.
                              Je mehr Möglichkeiten, bzw. Kombinationen, wie z.B "Dimme Lampe xy auf 50% mit Farbe blau", existieren, desto komplexer, bzw. umfangreicher wird die Auswertung ( = if-Abfragen)

                              Meine einfachen Sachen, wie "Schalte Lampe xy ein/aus" benötigen pro Lampe nur 2 if-Abfragen:

                              if (name == "lampe xy" && state == "ein") {setState ('hm-rpc.2.CUX4000001.7.PRESS_LONG', true);
                              else if(name == "lampe xy" && state == "aus") {  setState ('hm-rpc.2.CUX4000001.7.PRESS_SHORT', true);
                              

                              Ich hänge Dir hier noch mal mein kpl. Auswerte-JS an, welches via mqtt.1 und Rhasspy 2.5-pre einwandfrei funktioniert.

                              Wohlgemerkt: :
                              Ich musste gegenüber dem 2.4.19-Script lediglich auf die entspr. mqtt.1.hermes.intent.xyz abändern und in den on({id:... -Abschnitten alle Variablen name und state auf die neue JSON-Struktur umstellen.

                              let name = empf_json.slots[0].value.value;
                              let state = empf_json.slots[1].value.value;
                              

                              Vielleicht hilft es Dir ja weiter.

                              //##########################################################################
                              // Rhasspy-Voltron-intents via MQTT-Client empfangen und entspr.Datenpunkte setzen/schalten
                              //##########################################################################
                              
                              
                              const szenen     = 'mqtt.1.hermes.intent.Scenes'       // Broadlink-Szenen
                              const rolladen   = 'mqtt.1.hermes.intent.Rolladen'     // Rolladen
                              const lampen     = 'mqtt.1.hermes.intent.Lampen'       // Lampen, bzw. Funksteckdosen
                              const drucker    = 'mqtt.1.hermes.intent.Drucker'      // 3D Drucker
                              const fenster    = 'mqtt.1.hermes.intent.Fenster'      // Anzahl offene Fenster
                              const regen      = 'mqtt.1.hermes.intent.Regen'        // Regen heute
                              const ereignis   = 'mqtt.1.hermes.intent.Ereignis'     // Heutige Termine
                              const zeit       = 'mqtt.1.hermes.intent.Zeit'         // Uhrzeit
                              const datum      = 'mqtt.1.hermes.intent.Datum'        // Datum
                              const temperatur = 'mqtt.1.hermes.intent.Temperatur'   // Temperatur
                              
                              
                              
                              //______________________________________________
                              // Termine
                              on({id: ereignis, change: "any"},function(obj) {
                                  let empf_code = getState(ereignis).val ;
                                  let empf_json = JSON.parse(empf_code);
                                  let state = empf_json.state;
                                      GetEvent();
                              });
                              
                              
                              //______________________________________________
                              // Regen
                              on({id: regen, change: "any"},function(obj) {
                                  let empf_code = getState(regen).val ;
                                  let empf_json = JSON.parse(empf_code);
                                  let state = empf_json.slots[0].value.value;
                                  //log ("state: " + state); 
                                  if (state == "geregnet") {
                                      GetRain();
                                  }
                              });
                              
                              //______________________________________________
                              // Fenster
                              on({id: fenster, change: "any"},function(obj) {
                                  let empf_code = getState(fenster).val ;
                                  let empf_json = JSON.parse(empf_code);
                                  let state = empf_json.slots[0].value.value;
                                  //log ("state: " + state); 
                                if (state == "offen" || state == "zu") {
                                      GetWindows();
                                  }
                              });
                              
                              
                              //______________________________________________
                              // 3d-Drucker
                              on({id: drucker, change: "any"},function(obj) {
                                  let empf_code = getState(drucker).val ;
                                  let empf_json = JSON.parse(empf_code);
                                  let state = empf_json.slots[0].value.value;
                                  //log ("state: " + state);  
                                  if (state == "weit") {
                                      GetPrinterTime();
                                  }
                              });
                              
                              
                              //______________________________________________
                              // Uhrzeit
                              on({id: zeit, change: "any"},function(obj) {
                                  let empf_code = getState(zeit).val ;
                                  let empf_json = JSON.parse(empf_code);
                                  let name = empf_json.name;
                                  let state = empf_json.state;
                                  //log ("state: " + state);
                                //if (state == "sp\u00e4t") {
                                      GetCurrentTimeStamp();
                                //  }
                              });
                              
                              //______________________________________________
                              // Datum
                              on({id: datum, change: "any"},function(obj) {
                                  let empf_code = getState(datum).val ;
                                      //log ("empf_code: " + empf_code);
                                  let empf_json = JSON.parse(empf_code);
                                  let intent = empf_json.intent.intentName;
                                  //log ("intent: " + intent);
                                   if (intent == "Datum") {
                                      GetCurrentDate();
                                  }
                              });
                              
                              
                              
                              
                              //______________________________________________
                              // Temperaturen
                              on({id: temperatur, change: "any"},function(obj) {
                                  let empf_code = getState(temperatur).val ;
                                  //log ("empf_code: " + empf_code);
                              
                                  let empf_json = JSON.parse(empf_code);
                                  let state = empf_json.slots[0].value.value;
                                  //log ("state: " + state);
                              
                              
                                if (state == "draussen") {
                                  let aussentemp_obj = "hm-rpc.2.CUX0100001.1.TEMPERATURE";
                                  let aussenfeuchte_obj = "hm-rpc.2.CUX0100001.1.HUMIDITY";
                                  let aussentemp_wert = getState(aussentemp_obj).val;
                                  let aussenfeuchte_wert = getState(aussenfeuchte_obj).val;
                                  let aussentemp_string =  String(aussentemp_wert);
                                  let aussenfeuchte_string =  String(aussenfeuchte_wert);
                                  let aussentemp = aussentemp_string.replace(".",",");
                                  let aussenfeuchte = aussenfeuchte_string.replace(".",",");
                                  //log ( " Aussen-Temperatur ist " + aussentemp + " Grad" );
                                  sendTo("paw.0",'Tablet_Jörg',{tts: "Es sind " + aussentemp + " Grad draussen bei " + aussenfeuchte + " Prozent Luftfeuchtigkeit" });      
                                   }
                              else if(state == "innen" || state == "wohnzimmer") {
                                  let innentemp_obj = "sonoff.0.Kodi-Stecker.AM2301_Temperature";
                                  let innentemp_wert = getState(innentemp_obj).val;
                                  let innentemp_string =  String(innentemp_wert);
                                  let innentemp = innentemp_string.replace(".",",");
                                  //log ( " Innen-Temperatur ist " + innentemp + " Grad" );
                                  sendTo("paw.0",'Tablet_Jörg',{tts: "Es sind " + innentemp + " Grad im Wohnzimmer" });      
                                   }
                              else if(state == "schlafzimmer") {
                                  let schlafzimmer_obj = "javascript.0.DHT22.Schlafzimmer.Temp";
                                  let schlafzimmer_wert = getState(schlafzimmer_obj).val;
                                  let schlafzimmer_string =  String(schlafzimmer_wert);
                                  let schlafzimmer = schlafzimmer_string.replace(".",",");
                                  //log ( " Schlafzimmer-Temperatur ist " + schlafzimmer + " Grad" );
                                  sendTo("paw.0",'Tablet_Jörg',{tts: "Es sind " + schlafzimmer + " Grad im Schlafzimmer" });      
                                   }
                              else if(state == "badewasser") {
                                  let badewasser_obj = "javascript.0.SolarParser.Daten5";
                                  let badewasser_wert = getState(badewasser_obj).val;
                                  let badewasser_string =  String(badewasser_wert);
                                  let badewassertemp = badewasser_string.replace(".",",");
                                  //log ( " Badewasser-Temperatur ist " + badewassertemp + " Grad" );
                                  sendTo("paw.0",'Tablet_Jörg',{tts: "Das Badewasser hat " + badewassertemp + " Grad" });      
                                   }
                              });
                              
                              //______________________________________________
                              // Lampen, bzw. Funksteckdosen
                              on({id: lampen, change: "any"},function(obj) {
                                  let empf_code = getState(lampen).val ;
                                  //log ("EMPF-CODE: " + empf_code);
                                  let empf_json = JSON.parse(empf_code);
                              
                                
                                  let name = empf_json.slots[0].value.value;
                                   //log ("name: " + name);
                                  let state = empf_json.slots[1].value.value;
                                   //log ("state: " + state);
                              
                               if(name == "wandspots" && state == "ein") { 
                                  setState ('hm-rpc.2.CUX4000001.7.PRESS_LONG', true); 
                                  //setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Wandspots_An', true);
                               }
                              else if(name == "wandspots" && state == "aus") { 
                                  setState ('hm-rpc.2.CUX4000001.7.PRESS_SHORT', true); 
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Wandspots_Aus', true);
                              }
                              
                              else if(name == "regal" && state == "ein") { 
                                  setState ('hm-rpc.2.CUX4000001.1.PRESS_LONG', true); 
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_An', true);
                               }
                              else if(name == "regal" && state == "aus") { 
                                  setState ('hm-rpc.2.CUX4000001.1.PRESS_SHORT', true); 
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_Aus', true);
                              }
                              
                              else if(name == "couchjoerg" && state == "ein") {
                                  setState ('hm-rpc.2.CUX4000001.10.PRESS_LONG', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_An', true);
                              }
                              else if(name == "couchjoerg" && state == "aus") {
                                  setState ('hm-rpc.2.CUX4000001.10.PRESS_SHORT', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_Aus', true);
                              }
                              
                              else if(name == "couchrenate" && state == "ein") {
                                  setState ('hm-rpc.2.CUX4000001.3.PRESS_LONG', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_An', true);   
                              }
                              else if(name == "couchrenate" && state == "aus") {
                                  setState ('hm-rpc.2.CUX4000001.3.PRESS_SHORT', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_Aus', true);
                              }
                              
                              else if(name == "hydro" && state == "ein") {
                                  setState ('hm-rpc.2.CUX4000001.8.PRESS_LONG', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_An', true);     
                              }
                              else if(name == "hydro" && state == "aus") {
                                  setState ('hm-rpc.2.CUX4000001.8.PRESS_SHORT', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_Aus', true);    
                              }
                              
                              else if(name == "ledcube" && state == "ein") {
                                  setState ('hm-rpc.2.CUX4000001.5.PRESS_LONG', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.LED-Wuerfel_An', true);     
                              }
                              else if(name == "ledcube" && state == "aus") {
                                  setState ('hm-rpc.2.CUX4000001.5.PRESS_SHORT', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.LED-Wuerfel_Aus', true);    
                              }
                              
                              else if(name == "essecke" && state == "ein") {
                                  setState ('hm-rpc.2.CUX4000001.2.PRESS_LONG', true); 
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Essecke_An', true);
                              }
                              else if(name == "essecke" && state == "aus") {
                                  setState ('hm-rpc.2.CUX4000001.2.PRESS_SHORT', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Essecke_Aus', true);
                              }
                              
                              else if(name == "esstischlampe" && state == "ein") { setState ('shelly.0.SHSW-1#2C7AEF#1.Relay0.Switch', true); }
                              else if(name == "esstischlampe" && state == "aus") { setState ('shelly.0.SHSW-1#2C7AEF#1.Relay0.Switch', false); }
                              
                              else if(name == "fernsehlicht" && state == "ein") { fernsehlicht_ein(); }
                              else if(name == "fernsehlicht" && state == "aus") { fernsehlicht_aus(); }
                              
                              else if(name == "radio" && state == "ein") { setState ('javascript.0.Silvercrest.On', true); }
                              else if(name == "radio" && state == "aus") { setState ('javascript.0.Silvercrest.On', false); }
                              
                              
                              //log ( name + " ist " + state );
                              sendTo("paw.0",'Tablet_Jörg',{tts: name + " wurde " + state + "geschaltet" }); 
                              });
                              
                              
                              //______________________________________________
                              // Broadlink-Szenen
                              on({id: szenen, change: "any"},function(obj) {
                                  let empf_code = getState(szenen).val ;
                                  let empf_json = JSON.parse(empf_code);
                                  let name = empf_json.name;
                                  let state = empf_json.state;
                                  //log ("name: " + name + "  state: " + state);
                              if (name == "schlafen" && state == "gehen"){
                                  fernsehlicht_aus();     
                                  setState ('broadlink2.0.Scenes.Schlafen', true);
                                  sendTo("paw.0",'Tablet_Jörg',{tts: 'Wohnzimmerbeleuchtung und Fernseher werden ausgeschaltet. Gute Nacht.' }); 
                              }
                              else if(name == "fernsehabend" && state == "aktivieren") {    
                                  fernsehlicht_ein();  
                                  setState ('broadlink2.0.Scenes.Fernsehabend', true);
                                  sendTo("paw.0",'Tablet_Jörg',{tts: name + ' wird aktiviert. Ich wünsche gute Unterhaltung.' }); 
                              }
                              });
                              //______________________________________________
                              
                              // Rolladen
                              on({id: rolladen, change: "any"},function(obj) {
                                  let empf_code = getState(rolladen).val ;
                                  let empf_json = JSON.parse(empf_code);
                              
                              
                                  let name = empf_json.slots[0].value.value;
                                   //log ("name: " + name);
                                  let state = empf_json.slots[1].value.value;
                                   //log ("state: " + state);
                              
                                   log ("name: " + name + "  state: " + state);
                              if (name == "rolladen" && state == "hochfahren"){
                                  setState ('hm-rpc.0.PEQ0505813.1.STATE', true);
                                  sendTo("paw.0",'Tablet_Jörg',{tts: name  + ' werden hochgefahren'  });
                              }
                              else if(name == "rolladen" && state == "runterfahren"){
                                  setState ('hm-rpc.0.PEQ0505813.3.STATE', true);
                                  sendTo("paw.0",'Tablet_Jörg',{tts: name + ' werden runtergefahren' });
                              }
                              else if(name == "rolladen" && state == "stoppen"){
                                  setState ('hm-rpc.0.PEQ0505813.2.STATE', true);
                                  sendTo("paw.0",'Tablet_Jörg',{tts: name + " werden gestoppt " });
                              }
                              //log ( name + " " + state );
                              });
                              //______________________________________________
                              
                              
                              
                              //################################################################################################
                              // WakeWord-Erkennung
                              const wake   = 'mqtt.1.hermes.asr.startListening'      // Wakeword erkannt
                              const befehl = 'mqtt.1.hermes.asr.textCaptured' // Datenpunkt aendert sich von listening auf loaded, wenn befehl erkannt erkannt wurde
                              const unbekannt = 'mqtt.1.hermes.nlu.intentNotRecognized' // Datenpunkt Intent nicht erkannt
                              
                              on({id: wake, change: "any"},function(obj) {
                                  wakeword();
                                       
                              });
                              
                              on({id: befehl, change: "any"},function(obj) {
                                  //befehl_empf();   
                              });
                              
                              on({id: unbekannt, change: "any"},function(obj) {
                                  nicht_erkannt();
                              });
                              
                              
                              function wakeword(){
                                  //setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.SamsungTV_Mute', true);
                                  lautstaerke(); // Lautstaerke auf 15 setzen
                                  sendTo("paw.0",'Tablet_Jörg',{tts: "ja"  }); // Sprachausgabe mittels PAW-Adapter auf Tablet/Smartphone
                                  //sendTo("paw.0",'Tablet_Jörg',{play: true});  // optional default sound anstatt sprachausgabe mittels mittels PAW-Adapter auf Tablet/Smartphone abspielen
                              }
                              
                              function befehl_empf(){ 
                                      setTimeout(function(){
                                  //   setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.SamsungTV_Mute', true);
                                  //    //log ( "Mute gesetzt " );
                                      }, 10000);
                                  lautstaerke(); // Lautstaerke auf 15 setzen
                                  sendTo("paw.0",'Tablet_Jörg',{tts: "Moment bitte,    "  }); // Sprachausgabe mittels PAW-Adapter auf Tablet/Smartphone
                              }
                              
                              function nicht_erkannt(){ 
                                  //    setTimeout(function(){
                                  //    setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.SamsungTV_Mute', true);
                                  //    setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.SamsungTV_Mute', true);
                                  //    //log ( "Nicht verstanden" );
                                  //    }, 6000);
                                  lautstaerke(); // Lautstaerke auf 15 setzen
                                  sendTo("paw.0",'Tablet_Jörg',{tts: "Entschuldigung, ich habe dich leider nicht verstanden" });
                              }
                              
                              
                              
                              // Ende WakeWord-ErkennungsScript
                              //################################################################################################
                              
                              //__________________________________________________
                              function formatTwoDigits(n) {
                              return n < 10 ? '0' + n : n;
                              }
                              //__________________________________________________
                              function GetCurrentTimeStamp() {
                                  var now = new Date();
                                  //var hours = now.getHours();
                                  //var minutes = now.getMinutes();
                                  //var seconds = now.getSeconds();
                              
                                  var hours = formatTwoDigits(now.getHours());
                                  var minutes = formatTwoDigits(now.getMinutes());
                                  var seconds = formatTwoDigits(now.getSeconds());
                              
                                  var TimeString = hours + ":" + minutes + ":" + seconds;
                                  sendTo("paw.0",'Tablet_Jörg',{tts: "Es ist " + TimeString });
                              }
                              //__________________________________________________
                              function GetCurrentDate() {
                                  var datum = new Date();
                                  var tag = datum.getDay();
                                  var wotag = wochentag(tag);
                                  //log(wotag);
                                  var now = new Date();
                                  var dd = now.getDate();
                              
                                  var dd_string =  String(dd);
                                  var tagi =""
                                  if  (dd_string == "1")  { tagi = "ers";}   
                                  else if (dd_string == "3")  { tagi = "drit";}
                                  else { tagi = dd_string ;}
                              
                                  var mm = now.getMonth()+1;
                                  var monat ="";
                                  if  (mm == 1)  { monat = "Januar";}   
                              else if (mm == 2)  { monat = "Februar";} 
                              else if (mm == 3)  { monat = "März";} 
                              else if (mm == 4)  { monat = "April";} 
                              else if (mm == 5)  { monat = "Mai";} 
                              else if (mm == 6)  { monat = "Juni";} 
                              else if (mm == 7)  { monat = "Juli";} 
                              else if (mm == 8)  { monat = "August";} 
                              else if (mm == 9)  { monat = "September";} 
                              else if (mm == 10) { monat = "Oktober";} 
                              else if (mm == 11) { monat = "November";} 
                              else if (mm == 12) { monat = "Dezember";} 
                                  var yyyy = now.getFullYear();
                              
                                  //var DateString = " Heute ist" + wotag + " der  " + dd + "."+ mm +"."+yyyy; 
                                  var DateString = " Heute ist" + wotag + ",der  " + tagi + "te "   + monat +" "+ yyyy; 
                                  sendTo("paw.0",'Tablet_Jörg',{tts: DateString });
                              }
                              
                              //__________________________________________________
                              function wochentag(i){
                                  var tage = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'];
                                  var tag = (typeof(i) == 'object') ? i.getDay() : i ;
                                  return tage[tag];
                              }
                              //__________________________________________________
                              function fernsehlicht_ein(){
                              //regal an
                                  setState ('hm-rpc.2.CUX4000001.1.PRESS_LONG', true); 
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_An', true);
                              //couchjoerg an 
                                  setState ('hm-rpc.2.CUX4000001.10.PRESS_LONG', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_An', true);
                              //couchrenate an 
                                  setState ('hm-rpc.2.CUX4000001.3.PRESS_LONG', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_An', true);   
                              //hydro an
                                  setState ('hm-rpc.2.CUX4000001.8.PRESS_LONG', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_An', true);     
                              }
                              
                              //__________________________________________________
                              function fernsehlicht_aus(){
                              //regal aus
                                  setState ('hm-rpc.2.CUX4000001.1.PRESS_SHORT', true); 
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_Aus', true);
                              
                              //couchjoerg aus
                                  setState ('hm-rpc.2.CUX4000001.10.PRESS_SHORT', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_Aus', true);
                                  
                              //couchrenate aus
                                  setState ('hm-rpc.2.CUX4000001.3.PRESS_SHORT', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_Aus', true);
                              
                              //hydro aus
                                  setState ('hm-rpc.2.CUX4000001.8.PRESS_SHORT', true);
                                  setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_Aus', true);     
                              }
                              //__________________________________________________
                              
                              function GetPrinterTime() {
                                  const anycubic_fortschritt = 'octoprint.0.printjob.progress.completion'
                                  const anycubic_online = 'octoprint.0.info.connection'
                                  const rest = 'javascript.0.OctoPi.Restzeit'
                              
                              
                                  var druck_status  = getState(anycubic_online).val;    
                                  var druck_fortschritt0  = getState(anycubic_fortschritt).val;
                                  var druck_fortschritt   = Math.round(druck_fortschritt0 * 1) / 1; // keine Nachkommastellen ansagen
                              var restzeit  = getState(rest).val;
                              
                              var restzeit0 =restzeit.split(':')[0];
                              var restzeit1 =restzeit.split(':')[1];
                              var restzeit2 =restzeit.split(':')[2];
                              
                              var restzeit_std = parseInt( restzeit0);
                              var restzeit_min = parseInt( restzeit1);
                              var restzeit_sec = parseInt( restzeit2);
                              
                              if (restzeit_std > 1){ var stunde =  restzeit_std + " Stunden, "}
                              if (restzeit_std == 1){ var stunde = " eine Stunde, "}
                              if (restzeit_std == 0){ var stunde = ""}
                              
                              if (restzeit_min > 1){ var minute =  restzeit_min + " Minuten, "}
                              if (restzeit_min == 1){ var minute = " eine Minute, "}
                              if (restzeit_min == 0){ var minute = ""}
                              
                              if (druck_status != false){
                                  sendTo("paw.0",'Tablet_Jörg',{tts:  'Der 3 D-Drucker hat ' + druck_fortschritt + 'Prozent des Ausdruckes fertiggestellt. '
                                  + 'Es dauert noch ' + stunde + ' ' + minute  + ' und ' +restzeit_sec + ' Sekunden, bis der Ausdruck fertig ist.'  });
                              }
                              else{ sendTo("paw.0",'Tablet_Jörg',{tts: 'Der 3 D-Drucker ist ausgeschaltet'});  }
                              }
                              //__________________________________________________
                              
                              function GetWindows() {
                                  const windows = 'hm-rega.0.8240'
                                  var fenster_status  = getState(windows).val;
                                  //log("Anzahl Fenster: " + fenster_status);
                                  if (fenster_status > 1){
                                      sendTo("paw.0",'Tablet_Jörg',{tts:  'Ja, es sind noch  ' + fenster_status + ' Fenster im Haus offen'});
                                  }
                                  else if(fenster_status == 1) {
                                      sendTo("paw.0",'Tablet_Jörg',{tts:  'Ja, es ist noch ein Fenster im Haus offen'});
                                  }
                                  else{
                                      sendTo("paw.0",'Tablet_Jörg',{tts:  'Nein , alle Fenster im Haus sind geschlossen'});
                                  }
                              }
                              //__________________________________________________
                              
                              function GetRain() {
                                  const rain = 'javascript.0.WS2000.Regenmenge'
                                  const dauer = 'javascript.0.WS2000.Regendauer'
                                  var rain_amount  = getState(rain).val;
                                  //log("Regenmenge: " + rain_amount);
                                  let rain_amount_string =  String(rain_amount);
                                  let rain_today = rain_amount_string.replace(".",",");
                              
                                  var rain_duration  = getState(dauer).val;
                                  //log("Regendauer: " + rain_duration);
                                  let rain_duration_string = String(rain_duration);
                                  let duration_today = rain_duration_string.replace(".",",");
                                  //log("duration_today: " + duration_today);
                              
                              
                              
                                  let dauer_stunden = duration_today.split(':')[0];
                                  //log("dauer_stunden :" + dauer_stunden)
                                  let dauer_stunden_zahl =  parseInt(dauer_stunden); // String to number
                              
                                  let dauer_minuten = duration_today.split(':')[1];
                                  let dauer_minuten_zahl =  parseInt(dauer_minuten); // String to number
                                  //log("dauer_minuten_zahl: " + dauer_minuten_zahl);
                              
                              
                                  let stunden = "";
                                  let und = "";
                              
                                  //---------------------------------------------------
                              
                                  if (dauer_minuten_zahl == 0){ und = ""; dauer_minuten = "";}
                                  else if (dauer_minuten_zahl == 1){und = " und ";  dauer_minuten = " eine Minute"; }
                                  else if (dauer_minuten_zahl > 1 && dauer_minuten_zahl < 10){und = " und ";  dauer_minuten = dauer_minuten_zahl + " Minuten"; }  
                                  else if (dauer_minuten_zahl >= 10){ und = " und ";  dauer_minuten = dauer_minuten_zahl + " Minuten";  }
                              
                                  if (dauer_stunden_zahl == 0){ und = ""; dauer_stunden = ""; stunden = "";}
                                  else if (dauer_stunden_zahl == 1){ stunden = dauer_stunden_zahl + " Stunde"; }
                                  else if (dauer_stunden_zahl > 1) { stunden = dauer_stunden_zahl + " Stunden"; }
                              
                              
                                  //log( 'rain_amount: ' + rain_amount + ' duration_today: ' +  duration_today);
                                  if (rain_amount > 0){
                                      sendTo("paw.0",'Tablet_Jörg',{tts:  'Ja, es hat heute  ' + rain_today + ' Liter pro Quadratmeter geregnet'});
                                  }
                                  else if (rain_amount == 0 && dauer_minuten_zahl > 0 ){
                                      sendTo("paw.0",'Tablet_Jörg',{tts:  'Ja, aber es gab nur geringen Niederschlag, der' + stunden + und + dauer_minuten + " gedauert hat" });
                                  }
                                  else if (rain_amount == 0 ){
                                      sendTo("paw.0",'Tablet_Jörg',{tts:  'Nein, heute war es trocken'});
                                  }
                              }
                              //__________________________________________________
                              
                              
                              
                              function GetEvent() {
                                  const ereignis0     = 'javascript.0.Geburtstag.Heute0'     // Event0
                                  const ereignis1     = 'javascript.0.Geburtstag.Heute1'     // Event1
                                  const ereignis2     = 'javascript.0.Geburtstag.Heute2'     // Event2
                                  const bio_heute     = 'ical.1.events.0.today.Biomüll'
                                  const gelb_heute    = 'ical.1.events.0.today.GelberSack'
                                  const papier_heute  = 'ical.1.events.0.today.Papier'
                                  const rest_heute    = 'ical.1.events.0.today.Restmüll'
                                  const bio_morgen    = 'ical.1.events.1.Biomüll'
                                  const gelb_morgen   = 'ical.1.events.1.GelberSack'
                                  const papier_morgen = 'ical.1.events.1.Papier'
                                  const rest_morgen   = 'ical.1.events.1.Restmüll'
                              
                                  var event0          = getState(ereignis0).val;
                                  var event1          = getState(ereignis1).val;
                                  var event2          = getState(ereignis2).val;
                                  var bio_today       = getState(bio_heute).val;
                                  var gelb_today      = getState(gelb_heute).val;
                                  var papier_today    = getState(papier_heute).val;
                                  var rest_today      = getState(rest_heute).val;
                                  var bio_tomorrow    = getState(bio_morgen).val;
                                  var gelb_tomorrow   = getState(gelb_morgen).val;
                                  var papier_tomorrow = getState(papier_morgen).val;
                                  var rest_tomorrow   = getState(rest_morgen).val;
                              
                                  if (event0 != '' && event0 != 'Heute: Biomüll' && event0 != 'Heute: Gelber Sack' && event0 != 'Heute: Papier' && event0 != 'Heute: Restmüll' ){
                                      sendTo("paw.0",'Tablet_Jörg',{tts: 'Ja, ' + event0 + '. '});
                                  }
                              
                                  if (event1 != '' && event1 != 'Heute: Biomüll' && event1 != 'Heute: Gelber Sack' && event1 != 'Heute: Papier' && event1 != 'Heute: Restmüll' ){
                                      sendTo("paw.0",'Tablet_Jörg',{tts: ' ' + event1 + '. '});
                                  }
                              
                                 if (event2 != '' && event2 != 'Heute: Biomüll' && event2 != 'Heute: Gelber Sack' && event2 != 'Heute: Papier' && event2 != 'Heute: Restmüll' ){
                                      sendTo("paw.0",'Tablet_Jörg',{tts: ' ' + event2 + '. '});
                                  }
                              
                              
                              //if (bio_today == true || bio_tomorrow == true || gelb_today == true || gelb_tomorrow == true || papier_today == true || papier_tomorrow == true || rest_today == true || rest_tomorrow == true)   {
                              // sendTo("paw.0",'Tablet_Jörg',{tts:  'Es wird Müll abgeholt und zwar: '});
                              //}
                              
                              
                                  if (bio_today == true)   { sendTo("paw.0",'Tablet_Jörg',{tts:  ' Heute Biomüll. '}); }
                                  if (gelb_today == true)  { sendTo("paw.0",'Tablet_Jörg',{tts:  ' Heute Gelbersack. '}); }
                                  if (papier_today == true){ sendTo("paw.0",'Tablet_Jörg',{tts:  ' Heute Papiertonne. '}); }        
                                  if (rest_today == true)  { sendTo("paw.0",'Tablet_Jörg',{tts:  ' Heute Restmüll. '}); }          
                                      
                                  if (bio_tomorrow == true)    { sendTo("paw.0",'Tablet_Jörg',{tts: ' Morgen Biomüll. '}); }
                                  if (gelb_tomorrow == true)   { sendTo("paw.0",'Tablet_Jörg',{tts: ' Morgen Gelbersack. '}); }
                                  if (papier_tomorrow == true) { sendTo("paw.0",'Tablet_Jörg',{tts: ' Morgen Papiertonne. '}); }
                                  if (rest_tomorrow == true)   { sendTo("paw.0",'Tablet_Jörg',{tts: ' Morgen Restmüll. '}); }
                              
                                  if (event0 == '' && event1 == '' && event2 == ''
                                  && bio_today == false && gelb_today == false && papier_today == false && rest_today == false
                                  && bio_tomorrow == false && gelb_tomorrow == false && papier_tomorrow == false && rest_tomorrow == false
                                   )
                                  { sendTo("paw.0",'Tablet_Jörg',{tts:  'Nein , es stehen keine Termine an.'}); }
                              }
                              //__________________________________________________
                              
                              
                              function GetMoodlight() {
                                  let empf_code = getState(moodlight).val ;
                                  let empf_json = JSON.parse(empf_code);
                                   let moodlight_name = empf_json.name;
                                   let moodelight_state = empf_json.state;
                                  //log("moodlight_name: " + moodlight_name);
                                  //log("moodelight_state: " + moodelight_state);
                              
                                  if (moodelight_state == "regenbogen"){
                                   setState ('javascript.0.wled.brightness', 150);      
                                   setState ('javascript.0.wled.effekt', 9);
                                   setState ('javascript.0.wled.intensity', 128);
                                   setState ('javascript.0.wled.speed', 80);
                                  }
                                  else if(moodelight_state ==  "polizei") {
                                   setState ('javascript.0.wled.brightness', 80);
                                   setState ('javascript.0.wled.effekt', 49);
                                   setState ('javascript.0.wled.intensity', 94);
                                   setState ('javascript.0.wled.speed', 181);
                                  }
                                  else if(moodelight_state ==  "running") {
                                   setState ('javascript.0.wled.brightness', 80);
                                   setState ('javascript.0.wled.farbe', "#efec5d");      
                                   setState ('javascript.0.wled.effekt', 15);
                                   setState ('javascript.0.wled.intensity', 156);
                                   setState ('javascript.0.wled.speed', 31);
                                  }
                                  else if(moodelight_state ==  "wischen") {
                                   setState ('javascript.0.wled.brightness', 80);    
                                   setState ('javascript.0.wled.effekt', 36);
                                   setState ('javascript.0.wled.intensity', 136);
                                   setState ('javascript.0.wled.speed', 232);
                                  }
                                  else if(moodelight_state ==  "christmas") {
                                   setState ('javascript.0.wled.brightness', 80);     
                                   setState ('javascript.0.wled.effekt', 44);
                                   setState ('javascript.0.wled.intensity', 156);
                                   setState ('javascript.0.wled.speed', 168);
                                  }
                                  else if(moodelight_state ==  "slowly") {
                                   setState ('javascript.0.wled.brightness', 140);   
                                   setState ('javascript.0.wled.effekt', 63);
                                   setState ('javascript.0.wled.intensity', 220);
                                   setState ('javascript.0.wled.speed', 1);
                                  }
                              
                              sendTo("paw.0",'Tablet_Jörg',{tts: "Lichteffekt " + moodelight_state + " wurde aktiviert" }); 
                              }
                              //__________________________________________________
                              
                              
                              
                              
                              // Lautstaerke Tablet_Jörg auf 14 setzen
                              function lautstaerke(){ 
                                  sendTo("paw.0",'Tablet_Jörg',{volume: 14});
                              }
                              

                              Die Broadlink-Sachen im Script kannst Du ignorieren, die setzen lediglich einige Icons in meinem VIS.

                              Gruß
                              Jörg

                              joergeliJ Offline
                              joergeliJ Offline
                              joergeli
                              schrieb am zuletzt editiert von
                              #203

                              @tobetobe
                              Hallo Thomas,

                              ein Nachtrag zu meinem obigen Beitrag:

                              Kannst Du nicht - so wie ich auch - Deine bisherigen 2.4.19er Scripte einfach durch Ändern der Rhasspy-Intents auf Hermes-Intents und Ändern der Slots anpassen, damit sie auch weiterhin mit Rhasspy 2.5 funktionieren.?
                              Das aber natürlich unter Verwendung des MQTT-Clients mqtt.1

                              Gruß
                              Jörg

                              tobetobeT 1 Antwort Letzte Antwort
                              0
                              • joergeliJ joergeli

                                @tobetobe
                                Hallo Thomas,

                                ein Nachtrag zu meinem obigen Beitrag:

                                Kannst Du nicht - so wie ich auch - Deine bisherigen 2.4.19er Scripte einfach durch Ändern der Rhasspy-Intents auf Hermes-Intents und Ändern der Slots anpassen, damit sie auch weiterhin mit Rhasspy 2.5 funktionieren.?
                                Das aber natürlich unter Verwendung des MQTT-Clients mqtt.1

                                Gruß
                                Jörg

                                tobetobeT Offline
                                tobetobeT Offline
                                tobetobe
                                schrieb am zuletzt editiert von
                                #204

                                @joergeli

                                Hallo Jörg,

                                ich hatte in den letzten Tagen nicht so viel Zeit, mich hierum zu kümmern. Ich melde mich morgen mal.

                                Dann noch einen schönen Abend
                                Thomas

                                Beste Grüße
                                tobetobe

                                1 Antwort Letzte Antwort
                                0
                                • joergeliJ joergeli

                                  Hallo Thomas,

                                  @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                  Bei Mosquitto geht das über den Befehl "client.on(xxx), bei ioBroker über klassisch "on({id...". Persönlich würde ich Mosquitto aus folgenden Gründen bevorzugen: Eine Instanz weniger, die am Prozess beteiligt ist, um die man sich schon nicht mehr kümmern muss und die auch keine Fehlerquelle mehr darstellt, wenn sie entfällt (ich meine damit mqtt.1 Client). Zudem weniger Last auf ioBroker,

                                  Warum das Rad neu erfinden und es nicht beim MQTT-Client-Adapter belassen?
                                  Bist Du sicher, daß dadurch weniger Last ( RAM-Auslastung ? ) verursacht wird ?
                                  Letztendlich machen IMHO Deine client.subscribe(topic_list,{.... auch nichts anderes als der Adapter.

                                  Für mich stellt sich aber trotzdem nach wie vor die Frage, was ist bei Rhasspy 2.5 anders als bei 2.4.19, wo ja der ioBroker MQTT-Server/Broker-Adapter die Intents automatisch, ohne weiteres Zutun, von selbst angelegt hat

                                  Ich hatte ja geschrieben, daß das Ausfiltern der intents, bzw. slots, m.E. das kleinere Übel ist.
                                  Die Problematik fängt m.E. mit der Reaktion auf die entspr. Slots an, was je nach Anzahl der Slots auf viele if-Abfragen heraus läuft.

                                  Meine Sentences/Slots sind ja nicht so komplex aufgebaut, wie Deine.
                                  Ich brauche z.B. keine Dimmer-Werte wie 10% 25%, 40% 50%, 75%, oder Farbwerte wie rot, grün, blau, etc., sondern nur Lampe xy ein/aus.
                                  Je mehr Möglichkeiten, bzw. Kombinationen, wie z.B "Dimme Lampe xy auf 50% mit Farbe blau", existieren, desto komplexer, bzw. umfangreicher wird die Auswertung ( = if-Abfragen)

                                  Meine einfachen Sachen, wie "Schalte Lampe xy ein/aus" benötigen pro Lampe nur 2 if-Abfragen:

                                  if (name == "lampe xy" && state == "ein") {setState ('hm-rpc.2.CUX4000001.7.PRESS_LONG', true);
                                  else if(name == "lampe xy" && state == "aus") {  setState ('hm-rpc.2.CUX4000001.7.PRESS_SHORT', true);
                                  

                                  Ich hänge Dir hier noch mal mein kpl. Auswerte-JS an, welches via mqtt.1 und Rhasspy 2.5-pre einwandfrei funktioniert.

                                  Wohlgemerkt: :
                                  Ich musste gegenüber dem 2.4.19-Script lediglich auf die entspr. mqtt.1.hermes.intent.xyz abändern und in den on({id:... -Abschnitten alle Variablen name und state auf die neue JSON-Struktur umstellen.

                                  let name = empf_json.slots[0].value.value;
                                  let state = empf_json.slots[1].value.value;
                                  

                                  Vielleicht hilft es Dir ja weiter.

                                  //##########################################################################
                                  // Rhasspy-Voltron-intents via MQTT-Client empfangen und entspr.Datenpunkte setzen/schalten
                                  //##########################################################################
                                  
                                  
                                  const szenen     = 'mqtt.1.hermes.intent.Scenes'       // Broadlink-Szenen
                                  const rolladen   = 'mqtt.1.hermes.intent.Rolladen'     // Rolladen
                                  const lampen     = 'mqtt.1.hermes.intent.Lampen'       // Lampen, bzw. Funksteckdosen
                                  const drucker    = 'mqtt.1.hermes.intent.Drucker'      // 3D Drucker
                                  const fenster    = 'mqtt.1.hermes.intent.Fenster'      // Anzahl offene Fenster
                                  const regen      = 'mqtt.1.hermes.intent.Regen'        // Regen heute
                                  const ereignis   = 'mqtt.1.hermes.intent.Ereignis'     // Heutige Termine
                                  const zeit       = 'mqtt.1.hermes.intent.Zeit'         // Uhrzeit
                                  const datum      = 'mqtt.1.hermes.intent.Datum'        // Datum
                                  const temperatur = 'mqtt.1.hermes.intent.Temperatur'   // Temperatur
                                  
                                  
                                  
                                  //______________________________________________
                                  // Termine
                                  on({id: ereignis, change: "any"},function(obj) {
                                      let empf_code = getState(ereignis).val ;
                                      let empf_json = JSON.parse(empf_code);
                                      let state = empf_json.state;
                                          GetEvent();
                                  });
                                  
                                  
                                  //______________________________________________
                                  // Regen
                                  on({id: regen, change: "any"},function(obj) {
                                      let empf_code = getState(regen).val ;
                                      let empf_json = JSON.parse(empf_code);
                                      let state = empf_json.slots[0].value.value;
                                      //log ("state: " + state); 
                                      if (state == "geregnet") {
                                          GetRain();
                                      }
                                  });
                                  
                                  //______________________________________________
                                  // Fenster
                                  on({id: fenster, change: "any"},function(obj) {
                                      let empf_code = getState(fenster).val ;
                                      let empf_json = JSON.parse(empf_code);
                                      let state = empf_json.slots[0].value.value;
                                      //log ("state: " + state); 
                                    if (state == "offen" || state == "zu") {
                                          GetWindows();
                                      }
                                  });
                                  
                                  
                                  //______________________________________________
                                  // 3d-Drucker
                                  on({id: drucker, change: "any"},function(obj) {
                                      let empf_code = getState(drucker).val ;
                                      let empf_json = JSON.parse(empf_code);
                                      let state = empf_json.slots[0].value.value;
                                      //log ("state: " + state);  
                                      if (state == "weit") {
                                          GetPrinterTime();
                                      }
                                  });
                                  
                                  
                                  //______________________________________________
                                  // Uhrzeit
                                  on({id: zeit, change: "any"},function(obj) {
                                      let empf_code = getState(zeit).val ;
                                      let empf_json = JSON.parse(empf_code);
                                      let name = empf_json.name;
                                      let state = empf_json.state;
                                      //log ("state: " + state);
                                    //if (state == "sp\u00e4t") {
                                          GetCurrentTimeStamp();
                                    //  }
                                  });
                                  
                                  //______________________________________________
                                  // Datum
                                  on({id: datum, change: "any"},function(obj) {
                                      let empf_code = getState(datum).val ;
                                          //log ("empf_code: " + empf_code);
                                      let empf_json = JSON.parse(empf_code);
                                      let intent = empf_json.intent.intentName;
                                      //log ("intent: " + intent);
                                       if (intent == "Datum") {
                                          GetCurrentDate();
                                      }
                                  });
                                  
                                  
                                  
                                  
                                  //______________________________________________
                                  // Temperaturen
                                  on({id: temperatur, change: "any"},function(obj) {
                                      let empf_code = getState(temperatur).val ;
                                      //log ("empf_code: " + empf_code);
                                  
                                      let empf_json = JSON.parse(empf_code);
                                      let state = empf_json.slots[0].value.value;
                                      //log ("state: " + state);
                                  
                                  
                                    if (state == "draussen") {
                                      let aussentemp_obj = "hm-rpc.2.CUX0100001.1.TEMPERATURE";
                                      let aussenfeuchte_obj = "hm-rpc.2.CUX0100001.1.HUMIDITY";
                                      let aussentemp_wert = getState(aussentemp_obj).val;
                                      let aussenfeuchte_wert = getState(aussenfeuchte_obj).val;
                                      let aussentemp_string =  String(aussentemp_wert);
                                      let aussenfeuchte_string =  String(aussenfeuchte_wert);
                                      let aussentemp = aussentemp_string.replace(".",",");
                                      let aussenfeuchte = aussenfeuchte_string.replace(".",",");
                                      //log ( " Aussen-Temperatur ist " + aussentemp + " Grad" );
                                      sendTo("paw.0",'Tablet_Jörg',{tts: "Es sind " + aussentemp + " Grad draussen bei " + aussenfeuchte + " Prozent Luftfeuchtigkeit" });      
                                       }
                                  else if(state == "innen" || state == "wohnzimmer") {
                                      let innentemp_obj = "sonoff.0.Kodi-Stecker.AM2301_Temperature";
                                      let innentemp_wert = getState(innentemp_obj).val;
                                      let innentemp_string =  String(innentemp_wert);
                                      let innentemp = innentemp_string.replace(".",",");
                                      //log ( " Innen-Temperatur ist " + innentemp + " Grad" );
                                      sendTo("paw.0",'Tablet_Jörg',{tts: "Es sind " + innentemp + " Grad im Wohnzimmer" });      
                                       }
                                  else if(state == "schlafzimmer") {
                                      let schlafzimmer_obj = "javascript.0.DHT22.Schlafzimmer.Temp";
                                      let schlafzimmer_wert = getState(schlafzimmer_obj).val;
                                      let schlafzimmer_string =  String(schlafzimmer_wert);
                                      let schlafzimmer = schlafzimmer_string.replace(".",",");
                                      //log ( " Schlafzimmer-Temperatur ist " + schlafzimmer + " Grad" );
                                      sendTo("paw.0",'Tablet_Jörg',{tts: "Es sind " + schlafzimmer + " Grad im Schlafzimmer" });      
                                       }
                                  else if(state == "badewasser") {
                                      let badewasser_obj = "javascript.0.SolarParser.Daten5";
                                      let badewasser_wert = getState(badewasser_obj).val;
                                      let badewasser_string =  String(badewasser_wert);
                                      let badewassertemp = badewasser_string.replace(".",",");
                                      //log ( " Badewasser-Temperatur ist " + badewassertemp + " Grad" );
                                      sendTo("paw.0",'Tablet_Jörg',{tts: "Das Badewasser hat " + badewassertemp + " Grad" });      
                                       }
                                  });
                                  
                                  //______________________________________________
                                  // Lampen, bzw. Funksteckdosen
                                  on({id: lampen, change: "any"},function(obj) {
                                      let empf_code = getState(lampen).val ;
                                      //log ("EMPF-CODE: " + empf_code);
                                      let empf_json = JSON.parse(empf_code);
                                  
                                    
                                      let name = empf_json.slots[0].value.value;
                                       //log ("name: " + name);
                                      let state = empf_json.slots[1].value.value;
                                       //log ("state: " + state);
                                  
                                   if(name == "wandspots" && state == "ein") { 
                                      setState ('hm-rpc.2.CUX4000001.7.PRESS_LONG', true); 
                                      //setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Wandspots_An', true);
                                   }
                                  else if(name == "wandspots" && state == "aus") { 
                                      setState ('hm-rpc.2.CUX4000001.7.PRESS_SHORT', true); 
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Wandspots_Aus', true);
                                  }
                                  
                                  else if(name == "regal" && state == "ein") { 
                                      setState ('hm-rpc.2.CUX4000001.1.PRESS_LONG', true); 
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_An', true);
                                   }
                                  else if(name == "regal" && state == "aus") { 
                                      setState ('hm-rpc.2.CUX4000001.1.PRESS_SHORT', true); 
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_Aus', true);
                                  }
                                  
                                  else if(name == "couchjoerg" && state == "ein") {
                                      setState ('hm-rpc.2.CUX4000001.10.PRESS_LONG', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_An', true);
                                  }
                                  else if(name == "couchjoerg" && state == "aus") {
                                      setState ('hm-rpc.2.CUX4000001.10.PRESS_SHORT', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_Aus', true);
                                  }
                                  
                                  else if(name == "couchrenate" && state == "ein") {
                                      setState ('hm-rpc.2.CUX4000001.3.PRESS_LONG', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_An', true);   
                                  }
                                  else if(name == "couchrenate" && state == "aus") {
                                      setState ('hm-rpc.2.CUX4000001.3.PRESS_SHORT', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_Aus', true);
                                  }
                                  
                                  else if(name == "hydro" && state == "ein") {
                                      setState ('hm-rpc.2.CUX4000001.8.PRESS_LONG', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_An', true);     
                                  }
                                  else if(name == "hydro" && state == "aus") {
                                      setState ('hm-rpc.2.CUX4000001.8.PRESS_SHORT', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_Aus', true);    
                                  }
                                  
                                  else if(name == "ledcube" && state == "ein") {
                                      setState ('hm-rpc.2.CUX4000001.5.PRESS_LONG', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.LED-Wuerfel_An', true);     
                                  }
                                  else if(name == "ledcube" && state == "aus") {
                                      setState ('hm-rpc.2.CUX4000001.5.PRESS_SHORT', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.LED-Wuerfel_Aus', true);    
                                  }
                                  
                                  else if(name == "essecke" && state == "ein") {
                                      setState ('hm-rpc.2.CUX4000001.2.PRESS_LONG', true); 
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Essecke_An', true);
                                  }
                                  else if(name == "essecke" && state == "aus") {
                                      setState ('hm-rpc.2.CUX4000001.2.PRESS_SHORT', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Essecke_Aus', true);
                                  }
                                  
                                  else if(name == "esstischlampe" && state == "ein") { setState ('shelly.0.SHSW-1#2C7AEF#1.Relay0.Switch', true); }
                                  else if(name == "esstischlampe" && state == "aus") { setState ('shelly.0.SHSW-1#2C7AEF#1.Relay0.Switch', false); }
                                  
                                  else if(name == "fernsehlicht" && state == "ein") { fernsehlicht_ein(); }
                                  else if(name == "fernsehlicht" && state == "aus") { fernsehlicht_aus(); }
                                  
                                  else if(name == "radio" && state == "ein") { setState ('javascript.0.Silvercrest.On', true); }
                                  else if(name == "radio" && state == "aus") { setState ('javascript.0.Silvercrest.On', false); }
                                  
                                  
                                  //log ( name + " ist " + state );
                                  sendTo("paw.0",'Tablet_Jörg',{tts: name + " wurde " + state + "geschaltet" }); 
                                  });
                                  
                                  
                                  //______________________________________________
                                  // Broadlink-Szenen
                                  on({id: szenen, change: "any"},function(obj) {
                                      let empf_code = getState(szenen).val ;
                                      let empf_json = JSON.parse(empf_code);
                                      let name = empf_json.name;
                                      let state = empf_json.state;
                                      //log ("name: " + name + "  state: " + state);
                                  if (name == "schlafen" && state == "gehen"){
                                      fernsehlicht_aus();     
                                      setState ('broadlink2.0.Scenes.Schlafen', true);
                                      sendTo("paw.0",'Tablet_Jörg',{tts: 'Wohnzimmerbeleuchtung und Fernseher werden ausgeschaltet. Gute Nacht.' }); 
                                  }
                                  else if(name == "fernsehabend" && state == "aktivieren") {    
                                      fernsehlicht_ein();  
                                      setState ('broadlink2.0.Scenes.Fernsehabend', true);
                                      sendTo("paw.0",'Tablet_Jörg',{tts: name + ' wird aktiviert. Ich wünsche gute Unterhaltung.' }); 
                                  }
                                  });
                                  //______________________________________________
                                  
                                  // Rolladen
                                  on({id: rolladen, change: "any"},function(obj) {
                                      let empf_code = getState(rolladen).val ;
                                      let empf_json = JSON.parse(empf_code);
                                  
                                  
                                      let name = empf_json.slots[0].value.value;
                                       //log ("name: " + name);
                                      let state = empf_json.slots[1].value.value;
                                       //log ("state: " + state);
                                  
                                       log ("name: " + name + "  state: " + state);
                                  if (name == "rolladen" && state == "hochfahren"){
                                      setState ('hm-rpc.0.PEQ0505813.1.STATE', true);
                                      sendTo("paw.0",'Tablet_Jörg',{tts: name  + ' werden hochgefahren'  });
                                  }
                                  else if(name == "rolladen" && state == "runterfahren"){
                                      setState ('hm-rpc.0.PEQ0505813.3.STATE', true);
                                      sendTo("paw.0",'Tablet_Jörg',{tts: name + ' werden runtergefahren' });
                                  }
                                  else if(name == "rolladen" && state == "stoppen"){
                                      setState ('hm-rpc.0.PEQ0505813.2.STATE', true);
                                      sendTo("paw.0",'Tablet_Jörg',{tts: name + " werden gestoppt " });
                                  }
                                  //log ( name + " " + state );
                                  });
                                  //______________________________________________
                                  
                                  
                                  
                                  //################################################################################################
                                  // WakeWord-Erkennung
                                  const wake   = 'mqtt.1.hermes.asr.startListening'      // Wakeword erkannt
                                  const befehl = 'mqtt.1.hermes.asr.textCaptured' // Datenpunkt aendert sich von listening auf loaded, wenn befehl erkannt erkannt wurde
                                  const unbekannt = 'mqtt.1.hermes.nlu.intentNotRecognized' // Datenpunkt Intent nicht erkannt
                                  
                                  on({id: wake, change: "any"},function(obj) {
                                      wakeword();
                                           
                                  });
                                  
                                  on({id: befehl, change: "any"},function(obj) {
                                      //befehl_empf();   
                                  });
                                  
                                  on({id: unbekannt, change: "any"},function(obj) {
                                      nicht_erkannt();
                                  });
                                  
                                  
                                  function wakeword(){
                                      //setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.SamsungTV_Mute', true);
                                      lautstaerke(); // Lautstaerke auf 15 setzen
                                      sendTo("paw.0",'Tablet_Jörg',{tts: "ja"  }); // Sprachausgabe mittels PAW-Adapter auf Tablet/Smartphone
                                      //sendTo("paw.0",'Tablet_Jörg',{play: true});  // optional default sound anstatt sprachausgabe mittels mittels PAW-Adapter auf Tablet/Smartphone abspielen
                                  }
                                  
                                  function befehl_empf(){ 
                                          setTimeout(function(){
                                      //   setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.SamsungTV_Mute', true);
                                      //    //log ( "Mute gesetzt " );
                                          }, 10000);
                                      lautstaerke(); // Lautstaerke auf 15 setzen
                                      sendTo("paw.0",'Tablet_Jörg',{tts: "Moment bitte,    "  }); // Sprachausgabe mittels PAW-Adapter auf Tablet/Smartphone
                                  }
                                  
                                  function nicht_erkannt(){ 
                                      //    setTimeout(function(){
                                      //    setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.SamsungTV_Mute', true);
                                      //    setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.SamsungTV_Mute', true);
                                      //    //log ( "Nicht verstanden" );
                                      //    }, 6000);
                                      lautstaerke(); // Lautstaerke auf 15 setzen
                                      sendTo("paw.0",'Tablet_Jörg',{tts: "Entschuldigung, ich habe dich leider nicht verstanden" });
                                  }
                                  
                                  
                                  
                                  // Ende WakeWord-ErkennungsScript
                                  //################################################################################################
                                  
                                  //__________________________________________________
                                  function formatTwoDigits(n) {
                                  return n < 10 ? '0' + n : n;
                                  }
                                  //__________________________________________________
                                  function GetCurrentTimeStamp() {
                                      var now = new Date();
                                      //var hours = now.getHours();
                                      //var minutes = now.getMinutes();
                                      //var seconds = now.getSeconds();
                                  
                                      var hours = formatTwoDigits(now.getHours());
                                      var minutes = formatTwoDigits(now.getMinutes());
                                      var seconds = formatTwoDigits(now.getSeconds());
                                  
                                      var TimeString = hours + ":" + minutes + ":" + seconds;
                                      sendTo("paw.0",'Tablet_Jörg',{tts: "Es ist " + TimeString });
                                  }
                                  //__________________________________________________
                                  function GetCurrentDate() {
                                      var datum = new Date();
                                      var tag = datum.getDay();
                                      var wotag = wochentag(tag);
                                      //log(wotag);
                                      var now = new Date();
                                      var dd = now.getDate();
                                  
                                      var dd_string =  String(dd);
                                      var tagi =""
                                      if  (dd_string == "1")  { tagi = "ers";}   
                                      else if (dd_string == "3")  { tagi = "drit";}
                                      else { tagi = dd_string ;}
                                  
                                      var mm = now.getMonth()+1;
                                      var monat ="";
                                      if  (mm == 1)  { monat = "Januar";}   
                                  else if (mm == 2)  { monat = "Februar";} 
                                  else if (mm == 3)  { monat = "März";} 
                                  else if (mm == 4)  { monat = "April";} 
                                  else if (mm == 5)  { monat = "Mai";} 
                                  else if (mm == 6)  { monat = "Juni";} 
                                  else if (mm == 7)  { monat = "Juli";} 
                                  else if (mm == 8)  { monat = "August";} 
                                  else if (mm == 9)  { monat = "September";} 
                                  else if (mm == 10) { monat = "Oktober";} 
                                  else if (mm == 11) { monat = "November";} 
                                  else if (mm == 12) { monat = "Dezember";} 
                                      var yyyy = now.getFullYear();
                                  
                                      //var DateString = " Heute ist" + wotag + " der  " + dd + "."+ mm +"."+yyyy; 
                                      var DateString = " Heute ist" + wotag + ",der  " + tagi + "te "   + monat +" "+ yyyy; 
                                      sendTo("paw.0",'Tablet_Jörg',{tts: DateString });
                                  }
                                  
                                  //__________________________________________________
                                  function wochentag(i){
                                      var tage = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'];
                                      var tag = (typeof(i) == 'object') ? i.getDay() : i ;
                                      return tage[tag];
                                  }
                                  //__________________________________________________
                                  function fernsehlicht_ein(){
                                  //regal an
                                      setState ('hm-rpc.2.CUX4000001.1.PRESS_LONG', true); 
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_An', true);
                                  //couchjoerg an 
                                      setState ('hm-rpc.2.CUX4000001.10.PRESS_LONG', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_An', true);
                                  //couchrenate an 
                                      setState ('hm-rpc.2.CUX4000001.3.PRESS_LONG', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_An', true);   
                                  //hydro an
                                      setState ('hm-rpc.2.CUX4000001.8.PRESS_LONG', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_An', true);     
                                  }
                                  
                                  //__________________________________________________
                                  function fernsehlicht_aus(){
                                  //regal aus
                                      setState ('hm-rpc.2.CUX4000001.1.PRESS_SHORT', true); 
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_Regal_Aus', true);
                                  
                                  //couchjoerg aus
                                      setState ('hm-rpc.2.CUX4000001.10.PRESS_SHORT', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchJoerg_Aus', true);
                                      
                                  //couchrenate aus
                                      setState ('hm-rpc.2.CUX4000001.3.PRESS_SHORT', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_CouchRenate_Aus', true);
                                  
                                  //hydro aus
                                      setState ('hm-rpc.2.CUX4000001.8.PRESS_SHORT', true);
                                      setState ('broadlink2.0.RM:0x27a9_34:ea:34:55:3a:50.L.Licht_HydroTV_Aus', true);     
                                  }
                                  //__________________________________________________
                                  
                                  function GetPrinterTime() {
                                      const anycubic_fortschritt = 'octoprint.0.printjob.progress.completion'
                                      const anycubic_online = 'octoprint.0.info.connection'
                                      const rest = 'javascript.0.OctoPi.Restzeit'
                                  
                                  
                                      var druck_status  = getState(anycubic_online).val;    
                                      var druck_fortschritt0  = getState(anycubic_fortschritt).val;
                                      var druck_fortschritt   = Math.round(druck_fortschritt0 * 1) / 1; // keine Nachkommastellen ansagen
                                  var restzeit  = getState(rest).val;
                                  
                                  var restzeit0 =restzeit.split(':')[0];
                                  var restzeit1 =restzeit.split(':')[1];
                                  var restzeit2 =restzeit.split(':')[2];
                                  
                                  var restzeit_std = parseInt( restzeit0);
                                  var restzeit_min = parseInt( restzeit1);
                                  var restzeit_sec = parseInt( restzeit2);
                                  
                                  if (restzeit_std > 1){ var stunde =  restzeit_std + " Stunden, "}
                                  if (restzeit_std == 1){ var stunde = " eine Stunde, "}
                                  if (restzeit_std == 0){ var stunde = ""}
                                  
                                  if (restzeit_min > 1){ var minute =  restzeit_min + " Minuten, "}
                                  if (restzeit_min == 1){ var minute = " eine Minute, "}
                                  if (restzeit_min == 0){ var minute = ""}
                                  
                                  if (druck_status != false){
                                      sendTo("paw.0",'Tablet_Jörg',{tts:  'Der 3 D-Drucker hat ' + druck_fortschritt + 'Prozent des Ausdruckes fertiggestellt. '
                                      + 'Es dauert noch ' + stunde + ' ' + minute  + ' und ' +restzeit_sec + ' Sekunden, bis der Ausdruck fertig ist.'  });
                                  }
                                  else{ sendTo("paw.0",'Tablet_Jörg',{tts: 'Der 3 D-Drucker ist ausgeschaltet'});  }
                                  }
                                  //__________________________________________________
                                  
                                  function GetWindows() {
                                      const windows = 'hm-rega.0.8240'
                                      var fenster_status  = getState(windows).val;
                                      //log("Anzahl Fenster: " + fenster_status);
                                      if (fenster_status > 1){
                                          sendTo("paw.0",'Tablet_Jörg',{tts:  'Ja, es sind noch  ' + fenster_status + ' Fenster im Haus offen'});
                                      }
                                      else if(fenster_status == 1) {
                                          sendTo("paw.0",'Tablet_Jörg',{tts:  'Ja, es ist noch ein Fenster im Haus offen'});
                                      }
                                      else{
                                          sendTo("paw.0",'Tablet_Jörg',{tts:  'Nein , alle Fenster im Haus sind geschlossen'});
                                      }
                                  }
                                  //__________________________________________________
                                  
                                  function GetRain() {
                                      const rain = 'javascript.0.WS2000.Regenmenge'
                                      const dauer = 'javascript.0.WS2000.Regendauer'
                                      var rain_amount  = getState(rain).val;
                                      //log("Regenmenge: " + rain_amount);
                                      let rain_amount_string =  String(rain_amount);
                                      let rain_today = rain_amount_string.replace(".",",");
                                  
                                      var rain_duration  = getState(dauer).val;
                                      //log("Regendauer: " + rain_duration);
                                      let rain_duration_string = String(rain_duration);
                                      let duration_today = rain_duration_string.replace(".",",");
                                      //log("duration_today: " + duration_today);
                                  
                                  
                                  
                                      let dauer_stunden = duration_today.split(':')[0];
                                      //log("dauer_stunden :" + dauer_stunden)
                                      let dauer_stunden_zahl =  parseInt(dauer_stunden); // String to number
                                  
                                      let dauer_minuten = duration_today.split(':')[1];
                                      let dauer_minuten_zahl =  parseInt(dauer_minuten); // String to number
                                      //log("dauer_minuten_zahl: " + dauer_minuten_zahl);
                                  
                                  
                                      let stunden = "";
                                      let und = "";
                                  
                                      //---------------------------------------------------
                                  
                                      if (dauer_minuten_zahl == 0){ und = ""; dauer_minuten = "";}
                                      else if (dauer_minuten_zahl == 1){und = " und ";  dauer_minuten = " eine Minute"; }
                                      else if (dauer_minuten_zahl > 1 && dauer_minuten_zahl < 10){und = " und ";  dauer_minuten = dauer_minuten_zahl + " Minuten"; }  
                                      else if (dauer_minuten_zahl >= 10){ und = " und ";  dauer_minuten = dauer_minuten_zahl + " Minuten";  }
                                  
                                      if (dauer_stunden_zahl == 0){ und = ""; dauer_stunden = ""; stunden = "";}
                                      else if (dauer_stunden_zahl == 1){ stunden = dauer_stunden_zahl + " Stunde"; }
                                      else if (dauer_stunden_zahl > 1) { stunden = dauer_stunden_zahl + " Stunden"; }
                                  
                                  
                                      //log( 'rain_amount: ' + rain_amount + ' duration_today: ' +  duration_today);
                                      if (rain_amount > 0){
                                          sendTo("paw.0",'Tablet_Jörg',{tts:  'Ja, es hat heute  ' + rain_today + ' Liter pro Quadratmeter geregnet'});
                                      }
                                      else if (rain_amount == 0 && dauer_minuten_zahl > 0 ){
                                          sendTo("paw.0",'Tablet_Jörg',{tts:  'Ja, aber es gab nur geringen Niederschlag, der' + stunden + und + dauer_minuten + " gedauert hat" });
                                      }
                                      else if (rain_amount == 0 ){
                                          sendTo("paw.0",'Tablet_Jörg',{tts:  'Nein, heute war es trocken'});
                                      }
                                  }
                                  //__________________________________________________
                                  
                                  
                                  
                                  function GetEvent() {
                                      const ereignis0     = 'javascript.0.Geburtstag.Heute0'     // Event0
                                      const ereignis1     = 'javascript.0.Geburtstag.Heute1'     // Event1
                                      const ereignis2     = 'javascript.0.Geburtstag.Heute2'     // Event2
                                      const bio_heute     = 'ical.1.events.0.today.Biomüll'
                                      const gelb_heute    = 'ical.1.events.0.today.GelberSack'
                                      const papier_heute  = 'ical.1.events.0.today.Papier'
                                      const rest_heute    = 'ical.1.events.0.today.Restmüll'
                                      const bio_morgen    = 'ical.1.events.1.Biomüll'
                                      const gelb_morgen   = 'ical.1.events.1.GelberSack'
                                      const papier_morgen = 'ical.1.events.1.Papier'
                                      const rest_morgen   = 'ical.1.events.1.Restmüll'
                                  
                                      var event0          = getState(ereignis0).val;
                                      var event1          = getState(ereignis1).val;
                                      var event2          = getState(ereignis2).val;
                                      var bio_today       = getState(bio_heute).val;
                                      var gelb_today      = getState(gelb_heute).val;
                                      var papier_today    = getState(papier_heute).val;
                                      var rest_today      = getState(rest_heute).val;
                                      var bio_tomorrow    = getState(bio_morgen).val;
                                      var gelb_tomorrow   = getState(gelb_morgen).val;
                                      var papier_tomorrow = getState(papier_morgen).val;
                                      var rest_tomorrow   = getState(rest_morgen).val;
                                  
                                      if (event0 != '' && event0 != 'Heute: Biomüll' && event0 != 'Heute: Gelber Sack' && event0 != 'Heute: Papier' && event0 != 'Heute: Restmüll' ){
                                          sendTo("paw.0",'Tablet_Jörg',{tts: 'Ja, ' + event0 + '. '});
                                      }
                                  
                                      if (event1 != '' && event1 != 'Heute: Biomüll' && event1 != 'Heute: Gelber Sack' && event1 != 'Heute: Papier' && event1 != 'Heute: Restmüll' ){
                                          sendTo("paw.0",'Tablet_Jörg',{tts: ' ' + event1 + '. '});
                                      }
                                  
                                     if (event2 != '' && event2 != 'Heute: Biomüll' && event2 != 'Heute: Gelber Sack' && event2 != 'Heute: Papier' && event2 != 'Heute: Restmüll' ){
                                          sendTo("paw.0",'Tablet_Jörg',{tts: ' ' + event2 + '. '});
                                      }
                                  
                                  
                                  //if (bio_today == true || bio_tomorrow == true || gelb_today == true || gelb_tomorrow == true || papier_today == true || papier_tomorrow == true || rest_today == true || rest_tomorrow == true)   {
                                  // sendTo("paw.0",'Tablet_Jörg',{tts:  'Es wird Müll abgeholt und zwar: '});
                                  //}
                                  
                                  
                                      if (bio_today == true)   { sendTo("paw.0",'Tablet_Jörg',{tts:  ' Heute Biomüll. '}); }
                                      if (gelb_today == true)  { sendTo("paw.0",'Tablet_Jörg',{tts:  ' Heute Gelbersack. '}); }
                                      if (papier_today == true){ sendTo("paw.0",'Tablet_Jörg',{tts:  ' Heute Papiertonne. '}); }        
                                      if (rest_today == true)  { sendTo("paw.0",'Tablet_Jörg',{tts:  ' Heute Restmüll. '}); }          
                                          
                                      if (bio_tomorrow == true)    { sendTo("paw.0",'Tablet_Jörg',{tts: ' Morgen Biomüll. '}); }
                                      if (gelb_tomorrow == true)   { sendTo("paw.0",'Tablet_Jörg',{tts: ' Morgen Gelbersack. '}); }
                                      if (papier_tomorrow == true) { sendTo("paw.0",'Tablet_Jörg',{tts: ' Morgen Papiertonne. '}); }
                                      if (rest_tomorrow == true)   { sendTo("paw.0",'Tablet_Jörg',{tts: ' Morgen Restmüll. '}); }
                                  
                                      if (event0 == '' && event1 == '' && event2 == ''
                                      && bio_today == false && gelb_today == false && papier_today == false && rest_today == false
                                      && bio_tomorrow == false && gelb_tomorrow == false && papier_tomorrow == false && rest_tomorrow == false
                                       )
                                      { sendTo("paw.0",'Tablet_Jörg',{tts:  'Nein , es stehen keine Termine an.'}); }
                                  }
                                  //__________________________________________________
                                  
                                  
                                  function GetMoodlight() {
                                      let empf_code = getState(moodlight).val ;
                                      let empf_json = JSON.parse(empf_code);
                                       let moodlight_name = empf_json.name;
                                       let moodelight_state = empf_json.state;
                                      //log("moodlight_name: " + moodlight_name);
                                      //log("moodelight_state: " + moodelight_state);
                                  
                                      if (moodelight_state == "regenbogen"){
                                       setState ('javascript.0.wled.brightness', 150);      
                                       setState ('javascript.0.wled.effekt', 9);
                                       setState ('javascript.0.wled.intensity', 128);
                                       setState ('javascript.0.wled.speed', 80);
                                      }
                                      else if(moodelight_state ==  "polizei") {
                                       setState ('javascript.0.wled.brightness', 80);
                                       setState ('javascript.0.wled.effekt', 49);
                                       setState ('javascript.0.wled.intensity', 94);
                                       setState ('javascript.0.wled.speed', 181);
                                      }
                                      else if(moodelight_state ==  "running") {
                                       setState ('javascript.0.wled.brightness', 80);
                                       setState ('javascript.0.wled.farbe', "#efec5d");      
                                       setState ('javascript.0.wled.effekt', 15);
                                       setState ('javascript.0.wled.intensity', 156);
                                       setState ('javascript.0.wled.speed', 31);
                                      }
                                      else if(moodelight_state ==  "wischen") {
                                       setState ('javascript.0.wled.brightness', 80);    
                                       setState ('javascript.0.wled.effekt', 36);
                                       setState ('javascript.0.wled.intensity', 136);
                                       setState ('javascript.0.wled.speed', 232);
                                      }
                                      else if(moodelight_state ==  "christmas") {
                                       setState ('javascript.0.wled.brightness', 80);     
                                       setState ('javascript.0.wled.effekt', 44);
                                       setState ('javascript.0.wled.intensity', 156);
                                       setState ('javascript.0.wled.speed', 168);
                                      }
                                      else if(moodelight_state ==  "slowly") {
                                       setState ('javascript.0.wled.brightness', 140);   
                                       setState ('javascript.0.wled.effekt', 63);
                                       setState ('javascript.0.wled.intensity', 220);
                                       setState ('javascript.0.wled.speed', 1);
                                      }
                                  
                                  sendTo("paw.0",'Tablet_Jörg',{tts: "Lichteffekt " + moodelight_state + " wurde aktiviert" }); 
                                  }
                                  //__________________________________________________
                                  
                                  
                                  
                                  
                                  // Lautstaerke Tablet_Jörg auf 14 setzen
                                  function lautstaerke(){ 
                                      sendTo("paw.0",'Tablet_Jörg',{volume: 14});
                                  }
                                  

                                  Die Broadlink-Sachen im Script kannst Du ignorieren, die setzen lediglich einige Icons in meinem VIS.

                                  Gruß
                                  Jörg

                                  tobetobeT Offline
                                  tobetobeT Offline
                                  tobetobe
                                  schrieb am zuletzt editiert von
                                  #205

                                  @joergeli

                                  Hallo Jörg,

                                  auch heute bin ich nicht viel weiter gekommen. Ich habe versucht, mit beiden Ansätzen weiter zu kommen: Vom mqtt.1 mit onID und vom Mosquitto Broker mit client.on.message. Ich scheitere - auch mit deinen Hinweisen hinter

                                  @joergeli said in Rhasspy Offline Sprachsteuerung:

                                  Wohlgemerkt

                                  in beiden Fällen einfach beim Parsen der richtigen Werte aus dem JSON string. Um mit mqtt.1 weiterzukommen, müsste ich mal deinen JSON-String sehen.

                                  Es gibt da zwangsläufig einige Unterschiede. Wie du ja sagtest, sind meine Sentences komplexer. Z.B. schicke ich die ioBroker Adresse des benötigten Devices im String gleich mit. Du schickst hingegen einen Nickname, den du dann über if-Abfragen in die Device Adresse umsetzen musst. Meine Skripte werden durch meinen Ansatz unheimlich schlank, da ich mit fast gar keinen if-Abfragen auskomme. Auch durch die Prozentwerte werden meine Skripte nicht mächtiger. Ich übergebe den jeweiligen %-Wert einfach als einen weiteren Wert aus einem weiteren Slot.

                                  Aber dies nur zur Erläuterung, warum ich nicht so ohne weiteres deine komplette Struktur übernehmen möchte. Ich müsste da ja wirklich bei Null, also bei der Neudefinition der Sentences und Slots anfangen.Und die schlanke Struktur meiner Skripte würde ich auch gern beibehalten. Ich muss nur an die verflxgrcvyzk Werte herankommen.

                                  Da ich mit meinen rudimentären JS-Kenntnissen nicht weiterkomme und wir beide nun wohl ein Stückweit unseren eigenen Weg gehen müssen, werde ich die Leistungen eines ehemaligen Mitarbeiters und Programmiers in Anspruch nehmen. Ich will jetzt einfach mal auf den Punkt kommen, damit ich mich wieder der eigentlichen Funktionalität zuwenden kann.

                                  Dies wäre mein Weg, da ich verstanden habe, dass bei dir nun alles wieder zur Zufriedenheit läuft - oder liege ich da falsch?

                                  Schönen Abend wünsche ich noch
                                  Thomas

                                  Beste Grüße
                                  tobetobe

                                  joergeliJ 1 Antwort Letzte Antwort
                                  0
                                  • tobetobeT tobetobe

                                    @joergeli

                                    Hallo Jörg,

                                    auch heute bin ich nicht viel weiter gekommen. Ich habe versucht, mit beiden Ansätzen weiter zu kommen: Vom mqtt.1 mit onID und vom Mosquitto Broker mit client.on.message. Ich scheitere - auch mit deinen Hinweisen hinter

                                    @joergeli said in Rhasspy Offline Sprachsteuerung:

                                    Wohlgemerkt

                                    in beiden Fällen einfach beim Parsen der richtigen Werte aus dem JSON string. Um mit mqtt.1 weiterzukommen, müsste ich mal deinen JSON-String sehen.

                                    Es gibt da zwangsläufig einige Unterschiede. Wie du ja sagtest, sind meine Sentences komplexer. Z.B. schicke ich die ioBroker Adresse des benötigten Devices im String gleich mit. Du schickst hingegen einen Nickname, den du dann über if-Abfragen in die Device Adresse umsetzen musst. Meine Skripte werden durch meinen Ansatz unheimlich schlank, da ich mit fast gar keinen if-Abfragen auskomme. Auch durch die Prozentwerte werden meine Skripte nicht mächtiger. Ich übergebe den jeweiligen %-Wert einfach als einen weiteren Wert aus einem weiteren Slot.

                                    Aber dies nur zur Erläuterung, warum ich nicht so ohne weiteres deine komplette Struktur übernehmen möchte. Ich müsste da ja wirklich bei Null, also bei der Neudefinition der Sentences und Slots anfangen.Und die schlanke Struktur meiner Skripte würde ich auch gern beibehalten. Ich muss nur an die verflxgrcvyzk Werte herankommen.

                                    Da ich mit meinen rudimentären JS-Kenntnissen nicht weiterkomme und wir beide nun wohl ein Stückweit unseren eigenen Weg gehen müssen, werde ich die Leistungen eines ehemaligen Mitarbeiters und Programmiers in Anspruch nehmen. Ich will jetzt einfach mal auf den Punkt kommen, damit ich mich wieder der eigentlichen Funktionalität zuwenden kann.

                                    Dies wäre mein Weg, da ich verstanden habe, dass bei dir nun alles wieder zur Zufriedenheit läuft - oder liege ich da falsch?

                                    Schönen Abend wünsche ich noch
                                    Thomas

                                    joergeliJ Offline
                                    joergeliJ Offline
                                    joergeli
                                    schrieb am zuletzt editiert von joergeli
                                    #206

                                    Hallo Thomas,

                                    @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                    Um mit mqtt.1 weiterzukommen, müsste ich mal deinen JSON-String sehen.

                                    Ich hatte weiter oben, am 28. Apr. 2020, 01:07, beschrieben, wie bei mir ein Sentence, bzw. das empfangene JSON, aussehen.

                                    @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                    , werde ich die Leistungen eines ehemaligen Mitarbeiters und Programmiers in Anspruch nehmen. Ich will jetzt einfach mal auf den Punkt kommen, damit ich mich wieder der eigentlichen Funktionalität zuwenden kann.

                                    ja, ich verstehe das schon, wenn etwas schon gelaufen ist, man nicht wieder bei Null anfangen möchte.
                                    Ich denke, wenn Du jemanden an der Hand hast, der den Ablauf "live" verfolgen kann, daß es dann einfacher ist, das umzusetzen.
                                    Die JS-Cracks hier im Forum könnten das sicher auch, aber es ist m.E. recht schwierig, die Problemstellung ( ... diese JSON habe ich .... und das soll dabei herauskommenn ... ) in Worte, bzw. in Schrift, zu fassen.
                                    Ich kann da mit meinem JS-Halbwissen auch nicht weiterhelfen.

                                    @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                    Dies wäre mein Weg, da ich verstanden habe, dass bei dir nun alles wieder zur Zufriedenheit läuft - oder liege ich da falsch?

                                    Naja, ich habe jetzt halt die gleiche Funktionalität, wie vorher mit der 2.4.19, erkauft mit der zusätzlichen mqtt.1-Client-Instanz. Wie schon geschrieben, ist es gefühlt einen Tuck schneller, aber ob ich deshalb endgültig auf die 2.5er umsteigen werde, weiß ich noch nicht.

                                    Halt mich auf jeden Fall auf dem Laufenden.

                                    Gruß
                                    Jörg

                                    tobetobeT 1 Antwort Letzte Antwort
                                    0
                                    • joergeliJ joergeli

                                      Hallo Thomas,

                                      @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                      Um mit mqtt.1 weiterzukommen, müsste ich mal deinen JSON-String sehen.

                                      Ich hatte weiter oben, am 28. Apr. 2020, 01:07, beschrieben, wie bei mir ein Sentence, bzw. das empfangene JSON, aussehen.

                                      @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                      , werde ich die Leistungen eines ehemaligen Mitarbeiters und Programmiers in Anspruch nehmen. Ich will jetzt einfach mal auf den Punkt kommen, damit ich mich wieder der eigentlichen Funktionalität zuwenden kann.

                                      ja, ich verstehe das schon, wenn etwas schon gelaufen ist, man nicht wieder bei Null anfangen möchte.
                                      Ich denke, wenn Du jemanden an der Hand hast, der den Ablauf "live" verfolgen kann, daß es dann einfacher ist, das umzusetzen.
                                      Die JS-Cracks hier im Forum könnten das sicher auch, aber es ist m.E. recht schwierig, die Problemstellung ( ... diese JSON habe ich .... und das soll dabei herauskommenn ... ) in Worte, bzw. in Schrift, zu fassen.
                                      Ich kann da mit meinem JS-Halbwissen auch nicht weiterhelfen.

                                      @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                      Dies wäre mein Weg, da ich verstanden habe, dass bei dir nun alles wieder zur Zufriedenheit läuft - oder liege ich da falsch?

                                      Naja, ich habe jetzt halt die gleiche Funktionalität, wie vorher mit der 2.4.19, erkauft mit der zusätzlichen mqtt.1-Client-Instanz. Wie schon geschrieben, ist es gefühlt einen Tuck schneller, aber ob ich deshalb endgültig auf die 2.5er umsteigen werde, weiß ich noch nicht.

                                      Halt mich auf jeden Fall auf dem Laufenden.

                                      Gruß
                                      Jörg

                                      tobetobeT Offline
                                      tobetobeT Offline
                                      tobetobe
                                      schrieb am zuletzt editiert von
                                      #207

                                      @joergeli

                                      Hallo Jörg,

                                      vielen Dank nochmals für deinen Hinweis auf deinen sauber strukturierten JSON-String. Der war wirklich hilfreich:+1:

                                      Ich habe die Übung dann auch mal gemacht und mit dem Ergebnis war ich in der Lage, einen JSON-String, der entweder vom mqtt-Client oder direkt vom Mosquitto-Broker kam, zu parsen und daraus wieder den Befehl ans Device aufzubauen. Ein Lichtblick!!! Das Parsen habe ich stur geradeaus gemacht: Slot[0], Slot[1], ... usw. Das funktioniert, ist aber nicht sonderlich elegant und auch nicht dynamisch in Punkto Slot-Anzahl, so wie ich das vorher hatte.

                                      Außerdem habe ich festgestellt, dass evtl interessant sein könnte, nicht nur den Inhalt eines Slots zu kennen, sondern auch dessen Namen, so wie er von Rhasspy mitgeschickt wird. Dann können nämlich die Befehlssequenzen intelligent für den jeweiligen Anwendungsfall zusammengebaut werden.

                                      Ich weiß noch nicht, ob ich da wirklich ankommen werde. Aber meine Zielvorstellung wäre, dass ich im Idealfall nur noch ein Skript für alle Anwendungen hätte - oder zumindest sehr wenige.

                                      Und genau mit dieser Optimierung habe ich nun meinen exMitarbeiter beauftragt.

                                      Mein zweiter Wunsch wäre nämlich, dass wir beide dann mit unseren bereits mühsam gesammelten Erfahrungen eine funktionierende Rhasspy-Lösung hier im ioBroker Forum anbieten können, in der Hoffnung, dass dann doch noch weiteer Interessierte aufspringen, die uns dann ggf auch mal etwas (neue Ideen) zurückgeben können.

                                      Selbstverständlich halte ich dich auf dem Laufenden.

                                      Viele Grüße
                                      Thomas

                                      Beste Grüße
                                      tobetobe

                                      joergeliJ 2 Antworten Letzte Antwort
                                      0
                                      • D Offline
                                        D Offline
                                        DerT
                                        Forum Testing
                                        schrieb am zuletzt editiert von
                                        #208

                                        Hi Leute,

                                        ich hab zwar von oben angefangen zu lesen aber ca bei Beitrag 40 von über 200 aufgegeben.
                                        Finde es erstaunlich was hier bis jetzt geleistet wurde und denke es ist das wonach ich suche.

                                        Könnt ihr mir vielleicht einen kurzen Abriss zu dem Thema geben und mir sagen ob ich damit mein Vorhaben umsetzen kann?

                                        Aber erstmal meine Situation und wo ich hin will.
                                        Ich habe einen Homeserver auf dem Proxmox als Hypervisor läuft und darauf mehrere VMs und LXC Container. Darunter auch ioBroker.
                                        Sämtliche Lichter sind über Shellys Smart gemacht worden.
                                        Zusätzlich habe ich mehrere Echo Dot 2.
                                        Diese möchte ich nun gegen eine Lösung austauschen bei der ich die Kontrolle habe wo die Daten landen.
                                        Dabei wurde ich auf dieses Thema aufmerksam gemacht.

                                        Hauptsächlich nutze ich Alexa für folgende Funktionen:

                                        • Lampen schalten
                                        • Rollos bedienen
                                        • Timer
                                        • Bring Einkaufsliste
                                        • Musik über Radio und Spotify

                                        Am liebsten wäre mir hier ein Client-Server Konstrukt.
                                        Also ein Server der die Logik übernimmt und auf meinem Homeserver läuft und mehrere Clients zur Kommunikation.
                                        Als Client habe ich mir einen PI Zero mit Mikrofon und Lautsprecher vorgestellt.

                                        Mir ist durchaus bewusst, dass dies Bastelei bedeutet. Ich möchte nur wissen ob das hier der richtige Ansatz ist oder ich weiter suchen muss.

                                        Danke und Gruß
                                        T

                                        tobetobeT 1 Antwort Letzte Antwort
                                        0
                                        • D DerT

                                          Hi Leute,

                                          ich hab zwar von oben angefangen zu lesen aber ca bei Beitrag 40 von über 200 aufgegeben.
                                          Finde es erstaunlich was hier bis jetzt geleistet wurde und denke es ist das wonach ich suche.

                                          Könnt ihr mir vielleicht einen kurzen Abriss zu dem Thema geben und mir sagen ob ich damit mein Vorhaben umsetzen kann?

                                          Aber erstmal meine Situation und wo ich hin will.
                                          Ich habe einen Homeserver auf dem Proxmox als Hypervisor läuft und darauf mehrere VMs und LXC Container. Darunter auch ioBroker.
                                          Sämtliche Lichter sind über Shellys Smart gemacht worden.
                                          Zusätzlich habe ich mehrere Echo Dot 2.
                                          Diese möchte ich nun gegen eine Lösung austauschen bei der ich die Kontrolle habe wo die Daten landen.
                                          Dabei wurde ich auf dieses Thema aufmerksam gemacht.

                                          Hauptsächlich nutze ich Alexa für folgende Funktionen:

                                          • Lampen schalten
                                          • Rollos bedienen
                                          • Timer
                                          • Bring Einkaufsliste
                                          • Musik über Radio und Spotify

                                          Am liebsten wäre mir hier ein Client-Server Konstrukt.
                                          Also ein Server der die Logik übernimmt und auf meinem Homeserver läuft und mehrere Clients zur Kommunikation.
                                          Als Client habe ich mir einen PI Zero mit Mikrofon und Lautsprecher vorgestellt.

                                          Mir ist durchaus bewusst, dass dies Bastelei bedeutet. Ich möchte nur wissen ob das hier der richtige Ansatz ist oder ich weiter suchen muss.

                                          Danke und Gruß
                                          T

                                          tobetobeT Offline
                                          tobetobeT Offline
                                          tobetobe
                                          schrieb am zuletzt editiert von
                                          #209

                                          @DerT

                                          Hallo und willkommen in dieser Runde,

                                          in der Tat haben wir hier schon einiges zusammengetragen und erarbeitet. Um es kurz zu machen: Alles, was du dir vorstellst, kannst du auch so mit Rhasspy realisieren. Das System unterstützt deine Vorstellung: Server nennt sich bei Rhasspy Master und Client nennt sich Satellit. Davon kann es mehrere geben. Deine Überlegungen zur Hardware sind in Ordnung. Pi Zero ist so ziemlich die Unterkannte, aber (wohl) i.O., wie man im Rhasspy-Forum lesen kann. Zum Mikrofon: Das ist das Schlüsselelement überhaupt. Wir setzen auf Mikrofon-Arrays, entweder von Matrix Voice oder von Seed/ReSpeaker. Für die Tonausgabe brauchst du einen kleinen Verstärker, falls dieser nicht bereits im Mikrofion mit enthalten ist. Das Zusammenspiel mit ioBroker ist im Prinzip kein Problem. Du musst halt wissen, dass du für die Verarbeitung der gesprochenen Befehle noch irgend welche Skripte benötigst. Ob Javascript oder Node-Red oder Blockly ist egal. Mittlerweile haben wir aber bereits einen guten Fundus an Skripten verfügbar, also mach dir keine Gedanken.

                                          Deine Funktionen

                                          @DerT said in Rhasspy Offline Sprachsteuerung:

                                          Lampen schalten
                                          Rollos bedienen
                                          Timer
                                          Bring Einkaufsliste
                                          Musik über Radio und Spotify

                                          sind alle machbar. Lampen kann ich schalten und dimmen. Rollos steuern (wie Dimmer mit zB 50% Verschluss). Timer habe ich auf der Rhasspy-Seite implementiert. Hier fehlt mir im ioBroker noch das Skript, um nach Ablauf ein Signal an den Satelliten zurückzuspielen. Ist aber kein Problem. Bring! habe ich vollständig implementiert mit drei verschiedenen Listen, Artikel setzen, Artikel löschen. Musik ist noch eine offene Baustelle. Dafür gibt es aber auch schon Lösungen von anderen Usern.

                                          Aktuell hängen wir ein wenig: Seit kurzem gibt es eine neue Rhaspy-Version 2.5-pre, die zwar einige Vorteile beinhaltet, auf der anderen Seite aber mit einem neuen Datenmodell daherkommt, sodass zumindest ich meine Skripte an die neue Struktur anpassen muss. Das dauert aber auch nur noch wenige Tage. Der Sprung von der letzten 2.4.19 auf 2.5-pre war durchaus beträchtlich. Langfristig ist 2.5 natürlich die Basis für alle weiteren Funktionalitäten. Im Moment ist diese Version allerdings noch eine Beta-Version, auf die sich aber die gesamte (Rhasspy-) Community gestürzt hat.

                                          Ich persönlich mache jetzt mit 2.5 weiter. @joergeli ist da noch ein wenig zurückhaltender. Aber dazu äußert er sich lieber selbst.

                                          Wie du einsteigst, musst du selbst entscheiden. Wir können dir hier auf alle Fälle bei vielen Fragen weiterhelfen.

                                          Beste Grüße
                                          tobetobe

                                          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

                                          876

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          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