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

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Off Topic
  4. Rhasspy Offline Sprachsteuerung

NEWS

  • Wartung am 15.11. – Forum ab 22:00 Uhr nicht erreichbar
    BluefoxB
    Bluefox
    11
    2
    224

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

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

Rhasspy Offline Sprachsteuerung

Rhasspy Offline Sprachsteuerung

Scheduled Pinned Locked Moved Off Topic
403 Posts 30 Posters 99.2k Views 47 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • capitaenzC capitaenz

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

    Ich fasse einmal zusammen was ich gemacht habe:

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

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

    Danke und VG
    Leif

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

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

    siehe HermesLedControl
    und hier: Installation & update

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

    Gruß
    Jörg

    1 Reply Last reply
    0
    • joergeliJ joergeli

      Hallo Thomas,
      @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

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

      Versuche es mal so:

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

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

      Gruß
      Jörg

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

      @joergeli said in Rhasspy Offline Sprachsteuerung:

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

      Hallo Jörg,

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

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

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

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

      Beste Grüße
      tobetobe

      joergeliJ 1 Reply Last reply
      0
      • capitaenzC capitaenz

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

        Ich fasse einmal zusammen was ich gemacht habe:

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

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

        Danke und VG
        Leif

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

        @capitaenz

        Gut soweit! Bei Fragen meldest du dich.

        Beste Grüße
        tobetobe

        1 Reply Last reply
        0
        • tobetobeT tobetobe

          @joergeli said in Rhasspy Offline Sprachsteuerung:

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

          Hallo Jörg,

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

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

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

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

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

          Hallo Thomas,

          @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

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

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

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

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

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

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

          Gruß
          Jörg

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

            @tobetobe
            Dank euch aus dem Forum hab ich die Installation jetzt soweit am laufen, aber noch nicht funktionsfähig.
            Ich habe noch einmal meine Schritte dokumentiert:

            • Image Flashen mit Win32 DiskImager (Raspian Buster lite)

            • ssh und wpa_supplicant.conf auf SD-Karte anlegen

            • sudo apt update

            • sudo apt full-upgrade

            • sudo curl -sSL https://get.docker.com | sh

            • sudo usermod -aG docker pi

            • sudo reboot -n

            • sudo docker pull rhasspy/rhasspy:2.5.0-pre

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

            • sudo wget https://gist.githubusercontent.com/Psychokiller1888/a9826f92c5a3c5d03f34d182fda1ce4c/raw/cbb53252dd55dc4e9f5f6064a493f0981cf133fb/hlc_download.sh

            • sudo chmod +x hlc_download.sh

            • sudo ./hlc_download.sh

            Abfragen:

            • What assistant engine are you using?
              2 (rhasspy)

            • What's the path to your assistant config file?
              /home/pi/.config/rhasspy/profiles/de/profile.json

            • What device do you wish to control with SLC?
              1 (respeaker2)

            • What pattern do you want to use?
              5 (kiboost)

            • Do you need to install / configure your respeaker2?
              1 (yes)

            • sudo raspi-config (SPI Aktivieren)
              ->5->P4->EXIT

            • sudo reboot -n

            • 192.168.0.93:12101 -> Webinterface aufrufen

            • Use PyAudio (default)
              Audio Recording -> 2: seees-2mic-vicecard: bcm2825-i2cs...

            • Save + Restart Rhasspy

            • Audio Playing
              Use aplay directly (ALSA)
              Output Device (default:CARD=ALSA: Default Audio Device)

            Jetzt muss noch MQTT aktiviert werden und ein WakeWord ausgewählt werden, allerdings scheint der Speaker und der Leuchtring noch nicht zu funktionieren, was wohl daran liegt, dass ich im Webinterface von Rhasspy den Output Device nicht abspeichern kann. Nach dem Neustart steht dieser wieder auf default.

            default.JPG

            Kann mir bitte noch jemand den entscheidenden Hinweis geben?

            Danke und VG
            Leif

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

            joergeliJ tobetobeT 3 Replies Last reply
            0
            • capitaenzC capitaenz

              @tobetobe
              Dank euch aus dem Forum hab ich die Installation jetzt soweit am laufen, aber noch nicht funktionsfähig.
              Ich habe noch einmal meine Schritte dokumentiert:

              • Image Flashen mit Win32 DiskImager (Raspian Buster lite)

              • ssh und wpa_supplicant.conf auf SD-Karte anlegen

              • sudo apt update

              • sudo apt full-upgrade

              • sudo curl -sSL https://get.docker.com | sh

              • sudo usermod -aG docker pi

              • sudo reboot -n

              • sudo docker pull rhasspy/rhasspy:2.5.0-pre

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

              • sudo wget https://gist.githubusercontent.com/Psychokiller1888/a9826f92c5a3c5d03f34d182fda1ce4c/raw/cbb53252dd55dc4e9f5f6064a493f0981cf133fb/hlc_download.sh

              • sudo chmod +x hlc_download.sh

              • sudo ./hlc_download.sh

              Abfragen:

              • What assistant engine are you using?
                2 (rhasspy)

              • What's the path to your assistant config file?
                /home/pi/.config/rhasspy/profiles/de/profile.json

              • What device do you wish to control with SLC?
                1 (respeaker2)

              • What pattern do you want to use?
                5 (kiboost)

              • Do you need to install / configure your respeaker2?
                1 (yes)

              • sudo raspi-config (SPI Aktivieren)
                ->5->P4->EXIT

              • sudo reboot -n

              • 192.168.0.93:12101 -> Webinterface aufrufen

              • Use PyAudio (default)
                Audio Recording -> 2: seees-2mic-vicecard: bcm2825-i2cs...

              • Save + Restart Rhasspy

              • Audio Playing
                Use aplay directly (ALSA)
                Output Device (default:CARD=ALSA: Default Audio Device)

              Jetzt muss noch MQTT aktiviert werden und ein WakeWord ausgewählt werden, allerdings scheint der Speaker und der Leuchtring noch nicht zu funktionieren, was wohl daran liegt, dass ich im Webinterface von Rhasspy den Output Device nicht abspeichern kann. Nach dem Neustart steht dieser wieder auf default.

              default.JPG

              Kann mir bitte noch jemand den entscheidenden Hinweis geben?

              Danke und VG
              Leif

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

              Hallo Leif,

              das sieht m.E. soweit gut aus.

              @capitaenz sagte in Rhasspy Offline Sprachsteuerung:

              sudo docker pull rhasspy/rhasspy:2.5.0-pre

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

              Hier ist aber möglicherweise eine Diskrepanz.
              "latest" ist die aktuelle stabile Version von Rhasspy ( IMHO V.2.4.19)
              "rhasspy:2.5.0-pre" ist ein Preview zur kommenden Rhasspy V.2.5 (auch "Voltron" genannt), d.h. sie ist noch nicht als stable definiert. Dennoch läuft sie schon recht stabil und ist momentan die Version, die Thomas und ich verwenden.

              Deshalb:
              Stoppe mal Deinen docker-container:
              1.) docker ps --> docker container anzeigen und Container ID notieren.
              2.) docker stop <Container ID> --> docker container stoppen.
              3.) Neuen docker-container wie folgt anlegen/starten:
              docker run -d -p 12101:12101
              --restart unless-stopped
              -v "$HOME/.config/rhasspy/profiles:/profiles"
              --device /dev/snd:/dev/snd rhasspy/rhasspy:2.5.0-pre
              --user-profiles /profiles
              --profile de

              Soweit, so gut.
              Zuerst solltest Du dann mal überprüfen, ob Rhasspy überhaupt auf Dein WakeWord, bzw. Micro, reagiert.
              Dazu im Rhasspy-GUI unter WakeWord "snowboy" aktivieren, mit einer Sensitivity = 0.9, Apply Frontend nicht aktiviert.
              und unter MQTT "internal" aktivieren.
              Wenn Du einen Kopfhörer zur Hand hast, diesen mal in die 3,5mm Klinkenbuchse des Raspi einstöpseln.
              Wenn Du dann das WakeWord "snowboy" sagst, sollten im Kophörer dann "Beeps" zu hören sein, d.h. Micro und WakeWord-Erkennung funktionieren.
              Du kannst auch im Rhasspy-GUI das Log beobachten, ob sich dort beim Sprechen des WakeWords was tut.

              Wenn das soweit funktioniert, können wir uns um weitere Probleme kümmern ( nebenbei: aplay steht bei mir auch auf default )

              Gruß
              Jörg

              P.S.
              Du hast nachträglich Deinen Post editiert: und der Leuchtring
              Heißt das, das der LED-Ring funktioniert?
              Du hast als LED-Pattern "kiboost" gewählt, allerdings scheint der 'ne Macke zu haben.
              Ich verwende als Pattern "projectalice"
              Du kannst die Konfiguration ändern, wie ich in meinem Post joergeli vom 9. Mai 2020, 20:15 beschrieben habe.

              1 Reply Last reply
              0
              • capitaenzC capitaenz

                @tobetobe
                Dank euch aus dem Forum hab ich die Installation jetzt soweit am laufen, aber noch nicht funktionsfähig.
                Ich habe noch einmal meine Schritte dokumentiert:

                • Image Flashen mit Win32 DiskImager (Raspian Buster lite)

                • ssh und wpa_supplicant.conf auf SD-Karte anlegen

                • sudo apt update

                • sudo apt full-upgrade

                • sudo curl -sSL https://get.docker.com | sh

                • sudo usermod -aG docker pi

                • sudo reboot -n

                • sudo docker pull rhasspy/rhasspy:2.5.0-pre

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

                • sudo wget https://gist.githubusercontent.com/Psychokiller1888/a9826f92c5a3c5d03f34d182fda1ce4c/raw/cbb53252dd55dc4e9f5f6064a493f0981cf133fb/hlc_download.sh

                • sudo chmod +x hlc_download.sh

                • sudo ./hlc_download.sh

                Abfragen:

                • What assistant engine are you using?
                  2 (rhasspy)

                • What's the path to your assistant config file?
                  /home/pi/.config/rhasspy/profiles/de/profile.json

                • What device do you wish to control with SLC?
                  1 (respeaker2)

                • What pattern do you want to use?
                  5 (kiboost)

                • Do you need to install / configure your respeaker2?
                  1 (yes)

                • sudo raspi-config (SPI Aktivieren)
                  ->5->P4->EXIT

                • sudo reboot -n

                • 192.168.0.93:12101 -> Webinterface aufrufen

                • Use PyAudio (default)
                  Audio Recording -> 2: seees-2mic-vicecard: bcm2825-i2cs...

                • Save + Restart Rhasspy

                • Audio Playing
                  Use aplay directly (ALSA)
                  Output Device (default:CARD=ALSA: Default Audio Device)

                Jetzt muss noch MQTT aktiviert werden und ein WakeWord ausgewählt werden, allerdings scheint der Speaker und der Leuchtring noch nicht zu funktionieren, was wohl daran liegt, dass ich im Webinterface von Rhasspy den Output Device nicht abspeichern kann. Nach dem Neustart steht dieser wieder auf default.

                default.JPG

                Kann mir bitte noch jemand den entscheidenden Hinweis geben?

                Danke und VG
                Leif

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

                @capitaenz
                Hallo,

                das sieht ja alles schon ganz gut aus.

                @capitaenz said in Rhasspy Offline Sprachsteuerung:

                Jetzt muss noch MQTT aktiviert werden

                Ich zweifle gerade, was ich dir empfehlen soll. MQTT ist gerade noch so eine Baustelle in der Version 2.5pre. Am besten, gehst du den sauberen Weg, zu dem Jörg und ich dir auch helfen können.

                Das bedeutet, dass du dir einen eigenen MQTT-Broker installieren musst. Der kann auf einem anderen Rechner laufen und muss sich nicht auf dem Raspi für den Rhasspy befinden. Kann er aber auch...

                Nimm zB den Eclipse, den du mit diesem Befehl lädtst:

                sudo apt update
                docker pull eclipse-mosquitto
                

                Eine Anleitung findest du hier:

                https://hub.docker.com/_/eclipse-mosquitto
                

                Dort siehst du auch, dass noch einige Files anzulegen sind, bevor du den Broker dann starten kannst. Dazu (zu den Files) schicke ich dir gleich noch eine Anleitung.

                Noch ein Hinweis: Mit dem iobroker-Adapter für mqtt kannst du diesen Broker nicht ersetzen, so funktioniert es nicht!

                Ich sehe gerade, dass soeben auch Jörg geantwortet hat. Folge zunächst einmal seinen Hinweisen, bevor du dich diesem MQTT-Broker zuwendest. Aber keine Angst, das ist kein Hexenwerk.

                Als WakeWord würde ich dir zunächst den Standard "Snowboy" empfehlen. Mit dem Herstellen eigener Wakewords solltest du noch warten.

                Beste Grüße
                tobetobe

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

                  @joergeli @tobetobe
                  Ich danke euch beiden! Mich begeistert dieses Forum, denn hier begegnet man sich auf Augenhöhe.
                  Ich muss aber sagen, ich packe mein Testsystem erstmal wieder zusammen und verfolge weiterhin Rhasspy aufmerksam, denn auch wenn ich Ausdauer besitze (die braucht man bei Hausautomatisierung besonders), ist mir das Ganze noch zu unausgereift.
                  Außerdem hatte ich mir vorgestellt, den Snips-Adapter los zu werden, als ich MQTT gehört hatte.
                  Snips halte ich dann noch eine Weile am Leben und überarbeite das Gehäuse noch einmal:
                  link text

                  Trotzdem Danke und bitte nicht böse sein, die zusammengefassten Infos können bestimmt auch andere noch brauchen.
                  Leif

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

                  tobetobeT 1 Reply Last reply
                  0
                  • capitaenzC capitaenz

                    @tobetobe
                    Dank euch aus dem Forum hab ich die Installation jetzt soweit am laufen, aber noch nicht funktionsfähig.
                    Ich habe noch einmal meine Schritte dokumentiert:

                    • Image Flashen mit Win32 DiskImager (Raspian Buster lite)

                    • ssh und wpa_supplicant.conf auf SD-Karte anlegen

                    • sudo apt update

                    • sudo apt full-upgrade

                    • sudo curl -sSL https://get.docker.com | sh

                    • sudo usermod -aG docker pi

                    • sudo reboot -n

                    • sudo docker pull rhasspy/rhasspy:2.5.0-pre

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

                    • sudo wget https://gist.githubusercontent.com/Psychokiller1888/a9826f92c5a3c5d03f34d182fda1ce4c/raw/cbb53252dd55dc4e9f5f6064a493f0981cf133fb/hlc_download.sh

                    • sudo chmod +x hlc_download.sh

                    • sudo ./hlc_download.sh

                    Abfragen:

                    • What assistant engine are you using?
                      2 (rhasspy)

                    • What's the path to your assistant config file?
                      /home/pi/.config/rhasspy/profiles/de/profile.json

                    • What device do you wish to control with SLC?
                      1 (respeaker2)

                    • What pattern do you want to use?
                      5 (kiboost)

                    • Do you need to install / configure your respeaker2?
                      1 (yes)

                    • sudo raspi-config (SPI Aktivieren)
                      ->5->P4->EXIT

                    • sudo reboot -n

                    • 192.168.0.93:12101 -> Webinterface aufrufen

                    • Use PyAudio (default)
                      Audio Recording -> 2: seees-2mic-vicecard: bcm2825-i2cs...

                    • Save + Restart Rhasspy

                    • Audio Playing
                      Use aplay directly (ALSA)
                      Output Device (default:CARD=ALSA: Default Audio Device)

                    Jetzt muss noch MQTT aktiviert werden und ein WakeWord ausgewählt werden, allerdings scheint der Speaker und der Leuchtring noch nicht zu funktionieren, was wohl daran liegt, dass ich im Webinterface von Rhasspy den Output Device nicht abspeichern kann. Nach dem Neustart steht dieser wieder auf default.

                    default.JPG

                    Kann mir bitte noch jemand den entscheidenden Hinweis geben?

                    Danke und VG
                    Leif

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

                    @capitaenz

                    Hallo Leif,
                    so, nun nochmals in Fortführung meines vorigen Posts zum Thema MQTT.

                    Ich habe mir unter /opt ein neues Verzeichnis mqtt angelegt. Darin befinden sich:

                    • die Datei mosquitto.conf

                    • die Datei docker-compose.yml, die du dir entspechend editieren musst

                    • und das leere Verzeichnis pwfile

                    Die docker-compose.yml sollte folgenden Inhalt haben:

                    mosquitto:
                      image: eclipse-mosquitto
                      hostname: mqtt-server
                      container_name: mqtt-server
                      restart: unless-stopped
                      ports:
                        - "1883:1883"
                        - "8883:8883"
                      volumes:
                        - /opt/mqtt/mosquitto.conf:/etc/mosquitto/mosquitto.conf
                        - /opt/mqtt/pwfile:/etc/mosquitto/pwfile
                        - /opt/mqtt:/var/lib/mosquitto
                    

                    Wenn deine Datei mosquitto.con diesen Inhalt hat, ist alles OK (Datei habe ich gekürzt):

                    user mosquitto
                    
                    port 1883
                    listener 9001
                    protocol websockets
                    
                    persistence true
                    
                    persistence_location /mqtt/data
                    
                    allow_anonymous false
                    
                    password_file /mqtt/pwfile
                    

                    Nun noch starten, aber bitte die Pfadangabe zur mosquitto.conf vorher anpassen!:

                    $ docker run -it -p 1883:1883 -p 9001:9001 -v mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto
                    

                    Damit läuft dein Broker.

                    In Rhasspy kannst du nun Hermes auf extern setzen und dort IP und Port eintragen, unter denen der Broker erreichbar ist.

                    Nun noch ein mqtt-Adapter im ioBroker installieren und ihn als Client konfigurieren. Dieser Client legt dir dann alle Objekte an, die du mit Skripten abholen und weiter verarbeiten kannst.

                    Beste Grüße
                    tobetobe

                    joergeliJ 1 Reply Last reply
                    0
                    • capitaenzC capitaenz

                      @joergeli @tobetobe
                      Ich danke euch beiden! Mich begeistert dieses Forum, denn hier begegnet man sich auf Augenhöhe.
                      Ich muss aber sagen, ich packe mein Testsystem erstmal wieder zusammen und verfolge weiterhin Rhasspy aufmerksam, denn auch wenn ich Ausdauer besitze (die braucht man bei Hausautomatisierung besonders), ist mir das Ganze noch zu unausgereift.
                      Außerdem hatte ich mir vorgestellt, den Snips-Adapter los zu werden, als ich MQTT gehört hatte.
                      Snips halte ich dann noch eine Weile am Leben und überarbeite das Gehäuse noch einmal:
                      link text

                      Trotzdem Danke und bitte nicht böse sein, die zusammengefassten Infos können bestimmt auch andere noch brauchen.
                      Leif

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

                      Hallo Leif,

                      schade, aber natürlich kein Problem.

                      @capitaenz said in Rhasspy Offline Sprachsteuerung:

                      das Ganze ist mir noch zu unausgereift.

                      Das kann man so mittlerweile eigentlich nicht mehr sagen. Aber Zeit zum Aufsetzen braucht man natürlich dennoch.

                      @capitaenz said in Rhasspy Offline Sprachsteuerung:

                      Außerdem hatte ich mir vorgestellt den Snips-Adapter los zu werden, als ich MQTT gehört hatte

                      Ja, das ist ja auch so. Den Snips-Adapter brauchst du nicht mehr.

                      Beste Grüße
                      tobetobe

                      1 Reply Last reply
                      0
                      • tobetobeT tobetobe

                        @capitaenz

                        Hallo Leif,
                        so, nun nochmals in Fortführung meines vorigen Posts zum Thema MQTT.

                        Ich habe mir unter /opt ein neues Verzeichnis mqtt angelegt. Darin befinden sich:

                        • die Datei mosquitto.conf

                        • die Datei docker-compose.yml, die du dir entspechend editieren musst

                        • und das leere Verzeichnis pwfile

                        Die docker-compose.yml sollte folgenden Inhalt haben:

                        mosquitto:
                          image: eclipse-mosquitto
                          hostname: mqtt-server
                          container_name: mqtt-server
                          restart: unless-stopped
                          ports:
                            - "1883:1883"
                            - "8883:8883"
                          volumes:
                            - /opt/mqtt/mosquitto.conf:/etc/mosquitto/mosquitto.conf
                            - /opt/mqtt/pwfile:/etc/mosquitto/pwfile
                            - /opt/mqtt:/var/lib/mosquitto
                        

                        Wenn deine Datei mosquitto.con diesen Inhalt hat, ist alles OK (Datei habe ich gekürzt):

                        user mosquitto
                        
                        port 1883
                        listener 9001
                        protocol websockets
                        
                        persistence true
                        
                        persistence_location /mqtt/data
                        
                        allow_anonymous false
                        
                        password_file /mqtt/pwfile
                        

                        Nun noch starten, aber bitte die Pfadangabe zur mosquitto.conf vorher anpassen!:

                        $ docker run -it -p 1883:1883 -p 9001:9001 -v mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto
                        

                        Damit läuft dein Broker.

                        In Rhasspy kannst du nun Hermes auf extern setzen und dort IP und Port eintragen, unter denen der Broker erreichbar ist.

                        Nun noch ein mqtt-Adapter im ioBroker installieren und ihn als Client konfigurieren. Dieser Client legt dir dann alle Objekte an, die du mit Skripten abholen und weiter verarbeiten kannst.

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

                        @tobetobe
                        Hallo Thomas,

                        ist es wirklich nötig, den MQTT so kompliziert aufzusetzen?

                        Ich habe einfach wie hier HermesLEDControl install Mosquitto beschrieben, einen normalen (nicht eclipse) Mosquitto installiert. Da braucht nichts mehr extra konfiguriert werden,
                        nur den mosquitto-service starten und gut ist.

                        Ich finde es ebenfalls schade, daß Leif ausgestiegen ist, obwohl er eigentlich schon rel. weit war.
                        Ich verstehe aber, daß es für einen Rhasspy-Neueinsteiger sehr unübersichtlich ist, sich durch unseren "mehr oder weniger 2er-Chat" mit momentan ca. 220 Posts durchzuwühlen.

                        Vorschlag:
                        Aber das veranlasst mich zu der Überlegung, ob wir nicht mal - in einem eigenen Thread ( Offline-Spracherkennung mit Rhasspy) - eine Schritt-für-Schritt-Anleitung zur Installation/Konfiguration von Rhasspy unter ioBroker erstellen sollten.
                        Dazu sind die Einzelschritte, die @capitaenz weiter oben aufgelistet hat, schon sehr hilfreich.
                        Darin sollte dann aber nur die reine Installation beschrieben werden.

                        Unsere persönlichen Vorlieben bzgl. JS-Auswertung der Intents sollten m.E. aber besser in jeweils eigenen Threads behandelt werden.
                        In etwa so: Rhasspy-Sentences/Slots vorstellen und ebenfalls das zugehörige ioBroker-JS-Auswertescript.

                        Gruß
                        Jörg

                        tobetobeT 1 Reply Last reply
                        0
                        • joergeliJ joergeli

                          Hallo Thomas,

                          @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

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

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

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

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

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

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

                          Gruß
                          Jörg

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

                          @joergeli

                          Hallo Jörg,
                          ich habe zwischenzeitlich weiter am Skript gearbeitet. Das sieht nun so aus:

                          // A - Definitionen
                          var data
                          var intentResult = $('mqtt.1.hermes.intent.*');
                          var intentArray = [];
                          var intent;
                          var siteId;
                          var slot = [];
                          var slotwert = [];
                          var wertearray = []; 
                          
                          
                          // B - Initialisierung und Auslesen der Intents beim MQTT-Client
                          for(var i = 0; i < intentResult.length; i++)
                          {
                              log(intentResult[i]);
                              intentArray.push(intentResult[i]);
                          }
                          
                          // C - Hauptfunktion zum Auslesen der Werte aus den Intents
                          on({id: intentArray, change: "any"}, function (obj) {
                              log(obj.newState.val);
                              let intentObject = JSON.parse(obj.newState.val);
                              let anzslots = intentObject.slots.length; //Anzahl Slots ermitteln
                              log("Anzahl Slots:" + anzslots); 
                              intent = intentObject.intent.intentName;
                          //    log("intent:" + intent);
                              siteId = intentObject.siteId;
                              log("siteID:" + siteId);   
                           
                              for (i = 0; i < anzslots; i++) { 
                                  let slot = intentObject.slots[i].slotName+':'+intentObject.slots[i].value.value;
                                  log("slot[" +i + "]:" + slot);
                                  slotwert  = intentObject.slots[i].value.value;
                                  wertearray.push(slotwert); // hier werden nur! die Werte der Slots in ein neues array "wertearray" geschrieben
                                  } // end of for
                          
                              log("Ausgabe Werte: " + wertearray[0] + wertearray[2]   + "," + wertearray[1]);
                              log("Ausgabe Slots: " + slot[0] + slot[2]   + "," + slot[1]);
                          
                          
                          // D - Aufrufen der Funktionen
                              log("intent:" + intent);
                              if(intent.includes("Change"))
                                  {    log("intent:" + intent);
                                      changedevice()};     
                          
                              if(intent.includes("Set"))
                                  {setdevice()};  
                          
                              if(intent.includes("Get"))
                                  {getdevice()};  
                          
                              if(intent.includes("Window"))
                                  {controlwindow()};
                          })
                          
                          
                          // E - Funktionen
                          function changedevice()
                          // Change: BlindLevel, DeviceState, DimmerLevel, Temperature
                              {
                              if(wertearray[0].includes("milight"))
                                  {        
                                  wertearray[2] = ".state"; 
                                  }
                              setState(wertearray[0] + wertearray[2] , wertearray[1]);   
                              log("Ausgabe Werte: " + wertearray[0] + wertearray[2]   + "," + wertearray[1]);  
                              }
                          // (weitere Funktionen nicht aufgeführt)
                          

                          Beim Testen habe ich festgestellt, dass die Werte nicht an die Funktionen übergeben werden können, wenn sie innerhalb von "C" nur mit "let" gesetzt werden, da sie dann nur lokal, also innerhalb der Funktion On.Id gelten. Aus diesem Grunde habe ich sie als globale Variable an den Skriptanfang gestellt. Das funktioniert auch soweit alles, mit dem kleinen Nachteil, dass die Werte von "wertearray" schon ab dem zweiten Befehl nicht mehr aktualisiert werden. Im Log sieht das dann so aus:

                          1. Befehl:
                          script.js.Rhasspy.mqttTest: Anzahl Slots:3
                          script.js.Rhasspy.mqttTest: siteID:Satellite1
                          script.js.Rhasspy.mqttTest: slot[0]:device:hm-rpc.0.ABC1234567.1
                          script.js.Rhasspy.mqttTest: slot[1]:value:50
                          script.js.Rhasspy.mqttTest: slot[2]:state:.LEVEL
                          script.js.Rhasspy.mqttTest: Ausgabe Werte: hm-rpc.0.ABC1234567.1.LEVEL,50
                          script.js.Rhasspy.mqttTest: Ausgabe Slots: undefinedundefined,undefined
                          script.js.Rhasspy.mqttTest: intent:ChangeDimmerLevel
                          script.js.Rhasspy.mqttTest: intent:ChangeDimmerLevel
                          script.js.Rhasspy.mqttTest: setForeignState(id=hm-rpc.0.ABC1234567.1.LEVEL, state=50)
                          script.js.Rhasspy.mqttTest: Ausgabe Werte: hm-rpc.0.ABC1234567.1.LEVEL,50
                          

                          Und nach dem zweiten Befehl:

                          javascript.0 (30499) script.js.Rhasspy.mqttTest: Anzahl Slots:3
                          script.js.Rhasspy.mqttTest: siteID:Satellite1
                          script.js.Rhasspy.mqttTest: slot[0]:device:hm-rpc.0.MEQ8765432.1
                          script.js.Rhasspy.mqttTest: slot[1]:value:100
                          script.js.Rhasspy.mqttTest: slot[2]:state:.LEVEL
                          script.js.Rhasspy.mqttTest: Ausgabe Werte: hm-rpc.0.ABC1234567.1.LEVEL,50
                          script.js.Rhasspy.mqttTest: Ausgabe Slots: undefinedundefined,undefined
                          script.js.Rhasspy.mqttTest: intent:ChangeDimmerLevel
                          script.js.Rhasspy.mqttTest: intent:ChangeDimmerLevel
                          script.js.Rhasspy.mqttTest: setForeignState(id=hm-rpc.0.ABC1234567.1.LEVEL, state=50)
                          script.js.Rhasspy.mqttTest: Ausgabe Werte: hm-rpc.0.ABC1234567.1.LEVEL,50
                          

                          Da hilft es dann nur, das Skript neu zu starten. Hast du eine Idee, woran das liegen könnte? Wahrscheinlich wie immer ein minimales Syntax-Problem.

                          Und dann wollte ich dich noch fragen, ob du bereits die Sprachansagen wieder lauffähig hast. Bisher liefen diese ja über die Funktion httpPost(data), müssten jetzt unter 2.5 aber doch über Hermes laufen, richtig?

                          Beste Grüße
                          tobetobe

                          joergeliJ 1 Reply Last reply
                          0
                          • joergeliJ joergeli

                            @tobetobe
                            Hallo Thomas,

                            ist es wirklich nötig, den MQTT so kompliziert aufzusetzen?

                            Ich habe einfach wie hier HermesLEDControl install Mosquitto beschrieben, einen normalen (nicht eclipse) Mosquitto installiert. Da braucht nichts mehr extra konfiguriert werden,
                            nur den mosquitto-service starten und gut ist.

                            Ich finde es ebenfalls schade, daß Leif ausgestiegen ist, obwohl er eigentlich schon rel. weit war.
                            Ich verstehe aber, daß es für einen Rhasspy-Neueinsteiger sehr unübersichtlich ist, sich durch unseren "mehr oder weniger 2er-Chat" mit momentan ca. 220 Posts durchzuwühlen.

                            Vorschlag:
                            Aber das veranlasst mich zu der Überlegung, ob wir nicht mal - in einem eigenen Thread ( Offline-Spracherkennung mit Rhasspy) - eine Schritt-für-Schritt-Anleitung zur Installation/Konfiguration von Rhasspy unter ioBroker erstellen sollten.
                            Dazu sind die Einzelschritte, die @capitaenz weiter oben aufgelistet hat, schon sehr hilfreich.
                            Darin sollte dann aber nur die reine Installation beschrieben werden.

                            Unsere persönlichen Vorlieben bzgl. JS-Auswertung der Intents sollten m.E. aber besser in jeweils eigenen Threads behandelt werden.
                            In etwa so: Rhasspy-Sentences/Slots vorstellen und ebenfalls das zugehörige ioBroker-JS-Auswertescript.

                            Gruß
                            Jörg

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

                            @joergeli said in Rhasspy Offline Sprachsteuerung:

                            Vorschlag:

                            Hallo Jörg,

                            sehr guter Vorschlag. Ich hatte schon die gleiche Idee, weil es immer sehr mühsam ist, neue Interessierte an Bord zu holen, dazu in alten Posts zu kramen, aus denen man sein eigenes Wissen bezog oder dieses Wissen aus dem Gedächtnis hervorzuholen, unterstützt mit Recherchen im eigenen Filesystem, um dann letztlich das, was man schon einmal geschrieben hat, nochmal zu "Papier" zu bringen.

                            Ich denke, dir geht es genau so???

                            Die thematische Aufteilung finde ich gut, also zunächst die Installation, dann die Konfiguration der Sentences und Slots (schon da gibt es ja Alternativen) und dann letztlich die Verarbeitung mit JS.

                            Ich würde vorschlagen, dass wir uns zunächst im Grundsatz zum Vorgehen abstimmen. Entwürfe per Mail austauschen und erst abgestimmte Ergebnisse posten. So sollte das Ganze dann doch einen runden Eindruck machen.

                            Gruß
                            Thomas

                            Beste Grüße
                            tobetobe

                            1 Reply Last reply
                            0
                            • tobetobeT tobetobe

                              @joergeli

                              Hallo Jörg,
                              ich habe zwischenzeitlich weiter am Skript gearbeitet. Das sieht nun so aus:

                              // A - Definitionen
                              var data
                              var intentResult = $('mqtt.1.hermes.intent.*');
                              var intentArray = [];
                              var intent;
                              var siteId;
                              var slot = [];
                              var slotwert = [];
                              var wertearray = []; 
                              
                              
                              // B - Initialisierung und Auslesen der Intents beim MQTT-Client
                              for(var i = 0; i < intentResult.length; i++)
                              {
                                  log(intentResult[i]);
                                  intentArray.push(intentResult[i]);
                              }
                              
                              // C - Hauptfunktion zum Auslesen der Werte aus den Intents
                              on({id: intentArray, change: "any"}, function (obj) {
                                  log(obj.newState.val);
                                  let intentObject = JSON.parse(obj.newState.val);
                                  let anzslots = intentObject.slots.length; //Anzahl Slots ermitteln
                                  log("Anzahl Slots:" + anzslots); 
                                  intent = intentObject.intent.intentName;
                              //    log("intent:" + intent);
                                  siteId = intentObject.siteId;
                                  log("siteID:" + siteId);   
                               
                                  for (i = 0; i < anzslots; i++) { 
                                      let slot = intentObject.slots[i].slotName+':'+intentObject.slots[i].value.value;
                                      log("slot[" +i + "]:" + slot);
                                      slotwert  = intentObject.slots[i].value.value;
                                      wertearray.push(slotwert); // hier werden nur! die Werte der Slots in ein neues array "wertearray" geschrieben
                                      } // end of for
                              
                                  log("Ausgabe Werte: " + wertearray[0] + wertearray[2]   + "," + wertearray[1]);
                                  log("Ausgabe Slots: " + slot[0] + slot[2]   + "," + slot[1]);
                              
                              
                              // D - Aufrufen der Funktionen
                                  log("intent:" + intent);
                                  if(intent.includes("Change"))
                                      {    log("intent:" + intent);
                                          changedevice()};     
                              
                                  if(intent.includes("Set"))
                                      {setdevice()};  
                              
                                  if(intent.includes("Get"))
                                      {getdevice()};  
                              
                                  if(intent.includes("Window"))
                                      {controlwindow()};
                              })
                              
                              
                              // E - Funktionen
                              function changedevice()
                              // Change: BlindLevel, DeviceState, DimmerLevel, Temperature
                                  {
                                  if(wertearray[0].includes("milight"))
                                      {        
                                      wertearray[2] = ".state"; 
                                      }
                                  setState(wertearray[0] + wertearray[2] , wertearray[1]);   
                                  log("Ausgabe Werte: " + wertearray[0] + wertearray[2]   + "," + wertearray[1]);  
                                  }
                              // (weitere Funktionen nicht aufgeführt)
                              

                              Beim Testen habe ich festgestellt, dass die Werte nicht an die Funktionen übergeben werden können, wenn sie innerhalb von "C" nur mit "let" gesetzt werden, da sie dann nur lokal, also innerhalb der Funktion On.Id gelten. Aus diesem Grunde habe ich sie als globale Variable an den Skriptanfang gestellt. Das funktioniert auch soweit alles, mit dem kleinen Nachteil, dass die Werte von "wertearray" schon ab dem zweiten Befehl nicht mehr aktualisiert werden. Im Log sieht das dann so aus:

                              1. Befehl:
                              script.js.Rhasspy.mqttTest: Anzahl Slots:3
                              script.js.Rhasspy.mqttTest: siteID:Satellite1
                              script.js.Rhasspy.mqttTest: slot[0]:device:hm-rpc.0.ABC1234567.1
                              script.js.Rhasspy.mqttTest: slot[1]:value:50
                              script.js.Rhasspy.mqttTest: slot[2]:state:.LEVEL
                              script.js.Rhasspy.mqttTest: Ausgabe Werte: hm-rpc.0.ABC1234567.1.LEVEL,50
                              script.js.Rhasspy.mqttTest: Ausgabe Slots: undefinedundefined,undefined
                              script.js.Rhasspy.mqttTest: intent:ChangeDimmerLevel
                              script.js.Rhasspy.mqttTest: intent:ChangeDimmerLevel
                              script.js.Rhasspy.mqttTest: setForeignState(id=hm-rpc.0.ABC1234567.1.LEVEL, state=50)
                              script.js.Rhasspy.mqttTest: Ausgabe Werte: hm-rpc.0.ABC1234567.1.LEVEL,50
                              

                              Und nach dem zweiten Befehl:

                              javascript.0 (30499) script.js.Rhasspy.mqttTest: Anzahl Slots:3
                              script.js.Rhasspy.mqttTest: siteID:Satellite1
                              script.js.Rhasspy.mqttTest: slot[0]:device:hm-rpc.0.MEQ8765432.1
                              script.js.Rhasspy.mqttTest: slot[1]:value:100
                              script.js.Rhasspy.mqttTest: slot[2]:state:.LEVEL
                              script.js.Rhasspy.mqttTest: Ausgabe Werte: hm-rpc.0.ABC1234567.1.LEVEL,50
                              script.js.Rhasspy.mqttTest: Ausgabe Slots: undefinedundefined,undefined
                              script.js.Rhasspy.mqttTest: intent:ChangeDimmerLevel
                              script.js.Rhasspy.mqttTest: intent:ChangeDimmerLevel
                              script.js.Rhasspy.mqttTest: setForeignState(id=hm-rpc.0.ABC1234567.1.LEVEL, state=50)
                              script.js.Rhasspy.mqttTest: Ausgabe Werte: hm-rpc.0.ABC1234567.1.LEVEL,50
                              

                              Da hilft es dann nur, das Skript neu zu starten. Hast du eine Idee, woran das liegen könnte? Wahrscheinlich wie immer ein minimales Syntax-Problem.

                              Und dann wollte ich dich noch fragen, ob du bereits die Sprachansagen wieder lauffähig hast. Bisher liefen diese ja über die Funktion httpPost(data), müssten jetzt unter 2.5 aber doch über Hermes laufen, richtig?

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

                              @tobetobe
                              Hallo Thomas,

                              wenn ich das richtig interpretiere, werden die slots jetzt nicht mehr aktualisiert.
                              Ich nehme an, das hängt damit zusammen, daß Du die

                              var slot = [];
                              var slotwert = [];
                              var wertearray = [];
                              

                              an den Anfang des Scriptes gesetzt hast, wo sie ja nur beim erstmaligen Starten des Scriptes ausgeführt werden.
                              Diese Angaben definieren ja nicht nur die Arrays, sondern löschen innerhalb der Schleife die Inhalte der Arrays, sprich:
                              sie machen sie leer.
                              IMHO müssen die wieder in die Schleife.
                              Wie die Werte dann an die Funktionen übergeben werden können, blicke ich im Moment auch noch nicht.

                              Sprachansage funktioniert bei mir - wie bisher auch - über die Funktion httpPost(data)

                              let http = require('http');
                              
                              
                              // Für Sprachausgabe auf Rhasspy
                              let options = {
                                  host: '192.168.192.26', //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.write(data);
                              
                                  req.end();
                              }
                              
                              //______________________________________________________________________________
                              

                              Beispiel-Ausgabe für WakeWord:

                              function wakeword(){
                                  let data = "ja?" ;
                                  httpPost(data);
                              }
                              
                              tobetobeT 1 Reply Last reply
                              0
                              • joergeliJ joergeli

                                @tobetobe
                                Hallo Thomas,

                                wenn ich das richtig interpretiere, werden die slots jetzt nicht mehr aktualisiert.
                                Ich nehme an, das hängt damit zusammen, daß Du die

                                var slot = [];
                                var slotwert = [];
                                var wertearray = [];
                                

                                an den Anfang des Scriptes gesetzt hast, wo sie ja nur beim erstmaligen Starten des Scriptes ausgeführt werden.
                                Diese Angaben definieren ja nicht nur die Arrays, sondern löschen innerhalb der Schleife die Inhalte der Arrays, sprich:
                                sie machen sie leer.
                                IMHO müssen die wieder in die Schleife.
                                Wie die Werte dann an die Funktionen übergeben werden können, blicke ich im Moment auch noch nicht.

                                Sprachansage funktioniert bei mir - wie bisher auch - über die Funktion httpPost(data)

                                let http = require('http');
                                
                                
                                // Für Sprachausgabe auf Rhasspy
                                let options = {
                                    host: '192.168.192.26', //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.write(data);
                                
                                    req.end();
                                }
                                
                                //______________________________________________________________________________
                                

                                Beispiel-Ausgabe für WakeWord:

                                function wakeword(){
                                    let data = "ja?" ;
                                    httpPost(data);
                                }
                                
                                tobetobeT Offline
                                tobetobeT Offline
                                tobetobe
                                wrote on last edited by
                                #232

                                @joergeli

                                Hallo Jörg,

                                dies ist der Datenpunkt für TTS:

                                mqtt.1.hermes.tts.say
                                

                                Ich konnte dort Text hinschicken, der aber nicht am Rhasspy-Lautsprecher ausgegeben wurde. Dazu ist wohl noch eine längere Auseinandersetzung mit dem Thema erforderlich.

                                Solange bleibte also erst einmal bei deinem Skript

                                Gruß
                                Thomas

                                Beste Grüße
                                tobetobe

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

                                  @joergeli

                                  Ich habe mich ausgeruht noch einmal dran gesetzt, frei nach dem Motto: so schwer/blöd kann das/man doch nicht sein.
                                  Also der Fehler war folgender:
                                  Zum Test darf der MQTT nicht auf Extern stehen, ansonsten bekommt man kein Feedback.
                                  Dann weiß ich nicht genau wie wichtig es ist folgendes abzuschalten:

                                  sudo nano /boot/config.txt // onboard Sound deaktivieren
                                  Turn dtparam=audio parameter to off: dtparam=audio=off
                                  

                                  gefolgt von einem

                                  sudo reboot -n
                                  

                                  Die eigenen Ohren (und die Katze) danken einem folgendes:

                                  sudo alsamixer
                                  
                                  sudo alsactl store
                                  

                                  Allerdings kann ich machen was ich will, nach einen Reboot ist die Laustärke wieder auf 100%

                                  Jetzt kommt aber das eigentlich Problem:
                                  MQTT

                                  Ich habe jetzt wie von dir @joergeli empfohlen folgendes ausgeführt und installiert:

                                  sudo apt update
                                  
                                  sudo apt install -y mosquitto mosquitto-clients
                                  
                                  sudo systemctl enable mosquitto.service
                                  
                                  sudo systemctl start mosquitto
                                  

                                  Wenn ich jetzt jedoch den MQTT auf Extern schalte, kommt beim ioBroker nichts an und der Lautsprecher vom Rhasspy bleibt stumm...
                                  Es muss doch möglich sein, ohne besondere Ansprüche, wie bei Snips die erkannten Worte in den ioBroker zu bekommen.

                                  Neugierig bleibe ich, weil wer weiß wie lange Snips noch macht, Stichwort Adapter...

                                  VG
                                  Leif

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

                                  joergeliJ 1 Reply Last reply
                                  0
                                  • capitaenzC capitaenz

                                    @joergeli

                                    Ich habe mich ausgeruht noch einmal dran gesetzt, frei nach dem Motto: so schwer/blöd kann das/man doch nicht sein.
                                    Also der Fehler war folgender:
                                    Zum Test darf der MQTT nicht auf Extern stehen, ansonsten bekommt man kein Feedback.
                                    Dann weiß ich nicht genau wie wichtig es ist folgendes abzuschalten:

                                    sudo nano /boot/config.txt // onboard Sound deaktivieren
                                    Turn dtparam=audio parameter to off: dtparam=audio=off
                                    

                                    gefolgt von einem

                                    sudo reboot -n
                                    

                                    Die eigenen Ohren (und die Katze) danken einem folgendes:

                                    sudo alsamixer
                                    
                                    sudo alsactl store
                                    

                                    Allerdings kann ich machen was ich will, nach einen Reboot ist die Laustärke wieder auf 100%

                                    Jetzt kommt aber das eigentlich Problem:
                                    MQTT

                                    Ich habe jetzt wie von dir @joergeli empfohlen folgendes ausgeführt und installiert:

                                    sudo apt update
                                    
                                    sudo apt install -y mosquitto mosquitto-clients
                                    
                                    sudo systemctl enable mosquitto.service
                                    
                                    sudo systemctl start mosquitto
                                    

                                    Wenn ich jetzt jedoch den MQTT auf Extern schalte, kommt beim ioBroker nichts an und der Lautsprecher vom Rhasspy bleibt stumm...
                                    Es muss doch möglich sein, ohne besondere Ansprüche, wie bei Snips die erkannten Worte in den ioBroker zu bekommen.

                                    Neugierig bleibe ich, weil wer weiß wie lange Snips noch macht, Stichwort Adapter...

                                    VG
                                    Leif

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

                                    @capitaenz

                                    Zu der Ausgabe auf Lautsprecher kümmern wir uns ganz zum Schluß,
                                    erst mal muss alles andere funktionieren !

                                    @capitaenz sagte in Rhasspy Offline Sprachsteuerung:

                                    Dann weiß ich nicht genau wie wichtig es ist folgendes abzuschalten:

                                    > sudo nano /boot/config.txt // onboard Sound deaktivieren
                                    > Turn dtparam=audio parameter to off: dtparam=audio=off
                                    

                                    Mach das bitte wieder rückgängig, denn den Audio-Output über die 3,5mm-Klinkenbuchse brauchen wir später noch.

                                    Was nicht schaden kann, damit Audio Out über die Klinkenbuchse erzwungen wird:
                                    sudo raspi-config ausführen, dann:
                                    7 Advanced Options --> A4 Audio --> 1 Force 3.5mm ('headphone') jack

                                    Hattest Du ausgeführt, was ich geschrieben hatte?:

                                    Stoppe mal Deinen docker-container:
                                    1.) docker ps --> docker container anzeigen und Container ID notieren.
                                    2.) docker stop <Container ID> --> docker container stoppen.
                                    3.) Neuen docker-container wie folgt anlegen/starten:
                                    docker run -d -p 12101:12101
                                    --restart unless-stopped
                                    -v "$HOME/.config/rhasspy/profiles:/profiles"
                                    --device /dev/snd:/dev/snd rhasspy/rhasspy:2.5.0-pre
                                    --user-profiles /profiles
                                    --profile de

                                    Dann solltest Du diese Rhasspy 2.5-pre GUI haben:
                                    raspi25.jpg

                                    Wenn Dein MOSQUITTO soweit auf dem Rhasspy-Raspi läuft musst unter MQTT folgendes eintragen (wobei die IP-Adresse natürlich die von Deinem Rhasspy-Raspi sein muß):
                                    Hinweis andere MQTT-Ports als 1883 funktionieren leider nicht, da hatte ich bei Rhasspy schon ein Issue aufgemacht, was bisher noch nicht gefixed wurde.

                                    mqtt.jpg

                                    Stelle auch die restlichen Parameter so ein, wie im Screenshot.
                                    Wakeword sollte (erst mal) "snowboy" sein, mit einer sensitivity = 0.9 und kein Haken bei "Apply Frontend".
                                    Hinweis: Es kann sein, wenn Du bei "Speech to Text" "Kaldi" auswählst, daß nach dem Abspeichern mit "Save Settings", Rhasspy noch weitere zu Kaldi gehörende Dateien aus dem Internet herunterladen will --> bestätigen und die Installation erfolgt dann automatisch.

                                    Dann wählst Du in der Rhasspy-GUI den Menüpunkt Sentences und trägst dort testweise nur! den Abschnitt ein, den ich blau markiert habe (das mit den Rolladen):
                                    rolladen.jpg

                                    [Rolladen]
                                    rolladen_name =  (rolladen ) {name}
                                    rolladen_state = (hochfahren | runterfahren | stoppen ) {state}
                                    <rolladen_name> <rolladen_state>
                                    

                                    Abspeichern mit "Save Sentences" nicht vergessen!

                                    Dann klickst Du in der Rhasspy-GUI auf das Symbol mit dem Haus.
                                    Wenn Du jetzt das WakeWord "snowboy" und gleich anschließend "rolladen hochfahren" sagst, sollte das so in der Rhasspy-GUI erkannt werden:
                                    rolladen hochfahren.jpg

                                    Entsprechend auch "rolladen runterfahren", bzw. "rolladen stoppen".

                                    Soweit erst mal; das weitere Vorgehen ( Auswertung in ioBroker, Sprachausgabe) können wir besprechen, wenn es bis hierher geklappt hat.
                                    Bitte meine obige Frage beantworten und falls an irgendeiner Stelle Probleme auftreten sollten, bitte genau beschreiben, was passiert, bzw. nicht passiert ist.

                                    Gruß
                                    Jörg

                                    1 Reply Last reply
                                    0
                                    • tobetobeT tobetobe

                                      @joergeli

                                      Hallo Jörg,

                                      dies ist der Datenpunkt für TTS:

                                      mqtt.1.hermes.tts.say
                                      

                                      Ich konnte dort Text hinschicken, der aber nicht am Rhasspy-Lautsprecher ausgegeben wurde. Dazu ist wohl noch eine längere Auseinandersetzung mit dem Thema erforderlich.

                                      Solange bleibte also erst einmal bei deinem Skript

                                      Gruß
                                      Thomas

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

                                      Hallo Thomas,
                                      @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                      Ich konnte dort Text hinschicken, der aber nicht am Rhasspy-Lautsprecher ausgegeben wurde. Dazu ist wohl noch eine längere Auseinandersetzung mit dem Thema erforderlich.

                                      Bei mir ist die mqtt.1-Instanz als Client/subscriber eingestellt.
                                      IMHO kann die Instanz nur auf "subscribte" Topics hören, aber nicht an "hermes/tts/say" senden, bzw. publishen?

                                      Gruß
                                      Jörg

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

                                        @joergeli
                                        danke für die Anleitung 😃
                                        Also die 2.5.0-pre ist installiert, so wie erklärt/gezeigt.
                                        Die Klinke habe ich abgeschaltet, weil ich einen Lautsprecher am Anschluss "Speaker" habe.
                                        Der Lautsprecher funktioniert und ich kann über "Speak" auch Wörter darüber ausgeben.
                                        Rhasspy reagiert auf Wörter, aber wenn ich sage: "rolladen stoppen" wird "offen sag mir stoppen" verstanden
                                        Ich habe auf "Train" gedrückt und es funktioniert 😉
                                        Jetzt müssten die Wörter nur noch per MQTT an den ioBroker übergeben werden und ich bin glücklich.
                                        Ich sehe gerade @tobetobe hatte mir ja schon alles mit MQTT erklärt, aber du hast da eine simplere Idee?
                                        Ich hatte mir ganz unvoreingenommen vorgestellt Rhasspy könnte MQTT von haus aus!?
                                        Ich stelle mir nur grad vor was passiert wenn ein Update von Rhasspy kommt, dann habe ich direkt MQTT als weitere Baustelle.

                                        Danke und VG
                                        Leif

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

                                        joergeliJ 1 Reply Last reply
                                        0
                                        • capitaenzC capitaenz

                                          @joergeli
                                          danke für die Anleitung 😃
                                          Also die 2.5.0-pre ist installiert, so wie erklärt/gezeigt.
                                          Die Klinke habe ich abgeschaltet, weil ich einen Lautsprecher am Anschluss "Speaker" habe.
                                          Der Lautsprecher funktioniert und ich kann über "Speak" auch Wörter darüber ausgeben.
                                          Rhasspy reagiert auf Wörter, aber wenn ich sage: "rolladen stoppen" wird "offen sag mir stoppen" verstanden
                                          Ich habe auf "Train" gedrückt und es funktioniert 😉
                                          Jetzt müssten die Wörter nur noch per MQTT an den ioBroker übergeben werden und ich bin glücklich.
                                          Ich sehe gerade @tobetobe hatte mir ja schon alles mit MQTT erklärt, aber du hast da eine simplere Idee?
                                          Ich hatte mir ganz unvoreingenommen vorgestellt Rhasspy könnte MQTT von haus aus!?
                                          Ich stelle mir nur grad vor was passiert wenn ein Update von Rhasspy kommt, dann habe ich direkt MQTT als weitere Baustelle.

                                          Danke und VG
                                          Leif

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

                                          @capitaenz
                                          Hallo Leif,
                                          na, das ist doch schon die halbe Miete 👍

                                          @capitaenz sagte in Rhasspy Offline Sprachsteuerung:

                                          Ich hatte mir ganz unvoreingenommen vorgestellt Rhasspy könnte MQTT von haus aus!?

                                          Tja, da muss ich etwas ausholen:
                                          In der vorigen Rhasspy-Version 2.4.19 konnte man einfach in ioBroker einen MQTT Server/broker-Adapter mit beliebigem Port installieren. In Rhasspy hat man dann einfach bei MQTT "extern" gewählt und IP-Adresse von ioBroker und MQTT-Port eingetragen. Dann wurden die entspr. Rhasspy-Topics automatisch abonniert und entspr. Datenpunkte angelegt.
                                          Auf Änderung dieser Datenpunkte konnte man dann z.B. JavaScript reagieren und z.B. eine Lampe ein-/ausschalten.

                                          Mit der neuen Rhasspy 2.5-pre geht das zwar auch, doch ist es - wie wir mühsam herausgefunden haben -, etwas umständlicher. Deshalb brauchen wir hier auch den zusätzlichen MOSQUITTO auf dem Rhasspy-Raspi.

                                          Vorgehensweise:
                                          Falls bei Dir schon ein ioBroker MQTT Server/broker-Adapter(z.B. mqtt.0) läuft, eine weitere Instanz (mqtt.1) hinzufügen und als Client/subscriber einrichten. Bei den Verbindungseinstellungen die IP Deines Rhasspy-Raspi und Port 1883 eintragen. Das ist dann der zuvor auf dem Rhasspy installierte MOSQUITTO:
                                          mqtt1konf.jpg

                                          Es reicht aus, nur auf diese 3 Topics hermes/intent/#, hermes/asr/startListening, hermes/nlu/intentNotRecognized von Rhasspy zu subscriben:
                                          mqtt2konf.jpg

                                          Wenn Du jetzt noch mal "snowboy" "rolladen hochfahren" sagst, sollte dann unter den ioBroker-Objekten u.a. mqtt.1.hermes.intent.Rolladen mit dem entspr. Befehl, bzw. JSON "rolladen hochfahren" erscheinen:
                                          mqttobjekte.jpg
                                          Bei meinem Screenshot sind noch weitere intents zu sehen, da ich natürlich noch andere Sache schalte, als die Rolläden.

                                          Damit hätten wir schon mal die Info von Rhasspy in ioBroker, daß die Rolladen hochgefahren werden sollen.

                                          Jetzt fehlt nur noch die Auswertung der Info, d.h. wie soll ioBroker darauf reagieren.
                                          @tobetobe und ich machen das via JavaScript, wobei wir da unterschiedliche Varianten bevorzugen, @tobetobe hat da eine elegante Variante, die aber momentan mit der 2.5-pre noch nicht zu 100% funktioniert.
                                          Ich stelle Dir deshalb mal meine Quick & Dirty-Variante vor (ich bin kein JS-Crack).

                                          Ich habe folgende Sentences in Rhasspy angelegt:
                                          (ich verwende - aus Faulheit - keine sog. Slots, wie das eigentlich in der Rhasspy-Doku beschrieben ist, geht aber trotzdem)

                                          [Temperatur]
                                          temperatur_name = (temperatur) {name}
                                          temperatur_state = (draussen| wohnzimmer | keller | schlafzimmer | badewasser) {state}
                                          wie (warm | kalt) ist [es | das] [(im)] <temperatur_state>
                                          
                                          [Ereignis]
                                          ereignis_name = (ereignis) {name}
                                          ereignis_state = (termine) {state}
                                          liegt heute etwas an
                                          (gibt es) [(heute)] <ereignis_state> [(heute)]
                                          
                                          [Zeit]
                                          zeit_name = (zeit) {name}
                                          zeit_state = (spät | uhr | uhrzeit) {state}
                                          (wie | wieviel | sag mir) [(ist die | die)] <zeit_state> [(ist es | haben wir)]
                                          
                                          [Datum]
                                          datum_name = (datum) {name}
                                          datum_state = (tag | datum) {state}
                                          ( welchen | welches) <datum_state> [ist | haben wir] [ heute]
                                          
                                          [Drucker]
                                          drucker_name = (drucker) {name}
                                          drucker_state = (weit) {state}
                                          wie <drucker_state> ist der drucker
                                          
                                          [Fenster]
                                          fenster_name = (fenster) {name}
                                          fenster_state = (offen | zu) {state}
                                          (sind) [(noch)] [(alle Fenster | Fenster )] <fenster_state>
                                          
                                          [Regen]
                                          regen_name = (regen) {name}
                                          regen_state = (geregnet) {state}
                                          hat es [(heute)] <regen_state>
                                          
                                          [Lampen]
                                          lampen_name = (moodlight |stimmungslicht|fernsehlicht|esstischlampe|essecke|wandspots|regal|couchjoerg|couchrenate|hydro|ledcube|radio ) {name}
                                          lampen_state = (ein | aus) {state}
                                          schalte [ (die | den | das )]  <lampen_name> <lampen_state>
                                          
                                          [Moodlight]
                                          moodlight_name = (moodlight) {name}
                                          moodlight_state = (regenbogen | polizei | running | wischen | christmas) {state}
                                          <moodlight_state>
                                          
                                          [Scenes]
                                          scene_name =  (schlafen | fernsehabend) {name}
                                          scene_state = (aktivieren | gehen ) {state}
                                          <scene_name> <scene_state>
                                          
                                          
                                          [Rolladen]
                                          rolladen_name =  (rolladen ) {name}
                                          rolladen_state = (hochfahren | runterfahren | stoppen ) {state}
                                          <rolladen_name> <rolladen_state>
                                          

                                          Dementsprechend werden bei Aufruf des entspr. Sentence die ioBroker-Datenpunkte angelegt.
                                          z.B. : "snowboy" "wie warm ist es im wohnzimmer" der Datenpunkt mqtt.1.hermes.intent.Temperatur
                                          (das kennen wir schon vom Rolladen-Beispiel)

                                          Dann habe ich ein JS gebastelt, was auf Änderung des entspr. Datenpunktes (hier: Temperatur) reagiert, bzw. getriggert wird.
                                          Anschließend erfolgt eine if-Abfrage, was übergeben wurde (draussen, wohnzimmer, keller, schlafzimmer, badewasser)
                                          Anhand des Ergenisses der if-Abfrage wird dann der Datenpunkt (hier: wohnzimmer) ausgelesen und an die Sprachausgabe für Rhasspy übergeben:

                                          let data = "Es sind " + innentemp + " Grad im Wohnzimmer" ;
                                          

                                          Am Anfang des Scriptes ist übrigens definiert, daß die Sprachausgaben an die HTTP-Api von Rhasspy gesendet werden.
                                          Dazu muß im Script die entspr. IP-Adresse editiert werden:

                                          Hier nun also mein kpl. Script, wobei Du natürlich die Datenpunkte der Sensoren/Aktoren, etc. an Deine Gegebenheiten anpassen musst:

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

                                          Ich weiß nicht, ob Du damit was anfangen kannst, bzw. es für Deine Zwecke entspr. umbauen kannst.
                                          Es soll nur ein Beispiel sein, wie man die Sprachbefehle von Rhasspy auswerten kann.
                                          Man kann dzu auch Blockly, oder Node Red verwenden, wobei beides nicht so mein Ding ist.
                                          Natürlich wirst Du Dir Deine eigenen Sentences erstellen wollen, aber dazu schau am besten mal in die Doku von Rhasspy

                                          Was mich noch interessieren würde:
                                          1.) Hat Dein Respeaker-Mic einen Audio-Ausgang, d.h. hast Du daran den Lautsprecher angeschlossen?
                                          2.) Funktioniert bei Dir der LED-Ring auf dem Mic (bzw. HLC = Hermes LED Control ?

                                          Gruß
                                          Jörg

                                          P.S.

                                          @capitaenz sagte in Rhasspy Offline Sprachsteuerung:

                                          Ich stelle mir nur grad vor was passiert wenn ein Update von Rhasspy kommt, dann habe ich direkt MQTT als weitere Baustelle.

                                          Da sehe ich kein Problem, denn die sog. Hermes-Topics werden wohl auch in künftigen Rhasspy-Versionen nicht geändert werden.

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


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          52

                                          Online

                                          32.4k

                                          Users

                                          81.3k

                                          Topics

                                          1.3m

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

                                          • Don't have an account? Register

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