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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Cloud Dienste
  4. [SKRIPT] Alexa über ioBroker Steuern -> Kommandos an Alexa

NEWS

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

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

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

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

Geplant Angeheftet Gesperrt Verschoben Cloud Dienste
261 Beiträge 82 Kommentatoren 93.8k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • phenomenumxP Offline
    phenomenumxP Offline
    phenomenumx
    schrieb am zuletzt editiert von
    #50

    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 Antwort Letzte Antwort
    0
    • T Offline
      T Offline
      tcfigge
      schrieb am zuletzt editiert von
      #51

      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 Antwort Letzte Antwort
      0
      • E Offline
        E Offline
        ebecker
        schrieb am zuletzt editiert von
        #52

        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 Antwort Letzte Antwort
        0
        • M Offline
          M Offline
          Maragon
          schrieb am zuletzt editiert von
          #53

          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 Antwort Letzte Antwort
          0
          • A Offline
            A Offline
            afroasiate
            schrieb am zuletzt editiert von
            #54

            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 Antwort Letzte Antwort
            0
            • C Offline
              C Offline
              Chaze
              schrieb am zuletzt editiert von
              #55

              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 Antwort Letzte Antwort
              0
              • M Offline
                M Offline
                Maragon
                schrieb am zuletzt editiert von
                #56

                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 Antwort Letzte Antwort
                0
                • N Offline
                  N Offline
                  neo4a
                  schrieb am zuletzt editiert von
                  #57

                  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 Antwort Letzte Antwort
                  0
                  • A Offline
                    A Offline
                    Arnulf
                    schrieb am zuletzt editiert von
                    #58

                    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 Antwort Letzte Antwort
                    0
                    • B Offline
                      B Offline
                      bz7i
                      schrieb am zuletzt editiert von
                      #59

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

                      Gesendet von iPhone mit Tapatalk

                      1 Antwort Letzte Antwort
                      0
                      • A Offline
                        A Offline
                        Arnulf
                        schrieb am zuletzt editiert von
                        #60

                        @bz7i:

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

                        Gesendet von iPhone mit Tapatalk `

                        Weiß ich noch nicht. Ich habe noch nicht im Detail ausprobiert.

                        Allerdings findet man im o.g. Link folgende Tabelle:

                        .put("A3F1S88NTZZXS9", "Rio:1.0") // Palomino Wifi device

                        .put("A1DL2DVDQVK3Q", "AMAZON_MUSIC:1.0") // Amazon Music Android

                        .put("A2825NDLA7WDZV", "AMAZON_MUSIC:1.0") // Amazon Music iOS

                        .put("ATH4K2BAIXVHQ", "AMAZON_MUSIC:1.0") // Amazon Music Grover

                        .put("A31ANRUHT2I2JF", "AMAZON_MUSIC:1.0") // Amazon Music Canary

                        .put("A2IVLV5VM2W81", "Vox:1.0") // Alexa Mobile Voice iOS

                        .put("A2TF17PFR55MTB", "Vox:1.0") // Alexa Mobile Voice Android

                        Ach ja: müsste in Zeile 146 statt

                            "A2M35JJZWCQOMZ":   {"device":"Echo Plus",          "anlegen": false},
                        
                        

                        nicht besser

                            "A2M35JJZWCQOMZ":   {"device":"Echo Plus",          "anlegen": true},
                        
                        

                        stehen?

                        Vielleicht noch ein interessanter Link?

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

                        1 Antwort Letzte Antwort
                        0
                        • B Offline
                          B Offline
                          bz7i
                          schrieb am zuletzt editiert von
                          #61

                          Genau, das ist deine Amazon Musik Android App. Das ist so alles Korrekt.

                          Gesendet von iPhone mit Tapatalk

                          1 Antwort Letzte Antwort
                          0
                          • A Offline
                            A Offline
                            Arnulf
                            schrieb am zuletzt editiert von
                            #62

                            habe gerade gesehen:

                            Gibt es einen neuen Link?

                            https://layla.amazon.de/api/devices-v2/device?cached=true&_=xxxxxxxxx
                            
                            1 Antwort Letzte Antwort
                            0
                            • N Offline
                              N Offline
                              nathan1312
                              schrieb am zuletzt editiert von
                              #63

                              ` > Vielleicht noch ein interessanter Link?

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

                              Wie cool ist das denn! Hier wird unter anderem beschrieben wie man bluetooth-Verbindungen aufbauen kann.

                              @Ruhr70: Kannst du das noch in dein Script integrieren? Bitte! 😉

                              Gesendet von meinem SM-G950F mit Tapatalk

                              1 Antwort Letzte Antwort
                              0
                              • M Offline
                                M Offline
                                Mathias-Niehues
                                schrieb am zuletzt editiert von
                                #64

                                Hallo,

                                ich habe gerade gesehen, das man darüber auch gezielte TrackIDs abspielen kann.

                                Damit müsste dann eine Benachrichtigung über Alexa möglich sein, wenn man Passende Soundfiles hochlädt. Könnte das jemand in das Script integrieren?

                                Viele Grüße

                                Mathias

                                1 Antwort Letzte Antwort
                                0
                                • A Offline
                                  A Offline
                                  Arnulf
                                  schrieb am zuletzt editiert von
                                  #65

                                  und um vielleicht noch einmal eins drauf zu setzen:

                                  als ich beim Anzeigen meiner Smart-Home-Geräte folgenden Link ermittelt habe, ist ganz viel ausgegeben worden….

                                  https://layla.amazon.de/api/phoenix?_=
                                  

                                  jetzt habe ich die Ausgabe noch nicht formatiert, aber kann es sein, dass ich hier die Möglichkeit habe, an die von Alexa bekannten Skills/Geräte-IDs komme?

                                  (Ihr müsst wahrscheinlich parallel gerade in Alexa-Web eingeloged sein)

                                  etwas weiter gegraben habe ich folgenden String extrahiert:

                                  amzn1.HomeAutomation.ApplianceGroup.
                                  

                                  diesen habe ich in Google gesucht und folgendes Projekt gefunden:

                                  https://www.hackster.io/awshome/awshome … iot-a3d3dc

                                  Was hier steht, sieht für mich unglaublich spannend und nützlich aus.

                                  ABER: Hier weiß ich leider noch viel zu wenig über die Technik und muss das Handtuch werfen.

                                  Vielleicht schaut sich das ja mal jemand an, der mehr weiß und kann daraus etwas zaubern?

                                  1 Antwort Letzte Antwort
                                  0
                                  • T Offline
                                    T Offline
                                    tempestas
                                    schrieb am zuletzt editiert von
                                    #66

                                    Guten morgen,

                                    bräuchte bitte Hilfe.

                                    Habe das Skript von Stefan Franke genutzt, crsf und cookie werden eingelesen.

                                    In ruhr70s Skript habe ich dann die cookie und crsf id abgeändert auf die durch das Franke Skript angelegten Datenpunkte.

                                    Wenn ich es dann starte, sagt das Log, dass in Zeile 125 ein Fehler sei.

                                    Dort wird der cookie nochmal bereinigt um Sonderzeichen. Diese werden aber auch schon im Franke skript bereinigt. Daher sagt das Alexa Skript "cannot …. of null".

                                    Also auskommentiert. Dann erhalte ich das untenstehende und meine JS Instanz startet sich neu

                                    host.iobrokerNUC	2018-01-20 10:36:10.397	error	instance system.adapter.javascript.0 terminated with code 6 (uncaught exception)
                                    host.iobrokerNUC	2018-01-20 10:36:10.397	error	Caught by controller[0]: at process._tickCallback (internal/process/next_tick.js:104:9)
                                    host.iobrokerNUC	2018-01-20 10:36:10.397	error	Caught by controller[0]: at _combinedTickCallback (internal/process/next_tick.js:80:11)
                                    host.iobrokerNUC	2018-01-20 10:36:10.396	error	Caught by controller[0]: at endReadableNT (_stream_readable.js:974:12)
                                    host.iobrokerNUC	2018-01-20 10:36:10.396	error	Caught by controller[0]: at IncomingMessage.emit (events.js:185:7)
                                    host.iobrokerNUC	2018-01-20 10:36:10.396	error	Caught by controller[0]: at emitNone (events.js:91:20)
                                    host.iobrokerNUC	2018-01-20 10:36:10.396	error	Caught by controller[0]: at IncomingMessage. (script.js.common.Amazon.Alexa:212:81)
                                    host.iobrokerNUC	2018-01-20 10:36:10.396	error	Caught by controller[0]: at dpAbfrageAlexaAnlegen (script.js.common.Amazon.Alexa:243:32)
                                    host.iobrokerNUC	2018-01-20 10:36:10.396	error	Caught by controller[0]: at Object.parse (native)
                                    host.iobrokerNUC	2018-01-20 10:36:10.395	error	Caught by controller[0]: SyntaxError: Unexpected end of JSON input
                                    javascript.0	2018-01-20 10:36:08.954	error	SyntaxError: Unexpected end of JSON input at Object.parse (native) at dpAbfrageAlexaAnlegen (script.js.common.Amazon.Alexa:243:32) at IncomingMessage. (script.js.common.Amazon.A
                                    javascript.0	2018-01-20 10:36:08.954	error	uncaught exception: Unexpected end of JSON input
                                    

                                    <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

                                    1 Antwort Letzte Antwort
                                    0
                                    • sigi234S Online
                                      sigi234S Online
                                      sigi234
                                      Forum Testing Most Active
                                      schrieb am zuletzt editiert von
                                      #67

                                      Hallo,

                                      hab es bei mir hingekriegt, habe aber auch lange daran gefeilt.

                                      Was brauchst du von mir bzw. sende Fotos von den Einstellungen.

                                      2858_screenshot__149_.png

                                      // Einrichtung:

                                      // 1. User und Passwort (und wenn konfiguriert, 2FA Code) eintragen.

                                      //

                                      // WARNUNG: Die Login-Daten sollten nicht in diesem Script gespeichert werden,

                                      // sondern nur für die einmalige Ausführung eingetragen werden. Sobald

                                      // das Cookie in dem Datenpunkt erzeugt ist, sollten die Eingaben in

                                      // den beiden folgenden Felder wieder gelöscht werden.

                                      // Erst bei der nächsten Ausführung (z.B. wenn das Cookie

                                      // abgelaufen ist) sollten sie wieder neu eintragen werden.

                                      var username = ""; hast du das Richtig eingetragen?

                                      var password = ""; hast du das Richtig eingetragen?

                                      var twofacode = "";

                                      Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                                      Immer Daten sichern!

                                      1 Antwort Letzte Antwort
                                      0
                                      • haselchenH Offline
                                        haselchenH Offline
                                        haselchen
                                        Most Active
                                        schrieb am zuletzt editiert von
                                        #68

                                        @starter

                                        Hammer Screenshot.

                                        Magst Du mir/uns Punkt für Punkt auflisten , wie Du zu diesem Endergebnis gekommen bist?

                                        Ich habe leider 0,0 Ahnung vom Programmieren, ich bin mehr der "Arbeiten nach Anleitung Typ" :roll:

                                        Synology DS218+ & 2 x Fujitsu Esprimo (VM/Container) + FritzBox7590 + 2 AVM 3000 Repeater & Homematic & HUE & Osram & Xiaomi, NPM 10.9.4, Nodejs 22.21.0 ,JS Controller 7.0.7 ,Admin 7.7.19

                                        1 Antwort Letzte Antwort
                                        0
                                        • T Offline
                                          T Offline
                                          tempestas
                                          schrieb am zuletzt editiert von
                                          #69

                                          Hallo sigi234,

                                          vielen Dank für dein Hilfsangebot.

                                          Das Skript von Stefan Franke macht keine Probleme, alles läuft und ist aktiv.

                                          Das Problem taucht im hier diskutierten Skript von ruhr70 an den besagten Stellen auf und ich weiß nicht, waurm.

                                          <size="85">ioBroker | 21 Adapter | Ubuntu Server | intel NUC | Homematic CCU2 | Hue | Osram Lightify| Sonos | 2x Instar Cam | Samsung Tab A 2016 im Holzrahmen| 3x Echo dot | 1x Echo | Neato Botvac D5</size>

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


                                          Support us

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

                                          490

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

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

                                          • Du hast noch kein Konto? Registrieren

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