Eigene Sprachausgabe über Alexa dank ioBroker

Ich möchte euch gerne zeigen wie ihr mit ioBroker und einem oder mehreren Amazon Echos eigene Sprachausgaben realisieren könnt.

Ich bin ein wirklich großer Amazon Echo Fan. Bereits kurz vor der offiziellen Einführung in Deutschland hatte ich mit einem Echo und einen Echo Dot gestartet und inzwischen sind noch ein Echo 2. Generation und ein Echo Show 1. Generation dazu gekommen. Morgen wird die Familie dann noch um ein 2.1 System aus zwei Echo Plus und einen Echo Sub erweitert.

Warum bin ich ein so ein großer Fan?

Wer sich mit Heimautomatisierung oder Smart Home beschäftigt hat wird mir sicher zustimmen. Mit „seinem Haus sprechen“ zu können bringt die ganze Geschichte auf das nächste Level. Was bringen mir Licht und Heizung die ich mit einer App auf dem iPhone schalten kann? Einfach in den Raum rufen was man gerne hätte fühlt sich da schon deutlich fortschrittlicher an.

Warum ausgerechnet Alexa?

Amazon war der erste Anbieter der seine Smart Speaker auf den deutschen Markt gebracht hat und konnte mich direkt überzeugen. Klar wäre Apple eigentlich meine erste Wahl gewesen, aber auch jetzt besitze ich noch keinen HomePod, da ich bereits zu stark ins Echo Universum investiert habe. Ich habe aber auch eine Sache stark zu schätzen gelernt, die Apple nicht bedienen möchte: Offenheit! Ich kann selbst wählen ob ich Amazon Music, Spotify oder Deezer auf meinen Echos verwenden möchte. Auf einem HomePod wäre ich auf Apple Music beschränkt. Letzteres läuft aber wiederum nicht auf den Echo Geräten. Genau aus dem Grund habe ich sogar vor zwei Monaten mein Apple Music Abo der ersten Stunde gekündigt und bin zu Spotify gewechselt. Neben meinen Echos habe ich noch ein paar Sonos Lautsprecher im Einsatz. Klar klingen die noch besser, sind aber eben auch total dumm. Immerhin kann ich sie mit Alexa über die Echos fernsteuern was mir in den meisten Fällen schon reicht. Ich muss jedoch zugeben, dass obwohl ein Sonos Play 5 im Esszimmer steht in letzter Zeit fast nur noch der Echo Show, welcher direkt daneben steht, für die Hintergrundbeschallung zum Einsatz kommt.

Die Echos klingen (bis auf den ersten Dot) wirklich OK. Klar, die Sonos Boxen klingen alle besser, sind aber eben auch deutlich teurer. Ich bin gespannt wie sich das 2.1 System im Vergleich zum Play 5 schlägt!

Update: das 2.1 System mit zwei Echo Plus 2.Gen und einem Echo Sub klingt fantastisch! Ich würde sagen es kommt an den Play 5 heran (der klingt in den Höhen noch etwas besser), ist deutlich günstiger und man hat halt Alexa. Ich habe eine Multiroom Gruppe mit dem 2.1 Sytem im Wohnzimmer und meinem Echo Show der 1.Gen im Esszimmer eingerichtet. Klingt unfassbar gut und man kann auf dem Display vom Show weiterhin sehen was gespielt wird.

Sprachausgabe mit Alexa

Zurück zum eigentlichen Thema: Eigene Sprachausgabe mit Alexa realisieren.

Voraussetzung ist, dass ihr ioBroker installiert habt und den Adapter „Alexa 2 (Amazon Echo) dort eingerichtet habt. Um mit Alexa eure Smarthome Geräte zu steuern benötigt ihr ausserdem noch den entsprechenden Alexa Skill „ioBroker“ und den Adaper „Cloud connection“- für die Sprachausgabe wäre dieser aber optional.

Ich werde in Zukunft gerne noch auf die Installation und Konfiguration von ioBroker eingehen heute setzte ich das aber einfach mal voraus.

Liste aller Echo Geräte

Unter der Liste der Objekten findet ihr nun einen Knoten „alexa2.0“ und dort den Knoten „Echo-Devices“. Klappt ihr einen der Knoten auf findet ihr den Knoten „Commands“ und einen Eintrag „speak“. Genau den benötigen wir für die Sprachausgabe. Die anderen Kommandos sind auch interessant und solltet mal etwas damit experimentieren.

Schreibt ihr nun per Script oder – das bietet sich zum Testen erstmal an – direkt über den Objekt-Browser einen Text in den Eintrag „speak“ wird dieser von Alexa direkt auf dem entsprechenden Echo wiedergegeben. So kann zum Beispiel ein Script einen Begrüssungstext sprechen wenn jemand nach Hause kommt, sagen wenn die Alarmanlage scharf geschaltet ist, warnen wenn noch Fenster geöffnet sind wenn ihr das Haus verlassen wollt, und, und, und. Es gibt natürlich auch andere TTS Systeme. Die sind aber meist deutlich aufwendiger was Installation und Konfiguration angeht und ich mag es wenn ich immer mit der selben Stimme angesprochen werde. Falls Alexa mal ausfällt habe ich eh ein Problem, daher ist das Thema „oh nein, das läuft ja in der Cloud“ für mich egal.

Was tun wenn man zu „viele Echos“ hat?

Manchmal möchte man vielleicht die Sprachausgabe einfach auf dem letzten aktiven Echo haben – ich habe zum Beispiel eigene Interaktionen gebaut die ich über Sprache auslöse und die dann natürlich auch auf der Box beantwortet werden sollen in die ich hineingesprochen habe. Hierfür habe ich ein kleines Script gebaut dass immer auf dem Echo mit dem zuletzt interagiert wurde die Sprachausgabe startet.

  • Als erstes wird der Adapter „Script Engine“ benötigt. Diesen einfach wie schon die anderen Adapter installieren.
  • Wir legen dann einen eigenes Objekt unterhalb des Knoten javascript.0 an. Wir nennen es alexaAntwort und den Typ stellen wir auf Zeichenkette.
  • Und hier das nötige Script in Blockly. Es überwacht das gerade angelegte Objekt, bei Änderungen schaut es nach welcher Echo als letztes aktiv war und gibt den Wert aus alexaAntwort auf diesem Echo aus.

Source Code

Scheinbar wurde dem Blockly-Editor nun ein Im- und Export Feature spendiert. Ihr könnt diesen XML-Code einfach kopieren und über die Import-Schaltfläche in ein neu angelegtes Blockly-Script importieren.

<xml xmlns="http://www.w3.org/1999/xhtml">
  <variables>
    <variable type="" id="SFXC$`0ng*{4~QEoleV3">aktiveAlexa</variable>
  </variables>
  <block type="on" id=";kQ,R3.9ra/RP*m5ennd" x="113" y="113">
    <field name="OID">javascript.0.alexaAntwort</field>
    <field name="CONDITION">any</field>
    <field name="ACK_CONDITION"></field>
    <statement name="STATEMENT">
      <block type="variables_set" id="(]W,[bxN%deuU6t8JXJ}">
        <field name="VAR" id="SFXC$`0ng*{4~QEoleV3" variabletype="">aktiveAlexa</field>
        <value name="VALUE">
          <block type="text_join" id="wqSMx4-%E21-3CgIm}k@">
            <mutation items="3"></mutation>
            <value name="ADD0">
              <block type="text" id="!p{,}x3CndnfMa0qnWn3">
                <field name="TEXT">alexa2.0.Echo-Devices.</field>
              </block>
            </value>
            <value name="ADD1">
              <block type="get_value" id="mQ+)oqwT,.3V*QPhAFj(">
                <field name="ATTR">val</field>
                <field name="OID">alexa2.0.History.serialNumber</field>
              </block>
            </value>
            <value name="ADD2">
              <block type="text" id="|tjrRS:gwL4$3UF?*|Z|">
                <field name="TEXT">.Commands.speak</field>
              </block>
            </value>
          </block>
        </value>
        <next>
          <block type="control_ex" id="ZdjGlXo?u$t0:Qx$sQy(">
            <field name="TYPE">false</field>
            <field name="CLEAR_RUNNING">FALSE</field>
            <value name="OID">
              <shadow type="field_oid" id="Z~yf$oFD1Sm#gX+f54dM">
                <field name="oid">Object ID</field>
              </shadow>
              <block type="variables_get" id="^,(*U8MIVbr~zc#n$BdD">
                <field name="VAR" id="SFXC$`0ng*{4~QEoleV3" variabletype="">aktiveAlexa</field>
              </block>
            </value>
            <value name="VALUE">
              <shadow type="logic_boolean" id="%`j-e?ZPM?N.@.F|h)xj">
                <field name="BOOL">TRUE</field>
              </shadow>
              <block type="get_value" id="h,lr+9A!~S`{@EI0uK^h">
                <field name="ATTR">val</field>
                <field name="OID">javascript.0.alexaAntwort</field>
              </block>
            </value>
            <value name="DELAY_MS">
              <shadow type="math_number" id="8(O;hbr%]97$nTl?3*lD">
                <field name="NUM">0</field>
              </shadow>
            </value>
          </block>
        </next>
      </block>
    </statement>
  </block>
</xml>

Für alle die lieber den generierten Javascript-Code direkt eingeben wollen habe ich diesen auch hier eingefügt:

var alexaF_C3_BCrSprachausgabe;


on({id: "javascript.0.alexaAntwort"/*alexaAntwort*/, change: "any"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  alexaF_C3_BCrSprachausgabe = ['alexa2.0.Echo-Devices.',getState("alexa2.0.History.serialNumber").val,'.Commands.speak'].join('');
  setStateDelayed(alexaF_C3_BCrSprachausgabe, getState("javascript.0.alexaAntwort").val, false, parseInt(0, 10), false);
});

 

10 Antworten auf „Eigene Sprachausgabe über Alexa dank ioBroker“

  1. Hi,
    mit großem Interesse bin ich auf dein Script gestossen,
    ich möchte auch gerne die Ansagen aus dem zuletzt erkannten Dot haben.
    Ich habe den Datenpunkt und das Script erstellt.
    Aber wie steuere ich denn jetzt die Variable alexaAntort

    1. Hallo Uwe,

      sobald du via anderem Script in diese Variable schreibst solltest du diesen Wert dann ausgegeben bekommen.

      Am einfachsten kann man es testen, indem man einfach über den Objekt-Browser den Wert der Variable setz.

      1. Hi Thorsten,
        Frohe Weihnachten wünsche ich dir.
        Danke für die Rückmeldung.
        Ich bin noch neu auf diesem Gebiet.
        Könntest du bitte ein Bespiel dafür geben?

        Ich möchte gerne den Zustand meines Garagentors abfragen.
        Dazu habe ich einen Datenpunkt angelegt, denn ich mit einer Alexa-Routine steuere. Und damit wird dann ein Script gesteuert, in dem dann der Zustand des Aktors abgefragt wird und entsprechende Ausgaben erfolgen (Tor auf/zu). Aber über den Speak-Datenpunkt.
        Dadurch ist ja das Ausgabegerät festgelegt. Eine Abfrage über einen anderen Dot im Haushalt geht, aber die Ausgabe erfolgt ja eben über diesen Dot. Und nicht über den zuletzt aktiven.

        Gruß
        Uwe

          1. Das war´s. War ja eigentlich simple.
            Musst halt in den Scripten den Speak-Datenpunkt auf den neuen alexaAntwort setzen/ändern.
            Schon geht´s.
            Hast du gemacht ?

            Was hast du denn noch so alles realisiert?

  2. Das klingt alles Spitze!
    Nur klappt es leider nicht.
    Habe alles so erstellt wie erklärt.
    Nur mein Javascript fragt nach dem speichern nicht nach Blockly konvertieren. Also habe ich das Blockly manuell erstellt und auch die Variable erstellt. Doch trage ich in alexaAntwort in Objekte etws ein, wird nicht angesaht und wie ich das Smart Gerät mit Alexa verknüpfen kann weiss ich somit auch nicht.

  3. Ein einfaches, aber effizentes Script, was einem das Handling mit den Echo Geräten super erleichtert.
    Ich maine natürlich das erstellen von Scripten mit Sprachausgabe an den Echos wo man/frau/inter fragt.
    Einfach Top Script

  4. Hi Thorsten

    Deine Infos haben mir super geholfen, allerdings funktioniert das ganze bei mir ohne den Script Engine Adapter.
    Außerdem habe ich den Teil „.Commands.speak“ aus der Variable weggelassen und erst bei der Objekt ID der Ausgabe angefügt, so kann ich die Variable mehrfach nutzen und zB auch „Commands.sound“ verwenden.

    Gruß
    Marian

Schreibe einen Kommentar zu Marian Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

%d Bloggern gefällt das: