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

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

Community Forum

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

NEWS

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

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

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

Rhasspy Offline Sprachsteuerung

Geplant Angeheftet Gesperrt Verschoben Off Topic
403 Beiträge 30 Kommentatoren 100.5k Aufrufe 47 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • joergeliJ joergeli

    Hallo Thomas,

    sehr langlebig und leise sind die Lüfter von Noctua, allerdings ein wenig teurer.
    Ich habe den hier (ca. 15,-€) am ioBroker-Raspi, ist nur leise hörbar, wenn man das Ohr ca. 20 cm vor den Lüfter hält.
    Aber ich schweife ab ...

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

    Guten Morgen,

    @joergeli said in Rhasspy Offline Sprachsteuerung:

    Aber ich schweife ab ...

    Finde ich gar nicht. Dieser Hinweis kommt für mich gerade zur rechten Zeit, da ich meinen Lüfter gern gegen einen wirklich leisen ersetzen möchte.

    Ich habe mir soeben den leisesten 92mm-Lüfter bestellt.

    Danke & Gruß
    Thomas

    Beste Grüße
    tobetobe

    1 Antwort Letzte Antwort
    0
    • tobetobeT tobetobe

      @joergeli

      Hallo Jörg,

      da hast du Recht. Ich kenne diese Überlegungen ebenfalls. Den endgültigen Beweis, was nun besser ist, habe ich allerdings noch nicht gefunden. Zu einem Lüfter am ioBroker-Raspi würde ich auch gar nichts sagen. Dort habe ich natürlich auch einen. Nur in Verbindung mit Rhasspy würde ich aus den genannten Gründen abraten. Auch, weil man ja (oder Frau?) eine solche Geräuschquelle nicht im Wohnbereich haben möchte. Und dort wird sich der Rhasspy ja voraussichtlich bzw in den meisten Fällen befinden.

      Aber - wie schon so oft - ist das sicher auch ein Stück weit Geschmackssache

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

      @tobetobe & all
      Wie's der Teufel will, hat wohl gestern nacht der Corona-Virus meinen ioBroker-Raspi erwischt :angry:
      Heute morgen wollte ich gewohnheitsmäßig das ioBroker-Log kontrollieren --> ioBroker war nicht erreichbar.
      Mit Putty konnte ich mich aber auf den Raspi aufschalten, aber er war irgendwie "zäh", Average load um die 6.5/min (normalerweise ca. 0.1 - 0.3/min).
      Mir schwante übles, also ioBroker neu gestartet, kam auch wieder hoch, aber alles seeehr langsam, Scripte ließen sich nicht mehr speichern, etc.
      Dann Raspi rebootet, danach ebenfalls keine Besserung.

      Gott sei Dank hatte ich noch ein kpl. ioBroker-SD-Image vom 10.01.20 auf meinem NAS liegen.
      Also neue SD-Karte mit diesem Image beschrieben.
      Nach dem Booten mit der neuen SD-Karte sah es schon wieder besser aus.
      Es kamen zwar einige Fehlermeldungen in ioBroker, das lag aber daran, weil ich seit Januar einige neue JavaScripte geschrieben habe, bzw. Änderungen an bestehenden JS vorgenommen hatte.
      Aber glücklicherweise hatte ich gerade gestern mit ioBroker->Scripte->"Exportieren Sie alle Scripte" ein Backup erzeugt (mache ich immer, wenn ich erfolgreich ein neues Script gestrickt habe).
      Mit ioBroker->Scripte->Scripts importieren konnte ich die entspr. Zip-Datei importieren und somit alle meine JS wiederherstellen.

      Dann musste ich noch die Adapter, die seit Januar Updates bekommen hatten, auf die aktuellen Versionen updaten und jetzt ist wieder "alles Paletti".

      ioBroker läuft jetzt seit ca. 1/2 Tag wieder einwandfrei und ich habe gerade eben noch mal ein aktuelles SD-Image erzeugt und auf meinem NAS gespeichert.

      Fazit:
      Auch ein Lüfter verhindert einen SD-Karten-Tod nicht.
      Ein rel. aktuelles SD-Image (z.B. mit Win32 Disk Imager erstellt) vereinfacht/beschleunigt die Wiederherstellung, als wenn man "nur" ein ioBroker-Backup hat.
      Klar, ein ioBroker-Backup ist zwar ruckzuck erstellt, aber die anschl. Wiederherstellung dauert recht lang, weil alle Adapter neu installiert werden.

      Deshalb mein Tipp:
      Ruhig mal ca. 1 Std. Zeit nehmen, ioBroker-Raspi runterfahren, SD-Image (auf Festplatte, NAS, o.ä) erstellen und ioBroker-Raspi wieder starten.
      Im Falle eines Falles (und einer neuen SD-Karte), läuft ioBroker dann in ca. 2,5 Std. wieder.

      Gruß
      Jörg

      tobetobeT 1 Antwort Letzte Antwort
      0
      • joergeliJ joergeli

        @tobetobe & all
        Wie's der Teufel will, hat wohl gestern nacht der Corona-Virus meinen ioBroker-Raspi erwischt :angry:
        Heute morgen wollte ich gewohnheitsmäßig das ioBroker-Log kontrollieren --> ioBroker war nicht erreichbar.
        Mit Putty konnte ich mich aber auf den Raspi aufschalten, aber er war irgendwie "zäh", Average load um die 6.5/min (normalerweise ca. 0.1 - 0.3/min).
        Mir schwante übles, also ioBroker neu gestartet, kam auch wieder hoch, aber alles seeehr langsam, Scripte ließen sich nicht mehr speichern, etc.
        Dann Raspi rebootet, danach ebenfalls keine Besserung.

        Gott sei Dank hatte ich noch ein kpl. ioBroker-SD-Image vom 10.01.20 auf meinem NAS liegen.
        Also neue SD-Karte mit diesem Image beschrieben.
        Nach dem Booten mit der neuen SD-Karte sah es schon wieder besser aus.
        Es kamen zwar einige Fehlermeldungen in ioBroker, das lag aber daran, weil ich seit Januar einige neue JavaScripte geschrieben habe, bzw. Änderungen an bestehenden JS vorgenommen hatte.
        Aber glücklicherweise hatte ich gerade gestern mit ioBroker->Scripte->"Exportieren Sie alle Scripte" ein Backup erzeugt (mache ich immer, wenn ich erfolgreich ein neues Script gestrickt habe).
        Mit ioBroker->Scripte->Scripts importieren konnte ich die entspr. Zip-Datei importieren und somit alle meine JS wiederherstellen.

        Dann musste ich noch die Adapter, die seit Januar Updates bekommen hatten, auf die aktuellen Versionen updaten und jetzt ist wieder "alles Paletti".

        ioBroker läuft jetzt seit ca. 1/2 Tag wieder einwandfrei und ich habe gerade eben noch mal ein aktuelles SD-Image erzeugt und auf meinem NAS gespeichert.

        Fazit:
        Auch ein Lüfter verhindert einen SD-Karten-Tod nicht.
        Ein rel. aktuelles SD-Image (z.B. mit Win32 Disk Imager erstellt) vereinfacht/beschleunigt die Wiederherstellung, als wenn man "nur" ein ioBroker-Backup hat.
        Klar, ein ioBroker-Backup ist zwar ruckzuck erstellt, aber die anschl. Wiederherstellung dauert recht lang, weil alle Adapter neu installiert werden.

        Deshalb mein Tipp:
        Ruhig mal ca. 1 Std. Zeit nehmen, ioBroker-Raspi runterfahren, SD-Image (auf Festplatte, NAS, o.ä) erstellen und ioBroker-Raspi wieder starten.
        Im Falle eines Falles (und einer neuen SD-Karte), läuft ioBroker dann in ca. 2,5 Std. wieder.

        Gruß
        Jörg

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

        @joergeli
        Autsch... den Fall hatte ich zum Glück noch nicht. Ist aber einer der Gründe, warum ich bei meinem ioBroker Master von Pi4 auf Odroid gegangen bin. Da habe ich wenigstens eine SSD. Jaaaaa, die sind auch nicht ausfallsicher.

        Dennoch, Backup ist wichtig. Denn: Entweder man hat ein Backup oder man hat bald ein Backup. Mit dd und cron auf ein NAS zu sichern, ist ja nun auch kein Hexenwerk.

        Soeben kam mein neuer Lüfter: Eine Wohltat für die Ohren. Danke nochmals für den Tipp. Ich hatte schon einen Papst im Einsatz. Wenn ich den jedoch mit dem noctua vergleiche, muss ich einfach sagen, dass der noctua das bessere Gesamtkonzept hat.

        Gruß, Thomas

        Beste Grüße
        tobetobe

        joergeliJ 1 Antwort Letzte Antwort
        0
        • tobetobeT tobetobe

          @joergeli
          Autsch... den Fall hatte ich zum Glück noch nicht. Ist aber einer der Gründe, warum ich bei meinem ioBroker Master von Pi4 auf Odroid gegangen bin. Da habe ich wenigstens eine SSD. Jaaaaa, die sind auch nicht ausfallsicher.

          Dennoch, Backup ist wichtig. Denn: Entweder man hat ein Backup oder man hat bald ein Backup. Mit dd und cron auf ein NAS zu sichern, ist ja nun auch kein Hexenwerk.

          Soeben kam mein neuer Lüfter: Eine Wohltat für die Ohren. Danke nochmals für den Tipp. Ich hatte schon einen Papst im Einsatz. Wenn ich den jedoch mit dem noctua vergleiche, muss ich einfach sagen, dass der noctua das bessere Gesamtkonzept hat.

          Gruß, Thomas

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

          Hallo Thomas,
          ja, ich bin auch froh, daß der SD-Crash rel. glimpflich verlaufen ist

          @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

          Eine Wohltat für die Ohren. Danke nochmals für den Tipp. Ich hatte schon einen Papst im Einsatz. Wenn ich den jedoch mit dem noctua vergleiche, muss ich einfach sagen, dass der noctua das bessere Gesamtkonzept hat.

          Ich hatte mich vorher auch belesen, ob überhaupt ein Lüfter und wenn ja, welcher.
          Da war halt die überwiegende Mehrheit von Noctua überzeugt.
          Daß aber Noctua sogar noch besser ist, als seine Heiligkeit (der Papst) wußte ich noch nicht :blush: :grin: :blush:

          Gruß
          Jörg

          1 Antwort Letzte Antwort
          0
          • joergeliJ joergeli

            Hallo Thomas,

            ich bin mir nicht sicher, ob Du mit sudo raspi-config evtl. Deine Audio-Ausgabe auf das Matrix-Voice umstellen kannst, also nicht nur über Rhasspy?

            Die Signaltöne sind bei mir auch laut genug, aber die Ansagen über den Mini-NF-Verstärker könnten etwas lauter sein.

            @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

            Abfrage/Ansage von Zeit, Datum, Wochentag (einfache Geschichte)

            Anbei meine Scripte für Zeit, Datum/Wochentag:

            //__________________________________________________
            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;
                let data = 'Es ist ' + TimeString;
                httpPost(data); 
            }
            //__________________________________________________
            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 + '. '  + monat + ' ' + yyyy; 
                let data = DateString;
                httpPost(data); 
            }
            
            //__________________________________________________
            function wochentag(i){
                var tage = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'];
                var tag = (typeof(i) == 'object') ? i.getDay() : i ;
                return tage[tag];
            }
            //__________________________________________________
            

            Hinweis: Das hier

                if  (dd_string == "1")  { tagi = "ers";}   
                else if (dd_string == "3")  { tagi = "drit";}
            

            habe ich gemacht, weil bei mir sonst der "eins"te, bzw "drei"te angesagt wird,
            wie z.B. Heute ist Sonntag der "eins"te März 2020.
            Ist aber wahrscheinlich von der verwendeten Speech-Engine abhängig.

            Rhasspy Pre-Release 2.5:
            Nach neuestem Update werden jetzt bei mir die Intents über Kaldi nicht mehr erkannt - was im letzten Release noch wunderbar funktioniert hat. Es bleibt spannend .....

            Gruß
            Jörg

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

            Hallo Jörg,

            @joergeli said in Rhasspy Offline Sprachsteuerung:

            Anbei meine Scripte für Zeit, Datum/Wochentag:

            ich stehe vor einem Rätsel. Dein Script habe ich bei mir eingebaut und es funktioniert soweit auch sehr gut. Lediglich im Zusammenspiel mit deinem anderen Script zur Ansage der Wakeword-Erkennung (Ja?) und zur Ansage der Quittung (OK) tritt ein merkwürdiger Effekt auf. So sieht mein Script aus. Das Script für Ja? und OK ist auskommentiert.


            // Skript zur Ausgabe von Voice über TTS an Rhasspy
            // Für Rhasspy-TTS:
            let http = require('http');
            let options = {
            host: '192.168.13.157', //Rhasspy IP-Adresse
            port: 12101, //Rhasspy Port
            path: "/api/text-to-speech",
            method: 'POST',
            headers: {
            'User-Agent' : 'ioBroker',
            'Content-Type': 'text/plain',
            // 'Content-Length': data.length
            }
            };

            //______________________________________________________________________________
            function httpPost(data) {
            let req = http.request(options, function(res) {
            console.log("http Status: " + res.statusCode);
            // Header (Rückmeldung vom Webserver)
            console.log('HEADERS: ' + JSON.stringify(res.headers), (res.statusCode != 200 ? "warn" : "info"));
            });

             // Fehler abfangen
                req.on('error', function(e) { 
                console.log('ERROR: ' + e.message,"warn");
            });
            
             // write data to request body
            console.log("Data to request body: " + data);
            (data ? req.write(data) : console.log("Daten: keine Daten vorhanden"));
            req.end();
            

            }

            /*Hier Skript zur WakeWord-Erkennung
            const wake = 'mqtt.0.rhasspy.de.transition.SnowboyWakeListener' // Datenpunkt aendert sich von listening auf loaded, wenn wakeword erkannt wurde
            const befehl = 'mqtt.0.rhasspy.de.transition.WebrtcvadCommandListener' // Datenpunkt aendert sich von listening auf loaded, wenn befehl erkannt erkannt wurde
            const ansage = 'Ja?' // Ansage, wenn wakeword erkannt wurde. Hinweis: - Ansagetext mögl. kurz, damit er nicht als Befehl erkannt wird!
            const empf_ok = "OK" // Dieser Text wird gesprochen, wenn befehl erkannt wurde

            on({id: wake, change: "any"},function(obj) {
            let empf_code = getState(wake).val ;
            if (empf_code== "loaded"){ wakeword(); }
            });

            on({id: befehl, change: "any"},function(obj) {
            let empf_code = getState(befehl).val ;
            if (empf_code== "loaded"){ befehl_empf(); }
            });

            function wakeword(){
            httpPost(ansage);
            }

            function befehl_empf(){
            httpPost(empf_ok);
            }
            */

            //__________________________________________________
            function formatTwoDigits(n) {
            return n < 10 ? '0' + n : n;
            }
            //__________________________________________________

            //__________________________________________________
            function wochentag(i){
            var tage = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'];
            var tag = (typeof(i) == 'object') ? i.getDay() : i ;
            return tage[tag];
            }
            //__________________________________________________

            //Hier Skript zur Abfrage von Zeit, Datum, Tag, Wochentag
            var intentResult = $('mqtt.0.rhasspy.intent.GetTime');
            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);
            if(intentObject.hasOwnProperty('state'))
            {
            var state = intentObject.state;

                if(state === "time"){
                    log("nach Zeit gefragt");
                    var now = new Date();
                    log(now);
                    var hours = formatTwoDigits(now.getHours());
                    var minutes = formatTwoDigits(now.getMinutes());
                    var seconds = formatTwoDigits(now.getSeconds());
                    let TimeString = "Es ist jetzt  " + hours + ":" + minutes + ":" + seconds;
                    log(TimeString);
            

            // let data = TimeString;
            data = TimeString;
            httpPost(data)};

                if(state === "date"){
                    log("nach Datum gefragt");
                    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 + '. '  + monat + ' ' + yyyy; 
                    log(DateString);
                    data = DateString;
                    httpPost(data)}};             
            });
            

            Auskommentiert funktioniert alles und ich bekomme - je nach Frage - die Zeit oder das Datum angesagt. Wenn ich diesen Teil jedoch wieder aktiviere, findet keine Ansage statt.

            Und das, obwohl die Funktion "function httpPost(data)" im Consolelog die richtige Ansage auswirft. Sie nachfolgenden Auszug aus dem LOG:


            LOG ohne Ansage:

            13:51:45.742 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: {"state": "time"}
            13:51:45.742 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: nach Zeit gefragt
            13:51:45.742 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: '2020-03-19T12:51:45.742Z'
            13:51:45.742 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: Es ist jetzt 13:51:45
            13:51:45.743 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: Data to request body: Es ist jetzt 13:51:45
            13:51:50.824 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: http Status: 200
            13:51:50.824 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: HEADERS: {"content-type":"text/html; charset=utf-8","content-length":"22","date":"Thu, 19 Mar 2020 12:51:50 GMT","server":"hypercorn-h11","connection":"close"}

            LOG mit Ansage
            13:53:44.578 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: Data to request body: Ja?
            13:53:45.961 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: http Status: 200
            13:53:45.961 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: HEADERS: {"content-type":"text/html; charset=utf-8","content-length":"3","date":"Thu, 19 Mar 2020 12:53:45 GMT","server":"hypercorn-h11","connection":"close"}
            13:53:47.580 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: Data to request body: OK
            13:53:48.794 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: {"state": "time"}
            13:53:48.794 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: nach Zeit gefragt
            13:53:48.794 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: '2020-03-19T12:53:48.794Z'
            13:53:48.794 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: Es ist jetzt 13:53:48
            13:53:48.795 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: Data to request body: Es ist jetzt 13:53:48
            13:53:49.017 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: http Status: 200
            13:53:49.017 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: HEADERS: {"content-type":"text/html; charset=utf-8","content-length":"2","date":"Thu, 19 Mar 2020 12:53:49 GMT","server":"hypercorn-h11","connection":"close"}


            In meinem Skript reagiere ich ja auch noch auf andere MQTT-Ereignisse, zB auf Temperaturabfragen oder auf Eingaben in meine Einkaufsliste. Die funktionieren jeweils mit den Quittungen und den anschließenden Ansagen.

            Ich vermute ein Problem im Zusammenhang mit der Definition von Variablen, also ob lokal oder global. In dem Sinne habe ich auch schon einiges ausprobiert, komme nun aber nicht mehr weiter.

            Hättest du eine Idee?

            Herzlichen Dank schon einmal.
            Gruß, Thomas

            Beste Grüße
            tobetobe

            joergeliJ 1 Antwort Letzte Antwort
            0
            • tobetobeT tobetobe

              Hallo Jörg,

              @joergeli said in Rhasspy Offline Sprachsteuerung:

              Anbei meine Scripte für Zeit, Datum/Wochentag:

              ich stehe vor einem Rätsel. Dein Script habe ich bei mir eingebaut und es funktioniert soweit auch sehr gut. Lediglich im Zusammenspiel mit deinem anderen Script zur Ansage der Wakeword-Erkennung (Ja?) und zur Ansage der Quittung (OK) tritt ein merkwürdiger Effekt auf. So sieht mein Script aus. Das Script für Ja? und OK ist auskommentiert.


              // Skript zur Ausgabe von Voice über TTS an Rhasspy
              // Für Rhasspy-TTS:
              let http = require('http');
              let options = {
              host: '192.168.13.157', //Rhasspy IP-Adresse
              port: 12101, //Rhasspy Port
              path: "/api/text-to-speech",
              method: 'POST',
              headers: {
              'User-Agent' : 'ioBroker',
              'Content-Type': 'text/plain',
              // 'Content-Length': data.length
              }
              };

              //______________________________________________________________________________
              function httpPost(data) {
              let req = http.request(options, function(res) {
              console.log("http Status: " + res.statusCode);
              // Header (Rückmeldung vom Webserver)
              console.log('HEADERS: ' + JSON.stringify(res.headers), (res.statusCode != 200 ? "warn" : "info"));
              });

               // Fehler abfangen
                  req.on('error', function(e) { 
                  console.log('ERROR: ' + e.message,"warn");
              });
              
               // write data to request body
              console.log("Data to request body: " + data);
              (data ? req.write(data) : console.log("Daten: keine Daten vorhanden"));
              req.end();
              

              }

              /*Hier Skript zur WakeWord-Erkennung
              const wake = 'mqtt.0.rhasspy.de.transition.SnowboyWakeListener' // Datenpunkt aendert sich von listening auf loaded, wenn wakeword erkannt wurde
              const befehl = 'mqtt.0.rhasspy.de.transition.WebrtcvadCommandListener' // Datenpunkt aendert sich von listening auf loaded, wenn befehl erkannt erkannt wurde
              const ansage = 'Ja?' // Ansage, wenn wakeword erkannt wurde. Hinweis: - Ansagetext mögl. kurz, damit er nicht als Befehl erkannt wird!
              const empf_ok = "OK" // Dieser Text wird gesprochen, wenn befehl erkannt wurde

              on({id: wake, change: "any"},function(obj) {
              let empf_code = getState(wake).val ;
              if (empf_code== "loaded"){ wakeword(); }
              });

              on({id: befehl, change: "any"},function(obj) {
              let empf_code = getState(befehl).val ;
              if (empf_code== "loaded"){ befehl_empf(); }
              });

              function wakeword(){
              httpPost(ansage);
              }

              function befehl_empf(){
              httpPost(empf_ok);
              }
              */

              //__________________________________________________
              function formatTwoDigits(n) {
              return n < 10 ? '0' + n : n;
              }
              //__________________________________________________

              //__________________________________________________
              function wochentag(i){
              var tage = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'];
              var tag = (typeof(i) == 'object') ? i.getDay() : i ;
              return tage[tag];
              }
              //__________________________________________________

              //Hier Skript zur Abfrage von Zeit, Datum, Tag, Wochentag
              var intentResult = $('mqtt.0.rhasspy.intent.GetTime');
              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);
              if(intentObject.hasOwnProperty('state'))
              {
              var state = intentObject.state;

                  if(state === "time"){
                      log("nach Zeit gefragt");
                      var now = new Date();
                      log(now);
                      var hours = formatTwoDigits(now.getHours());
                      var minutes = formatTwoDigits(now.getMinutes());
                      var seconds = formatTwoDigits(now.getSeconds());
                      let TimeString = "Es ist jetzt  " + hours + ":" + minutes + ":" + seconds;
                      log(TimeString);
              

              // let data = TimeString;
              data = TimeString;
              httpPost(data)};

                  if(state === "date"){
                      log("nach Datum gefragt");
                      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 + '. '  + monat + ' ' + yyyy; 
                      log(DateString);
                      data = DateString;
                      httpPost(data)}};             
              });
              

              Auskommentiert funktioniert alles und ich bekomme - je nach Frage - die Zeit oder das Datum angesagt. Wenn ich diesen Teil jedoch wieder aktiviere, findet keine Ansage statt.

              Und das, obwohl die Funktion "function httpPost(data)" im Consolelog die richtige Ansage auswirft. Sie nachfolgenden Auszug aus dem LOG:


              LOG ohne Ansage:

              13:51:45.742 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: {"state": "time"}
              13:51:45.742 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: nach Zeit gefragt
              13:51:45.742 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: '2020-03-19T12:51:45.742Z'
              13:51:45.742 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: Es ist jetzt 13:51:45
              13:51:45.743 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: Data to request body: Es ist jetzt 13:51:45
              13:51:50.824 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: http Status: 200
              13:51:50.824 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: HEADERS: {"content-type":"text/html; charset=utf-8","content-length":"22","date":"Thu, 19 Mar 2020 12:51:50 GMT","server":"hypercorn-h11","connection":"close"}

              LOG mit Ansage
              13:53:44.578 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: Data to request body: Ja?
              13:53:45.961 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: http Status: 200
              13:53:45.961 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: HEADERS: {"content-type":"text/html; charset=utf-8","content-length":"3","date":"Thu, 19 Mar 2020 12:53:45 GMT","server":"hypercorn-h11","connection":"close"}
              13:53:47.580 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: Data to request body: OK
              13:53:48.794 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: {"state": "time"}
              13:53:48.794 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: nach Zeit gefragt
              13:53:48.794 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: '2020-03-19T12:53:48.794Z'
              13:53:48.794 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: Es ist jetzt 13:53:48
              13:53:48.795 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: Data to request body: Es ist jetzt 13:53:48
              13:53:49.017 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: http Status: 200
              13:53:49.017 info javascript.0 (2722) script.js.Rhasspy.Rhasspy: HEADERS: {"content-type":"text/html; charset=utf-8","content-length":"2","date":"Thu, 19 Mar 2020 12:53:49 GMT","server":"hypercorn-h11","connection":"close"}


              In meinem Skript reagiere ich ja auch noch auf andere MQTT-Ereignisse, zB auf Temperaturabfragen oder auf Eingaben in meine Einkaufsliste. Die funktionieren jeweils mit den Quittungen und den anschließenden Ansagen.

              Ich vermute ein Problem im Zusammenhang mit der Definition von Variablen, also ob lokal oder global. In dem Sinne habe ich auch schon einiges ausprobiert, komme nun aber nicht mehr weiter.

              Hättest du eine Idee?

              Herzlichen Dank schon einmal.
              Gruß, Thomas

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

              Hallo Thomas,

              eins vorweg:
              Laß das mal mit den Spoilern, der Code wird dann irgendwie zerstückelt, besser kpl. als Code posten.

              Ich habe die "Stückelei" mal zusammengesetzt:

              // Skript zur Sprach-Ausgabe über TTS an Rhasspy
              //_________________________________________________________
              
              let http = require('http');
              let options = {
              host: '192.168.13.157', //Rhasspy IP-Adresse
              port: 12101, //Rhasspy Port
              path: "/api/text-to-speech",
              method: 'POST',
              headers: {
              'User-Agent' : 'ioBroker',
              'Content-Type': 'text/plain',
              }
              };
              //______________________________________________________________________________
              function httpPost(data) {
              let req = http.request(options, function(res) {
              console.log("http Status: " + res.statusCode);
              // Header (Rückmeldung vom Webserver)
              console.log('HEADERS: ' + JSON.stringify(res.headers), (res.statusCode != 200 ? "warn" : "info"));
              });
               // Fehler abfangen
                  req.on('error', function(e) { 
                  console.log('ERROR: ' + e.message,"warn");
              });
              
               // write data to request body
              console.log("Data to request body: " + data);
              (data ? req.write(data) : console.log("Daten: keine Daten vorhanden"));
              req.end();
              }
              //______________________________________________________________________________
              
              //WakeWord-/Befehls-Erkennung
              const wake = 'mqtt.0.rhasspy.de.transition.SnowboyWakeListener' // Datenpunkt aendert sich von listening auf loaded, wenn wakeword erkannt wurde
              const befehl = 'mqtt.0.rhasspy.de.transition.WebrtcvadCommandListener' // Datenpunkt aendert sich von listening auf loaded, wenn befehl erkannt erkannt wurde
              const ansage = 'Ja?' // Ansage, wenn wakeword erkannt wurde. Hinweis: - Ansagetext mögl. kurz, damit er nicht als Befehl erkannt wird!
              const empf_ok = "OK" // Dieser Text wird gesprochen, wenn befehl erkannt wurde
              
              on({id: wake, change: "any"},function(obj) {
              let empf_code = getState(wake).val ;
              if (empf_code== "loaded"){ wakeword(); }
              });
              
              on({id: befehl, change: "any"},function(obj) {
              let empf_code = getState(befehl).val ;
              if (empf_code== "loaded"){ befehl_empf(); }
              });
              
              function wakeword(){ httpPost(ansage); }
              
              function befehl_empf(){ httpPost(empf_ok); }
              //______________________________________________________________________________
              
              function formatTwoDigits(n) {
              return n < 10 ? '0' + n : n;
              }
              
              function wochentag(i){
              var tage = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'];
              var tag = (typeof(i) == 'object') ? i.getDay() : i ;
              return tage[tag];
              }
              //__________________________________________________
              
              
              //#######################################################################
              //Dieser Abschnitt wird m.E. nur einmalig!!!  beim Starten des Skriptes ausgeführt
              //#######################################################################
              var intentResult = $('mqtt.0.rhasspy.intent.GetTime');
              var intentArray = [];
              for(var i = 0; i < intentResult.length; i++)
              {
              log(intentResult[i]);
              intentArray.push(intentResult[i]);
              }
              //#######################################################################
              
              
              //#######################################################################
              // on({id: intentArray, change: "any"} wird niemals getriggert !!!
              //#######################################################################
              on({id: intentArray, change: "any"}, function (obj) {
              log(obj.newState.val);
              let intentObject = JSON.parse(obj.newState.val);
              if(intentObject.hasOwnProperty('state'))
              {
              var state = intentObject.state;
                  if(state === "time"){
                      log("nach Zeit gefragt");
                      var now = new Date();
                      var hours = formatTwoDigits(now.getHours());
                      var minutes = formatTwoDigits(now.getMinutes());
                      var seconds = formatTwoDigits(now.getSeconds());
                      let TimeString = "Es ist jetzt  " + hours + ":" + minutes + ":" + seconds;
                      log(TimeString);
                      let data = TimeString;
                      httpPost(data)
                  };
              
              
                  if(state === "date"){
                      log("nach Datum gefragt");
                      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 ' + tagi + '. '  + monat + ' ' + yyyy; 
                      log(DateString);
                      let data = DateString;
                      httpPost(data)}};             
              
              });
              
              

              Ich kann das Problem bei mir leider nicht nachvollziehen, da ich für meine verschiedenen Intents (Temperatur, Lampen, Zeit, etc.) jeweils einen eigenen Datenpunkt verwende - diesen Datenpunkt prüfe ich dann auf Änderung und triggere dann entspr. die Ausgabe, bzw. Sprachansage.

              So wie ich das sehe, werden Deine Intents in ein Array geschrieben?
              Dieses Array willst Du dann auf Änderung prüfen und entspr. Ansagen generieren?

              Etwas ist mir aber in Deinem Skript aufgefallen:
              Ich glaube, die Variable var intentResult = $('mqtt.0.rhasspy.intent.GetTime');, bzw. das intentArray wird nur einmalig bei Scriptstart abgefragt, bzw. gefüllt.
              Somit wird auch on({id: intentArray, change: "any"}..... niemals bei Arrayänderung getriggert, d.h. es können keine Sprachausgaben erfolgen.
              Ich habe die Stelle im Script mal mit //######################## markiert.

              Ich würde testweise mal versuchen, diesen Abschnitt in die function befehl_empf() zu verlagern.
              Dann müsste theoretisch jedes Mal, nachdem ein Befehl empfangen wurde, das Array gefüllt werden.
              Anschließend könnte dann auf die Änderung des Arrays getriggert werden und mit den entspr. if-Abfragen, die entspr. Sprachansagen ausgegeben werden.

              Ich kenne mich zu wenig in JS aus, um zu beurteilen, ob überhaupt mit einer Array-Änderung getriggert werden kann.
              Zur Not müsste man sich ein "Hilfsobjekt", bzw. "Hilfs-State" erstellen, wie z.B. "javascript.0.Arrayaenderung" und auf Änderung desselben triggern.
              Mit anderen Worten: Wenn sich das Array ändert, wird ebenfalls mit z.B. setState ('javascript.0.Arrayaenderung', true); gesetzt.
              Mit dieser Änderung des Datenpunktes Arrayaenderung kann dann getriggert werden.

              Ich glaube übrigens nicht, daß das Problem mit globalen/lokalen Variablen zusammenhängt.

              Ich hoffe, mein Geschwafel hilft Dir trotzdem weiter.

              Gruß
              Jörg

              tobetobeT 2 Antworten Letzte Antwort
              0
              • joergeliJ joergeli

                Hallo Thomas,

                eins vorweg:
                Laß das mal mit den Spoilern, der Code wird dann irgendwie zerstückelt, besser kpl. als Code posten.

                Ich habe die "Stückelei" mal zusammengesetzt:

                // Skript zur Sprach-Ausgabe über TTS an Rhasspy
                //_________________________________________________________
                
                let http = require('http');
                let options = {
                host: '192.168.13.157', //Rhasspy IP-Adresse
                port: 12101, //Rhasspy Port
                path: "/api/text-to-speech",
                method: 'POST',
                headers: {
                'User-Agent' : 'ioBroker',
                'Content-Type': 'text/plain',
                }
                };
                //______________________________________________________________________________
                function httpPost(data) {
                let req = http.request(options, function(res) {
                console.log("http Status: " + res.statusCode);
                // Header (Rückmeldung vom Webserver)
                console.log('HEADERS: ' + JSON.stringify(res.headers), (res.statusCode != 200 ? "warn" : "info"));
                });
                 // Fehler abfangen
                    req.on('error', function(e) { 
                    console.log('ERROR: ' + e.message,"warn");
                });
                
                 // write data to request body
                console.log("Data to request body: " + data);
                (data ? req.write(data) : console.log("Daten: keine Daten vorhanden"));
                req.end();
                }
                //______________________________________________________________________________
                
                //WakeWord-/Befehls-Erkennung
                const wake = 'mqtt.0.rhasspy.de.transition.SnowboyWakeListener' // Datenpunkt aendert sich von listening auf loaded, wenn wakeword erkannt wurde
                const befehl = 'mqtt.0.rhasspy.de.transition.WebrtcvadCommandListener' // Datenpunkt aendert sich von listening auf loaded, wenn befehl erkannt erkannt wurde
                const ansage = 'Ja?' // Ansage, wenn wakeword erkannt wurde. Hinweis: - Ansagetext mögl. kurz, damit er nicht als Befehl erkannt wird!
                const empf_ok = "OK" // Dieser Text wird gesprochen, wenn befehl erkannt wurde
                
                on({id: wake, change: "any"},function(obj) {
                let empf_code = getState(wake).val ;
                if (empf_code== "loaded"){ wakeword(); }
                });
                
                on({id: befehl, change: "any"},function(obj) {
                let empf_code = getState(befehl).val ;
                if (empf_code== "loaded"){ befehl_empf(); }
                });
                
                function wakeword(){ httpPost(ansage); }
                
                function befehl_empf(){ httpPost(empf_ok); }
                //______________________________________________________________________________
                
                function formatTwoDigits(n) {
                return n < 10 ? '0' + n : n;
                }
                
                function wochentag(i){
                var tage = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'];
                var tag = (typeof(i) == 'object') ? i.getDay() : i ;
                return tage[tag];
                }
                //__________________________________________________
                
                
                //#######################################################################
                //Dieser Abschnitt wird m.E. nur einmalig!!!  beim Starten des Skriptes ausgeführt
                //#######################################################################
                var intentResult = $('mqtt.0.rhasspy.intent.GetTime');
                var intentArray = [];
                for(var i = 0; i < intentResult.length; i++)
                {
                log(intentResult[i]);
                intentArray.push(intentResult[i]);
                }
                //#######################################################################
                
                
                //#######################################################################
                // on({id: intentArray, change: "any"} wird niemals getriggert !!!
                //#######################################################################
                on({id: intentArray, change: "any"}, function (obj) {
                log(obj.newState.val);
                let intentObject = JSON.parse(obj.newState.val);
                if(intentObject.hasOwnProperty('state'))
                {
                var state = intentObject.state;
                    if(state === "time"){
                        log("nach Zeit gefragt");
                        var now = new Date();
                        var hours = formatTwoDigits(now.getHours());
                        var minutes = formatTwoDigits(now.getMinutes());
                        var seconds = formatTwoDigits(now.getSeconds());
                        let TimeString = "Es ist jetzt  " + hours + ":" + minutes + ":" + seconds;
                        log(TimeString);
                        let data = TimeString;
                        httpPost(data)
                    };
                
                
                    if(state === "date"){
                        log("nach Datum gefragt");
                        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 ' + tagi + '. '  + monat + ' ' + yyyy; 
                        log(DateString);
                        let data = DateString;
                        httpPost(data)}};             
                
                });
                
                

                Ich kann das Problem bei mir leider nicht nachvollziehen, da ich für meine verschiedenen Intents (Temperatur, Lampen, Zeit, etc.) jeweils einen eigenen Datenpunkt verwende - diesen Datenpunkt prüfe ich dann auf Änderung und triggere dann entspr. die Ausgabe, bzw. Sprachansage.

                So wie ich das sehe, werden Deine Intents in ein Array geschrieben?
                Dieses Array willst Du dann auf Änderung prüfen und entspr. Ansagen generieren?

                Etwas ist mir aber in Deinem Skript aufgefallen:
                Ich glaube, die Variable var intentResult = $('mqtt.0.rhasspy.intent.GetTime');, bzw. das intentArray wird nur einmalig bei Scriptstart abgefragt, bzw. gefüllt.
                Somit wird auch on({id: intentArray, change: "any"}..... niemals bei Arrayänderung getriggert, d.h. es können keine Sprachausgaben erfolgen.
                Ich habe die Stelle im Script mal mit //######################## markiert.

                Ich würde testweise mal versuchen, diesen Abschnitt in die function befehl_empf() zu verlagern.
                Dann müsste theoretisch jedes Mal, nachdem ein Befehl empfangen wurde, das Array gefüllt werden.
                Anschließend könnte dann auf die Änderung des Arrays getriggert werden und mit den entspr. if-Abfragen, die entspr. Sprachansagen ausgegeben werden.

                Ich kenne mich zu wenig in JS aus, um zu beurteilen, ob überhaupt mit einer Array-Änderung getriggert werden kann.
                Zur Not müsste man sich ein "Hilfsobjekt", bzw. "Hilfs-State" erstellen, wie z.B. "javascript.0.Arrayaenderung" und auf Änderung desselben triggern.
                Mit anderen Worten: Wenn sich das Array ändert, wird ebenfalls mit z.B. setState ('javascript.0.Arrayaenderung', true); gesetzt.
                Mit dieser Änderung des Datenpunktes Arrayaenderung kann dann getriggert werden.

                Ich glaube übrigens nicht, daß das Problem mit globalen/lokalen Variablen zusammenhängt.

                Ich hoffe, mein Geschwafel hilft Dir trotzdem weiter.

                Gruß
                Jörg

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

                @joergeli

                Guten Morgen Jörg,

                tut mir leid, dass ich dir mit dem Spoiler unnötigen Aufwand verursacht habe. Beim letzten Mal dachte ich, mir wäre ein Fehler beim Hineinkopieren unterlaufen. Darauf habe ich diesmal besonders geachtet. Im Editor sieht das dann auch immer richtig gut aus, solange man "Submit" nicht auslöst. Großes Versprechen: Mache ich nie wieder!

                Zurück zum Thema: Das Skript selbst habe ich von @Tictactoo übernommen und setze es zum Auslesen aller MQTT-states ein. Wie gesagt, funktioniert es tadellos. Die onIDs werden immer sauber getriggert, was ja auch grundsätzlich bei GetTime der Fall ist. Wie und warum das mit den Arrays funktioniert, weiß ich ehrlich gesagt nicht.

                @joergeli said in Rhasspy Offline Sprachsteuerung:

                Ich würde testweise mal versuchen, diesen Abschnitt in die function befehl_empf() zu verlagern.

                Deinen Tipp werde ich mal befolgen und ausprobieren, ggf mit Hilfsobjekten, falls erforderlich

                @joergeli said in Rhasspy Offline Sprachsteuerung:

                Ich hoffe, mein Geschwafel hilft Dir trotzdem weiter.

                Ich halte deine Ausführungen nie für Geschwafel. Im Gegenteil: Ich schätze deine Meinung ganz außerordentlich. Vielen herzlichen Dank für deine Hilfe.

                Gruß
                Thomas

                Beste Grüße
                tobetobe

                1 Antwort Letzte Antwort
                0
                • joergeliJ joergeli

                  Hallo Thomas,

                  eins vorweg:
                  Laß das mal mit den Spoilern, der Code wird dann irgendwie zerstückelt, besser kpl. als Code posten.

                  Ich habe die "Stückelei" mal zusammengesetzt:

                  // Skript zur Sprach-Ausgabe über TTS an Rhasspy
                  //_________________________________________________________
                  
                  let http = require('http');
                  let options = {
                  host: '192.168.13.157', //Rhasspy IP-Adresse
                  port: 12101, //Rhasspy Port
                  path: "/api/text-to-speech",
                  method: 'POST',
                  headers: {
                  'User-Agent' : 'ioBroker',
                  'Content-Type': 'text/plain',
                  }
                  };
                  //______________________________________________________________________________
                  function httpPost(data) {
                  let req = http.request(options, function(res) {
                  console.log("http Status: " + res.statusCode);
                  // Header (Rückmeldung vom Webserver)
                  console.log('HEADERS: ' + JSON.stringify(res.headers), (res.statusCode != 200 ? "warn" : "info"));
                  });
                   // Fehler abfangen
                      req.on('error', function(e) { 
                      console.log('ERROR: ' + e.message,"warn");
                  });
                  
                   // write data to request body
                  console.log("Data to request body: " + data);
                  (data ? req.write(data) : console.log("Daten: keine Daten vorhanden"));
                  req.end();
                  }
                  //______________________________________________________________________________
                  
                  //WakeWord-/Befehls-Erkennung
                  const wake = 'mqtt.0.rhasspy.de.transition.SnowboyWakeListener' // Datenpunkt aendert sich von listening auf loaded, wenn wakeword erkannt wurde
                  const befehl = 'mqtt.0.rhasspy.de.transition.WebrtcvadCommandListener' // Datenpunkt aendert sich von listening auf loaded, wenn befehl erkannt erkannt wurde
                  const ansage = 'Ja?' // Ansage, wenn wakeword erkannt wurde. Hinweis: - Ansagetext mögl. kurz, damit er nicht als Befehl erkannt wird!
                  const empf_ok = "OK" // Dieser Text wird gesprochen, wenn befehl erkannt wurde
                  
                  on({id: wake, change: "any"},function(obj) {
                  let empf_code = getState(wake).val ;
                  if (empf_code== "loaded"){ wakeword(); }
                  });
                  
                  on({id: befehl, change: "any"},function(obj) {
                  let empf_code = getState(befehl).val ;
                  if (empf_code== "loaded"){ befehl_empf(); }
                  });
                  
                  function wakeword(){ httpPost(ansage); }
                  
                  function befehl_empf(){ httpPost(empf_ok); }
                  //______________________________________________________________________________
                  
                  function formatTwoDigits(n) {
                  return n < 10 ? '0' + n : n;
                  }
                  
                  function wochentag(i){
                  var tage = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'];
                  var tag = (typeof(i) == 'object') ? i.getDay() : i ;
                  return tage[tag];
                  }
                  //__________________________________________________
                  
                  
                  //#######################################################################
                  //Dieser Abschnitt wird m.E. nur einmalig!!!  beim Starten des Skriptes ausgeführt
                  //#######################################################################
                  var intentResult = $('mqtt.0.rhasspy.intent.GetTime');
                  var intentArray = [];
                  for(var i = 0; i < intentResult.length; i++)
                  {
                  log(intentResult[i]);
                  intentArray.push(intentResult[i]);
                  }
                  //#######################################################################
                  
                  
                  //#######################################################################
                  // on({id: intentArray, change: "any"} wird niemals getriggert !!!
                  //#######################################################################
                  on({id: intentArray, change: "any"}, function (obj) {
                  log(obj.newState.val);
                  let intentObject = JSON.parse(obj.newState.val);
                  if(intentObject.hasOwnProperty('state'))
                  {
                  var state = intentObject.state;
                      if(state === "time"){
                          log("nach Zeit gefragt");
                          var now = new Date();
                          var hours = formatTwoDigits(now.getHours());
                          var minutes = formatTwoDigits(now.getMinutes());
                          var seconds = formatTwoDigits(now.getSeconds());
                          let TimeString = "Es ist jetzt  " + hours + ":" + minutes + ":" + seconds;
                          log(TimeString);
                          let data = TimeString;
                          httpPost(data)
                      };
                  
                  
                      if(state === "date"){
                          log("nach Datum gefragt");
                          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 ' + tagi + '. '  + monat + ' ' + yyyy; 
                          log(DateString);
                          let data = DateString;
                          httpPost(data)}};             
                  
                  });
                  
                  

                  Ich kann das Problem bei mir leider nicht nachvollziehen, da ich für meine verschiedenen Intents (Temperatur, Lampen, Zeit, etc.) jeweils einen eigenen Datenpunkt verwende - diesen Datenpunkt prüfe ich dann auf Änderung und triggere dann entspr. die Ausgabe, bzw. Sprachansage.

                  So wie ich das sehe, werden Deine Intents in ein Array geschrieben?
                  Dieses Array willst Du dann auf Änderung prüfen und entspr. Ansagen generieren?

                  Etwas ist mir aber in Deinem Skript aufgefallen:
                  Ich glaube, die Variable var intentResult = $('mqtt.0.rhasspy.intent.GetTime');, bzw. das intentArray wird nur einmalig bei Scriptstart abgefragt, bzw. gefüllt.
                  Somit wird auch on({id: intentArray, change: "any"}..... niemals bei Arrayänderung getriggert, d.h. es können keine Sprachausgaben erfolgen.
                  Ich habe die Stelle im Script mal mit //######################## markiert.

                  Ich würde testweise mal versuchen, diesen Abschnitt in die function befehl_empf() zu verlagern.
                  Dann müsste theoretisch jedes Mal, nachdem ein Befehl empfangen wurde, das Array gefüllt werden.
                  Anschließend könnte dann auf die Änderung des Arrays getriggert werden und mit den entspr. if-Abfragen, die entspr. Sprachansagen ausgegeben werden.

                  Ich kenne mich zu wenig in JS aus, um zu beurteilen, ob überhaupt mit einer Array-Änderung getriggert werden kann.
                  Zur Not müsste man sich ein "Hilfsobjekt", bzw. "Hilfs-State" erstellen, wie z.B. "javascript.0.Arrayaenderung" und auf Änderung desselben triggern.
                  Mit anderen Worten: Wenn sich das Array ändert, wird ebenfalls mit z.B. setState ('javascript.0.Arrayaenderung', true); gesetzt.
                  Mit dieser Änderung des Datenpunktes Arrayaenderung kann dann getriggert werden.

                  Ich glaube übrigens nicht, daß das Problem mit globalen/lokalen Variablen zusammenhängt.

                  Ich hoffe, mein Geschwafel hilft Dir trotzdem weiter.

                  Gruß
                  Jörg

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

                  @joergeli
                  Hallo Jörg,

                  wie ich sehe, hast du dich weiterhin mit Rhasspy Version 2.5 befasst. Mal abgesehen von deinem spezifischen Problem: Ist diese Version aus deiner Sicht schon alltagstauglich oder generell noch zu fehlerbehaftet? Abhängig von deiner Empfehlung würde ich dann entweder auch migrieren oder ggf noch warten.

                  Einen schönen Sonntag noch
                  Thomas

                  Beste Grüße
                  tobetobe

                  1 Antwort Letzte Antwort
                  0
                  • joergeliJ Offline
                    joergeliJ Offline
                    joergeli
                    schrieb am zuletzt editiert von
                    #129

                    Hallo Thomas,

                    für mich ist die V 2.5-pre nicht lauffähig, so lange sie nicht mit dem ioBroker MQTT-Adapter und dem Nicht-Standard-Port 1891 funktioniert.
                    Wenn Du vielleicht meine Beiträge im Rhasspy-Forum gelesen hast, funktionieren weder WakeWord (snowboyumdl) noch Wake-Up-Button, wenn ein externer, Nicht-Standard-MQTT-Port in Rhasspy aktiviert wird.
                    Mit der V 2.4.19 funktioniert das einwandfrei.

                    Übrigens: Kaldi installiert sich bloß mit dem englischen Profil.
                    Bei deutschem Profil kommt: Not compatible.

                    Von einer Migration Deinerseits würde ich momentan abraten.
                    Wenn, dann würde ich höchstens eine Parallel-Installation, oder noch besser, eine autarke Installation auf einem anderen Raspi probieren.

                    Wenn Du magst, kannst Du dann ja auch mal probieren, ob es bei Dir dann auch das Problem mit einem Nicht-Standard-MQTT-Port gibt, bzw. mit Port 1883 funktioniert.

                    Im Rhasspy-Forum nutzen wohl alle nur den Standard-Port 1883.
                    Wenn das Problem nicht gelöst wird, werde ich bei der V 2.4.19 bleiben.

                    Nebenbei: Bist Du mit Deinem Script weiter gekommen?

                    Gruß
                    Jörg

                    tobetobeT 1 Antwort Letzte Antwort
                    0
                    • joergeliJ joergeli

                      Hallo Thomas,

                      für mich ist die V 2.5-pre nicht lauffähig, so lange sie nicht mit dem ioBroker MQTT-Adapter und dem Nicht-Standard-Port 1891 funktioniert.
                      Wenn Du vielleicht meine Beiträge im Rhasspy-Forum gelesen hast, funktionieren weder WakeWord (snowboyumdl) noch Wake-Up-Button, wenn ein externer, Nicht-Standard-MQTT-Port in Rhasspy aktiviert wird.
                      Mit der V 2.4.19 funktioniert das einwandfrei.

                      Übrigens: Kaldi installiert sich bloß mit dem englischen Profil.
                      Bei deutschem Profil kommt: Not compatible.

                      Von einer Migration Deinerseits würde ich momentan abraten.
                      Wenn, dann würde ich höchstens eine Parallel-Installation, oder noch besser, eine autarke Installation auf einem anderen Raspi probieren.

                      Wenn Du magst, kannst Du dann ja auch mal probieren, ob es bei Dir dann auch das Problem mit einem Nicht-Standard-MQTT-Port gibt, bzw. mit Port 1883 funktioniert.

                      Im Rhasspy-Forum nutzen wohl alle nur den Standard-Port 1883.
                      Wenn das Problem nicht gelöst wird, werde ich bei der V 2.4.19 bleiben.

                      Nebenbei: Bist Du mit Deinem Script weiter gekommen?

                      Gruß
                      Jörg

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

                      @joergeli

                      Hallo Jörg,

                      das ist ja mal ne klare Ansage. Ich lasse mir etwas einfallen, wie ich die Migration hinbekommen kann. Ich habe ja eine Master/Satellite-Konfiguration. Den Master könnte ich auf einer virtuellen Linux-Maschine installieren und für den Satelliten habe ich noch einen alten PI3 und eine USB-Kamera mit Mikrofon. MGTT läuft bei mir als ioBroker Adapter. Der Port lässt sich dort einstellen. So könnte ich versuchen, dein Problem nachzustellen.

                      Ein absolutes Muss ist natürlich, dass Kaldi im deutschen Profil unterstützt wird. Aber auch das kann ich mal für dich testen. Ich entsinne mich, dass du die Fehlermeldung "Not compatible" in einer früheren Version auch bereits geschildert hattest. Vielleicht finde ich so also auch heraus, ob das ein individuelles Problem deiner Installation ist, oder ob es sich um einen generellen Mangel der 2.5 handelt.

                      Hört sich so an, wie wenn auch die nächste Woche nicht langweilig würde...

                      @joergeli said in Rhasspy Offline Sprachsteuerung:

                      Nebenbei: Bist Du mit Deinem Script weiter gekommen?

                      Nein, das habe ich zunächst mal an die Seite geschoben. Mein aktueller Workaround ist ein zweites Skript, in dem nur die Abfragen für Datum und Zeit gehandelt werden. Hier muss ich dann bis eine Lösunge gefunden ist, auf die Ansage Ja/OK verzichten. Hauptsache, das Ergebnis selbst wird angesagt. In meinem Hauptskript alle anderen Intents mit Ansage Ja/OK.

                      Für diesen Weg habe ich mich entschieden, weil ich die Zeit lieber in das design eines Gehäuses stecken wollte. Mit meine ersten Schritten mit FreeCAD bin ich soweit ganz zufrieden. Nun stoße ich jedoch auf einige Hindernisse, von denen ich noch nicht weiß, ob sie zwischen meinen Ohren oder in der Software liegen. Version 0.17 ist ja auch noch keine richtige Release. Die fangen ja üblicherweise erst mit 1.x an. Und einiges scheint mir durchaus noch buggy zu sein.

                      Gruß
                      Thomas

                      Beste Grüße
                      tobetobe

                      joergeliJ 2 Antworten Letzte Antwort
                      0
                      • tobetobeT tobetobe

                        @joergeli

                        Hallo Jörg,

                        das ist ja mal ne klare Ansage. Ich lasse mir etwas einfallen, wie ich die Migration hinbekommen kann. Ich habe ja eine Master/Satellite-Konfiguration. Den Master könnte ich auf einer virtuellen Linux-Maschine installieren und für den Satelliten habe ich noch einen alten PI3 und eine USB-Kamera mit Mikrofon. MGTT läuft bei mir als ioBroker Adapter. Der Port lässt sich dort einstellen. So könnte ich versuchen, dein Problem nachzustellen.

                        Ein absolutes Muss ist natürlich, dass Kaldi im deutschen Profil unterstützt wird. Aber auch das kann ich mal für dich testen. Ich entsinne mich, dass du die Fehlermeldung "Not compatible" in einer früheren Version auch bereits geschildert hattest. Vielleicht finde ich so also auch heraus, ob das ein individuelles Problem deiner Installation ist, oder ob es sich um einen generellen Mangel der 2.5 handelt.

                        Hört sich so an, wie wenn auch die nächste Woche nicht langweilig würde...

                        @joergeli said in Rhasspy Offline Sprachsteuerung:

                        Nebenbei: Bist Du mit Deinem Script weiter gekommen?

                        Nein, das habe ich zunächst mal an die Seite geschoben. Mein aktueller Workaround ist ein zweites Skript, in dem nur die Abfragen für Datum und Zeit gehandelt werden. Hier muss ich dann bis eine Lösunge gefunden ist, auf die Ansage Ja/OK verzichten. Hauptsache, das Ergebnis selbst wird angesagt. In meinem Hauptskript alle anderen Intents mit Ansage Ja/OK.

                        Für diesen Weg habe ich mich entschieden, weil ich die Zeit lieber in das design eines Gehäuses stecken wollte. Mit meine ersten Schritten mit FreeCAD bin ich soweit ganz zufrieden. Nun stoße ich jedoch auf einige Hindernisse, von denen ich noch nicht weiß, ob sie zwischen meinen Ohren oder in der Software liegen. Version 0.17 ist ja auch noch keine richtige Release. Die fangen ja üblicherweise erst mit 1.x an. Und einiges scheint mir durchaus noch buggy zu sein.

                        Gruß
                        Thomas

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

                        @tobetobe
                        Hallo Thomas,
                        nur das wir uns nicht falsch verstehen:
                        Im ioBroker-Log sehe ich schon, das Rhasspy V 2.5-pre sich auf Topics im MQTT-Broker subscribed, nur reagiert Rhasspy danach weder auf WakeWord, noch auf Wake-Up-Button - mit anderen Worten: Er hört einfach nicht mehr.

                        Stelle ich auf den internen MQTT-Port zurück, funktioniert wieder alles, aber natürlich kommen dann keine Intents mehr in ioBroker an.

                        Kaldi:
                        Ja, Du hast Recht, ich hatte auch in der alten Rhasspy-Version Probleme mit Kaldi.
                        Dort habe ich Kaldi dann manuell installiert und irgendwie hingefummelt, daß es mit Rhasspy zusammenspielt.

                        Andererseits habe ich bei jeder meiner 2.5er Installationen zuerst den Docker-Container gestoppt/gelöscht (docker stop <container-id>, docker rm <container-id>) und danach auch noch das Image gelöscht (docker rmi <image-id>).
                        Also nicht nur docker pull xyz.
                        Somit sollte der Raspi bzgl. Rhasspy dann vor jeder Neuinstallation jungfräulich gewesen sein.
                        Bei erneuter Installation via Docker, konnte man dann auch sehen, daß er sich alle Dateien neu heruntergeladen hat.

                        Wie gesagt, mit englischem Profil installiert sich Kaldi "out of the box" und mit deutschem Profil würde ich es wahrscheinlich wieder "hingefummelt" bekommen.
                        Wenn sich Kaldi bei Dir auch nicht mit deutschem Profil installiert, weise doch bitte im Rhasspy-Forum darauf hin.
                        Ich möchte da z. Zt. nicht noch eine Baustelle aufmachen ( gerade gesehen: Du hast dort ja schon nachgefragt )

                        Übrigens: Das Kopieren der sentences.ini, bzw. custom_words.txt aus dem alten Profil in das neue Profil funktioniert.
                        Es wird u.U. angemeckert, das die Pronounciation (Aussprache) einiger Worte nicht erkannt wird, daß kann man aber per Button-Klick bestätigen und sich evtl. später um nicht korrekte Aussprachen kümmern.

                        Allgemein:
                        Ich sehe momentan - bis auf die geänderte WEB-GUI - keine großen Unterschiede der 2.5-pre gegenüber der V 2.4.19, kann aber nicht beurteilen, was sich alles "unter der Haube" geändert/verbessert hat.

                        @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                        Nein, das habe ich zunächst mal an die Seite geschoben. Mein aktueller Workaround ist ein zweites Skript, in dem nur die Abfragen für Datum und Zeit gehandelt werden. Hier muss ich dann bis eine Lösunge gefunden ist, auf die Ansage Ja/OK verzichten. Hauptsache, das Ergebnis selbst wird angesagt. In meinem Hauptskript alle anderen Intents mit Ansage Ja/OK.

                        Hmmm, das liest sich für mich so, als ob nur Datum/Zeit Probleme machen, sprich: wenn innerhalb des Scriptes weitere JS-Subroutinen abgearbeitet werden.
                        Bei Deinen anderen Intents greifst Du ja direkt auf die Rückmeldungen von Rhasspy zu, ohne erst manuelle JS-Ansagen zu generieren?

                        Nebenbei: Ich lasse bei mir anstatt "OK" --> "Moment bitte" sagen, da es ja einen Moment dauert, bis Rhasspy antwortet.
                        Somit weiß der geneigte "Fragesteller", daß Rhasspy noch beschäftigt ist.

                        FreeCad:
                        @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                        Version 0.17 ist ja auch noch keine richtige Release

                        Nun ja, FreeCAD ist aber doch schon recht lange "auf dem Markt".
                        Ich habe bei mir die FreeCad V 0.18.
                        Dort konstruiere ich am Liebsten in der Part-Engine.
                        Ich ziehe mir dort Quader, Zylinder, etc. in die Arbeitsfläche und bemaße diese dann.
                        Wenn ich z.B. einen L-Winkel haben möchte, nehme ich 2 Quader, bemaße sie und drehe dann einen der Quader um 90 ° .
                        Dann einen Quader in den anderen schieben, anschl. beide Quader markieren und verschmelzen (vereinige mehrere Formen).
                        Der umgekehrte Weg, wie z.B. ein rundes Loch in einen Quader "bohren" funktioniert genauso:
                        Quader und Zylinder auf die Arbeitsfläche ziehen, bemaßen, dann ggf. den Zylinder drehen/kippen und in den Quader schieben, dann beide Formen (Zylinder und Quader) markieren und Zylinder vom Quader subtrahieren (schneidet zwei Formen).
                        So kann ich mir dann nach "Origami-Art" beliebige Körper zusammensetzen.
                        Für mich geht das einfacher/schneller, als mit der Sketcher-Eingine.

                        1 Antwort Letzte Antwort
                        0
                        • System 9S Offline
                          System 9S Offline
                          System 9
                          schrieb am zuletzt editiert von
                          #132

                          Hallo,
                          mal eine frage zwischen durch, ich bin selber auf der suche nach einer offline sprachsteuerung.
                          iobroker läuft bei mir auf einem Ubuntu System.
                          Mein ziel wäre es 10 Räume mit mic und lautsprecher auszustatten (vieleicht über 10 usb Soundkarten).
                          Wäre das mit Rhasspy realisierbar, kann man hier mehrere räume einrichten ?

                          joergeliJ tobetobeT 2 Antworten Letzte Antwort
                          0
                          • System 9S System 9

                            Hallo,
                            mal eine frage zwischen durch, ich bin selber auf der suche nach einer offline sprachsteuerung.
                            iobroker läuft bei mir auf einem Ubuntu System.
                            Mein ziel wäre es 10 Räume mit mic und lautsprecher auszustatten (vieleicht über 10 usb Soundkarten).
                            Wäre das mit Rhasspy realisierbar, kann man hier mehrere räume einrichten ?

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

                            @System-9
                            Hi,
                            da kennt sich bestimmt Thomas besser aus.
                            Soweit ich das beurteilen kann, sollte es mit einem Master Rhasspy und 9 Satelliten ( evtl. reichen da Raspi Zero aus) funktionieren.
                            Wobei dann jeder Satellit ein Micro und Lautsprecher haben muss.
                            Sprachausgabe könnte über USB-Soundkarte funktionieren.
                            Wie gesagt, warte mal ab, ob Thomas da mehr zu sagen kann, oder google mal nach "Rhasspy Community" und schau im dortigen Forum, ob Du da fündig wirst.

                            1 Antwort Letzte Antwort
                            0
                            • System 9S System 9

                              Hallo,
                              mal eine frage zwischen durch, ich bin selber auf der suche nach einer offline sprachsteuerung.
                              iobroker läuft bei mir auf einem Ubuntu System.
                              Mein ziel wäre es 10 Räume mit mic und lautsprecher auszustatten (vieleicht über 10 usb Soundkarten).
                              Wäre das mit Rhasspy realisierbar, kann man hier mehrere räume einrichten ?

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

                              @System-9
                              Hallo,
                              seit wenigen Tagen gibt es ja nun eine neue Pre-Release 2.5. Ich habe sie selbst noch nicht installiert, aber mich mit den verfübaren Beschreibungen bereits intensiv auseinandergesetzt. Grundsätzlich ist Rhasspy ja heute bereits fähig, über einen zentralen Master mehrere periphere Satelliten zu versorgen. Mit Version 2.5 wird diese Fähigkeit nochmals weiter ausgebaut, und wie ich es bisher sehen konnte, auch optimiert. Insofern würde ich deine Frage mit einem klaren JA beantworten.

                              Du sprichst von einem Ubuntu System für deinen ioBroker. Ubuntu ist absolut OK. Die wesentliche Frage ist natürlich, ob deine Hardware, auf der Ubuntu läuft, leistungsfähig genug ist, ioBroker und Rhasspy Master für bis zu 10 Satelliten zu unterstützen.

                              Ich selbst mache das auch so: Odroid H2 mit 16 GB RAM als gemeinsamer Server für ioBroker und Rhasspy Master. Das läuft tadellos und ich habe auch noch reichlich Reserven. Wenn du allerdings Ubuntu auf einem Raspi 3 oder 4 laufen hast, würde ich dir eher davon abraten, beide Systeme (ioBroker und Rhasspy) auf dieses eine Stück Hardware zu packen. Führe dir immer vor Augen, dass ioBroker stabil laufen muss, und nicht durch ein nettes Gimmick gefährdet werden sollte.

                              Dies noch als zusätzliche Hinweise. Aber wie gesagt: Ja, ich halte Rhasspy für dein Vorhaben für eine sehr gut geeignete Plattform.

                              Bevor du anfängst Hardware zu kaufen: Überlege dir genau, was die Satelliten in Punkto Spracheingabe und Audio-Ausgabe leisten sollen. Auch dazu können wir dir hier glaube ich schon ganz gut Hilfestellung geben.

                              Bei Fragen: Fragen!

                              Gruß
                              Thomas

                              Beste Grüße
                              tobetobe

                              System 9S 1 Antwort Letzte Antwort
                              0
                              • tobetobeT tobetobe

                                @joergeli

                                Hallo Jörg,

                                das ist ja mal ne klare Ansage. Ich lasse mir etwas einfallen, wie ich die Migration hinbekommen kann. Ich habe ja eine Master/Satellite-Konfiguration. Den Master könnte ich auf einer virtuellen Linux-Maschine installieren und für den Satelliten habe ich noch einen alten PI3 und eine USB-Kamera mit Mikrofon. MGTT läuft bei mir als ioBroker Adapter. Der Port lässt sich dort einstellen. So könnte ich versuchen, dein Problem nachzustellen.

                                Ein absolutes Muss ist natürlich, dass Kaldi im deutschen Profil unterstützt wird. Aber auch das kann ich mal für dich testen. Ich entsinne mich, dass du die Fehlermeldung "Not compatible" in einer früheren Version auch bereits geschildert hattest. Vielleicht finde ich so also auch heraus, ob das ein individuelles Problem deiner Installation ist, oder ob es sich um einen generellen Mangel der 2.5 handelt.

                                Hört sich so an, wie wenn auch die nächste Woche nicht langweilig würde...

                                @joergeli said in Rhasspy Offline Sprachsteuerung:

                                Nebenbei: Bist Du mit Deinem Script weiter gekommen?

                                Nein, das habe ich zunächst mal an die Seite geschoben. Mein aktueller Workaround ist ein zweites Skript, in dem nur die Abfragen für Datum und Zeit gehandelt werden. Hier muss ich dann bis eine Lösunge gefunden ist, auf die Ansage Ja/OK verzichten. Hauptsache, das Ergebnis selbst wird angesagt. In meinem Hauptskript alle anderen Intents mit Ansage Ja/OK.

                                Für diesen Weg habe ich mich entschieden, weil ich die Zeit lieber in das design eines Gehäuses stecken wollte. Mit meine ersten Schritten mit FreeCAD bin ich soweit ganz zufrieden. Nun stoße ich jedoch auf einige Hindernisse, von denen ich noch nicht weiß, ob sie zwischen meinen Ohren oder in der Software liegen. Version 0.17 ist ja auch noch keine richtige Release. Die fangen ja üblicherweise erst mit 1.x an. Und einiges scheint mir durchaus noch buggy zu sein.

                                Gruß
                                Thomas

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

                                @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                Der Port lässt sich dort einstellen. So könnte ich versuchen, dein Problem nachzustellen.

                                Ich bin anscheinend nicht allein mit dem MQTT-Problem:
                                Rhasspy-Voltron/issues

                                Nachtrag 24.03.2020:
                                @synesthesiam hat es jetzt als BUG deklariert.

                                tobetobeT 1 Antwort Letzte Antwort
                                0
                                • joergeliJ joergeli

                                  @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                  Der Port lässt sich dort einstellen. So könnte ich versuchen, dein Problem nachzustellen.

                                  Ich bin anscheinend nicht allein mit dem MQTT-Problem:
                                  Rhasspy-Voltron/issues

                                  Nachtrag 24.03.2020:
                                  @synesthesiam hat es jetzt als BUG deklariert.

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

                                  @joergeli
                                  Hallo Jörg,
                                  ja ich habe das Thema auch verfolgt. Auch darin, dass Synthesiam auf deinen Post noch nicht geantwortet hat, sehe ich eine Bestätigung, dass hier tatsächlich noch ein Fehlverhalten vorliegt.

                                  Noch befinde ich mich ja im theoretischen Bereich zur 2.5. Ich habe mir diese Anleitung

                                  https://rhasspy.github.io/rhasspy-voltron/tutorials.html#getting-started-guide
                                  

                                  bereits mehrfach angeschaut. Ohne parallel zu testen, ist zwar vieles verständlich, aber nicht nachvollziehbar. Und so frage ich mich, ob die Hinweise zu einem externen MQTT-Broker nicht eine Bedeutung auch für das von dir geschilderte Problem haben könnten. Morgen muss ich mich um einige berufliche Angelegenheiten kümmern (und meine Frau wurde ebenfalls verdonnert, im Home Office zu arbeiten). Von daher wird es wahrscheinlich nicht so schnell gehen, bis ich zum Testen der 2.5 komme. Steht für mich aber jetzt auf Prio 1.

                                  Gruß und Gute Nacht
                                  Thomas

                                  Beste Grüße
                                  tobetobe

                                  joergeliJ 2 Antworten Letzte Antwort
                                  0
                                  • tobetobeT tobetobe

                                    @joergeli
                                    Hallo Jörg,
                                    ja ich habe das Thema auch verfolgt. Auch darin, dass Synthesiam auf deinen Post noch nicht geantwortet hat, sehe ich eine Bestätigung, dass hier tatsächlich noch ein Fehlverhalten vorliegt.

                                    Noch befinde ich mich ja im theoretischen Bereich zur 2.5. Ich habe mir diese Anleitung

                                    https://rhasspy.github.io/rhasspy-voltron/tutorials.html#getting-started-guide
                                    

                                    bereits mehrfach angeschaut. Ohne parallel zu testen, ist zwar vieles verständlich, aber nicht nachvollziehbar. Und so frage ich mich, ob die Hinweise zu einem externen MQTT-Broker nicht eine Bedeutung auch für das von dir geschilderte Problem haben könnten. Morgen muss ich mich um einige berufliche Angelegenheiten kümmern (und meine Frau wurde ebenfalls verdonnert, im Home Office zu arbeiten). Von daher wird es wahrscheinlich nicht so schnell gehen, bis ich zum Testen der 2.5 komme. Steht für mich aber jetzt auf Prio 1.

                                    Gruß und Gute Nacht
                                    Thomas

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

                                    @tobetobe
                                    Hallo Thomas,
                                    nur kein Stress :blush:
                                    Ich habe nur langsam an mir selbst gezweifelt, da im Forum immer nur unisono zu lesen war, daß es bei anderen (mit dem externen MQTT-broker funktioniert (allerdings immer mit dem Standard-Port 1883).

                                    Mach Deine Tests aber bitte nicht nur wegen mir, nicht daß Deine bisherige Installation über den Jordan geht!

                                    Kaldi:
                                    Das ist auch wieder so eine Sache:
                                    Im Forum heißt es, Kaldi funktioniert unter V2.5-pre mit deutschem Profil.

                                    Kann ich aber nur eingeschränkt bestätigen:
                                    Ich habe gerade eben die V 2.5 nochmals kpl. mit englischem Profil installiert --> Kaldi auswählbar.
                                    Anschließend habe ich den "englischen Container" gestoppt und das deutsche Profil installiert.
                                    Jetzt ist Kaldi auch im deutschen Profil aktivierbar und die entspr. Kaldi-Dateien werden heruntergeladen.

                                    Zu diesem Umstand, also erst englisches Profil installieren, anschl. deutsches Profil, meine ich im Forum auch schon bei V2.4.18/V2.4.19 gelesen zu haben.

                                    Ich bin nur froh, daß ich einen zweiten Raspi zum Testen habe.
                                    Den ersten mit der V2.4.19 fasse ich nach Möglichkeit gar nicht mehr an, bzw. nur mit Samthandschuhen, damit ich ihn mir nicht zerschieße.

                                    Gruß und bis demnächst
                                    Jörg

                                    1 Antwort Letzte Antwort
                                    0
                                    • tobetobeT tobetobe

                                      @System-9
                                      Hallo,
                                      seit wenigen Tagen gibt es ja nun eine neue Pre-Release 2.5. Ich habe sie selbst noch nicht installiert, aber mich mit den verfübaren Beschreibungen bereits intensiv auseinandergesetzt. Grundsätzlich ist Rhasspy ja heute bereits fähig, über einen zentralen Master mehrere periphere Satelliten zu versorgen. Mit Version 2.5 wird diese Fähigkeit nochmals weiter ausgebaut, und wie ich es bisher sehen konnte, auch optimiert. Insofern würde ich deine Frage mit einem klaren JA beantworten.

                                      Du sprichst von einem Ubuntu System für deinen ioBroker. Ubuntu ist absolut OK. Die wesentliche Frage ist natürlich, ob deine Hardware, auf der Ubuntu läuft, leistungsfähig genug ist, ioBroker und Rhasspy Master für bis zu 10 Satelliten zu unterstützen.

                                      Ich selbst mache das auch so: Odroid H2 mit 16 GB RAM als gemeinsamer Server für ioBroker und Rhasspy Master. Das läuft tadellos und ich habe auch noch reichlich Reserven. Wenn du allerdings Ubuntu auf einem Raspi 3 oder 4 laufen hast, würde ich dir eher davon abraten, beide Systeme (ioBroker und Rhasspy) auf dieses eine Stück Hardware zu packen. Führe dir immer vor Augen, dass ioBroker stabil laufen muss, und nicht durch ein nettes Gimmick gefährdet werden sollte.

                                      Dies noch als zusätzliche Hinweise. Aber wie gesagt: Ja, ich halte Rhasspy für dein Vorhaben für eine sehr gut geeignete Plattform.

                                      Bevor du anfängst Hardware zu kaufen: Überlege dir genau, was die Satelliten in Punkto Spracheingabe und Audio-Ausgabe leisten sollen. Auch dazu können wir dir hier glaube ich schon ganz gut Hilfestellung geben.

                                      Bei Fragen: Fragen!

                                      Gruß
                                      Thomas

                                      System 9S Offline
                                      System 9S Offline
                                      System 9
                                      schrieb am zuletzt editiert von
                                      #138

                                      @tobetobe
                                      Vielen Dank für die Antwort.
                                      Um den master mache ich mir keine sorgen, läuft auf virtuell auf einem Server (24core 100gb Ram).
                                      was würdest du als Hardware für die Satelliten empfehlen. Ich habe hier schon an Richtmikrofone gedacht, da die dinger in der Decke verschwinden sollen, mein Problem bis jetzt war, das ich auch deckenlautsprecher benötige und diese dann einen kleinen Verstärker.
                                      Und als Herausforderung, solllen die lautsprecher natürlich dann über iobroker noch spotify abspielen können :dizzy_face:

                                      tobetobeT 1 Antwort Letzte Antwort
                                      0
                                      • System 9S System 9

                                        @tobetobe
                                        Vielen Dank für die Antwort.
                                        Um den master mache ich mir keine sorgen, läuft auf virtuell auf einem Server (24core 100gb Ram).
                                        was würdest du als Hardware für die Satelliten empfehlen. Ich habe hier schon an Richtmikrofone gedacht, da die dinger in der Decke verschwinden sollen, mein Problem bis jetzt war, das ich auch deckenlautsprecher benötige und diese dann einen kleinen Verstärker.
                                        Und als Herausforderung, solllen die lautsprecher natürlich dann über iobroker noch spotify abspielen können :dizzy_face:

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

                                        @System-9
                                        Guten Morgen

                                        @System-9 said in Rhasspy Offline Sprachsteuerung:

                                        Um den master mache ich mir keine sorgen, läuft auf virtuell auf einem Server (24core 100gb Ram).

                                        Das ist zwar etwas knapp, dürfte aber notfalls gehen:grin:

                                        Nun aber im Ernst. Ich greife mal einige Stichworte von dir auf.

                                        1. Richtmikrofone. Da muss ich dich natürlich erst einmal fragen, was du darunter verstehst. Echte Richtmikrofone weisen üblicherweise einen sehr schmalen Empfangswinkel auf. Außerhalb dieses Winkels sinkt die Empfindlichkeit rapide ab. Das ist im Zusammenhang mit Spracherkennung eigentlich genau das, was man nicht will.

                                        Im Allgemeinen - und da sind die Profis wie Alexa etc sicher die besten Beispiele, haben sich nicht Richtmikrofone, sondern Mikrofon-Arrays durchgesetzt, die dank spezieller Eigenschaften "rundum" empfangen, aber dennoch für größere Distanzen (mehrere Meter) geeignet sind.

                                        Die am meisten verwendeten Arrays stammen von ReSpeaker oder von Matrix.

                                        1. Unterbringung in der Decke: Dies spricht für eine geringe Baugröße, steht aber zugleich im Widerspruch zu deinem Wunsch, Musik über Lautsprecher abspielen zu wollen. Beides gleichzeitig geht nicht ohne entsprechenden Raum zu spendieren, und zwar für Mikrofon, Prozessor, HiFi-Verstärker, Lautsprecher (ggf mehrere?, dann mit Frequenzweiche), Stromversorgung

                                        Ich hoffe, du bist dir darüber im Klaren. Bzw. hier musst du dich entscheiden.

                                        a) wenn es wirklich ganz klein ausfallen soll, dann ohne großen Audio-Teil. Hierfür gibt es zwei Möglichkeiten: Entweder die "einfachen" Mikrofon Arrays mit einem externen Prozessor. Hier reicht wohl schon ein Pi Zero (habe ich selbst noch nicht getestet) oder ein Pi3/4 mit 1 bis 2 GByte RAM. Oder man nimmt die Core Varianten der Mikrofone, die bereits einen Linux-Kern beinhalten und ohne weiteren Prozessor auskommen. Beide Mikrofon Varianten (mit und ohne Core) gibt es von beiden Herstellern.
                                        b) wenn es der maximale Funktionsumfang sein soll: Dann das volle Programm wie unter 2 beschrieben, als Prozessor Pi4 mit 2 bis 4GByte RAM

                                        Maßgeblich müsste deine Vorstellung zu den Lautsprechern und zur "Power" den Platzbedarf bestimmen. Mikrofon und Prozessor sind im Verhältnis nur Kleinkram. Persönlich könnte ich mir auch zu b) durchaus vorstellen, das alles in einem Deckenraum unterzubringen. Eines solltest du dann aber noch wissen: Selbstverständlich gibt es für dein Vorhaben kein Standardgehäuse. Da müsstest du dir auch selbst etwas bauen...

                                        Und eines solltest du dir auch noch überlegen: Wenn du volle Möhre Musik hörst, die aus Lautsprechern kommt, die sich unmittelbar neben dem Mikrofon befinden, wie willst du dann noch einen neuen Sprachbefehl fehlerfrei erkennen lassen?

                                        Was ich damit sagen will: Erst drüber nachdenken, was du wirklich willst, und dann die Ärmel hochkrempeln, ist besser, als einfach loslegen, Geld ausgeben und dann frustriert aufgeben, weil die eigene Vorstellung die Möglichkeiten überschreitet.

                                        Soweit in Kürze.

                                        Gruß
                                        Thomas

                                        Beste Grüße
                                        tobetobe

                                        System 9S 1 Antwort Letzte Antwort
                                        0
                                        • tobetobeT tobetobe

                                          @System-9
                                          Guten Morgen

                                          @System-9 said in Rhasspy Offline Sprachsteuerung:

                                          Um den master mache ich mir keine sorgen, läuft auf virtuell auf einem Server (24core 100gb Ram).

                                          Das ist zwar etwas knapp, dürfte aber notfalls gehen:grin:

                                          Nun aber im Ernst. Ich greife mal einige Stichworte von dir auf.

                                          1. Richtmikrofone. Da muss ich dich natürlich erst einmal fragen, was du darunter verstehst. Echte Richtmikrofone weisen üblicherweise einen sehr schmalen Empfangswinkel auf. Außerhalb dieses Winkels sinkt die Empfindlichkeit rapide ab. Das ist im Zusammenhang mit Spracherkennung eigentlich genau das, was man nicht will.

                                          Im Allgemeinen - und da sind die Profis wie Alexa etc sicher die besten Beispiele, haben sich nicht Richtmikrofone, sondern Mikrofon-Arrays durchgesetzt, die dank spezieller Eigenschaften "rundum" empfangen, aber dennoch für größere Distanzen (mehrere Meter) geeignet sind.

                                          Die am meisten verwendeten Arrays stammen von ReSpeaker oder von Matrix.

                                          1. Unterbringung in der Decke: Dies spricht für eine geringe Baugröße, steht aber zugleich im Widerspruch zu deinem Wunsch, Musik über Lautsprecher abspielen zu wollen. Beides gleichzeitig geht nicht ohne entsprechenden Raum zu spendieren, und zwar für Mikrofon, Prozessor, HiFi-Verstärker, Lautsprecher (ggf mehrere?, dann mit Frequenzweiche), Stromversorgung

                                          Ich hoffe, du bist dir darüber im Klaren. Bzw. hier musst du dich entscheiden.

                                          a) wenn es wirklich ganz klein ausfallen soll, dann ohne großen Audio-Teil. Hierfür gibt es zwei Möglichkeiten: Entweder die "einfachen" Mikrofon Arrays mit einem externen Prozessor. Hier reicht wohl schon ein Pi Zero (habe ich selbst noch nicht getestet) oder ein Pi3/4 mit 1 bis 2 GByte RAM. Oder man nimmt die Core Varianten der Mikrofone, die bereits einen Linux-Kern beinhalten und ohne weiteren Prozessor auskommen. Beide Mikrofon Varianten (mit und ohne Core) gibt es von beiden Herstellern.
                                          b) wenn es der maximale Funktionsumfang sein soll: Dann das volle Programm wie unter 2 beschrieben, als Prozessor Pi4 mit 2 bis 4GByte RAM

                                          Maßgeblich müsste deine Vorstellung zu den Lautsprechern und zur "Power" den Platzbedarf bestimmen. Mikrofon und Prozessor sind im Verhältnis nur Kleinkram. Persönlich könnte ich mir auch zu b) durchaus vorstellen, das alles in einem Deckenraum unterzubringen. Eines solltest du dann aber noch wissen: Selbstverständlich gibt es für dein Vorhaben kein Standardgehäuse. Da müsstest du dir auch selbst etwas bauen...

                                          Und eines solltest du dir auch noch überlegen: Wenn du volle Möhre Musik hörst, die aus Lautsprechern kommt, die sich unmittelbar neben dem Mikrofon befinden, wie willst du dann noch einen neuen Sprachbefehl fehlerfrei erkennen lassen?

                                          Was ich damit sagen will: Erst drüber nachdenken, was du wirklich willst, und dann die Ärmel hochkrempeln, ist besser, als einfach loslegen, Geld ausgeben und dann frustriert aufgeben, weil die eigene Vorstellung die Möglichkeiten überschreitet.

                                          Soweit in Kürze.

                                          Gruß
                                          Thomas

                                          System 9S Offline
                                          System 9S Offline
                                          System 9
                                          schrieb am zuletzt editiert von
                                          #140

                                          @tobetobe
                                          Zum Thema Platz, da gibt es jetzt auch noch keine Probleme, da dies gerade im bau ist, und die ganze Decke abgehangen ist (10cm) und noch offen ist, hier ist nur die Frage welche kabel da rein kommen, aber so wie ich das sehe werde ich auf die Variante mit dem Mikrofon-Array gehen. ->

                                          Richtmikrofon hab ich mir erst bestellt, konnte ich selber noch nicht testen (bin selber am tüfftelt was am besten ist), aber wenn das so ist, mit dem empfangswinkel, hat sich das schon erledigt.

                                          Aus den Deckenlautsprechern (gerne in einer anderen Ecke des Raumes) soll nur "normal" musik laufen, für alles andere gibt es die HiFi Anlage.

                                          Das mit Musik und Sprachbefehl -> hier werd ich wohl in den Saurenapfel beißen müssen, wenn Musik gespielt wird, die Sprachbefehle nicht funktionieren -> Möglichkeit über ein Taster/Panel die Musik zu deaktivieren.

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


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          575

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

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

                                          • Du hast noch kein Konto? Registrieren

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