NEWS
Alexa in Node Red ohne contrib-alexa-home oder Ähnliches
-
Ich hätte da aber noch zwei weitere Fragen:
-
Hat schon jemand "Thermostat Regler" probiert? Die Alexa App findet zwar das Gerät aber wenn ich dann da drauf gehe sagt diese nur "Warte auf Verbindung..." und dann geht es nicht weiter.
-
Wenn ich eine dimmbare Lampe habe die keinen Datenpunkt für "an und aus" (also true und false) hat, sondern nur einen Datenpunkt für 0 - 99 (wobei 0 aus und 99 an ist) hat. Wie kann ich das machen? "Helligkeits Regler" funktioniert zwar für die Prozentangabe aber nicht für an/aus.
-
-
@Marsx79 said in Alexa in Node Red ohne contrib-alexa-home oder Ähnliches:
Ich hätte da aber noch zwei weitere Fragen:
- Hat schon jemand "Thermostat Regler" probiert? Die Alexa App findet zwar das Gerät aber wenn ich dann da drauf gehe sagt diese nur "Warte auf Verbindung..." und dann geht es nicht weiter.
den Thermostat Regler habe ich noch nicht implementiert, ersteinmal könnte man sich mit den anderen Reglern behelfen, (Mode, Prozent, Helligkeit)
- Wenn ich eine dimmbare Lampe habe die keinen Datenpunkt für "an und aus" (also true und false) hat, sondern nur einen Datenpunkt für 0 - 99 (wobei 0 aus und 99 an ist) hat. Wie kann ich das machen? "Helligkeits Regler" funktioniert zwar für die Prozentangabe aber nicht für an/aus.
Hier kannst Du z.B folgendes machen, Du erstellst das Gerät mit einem Helligkeits und einem power controller. Beim Power-Controller trägst Du in der Datenbank unter value: '0-99' ein
diesen Wert können wir dann im Script abfragen und dementsprechend anders reagieren.Du müsstes also node 'Move vals' z.B. so ändern:
//Set the output values to the given IO Broker variable switch (msg.FromSkill.payload.directive.header.namespace) { case "Alexa.PowerController": switch (msg.original_payload.value) { // field value in Database is '0-99' then use 0 as Off and 99 as ON case "0-99": msg.value = 0; if (msg.FromSkill.payload.directive.header.name == "TurnOn") { msg.value = 99; } break; default: // The Powercontroler sends the value (TurnOn/TurnOff), database value is NULL msg.value = false; if (msg.FromSkill.payload.directive.header.name == "TurnOn") { msg.value = true; } break; } break; case "Alexa.ModeController": // Value comes from the database msg.value = msg.payload.value; msg.value = msg.original_payload.value; break; case "Alexa.ColorController": msg.value = HSVtoRGBHEX( msg.FromSkill.payload.directive.payload.color.hue, msg.FromSkill.payload.directive.payload.color.saturation, msg.FromSkill.payload.directive.payload.color.brightness ); break; case "Alexa.BrightnessController": if (msg.FromSkill.payload.directive.header.name == "AdjustBrightness") { // value is in msg.FromSkill.payload.directive.payload.brightnessDelta msg.value = parseInt(msg.payload) + parseInt(msg.FromSkill.payload.directive.payload.brightnessDelta); } else { // value is in msg.FromSkill.payload.directive.payload.brightness msg.value = msg.FromSkill.payload.directive.payload.brightness; } break; } var newmsg2 = { payload: msg.value, topic: msg.topic }; return [newmsg2]; // Alexa Color.Controler input is HSB(HSV). We need RGB value (0xRRGGBB00) function HSVtoRGBHEX(h, s, v) { var r, g, b, i, f, p, q, t; h = h / 360; i = Math.floor(h * 6); f = h * 6 - i; p = v * (1 - s); q = v * (1 - f * s); t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: r = v; g = t; b = p; break; case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; case 5: r = v; g = p; b = q; break; } r = Math.round(r * 255); g = Math.round(g * 255); b = Math.round(b * 255); var rgb = (r << 16) + (g << 8) + b; var srgb = "000000" + (rgb.toString(16) + "00").toUpperCase(); return srgb.slice(-8); }
-
Auch das hat wieder super funktioniert! Danke!!!
Arbeitest du eigentlich noch weiter an dem Projekt? Ist echt mega!
-
@Marsx79
Ja, ich arbeite weiter daran, zur Zeit habe ich aber ganz andere Sorgen.... Ein Todesfall in der Familie. -
@zzippo Dann nimm dir auch die Zeit für deine Familie, das hier ist Hobby. Kopf hoch und Gruß
-
@mech
Danke für die freundlichen Worte.
Ich bin aber jederzeit für Fragen offen, Ablenkung kann ich gut gebrauchen. -
@zzippo super schöne Lösung, werde ich zu Weihnachten mal nachbauen... weiter so!
-
@matit2000
So super schön finde ich es noch nicht. Ich bin grad am forschen, wie es besser gehen könnte. Ich wollte das ganze in den ioBroker integrieren, aber dafür muss ich noch viel lernen.... vs-code, node.js, html, css, express, adapter...., und, und, und.
für einen 56 Jährigen nicht mehr ganz so einfach -
Hallo @zzippo,
sehr schönes Projekt. Ich hatte bisher Alexa über einen Customskill eingebunden, da ich mit den Smart-Home-Skills zu eingeschränkt bin. Lediglich die Geräte, die nur ein- oder ausgeschaltet werden müssen habe ich über ein Smart-Home_Skill geschaltet.Scheinbar hast Du die Einschränkungen überwunden. Das würde ich bei mir auch gerne einbinden. Bisher muss ich die Rollladen noch über den Custom-Skill steuern.
Ich habe jetzt im ersten Schritt einen neuen Smart-Home-Skill angelegt und aktiviert. Eine URL für das Einlesen der Geräte habe ich auch angelegt. Ich sehe, dass die URL auch abgerufen wird, es werden aber keine neuen Geräte gefunden.
Für den Test habe ich einfach das JSON für zwei Geräte (hund und katze) angelegt, welches bei der Abfrage der neuen Geräte zurückgeliefert wird. Hat sich hier etwas geändert? Ich kann die neuen Geräte nicht finden.
Folgender Code wird zurückgeliefert:{"endpoints": [ { "endpointId": "eg_esstisch_lampe_1", "manufacturerName": "HM Switsch", "friendlyName": "hund", "description": "hund", "displayCategories": ["SWITCH"], "cookie": { "devicename": "hund", "TurnOn" : "einschalten", "TurnOff" : "ausschalten" }, "capabilities": [ { "type": "AlexaInterface", "interface": "Alexa", "version": "3" }, { "interface": "Alexa.PowerController", "version": "3", "type": "AlexaInterface", "properties": { "supported": [{ "name": "powerState" }], "retrievable": true } } ] }, { "endpointId": "eg_leselampe", "manufacturerName": "HM Switsch", "friendlyName": "katze", "description": "katze", "displayCategories": ["SWITCH"], "cookie": { "devicename": "katze", "TurnOn" : "einschalten", "TurnOff" : "ausschalten" }, "capabilities": [ { "type": "AlexaInterface", "interface": "Alexa", "version": "3" }, { "interface": "Alexa.PowerController", "version": "3", "type": "AlexaInterface", "properties": { "supported": [{ "name": "powerState" }], "retrievable": true } } ] } ] }
Kannst Du mir einmal ein Beispiel-JSON für ein Gerät zeigen, welches funktionieren müsste? Ich kann leider Deine Tools nicht verwenden, da ich kein ioBroker verwende.
Lassen sich bei den Rollladen auch mehrere Worte für die Aktion einstellen (hoch, runter, öffnen, schließen, auf und zu)?
-
Hallo Christoph,
ein Kompletter Response für einen Power Controller muss so aussehen:
(Die MessageId ist generiert){ "event": { "header": { "namespace": "Alexa.Discovery", "name": "Discover.Response", "payloadVersion": "3", "messageId": "11339ec1-6c30-45bb-a7bf-12e113ebfc7c" }, "payload": { "endpoints": [ { "friendlyName": "hund", "endpointId": "eg_esstisch_lampe_1", "manufacturerName": "HM Switch", "description": "hund", "displayCategories": [ "SWITCH" ], "capabilities": [ { "properties": { "supported": [ { "name": "powerState" } ], "proactivelyReported": false, "retrievable": false }, "type": "AlexaInterface", "interface": "Alexa.PowerController", "version": "3" } ] } ] } } }
zu Deiner Frage mit den Rollos, ja mit ModeController kannst Du beliebig viele Kommandos angeben.
-
Ich wollte noch einmal ein Update geben. Bin dabei den Device Generator als HTML/Javascript umzusetzen. Sieht schon ganz gut aus, und ich habe noch neue Ideen implementiert.
-
Danke @zzippo, das funktioniert jetzt.
Jetzt wird an mein Script folgendes übergeben:[data] => Array ( [directive] => Array ( [header] => Array ( [namespace] => Alexa.PowerController [name] => TurnOff [payloadVersion] => 3 [messageId] => 067b0ff4-47a5-4017-bd6e-20093ebd44ba [correlationToken] => AAAAAAAAAQCdkRvyue7L1Qq0qi/...Qc5nVN0TSG5ee ) [endpoint] => Array ( [scope] => Array ( [type] => BearerToken [token] => Atza|IwEGNZBZz....YDa2Mx_czIbpTjwpu0fzM ) [endpointId] => maus_1 [cookie] => Array ( ) ) [payload] => Array ( ) ) )
Ich hatte das Gerät maus_1 genannt. Schalten kann ich also damit. Ich frage mich nur:
Wie komme ich an die Info, welcher Echo die Anfrage geschickt hat?
Wie kann ich den Text, der als Bestätigung ausgegben wird vorgeben? Wird das im Response mit angegeben? -
Hi,
ich konnte die Rolllade einbinden per:{ "event": { "header": { "namespace": "Alexa.Discovery", "name": "Discover.Response", "payloadVersion": "3", "messageId": "maus_message" }, "payload": { "endpoints": [ { "endpointId": "dach_rolllade", "manufacturerName": "HM", "description": "Rolllade Giebelwand", "friendlyName": "Giebelrolllade", "displayCategories": ["ROLLLADE"], "cookie": {}, "capabilities": [ { "type": "AlexaInterface", "interface": "Alexa.ModeController", "instance": "Rolllade.Position", "version": "3", "properties": { "supported": [ { "name": "mode" } ], "retrievable": true, "proactivelyReported": true }, "capabilityResources": { "friendlyNames": [ { "@type": "asset", "value": { "assetId": "Alexa.Setting.Opening" } }, { "@type": "text", "value": { "text": "hoch", "locale": "de-DE" } } ] }, "configuration": { "ordered": false, "supportedModes": [ { "value": "Position.Up", "modeResources": { "friendlyNames": [ { "@type": "asset", "value": { "assetId": "Alexa.Value.Open" } }, { "@type": "text", "value": { "text": "hoch", "locale": "de-DE" } } ] } }, { "value": "Position.Down", "modeResources": { "friendlyNames": [ { "@type": "asset", "value": { "assetId": "Alexa.Value.Close" } } ] } } ] }, "semantics": { "actionMappings": [ { "@type": "ActionsToDirective", "actions": ["Alexa.Actions.Close", "Alexa.Actions.Lower"], "directive": { "name": "SetMode", "payload": { "mode": "Position.Down" } } }, { "@type": "ActionsToDirective", "actions": ["Alexa.Actions.Open", "Alexa.Actions.Raise"], "directive": { "name": "SetMode", "payload": { "mode": "Position.Up" } } } ], "stateMappings": [ { "@type": "StatesToValue", "states": ["Alexa.States.Closed"], "value": "Position.Down" }, { "@type": "StatesToValue", "states": ["Alexa.States.Open"], "value": "Position.Up" } ] } }, { "type": "AlexaInterface", "interface": "Alexa", "version": "3" } ] } ] } } }
Der Befehl, die Rolllade zu bewegen wird bei den Befehlen "öffnen" und "schließen" ausgeführt und korrekt mit ok vom Echo quittiert.
Sage ich aber "Giebelrolllade hoch", dann kommt als Antwort "Giebelrolllade unterstützt das nicht." Der Befehl wird aber dennoch korrekt an mein Verarbeitungsscript geschickt.
Kann mir mal jemand seine Rollladendefinition senden, der außer öffnen und schließen weitere Befehle angelernt hat?
Mich würde auch die Definition interessieren, für ein Gerät, bei dem eine alternative Antwort gegeben wird.
Also den Inhalt aus MeineAdresse.de:443/alexaDisc (sh. Post#19) -
Hallo Christoph, ich habe das für meine Rollos so gemacht:
{ "type": "AlexaInterface", "interface": "Alexa.ModeController", "instance": "kueche.rollo", "version": "3", "capabilityResources": { "friendlyNames": [ { "@type": "text", "value": { "text": "Rolll\u00E4den", "locale": "de-DE" } }, { "@type": "text", "value": { "text": "Rollladen", "locale": "de-DE" } }, { "@type": "text", "value": { "text": "Rollo", "locale": "de-DE" } }, { "@type": "text", "value": { "text": "Rollos", "locale": "de-DE" } } ] }, "properties": { "supported": [ { "name": "mode" } ], "proactivelyReported": false, "retrievable": false, "nonControllable": false }, "configuration": { "ordered": false, "supportedModes": [ { "value": "kueche.rollo.hoch", "modeResources": { "friendlyNames": [ { "@type": "text", "value": { "text": "hoch", "locale": "de-DE" } }, { "@type": "text", "value": { "text": "Auf", "locale": "de-DE" } } ] } }, { "value": "kueche.rollo.runter", "modeResources": { "friendlyNames": [ { "@type": "text", "value": { "text": "Runter", "locale": "de-DE" } }, { "@type": "text", "value": { "text": "zu", "locale": "de-DE" } } ] } } ] }
sowohl mit der Sprachausgabe als auch der Ermittlung welche Alexa angesprochen wurde wird es ohne IOBroker schwer. Ich habe dafür den Alexa2 Adapter benutzt, welcher sich, wie ich glaube in die AlexaApp einklinkt.
-
Danke @zzippo,
ich werde es mal ausprobieren. Jetzt verstehe ich auch, weshalb ich in der Alexadoku nichts zu den Funktionen "individuelle Sprachausgabe bei Smarthome-Skills" und "Ermittlung des verwendeten Echos" gefunden habe.
Ich hatte mal vor einigen Jahren die Kommunikation mit Echo über die Webseite getestet, die Funktionen aber wieder verworfen, da der Cookie nach unterschiedlichen Zeiträumen immer wieder neu generiert werden musste, was mir dann doch zu umständlich war.
Aber ich denke, da wird es auf GitHub inzwischen auch automatische Scripte geben. -
danach hatte ich auch vergeblich gesucht. mir ist nicht klar, warum Amazon bei Smarthome-Skills weder das angesprochen Gerät noch den Sprecher verrät,
zumal es gerade hier sinvoll wäre. Wie sollte man sonst verhindern, das Fremde oder Kinder das Garagentor öffnen, oder die Heizung auf voll drehen. -
@zzippo
ja das ist auch der Grund, weshalb ich die Haustüre nicht per Sprache öffnen kann. Das lässt sich nicht wirklich absichernDie Historydaten lassen sich per
https://alexa.amazon.de/api/activities?startTime=&size=1&offset=1
abrufen. Damit lässt sich über die serialNumber das Gerät ermitteln. Die SN-IDs erhalte ich über das Script aus: https://github.com/RalfsDev/AlexaTTS/tree/master
Damit kann ich dann auch bel. Texte sprechen lassen.Leider wird keine ID mitgeliefert, welche Person Alexa angesprochen hat. Unter Verlauf sehe ich auch keinen Hinweis darauf. Es scheint so, als sollten diese Infos nicht zugänglich gemacht werden.
-
Schön das es hier weitergeht.
Bin gespannt! Wann kann deine neue Version genutzt werden bzw. stellst du diese zur Verfügung?
-
@Marsx79
Ich bin voll dabei, aber es ist noch ein harter Weg.
Immerhin läuft das ganze schon als Adapter. ich werde Zwischenbericht geben.
Und, natürlich stelle ich das dann zur Verfügung. -
Richtig cool. Sogar als Adapter! Dann viel Erfolg.