Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Cloud Dienste
    4. [SKRIPT] Alexa über ioBroker Steuern -> Kommandos an Alexa

    NEWS

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    • Save The Date: ioBroker@Smart Living Forum Solingen, 14.06.

    [SKRIPT] Alexa über ioBroker Steuern -> Kommandos an Alexa

    This topic has been deleted. Only users with topic management privileges can see it.
    • Z
      Zipkart last edited by

      Guten Abend.

      Ich habe heute geschafft meine neuen Echos der 2. Generation einzurichten und die Datenpunkte zu erstellen.

      Weiterhin hatte ich für Multiroom noch eine Gruppe Esszimmer erstellt.

      Das Skript findet auch diese Lautsprechergruppe aber sagt dass die ID unbekannt sei und deshalb keine Objekte Angelegt werden.

      Hat schon jemand herausgefunden wie man diese Gruppen als Gerät einfügen kann?

      Gruß Stefan

      IOBROKER MULTIHOST / MAX!/Homematic/Mysensors/Lightify/TRÅDFRI/Hue/Wemo/Tasmota/espeasy/…

      1 Reply Last reply Reply Quote 0
      • G
        gBonfire last edited by

        Hallo zusammen,

        bin mir nicht sicher, ob ich hier keinen Stilbruch begehe, aber bzgl. dieser Frage hätte ich zumindest einen Hinweis:


        ""Vollautomatik"

        Leider ist es mir nicht gelungen, sich mit Usernamen/Password gegenüber https://layla.amazon.de im Skript zu authentifizieren.

        Dann hätte man gar nichts mehr auslesen müssen und alles wäre automatisch gegangen.


        Hier "http://blog.loetzimmer.de/2017/10/amazo … -echo.html" ist es jemandem gelungen per Shellscript die Alexa fernzusteuern.

        Das ganze funktioniert soweit ich es auf die Kürze getestet habe ähnlich gut, wie dieses Script hier (vielen Dank dafür !!!).

        .

        Was mich allerdings am meisten beeindruckt hat ist, dass er wohl das "Cookie-Problem" gelöst hat.

        Man musste in das Script "nur" Benutzername und PW eintragen, den Rest macht das Script. Der Ganze Umweg über Chrome und das Problem der abgelaufenen Cookies fällt weg.

        Leider kann ich überhaupt nicht programmieren und somit kann ich keinen Hinweis darauf geben, welchen Lösungsansatz der Kollege verfolgt hat.

        Da müssen die Leute die schlauer sind als ich leider selbst schauen 🙂

        Grüße

        gBonfire

        1 Reply Last reply Reply Quote 0
        • lobomau
          lobomau last edited by

          @gBonfire:

          Hallo zusammen,

          bin mir nicht sicher, ob ich hier keinen Stilbruch begehe, aber bzgl. dieser Frage hätte ich zumindest einen Hinweis:


          ""Vollautomatik"

          Leider ist es mir nicht gelungen, sich mit Usernamen/Password gegenüber https://layla.amazon.de im Skript zu authentifizieren.

          Dann hätte man gar nichts mehr auslesen müssen und alles wäre automatisch gegangen.


          Hier "http://blog.loetzimmer.de/2017/10/amazo … -echo.html" ist es jemandem gelungen per Shellscript die Alexa fernzusteuern.

          Das ganze funktioniert soweit ich es auf die Kürze getestet habe ähnlich gut, wie dieses Script hier (vielen Dank dafür !!!).

          .

          Was mich allerdings am meisten beeindruckt hat ist, dass er wohl das "Cookie-Problem" gelöst hat.

          Man musste in das Script "nur" Benutzername und PW eintragen, den Rest macht das Script. Der Ganze Umweg über Chrome und das Problem der abgelaufenen Cookies fällt weg.

          Leider kann ich überhaupt nicht programmieren und somit kann ich keinen Hinweis darauf geben, welchen Lösungsansatz der Kollege verfolgt hat.

          Da müssen die Leute die schlauer sind als ich leider selbst schauen 🙂

          Grüße

          gBonfire `
          Das umständliche Suchen nach dem Cookie muss nicht mehr sein. Läuft wunderbar:

          http://forum.iobroker.net/viewtopic.php … gOn#p98493

          1 Reply Last reply Reply Quote 0
          • V
            VisionMaster last edited by

            Danke dir für die viele Arbeit,

            leider bekomme ich es bei mir nicht zum Laufen. Bekomme immer folgendne Fehler

            06:33:27.493	[info]	javascript.1 script.js.test.Alexa_Steuerung: deviceOwnerCustomerId: xxxxxxxxxxxxxxx
            06:33:27.493	[info]	javascript.1 script.js.test.Alexa_Steuerung: Anzahl der anzulegenden Datenpunkte: 47
            06:33:27.717	[info]	javascript.1 script.js.test.Alexa_Steuerung: --- Alexa Kommandos - Datenpunkte angelegt ---
            06:33:30.723	[info]	javascript.1 script.js.test.Alexa_Steuerung: --- Subscriptions angelegt ---
            06:33:32.827	[info]	javascript.1 script.js.test.Alexa_Steuerung: Kommando für: Stefans_Echo_Dot
            06:33:32.831	[info]	javascript.1 script.js.test.Alexa_Steuerung: Kommando: {"type":"PauseCommand"}
            06:33:32.831	[info]	javascript.1 script.js.test.Alexa_Steuerung: Data to request body: {"type":"PauseCommand"}
            06:33:32.832	[info]	javascript.1 script.js.test.Alexa_Steuerung: --- Alexa Kommandos - Skript initalisiert und bereit ---
            06:33:33.102	[info]	javascript.1 script.js.test.Alexa_Steuerung: Geräteyp: Echo Dot 2.Gen
            06:33:33.103	[warn]	javascript.1 script.js.test.Alexa_Steuerung: Negative Rückmeldung von Alexa: 404: ** Not Found ** (Kommando im Kontext des Geräts sinnvoll?)
            06:33:33.103	[warn]	javascript.1 script.js.test.Alexa_Steuerung: Gesendetes Kommando: {"type":"PauseCommand"}
            06:33:33.103	[warn]	javascript.1 script.js.test.Alexa_Steuerung: HEADERS: {"x-amzn-requestid":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","content-type":"application/json","content-length":"54","date":"Tue, 05 Dec 2017 05:33:33 GMT"}
            
            1 Reply Last reply Reply Quote 0
            • ruhr70
              ruhr70 last edited by

              Skript wg. der automatischen Cookie Abfrage von Stefan.Franke aktualisiert (1. Post), siehe:

              http://forum.iobroker.net/viewtopic.php … 237#p98493

              Echo 2. Generation und Sonos als bekannte Geräte hinzugefügt.

              1 Reply Last reply Reply Quote 0
              • B
                bz7i last edited by

                Moin, erstmal super Script. Danke [emoji6]

                Ist es denn auch möglich ausgewählte Musik abzuspielen?

                Z.B. Eine Playliste, Musik aus der eigenen Bibliothek oder bestimmte Titel/Alben ?

                Gesendet von iPhone mit Tapatalk

                1 Reply Last reply Reply Quote 0
                • lobomau
                  lobomau last edited by

                  @ruhr70:

                  Skript wg. der automatischen Cookie Abfrage von Stefan.Franke aktualisiert (1. Post), siehe:

                  http://forum.iobroker.net/viewtopic.php … 237#p98493

                  Echo 2. Generation und Sonos als bekannte Geräte hinzugefügt. `
                  Für zukünfte Script-Updates kannst du noch hinzufügen:

                  "A2M35JJZWCQOMZ":   "device":"Echo Plus"
                  "A2LWARUGJLBYEW":   "device":"Fire TV Stick V2"
                  

                  Ich habe eine Gruppe angelegt, die hat auch so eine Bezeichnung bekommen. Ich weiß nicht ob alle Gruppen diese Bezeichnung erhalten. Muss noch zweite Gruppe erstellen, um es zu testen:

                  "A3C9PE6TNYLTCH":   "device":"Erdgeschoss"
                  
                  1 Reply Last reply Reply Quote 0
                  • ruhr70
                    ruhr70 last edited by

                    @lobomau:

                    Für zukünfte Script-Updates kannst du noch hinzufügen:

                    "A2M35JJZWCQOMZ":   "device":"Echo Plus"
                    "A2LWARUGJLBYEW":   "device":"Fire TV Stick V2"
                    

                    Ich habe eine Gruppe angelegt, die hat auch so eine Bezeichnung bekommen. Ich weiß nicht ob alle Gruppen diese Bezeichnung erhalten. Muss noch zweite Gruppe erstellen, um es zu testen:

                    "A3C9PE6TNYLTCH":   "device":"Erdgeschoss"
                    ```` `  
                    

                    Danke 🙂

                    Ich habe die beiden Geräte in der 0.3.3 ergänzt (einzige Änderung).

                    Ich habe auch nur eine Gruppe (mit allen Geräten) und die erhält die gleiche Kennung wie bei Dir (A3C9PE6TNYLTCH).

                    Wäre mal interessant, wie sich die nächsten Gruppen unterscheiden.

                    1 Reply Last reply Reply Quote 0
                    • O
                      ooooli last edited by

                      Vielen Dank für die tolle Arbeit!

                      Es ist alles installiert (nach Anleitung von Seite 1, inklusive Cookie Script) und die Objekte mit meinen 4 Echos ist angelegt. Fürs erste möchte ich einen Sonoff Schalter dazu bewegen das Alexaradio im Bad einzuschalten.

                      Ich hab ein Problem mit dem dem Script:

                      Wahrscheinlich kein Thema: Die Mac Adressen und SSIDs unter infos sind mit "null" angegeben

                      Aber: Beim setzen von radio auf true im Objektebrowser (und über Script) gibt Last Status bzw. das Log 200, also ok zurück. Jedoch passiert nichts, alle Echos bleiben still. Bim ändern der Lautstärke tut sich auch nix.

                      Jemand eine Idee, wie man das noch debuggen könnte?

                      1 Reply Last reply Reply Quote 0
                      • sigi234
                        sigi234 Forum Testing Most Active last edited by

                        Hallo,

                        ich bekomme folgenden Fehler im Skript:

                        09:56:28.561 [info] javascript.0 Stop script script.js.Sigi.Alexa_mit_Javaskript

                        09:56:28.569 [info] javascript.0 Start javascript script.js.Sigi.Alexa_mit_Javaskript

                        09:56:28.569 [warn] javascript.0 at script.js.Sigi.Alexa_mit_Javaskript:119:19

                        09:56:28.569 [warn] javascript.0 at script.js.Sigi.Alexa_mit_Javaskript:124:14

                        09:56:28.569 [error] javascript.0 script.js.Sigi.Alexa_mit_Javaskript: TypeError: Cannot read property 'replace' of null

                        09:56:28.569 [error] javascript.0 at script.js.Sigi.Alexa_mit_Javaskript:125:16

                        Irgendetwas mache ich Falsch?

                        1 Reply Last reply Reply Quote 0
                        • phenomenumx
                          phenomenumx last edited by

                          Hi,

                          eine Bluetooth Connect und disconnect Funktion wäre noch toll.

                          /api/bluetooth/pair-sink/${DEVICETYPE}/${DEVICESERIALNUMBER}

                          siehe: http://blog.loetzimmer.de/2017/10/amazo … -echo.html

                          😉

                          1 Reply Last reply Reply Quote 0
                          • T
                            tcfigge last edited by

                            Hallo Sigi234.

                            Ich bekomme den selben Fehler….

                            Konntest Du es lösen?

                            EDIT: Selbst gelöst :idea:

                            Die ID´s mußten angepasst werden....

                            var idCookie = "javascript.0.Alexa.cookie";

                            var idCsrf = "javascript.0.Alexa.csrf";

                            Heißen bei mir anders....

                            Danke für das tolle Projekt!

                            Thorsten

                            1 Reply Last reply Reply Quote 0
                            • E
                              ebecker last edited by

                              Moin, ich bin neu im Forum und beim Thema Scripte im ioBroker.

                              Erst mal meinen besten Dank an Ruhr für das Script. Erst Gehversuche klappen schon mal.

                              Was mein Vorposter auch schrieb musste ich die Pfade anpassen zwischen deinem Script und dem LogonScript. Wäre super für andere Neulinge wenn ihr das angleichen würdet.

                              Kann ich dreister weise eine/zwei Featurewünsche äußern?

                              Schön fände ich wenn man Alexa Statusmeldungen übergeben könnte, so in der Art "Alexa, sag <string>", dadurch könnte man ein Feedback bekommen von der Dose.

                              Und wäre es möglich, dass man Alexa einen Sprachbefehl übergibt? Also das, was man sonst Alexa über das Micro mitteilt per Script übergeben. Z.B. "Alexa, schalte Wohnzimmerlicht an". Dann könnte man die Skills alle nutzten. Ich weiß nicht, ob die Schnittstelle das überhaupt her gibt.</string>

                              1 Reply Last reply Reply Quote 0
                              • M
                                Maragon last edited by

                                Hallo, ich habe mich heute mal etwas mit dem Skript beschäftigt und auf eigene Faust versucht die Bluetooth Verbindung hinzuzufügen. Dazu habe ich mich an dem Shuffle Command orientiert (boolean) und habe überall bei den Befehlen den Parameter bluetooth hinzugefügt. Leider bin ich programmiertechnisch sehr dürftig aufgestellt. Hat jemand einen Hinweise? Ich weiß, dass der notwendige Parameter pair-sink ist, habe jedoch keinen Plan wie und wo der eingefügt werden muss. Anbei mein geändertes Skript

                                ! ```
                                `// Alexa mit Javaskript in ioBroker steuern
                                // Skript arbeitet unabhängig vom Cloud Adapter
                                //
                                // Version: v0.3.3
                                // Author: ruhr70
                                //
                                // Skript im ioBroker Forum: http://forum.iobroker.net/viewtopic.php?f=37&t=6035&hilit=alexaCommand#p62006
                                //
                                // -----------------------------------------------------------------------------
                                // alexaCommand("arbeitszimmer","volume",70); // Alle Anwendungen
                                // alexaCommand("arbeitszimmer","pause"); // Radio, Spotify, Hörbücher
                                // alexaCommand("arbeitszimmer","play"); // Radio, Spotify, Hörbücher
                                // alexaCommand("arbeitszimmer","next"); // z.B. Spotify: nächstes Lied
                                // alexaCommand("arbeitszimmer","previous"); // z.B. Spotify: vorheriges Lied
                                // alexaCommand("arbeitszimmer","forward"); // z.B. Hörbücher: 30 Sekunden vor
                                // alexaCommand("arbeitszimmer","rewind"); // z.B. Hörbücher: 30 Sekunden zurück
                                // alexaCommand("arbeitszimmer","shuffle",true); // z.B Amazon Music, Shuffle ein in der aktuellen Playlist
                                // alexaCommand("arbeitszimmer","shuffle",false); // z.B Amazon Music, Shuffle aus in der aktuellen Playlist
                                // alexaCommand("arbeitszimmer","radio",true); // schaltet den Default tunein Radiosender an
                                // alexaCommand("arbeitszimmer","radio",false); // setzt Radio auf Pause
                                // alexaCommand("arbeitszimmer","tunein","s100198"); // setzt tunein Radio auf "s100198" (Einslive)
                                ! // Die Steuerung kann über die für jedes Gerät angelegten Datenpunkte erfolgen, z.B. über VIS
                                ! // erster Test des Skripts:
                                // Datenpunkt: javascript.0.alexa_device_command.devices.RAUMNAME.radio in den ioBroker Objekten auf true setzen: Radio sollte abgespielt werden
                                ! // Das Skript benötigt zwei individuelle Infomationen: Cookie und csrf
                                // diese können über das Skript von STefan.Franke automatisiert ausgelesen werden
                                // http://forum.iobroker.net/viewtopic.php?p=101553#p98493
                                ! // ----------------------------------------
                                // Infos und Resourcen zum Skript:
                                // Webseiten/URLs Request mit Fehlerbehandlung, siehe:
                                // http://forum.iobroker.net/viewtopic.php?f=21&t=4259&p=40890&hilit=request#p40880
                                // Alexa Steuerskripte:
                                // https://github.com/thorsten-gehrig/alexa-remote-control
                                ! // ---------------------------------------
                                // Tunein Radiosender:
                                // http://tunein.com/radio/Antenne-Düsseldorf-1042-s25772/
                                // s25772 -> Antenne Düsseldorf
                                ! // Liste einiger Sender:
                                // s25772 -> Antenne Düsseldorf
                                // s100198 -> Einslive
                                // s100183 -> WDR2 Rheinland
                                // s8007 -> Hitradio Ö3
                                ! // ---------------------------------------
                                // Changelog:
                                ! // 0.3.3 - Echo Plus ergänzt (danke an Lobomau)
                                // - FireTV Gen. 2 ergänzt
                                // 0.3.2 Cookie und csrf aus den Datenpunkten vom Skript von Stefan.Franke
                                // http://forum.iobroker.net/viewtopic.php?p=101553#p98493
                                // - Echo 2. Generation angelegt
                                // - Sonos angelegt
                                // 0.3.1 Fehlerkorrekturen
                                // 0.3.0 alle createState() mit Callback
                                // 0.2.0 Redesigne. Ale bekannten Alexa-Geräte werden nun ausgelesen. Keine manuelle Pflege nötig.
                                // (nur noch der Cookie und csrf müssen ausgelesen werden)
                                // 0.1.2 mediaOwnerCustomerId vom Skriptbereich in den individuellen Konfigurationsbereich verlegt
                                ! // ---------------------------------------
                                // TODOs:
                                ! // GET: fragt aktuellen Titel ab:
                                // path: '/api/np/queue?deviceSerialNumber=xxxxxxxx&deviceType=xxxxxxxxx',
                                ! // GET: fragt viele Statusinfo ab (Titel, Status, Volume, Muted, ...):
                                // path: '/api/media/state?deviceSerialNumber=xxxxxxxxxxxxx&deviceType=xxxxxxxxxx',
                                ! // prüfen: Statusänderungen abonieren?
                                ! // Alexa Objekt als Sicherung in DP ablegen
                                ! // deviceSerialNumber aus dem Array Echos auch als Datenpunkt anlegen
                                ! // erledigt:
                                //----------
                                // Authentifizierung mit User/PW möglich? Erhaltenen Cookie dann für die weitere Verwendung speichern
                                // -> mit dem Skript von Stefan.Franke
                                ! // ---------------------------------------
                                // bekannte Probleme:
                                ! // ein ungültiger Cookie lässt das Skript unter Umständen abstürzen
                                ! // Skriptverhalten:
                                var logOn = true; // Skript Logausgabe ein- (true) / ausschalten (false). Fehler werden unabhängig von dieser Einstellung ausgegeben.
                                var forecreation = false; // true: Datenpunkte werden überschrieben (wenn z.B. Bezeichnungen geändert wurden)
                                ! var pfad = "Alexa.Devices" +"."; // Pfad im Javascript-Adapter unter dem die Geräte angelegt werden sollen
                                ! var idCookie = "javascript.0.productive.alexalogon.cookie";
                                var idCsrf = "javascript.0.productive.alexalogon.csrf";
                                ! var defaultRadiostation = "s100198"; // Einslive - Default Radiostation für den Radio an Button.
                                ! // bis 0.3.1: Individuelle Daten, per Chrome Debug ermitteln, siehe Link in der Beschreibung oben:
                                // ab 0.3.2: Skript von Stefan.Franke, Cookie und csfr werdne aus dem Datenpunkten gelesen
                                ! //var csrf = 'xxxxxxxxxx';
                                var csrf = getState(idCsrf).val; // SKript von Stefan.Franke nötig, welches csrf ausliest
                                ! // cookie gilt für alle Devices
                                // var cookie = 'xxxxxxxxx gaaaanz langer String xxxxxxxxx';
                                ! var cookie = getState(idCookie).val; // SKript von Stefan.Franke nötig, welches den cookie ausliest
                                cookie = cookie.replace(/\/g, "");
                                ! // Liste der bekannten Devicetypen, Geräte mit bekannten DeviceType und "anlegen":true werden mit Steuermöglichkeit mit steuerbaren Datenpunkten angelegt
                                // hier muss nur was angepasst werden, wenn für andere Geräte auch Steuerdatenpunkte angelegt werden sollen
                                // oder wenn es ein Geräte gibt, welches hier nicht gepflegt ist
                                //
                                // Nicht gefundene Gerätetypen werden im Log ausgegeben "Gerätetyp (xxxxxxxxx) unbekannt. Keine Steuerungsmöglichkeit angelegt." -> XXXXXXXXXX hier im Array ergänzen
                                // wer es lieber manuell mag: Unbekannte Devicetypen können über STRG+Shift+I im Chrome (Entwicklermodus) abgefragt werden. Network auswählen und den Filter auf "Device" setzen. Auf Einstellunegn in der Alexawebseite klicken und den deviceTYpe raussuchen.
                                // siehe auch: https://beebom.com/how-to-set-up-and-use-amazon-echo-outside-us/ (/nur für die Chrome Einstellungen)
                                ! var knownDeviceType = {
                                "A3S5BH2HU6VAYF": {"device":"Echo Dot 2.Gen", "anlegen": true},
                                "AB72C64C86AW2": {"device":"Echo ", "anlegen": true},
                                "A7WXQPH584YP": {"device":"Echo 2.Gen", "anlegen": true},
                                "A15ERDAKK5HQQG": {"device":"Sonos", "anlegen": true},
                                "A2E0SNTXJVT7WK": {"device":"Fire TV V1", "anlegen": false},
                                "ADVBD696BHNV5": {"device":"Fire TV Stick V1", "anlegen": false},
                                "A2T0P32DY3F7VB": {"device":"echosim.io", "anlegen": false},
                                "AILBSA2LNTOYL": {"device":"reverb App", "anlegen": false},
                                "A2M35JJZWCQOMZ": {"device":"Echo Plus", "anlegen": false},
                                "A2LWARUGJLBYEW": {"device":"Fire TV Stick V2", "anlegen": false}
                                };
                                ! // -----------------------------------------------------------------------------
                                // ------------ Skript, ab hier nichts ändern --------------
                                // -----------------------------------------------------------------------------
                                ! var devicePfad = pfad + "devices" + "."; // Pfad unter dem die zu steuernden Geräte angelegt werden
                                var otherDevicePfad = pfad + "other_devices" + "."; // Pfad unter dem die
                                ! var mediaOwnerCustomerId; // CUSTOMERID wird aus der Geräteliste ausgelesen
                                var alexaDeviceObj = {}; // globales Objekt mit den Devices von Alexa abgefragt
                                var echos = {}; // globales Objekt echos mit allen zu steuernden Echos (echos = {"arbeitszimmer":{"deviceSerialNumber": "XXXXXXX", "deviceType":"A3S5BH2HU6VAYF"},...)
                                ! var https = require('https'); // Node Module https verwenden
                                ! var ok = true;
                                ! function setOptions(path,method) { // setzt die Options für den http/https Request
                                var options = {
                                "host": 'layla.amazon.de',
                                "path": path,
                                "method": method,
                                "timeout":10000,
                                "headers": {
                                'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
                                'Content-Type': 'text/plain',
                                'csrf' : csrf,
                                'Cookie' : cookie
                                }
                                };
                                return options;
                                }
                                ! function httpsReqGet(path,callback) {
                                if(logOn) log("Abfrage " + path + " an Alexa gesendet");
                                var options = setOptions(path,"GET");
                                var req = https.get(options, function getDevices(res) {
                                if(logOn) log('STATUS: ' + res.statusCode) + ": " + statusCode(res.statusCode); // Statuscode
                                if(logOn) log('HEADERS: ' + JSON.stringify(res.headers)); // Header (Rückmeldung vom Webserver)
                                // Buffer the body entirely for processing as a whole.
                                var bodyChunks = [];
                                var chunkLine = 0;
                                ! res.on('data', function(chunk) {
                                chunkLine = chunkLine + 1;
                                // Hier können die einzelnen Zeilen verarbeitet werden...
                                //if(logOn) log("Zeilennummer: " + chunkLine+ " ,Inhalt: " + chunk);
                                bodyChunks.push(chunk);
                                ! }).on('end', function() {
                                //if(logOn) log("ARRAY mit den einzelnen Zeilen: " + bodyChunks);
                                //if(logOn) log("ARRAY Länge: " + bodyChunks.length);
                                var body = Buffer.concat(bodyChunks);
                                // ...und/oder das Gesamtergebnis (body).
                                if(!body) log("keine Daten erhalten","warn");
                                if(logOn) log('BODY: ' + body);
                                ! if(callback !== undefined && typeof callback === 'function') return callback(null, body, dpAnlegen);
                                ok = false;
                                log("kein gültiger Callback angegeben","warn");
                                return log(body,"warn");
                                });
                                ! });
                                ! req.on('error', function(e) { // Fehler abfangen
                                log('ERROR: ' + e.message,"warn");
                                if(callback !== undefined && typeof callback === 'function') return callback(e.message, null);
                                log("keinen gültigen Callback gefunden","warn");
                                ok = false;
                                return log("error: " + e.message,"warn");
                                });
                                req.end();
                                }
                                ! function dpAbfrageAlexaAnlegen (err,result,callback) {
                                if (err) {
                                log("Abfrage der bekannten Devices bei Alexa mit Fehler","warn");
                                log("Error: " + err);
                                ok = false;
                                return log("Automatisches Anlegen/Aktualisieren von Datenpunkten mit Fehler abgebrochen","warn");
                                }
                                //TODO: Test (im if darüber: wenn error, dann prüfen, ob alte Daten vorhanden sind und diese laden: alexaDeviceObj & mediaOwnerCustomerId)
                                //log("###############: "+ getState(pfad+"_alexaDeviceObj").val);

                                if(!result) return log("Es konnten keine Daten ermittelt werden! Cookie richtig?","warn");
                                if(logOn) log(result);
                                alexaDeviceObj      = JSON.parse(result);
                                createState(pfad + "_alexaDeviceObj",     JSON.stringify(alexaDeviceObj),  true,  {name:"Object mit allen Devices",   type:"string",  role:"value"});
                                var numberOfDevices     = alexaDeviceObj.devices.length;
                                if(logOn) log("Anzahl vorhandener Geräte mit Alexa Unterstützung: " + numberOfDevices);
                                

                                ! if (numberOfDevices < 1) {
                                ok = false;
                                return log("Error: Skript konnte keine Geräte abfragen","warn");
                                }
                                ! mediaOwnerCustomerId = alexaDeviceObj.devices[0].deviceOwnerCustomerId; // Kundenindiviuelle Customer ID aus dem ersten Gerät entnehmen -> in vorbereitete globale Variable schreiben
                                createState(pfad + "_mediaOwnerCustomerId", mediaOwnerCustomerId, forecreation, {name:"Individuelle Kunden ID", type:"string", role:"value"});
                                ! var device;
                                var dpName;
                                for(var i = 0; i < numberOfDevices; i++) {
                                device = alexaDeviceObj.devices[i].accountName;
                                dpName = clearName(alexaDeviceObj.devices[i].accountName);
                                log("Gerät " + i + ": " + device+" - Datenpunktname: " + dpName);
                                alexaDeviceObj.devices[i].dpName = dpName;

                                    if(typeof(knownDeviceType[alexaDeviceObj.devices[i].deviceType]) != "undefined") {
                                        alexaDeviceObj.devices[i].anlegen = knownDeviceType[alexaDeviceObj.devices[i].deviceType].anlegen;
                                    } else {
                                        alexaDeviceObj.devices[i].anlegen = false;
                                        log(device + " : Gerätetyp ("+alexaDeviceObj.devices[i].deviceType+") unbekannt. Keine Steuerungsmöglichkeiten angelegt","warn");
                                    }
                                    //log(alexaDeviceObj.devices[i].anlegen);
                                }
                                

                                ! if(logOn) log("deviceOwnerCustomerId: " + mediaOwnerCustomerId);

                                if(callback !== undefined && typeof callback === 'function') {
                                    return null, callback(); // !!! weiter zu dpAnlegen
                                }
                                log("kein Callback");
                                return log("Skriptfehler: error: kein Callback","warn");
                                

                                }

                                ! function createStates(arr, func, cb) {
                                var doneCounter = 0;
                                arr.forEach(function alleDpBearbeiten(obj) {
                                func(obj.name, obj.initialValue, obj.forceCreation, obj.common, function () {
                                doneCounter += 1;
                                //if(logOn) log(doneCounter+": " + obj.name+" mit Wert: " + obj.initialValue + " ("+obj.common.type+") angelegt");
                                if (doneCounter === arr.length) {
                                cb(); // mit der Funktion (callback) geht es weiter, wenn alles erledigt ist
                                }
                                });
                                });
                                }
                                ! function createStateObj(arr,name,initialValue,forceCreation,common){
                                var obj = {
                                "name":name,
                                "initialValue":initialValue,
                                "forceCreation":forceCreation,
                                "common":common
                                };
                                return arr.push(obj);
                                }
                                ! function createStatesReady() {
                                log("--- Alexa Kommandos - Datenpunkte angelegt ---");
                                //setOn();
                                setTimeout(setOn, 3000);
                                }
                                ! function dpAnlegen() {
                                var dfSt = defaultRadiostation;
                                var fc = forecreation; //forecreation;
                                var deviceType,essid,macAddress,swVersion,deviceTypeTxt,capabilities;
                                var echo;
                                var dpArr = [];
                                // for (var echo in echos) {
                                for(var i = 0; i < alexaDeviceObj.devices.length; i++) {
                                var pfad = otherDevicePfad;
                                echo = alexaDeviceObj.devices[i].dpName;
                                if(alexaDeviceObj.devices[i].anlegen) {
                                pfad = devicePfad;
                                echos[echo] = {"deviceType":alexaDeviceObj.devices[i].deviceType,"deviceSerialNumber":alexaDeviceObj.devices[i].serialNumber};
                                createStateObj(dpArr,pfad + echo +".volume", 40, false, {name:"Volume (0-100)", type:"number", role:"control.value"});
                                createStateObj(dpArr,pfad + echo +".pause", false, fc, {name:"Pause", type:"boolean", role:"button"});
                                createStateObj(dpArr,pfad + echo +".play", false, fc, {name:"Play", type:"boolean", role:"button"});
                                createStateObj(dpArr,pfad + echo +".next", false, fc, {name:"Next (nächster Titel)", type:"boolean", role:"button"});
                                createStateObj(dpArr,pfad + echo +".previous", false, fc, {name:"Previous (vorheriger Titel)", type:"boolean", role:"button"});
                                createStateObj(dpArr,pfad + echo +".forward", false, fc, {name:"Forward (Hörbuch 30 Sekunden vor)", type:"boolean", role:"button"});
                                createStateObj(dpArr,pfad + echo +".rewind", false, fc, {name:"Rewind (Hörbuch 30 Sekunden zurück)",type:"boolean", role:"button"});
                                createStateObj(dpArr,pfad + echo +".shuffle", false, fc, {name:"Shuffel an/aus (true/false)", type:"boolean", role:"switch"});
                                createStateObj(dpArr,pfad + echo +".Last_Status","init", fc, {name:"Letzter Status", type:"string", role:"value"});
                                createStateObj(dpArr,pfad + echo +".radio", false, fc, {name:"Default Radiostation an/aus", type:"boolean", role:"switch"});
                                createStateObj(dpArr,pfad + echo +".tunein", dfSt, fc, {name:"tunein Radiosenderkennung", type:"string", role:"control.value"});
                                createStateObj(dpArr,pfad + echo +".bluetooth", false, fc, {name:"Bluetooth an/aus", type:"boolean", role:"switch"});
                                }
                                essid = alexaDeviceObj.devices[i].essid;
                                macAddress = alexaDeviceObj.devices[i].macAddress;
                                swVersion = alexaDeviceObj.devices[i].softwareVersion;
                                deviceTypeTxt = deviceTypeStr(alexaDeviceObj.devices[i].deviceType);
                                deviceType = alexaDeviceObj.devices[i].deviceType;
                                capabilities = JSON.stringify(alexaDeviceObj.devices[i].capabilities);

                                        createStateObj(dpArr,pfad + echo +"._info.device_type_str",  deviceTypeTxt,  true,   {name:"Amazon Echo Typ",            type:"string",      role:"value"});
                                        createStateObj(dpArr,pfad + echo +"._info.device_type",      deviceType,     fc,     {name:"Amazon Echo deviceType",     type:"string",      role:"value"});
                                        createStateObj(dpArr,pfad + echo +"._info.essid",            essid,          true,   {name:"SSID des WLANs",             type:"string",      role:"value"});
                                        createStateObj(dpArr,pfad + echo +"._info.macAddress",       macAddress,     fc,     {name:"MAC-Adresse des Echos",      type:"string",      role:"value"});
                                        createStateObj(dpArr,pfad + echo +"._info.softwareVersion",  swVersion,      true,   {name:"Softwareversion des Echos",  type:"string",      role:"value"});
                                        createStateObj(dpArr,pfad + echo +"._info.capabilities",     capabilities,   true,   {name:"Fähigkeiten des Echos",      type:"string",      role:"value"});
                                }
                                

                                ! if(logOn) log("Anzahl der anzulegenden Datenpunkte: " + dpArr.length);
                                createStates(dpArr, createState, createStatesReady);
                                }
                                ! function clearName(name){ // Sonderzeichen gegen Unterstrich ersetzen
                                name = umlaut(name);
                                name = name.replace(/\W/g,"_");
                                return name;
                                }
                                ! function httpsReqCmd(device,data) { // schickt an ein Alexa-Gerät (device) ein Kommando (data) per https-Request / Daten im Body
                                if(logOn) log("Kommando: " + data);
                                // Seriennummer und Gerätetyp anhand der Device-Bezeichnung ermitteln
                                var deviceSerialNumber = echos[device].deviceSerialNumber;
                                var deviceType = echos[device].deviceType;
                                var path = '/api/np/command?deviceSerialNumber='+deviceSerialNumber+'&deviceType='+deviceType;
                                if(JSON.parse(data).type == "tunein") {
                                var guideId = JSON.parse(data).station;
                                // path setzt eine Radiostation
                                path = '/api/tunein/queue-and-play?deviceSerialNumber='+deviceSerialNumber+'&deviceType='+deviceType+'&guideId='+guideId+'&contentType=station&callSign=&mediaOwnerCustomerId='+mediaOwnerCustomerId;
                                }
                                var options = setOptions(path,"POST");

                                // https Request für Alexa Kommandos:
                                var req = https.request(options, function(res) {
                                

                                ! if(logOn) log("Geräteyp: " + deviceTypeStr(deviceType)); // Name des Alexa/Amazon Gerätetyps als String ausgeben
                                setState(devicePfad + device +".Last_Status",res.statusCode.toString()+" " + statusCode(res.statusCode));
                                if(res.statusCode != 200) {
                                log("Negative Rückmeldung von Alexa: " + res.statusCode + ": " + statusCode(res.statusCode),"warn");
                                log("Gesendetes Kommando: " + data,"warn");
                                } else {
                                log('STATUS: ' + res.statusCode + ": " + statusCode(res.statusCode)); // Statuscode
                                }
                                if(logOn || res.statusCode != 200) log('HEADERS: ' + JSON.stringify(res.headers), (res.statusCode != 200 ? "warn" : "info")); // Header (Rückmeldung vom Webserver)
                                });

                                req.on('error', function(e) { // Fehler abfangen
                                    log('ERROR: ' + e.message,"warn");
                                });
                                

                                ! if(logOn) log("Data to request body: " + data);
                                // write data to request body
                                if(data) req.write(data);
                                req.end();
                                }
                                ! function umlaut(str) {
                                return str
                                .replace(/Â|À|Å|Ã/g, "A")
                                .replace(/â|à|å|ã/g, "a")
                                .replace(/Ä/g, "AE")
                                .replace(/ä/g, "ae")
                                .replace(/Ç/g, "C")
                                .replace(/ç/g, "c")
                                .replace(/É|Ê|È|Ë/g, "E")
                                .replace(/é|ê|è|ë/g, "e")
                                .replace(/Ó|Ô|Ò|Õ|Ø/g, "O")
                                .replace(/ó|ô|ò|õ/g, "o")
                                .replace(/Ö/g, "OE")
                                .replace(/ö/g, "oe")
                                .replace(/Š/g, "S")
                                .replace(/š/g, "s")
                                .replace(/ß/g, "ss")
                                .replace(/Ú|Û|Ù/g, "U")
                                .replace(/ú|û|ù/g, "u")
                                .replace(/Ü/g, "UE")
                                .replace(/ü/g, "ue")
                                .replace(/Ý|Ÿ/g, "Y")
                                .replace(/ý|ÿ/g, "y")
                                .replace(/Ž/g, "Z")
                                .replace(/ž/, "z");
                                }
                                ! function statusCode(status) { // gibt zum http-Status eine Rückmeldung als String
                                if(status === 0) return "** Daten unvollständig ** (csrf fehlt/falsch? Cookie falsch?)";
                                if(status == 200) return "** OK ";
                                if(status == 302) return "
                                Found (Moved Temporarily) ** (Cookie abgelaufen?)";
                                if(status == 401) return "** Unauthorized ** (Cookie nicht richtig gesetzt?)";
                                if(status == 403) return "** Forbidden ** (Kombination Cookie, deviceType, Seriennummer richtig?)";
                                if(status == 404) return "** Not Found ** (Kommando im Kontext des Geräts sinnvoll?)";
                                if(status == 500) return "** Internal Server Error** (ggf. Kommando im falschen Kontext verwendet?)";
                                return "Fehler";
                                }
                                ! function deviceTypeStr(deviceType){ // Anhand der Amazon Device Kennung wird ein String mit dem Typ als Namen zurückgeliefert
                                if(!knownDeviceType[deviceType] || knownDeviceType[deviceType] === undefined) return "Gerät unbekannt";
                                return knownDeviceType[deviceType].device;
                                }
                                ! function alexaCommand(device,cmd,parameter) { // Führt ein Kommando (cmd) an ein Alexa-Gerät (device) mit optionalen Parameter (parameter) aus
                                var data;
                                if(!echos[device] || echos[device] === undefined) return log("Kein gültiger Raum","warn");
                                if(logOn) log("Kommando für: " + device);
                                switch (cmd) {
                                ! case "volume":
                                if(!parameter ||parameter === null){
                                log("Alexa Volume: keine Lautstärke angegeben. Parameter fehlt.","warn");
                                break;
                                }
                                parameter = parseInt(parameter);
                                if(parameter < 0) {
                                parameter = 0;
                                log("Alexa Volume: ungültige Lautsträke angegeben (<0). Auf 0 gesetzt.","warn");
                                }
                                if(parameter > 100) {
                                parameter = 100;
                                log("Alexa Volume: ungültige Lautsträke angegeben (>100). Auf 100 gesetzt.","warn");
                                }

                                    httpsReqCmd(device,'{"type":"VolumeLevelCommand","volumeLevel":'+parameter+'}');
                                    break;
                                

                                ! case "pause":
                                httpsReqCmd(device,'{"type":"PauseCommand"}');
                                break;
                                ! case "play":
                                httpsReqCmd(device,'{"type":"PlayCommand"}');
                                break;
                                ! case "next":
                                httpsReqCmd(device,'{"type":"NextCommand"}');
                                break;
                                ! case "previous":
                                httpsReqCmd(device,'{"type":"PreviousCommand"}');
                                break;
                                ! case "forward":
                                httpsReqCmd('{"type":"ForwardCommand"}');
                                break;
                                ! case "rewind":
                                httpsReqCmd(device,'{"type":"RewindCommand"}');
                                break;
                                ! case "shuffle":
                                if(parameter === null){
                                log("Alexa Shuffle: kein true/false angegeben. Auf true gesetzt.","warn");
                                parameter = true;
                                }

                                    httpsReqCmd(device,'{"type":"ShuffleCommand","shuffle":'+parameter+'}');
                                    break;
                                

                                ! case "tunein":
                                httpsReqCmd(device,'{"type":"tunein","station":"'+parameter+'"}');
                                break;
                                ! case "bluetooth":
                                if(parameter === null){
                                log("Alexa bluetooth: kein true/false angegeben. Auf true gesetzt.","warn");
                                parameter = pair-sink;
                                }

                                    httpsReqCmd(device,'{"type":"bluetoothCommand","bluetooth":'+parameter+'}');
                                    break;
                                

                                ! default:
                                log("Kein bekanntes Kommando angegeben: "+cmd,"warn");
                                break;
                                }
                                }
                                ! // Subscriptions
                                // -----------------------------------------------------------------------------
                                ! function setOn() {
                                var reg = new RegExp("^javascript\."+instance+"\." + devicePfad.replace('.', '\.') + ".\.(volume|pause|play|next|forward|rewind|shuffle|tunein|radio|previous|bluetooth)");
                                on({"id":reg , "change": "any"}, function (obj) {
                                var objArr = obj.id.match(/(^.+).(.+).(.+)$/, ""); //Aufteilung in Pfad + Device + CMD
                                var device = objArr[2];
                                var cmd = objArr[3];
                                if(logOn) log("Device: " + device+", Kommando: " + cmd);
                                ! switch (cmd) {
                                case "radio":
                                if(obj.state.val) {
                                // default Radiostation einschalten
                                setState(devicePfad + device +".tunein",defaultRadiostation);
                                return;
                                } else {
                                // Musik auf Pause.
                                setState(devicePfad + device +".pause",true);
                                return;
                                }
                                break;
                                ! // Buttons, true zum auslösen. Werden danach wieder auf flase gesetzt
                                case "pause":
                                case "play":
                                case "next":
                                case "forward":
                                case "rewind":
                                case "previous":
                                if(getState(obj.id).val) setState(obj.id,false); // Button wieder auf false zurücksetzen, wenn er true war
                                if(obj.state.val) alexaCommand(device,cmd,true); // Kommando war ein true -> Kommando ausführen
                                break;
                                ! // Switches oder Wert
                                case "shuffle":
                                case "bluetooth":
                                case "volume":
                                case "tunein":
                                alexaCommand(device,cmd,obj.state.val);
                                break;
                                ! default:
                                log("Kommando << "+cmd+" >> im Skript nicht behandelt","warn");
                                break;
                                }
                                ! });
                                log("--- Subscriptions angelegt ---");
                                }
                                ! onStop(function skriptStop () {
                                log("
                                *** Skript wurde gestoppt ****");
                                }, 2000 /ms/);
                                ! // main
                                // -----------------------------------------------------------------------------
                                function main() {
                                //alexaCommand("arbeitszimmer","pause");
                                if (ok) {
                                log("--- Alexa Kommandos - Skript initalisiert und bereit ---");
                                } else {
                                log("--- Skript konnte nicht sauber initalisiert werden ---","warn");
                                }
                                }
                                ! // Start Skript:
                                // -----------------------------------------------------------------------------
                                ! log("--- Alexa Kommandos - Skript gestartet ---");
                                if(forecreation) log("Forcecreation ist eingeschaltet. Wenn nicht mehr benötigt, bitte im Skript auf false setzen","warn");
                                httpsReqGet('/api/devices/device',dpAbfrageAlexaAnlegen); // fragt bei Alexa die Devices ab und legt die Datenpunkte und dann die Subscriptions an
                                setTimeout(main, 7000); // startet main()
                                ! // alte Doku (manuelle Einrichtung)
                                ! // EINRICHTUNG:
                                ! // 1. cURL extrahieren, siehe
                                // https://www.gehrig.info/alexa/Alexa.html
                                //
                                // benötigt wird:
                                // je Gerät: deviceType, deviceSerialNumber // wird vom Skript automatisch ausgelesen)
                                // einmalig: csrf, cookie
                                //
                                // Der Cookie muss aus dem Trace mit tunein entnommen werden, damit er sowohl mit den Kommandos,
                                // als auch mit der Radiostation funktioniert. Es ist ein sehr langer String
                                // alles von: x-amzn-dat-gui-client
                                // bis alles vor dem nächsten -H Die Änderungen bei Cookie uns Csrf mussten bei mir übrigens wie folgt geändert werden, damit das Skript mit dem von Stefan Franke spricht ! >! ~~[spoiler]~~~~[code]~~var idCookie = "javascript.0.productive.alexalogon.cookie";
                                var idCsrf = "javascript.0.productive.alexalogon.csrf";[/code]`[/spoiler][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]

                                1 Reply Last reply Reply Quote 0
                                • A
                                  afroasiate last edited by

                                  Hallo Leute,

                                  das Script funktioniert bei mir gut, allerdings kann ich keine Echo Plus Geräte steuern. Echo Dot 2 funktionieren soweit gut.

                                  Es wäre echt klasse wenn dieses Script noch etwas erweitert werden könnte. Toll wäre ein Datenpunkt mit einem Link zum Cover des aktuellen Songs oder eine Info zum aktuell gespielten Song.

                                  Grüße

                                  Afro

                                  1 Reply Last reply Reply Quote 0
                                  • C
                                    Chaze last edited by

                                    Ein kleiner Wunsch, der großes bewirken würde:

                                    Lassen sich mit dem Script auch die am Echo Plus angelernten SmartHome Geräte auslesen und steuern?

                                    Falls ja, dann wäre der Echo Plus mit dem ioBroker ein universelles und voll nutzbares SmartHome Gateway.

                                    1 Reply Last reply Reply Quote 0
                                    • M
                                      Maragon last edited by

                                      Lesen die Profis gar nicht mehr mit? Ich bin leider mit meinem Bluetooth Problem noch nicht weiter gekommen. Kann hier jemand mit Skript Erfahrung unterstützen? Ich möchte ja gar nichts fertig auf dem Servierteller bekommen, sondern einen Hinweis wie ich es lösen könnte. Danke

                                      1 Reply Last reply Reply Quote 0
                                      • N
                                        neo4a last edited by

                                        Im 1. Post steht ja, dass derzeit noch keine Alexa-Zustände abgefragt werden können.

                                        Liegt das nun an der unzureichenden Alexa-API, weshalb man einfach nur abwarten muss, oder "nur" an der fehlenden Script-Implentierung und man kann ggf. unterstützen?

                                        Edit: Der Player unter https://layla.amazon.de/spa/index.html#player kann den aktuellen Abspiel-Zustand darstellen. Die Frage ist nun, ob man das auch per Script abfragen könnte.

                                        1 Reply Last reply Reply Quote 0
                                        • A
                                          Arnulf last edited by

                                          Geniale Sache. Denau danach hatte ich gerade gesucht.

                                          :!:

                                          Ich habe vor dem Ablauf der Skripts nur zwei Variablen anpassen müssen, da hier die Namen anders sind.

                                          Was ich beim Starten des Scripts bekomme, ist eine Warning, dass ein Gerätettyp nicht bekannt ist: A1DL2DVDQVK3Q

                                          Da habe ich mal Google angeworfen und folgende Seite gefunden:

                                          https://ideone.com/fork/ddQjBt

                                          Noch etwas:

                                          Die Echo Plus erscheint in "other_devices". Sollte die nicht lieber unter "devices" erscheinen?

                                          1 Reply Last reply Reply Quote 0
                                          • B
                                            bz7i last edited by

                                            Kann das sein, das daß die Alexa App ist?

                                            Gesendet von iPhone mit Tapatalk

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            1.0k
                                            Online

                                            31.6k
                                            Users

                                            79.4k
                                            Topics

                                            1.3m
                                            Posts

                                            82
                                            261
                                            71228
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo