Projekt: Alexa Custom Skill - beliebige Antworten
Den großen Vorteil vom Custom Skill spiel FHEM zusammen mit Perl-Funktionen aus. Denn hier kann man sich beliebige Antworten zusammenbauen, sodass hier praktisch jede Fragestellung möglich wird. In den Fragen können Platzhalter genutzt werden, welche dann als Parameter in die Funktionen gereicht werden können. So kann man mit einem Skill ganz verschiedene Dinge ausführen und die Möglichkeiten werden nahezu unbegrenzt. Die Antworten baut man sich dann einfach im Return-Wert zusammen. So kann ich nun beispielsweise die Benzinpreise in der Umgebung abfragen, das Fernsehprogramm umschalten oder eben auch verschiedene Stati von Geräten abfragen. Mehr dazu natürlich im Video.
Was wird benötigt?
- Eine FHEM-Installation inkl. Custom Skill
Video
Befehle
gutenMorgen=guten morgen
guteNacht=gute nacht
{alexaCustom("benzin")}=was kostet der Sprit
{alexaFernsehprogramm($programm)}=Fernseher auf {programm:AMAZON.NUMBER}
{alexaMuell($type)}=wann wird der {type:Müll;Biomüll;Papiermüll;Restmüll;Wertstoffmüll} abgeholt
{alexaCustom("firetv")}=ich will fernsehen
{alexaCustom("saugen")}=mach sauber
{alexaYouTube($auswahl)}=wieviele YouTube {auswahl:Abonnenten;Videos;Aufrufe} habe ich
sub alexaCustom($) {
my ($type) = @_;
if ($type eq "benzin") {
return 'Bei Aral ' . ReadingsVal('OUT_Tankstelle_Aral', 'SuperE5', '0') . ' €, bei Raiffeisen ' . ReadingsVal('OUT_Tankstelle_Raiffeisen', 'SuperE5', '0') . ' € und bei der Westfalen Tankstelle ' . ReadingsVal('OUT_Tankstelle_Westfalen', 'SuperE5', '0') . ' €';
} elsif ($type eq "saugen") {
fhem("set WHG_Staubsauger start");
return 'Ok, ich mache jetzt schön sauber für Dich';
} elsif ($type eq "firetv") {
fhem("set Harmony activity Watch.Fire.TV");
return 'Ok, aber guck nicht so lange Fernsehen';
}
return 'wie bitte?';
}
sub alexaFernsehprogramm($) {
my ($programm) = @_;
Log3('alexa', 2, 'Fernsehprogramm: ' . $programm);
fhem('set Harmony command 42258099 Number' . $programm);
return 'Ich habe den Fernseher auf ' . $programm . ' gestellt';
}
sub alexaMuell($) {
my ($type) = @_;
Log3('alexa', 4, 'Müll: ' . $type);
my $days = -1;
my $what;
if ($type eq "müll") {
$days = ReadingsNum('OUT_Abfall', 'next_days', -1);
$what = join(
' und ',
split(
/ \/ /,
ReadingsVal('OUT_Abfall', 'next_text', 'irgendetwas')
)
);
} elsif ($type =~ /bio/) {
$days = ReadingsNum('OUT_Abfall', 'OUT_Muellkalender_Biotonne_days', -1);
$what = 'der Biomüll';
} elsif ($type =~ /papier/) {
$days = ReadingsNum('OUT_Abfall', 'OUT_Muellkalender_Papiertonne_days', -1);
$what = 'der Papiermüll';
} elsif ($type =~ /rest/) {
$days = ReadingsNum('OUT_Abfall', 'OUT_Muellkalender_Restabfalltonne_days', -1);
$what = 'der Restmüll';
} elsif ($type =~ /wertstoff/) {
$days = ReadingsNum('OUT_Abfall', 'OUT_Muellkalender_Wertstofftonne_days', -1);
$what = 'die gelbe Tonne';
}
if ($days == -1) {
return 'Irgendetwas stimmt mit dem Abfallkalender nicht.';
} elsif ($days > -1 && $what) {
if ($days == 0) {
return 'Heute wird ' . $what . ' abgeholt';
} elsif ($days == 1) {
return 'Morgen wird ' . $what . ' abgeholt';
}
return 'In ' . $days . ' Tagen wird ' . $what . ' abgeholt';
}
return 'Ich habe leider nur Müll verstanden.';
}
sub alexaYouTube($) {
my ($auswahl) = @_;
if ($auswahl eq "aufrufe") {
return 'Du hast bereits ' . ReadingsVal('YouTubeData', 'views', 0) . ' Aufrufe auf YouTube';
} elsif ($auswahl eq "abonnenten") {
return 'Du hast bereits ' . ReadingsVal('YouTubeData', 'subscribers', 0) . ' Abonnenten auf YouTube';
} elsif ($auswahl eq "videos") {
return 'Du hast bereits ' . ReadingsVal('YouTubeData', 'videos', 0) . ' Videos auf YouTube hochgeladen';
}
return 'wie bitte?';
}