[alexa-fhem | Custom Skills] Eure Setups

Begonnen von prodigy7, 28 Januar 2017, 13:59:09

Vorheriges Thema - Nächstes Thema

Marlen

Hi,

mit Attribut anpassen meinst du also hier die Befehle mit | getrennt auf zu führen???

So etwa?
{alexa_tagesverbrauch()}=tagesverbrauch|nach tagesverbrauch|nach den tagesverbrauch


Irgendwie werde ich zwar verstanden, aber es wird was anderes ausgeführt!

Cobra

#91
Falls jemand auf der Suche ist wie er schnell abfragen kann ob noch Fenster auf sind hier meine Setup.

Voraussetzung ist bei mir, dass alle Fensterkontakte mit FTK. anfangen.

Meine Sub:

sub alexastatusFensterOffen() {

my @monitored=devspec2array("(FTK.*):FILTER=STATE!=closed");
my $cnt_devs=@monitored;
my $i = 0;
my $msgtext = "";
foreach(@monitored) {
$msgtext .= AttrVal($_,"alias",$_);
if ($i < $cnt_devs - 2) {
  $msgtext .= ", ";
}
if ($i == $cnt_devs - 2) {
  $msgtext .= " und ";
}
$i++;
}

if ($cnt_devs > 1) {
return "$msgtext sind noch auf";
}
elsif ($cnt_devs < 1){
return "Alle Fenster sind zu";
}
elsif ($cnt_devs = 1){
return "$msgtext ist noch auf";
}
}


Mein fhemIntent:

{alexastatusFensterOffen()}=ob noch fenster auf sind|welche fenster auf sind|welche fenster noch auf sind

Somit kann ich fragen:
Alexa, frage James ob noch Fenster auf sind.
Alexa, frage James welche Fenster auf sind.
Alexa, frage James welche Fenster noch auf sind.


Gruß Cobra
RaspberryPI 3 mit Raspbian Jessie, HMLAN/HM-LAN-Gateway
Diverse HM-Komponenten, Netatmo, Hue, Sonos, Nuki, Alexa

itze61

Hallo Cobra,

habe lange eine Funktion für meine Fenster in FHEM in Verbindung mit Alexa gesucht.

Auch wenn ich zwei Tage für die Installation deines Scriptes gebraucht habe (individuelle Probleme), so läuft es jetzt hervorragend.

Vielen Dank dafür !

Möchte gerne auch andere ermutigen ihre Scripte/Setups in diesem Forum zu präsentieren.

Schönes WE
  .
/tze

wolley

Hallo,

danke fuer den Script !


Zitat von: Cobra am 12 August 2017, 00:50:36
Voraussetzung ist bei mir, dass alle Fensterkontakte mit FTK. anfangen.

Meine Sub:

sub alexastatusFensterOffen() {

my @monitored=devspec2array("(FTK.*):FILTER=STATE!=closed");

}


Leider bekomme ich ihn bei mir nicht zum Laufen. Liegt daran, dass meine Fensterkontake mit _Fenster enden. Ich möchte die Kontake aber nicht umbenennen.
Veilleicht kann mir ja einer einen Denkanstoss geben !

Leider bringt mir die Verwendung des Nachfolgenden:

sub alexastatusFensterOffen() {

my @monitored=devspec2array("(.*Fenster):FILTER=STATE!=closed");

}


....nicht das gewuenschte Ergebnis. Die Abfrage in FEHM nach dem Batteriestatus in der fhem.cfg funktioniert jedoch darueber. Scheint aber wohl nicht der gleiche Syntax zu sein.

Danke fuer eure Hilfe !

Cu
Wolle


Catinor

Dank (oder trotz ;D ) der vielen Threads und Posts habe ich Alexa nun schon recht weit gebracht. Wird Zeit anzufangen was zurückzugeben. Als erstes die Lichtsteuerung.

Meine Sofaecke wird durch 3 weisse HUEs und einen LightStrip beleuchtet. Seit längerem sind die in einer LightScene zusammengefasst, die die Helligkeitsstufen on/70/50/30 sowie spezielle Settings extra und romantisch kennt. Die werden in FTUI genutzt, und mit einem HUE-Dimmer, der neben ein/aus zwei Perl-Funktion zum hoch- und runterdimmen triggert. Wobei es abgesehen vom Dimmen selten was manuell zu steuern gibt, ein Arduino mit Bewegungssensor löst 95% der Schaltvorgänge aus.

Ich hab mir für jeden Bereich einen eigenen Skill angelegt. Der hier hört auf "licht" (ich hab nur noch ein weiteres FHEM-geschaltetes Licht, das steuert zu 99% ein anderer Arduino), also zb. "alexa, sag licht heller".

Der Skill:


{
  "intents": [
    {
      "intent": "AMAZON.CancelIntent"
    },
    {
      "intent": "AMAZON.StopIntent"
    },
    {
      "intent": "AMAZON.HelpIntent"
    },
    {
      "intent": "AMAZON.YesIntent"
    },
    {
      "intent": "AMAZON.NoIntent"
    },
    {
      "intent": "AMAZON.RepeatIntent"
    },
    {
      "slots": [
        {
          "name": "brightness",
          "type": "LightControl"
        },
        {
          "name": "action",
          "type": "LightAction"
        }
      ],
      "intent": "FHEMperlCodeIntent"
    }
  ]
}


Die Custom Slot Types, erstens "LightAction":


mach
mache
schalt
schalte


Zweitens "LightControl":


aus
ein
an
heller
mehr
rauf
dünkler
dunkler
runter
weniger
hell
ganz hell
mittel
gedämpft
gedimmt
romantisch


Und die Utterances:


FHEMperlCodeIntent {brightness}
FHEMperlCodeIntent {action} {brightness}


Die {action} nutze ich in der Perl-Funktion nicht. Die Definition des fhemIntents im Alexa-Objekt:

{alexa_light("$brightness")}={brightness}|{action} {brightness}


Zuletzt die Perl-Funktion:


sub alexa_light {
    my $brightness = $_[0];
    my $answer = "";
    my $command = "";
    my $FHEMcommand = "";
    my %setting = (
          "heller" => "{light_cycle_wandlampe_up()}:&ok",
          "mehr" => "{light_cycle_wandlampe_up()}:&ok",
          "rauf" => "{light_cycle_wandlampe_up()}:&ok",
          "dünkler" => "{light_cycle_wandlampe_down()}:&ok",
          "dunkler" => "{light_cycle_wandlampe_down()}:&ok",
          "weniger" => "{light_cycle_wandlampe_down()}:&ok",
          "runter" => "{light_cycle_wandlampe_down()}:&ok",
          "hell" => "set state_light_wz scene on",
          "ein" => "set state_light_wz scene on",
          "an" => "set state_light_wz scene on",
          "ganz hell" => "set state_light_wz scene extra",
          "mittel" => "set state_light_wz scene 50",
          "gedämpft" => "set state_light_wz scene 30",
          "gedimmt" => "set state_light_wz scene 30",
          "romantisch" => "set state_light_wz scene 10",
          "aus" => "set HUEDevice3 off;set HUEDevice1 off 10;sleep 10;set HUEDevice2 off 10;sleep 20;set state_light_wz scene off"
);
    ($FHEMcommand,$answer) = split (/:/, $setting{$brightness});
    fhem("$FHEMcommand");
    return "$answer";
}


Nach dem "&" vor dem Antworttext hab ich 5 Stunden lang alle Posts der Alexa-Threads durchgesucht  :P mit Erfolg: damit wird die Verbindung resp. der Skill offen gehalten, ein "mehr" "mehr" dimmt dann Stufe um Stufe hoch, ohne "Alexa, sag Licht ..." wiederholen zu müssen. Und wenn alexa-fhem dann auch noch Synonyme und IDs versteht, fallen die Hälfte der möglichen Helligkeitsanweisungen auch noch weg.


x-ingo

Hallo,

ich hab bei mir zu Hause eine Squeezebox im Wohnzimmer. Diese läuft auch gut mit Google Music "all inclusive" nur das ich die bisher nicht mit Alexa steuern konnte. Außerdem wollte ich auch nicht noch zusätzlich "unlimited" von Amazon bezahlen um über den Echo Musik zu hören und deshalb musste ich mich an die Integration der beiden Komponenten machen.
Quasi perfekt dazu ist FHEM mit ALEXA-FHEM und ein wenig Einarbeitung :-).

Umsetzung ist wie folgt
---
Alexa Developer Console
Der Custom Skill heißt "Wohnbereich" und ist hat u.a. folgendes
interaction model:
    {
      "slots": [
        {
          "name": "artist",
          "type": "SEARCH"
        },
        {
          "name": "song",
          "type": "SEARCH"
        }
      ],
      "intent": "FHEMperlCodeIntentB"
    }

custom slot types
SEARCH

Hallo Du
Was auch
Immer das
sein kann
Wer ist Kanzler
Warum ist
Kanzler
Göthe
hilf mir
hilf mir nicht
Taylor Swift
Herbert Grönemeyer
Deichkind
Flunk
Morcheeba
George Ezra
Helmut Kohl Merkel

sample utterances
FHEMperlCodeIntentB spiele {artist}
FHEMperlCodeIntentB spiele Lieder von {artist}
FHEMperlCodeIntentB spiel was von {artist}
FHEMperlCodeIntentB spiele {song} von {artist}
FHEMperlCodeIntentB spiele das Lied {song} von {artist}
FHEMperlCodeIntentB spiele das Lied {song}

FHEM Alexa-Device:
fhemIntents - Das zweite wohlgemerkt, sonst wäre es oben nicht FHEMperlCodeIntentB sondern FHEMperlCodeIntent
{Musikcmd ("spiele", $artist, $song)}=spiele {artist:SEARCH} {song:SEARCH}

myUtils.pm:

sub Musikcmd {

my $artist = $_[1];
my $song = $_[2];
my $return = "<speak><say-as interpret-as=\"interjection\">oh oh</say-as> - da hat was nicht geklappt.</speak>";

# Convert the spaces into % for the URL call
my $sb_artist = $artist;
my $sb_song = $song;
$sb_artist =~ tr/ /%2520/;
$sb_song =~ tr/ /%2520/;

# Will play the 50 best rated songs if just an artist is given
if ($song eq "") {
HttpUtils_NonblockingGet({ url=>'http://192.168.2.102:9002/plugins/googlemusic/index.html?index=1.3_' . $sb_artist . '.0.0.1&player=00%3A04%3A20%3A23%3A66%3A4e&action=play', callback=>sub(){ Log 1,"DATA:$_[2]" } });
print "Musikcmd: " . 'http://192.168.2.102:9002/plugins/googlemusic/index.html?index=1.3_' . $sb_artist . '.0.0.1&player=00%3A04%3A20%3A23%3A66%3A4e&action=play' . "\n";
$return = "<speak><say-as interpret-as=\"interjection\">alles klar</say-as> - ich werde Lieder von " . $artist . " spielen.</speak>";
}
# If just a song is given, we will try to play this song
elsif ($artist eq "") {
HttpUtils_NonblockingGet({ url=>'http://192.168.2.102:9002/plugins/googlemusic/index.html?index=1.3_' . $sb_song . '.2.0&player=00%3A04%3A20%3A23%3A66%3A4e&action=play', callback=>sub(){ Log 1,"DATA:$_[2]" } });
print "Musikcmd: " . 'http://192.168.2.102:9002/plugins/googlemusic/index.html?index=1.3_' . $sb_song . '.2&player=00%3A04%3A20%3A23%3A66%3A4e&action=play' . "\n";
$return = "<speak><say-as interpret-as=\"interjection\">oh mein gott</say-as> - ich hoffe es ist die richtige Version von " . $song . " </speak>";
}
# If an artist and a song is given, lets play all matching song in a playlist
else {
HttpUtils_NonblockingGet({ url=>'http://192.168.2.102:9002/plugins/googlemusic/index.html?index=1.3_' . $sb_artist . '%25' . $sb_song .  '.2&player=00%3A04%3A20%3A23%3A66%3A4e&action=play', callback=>sub(){ Log 1,"DATA:$_[2]" } });
print "Musikcmd: " . 'http://192.168.2.102:9002/plugins/googlemusic/index.html?index=1.3_' . $sb_artist . '%25' . $sb_song .  '.2&player=00%3A04%3A20%3A23%3A66%3A4e&action=play' . "\n";
$return = "<speak><say-as interpret-as=\"interjection\">okey dokey</say-as> - ich spiele ". $song . " von " . $artist . " in allen Varianten die ich finden kann.</speak>";
}

return $return;
}

---

Wichtig ist (leider) die Aussprache gerade bei englischen Titeln .. wenn ich Musik von der Gruppe "Flunk" hören will und dies vermeintlich richtig ausspreche, dann sucht die Squeezebox nach Liedern von "Frank" :-(.
Was nett ist, dass bei den custom slot types nur eine Auswahl stehen muss, Alexa versteht auch alles andere ohne Probleme. Erstaunlicherweise auch meinen Test mit "Thievery Corporation".

Grüße,
x-ingo

Mpomp

Hallo Catinor,

mir gefällt dein Setup mit dem Licht dimmen.
Ich hätte da nur noch ein paar Fragen.

ZitatNach dem "&" vor dem Antworttext hab ich 5 Stunden lang alle Posts der Alexa-Threads durchgesucht  :P mit Erfolg: damit wird die Verbindung resp. der Skill offen gehalten, ein "mehr" "mehr" dimmt dann Stufe um Stufe hoch, ohne "Alexa, sag Licht ..."

Wie funktioniert dies mit der Referenz und was beinhaltet die Funktion light_cycle_wandlampe_up()

Ist es so auch möglich einen Dialog mit Alexa zu führen, falls nicht alle Parameter übermittelt wurden?

Danke
LG
MPomp
Ubuntu 14.04 auf Atom Zotac IONITX-E/ FHEM 5.7 / Homematic LAN und HM Aktoren, LMS, AVR Denon 3808, mehrere RasPi´s als Squeezebox.

Catinor

Frage: was meinst du mit "Referenz"

Die cycle-Funktionen: das war wohl mein erster Perl-Code seit 15 Jahren. Er könnte besser sein, aber wer fixt schon gerne funktionierenden alten Code, wenn es immer neues zu erstellen gibt?  :)


sub light_cycle_wandlampe_up {
    my $status = ReadingsVal("state_light_wz", "state", "off");
    if ($status eq "off") {
fhem "set state_light_wz scene 10";
    } elsif ($status eq "10") {
fhem "set state_light_wz scene 30";
    } elsif ($status eq "30") {
fhem "set state_light_wz scene 50";
    } elsif ($status eq "50") {
fhem "set state_light_wz scene 70";
    } elsif ($status eq "70") {
fhem "set state_light_wz scene 90";
    } elsif ($status eq "90") {
fhem "set state_light_wz scene on";
    } elsif ($status eq "on") {
fhem "set state_light_wz scene extra";
    }
}
sub light_cycle_wandlampe_down {
    my $status = ReadingsVal("state_light_wz", "state", "off");
    if ($status eq "extra") {
        fhem "set state_light_wz scene on";
    } elsif ($status eq "on") {
fhem "set state_light_wz scene 90";
    } elsif ($status eq "90") {
fhem "set state_light_wz scene 70";
    } elsif ($status eq "70") {
fhem "set state_light_wz scene 50";
    } elsif ($status eq "50") {
fhem "set state_light_wz scene 30";
    } elsif ($status eq "30") {
fhem "set state_light_wz scene 10";
    } elsif ($status eq "10") {
fhem "set state_light_wz scene off";
    }
}


Kleine Korrektur zu meinem früheren Post: Stufe 10 wird nur über Alexa "romantisch" angesprochen, und hat schlicht einen hohen Rot-Anteil.

Mpomp

Danke für die schnelle Antwort und das bereitstellen der Funktionen.

Zitatdamit wird die Verbindung resp. der Skill offen gehalten

Das meine ich mit Referenz, das die Verbindung solange offen gehalten bleibt bis etwas anderes als "heller" bzw. "dunkler" der Alexa gesagt wird.
Habe ich das richtig interpretiert?

Ubuntu 14.04 auf Atom Zotac IONITX-E/ FHEM 5.7 / Homematic LAN und HM Aktoren, LMS, AVR Denon 3808, mehrere RasPi´s als Squeezebox.

Catinor

Genau. Verbindung und geöffneter Custom Skill bleiben aktiv, das Licht am Echo auch. Nach ca.10 Sekunden erfolgt dann ein Timeout und Alexa geht wieder schlafen.

pole23

Hallo, ich habe heute meiner Alexa auch beigebracht, mir einen Kaffee zu machen. :-)

Dabei ist mir folgendes aufgefallen.
Meine Befehle:
...bereite mit zwei kaffee zu

Dabei wird automatisch die Stärke "strong" ausgewählt, da das hier so der Standard bei mir ist. Aber ich wollte auch die Möglichkeit haben, die Stärke anzupassen.
Befehl:
...bereite mit zwei mittlere kaffee zu

Daher sie mein fhemIntents wie folgt aus:
{alexa_coffee($num,$strength)}=bereite mir {num:AMAZON.NUMBER} {strength:schwache;mittlere;starke;extrastarke} Kaffee zu|bereite mir {num:AMAZON.NUMBER} Kaffee zu
Wenn ich das so übernehme und es hochlade, erhalte ich folgende Fehlermeldung:
Error: There was a problem with your request: Slot name "{num:AMAZON.NUMBER}" is used in a sample utterance but not defined in the intent schema.

Das Problem dabei ist, das die Sample Utterances wie folgt angelegt werden:
FHEMperlCodeIntentC bereite mir {FHEMperlCodeIntentC_num} {FHEMperlCodeIntentC_strength} Kaffee zu
FHEMperlCodeIntentC bereite mir {num:AMAZON.NUMBER} Kaffee zu

Ich habe es dann wie folgt umgebaut und jetzt klappt es ohne Fehler.
FHEMperlCodeIntentC bereite mir {FHEMperlCodeIntentC_num} {FHEMperlCodeIntentC_strength} Kaffee zu
FHEMperlCodeIntentC bereite mir {FHEMperlCodeIntentC_num} Kaffee zu


Mache ich dabei beim fhemIntent etwas falsch?

cejot

Hallo zusammen,

ich habe Probleme mit der Einrichtung des CustomSkills. Zunächst ist es nicht mehr so einfach (glaub ich) die Intents, Typs, etc im AWS (https://developer.amazon.com/alexa/) zu hinterlegen.
Dafür kann man ein Json File scheinbar hochladen? Nun habe ich probiert mit get Alexa interactionModel mir das Model geben zu lassen und daraus das JSON zu bauen und dieses direkt komplett da reinzuhämmern.
Aber Amazon meldet verschiedene Fehler: Erstens: Es darf keine Intents ohne Namen geben. Habe also alles was da bspw heißt: "intent" : "prozentIntent" in "name": "prozentIntent" geändert. Glaub das war richtig?
Wenn ich aber jetzt versuche zu speichern erzählt Amazon mir, dass ich keine leeren Diaglos Intens benutzen dürfte? Hab aber gar kein Dialog drin. Kann mir jemand sagen wie ich die Konfiguration sauber rein bekomme? Und / oder ob es ne Möglichkeit gibt zur alten Skill Konfigurationsansicht zurück zu kehren?

Danke und viele Grüße
Christoph

Otto

Hi Christoph,

hast du es hin bekommen?

Amazon hat die Oberfläche ja komplett geändert und ich finde keine aktuelle Anleitung.

Habe auch Probleme mit den Intents
Gruss Otto

.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.

docker - homematic

cejot

Hallo Otto,

leider nicht :( Mit dem Hilfeschrei hier hatte ich erstmal aufgegeben. Dachte eigentlich es gäbe hier den ein oder anderen, der es hinbekommen hat.
Eine aktuelle Anleitung habe ich auch nicht gefunden und hatte daher einfach nach meinem mangelnden Verständnis probiert.

Vielleicht kann uns ja auch jemand mit einem Blick in die aktuelle Konfiguration helfen (also alte Konfig in neuer Gui), denn die sollte sich ja für alle geändert haben.

Viele Grüße
Christoph

bugster_de

Hi,

mein CustomSkill spielt nun Musik.

Anwendungsfall
- ich habe in ziemlich jedem Zimmer einen Musikplayer. Die meisten davon sind Squeezebox-Player aber nun kamen auch noch zwei SONOS dazu
- ich habe eine ziemlich große Musiksammlung die lokal auf dem Server liegt. Dort sind auch die Hörspiele für mein Töchterchen abgelegt. Und genau um die ging es, da, die verschiedenen Online Musik-Dienste zwar viel Musik haben, aber quasi keine Hörspiele. Und nur weil ich das ganze per Sprache steuern will, sehe ich eigentlich nicht ein, dass ich die ganzen Hörspiele bei Audible.com nochmal kaufe
- die SONOS1 mit integrierter Alexa hat, ich nenne es mal "Verbesserungspotential". Das Kommando "Alexa, stop" geht bei der Kiste z.B. nicht

In Summe hat das dazu geführt, dass der WAF vorallem bei meiner Tochter in den Minus Bereich gerutscht ist.

Ich habe mir nun einen Customskill angelegt, der diese Lücken schliesst. Im Skill selbst habe ich verschiedene Utterances und Slot definiert, die Künstler, Album Raum und Kommando rausfischen können. Diese werden dann an eine Perl Routine übergeben.
Wenn man Musik hören möchte, macht diese Routine folgendes:

  • rausfinden, auf welchen Raum sich das bezieht. Wenn der Raum vom Nutzer gesprochen wurde ist er klar, wenn der Raum nicht angegeben wurde, dann nutze ich die echoId zur Identifikation. Also "spiele AC/DC im Badezimmer" oder "spiele "AC/DC" geht.
    Falls der Raum angegeben wurde wird bei den gefundenen devices geschaut ob eines der Attribute alias, alexaroom,Gruppe oder Room zum gesuchten passt.
  • Nachshcauen, ob der Album Wunsch sich auf eine Serie bezieht. Wenn also "spiele Bibi und Tina" kommt, dann bezieht sich das auf eine Serie. Damit dann nicht jedesmal die gleiche Folge abgespielt wird,
    habe ich mir einen Hash dieser Serien mit den Folgen definiert und nehme mittels Zufallsfunktion dann eine der Folgen daraus. Bringt Abwechslung. Die Umsetzung mittels Hash ist noch nicht so schön und ich muß mir noch einen Mechanismus überlegen, wie das besser geht.
  • Nun schauen, um was für einen Player Typ es sich handelt (TYPE=SONOSPLAYER oder SB_PLAYER) und dann die entsprechenden Kommandos absetzen, um abzuspielen
Falls der Nutzer Wunsch ein Kommando ist ("nächstes Lied", "halt" wird dieser am Player ausgeführt. Dadurch habe ich jetzt auch die fehlenden Funktionen des SONOS mit Alexa umschifft.

Aktuell nutze ich am alexa Device nur das Attribut fhemIntents. Alles andere wie Slots, utterances etc. definiere ich im Skill auf Amazon Seite. Ich habe das so verstanden, dass diese alexa Device Attribute nur dazu genutzt werden, die Intents und Slots ausgeben zu können, so dass man die dann per Copy / Paste im Skill Setup einbringen kann. Da Amazon aber eh das JSON Format geändert hat, geht das eh nicht mehr ohne Nacharbeit auf Amazon Seite und ich finde es schneller, es gleich im Amazon auf dem neuen Format umzusetzen. Oder habe ich das falsch verstanden?

Ansonsten viel mir auf, dass die verschiedenen Player in FHEM für eigentliche Standard-Aufgaben wie abspielen einer Playlist verschiedene set Kommandos haben. Das macht so eine Umsetzung schwerer, da man pro Player Type unterscheiden muß. Es gab doch mal eine generelle definition, wie die Interfaces von Multimedia Geräten zu machen sind? siehe hier: https://wiki.fhem.de/wiki/DevelopmentGuidelinesAV. Gerade das SONOS Modul shcert sich da mal überhaupt nicht drum (passt ja zum Rest des Sonos Portfolios, die das Rad eigentlich fast überall neu erfinden müssen und dann dabei mit Verbesserungspotential umsetzen). Hat nichts mit CustomSkills zu tun.