alexa-fhem test version mit slots im fhemIntents

Begonnen von justme1968, 20 Februar 2017, 11:48:06

Vorheriges Thema - Nächstes Thema

justme1968

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 enthalten.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Thyraz

Wird später sofort getestet. :D
Ist ja genau das worum ich neulich gebettelt habe.

Vielen Dank dafür. :)
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Thyraz

#3
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";
}
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

jvollmer

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!

justme1968

die slots werden mit ausgegeben.

was hast du genau konfiguriert?
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Thyraz

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.)
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

jvollmer

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.

Thyraz

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.

Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

cyvr1

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?

----------
Stephan Krätzschmar

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

cyvr1

Danke, dann fange ich mal mit dem Ausprobieren an.

----------
Stephan Krätzschmar

Roman

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

MadMax-FHEM

Hallo justme1968,

hab's eben getestet:

Klappt SUPER!!!!

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

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

JoeF

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