anbei eine erste version von alexa-fhem mit der custom slots in den fhemIntents möglich sind. zum testen ist die 39_alexa.pm version aus dem update morgen früh nötig.
wichtig: das ist noch nicht die angekündigte konfigurierbarkeit der abfragen. die soll sehr viel automatisierter erfolgen. ohne das man für jede abfrage einen eigenen intent bauen muss.
wie funktioniert es:
- in der sample utterance sind jeweils platzhalter der art {<name>[:<values>]} erlaubt
- <name> ist der name des slots
- im perl code kann auf $<name> zugegriffen werden
- <values> ist eine durch ; getrennte liste der möglichen werte oder ein amazon default type
- die standart FHEM_.* slot types können ebenfalls verwendet werden -> name ohne FHEM_ angeben, keine values angeben.
- achtung: in name dürfen nur die erlauben zwischen vorkommen. d.h. keine zahlen.
mehr oder weniger sinnvolle beispiele:
{rechne($OPERANDA,$OPERATOR,$OPERANDB)}=wieviel ist {OPERANDA:AMAZON.NUMBER} {OPERATOR:plus;minus;mal;geteilt+durch} {OPERANDB:AMAZON.NUMBER}
-> alexa, frage fhem: wie viel ist drei mal vier
{liste($Room)}=welche geräte gibt es {preposition} {Room}
-> alexa, frage fhem: welche geräte gibt es im schlafzimmer
sub
rechne($$$)
{
my ($OPERANDA,$OPERATOR,$OPERANDB) = @_;
if( $OPERATOR eq 'plus' ) {
return "$OPERANDA $OPERATOR $OPERANDB ist ". ($OPERANDA + $OPERANDB);
} elsif( $OPERATOR eq 'minus' ) {
return "$OPERANDA $OPERATOR $OPERANDB ist ". ($OPERANDA - $OPERANDB);
} elsif( $OPERATOR eq 'mal' ) {
return "$OPERANDA $OPERATOR $OPERANDB ist ". ($OPERANDA * $OPERANDB);
} elsif( $OPERATOR eq 'geteilt durch' ) {
return "ich kann nicht durch $OPERANDB teilen" if( $OPERANDB == 0 );
return "$OPERANDA $OPERATOR $OPERANDB ist ". ($OPERANDA / $OPERANDB);
}
return "ich kann nicht $OPERANDA $OPERATOR $OPERANDB rechnen";
}
sub
liste($)
{
my($room) = @_;
my @list = devspec2array("alexaRoom=$room");
return join(',', @list);
}
TODO:
- parameter übergabe alternativ als hash mit den einzelnen slot werten
- besser prüfung auf erlaubte werte und zeichen
- verlagern der code erzeugung auf fhem seite
gruss
andre
edit 2017-04-10: die hier beschriebene erweiterung ist in der 'offiziellen' version hier: https://forum.fhem.de/index.php/topic,60244.msg540117.html#msg540117 (https://forum.fhem.de/index.php/topic,60244.msg540117.html#msg540117) enthalten.
Wird später sofort getestet. :D
Ist ja genau das worum ich neulich gebettelt habe.
Vielen Dank dafür. :)
ich hab doch gesagt es kommt :)
Aber so schnell. ;)
Funktioniert einwandfrei.
Jetzt kanns richtig losgehen...
"Echo, frage Smart Home: Wie warm ist es im Büro?" -> "Die aktuelle Temperatur beträgt 21.5 Grad bei 51 Prozent Luftfeuchtigkeit"
{alexaRoomTemperature($preposition,$Room)}=wie warm ist es {preposition} {Room}
sub alexaRoomTemperature($$) {
my($preposition,$room) = @_;
my $device = "";
$room = lc($room);
if ($room eq "wohnzimmer") {
$device = "Netatmo_Indoor01";
} elsif ($room eq "schlafzimmer") {
$device = "Netatmo_Indoor02";
} elsif ($room eq "büro") {
$device = "Netatmo_Indoor03";
} elsif ($room eq "kinderzimmer") {
$device = "Netatmo_Indoor04";
} else {
return "Kein passendes Thermometer gefunden";
}
my $temperature = ReadingsVal($device, "temperatureVal", 0);
$temperature =~ s/\./\,/g;
my $humidity = ReadingsVal($device, "humidity", 0);
return "Die aktuelle Temperatur beträgt $temperature Grad bei $humidity Prozent Luftfeuchtigkeit";
}
Hallo, wenn ich es richtig sehe, dann werden die zugehörigen "slots" in der Ausgabe des interactionModel nicht mit angezeigt.
Die musste ich selber anlegen!
die slots werden mit ausgegeben.
was hast du genau konfiguriert?
Zitat von: jvollmer am 20 Februar 2017, 21:12:19
Hallo, wenn ich es richtig sehe, dann werden die zugehörigen "slots" in der Ausgabe des interactionModel nicht mit angezeigt.
Die musste ich selber anlegen!
Folgender Satz aus dem ersten Post könnte helfen ;)
zum testen ist die 39_alexa.pm version aus dem update morgen früh nötig.(Alternativ eben heute schon aus SVN besorgen.)
Hallo:
Hier die fhem Konfiguration
Zitat
....
{AlarmA_modus($AlarmModus)}=Alarmanlage {AlarmModus} scharf[
/quote]
Die InteractionModel Anzeige zeigt dann folgendes an:
Zitat{
"intent" : "FHEMperlCodeIntentE"
},
Nach intent müsste aber eigentlch noch "slots : ..." folgen.
Mit Selbsteintragung funktioniert es aber dann super. Danke.
Zu meinem letzten Post der evtl. nicht selbsterklärend genug war: Bei mir kam es genau zu dem Fehler, weil ich die neue Version zwar per SVN gezgen hatte, aber vergessen auf meinen Pi übertragen.
Daher evtl. nochmal schauen ob du wirklich die neue Version von 39_alexa.pm drauf hast.
Ab jetzt/heute sollte die ja auch über das normale Update kommen.
Hallo,
nur mal 'ne ganz blöde Frage zwischendurch. Bitte nicht hauen. ;)
Die subs packe ich in die 99_myUtils.pm. Korrekt?
Wo kommt dann dieser Teil hin :
{liste($Room)}=welche geräte gibt es {preposition} {Room}
Unter Sample Utterances im Custon Skill?
unter fhemIntents im alexa device
Danke, dann fange ich mal mit dem Ausprobieren an.
Hi Justme1968,
bin erst heute dazu gekommen das auch mal zu kurz testen.
Ich hab mir mal zwei Test fhemintents mit Parametern erstellt. Tut bei mir genau das was es soll.
<Daumen hoch> :)
Gruß
Roman
Hallo justme1968,
hab's eben getestet:
Klappt SUPER!!!!
Vielen Dank für die Arbeit und das super Modul und alexa-fhem!!!
Gruß, Joachim
Hallo zusammen,
zu aller erst, vielen Dank für die tollen Module und Einträge im Wiki. Hut ab!
Mit deren Hilfe, habe icht jetzt mit meinem Custom Skill zum Laufen bekommen (Alexa-Fhem Version 0.3.0). Und der fhemIntent
{_99_AlexaUtils_GuteNacht()}=gute nacht
Funktioniert auch.
Nun wollte das ganze erweitern, analog zu einigen Beispielen hier im Thread.
Hierfür habe ich mir eine Funktion geschrieben, welche das Licht in einem Raum auf eine bestimmte Szene setzen soll, und den entsprechenden fhemIntent beim Alexe Device hinzugefügt:
Etwas gekürzt:
{_99_AlexaUtils_SetLightSceneInRoom($preposition,$Room,$State)}=Schalte das Licht {preposition} {Room:Ankleidezimmer;Bad;Büro;[...]} auf {State:Arbeiten;Relax;Lesen;Essen;[...]}
Ich habe hier sämtliche Werte die Room, bzw. State annehmen können, eingetragen. Ist das überhaupt an dieser Stelle nötig? Oder reicht es aus, die Werte dann ein den Costum Slot Types zu definieren?
Nachdem ich dann das Intent Schema, die Custom Slot Types, und die Sample Utterances gefüllt habe habe ich das ganze getestet
Der Vollständigkeit halber, hier ein Auszug aus dem Sample Utterances:
FHEMperlCodeIntentM Schalte das Licht {preposition} {FHEMperlCodeIntentM_Room} auf {FHEMperlCodeIntentM_State}
BTW: kann man die Benamung irgendwie beeinflussen? FHEMperlCodeIntentM ist irgendwie nicht so schön.
Wenn ich nun im Service Simulator folgendes eingebe: ,,Schalte das Licht im Büro auf Arbeiten", oder zu Alexa sage "Alexa, sage fhem: Schalte das Licht im Büro auf arbeiten"
Erhalte ich folgenden, vielversprechenden, Service Request:
[session entfernt]
"request": {
"type": "IntentRequest",
"requestId": "EdwRequestId.ecfd69b3-e318-43ff-a605-17e9e49d66cc",
"locale": "de-DE",
"timestamp": "2017-02-25T08:50:21Z",
"intent": {
"name": "FHEMperlCodeIntentM",
"slots": {
"preposition": {
"name": "preposition",
"value": "im"
},
"FHEMperlCodeIntentM_Room": {
"name": "FHEMperlCodeIntentM_Room",
"value": "Büro"
},
"FHEMperlCodeIntentM_State": {
"name": "FHEMperlCodeIntentM_State",
"value": "Arbeiten"
}
}
}
}
Was soweit sehr gut aussieht. Allerdings ist die Service Response eher ernüchternd. Da Alexa aber fleißig die Fehlermeldung ausgibt, funktioniert die Kommunikation wohl generell.
{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "Global symbol \"$preposition\" requires explicit package name at (eval 53184) line 1.Global symbol \"$Room\" requires explicit package name at (eval 53184) line 1.Global symbol \"$State\" requires explicit package name at (eval 53184) line 1."
},
"shouldEndSession": true
},
"sessionAttributes": {}
}
Die Fehlermeldung bedeutet ja, dass eine Variable namens $preposition (sowie alle anderen) nicht deklariert wurden. Was mache ich dann falsch, wenn bei einigen
{liste($Room)}=welche geräte gibt es {preposition} {Room}
funktioniert? Müssen die Variablen vorher noch irgendwo deklariert werden?
Habt ihr da eine Idee, ich bin mit meinem Latein hier leider am Ende.
Vielen Dank schonmal
Gruß, Johannes
verwendest du wirklich 0.3.0 ?
um die custom slots in den fhemIntents zu verwenden brauchst du die 0.3.1 aus diesem thread.
Da hätte ich auch selbst drauf kommen können :D
Nach einem Update auf Version 0.3.1 funktioniert es nun - vielen Dank für den Support :)
Hi andre,
hab glaub einen kleinen Bug gefunden:
{alexaNextGarbage($PreGarbageType,$GarbageType)}=wann ist {PreGarbageType:wieder;der+nächste;die+nächste;das+nächste+mal} {GarbageType:papiermüll;papier;papiersammlung;kartonagen;restmüll;gelber+sack;biotonne;biomüll}
Hier wird der Custom Type "PreGarbageType" nicht in den Sample Utterances ersetzt wenn ich get interactionModell mache.
Beim GarbageType klappt es.
Trimme ich den CustomType auf
{PreGarbageType:wieder}
funktioniert es.
Vielleicht liegt es an zu viel Leerzeichen/Pluszeichen?
Ich hab die weiteren Werte auf developer.amazon.com dennoch eingetragen und es funktioniert dann auch mit allen Werten.
Alexa kann also damit umgehen, denke es ist daher eher ein Bug beim Parsen von fhemIntents.
Grüße,
Tobias
hab den fehler gefunden und repariert. ab morgen im fhem update.
es lag daran das ich nur erste + maskiert hatte und nicht alle und dadurch dann das entfernen der values für die sample utterance nicht funktioniert hat.
gruss
andre
Hallo, wenn ich das richtig verstehe, kann man mit dem return() definieren, wie Alexa in der Sprachausgabe nach einem Befehl antworten soll.
Geht das auch mit dem Basis-Skill oder braucht es dazu zwingend den Custom-Skill?
Ich würde gerne die Antworten für einfache Ausgaben von einem stupiden "ok" in etwas sinnvolles ändern ;)
das geht nur mit custom skills. beim home automation skill hat man keinerlei einfluss auf das interaction model oder die antworten.
Ist die 0.3.1 die letzte Version oder gibt es eine neuere?
seit eben ist die hier beschriebene funktionalität in der 'offiziellen' version hier: https://forum.fhem.de/index.php/topic,60244.msg540117.html#msg540117 (https://forum.fhem.de/index.php/topic,60244.msg540117.html#msg540117) enthalten.
gruss
andre