alexa-fhem: amazon alexa smart home skill für fhem

Begonnen von justme1968, 05 November 2016, 23:21:32

Vorheriges Thema - Nächstes Thema

dk3572

Erkennen tut alexa
Zitatstelle den receiver auf 4
Das set Kommando stimmt.
Müsste dann hier nicht was mit "Programm" stehen?
Programm=verb=stelle,articles=den,valuePrefix=auf,values=AMAZON.NUMBER
Wenn ich aber hier "ein Programm" einbaue, kommt das auch wieder im set Kommando vor.
Wo und wie muss ich es einfügen?
Danke für die Hilfe.

bjoernbo

Hallo,

seit gestern Abend habe ich meinen EchoDot und bin mehr als zufrieden. Mit der integration in FHEM habe ich noch nicht begonnen, da ich
bei der Konfiguration noch ein Frage habe und gestern erstmal ALEXA ausgibieg getestet habe.

In der lambda.js muss ich unter Hostname meine Adresse hinterlegen unter welcher ich von Außen erreichbar bin. Aufgrund der Zwangstrennung
erhält man gezuwungener Maßen auch eine neue IP. Das ich als Hostname auch eine DYNDNS Adresse eingeben kann ist mir auch klar!

Allerdings verwende ich keine DYNDSN sondern baue mir immer einer VPN Tunnel auf, wenn ich in meine heimisches Netzwerk möchte. Jetzt
habe ich nicht irgendeinen Router sondern die Fritzbox7490. Diese hat von Haus aus auch MyFritz.

1.) Funktioniert es auch mit MyFritz ?

2.) Was muss ich als Hostname in der lambda.js eintragen?
   Meine aktuelle Freigabe lautet momentan "raspberrypi-fhem.xxldn1kgntkXXXXXXXXX.myfritz.myfritz.net:3000"

Danke für die Unterstützung!
   
   
Raspberry Pi 3 - FB6490C - Synology NAS DS916+ - NETATMO - HUE - SIEMENS G-Tag'S - FTUI - EchoDOT -

jual

Zitat von: justme1968 am 16 Januar 2017, 23:24:59
schau zuerst mal hier: http://alexa.amazon.de/spa/index.html was alexa wirklich verstanden hat und dann zeig die komplette konsolen ausgabe. vom start bis das eine kommando abgearbeitet ist.

Danke für die schnelle Antwort. Habe das Problem nun beheben können. Wie immer saß es direkt vor dem Bildschirm ;-). Bei den Änderungen im Custom Skill habe ich vergessen, das Device "wecker" einzutragen. Interessanterweise hat sich Alexa nicht beschwert, dass es "wecker" nicht kennt. Vielleicht weil man ja in der Standardfunktion von Alexa einen Wecker stellen kann. Das einzige "Problem" ist jetzt nur die Antwort, in der immer "auf;für" zurück gegeben wird. Das ist aber erst einmal unkritisch.

hive2015

#1398
Hi,

erstmal vielen Dank erneut für ein so grossartiges Modul bzw. eine Erweiterung für FHEM. Ich habe die Anleitung befolgt und der Smart-Home sowie der Custom-Skill funktionieren wunderbar.

Eine Frage bzgl. klitzekleines Problem hätte ich da noch. Um vorher diesen iOS10 bug bei Homekit/homebridge zu umschiffen, hatte ich das mit dem Homebridge-Mapping gemacht damit Dimmer nicht immer erst AN (100%) und dann auf die gewünschte Helligkeit gestellt werden. Das hatte ich (mit eurer Hilfe) so gemacht und ging tiptop:

attr Bedroom_Dimmer_Sw homebridgeMapping On=pct,valueOff=0,cmdOn=dummyOn,cmdOff=pct+0

Problem ist nun, das wenn ich über alexa-fhem nun sage, das sie das Licht einschalten möge, egal ob über Smart-Home oder Custom-Skill, das sie dann zwar ganz stolz meint, das sie das Licht eingeschaltet hätte, es sich aber nix tut. Direkt jedoch auf eine %-Zahl stellen geht. Frage ist nun ob es eine Möglichkeit gibt, zwar für HomeBridge dieses Mapping beizubehalten, für Alexa es aber abzuschalten? Oder noch besser, das Alexa ebenfalls wie oben definiert bei einem ON das Licht smooth von 0 auf 100% eindimmt anstatt es stumpf einfach einzuschalten?

Und nochmals an justme1968: Vielen Dank für deinen Einsatz und deine harte und geniale Arbeit.

Gruss,
Hive


nesges

Zitat von: justme1968 am 16 Januar 2017, 20:50:13
@nesges: ich verstehe noch nicht  was du machst machst.

du schreibst die sätze direkt in die skill konfiguration statt sie
aus dem attribut zu holen?

Ich mach's mal bildlich. Jedes Gerät bekommt einen eigenen Skill, damit ich es direkt ansprechen kann. Der Grund ist, dass ich so "Alexa sag dem Toaster leg los" statt "Alexa sag Fhem schalte den Toaster ein" sagen kann. Fühlt sich für mich natürlicher an. Der Skill für's FireTV hat zum Beispiel dieses Intent Schema:

{
   "intents" : [
   
      { "intent" : "FHEMfireUpIntent" },
      { "intent" : "FHEMfireDownIntent" },
      { "intent" : "FHEMfireLeftIntent" },
      { "intent" : "FHEMfireRightIntent" },
      { "intent" : "FHEMfireOkIntent" },

      { "intent" : "FHEMfireBackIntent" },
      { "intent" : "FHEMfireHomeIntent" },
      { "intent" : "FHEMfireMenuIntent" },
      { "intent" : "FHEMfirePrevIntent" },
      { "intent" : "FHEMfirePlayPauseIntent" },
      { "intent" : "FHEMfireNextIntent" },

      { "intent" : "FHEMfireInstalledAppsIntent" },
      { "intent" : "FHEMfireLaunchKodiIntent" },
      { "intent" : "FHEMfireKillKodiIntent" },
      { "intent" : "FHEMfireLaunchTagesschauIntent" },
      { "intent" : "FHEMfireKillTagesschauIntent" },
      { "intent" : "FHEMfireLaunchTwitchIntent" },
      { "intent" : "FHEMfireKillTwitchIntent" },
      { "intent" : "FHEMfireLaunchARDIntent" },
      { "intent" : "FHEMfireKillARDIntent" },
      { "intent" : "FHEMfireLaunchZDFIntent" },
      { "intent" : "FHEMfireKillZDFIntent" },
      { "intent" : "FHEMfireWakeupIntent" },
     
      { "intent" : "FHEMfireSimpsonsIntent" },
     
      { "intent" : "AMAZON.CancelIntent" },
      { "intent" : "AMAZON.StopIntent" }
   ]
}


und diese Sample Utterances:

FHEMfireUpIntent hoch
FHEMfireDownIntent runter
FHEMfireLeftIntent links
FHEMfireRightIntent rechts
FHEMfireOkIntent ok
FHEMfireOkIntent okay

FHEMfireBackIntent zurück
FHEMfireHomeIntent home
FHEMfireMenuIntent menü
FHEMfireMenuIntent optionen
FHEMfirePrevIntent rückspulen
FHEMfirePlayPauseIntent play
FHEMfirePlayPauseIntent pause
FHEMfireNextIntent vorspulen

FHEMfireInstalledAppsIntent installierte Apps
FHEMfireInstalledAppsIntent Apps
FHEMfireInstalledAppsIntent öffne Apps

FHEMfireLaunchKodiIntent Kodi starten
FHEMfireLaunchKodiIntent starte Kodi
FHEMfireLaunchKodiIntent Kodi
FHEMfireLaunchKodiIntent öffne Kodi
FHEMfireKillKodiIntent Kodi beenden
FHEMfireKillKodiIntent beende Kodi
FHEMfireKillKodiIntent kille Kodi
FHEMfireKillKodiIntent töte Kodi

FHEMfireLaunchTagesschauIntent Tagesschau starten
FHEMfireLaunchTagesschauIntent starte Tagesschau
FHEMfireLaunchTagesschauIntent Tagesschau
FHEMfireLaunchTagesschauIntent öffne Tagesschau
FHEMfireKillTagesschauIntent Tagesschau beenden
FHEMfireKillTagesschauIntent beende Tagesschau
FHEMfireKillTagesschauIntent kille Tagesschau
FHEMfireKillTagesschauIntent töte Tagesschau

FHEMfireLaunchTwitchIntent Twitch starten
FHEMfireLaunchTwitchIntent starte Twitch
FHEMfireLaunchTwitchIntent Twitch
FHEMfireLaunchTwitchIntent öffne Twitch
FHEMfireKillTwitchIntent Twitch beenden
FHEMfireKillTwitchIntent beende Twitch
FHEMfireKillTwitchIntent kille Twitch
FHEMfireKillTwitchIntent töte Twitch

FHEMfireLaunchARDIntent ARD starten
FHEMfireLaunchARDIntent starte ARD
FHEMfireLaunchARDIntent ARD
FHEMfireLaunchARDIntent öffne ARD
FHEMfireKillARDIntent ARD beenden
FHEMfireKillARDIntent beende ARD
FHEMfireKillARDIntent kille ARD
FHEMfireKillARDIntent töte ARD

FHEMfireLaunchZDFIntent ZDF starten
FHEMfireLaunchZDFIntent starte ZDF
FHEMfireLaunchZDFIntent ZDF
FHEMfireLaunchZDFIntent öffne ZDF
FHEMfireKillZDFIntent ZDF beenden
FHEMfireKillZDFIntent beende ZDF
FHEMfireKillZDFIntent kille ZDF
FHEMfireKillZDFIntent töte ZDF

FHEMfireWakeupIntent achtung
FHEMfireWakeupIntent aufwachen
FHEMfireWakeupIntent wach auf
FHEMfireWakeupIntent hallo
FHEMfireWakeupIntent guten morgen

FHEMfireSimpsonsIntent starte Simpsons
FHEMfireSimpsonsIntent Simpsons
FHEMfireSimpsonsIntent spiele simpsons
FHEMfireSimpsonsIntent eine folge der simpsons


Also ausschliesslich fhemIntents. In FHEM habe ich ein notify auf ALEXA:fhemIntent:.* das an diese Funktion übergibt:

sub alexa_fhemIntent_action($) {
    my $intent = shift;
   
    [...]
   
    elsif($intent eq "fireUp"                   ) { ftv_up("FIRETV") }
    elsif($intent eq "fireLeft"                 ) { ftv_left("FIRETV") }
    elsif($intent eq "fireDown"                 ) { ftv_down("FIRETV") }
    elsif($intent eq "fireRight"                ) { ftv_right("FIRETV") }
    elsif($intent eq "fireOk"                   ) { ftv_enter("FIRETV") }
    elsif($intent eq "fireBack"                 ) { ftv_back("FIRETV") }
    elsif($intent eq "fireHome"                 ) { ftv_home("FIRETV") }
    elsif($intent eq "fireMenu"                 ) { ftv_menu("FIRETV") }
    elsif($intent eq "firePrev"                 ) { ftv_prev("FIRETV") }
    elsif($intent eq "firePlayPause"            ) { ftv_playpause("FIRETV") }
    elsif($intent eq "fireNext"                 ) { ftv_next("FIRETV") }
    elsif($intent eq "fireInstalledApps"        ) { ftv_apps("FIRETV") }
    elsif($intent eq "fireLaunchKodi"           ) { ftv_kodi("start", "FIRETV") }
    elsif($intent eq "fireKillKodi"             ) { ftv_kodi("stop", "FIRETV") }
    elsif($intent eq "fireLaunchTagesschau"     ) { ftv_tagesschau("start", "FIRETV") }
    elsif($intent eq "fireKillTagesschau"       ) { ftv_tagesschau("stop", "FIRETV") }
    elsif($intent eq "fireLaunchTwitch"         ) { ftv_app("tv.twitch.android.viewer", "start", "FIRETV") }
    elsif($intent eq "fireKillTwitch"           ) { ftv_app("tv.twitch.android.viewer", "stop", "FIRETV") }
    elsif($intent eq "fireLaunchARD"            ) { ftv_app("de.swr.ard.avp.mobile.android.amazon", "start", "FIRETV") }
    elsif($intent eq "fireKillARD"              ) { ftv_app("de.swr.ard.avp.mobile.android.amazon", "stop", "FIRETV") }
    elsif($intent eq "fireLaunchZDF"            ) { ftv_app("com.zdf.android.mediathek", "start", "FIRETV") }
    elsif($intent eq "fireKillZDF"              ) { ftv_app("com.zdf.android.mediathek", "stop", "FIRETV") }
    elsif($intent eq "fireWakeup"               ) { ftv_wakeup("FIRETV") }
    elsif($intent eq "fireSimpsons"             ) { kodi_rndepisode_play_on_firetv('Deutsch%Simpsons') }
   
    [...]
}


und müsste das Attribut Alexa.fhemIntents folgendermaßen füllen:

fireUp=ftv_up
fireDown=ftv_down
fireLeft=ftv_left
fireRight=ftv_right
fireOk=ftv_ok
fireBack=ftv_back
fireHome=ftv_home
fireMenu=ftv_menu
firePrev=ftv_prev
firePlayPause=ftv_playpause
fireNext=ftv_next
fireInstalledApps=ftv_apps
fireLaunchKodi=ftv_kodi start
fireKillKodi=ftv_kodi stop


wobei der rechte Teil für den Custom-Skill keine Bedeutung hat, soweit ich sehe. Diesen Konfigurationsschritt würde ich gerne bzw. habe ich durch die beschriebene Änderung durch die Wildcard "ALL=Ok" ersetzt.

PS: Falls das jemand nachmachen will, es hat klare Nachteile so zu konfigurieren: Es ist vollkommen unflexibel, man muss jeden einzelnen Befehl definieren ("an" und "aus" sind zwei verschiedene Intents) und zB freie Zahlenangaben sind so nicht möglich. Gleichartige Geräte können nicht mit einem Skill erfasst werden ("wohnzimmerradio" und "büroradio" sind Kopien von "küchenradio") etc.

justme1968

@dk3572: warum soll da was mit programm stehen? du hast doch auch programm nicht im kommando verwendet. das Programm ist nur ein label um dieses kommando von allen anderen zu unterscheiden. du könntest es auch sonst wie nennen. wichtig ist die unterschiedlichen logischen ebenen auseinander zu halten.

@bjoernbo: wenn du nur den myfritz namen verwendest geht das. du musst den kompletten host namen angeben. die 3000 muss aber als normale port freigabe konfiguriert werden. nicht als myfriz freigabe.

@jual: zeig mal ein list von deinem alexa device.

@hive2015: nicht sehr elegant aber ein workaround: definier dir dummyOn über cmdalias so das geschaut wird ob das kommando von alexa kommt oder nicht. wenn es von alexa ist mach ein echtes on, wenn es nicht von alexa kommt mach nichts. ob es von alexa kommt oder nicht kannst du (mit hoher warscheinihkeit) am active internal des alexa device feststellen.

@nesges: ok. verstanden. ich baue das demnächst ein.
der rechte teil ist der satz den du für diesen intent sagst. d.h. das was du hier einträgst wird beim get <alexa> interactionModel dann in die Sample Utterances generiert.

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

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

michael.winkler

Zitat von: justme1968 am 17 Januar 2017, 09:58:41
@dk3572: warum soll da was mit programm stehen? du hast doch auch programm nicht im kommando verwendet. das Programm ist nur ein label um dieses kommando von allen anderen zu unterscheiden. du könntest es auch sonst wie nennen. wichtig ist die unterschiedlichen logischen ebenen auseinander zu halten.

@bjoernbo: wenn du nur den myfritz namen verwendest geht das. du musst den kompletten host namen angeben. die 3000 muss aber als normale port freigabe konfiguriert werden. nicht als myfriz freigabe.

@jual: zeig mal ein list von deinem alexa device.

@hive2015: nicht sehr elegant aber ein workaround: definier dir dummyOn über cmdalias so das geschaut wird ob das kommando von alexa kommt oder nicht. wenn es von alexa ist mach ein echtes on, wenn es nicht von alexa kommt mach nichts. ob es von alexa kommt oder nicht kannst du (mit hoher warscheinihkeit) am active internal des alexa device feststellen.

@nesges: ok. verstanden. ich baue das demnächst ein.
der rechte teil ist der satz den du für diesen intent sagst. d.h. das was du hier einträgst wird beim get <alexa> interactionModel dann in die Sample Utterances generiert.

Ich verfolge den selben Ansatz wie der Benutzer "nesges". Wäre es möglich dass es für jeden Skill ein eigenes Alex-Device gibt mit welchem man sich die Intents anlegen kann, so eine Art Dummydevice!

hive2015

Zitat von: justme1968 am 17 Januar 2017, 09:58:41
@hive2015: nicht sehr elegant aber ein workaround: definier dir dummyOn über cmdalias so das geschaut wird ob das kommando von alexa kommt oder nicht. wenn es von alexa ist mach ein echtes on, wenn es nicht von alexa kommt mach nichts. ob es von alexa kommt oder nicht kannst du (mit hoher warscheinihkeit) am active internal des alexa device feststellen.

Öhm, meine Augen wurden gerade glasig als ich das gelesen habe :-[ und auch wenn es wahrscheinlich peinlich ist, würde ich nicht wissen wie auch ich immer das machen soll. Aber wenn ich dich richtig verstehe ist es nur möglich alexa nen richtiges "set Dingens on" anstatt "set Dingens pct 100" machen zu lassen oder? Falls es so ist, dann ists eh wurst und dann könnte ich es auch einfach so lassen wie es ist und auf die "Smoothigkeit" verzichten. :)

justme1968

warum denn ein eigenes device? der overhead ist doch viel zu gross.

im notify kommt demnächst skill id und intent id. dann kannst du im notify alles mögliche machen.

gruss
  andre

ps: der ansatz ist wirklich nur geeignet wenn man einzeln devices gezielt steuern will. 'mach das licht in xxx' an oder 'mach den rolladen in yyy hoch' ist dpa mit ziemlich viel handarbeit verbunden. vor allem auch jedes mal wenn ein device dazu kommt.

pps: in einer der späteren versionen soll es für die fhemIntents auch platzhalter geben um z.b. einen raum oder device namen auch dort verwenden zu können. das dauert aber noch etwas.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

justme1968

@hive2015: es ist nicht möglich für alexa und siri unterschiedliche aktionen für gleiche kommandos (ein) für das gleiche device zu hinterlegen. d.h. man muss im kommando selber die unterscheidung treffen. schau dir mal cmdalias an. für das homekit on kommando gibt es im thread auch eine variante die mit cmdalias funktioniert die kann man einfach erweitern.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

michael.winkler

Zitat von: justme1968 am 17 Januar 2017, 10:06:57
warum denn ein eigenes device? der overhead ist doch viel zu gross.

weil ich für jeden custom skill ja ein eigenes Intent bauen muss. Das bedeute bei mir aktuell das ich über das Alex-Device alles zusammenbaue dann über ein get das Intet und Samples hole, und das dann in einem Editor noch in die div. Skills wieder aufteile.

hive2015

Zitat von: justme1968 am 17 Januar 2017, 10:08:46
@hive2015: es ist nicht möglich für alexa und siri unterschiedliche aktionen für gleiche kommandos (ein) für das gleiche device zu hinterlegen. d.h. man muss im kommando selber die unterscheidung treffen. schau dir mal cmdalias an. für das homekit on kommando gibt es im thread auch eine variante die mit cmdalias funktioniert die kann man einfach erweitern.

Alles klar, vielen Dank! Da werde ich mal nach schauen.

Eine andere Frage hätte ich noch. Gibt es für den Alexa-Custom-Skill irgendwo eine ausführlichere Anleitung? Ich habe mal gestöbert aber bislang immer nur Teile gefunden. Ich habe schon etwas mit den gutenMorgen und guteNacht Intents gespielt und steuere damit Scenes, ich würde nur gerne hier auch ihre Antworten definieren können z.B. Ist an sich nur Kosmetik in dem Fall, aber für andere Intents fänd ich das schon recht spannend, insbesondere wenn man hier nicht nur statische Sätze definieren könnte sondern diese auch abhängig von irgendwelchen Variablen machen könnte.

Habe ich erwähnt wie dankbar ich für das alles hier bin? :)

bjoernbo

Danke für den Hinweis justme1968!

Es ist richtig das ich kein https vernwenden darf, oder?
Raspberry Pi 3 - FB6490C - Synology NAS DS916+ - NETATMO - HUE - SIEMENS G-Tag'S - FTUI - EchoDOT -

dk3572

#1408
Zitat@dk3572: warum soll da was mit programm stehen? du hast doch auch programm nicht im kommando verwendet. das Programm ist nur ein label um dieses kommando von allen anderen zu unterscheiden. du könntest es auch sonst wie nennen. wichtig ist die unterschiedlichen logischen ebenen auseinander zu halten.
Das ist doch genau die Hürde die ich nicht nehmen kann.
Wie und wo muss ich das "programm" einbauen damit ich eine Antwort mit "...auf programm 4 geschaltet" bekomme aber das set Kommando ein favoritList bleibt?
Und "den" kommt auch nicht in der Antwort vor, auch wenn ich es sage.
Danke für deine Geduld  ;)

sbiermann

Eingerichtet und läuft, danke justme funktioniert klasse. Das einzige was mir aufgefallen ist das Alexa das Gerät "Badezimmerlüfter" auf Teufel komm raus nicht erkennen will, aber "Lüfter" ohne Probleme funktioniert. Keine Ahnung woran das liegt.