theNick hat geschrieben: ↑Do 12. Apr 2018, 17:59
Fonzo, das klingt sehr vielversprechend

Werde mich wohl mal mit Custom Skills befassen müssen!
Das ist nicht so schwer, Du musst Dir nur einen Developeraccount bei Amazon anlegen, dann erstellst Du einen Custom Skill.
Als Interaction Modell hast Du im simpelsten Fall so was wie
Code: Alles auswählen
{
"interactionModel": {
"languageModel": {
"invocationName": "roborock",
"intents": [
{
"name": "AMAZON.CancelIntent",
"samples": []
},
{
"name": "AMAZON.HelpIntent",
"samples": []
},
{
"name": "AMAZON.StopIntent",
"samples": []
},
{
"name": "Roborock",
"slots": [
{
"name": "RoborockState",
"type": "RoborockState"
}
],
"samples": [
"Wie ist der {RoborockState}",
"{RoborockState}",
"Wie ist die {RoborockState}"
]
}
],
"types": [
{
"name": "RoborockState",
"values": [
{
"id": "volume",
"name": {
"value": "Lautstärke"
}
},
{
"id": "state",
"name": {
"value": "Status"
}
},
{
"id": "fanlevel",
"name": {
"value": "Lüfterleistung"
}
},
{
"id": "batterylevel",
"name": {
"value": "Batterieleistung"
}
}
]
}
]
}
}
}
Das Interaction Modell kannst Du dann beliebig komplex bauen, soll ja nur ein einfaches Beispiel sein.
Dann brauchst du einen Endpunkt der über ein zertifizierte SSL Zertifikat verfügt. Ich selber nutzte dazu IP-Symcon Connect.
Am Endpunkt wertest Du dann die Daten aus und sendest den Response. Ich nutzte dafür das
Patami Framework. Wenn Du kein Framework nutzten willst, musst Du dann die Daten von Alexa halt selbstständig auswerten und dann den Response schicken.
Der Response sieht dann im einfachsten Fall beim Patami Framework so aus.
Code: Alles auswählen
<?
function Execute(Request $request)
{
if($request->IsLaunchRequest())
{
$text = 'Ich kann Dir Daten von dem Roborock sagen wie aktueller Status oder Batterieleistung. Zu was willst Du Informationen haben?';
return AskResponse::CreatePlainText(
$text
)->SetRepromptPlainText(
'Was hast Du gesagt?'
);
}
switch (strtolower($request->slots->RoborockState))
{
case 'status':
$text = sprintf('Der momentane Status ist %s .', GetState());
break;
case 'batterieleistung':
$text = sprintf('Die Batterieleistung beträgt %s .', GetBatteryLevel());
break;
case '':
return AskResponse::CreatePlainText(
'Hallo. Ich konnte Dich leider nicht verstehen. Du kannst mich zum Beispiel nach der Batterieleistung oder dem Status fragen. Für weitere Informationen sage Hilfe. Zu welchem Wert willst Du Informationen haben?'
)->SetRepromptPlainText(
'Was hast Du gesagt?'
);
default:
return AskResponse::CreatePlainText(
'Diesen Wert kenne ich nicht. Zu welchem Art von Wert willst Du Informationen haben?'
)->SetRepromptPlainText(
'Was hast Du gesagt?'
);
}
return TellResponse::CreatePlainText($text)->SetSimpleCard('Roborock', $text);
}
function GetBatteryLevel()
{
$volume = GetValueFormatted(18629 /*[Geräte\Roborock Xiaomi\Roborock\Batterie]*/);
return $volume;
}
function GetState()
{
$volume = GetValueFormatted(34928 /*[Geräte\Roborock Xiaomi\Roborock\Status]*/);
return $volume;
}
Damit wird in dem Beispiel der Status des Roborock oder der Batteriestand zurückgegeben bzw. in der Alexa App auf der Card bzw. einem Echo Show auf dem Display angezeigt. Was man dann zurückgeben will und wie die Formulierungen lauten bzw. wie man die Dialoge baut ist einem komplett selber überlassen.