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!