NEWS
[gelöst] Ein- und Ausschalten mittels HTML-Req. und Alexa
-
Hallo,
Ich versuche seit ein paar Tagen mir mit vielen Beiträgen aus dem Forum hier eine Lösung für mein "Problem" zu basteln.
Ich möchte meinen Denon AVR mittels HTML-Requests ein- und ausschalten inkl. Alexaeinbindung. Das habe ich soweit hingekriegt, mit diesem Codeschnipsel:
var logOn = true; // Skript Logausgabe ein- (true) / ausschalten (false). Fehler werden immer ausgegeben. var forecreation = false; // Default: false. true: Datenpunkte werden überschrieben (wenn z.B. Bezeichnungen geändert wurden) var http = require('http'); // Node Module http verwenden var options_on = { host: '192.168.2.102', path: '/goform/formiPhoneAppPower.xml?1+PowerOn', method: 'GET' // in der Regel: "GET" }; var pfad = "test.alexatrigger" + "."; // PFad unter dem in der Javascript-Instanz die Datenpunkte angelegt werden sollen: // Datenpunktnamen: var idAlexaTrigger = pfad + 'alexa_trigger'; createState(idAlexaTrigger, 0, forecreation, { name: 'Trigger für Alexa', desc: 'Trigger mit Level für Alexa um einen hhtp request zu erzeugen', type: 'number', unit: '', role: 'value' }); // Funktionen: function webseiteAbfragen() { var req = http.get(options_on, function(res) { if(logOn) log('STATUS: ' + 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; if(logOn) log("Zeilennummer: " + chunkLine+ " ,Inhalt: " + chunk); // Hier können die einzelnen Zeilen verarbeitet werden... 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); if(logOn) log('BODY: ' + body); // ...und/oder das Gesamtergebnis. }); }); req.on('error', function(e) { // Fehler abfangen log('ERROR: ' + e.message,"warn"); }); } // SUBSCRIPTIONS // ----------------------------------------------------------------------------- on({id: "javascript."+instance+"."+idAlexaTrigger ,change:'any'}, function (obj) { if(logOn) log("Alexa Trigger wurde geschrieben: " + obj.state.val); main(); });
bzw. der Variable
var options_off = { host: '192.168.2.102', path: '/goform/formiPhoneAppPower.xml?1+PowerStandBy', method: 'GET' // in der Regel: "GET" };
zum Ausschalten.
Leider springt das Script "Einschalten" nicht auf aus, wenn ich "Ausschalten" triggere und andersrum. Sprich um erneut "Einzuschalten" muss ich derzeit das Script erst beenden, damit ich es erneut starten kann.
Hab schon ein wenig rumprobiert (if-else mit Statusauslesen bzw. Variable, die hochzählt bzw. zurückgesetzt wird, anhand derer entschieden werden soll, ob eben ein oder ausgeschaltet wird), aber so richtig geklappt hat nichts.
Am elegantesten wäre es, dass ich das Script "AVR" nenne und die jeweilge Variable ("options_on" oder "options_off") verwendet wird, ob ich die Script starte oder beende.
Hat jemand ne Idee, wie man das in Javascript bzw. im ioBroker lösen kann?
Vielen Dank schon mal vor ab!
-
Ohne die genaue Funktion im IoBroker zu kennen würde ich eine Variable setzen die „Status“ oder so heißt und bestimmt ob an oder ausgeschaltet ist.
Am besten natürlich vorher den Status des Denon AVR abfragen ob er grade an oder aus ist.
http://blue-pc.net/2013/12/28/denon-av- … p-steuern/
Weiß nicht ob das dein Receiver ist aber hier sind ja verschiedene Abfragewerte beschrieben.
Und je nach Status entsprechend den Status umsetzen und ggf. Nochmal abfragen ob er auch wirklich den Status gewechselt hat.
-
Hi,
diese HTML-Befehle sollten alle funktionieren (daher habe ich auch den TurnOn- und TurnOff-Befehl "geklaut"). Hab einen Denon X1200-AVR.
Der Ansatz mit der Status-Abfrage ist auch sehr interessant - dann würde er je nach dem Zustand des AVR handeln. Danke für diese Idee!
Vielleicht verstehe ich das Ein- und Ausschalten eines Scripts auch total falsch: Wenn ich Alexa sage "Schalte Script ein" dann sollte ja das Script starten (auf "Grün" wechseln), und bei "Schalte Script aus" auf rot wechseln. Soweit richtig?
Nur wie schaffe ich es, dass er beim diesem "Statuswechsel" eine jeweils andere Funktion (Turn_On oder Turn_Off) ausführt?
-
Alexa Anbindung kenne ich mich nicht aus…
Oder du machst zwei Skripte und zwei Aktionen in Alexa. Also „Alexa receiver an“ startet das an Skript und
„Alexa receiver aus“ das Aus Skript.
Das mit der Statusabfrage verhindert besonders das jemand manuell ausgeschalten hat und dein Status im iobroker ist noch auf an.
-
Hallo,
Okay, durch Alexa wird das Script immer neu ausgeführt, d.h. ich hab deinen Rat einfach mal ausprobiert und für den Ein- und Ausschaltvorgang jeweils ein Script angelegt.
-> Funktioniert perfekt
Dankeschön!
Nächster Schritt wäre jetzt noch, dass sich der Echo Dot automatisch mit dem AV-Receiver über BT verbindet. Sollte ich das hinkriegen, stelle ich mein Script hier zur Verfügung.
Danke nochmals für die Hilfe!
-
Nächster Schritt wäre jetzt noch, dass sich der Echo Dot automatisch mit dem AV-Receiver über BT verbindet. Sollte ich das hinkriegen, stelle ich mein Script hier zur Verfügung.
Danke nochmals für die Hilfe! `
Kann man das nicht im Echo dot einstellen? Aber dann ist der Receiver glaube ich immer verbunden als Ausgabegerät.
-
Ich nutze den Receiver nicht nur zur Musikwiedergabe über den Dot, sondern auch für Fernsehen, Konsole etc.
Ich denke, wenn ich den Receiver auf BT stelle (Klappt schon über den ioBroker :)), dass sich der Echo dann nicht automatisch damit verbinden wird, oder?
Und jedes Mal noch "Alexa, koppeln" o.ä. sagen wäre ja zu einfach.
-
Guten Abend,
nachdem mein obiges Vorhaben soweit funktioniert, meine nächste Herausforderung: Ich möchte über Alexa die Lautstärke des AVR steuern. In einem anderen Thread hier im Forum (viewtopic.php?t=5580) hat jemand schon ein funktionierendes Script gepostet. Ich hab es entsprechend auf meinen Denon angepasst (IP-Adresse und HTML-Req), aber es scheint nicht zu reagieren:
var http = "http://192.168.x.xxx/goform/formiPhoneAppVolume.xml?1+-"; on({id: "javascript.0.AV-Power", change: "any"}, function (obj) { var x = obj.state.val; if (x === 0) { require("request")(http + 'off'); // Bei Befehl "aus" wird Vol. auf Mute gesetzt. console.log("Lautstärke AVR-X1200 auf -MUTE- gesetzt."); } else { x = 80 - x; require("request")(http + x); console.log("Lautstärke AVR-X1200 auf " + x + " gesetzt."); }});
Zu der Zeile
x = 80 - x;
ist zu sagen: Die Werte müssen als db-Wert übergeben werden. Soll die Lautstärke auf Stufe 50 (von 100) gesetzt werden, muss dafür -30db gesetzt werden –> "Alexa, Boxen auf 50%" --> x = 80 - 50 = 30db
Der Adapter sollte richtig konfiguriert sein, zumindest war er so im o.g. eingestellt (siehe Anhang)
Vielleicht kann mir ein Experte einen Rat geben
Vielen Dank!
5708_asd.png