Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
wie du siehst baller ich die payload in den parameter json, das wird wohl so von cherrpy erwartet.
und ich bin jetzt uebrigens stuck ohne echo oder dot, da alexa.amazon.de sich weigert mich den skill einrichten zu lassen, weil meine spracheinstellungen auf deutsch geändert werden müssten. ich hab nur keine moeglichkeit das zu aendern. lt amazon support braucht man dafuer einen echo oder echo dot und ich hab noch keinen
Ja das kann ich bestätigen. Ich habe einen Dot und kann das einrichten. Ich habe die OAuth erfolgreich verbunden und wenn ich auf discover Devices klicke kommen eben die oben erwähnten Fehler.
Okay das ist ein ziemlich cooler weg das zu machen. Poste mal bitte deine Lambda Funktion ohne Options natürlich Dann kann ich die mit meiner vergleichen. Oder ist das im alexa branch die aktuellste Version?
wie du siehst baller ich die payload in den parameter json, das wird wohl so von cherrpy erwartet.
und ich bin jetzt uebrigens stuck ohne echo oder dot, da alexa.amazon.de sich weigert mich den skill einrichten zu lassen, weil meine spracheinstellungen auf deutsch geändert werden müssten. ich hab nur keine moeglichkeit das zu aendern. lt amazon support braucht man dafuer einen echo oder echo dot und ich hab noch keinen
Okay ich glaube das ist jetzt die richtige Gelegenheit für diese Frage. Wenn ich also in meinem /usr/local/smarthome bin. Wie kann ich aus deinem branch "alexa" den ./plugin/alexa rauspullen? Ich checke git einfach so gar nicht muss ich mal offen gestehen.
Zudem was meintest du soll ich an der payload ändern? Kann dir nicht ganz folgen.
ja, das ist dieser bescheidene cherrypy automatismus. schau mal in meine aws_lambda.js, da poste ich die payload an den parameter json. der wird leider von cherrypy so erwartet.
ansonsten mach mal ein pull, da waren noch ein dutzend bugs drin
Danke hotzen für das Teilen deines Codes. Ich schau mir das mal an. Nach dem ersten Überfliegen würde ich sagen hast du genau das programmiert, was ich gerne gemacht hätte. Dafür war ich wohl nicht klug genug ^^
hab nen plugin geschrieben, kannst ja parallel schauen ob du es zum laufen bekommst.
das setup mit dem amazon skill und skill-enabling in der app ist ja wahnsinnig kompliziert...
hab nen plugin geschrieben, kannst ja parallel schauen ob du es zum laufen bekommst.
das setup mit dem amazon skill und skill-enabling in der app ist ja wahnsinnig kompliziert...
Noch sind wir nicht am Ende angekommen. Ich bin von einem release fähigen Stand noch weit entfernt. Wenn auch dieser Durchbruch schonmal der Grundstein für das ganze Vorhaben ist. Ich glaube wir können hier was sehr gutes erreichen.
So heute war endlich mein Echo Dot in der Post. Ich habe den Skill mit dem Gerät verknüpft. Und siehe da, das funktioniert!
Ich musste nur noch eine Anpassung machen. Der Skill benötigt eine OAuth Routine, damit das Gerät mit einem Konto verknüpft werden kann. Ich habe mich an diese Anleitung gehalten und habe Amazon selbst als OAuth provider verwendet: http://stackoverflow.com/questions/3...ted-home-skill
Einziges Problem! Alexa erkennt zwar Geräte und schaltet sie auch. Allerdings liefert sie als Antwort, dass der Befehl für das angegebene Gerät nicht funktioniert. Was gelogen ist, weil es sehr wohl funktioniert.
So Zwischenstatus! Ich habe es hinbekommen mithilfe des Network Plugin als Schnittstelle zu SmartHomeNG und mit der angepassten php App aus dem Edomi Forum meine Lampen zu schalten. Was nicht geht ist dimmen. Ich habe auch rausgefunden warum. Die Kumpels von Edomi können via deren API abfragen welchen Wert eine Lampe/Heizung gerade hat. Dann verrechnen die im Falle eines "IncreasePercentage" Events (also hochdimmen) den alten Wert und fügen einfach sagen wir mal 10 hinzu.
Da das Network Plugin aber offenbar nur schalten kann und nicht abfragen wird es wohl vorerst nur bei Lampen an und aus bleiben. Mehr werden wir wohl nicht hinbekommen, bis wir sämtliche Komponenten (Network Plugin, Alexa PHP App, ...) angepasst haben.
Wer mal die "Alpha" testen will kann folgendes tun. Webserver mit Zertifikatsauth einrichten und durch den Router schleifen (setze ich jetzt für die Alpha mal voraus, ein Developer bekommt das schon hin).
AWS und developer Account machen bei Amazon (Ist auch alles beschrieben im verlinkten EDOMI Thread).
Dann folgenden Code in einem Texteditor speichern als index.js:
Code:
const PORT=xxxx;
const HOST='domain.de';
// namespaces
const NAMESPACE_CONTROL = "Alexa.ConnectedHome.Control";
const NAMESPACE_DISCOVERY = "Alexa.ConnectedHome.Discovery";
// errors
const ERROR_TARGET_OFFLINE = "TargetOfflineError";
const ERROR_UNSUPPORTED_OPERATION = "UnsupportedOperationError";
const ERROR_UNEXPECTED_INFO = "UnexpectedInformationReceivedError";
// entry
exports.handler = function (event, context, callback) {
log("Received Directive", JSON.stringify(event));
var postData = JSON.stringify(event);
fs = require('fs');
var options = {
hostname: HOST,
port: PORT,
//family: 6,
rejectUnauthorized: false,
path: '/alexa.php',
method: 'POST',
//ca: fs.readFileSync('client.crt'),
key: fs.readFileSync('client.key'), // Secret client key
cert: fs.readFileSync('client.crt'), // Public client key
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(postData)
}
};
var http = require('https');
var req = http.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
var rawData = '';
res.on('data', (chunk) => rawData += chunk);
res.on('end', () => {
console.log('No more data in response.');
if (rawData.length>0) {
log('Response: ', rawData);
Data = JSON.parse(rawData);
log('json output', JSON.stringify(Data));
// callback(null, Data);
callback(null, Data);
} else {
callback(null, createError(ERROR_TARGET_OFFLINE) );
}
return;
});
});
req.on('error', (e) => {
console.log(`problem with request: ${e.message}`);
callback(null, createError(ERROR_TARGET_OFFLINE) );
return;
});
// write data to request body
req.write(postData);
req.end();
return;
}// exports.handler
var handleUnsupportedOperation = function() {
var header = createHeader(NAMESPACE_CONTROL,ERROR_UNSUPPORTED_OPERATION);
var payload = {};
return createDirective(header,payload);
}// handleUnsupportedOperation
var handleUnexpectedInfo = function(fault) {
var header = createHeader(NAMESPACE_CONTROL,ERROR_UNEXPECTED_INFO);
var payload = {
"faultingParameter" : fault
};
return createDirective(header,payload);
}// handleUnexpectedInfo
// support functions
var createMessageId = function() {
var d = new Date().getTime();
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = (d + Math.random()*16)%16 | 0;
d = Math.floor(d/16);
return (c=='x' ? r : (r&0x3|0x8)).toString(16);
});
return uuid;
}// createMessageId
var createHeader = function(namespace, name) {
return {
"messageId": createMessageId(),
"namespace": namespace,
"name": name,
"payloadVersion": "2"
};
}// createHeader
function log(title, msg) {
console.log(title + ': ' + msg);
}
Angepasst werden muss in dieser Datei ganz oben Port und Domain unter dem euer PHP Server hört.
Ihr zippt das dann als function.zip zusammen mit dem Zertifikat und dem Private Key die client.key und client.crt heißen müssen.
Der Key muss unverschlüsselt sein.
Für die PHP Funktion in eurem Server im Rootverzeichnis legt ihr eine Datei an, die alexa.php heißt mit folgendem Inhalt:
Angepasst werden müssen die Stellen ip.von.smart.home und port.von.nw.plugin. Sucht einfach am besten in nem Texteditor danach, bevor ihr den Code als alexa.php abspeichert und passt das auf eure Umgebung an.
Ebenfalls im Root Verzeichnis des Servers zur alexa.php legt ihr eine config.txt an. meine sieht so aus und sollte selbsterklärend sein:
Code:
# Kommentare beginnen mit # oder ; oder //
# Format: Name;[Liste von Typen:Item]
# Typen: S (Lichtschalter), D (Dimmer) oder H (Heizung)
#
# Beispiel: Schlafzimmer Spots; S:EG.Schlafzimmer.Spots.Schalten; D:EG.Schlafzimmer.Spots.Dimmen
# Schlafzimmer Heizung; H:EG.Schlafzimmer.Heizung.Wert
Wohnzimmer Deckenlampe; S:EG.Wohnzimmer.Deckenlampe.Schalten; D:EG.Wohnzimmer.Deckenlampe.Dimmen
Wohnzimmer Ofen; S:EG.Wohnzimmer.SpotsOfen.Schalten; D:EG.Wohnzimmer.SpotsOfen.Dimmen
Büro Deckenlampe; S:OG.Buero.Deckenlampe.Schalten; D:OG.Buero.Deckenlampe.Dimmen
Ich habe vorerst mal nur 3 Items drin.
Ihr müsst in eurer Items.conf dafür natürlich auch das network Plugin freischalten (nw = yes).
Nun könnt ihr in der AWS Konsole über den Teststring ein Discovery und ein und Ausschaltbefehle senden.
Code:
{
"header": {
"namespace": "Alexa.ConnectedHome.Discovery",
"name": "DiscoverAppliancesRequest",
"payloadVersion": "2",
"messageId": "06c4efaf-da9b-4deb-8561-54412400382c"
},
"payload": {
"accessToken": "BLA BLA aber brauchen wir nicht(?)"
}
}
Wichtig ist, dass ihr unter "applianceID" die richtige ID einsetzt. Diese erfahrt ihr aus dem Ergebnis der Discovery Abfrage.
Ich hoffe der ein oder andere kann eventuell nachstellen, was ich hier beschreibe. Dadurch haben wir vielleicht ein bisschen schneller den Source Code verbessert.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Einen Kommentar schreiben: