ioBroker: Sprachausgabe mit Alexa und eigene Kommandos programmieren

Wie du mit ioBroker und Blockly Alexa und deine Echo-Devices dazu bringst, von dir definierte Aktionen auszulösen und eigene Antworten auf deine Anfragen zu geben, erkläre ich dir in diesem Artikel.

Voraussetzung

Einrichtung

Installation des Alexa2-Adapters

Zuerst musst du den Alexa2-Adapter installieren. Gehe dafür unter Adapter und suche nach Alexa. Installiere eine Adapter-Instanz und wechsle dann in die Einstellungen des Adapters. Um dich mit deinen Alexa-Geräten zu verbinden, musst du den Adapter mit deinem Amazon-Konto verbinden:

Wie du mit ioBroker und Blockly Alexa und deine Echo-Devices dazu bringst, von dir definierte Aktionen auszulösen und eigene Antworten auf deine Anfragen zu geben, erkläre ich dir in diesem Artikel.

Authentifiziere dich mit deinen Amazon-Zugangsdaten und schließe den Tab nach erfolgreicher Anmeldung. Die Adapter-Einstellungen sollten nun so aussehen:

Wie du mit ioBroker und Blockly Alexa und deine Echo-Devices dazu bringst, von dir definierte Aktionen auszulösen und eigene Antworten auf deine Anfragen zu geben, erkläre ich dir in diesem Artikel.

Datenpunkt für Anfragen

Wechsle in die Objekte. Dort findest du nun unter alexa2.0.History den Datenpunkt Summary. Dieser beinhaltet die zuletzt von dir an Alexa gerichtete Anfrage (nur, wenn es keine Standardanfrage wie „Wie viel Uhr ist es?“ ist):

Wie du mit ioBroker und Blockly Alexa und deine Echo-Devices dazu bringst, von dir definierte Aktionen auszulösen und eigene Antworten auf deine Anfragen zu geben, erkläre ich dir in diesem Artikel.

Blockly-Script aufbauen

Anfrage abfangen

Erstelle dir ein neues Blockly-Script und ziehe dir aus dem Bereich Trigger einen neuen Falls Objekt-Block in den Editor. Für die Objekt ID am Eingang wählst du den Summary-Datenpunkt unter alexa2.0.History und stellst den Trigger auf wurde geändert:

Wie du mit ioBroker und Blockly Alexa und deine Echo-Devices dazu bringst, von dir definierte Aktionen auszulösen und eigene Antworten auf deine Anfragen zu geben, erkläre ich dir in diesem Artikel.

Als Nächstes ziehst du einen falls mache-Block in den Trigger-Block und hängst an den Eingang einen =-Block aus dem Bereich Mathematik. Diesen stellst du auf größer als und setzt als Vergleichswert die Zahl 0 ebenfalls aus dem Bereich Mathematik ein:

Wie du mit ioBroker und Blockly Alexa und deine Echo-Devices dazu bringst, von dir definierte Aktionen auszulösen und eigene Antworten auf deine Anfragen zu geben, erkläre ich dir in diesem Artikel.

Als Vergleichsobjekt nimmst du aus dem Bereich Text einen im Text suche erstes Auftreten-Block. Lösche die Variable Text aus dem Block und setzte stattdessen einen Objekt ID-Block aus dem Bereich Trigger dort ein und stelle diesen auf Wert:

Wie du mit ioBroker und Blockly Alexa und deine Echo-Devices dazu bringst, von dir definierte Aktionen auszulösen und eigene Antworten auf deine Anfragen zu geben, erkläre ich dir in diesem Artikel.

Statt abc schreibst du den Begriff in das Feld, welchen du abfangen und verarbeiten möchtest. Sobald Alexa diesen Begriff empfangen hat, reagiert das Blockly-Script und verarbeitet diesen.

Alexas Antwort unterbinden

Damit Alexa nicht selbstständig auf deine Anfrage antwortet, musst du sie mit folgendem Datenpunkt stoppen, wobei XXX für die ID deines Echo-Device steht:

alexa2.0.Echo-Devices.XXX.Commands.deviceStop

Nimm dafür aus dem Bereich System den steuere-Block und ziehe ihn in den mache-Bereich deines Scripts. Als Object-ID wählst du den gerade genannten Datenpunkt aus. Für den Steuerbefehl wählst du den wahr-Block aus dem Bereich Logik:

Wie du mit ioBroker und Blockly Alexa und deine Echo-Devices dazu bringst, von dir definierte Aktionen auszulösen und eigene Antworten auf deine Anfragen zu geben, erkläre ich dir in diesem Artikel.

Weitere Aktionen hinzufügen

Nun kannst du beliebige Aktionen hinzufügen, zum Beispiel eine Sprachausgabe über dein Echo-Device. Hierzu ist folgender Datenpunkt zuständig, wobei XXX für die ID deines Echo-Device steht:

alexa2.0.Echo-Devices.XXX.Commands.speak

Dafür ziehst du dir wieder einen steuere-Block unter den letzten Block und wählst den genannten Datenpunkt aus. Als Steuerbefehl wählst du aus dem Bereich Text einen leeren Textblock und gibst darin deine eigene Antwort ein. Übrigens: die 100; am Anfang steht für die Lautstärke, in der Alexa antworten soll:

Wie du mit ioBroker und Blockly Alexa und deine Echo-Devices dazu bringst, von dir definierte Aktionen auszulösen und eigene Antworten auf deine Anfragen zu geben, erkläre ich dir in diesem Artikel.

Fertiges Script

Blockly

<xml xmlns="https://developers.google.com/blockly/xml">
  <block type="on_ext" id="l3u_cJZVO=D!E:8cI*SC" x="63" y="13">
    <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
    <field name="CONDITION">ne</field>
    <field name="ACK_CONDITION"></field>
    <value name="OID0">
      <shadow type="field_oid" id="K%o09$D|xauyapG7oea0">
        <field name="oid">alexa2.0.History.summary</field>
      </shadow>
    </value>
    <statement name="STATEMENT">
      <block type="controls_if" id="F^O%L}B]*Uf*Y,X|E:0(">
        <value name="IF0">
          <block type="logic_compare" id="~]_NNjW,+,aMrOzEz:S6">
            <field name="OP">GT</field>
            <value name="A">
              <block type="text_indexOf" id="HiXs|bgl7Ex;PLDrd!R`">
                <field name="END">FIRST</field>
                <value name="VALUE">
                  <block type="on_source" id="`L)_oRF7xz@rmo3zJLbZ">
                    <field name="ATTR">state.val</field>
                  </block>
                </value>
                <value name="FIND">
                  <shadow type="text" id="8:q#e/+oIQ5Db.kfXPe@">
                    <field name="TEXT">WORT</field>
                  </shadow>
                </value>
              </block>
            </value>
            <value name="B">
              <block type="math_number" id=")}QfeKV!-tZwA)Pje%hD">
                <field name="NUM">0</field>
              </block>
            </value>
          </block>
        </value>
        <statement name="DO0">
          <block type="control" id="du-!#j}/BHM,WvmQ8L2=">
            <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
            <field name="OID">alexa2.0.Echo-Devices.G091EV0810460AUU.Commands.deviceStop</field>
            <field name="WITH_DELAY">FALSE</field>
            <value name="VALUE">
              <block type="logic_boolean" id="O-u8+P]yeEk9k0BaN@z{">
                <field name="BOOL">TRUE</field>
              </block>
            </value>
            <next>
              <block type="control" id="IvEQXR@FFr!j`$f30}Jl">
                <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                <field name="OID">alexa2.0.Echo-Devices.G091EV0810460AUU.Commands.speak</field>
                <field name="WITH_DELAY">FALSE</field>
                <value name="VALUE">
                  <block type="text" id="VC0vdvG:EBy|;tXC.mU0">
                    <field name="TEXT">100;Eigener Text</field>
                  </block>
                </value>
              </block>
            </next>
          </block>
        </statement>
      </block>
    </statement>
  </block>
</xml>

Javascript

on({id: 'alexa2.0.History.summary', change: "ne"}, async function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  if ((obj.state ? obj.state.val : "").indexOf('WORT') + 1 > 0) {
    setState("alexa2.0.Echo-Devices.G091EV0810460AUU.Commands.deviceStop"/*deviceStop*/, true);
    setState("alexa2.0.Echo-Devices.G091EV0810460AUU.Commands.speak"/*speak*/, '100;Eigener Text');
  }
});
War dieser Beitrag hilfreich?
Hat dir der Beitrag geholfen?
Die mit Sternchen (*) gekennzeichneten Links sind sogenannte Affiliate-Links. Wenn du auf so einen Affiliate-Link klickst und über diesen Link einkaufst, bekomme ich von dem betreffenden Online-Shop oder Anbieter eine Provision. Für dich verändert sich der Preis nicht.

31 Kommentare

Kommentieren

Hallo,
gute Anleitung.
Aber wie stelle ich es an, wenn ich irgendeinen echo in der Wohnung fragen möchte ohne für jeden echo ein extra Skript bzw. Abfrage zu basteln?

Megacool!

Bei mir macht alexa immer ein nerviges „BIP“ wenn ich „100;“ als Lautstärke eingebe.
Bekommt man dieses Geräusch auch wieder weg?
(kam bei mir irgendwann plötzlich obwohl ich gefühlt nix geändeet hatte)

Danke für die super Erklärung, damit ist es auch für jemanden der nicht so tief in dem Thema ist, super einfach umszusetzten.

Ich habe bei mir nur das Problem, das strotz deviceStop, derEcho immer anfängt zu sagen das er kein gerät gefunden finden kann. Der Schaltbefehl (bei mir aus KNX) wird jedoch ausgeführt.
Wenn ich wie hier eine Textanwort senden lasse, fängt die Alex an und unterbricht dann um die Antwort zu sagen.
Kann man das Antworten Irgendwie schnelle unterdrücken?

Hi Tobias, ich habe das gleiche Problem. Mein Skript läuft. TV geht an, Licht geht an, wenn es draußen dunkel genug ist, Licht wird gedimmt. Das alles, obwohl Alexa antwortet: Das weiß ich leider nicht. Leider wird der Befehl DeviceStop ignoriert und Alexa überspricht wie bei Dir den vorgegebenen Antworttext.
Konntest Du das Problem lösen?

Erstellt in der Alexa App einfach eine Routine die den gleichen Text abfragt, aber fügt keine Aktion hinzu.
Somit sagt Alexa nichts, aber euer Script wird ausgeführt

Sehr coole Idee!
Ich hab mir auf der Basis eine Funktion geschrieben die immer bei dem echo den stop ausführt, der angesprochen wurde. Damit geht es mit mehr als einem Gerät. Leider habe ich auch das Phänomen, dass das abbrechen nicht schnell genug erfolgt. Falls du dafür eine Idee hättest wäre da super!

das skipt funktioniert soweit ganz wunderbar, aber es läuft in endlosschleife. Selbst wenn ich das skript deaktiviere läuft „steuere speak“ weiter.

Anscheinend funktioniert das mit der Lautstärke bei mir nicht.. Wenn ich z.B. „100; Test“ in den DP schreibe liest er zwar nicht die 100, aber die Lautstärke ändert sich nicht

Hallo zusammen, funktioniert super außer das beschriebene Problem. Alexa antwortet sehr schnell und somit wird der Alexa-eigene Befehl abgespielt dann unterbrochen und dann kommt der individuelle Befehl.

Tja, dann muß man Alexa wohl vorher „beschäftigen“. Nimm Dir die Alexa App auf dem Handy,
Mehr / Routinen
Gib dem Kind irgendwas mit dem Namen, was oben unter ABC genommen wurde.
Temperatur Kühlschrank
z.B.
Aktion „Benutzerdefiniert“
somit steht da
Alexa, Temperatur Kühlschrank
Dann die Aktion hinzufügen
Kühlschrank einschalten
z.B. – ist zwar unsinnig, aber so soll es sein – während Alexa drüber nachdenkt, wird es bereits abgebrochen
über IObroker 😉

Hallo, hat denn jemand schon eine Lösung zu dem Problem, obwohl man deviceStop hat eine Fehlermeldung bekommt? Das ausführen des Scripts funktioniert einwandfrei, nur diese Fehlermeldung nervt.
Gruß René

Moin!
Klasse Tutorials, habe die gerade erst entdeckt. (Asche über mein Haupt!)

Aber ich verzweifle gerade: in meinen Objekten gibt es unter alexa2.1.EchoDevices.xxx. kein History!

Alarm, Command, Info. … aber kein History und damit auch kein summary.

Was mache ich falsch?

Gruß, Uwe

Moin Uwe,
der Punkt ‚History‘ ist keinen EchoDevice zu geordnet. Der Punkt ist auf der gleichen Ebene wie ‚EchoDevices‘ also alexa2.1.History.

Hallo,

vielen Dank für die gute Erklärung.
Leider Funktioniert das bei mir nicht, die sagt nur „hier bitte“.
Mein Script:

ne

alexa2.0.History.summary

GT

FIRST

state.val

BATTERIE

0

alexa2.0.Echo-Devices.G0911B0594630H2P.Commands.deviceStop
FALSE

TRUE

alexa2.0.Echo-Devices.G0911B0594630H2P.Commands.speak
FALSE

Baterie leistung

Leider klappt weder „cleanup“ noch „devicestop“ und Alexa plappert immer dazwischen. Die Routinen in der App sind für mich keine Lösung, da Alexa hier nur auf den genauen Wortlaut reagiert.

Hat jemand eine Idee wie man das ganze sauber lösen kann?

Ich bin auch gespannt. habs versucht über Volumen zu regeln. Aber kannst ja auch nur minimum 10% einstellen. auch kurze Antworten funksen nicht. sienplappert immer dazwischen, bri ht sb und sagt denn den Text der bei speak eingegeben wurde. Routinen erstellen funktioniert, aber man kann höchstens 99 einstellen das ist zu wenig. gruß

Hallo zusammen,

ich habe das Bosch Smart Home System bei mir zu Hause verbaut. Mit Magnetkontakten werden Türen und Fenster überwacht.

Wenn ein Fenster länger als 10 Minuten geöffnet ist, bekomme ich eine Push-Nachricht

Frage:
Kann ich diese Push-Nachricht automatisch auf meine Echo dots als Sprachausgabe wiedergeben?
Die würde dann z.B. wie folgt heißen;

„Bitte das Badfenster schließen.‘

Die Alexapp bringt diese Meldung auch als Sprachausgabe, jedoch auch wenn in der Zwischenzeit das Badfenster wieder geschlossen ist.
Öffnet man dann z.b das Badfenster oder die Tür innerhalb der 10 Minuten mehrmals ertönt mehrmals die Nachricht für jede Türöffnung auch wenn die Tür wieder geschlossen sind. Das ist dann sehr störend.

Bosch Smart Home jedoch erkennt es, wenn das Fenster in der Zwischenzeit wieder geschlossen ist und bringt nur dann eine Benachrichtigung.

Dies Benachrichtigung bzw Push Meldung würde ich dann gerne auf Alexa hören.

Wäre klasse wenn das bei ihrer Iobroker umgesetzt werden könnte.

Vielen Dank
Frank

Ich habe mir ein ähnliches Blockly gebastelt und vorweg eine Routine mit der Antwort „Moment“ gestellt. Das funktioniert ganz gut, zumal Alexa jetzt den Eindruck erweckt nachzudenken und die Antwort kurze genug war, um ihr nicht „ins Wort zu fallen“. Leider hat sich das in den letzten Tagen von selbst geändert und zwischen „Moment“ und der Blockly-Antwort liegen jetzt ca. 15 Sekunden. Kann das jemand erklären?

Das Device stop in Blockly ist aktuell sinnlos und kann gelöscht werden.
Damit Alexa nicht antwortet scheint der Bereits beschriebene Weg (in der Alexa App das Kommando anlegen und die Aktion dazu dann löschen) der einzig zu sein der funktioniert.

Das Skript funktioniert bei mir nicht. Ich habe als suchtext „Testfrage“ eingegeben. Wenn ich Alexa mit „Testfrage“ anspreche kommt die Meldung „Ich weiß nicht, wie ich dir dabei helfen kann.“ In summary sehe ich, das Alexa Testfrage verstanden hat.

Ein zweites Skript, das nur den Befehl speak-Befehl enthält, funltioniert. Alexa meldet brav den vorgegebene Text.

Guten Morgen,
ich habe eben die Funktion „Lerne meine Stimme“ bei Alexa ausgeführt und Alexa kann mich jetzt namentlich benennen. Ich hatte Hoffnung, dass ähnlich wie bei dem hiesigen Projekt vielleicht ein Datenpunkt generiert werden würde, der die Benutzer-ID ausweist. Mit dieser hätte man dann eine Vielzahl von Funktionen realisieren können. Habe ich vielleicht einen übersehen oder ist dir bekannt, ob so etwas realisierbar ist?
Grüße
Marc

leider ist die Latenz bis sie im iobroker ankommt bei ca. 2 Sekunden mittlerweile. Daher kann der Ansatz glaube ich so nicht mehr realisiert werden.

Schreibe einen Kommentar