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

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

Community Forum

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

NEWS

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

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

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

Rhasspy Offline Sprachsteuerung

Scheduled Pinned Locked Moved Off Topic
403 Posts 30 Posters 100.7k Views 47 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • 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 Online
    joergeliJ Online
    joergeli
    wrote on last edited by 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 Replies Last reply
    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 Online
      joergeliJ Online
      joergeli
      wrote on last edited by
      #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 Reply Last reply
      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
        wrote on last edited by
        #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 Reply Last reply
        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
          wrote on last edited by
          #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 Reply Last reply
          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 Online
            joergeliJ Online
            joergeli
            wrote on last edited by 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 Reply Last reply
            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
              wrote on last edited by
              #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 Replies Last reply
              0
              • D Offline
                D Offline
                DerT
                Forum Testing
                wrote on last edited by
                #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 Reply Last reply
                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
                  wrote on last edited by
                  #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 Reply Last reply
                  0
                  • tobetobeT tobetobe

                    @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

                    joergeliJ Online
                    joergeliJ Online
                    joergeli
                    wrote on last edited by joergeli
                    #210

                    Hallo Thomas,

                    @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                    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.

                    Tja, mühsam ernährt sich das Eichhörnchen :blush:

                    Ich habe mal ein wenig mit dem JS experimentiert, welches @Tictactoo am 23. Jan. 2020, 20:52 vorgestellt hatte.
                    Ich bin zumindest soweit gekommen, daß es über den mqtt.1-Client (mit Deiner geliebten, schlanken Schleife) folgendes auswirft:
                    ( abhängig von der Anzahl der Slots werden mehr, bzw. weniger Werte ausgegeben).

                    20:30:22.731	info	javascript.0 (18426) script.js.common.sprache.testi: Anzahl Slots:2
                    20:30:22.731	info	javascript.0 (18426) script.js.common.sprache.testi: intent:Lampen
                    20:30:22.732	info	javascript.0 (18426) script.js.common.sprache.testi: slot[0]:wandspots
                    20:30:22.732	info	javascript.0 (18426) script.js.common.sprache.testi: slot[1]:aus
                    
                    

                    Auswertungen, bzw. Schaltvorgänge auslösen ist nicht enthalten, aber vielleicht hilft Dir dieses Codeschnippsel trotzdem weiter:

                    
                    var intentResult = $('mqtt.1.hermes.intent.*');
                    var intentArray = [];
                    
                    for(var i = 0; i < intentResult.length; i++)
                    {
                        log(intentResult[i]);
                        intentArray.push(intentResult[i]);
                    }
                    
                    on({id: intentArray, change: "any"}, function (obj) {
                        log(obj.newState.val);
                        let intentObject = JSON.parse(obj.newState.val);
                    
                        let anzslots = intentObject.slots.length; //Anzahl Slots ermitteln
                        log("Anzahl Slots:" + anzslots);
                    
                    
                        let intent = intentObject.intent.intentName;
                        log("intent:" + intent);
                    
                        for (i = 0; i < anzslots; i++) { 
                            let slot = intentObject.slots[i].value.value;
                            log("slot[" +i + "]:" + slot);
                        } // end of for
                    });
                    
                    

                    Gruß
                    Jörg

                    tobetobeT 2 Replies Last reply
                    0
                    • tobetobeT tobetobe

                      @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

                      joergeliJ Online
                      joergeliJ Online
                      joergeli
                      wrote on last edited by
                      #211

                      @tobetobe
                      Hallo Thomas,

                      auch bei mir ein Lichtblick:
                      Ich habe HLC (Hermes LED Control) unter Rhasspy 2.5-pre zum Laufen bekommen.

                      Im Setup von HLC ist wohl ein kleiner Fehler bei der Abfrage des Parameters pathToConfig:
                      Es wird als Beispiel angegeben: /.config/rhasspy/profiles/fr/profile.json.
                      Das habe ich 1:1 übernommen, allerdings mit "de"-Profil, hat aber nicht funktioniert.

                      Es muss dort aber der kpl. Pfad angegeben werden, also so:
                      pathToConfig=/home/pi/.config/rhasspy/profiles/de/profile.json

                      Hier ist es allerdings richtig beschrieben.

                      ich habe die Datei /etc/systemd/system/hermesledcontrol.service editiert und sie sieht jetzt so aus:

                      [Unit]
                      Description=Hermes Led Control
                      
                      [Service]
                      WorkingDirectory=/home/pi/hermesLedControl_v2.0.6
                      ExecStart=/home/pi/hermesLedControl_v2.0.6/venv/bin/python3 main.py  --engine=rhasspy --pathToConfig=/home/pi/.config/rhasspy/profiles/de/profile.json --hardware=respeaker4  --pattern=projectalice
                      Restart=always
                      RestartSec=5
                      User=pi
                      
                      [Install]
                      WantedBy=multi-user.target
                      
                      

                      Somit kannst Du jetzt wahrscheinlich auch bei Deinem Matrix Voice die LEDs zum Leuchten bringen.

                      Gruß
                      Jörg

                      1 Reply Last reply
                      0
                      • joergeliJ joergeli

                        Hallo Thomas,

                        @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                        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.

                        Tja, mühsam ernährt sich das Eichhörnchen :blush:

                        Ich habe mal ein wenig mit dem JS experimentiert, welches @Tictactoo am 23. Jan. 2020, 20:52 vorgestellt hatte.
                        Ich bin zumindest soweit gekommen, daß es über den mqtt.1-Client (mit Deiner geliebten, schlanken Schleife) folgendes auswirft:
                        ( abhängig von der Anzahl der Slots werden mehr, bzw. weniger Werte ausgegeben).

                        20:30:22.731	info	javascript.0 (18426) script.js.common.sprache.testi: Anzahl Slots:2
                        20:30:22.731	info	javascript.0 (18426) script.js.common.sprache.testi: intent:Lampen
                        20:30:22.732	info	javascript.0 (18426) script.js.common.sprache.testi: slot[0]:wandspots
                        20:30:22.732	info	javascript.0 (18426) script.js.common.sprache.testi: slot[1]:aus
                        
                        

                        Auswertungen, bzw. Schaltvorgänge auslösen ist nicht enthalten, aber vielleicht hilft Dir dieses Codeschnippsel trotzdem weiter:

                        
                        var intentResult = $('mqtt.1.hermes.intent.*');
                        var intentArray = [];
                        
                        for(var i = 0; i < intentResult.length; i++)
                        {
                            log(intentResult[i]);
                            intentArray.push(intentResult[i]);
                        }
                        
                        on({id: intentArray, change: "any"}, function (obj) {
                            log(obj.newState.val);
                            let intentObject = JSON.parse(obj.newState.val);
                        
                            let anzslots = intentObject.slots.length; //Anzahl Slots ermitteln
                            log("Anzahl Slots:" + anzslots);
                        
                        
                            let intent = intentObject.intent.intentName;
                            log("intent:" + intent);
                        
                            for (i = 0; i < anzslots; i++) { 
                                let slot = intentObject.slots[i].value.value;
                                log("slot[" +i + "]:" + slot);
                            } // end of for
                        });
                        
                        

                        Gruß
                        Jörg

                        tobetobeT Offline
                        tobetobeT Offline
                        tobetobe
                        wrote on last edited by
                        #212

                        Hallo Jörg,

                        irgendwie lässt dich die 2.5 ja wohl doch nicht los....

                        Vielen Dank jedenfalls für deine tollen Beiträge, die mal wieder sehr hilfreich sind.

                        @joergeli said in Rhasspy Offline Sprachsteuerung:

                        Ich habe mal ein wenig mit dem JS experimentiert, welches @Tictactoo am 23. Jan. 2020, 20:52 vorgestellt hatte.

                        Genau auf der Basis hatte ich alle meine Skripte aufgebaut, die ja auch bis zum Umstieg auf 2.5 alle wunderbar liefen. Aber das ist ja nun ein echter Lichtblick. Du hattest natürlich mit einer deiner damaligen Bemerkungen Recht: Die erste Schleife zu Auslesen der Intents wird nur beim Starten des Skriptes einmalig durchlaufen, danach nicht mehr. D.h., wenn man auf der Rhasspy-Seite neue Intents hinzufügt, werden diese zunächst einmal nicht automatisch erkannt, weil es dafür noch keinen Trigger gibt.Das Problem sollte jedoch leicht lösbar sein.

                        Zum Testen deines Vorschlags bin ich noch nicht gekommen. Vielleicht schaffe ich das heute Nachmittag noch.

                        Dass du eine Lösung für die LEDs gefunden hast, ist ja auch eine hervorragende Sache. Das Fass mach ich aber erst wieder auf, sobald alle meine Skripte wieder wie gewünscht laufen.

                        Übrigens habe ich mir diese Woche noch ein zweites Mic-Array kommen lassen. Somit habe ich jetzt bereits zwei Satelliten, die ich auf die Räume verteilen kann.
                        telliten, die ich auf die Räume verteilen kann.

                        Wünsche dir noch einen schönen Sonntag
                        Thomas

                        Beste Grüße
                        tobetobe

                        1 Reply Last reply
                        0
                        • capitaenzC Offline
                          capitaenzC Offline
                          capitaenz
                          wrote on last edited by capitaenz
                          #213

                          Hallo zusammen,

                          ich habe noch ein Snips zu hause laufen und wollte Rhasspy testen.
                          Ich habe mich an die Anleitung gehalten und eine SD-Karte für den Pi 3b+ mit buster-light neu aufgesetzt.
                          Die Erste Hürde: Docker!? Will ich eigentlich nicht, was ist das? :-)
                          Jedenfalls hab ich schon das Problem, dass ich das Webinterface unter 192.168.0.93:12101 nicht aufgerufen bekomme.
                          Wenn ich Rhasspy mit:

                          docker run -d -p 12101:12101 \
                                --restart unless-stopped \
                                -v "$HOME/.config/rhasspy/profiles:/profiles" \
                                --device /dev/snd:/dev/snd \
                                synesthesiam/rhasspy-server:latest \
                                --user-profiles /profiles \
                                --profile en
                          

                          starte wird ein Code angezeigt, die LED am Pi fängt an zu blinken und der Cursor erscheint wieder ohne Fehlermeldung, aber das Webinterface lässt sich nicht aufrufen...
                          Um es kurz zu machen, gibt es irgendwo ein fertiges Image von Rhasspy zum Download? (Pi 3b+)

                          VG
                          Leif

                          ioBroker auf Synology DS920+ (SSD Raid / 20GB RAM) im VMM

                          tobetobeT 1 Reply Last reply
                          0
                          • joergeliJ joergeli

                            Hallo Thomas,

                            @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                            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.

                            Tja, mühsam ernährt sich das Eichhörnchen :blush:

                            Ich habe mal ein wenig mit dem JS experimentiert, welches @Tictactoo am 23. Jan. 2020, 20:52 vorgestellt hatte.
                            Ich bin zumindest soweit gekommen, daß es über den mqtt.1-Client (mit Deiner geliebten, schlanken Schleife) folgendes auswirft:
                            ( abhängig von der Anzahl der Slots werden mehr, bzw. weniger Werte ausgegeben).

                            20:30:22.731	info	javascript.0 (18426) script.js.common.sprache.testi: Anzahl Slots:2
                            20:30:22.731	info	javascript.0 (18426) script.js.common.sprache.testi: intent:Lampen
                            20:30:22.732	info	javascript.0 (18426) script.js.common.sprache.testi: slot[0]:wandspots
                            20:30:22.732	info	javascript.0 (18426) script.js.common.sprache.testi: slot[1]:aus
                            
                            

                            Auswertungen, bzw. Schaltvorgänge auslösen ist nicht enthalten, aber vielleicht hilft Dir dieses Codeschnippsel trotzdem weiter:

                            
                            var intentResult = $('mqtt.1.hermes.intent.*');
                            var intentArray = [];
                            
                            for(var i = 0; i < intentResult.length; i++)
                            {
                                log(intentResult[i]);
                                intentArray.push(intentResult[i]);
                            }
                            
                            on({id: intentArray, change: "any"}, function (obj) {
                                log(obj.newState.val);
                                let intentObject = JSON.parse(obj.newState.val);
                            
                                let anzslots = intentObject.slots.length; //Anzahl Slots ermitteln
                                log("Anzahl Slots:" + anzslots);
                            
                            
                                let intent = intentObject.intent.intentName;
                                log("intent:" + intent);
                            
                                for (i = 0; i < anzslots; i++) { 
                                    let slot = intentObject.slots[i].value.value;
                                    log("slot[" +i + "]:" + slot);
                                } // end of for
                            });
                            
                            

                            Gruß
                            Jörg

                            tobetobeT Offline
                            tobetobeT Offline
                            tobetobe
                            wrote on last edited by
                            #214

                            @joergeli said in Rhasspy Offline Sprachsteuerung:

                            Hallo Jörg,

                            ich habe dein Skript ein wenig ergänzt. Zum einen habe ich die siteId mit aufgenommen, weil ich damit lokalisieren kann, in welchem Raum sich ein Satellit befindet, bzw. von wo die Anforderung kam.

                            In Anlehnung an Kay Kochs Node-Red Skript lese ich nun auch noch den Namen eines Slots aus und stelle ihn dem Slotwert voran. Das sieht dann so aus:

                            var intentResult = $('mqtt.1.hermes.intent.*');
                            var intentArray = [];
                            
                             for(var i = 0; i < intentResult.length; i++)
                            {
                                log("Zeile8:"+intentResult[i]);
                                intentArray.push(intentResult[i]);
                            }
                            
                            on({id: intentArray, change: "any"}, function (obj) {
                                log(obj.newState.val);
                                let intentObject = JSON.parse(obj.newState.val);
                                let anzslots = intentObject.slots.length; //Anzahl Slots ermitteln
                                log("Anzahl Slots:" + anzslots); 
                                let intent = intentObject.intent.intentName;
                                log("intent:" + intent);
                                let siteId = intentObject.siteId;
                                log("siteID:" + siteId);   
                                var slot = [];
                                
                                for (i = 0; i < anzslots; i++) { 
                                    let slot = intentObject.slots[i].slotName+':'+intentObject.slots[i].value.value;
                                    log("slot[" +i + "]:" + slot);
                                } // end of for
                            
                               setState(slot[0]+slot[2],slot[1]);
                             //   log(slot[0]+slot[2], slot[1]);
                            })
                            
                            

                            Ab Zeile 25 würde dann bei mir der Aufruf von Funktionen stattfinden, die zu den jeweiligen Intents passen. Dazu muss dann auch das setState-Kommando zusammengesetzt werden. Bei HomeMatic sähe das bei mir dann so aus:

                            setState(deviceId.state, value)
                            

                            Momentan versuche ich, ein solches Kommando aus den vorangestellten Namen der Slots zusammenzustellen. Das was du oben im Skript siehst (Zeilen 26 und 27) funktioniert allerdings noch nicht.

                            Soweit mein Zwischenstand.

                            Viele Grüße
                            Thomas

                            Beste Grüße
                            tobetobe

                            joergeliJ 1 Reply Last reply
                            0
                            • capitaenzC capitaenz

                              Hallo zusammen,

                              ich habe noch ein Snips zu hause laufen und wollte Rhasspy testen.
                              Ich habe mich an die Anleitung gehalten und eine SD-Karte für den Pi 3b+ mit buster-light neu aufgesetzt.
                              Die Erste Hürde: Docker!? Will ich eigentlich nicht, was ist das? :-)
                              Jedenfalls hab ich schon das Problem, dass ich das Webinterface unter 192.168.0.93:12101 nicht aufgerufen bekomme.
                              Wenn ich Rhasspy mit:

                              docker run -d -p 12101:12101 \
                                    --restart unless-stopped \
                                    -v "$HOME/.config/rhasspy/profiles:/profiles" \
                                    --device /dev/snd:/dev/snd \
                                    synesthesiam/rhasspy-server:latest \
                                    --user-profiles /profiles \
                                    --profile en
                              

                              starte wird ein Code angezeigt, die LED am Pi fängt an zu blinken und der Cursor erscheint wieder ohne Fehlermeldung, aber das Webinterface lässt sich nicht aufrufen...
                              Um es kurz zu machen, gibt es irgendwo ein fertiges Image von Rhasspy zum Download? (Pi 3b+)

                              VG
                              Leif

                              tobetobeT Offline
                              tobetobeT Offline
                              tobetobe
                              wrote on last edited by
                              #215

                              @capitaenz

                              Hallo und willkommen in unserer Rhasspy-Runde,

                              ich gehe mal kurz auf deine Fragen ein:

                              @capitaenz said in Rhasspy Offline Sprachsteuerung:

                              Ich habe mich an die Anleitung gehalten und eine SD-Karte für den Pi 3b+ mit buster-light neu aufgesetzt.

                              Das ist doch schon mal gut.

                              @capitaenz said in Rhasspy Offline Sprachsteuerung:

                              Die Erste Hürde: Docker!? Will ich eigentlich nicht, was ist das?

                              Docker ist eine virtuelle Umgebung, in der das Programm läuft. Bei Snips lief alles unter SAM. Wolltest du auch nicht, brauchtest du aber. So ist es bei Rhasspy auch. Viele Programme laufen heute bereits unter Docker. Das ist eine sehr moderne und Ressourcen-schonende Methode, virtuelle Umgebungen auf zu bauen. Gerade für Raspberry ideal. Wenn du partout kein Docker willst, kannst du Rhasspy auch unter Python als virtuelle Umgebung aufsetzen. Ist mMn aber etwas kniffliger.

                              Empfehlung: Halt dich an die Anweisung und installiere Docker mit dem entsprechenden curl-Befehl:

                              curl -sSL https://get.docker.com | sh        (ggf. mit sudo)
                              sudo usermod -aG docker pi                    (diesen Befehl auf keinen Fall vergessen!)
                                                                                                 pi ggf. durch deinen Usernamen ersetzen
                              

                              Dann ziehst du dir noch das neueste Image:

                              sudo docker pull rhasspy/rhasspy:2.5.0-pre
                              

                              Und setzt danach das Kommando zu Starten ab:

                              docker run -d -p 12101:12101 \
                                    --restart unless-stopped \
                                    -v "$HOME/.config/rhasspy/profiles:/profiles" \
                                    --device /dev/snd:/dev/snd \
                                    synesthesiam/rhasspy-server:latest \
                                    --user-profiles /profiles \
                                    --profile de
                              

                              Da du wohl eine deutschsprachige Variante haben willst, habe ich für dich den Profileintrag in "de" geändert.

                              Jetzt nur noch die IP-Adresse und die Portnummer im Browser eingeben und los geht's. Einfacher geht es wirklich nicht.

                              Gutes Gelingen!

                              Beste Grüße
                              tobetobe

                              1 Reply Last reply
                              0
                              • tobetobeT tobetobe

                                @joergeli said in Rhasspy Offline Sprachsteuerung:

                                Hallo Jörg,

                                ich habe dein Skript ein wenig ergänzt. Zum einen habe ich die siteId mit aufgenommen, weil ich damit lokalisieren kann, in welchem Raum sich ein Satellit befindet, bzw. von wo die Anforderung kam.

                                In Anlehnung an Kay Kochs Node-Red Skript lese ich nun auch noch den Namen eines Slots aus und stelle ihn dem Slotwert voran. Das sieht dann so aus:

                                var intentResult = $('mqtt.1.hermes.intent.*');
                                var intentArray = [];
                                
                                 for(var i = 0; i < intentResult.length; i++)
                                {
                                    log("Zeile8:"+intentResult[i]);
                                    intentArray.push(intentResult[i]);
                                }
                                
                                on({id: intentArray, change: "any"}, function (obj) {
                                    log(obj.newState.val);
                                    let intentObject = JSON.parse(obj.newState.val);
                                    let anzslots = intentObject.slots.length; //Anzahl Slots ermitteln
                                    log("Anzahl Slots:" + anzslots); 
                                    let intent = intentObject.intent.intentName;
                                    log("intent:" + intent);
                                    let siteId = intentObject.siteId;
                                    log("siteID:" + siteId);   
                                    var slot = [];
                                    
                                    for (i = 0; i < anzslots; i++) { 
                                        let slot = intentObject.slots[i].slotName+':'+intentObject.slots[i].value.value;
                                        log("slot[" +i + "]:" + slot);
                                    } // end of for
                                
                                   setState(slot[0]+slot[2],slot[1]);
                                 //   log(slot[0]+slot[2], slot[1]);
                                })
                                
                                

                                Ab Zeile 25 würde dann bei mir der Aufruf von Funktionen stattfinden, die zu den jeweiligen Intents passen. Dazu muss dann auch das setState-Kommando zusammengesetzt werden. Bei HomeMatic sähe das bei mir dann so aus:

                                setState(deviceId.state, value)
                                

                                Momentan versuche ich, ein solches Kommando aus den vorangestellten Namen der Slots zusammenzustellen. Das was du oben im Skript siehst (Zeilen 26 und 27) funktioniert allerdings noch nicht.

                                Soweit mein Zwischenstand.

                                Viele Grüße
                                Thomas

                                joergeliJ Online
                                joergeliJ Online
                                joergeli
                                wrote on last edited by joergeli
                                #216

                                Hallo Thomas,
                                @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                Ab Zeile 25 würde dann bei mir der Aufruf von Funktionen stattfinden, die zu den jeweiligen Intents passen. Dazu muss dann auch das setState-Kommando zusammengesetzt werden.

                                Versuche es mal so:

                                
                                var intentResult = $('mqtt.1.hermes.intent.*');
                                var intentArray = [];
                                
                                 for(var i = 0; i < intentResult.length; i++)
                                {
                                    log("Zeile8:"+intentResult[i]);
                                    intentArray.push(intentResult[i]);
                                }
                                
                                on({id: intentArray, change: "any"}, function (obj) {
                                    log(obj.newState.val);
                                    let intentObject = JSON.parse(obj.newState.val);
                                    let anzslots = intentObject.slots.length; //Anzahl Slots ermitteln
                                    log("Anzahl Slots:" + anzslots); 
                                    let intent = intentObject.intent.intentName;
                                    log("intent:" + intent);
                                    let siteId = intentObject.siteId;
                                    log("siteID:" + siteId);   
                                
                                    let slot = [];
                                    let wertearray = [];
                                
                                    for (i = 0; i < anzslots; i++) { 
                                        let slot = intentObject.slots[i].slotName+':'+intentObject.slots[i].value.value;
                                        log("slot[" +i + "]:" + slot);
                                        let slotwert  = intentObject.slots[i].value.value;
                                        wertearray.push(slotwert); // hier werden nur! die Werte der Slots in ein neues array "wertearray" geschrieben
                                    } // end of for
                                
                                        log("Ausgabe: " + wertearray[0] + "." + wertearray[2]   + "," + wertearray[1]);
                                
                                        //Setzen der States, bzw. Aufruf der entspr. Funktionen
                                        //setState (wertearray[0] + "." + wertearray[2] , wertearray[1], true);
                                
                                })
                                
                                

                                Damit bekommst Du die Werte aus den Slots extrahiert und kannst dann damit das "setState" zusammenbauen.
                                Es setzt aber voraus, daß immer 3 Slots ( slot[0], slot[1], slot[2]) von Rhasspy geliefert werden.

                                Gruß
                                Jörg

                                tobetobeT 1 Reply Last reply
                                0
                                • capitaenzC Offline
                                  capitaenzC Offline
                                  capitaenz
                                  wrote on last edited by
                                  #217

                                  @tobetobe
                                  Danke für deine Hilfe!
                                  Das Problem sitzt vor dem Monitor und ich war so blöd und habe meinen Benutzernamen nicht eingetragen.

                                  Ich fasse einmal zusammen was ich gemacht habe:

                                  Image Flashen mit Win32 DiskImager (Raspian Buster lite)
                                  
                                  ssh und wpa_supplicant.conf auf SD-Karte anlegen
                                  
                                  sudo apt update
                                  
                                  sudo apt full-upgrade
                                  
                                  sudo curl -sSL https://get.docker.com | sh
                                  
                                  sudo usermod -aG docker pi
                                  
                                  sudo reboot -n
                                  
                                  sudo docker pull rhasspy/rhasspy:2.5.0-pre
                                  
                                  docker run -d -p 12101:12101 \
                                        --restart unless-stopped \
                                        -v "$HOME/.config/rhasspy/profiles:/profiles" \
                                        --device /dev/snd:/dev/snd \
                                        synesthesiam/rhasspy-server:latest \
                                        --user-profiles /profiles \
                                        --profile de
                                  

                                  Ich mache mich dann mal an das konfigurieren und hoffe, dass ich mein respeaker 2-mics pi hat bzw. respeaker 4-mics pi hat installiert bekomme.

                                  Danke und VG
                                  Leif

                                  ioBroker auf Synology DS920+ (SSD Raid / 20GB RAM) im VMM

                                  joergeliJ tobetobeT 2 Replies Last reply
                                  0
                                  • capitaenzC capitaenz

                                    @tobetobe
                                    Danke für deine Hilfe!
                                    Das Problem sitzt vor dem Monitor und ich war so blöd und habe meinen Benutzernamen nicht eingetragen.

                                    Ich fasse einmal zusammen was ich gemacht habe:

                                    Image Flashen mit Win32 DiskImager (Raspian Buster lite)
                                    
                                    ssh und wpa_supplicant.conf auf SD-Karte anlegen
                                    
                                    sudo apt update
                                    
                                    sudo apt full-upgrade
                                    
                                    sudo curl -sSL https://get.docker.com | sh
                                    
                                    sudo usermod -aG docker pi
                                    
                                    sudo reboot -n
                                    
                                    sudo docker pull rhasspy/rhasspy:2.5.0-pre
                                    
                                    docker run -d -p 12101:12101 \
                                          --restart unless-stopped \
                                          -v "$HOME/.config/rhasspy/profiles:/profiles" \
                                          --device /dev/snd:/dev/snd \
                                          synesthesiam/rhasspy-server:latest \
                                          --user-profiles /profiles \
                                          --profile de
                                    

                                    Ich mache mich dann mal an das konfigurieren und hoffe, dass ich mein respeaker 2-mics pi hat bzw. respeaker 4-mics pi hat installiert bekomme.

                                    Danke und VG
                                    Leif

                                    joergeliJ Online
                                    joergeliJ Online
                                    joergeli
                                    wrote on last edited by joergeli
                                    #218

                                    @capitaenz
                                    Hallo Leif,
                                    ich habe ein Respeaker 4-Mic Array.
                                    Die entspr. Respeaker-Treiber kannst Du auch installieren, indem Du zuerst HLC (Hermes LED Control) installierst,
                                    das dient zum Ansteuern des LED-Ringes.

                                    siehe HermesLedControl
                                    und hier: Installation & update

                                    Im Verlauf der HLC-Installation wirst Du u.a. gefragt, welches Mikrofon Du benutzt.
                                    Wenn Du dann Dein entspr. Respeaker-Mic auswählst, wirst Du anschl. gefragt, ob Du auch die entspr. Treiber installieren willst.

                                    Gruß
                                    Jörg

                                    1 Reply Last reply
                                    0
                                    • joergeliJ joergeli

                                      Hallo Thomas,
                                      @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                      Ab Zeile 25 würde dann bei mir der Aufruf von Funktionen stattfinden, die zu den jeweiligen Intents passen. Dazu muss dann auch das setState-Kommando zusammengesetzt werden.

                                      Versuche es mal so:

                                      
                                      var intentResult = $('mqtt.1.hermes.intent.*');
                                      var intentArray = [];
                                      
                                       for(var i = 0; i < intentResult.length; i++)
                                      {
                                          log("Zeile8:"+intentResult[i]);
                                          intentArray.push(intentResult[i]);
                                      }
                                      
                                      on({id: intentArray, change: "any"}, function (obj) {
                                          log(obj.newState.val);
                                          let intentObject = JSON.parse(obj.newState.val);
                                          let anzslots = intentObject.slots.length; //Anzahl Slots ermitteln
                                          log("Anzahl Slots:" + anzslots); 
                                          let intent = intentObject.intent.intentName;
                                          log("intent:" + intent);
                                          let siteId = intentObject.siteId;
                                          log("siteID:" + siteId);   
                                      
                                          let slot = [];
                                          let wertearray = [];
                                      
                                          for (i = 0; i < anzslots; i++) { 
                                              let slot = intentObject.slots[i].slotName+':'+intentObject.slots[i].value.value;
                                              log("slot[" +i + "]:" + slot);
                                              let slotwert  = intentObject.slots[i].value.value;
                                              wertearray.push(slotwert); // hier werden nur! die Werte der Slots in ein neues array "wertearray" geschrieben
                                          } // end of for
                                      
                                              log("Ausgabe: " + wertearray[0] + "." + wertearray[2]   + "," + wertearray[1]);
                                      
                                              //Setzen der States, bzw. Aufruf der entspr. Funktionen
                                              //setState (wertearray[0] + "." + wertearray[2] , wertearray[1], true);
                                      
                                      })
                                      
                                      

                                      Damit bekommst Du die Werte aus den Slots extrahiert und kannst dann damit das "setState" zusammenbauen.
                                      Es setzt aber voraus, daß immer 3 Slots ( slot[0], slot[1], slot[2]) von Rhasspy geliefert werden.

                                      Gruß
                                      Jörg

                                      tobetobeT Offline
                                      tobetobeT Offline
                                      tobetobe
                                      wrote on last edited by tobetobe
                                      #219

                                      @joergeli said in Rhasspy Offline Sprachsteuerung:

                                          log("Ausgabe: " + wertearray[0] + "." + wertearray[2]   + "," + wertearray[1]);                                                                    
                                      

                                      Hallo Jörg,

                                      ganz hervorragend! Vielen Dank. Wie gesagt, baue ich mir nun Funktionsaufrufe ein, die ich über if- Abfragen steuere. if bezieht sich dabei auf den Namen des intents, sodass ich die Funktionen spezifisch passend zum intent aufbauen kann. Dein Feld "wertarray" enthält natürlich immer so viele Werte, wie es slots gibt. Damit kann ich dann in einer Funktion auch "setState" immer so aufbauen, wie es für das intent notwendig ist, bzw auch alles sonstige, wie zB TTS-Funktionen mit hineinpacken.. Das finde ich jetzt schon ziemlich elegant.

                                      Mittlerweile schält sich bei mir auch immer mehr die Vorstellung heraus, dass ich wohl bei dem mqtt-Client von ioBroker bleibe und nicht direkt auf den Mosquitto-Broker zugreife. Es ist einfach angenehmer, wenn man die intents auch als Datenobjekte sehen kann. Und die Subscription erledigt der Client ja nun wirklich zuverlässig.

                                      Es interessiert mich noch, ob ich mir den Mosquitto-Broker nicht sogar sparen kann, indem ich direkt auf den internen Broker zugreife, allerdings mit eingetragener IP-Adresse. Ich muss nochmals nachlesen, was du dazu schon geschrieben hattest, bzw andere im Rhasspy-Forum. Oder halt einfach mal testen...

                                      Heute passiert allerdings nichts mehr. In diesem Sinne noch einen schönen Abend
                                      Thomas

                                      Beste Grüße
                                      tobetobe

                                      joergeliJ 1 Reply Last reply
                                      0
                                      • capitaenzC capitaenz

                                        @tobetobe
                                        Danke für deine Hilfe!
                                        Das Problem sitzt vor dem Monitor und ich war so blöd und habe meinen Benutzernamen nicht eingetragen.

                                        Ich fasse einmal zusammen was ich gemacht habe:

                                        Image Flashen mit Win32 DiskImager (Raspian Buster lite)
                                        
                                        ssh und wpa_supplicant.conf auf SD-Karte anlegen
                                        
                                        sudo apt update
                                        
                                        sudo apt full-upgrade
                                        
                                        sudo curl -sSL https://get.docker.com | sh
                                        
                                        sudo usermod -aG docker pi
                                        
                                        sudo reboot -n
                                        
                                        sudo docker pull rhasspy/rhasspy:2.5.0-pre
                                        
                                        docker run -d -p 12101:12101 \
                                              --restart unless-stopped \
                                              -v "$HOME/.config/rhasspy/profiles:/profiles" \
                                              --device /dev/snd:/dev/snd \
                                              synesthesiam/rhasspy-server:latest \
                                              --user-profiles /profiles \
                                              --profile de
                                        

                                        Ich mache mich dann mal an das konfigurieren und hoffe, dass ich mein respeaker 2-mics pi hat bzw. respeaker 4-mics pi hat installiert bekomme.

                                        Danke und VG
                                        Leif

                                        tobetobeT Offline
                                        tobetobeT Offline
                                        tobetobe
                                        wrote on last edited by
                                        #220

                                        @capitaenz

                                        Gut soweit! Bei Fragen meldest du dich.

                                        Beste Grüße
                                        tobetobe

                                        1 Reply Last reply
                                        0
                                        • tobetobeT tobetobe

                                          @joergeli said in Rhasspy Offline Sprachsteuerung:

                                              log("Ausgabe: " + wertearray[0] + "." + wertearray[2]   + "," + wertearray[1]);                                                                    
                                          

                                          Hallo Jörg,

                                          ganz hervorragend! Vielen Dank. Wie gesagt, baue ich mir nun Funktionsaufrufe ein, die ich über if- Abfragen steuere. if bezieht sich dabei auf den Namen des intents, sodass ich die Funktionen spezifisch passend zum intent aufbauen kann. Dein Feld "wertarray" enthält natürlich immer so viele Werte, wie es slots gibt. Damit kann ich dann in einer Funktion auch "setState" immer so aufbauen, wie es für das intent notwendig ist, bzw auch alles sonstige, wie zB TTS-Funktionen mit hineinpacken.. Das finde ich jetzt schon ziemlich elegant.

                                          Mittlerweile schält sich bei mir auch immer mehr die Vorstellung heraus, dass ich wohl bei dem mqtt-Client von ioBroker bleibe und nicht direkt auf den Mosquitto-Broker zugreife. Es ist einfach angenehmer, wenn man die intents auch als Datenobjekte sehen kann. Und die Subscription erledigt der Client ja nun wirklich zuverlässig.

                                          Es interessiert mich noch, ob ich mir den Mosquitto-Broker nicht sogar sparen kann, indem ich direkt auf den internen Broker zugreife, allerdings mit eingetragener IP-Adresse. Ich muss nochmals nachlesen, was du dazu schon geschrieben hattest, bzw andere im Rhasspy-Forum. Oder halt einfach mal testen...

                                          Heute passiert allerdings nichts mehr. In diesem Sinne noch einen schönen Abend
                                          Thomas

                                          joergeliJ Online
                                          joergeliJ Online
                                          joergeli
                                          wrote on last edited by
                                          #221

                                          Hallo Thomas,

                                          @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                          Es interessiert mich noch, ob ich mir den Mosquitto-Broker nicht sogar sparen kann, indem ich direkt auf den internen Broker zugreife, allerdings mit eingetragener IP-Adresse. Ich muss nochmals nachlesen, was du dazu schon geschrieben hattest, bzw andere im Rhasspy-Forum. Oder halt einfach mal testen...

                                          ... das wäre mir auch lieber, und ich hatte es auch schon versucht mit Rhasspy-IP/Port 12183.
                                          Funktioniert aber nicht, da man wohl nicht an den internen MQTT-Server im Docker herankommt?
                                          Habe diesbzgl. auch mal gegoogelt nach " auf MQTT-Server in Docker-Container zugreifen", aber da habe ich nur gefunden, wie man einen MQTT-Broker in einem Docker-Container installieren kann.
                                          Andererseits setzt wohl Hermes Led Control auch einen eigenständigen MQTT-Server voraus.

                                          Wenn man sich die Netzwerkparameter des Rhasspy-Raspis mit ifconfig ansieht, taucht da auch ein eigenständiges Netzwerkinterface namens "docker0" auf. Keine Ahnung, ob man damit was anfangen kann.
                                          Dessen IP-Adresse 172.17.0.1 ist natürlich in meinem 192.168.192.xxx-LAN nicht erreichbar.

                                          pi@voltron:~ $ ifconfig
                                          docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
                                                  inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
                                                  inet6 fe80::42:e6ff:fe9b:3c5b  prefixlen 64  scopeid 0x20<link>
                                                  ether 02:42:e6:9b:3c:5b  txqueuelen 0  (Ethernet)
                                                  RX packets 3295954  bytes 2538688841 (2.3 GiB)
                                                  RX errors 0  dropped 0  overruns 0  frame 0
                                                  TX packets 3287164  bytes 4911703231 (4.5 GiB)
                                                  TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
                                          
                                          eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
                                                  ether dc:a6:32:59:af:da  txqueuelen 1000  (Ethernet)
                                                  RX packets 0  bytes 0 (0.0 B)
                                                  RX errors 0  dropped 0  overruns 0  frame 0
                                                  TX packets 0  bytes 0 (0.0 B)
                                                  TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
                                          
                                          lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
                                                  inet 127.0.0.1  netmask 255.0.0.0
                                                  inet6 ::1  prefixlen 128  scopeid 0x10<host>
                                                  loop  txqueuelen 1000  (Lokale Schleife)
                                                  RX packets 8740  bytes 684161 (668.1 KiB)
                                                  RX errors 0  dropped 0  overruns 0  frame 0
                                                  TX packets 8740  bytes 684161 (668.1 KiB)
                                                  TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
                                          
                                          veth09f4fc4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
                                                  inet 169.254.198.203  netmask 255.255.0.0  broadcast 169.254.255.255
                                                  inet6 fe80::a520:6aa2:cace:e177  prefixlen 64  scopeid 0x20<link>
                                                  ether 26:46:35:aa:f2:a2  txqueuelen 0  (Ethernet)
                                                  RX packets 3295954  bytes 2584832197 (2.4 GiB)
                                                  RX errors 0  dropped 0  overruns 0  frame 0
                                                  TX packets 3288284  bytes 4912121058 (4.5 GiB)
                                                  TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
                                          
                                          wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
                                                  inet 192.168.192.26  netmask 255.255.255.0  broadcast 192.168.192.255
                                                  inet6 fe80::dea6:32ff:fe59:afdb  prefixlen 64  scopeid 0x20<link>
                                                  inet6 2002:5fde:1123:0:dea6:32ff:fe59:afdb  prefixlen 64  scopeid 0x0<global>
                                                  ether dc:a6:32:59:af:db  txqueuelen 1000  (Ethernet)
                                                  RX packets 118339  bytes 12174857 (11.6 MiB)
                                                  RX errors 0  dropped 69914  overruns 0  frame 0
                                                  TX packets 14616  bytes 8131441 (7.7 MiB)
                                                  TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
                                          
                                          

                                          Nebenbei:
                                          Ich habe mich in der mqtt.1-Client-Instanz jetzt nur noch auf folgende Topics subscribed:
                                          hermes/intent/#, hermes/asr/startListening, hermes/nlu/intentNotRecognized

                                          Das reicht aus, um alle Intents, das WakeWord und Intent-Nicht-Erkannt auszuwerten

                                          Gruß
                                          Jörg

                                          tobetobeT 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          774

                                          Online

                                          32.4k

                                          Users

                                          81.5k

                                          Topics

                                          1.3m

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

                                          • Don't have an account? Register

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