FHEM Forum

FHEM => Frontends => Sprachsteuerung => Thema gestartet von: justme1968 am 20 Februar 2017, 11:48:06

Titel: alexa-fhem test version mit slots im fhemIntents
Beitrag von: justme1968 am 20 Februar 2017, 11:48:06
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.
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: Thyraz am 20 Februar 2017, 14:12:12
Wird später sofort getestet. :D
Ist ja genau das worum ich neulich gebettelt habe.

Vielen Dank dafür. :)
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: justme1968 am 20 Februar 2017, 15:33:41
ich hab doch gesagt es kommt :)
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: Thyraz am 20 Februar 2017, 20:36:38
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";
}
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag 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!
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: justme1968 am 20 Februar 2017, 21:14:04
die slots werden mit ausgegeben.

was hast du genau konfiguriert?
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: Thyraz am 20 Februar 2017, 21:38:08
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.)
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: jvollmer am 20 Februar 2017, 23:10:47
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.
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: Thyraz am 21 Februar 2017, 07:39:06
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.

Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: cyvr1 am 21 Februar 2017, 11:38:52
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?
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: justme1968 am 21 Februar 2017, 11:39:58
unter fhemIntents im alexa device
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: cyvr1 am 21 Februar 2017, 12:09:29
Danke, dann fange ich mal mit dem Ausprobieren an.
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: Roman am 24 Februar 2017, 20:14:47
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
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: MadMax-FHEM am 24 Februar 2017, 22:05:10
Hallo justme1968,

hab's eben getestet:

Klappt SUPER!!!!

Vielen Dank für die Arbeit und das super Modul und alexa-fhem!!!

Gruß, Joachim
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: JoeF am 25 Februar 2017, 10:32:08
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

Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: justme1968 am 25 Februar 2017, 10:37:02
verwendest du wirklich 0.3.0 ?

um die custom slots in den fhemIntents zu verwenden brauchst du die 0.3.1 aus diesem thread.
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: JoeF am 25 Februar 2017, 13:49:13
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 :)



Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: Thyraz am 27 Februar 2017, 20:39:25
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
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: justme1968 am 27 Februar 2017, 20:51:39
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
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: Gorean am 24 März 2017, 22:03:57
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 ;)
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: justme1968 am 24 März 2017, 22:05:04
das geht nur mit custom skills. beim home automation skill hat man keinerlei einfluss auf das interaction model oder die antworten.
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: MEitelwein am 08 April 2017, 19:59:47
Ist die 0.3.1 die letzte Version oder gibt es eine neuere?
Titel: Antw:alexa-fhem test version mit slots im fhemIntents
Beitrag von: justme1968 am 10 April 2017, 22:41:20
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