Hallo zusammen,
da eigene Skills (Custom Skills) bei alexa-fhem immer wieder ein Thema vieler Fragen ist, möchte ich dazu anregen, dass User die funktionierende Setups hinbekommen haben, Ihr Setup hier zu beschreiben und zu erklären. Oft ist es einfacher, anhand von Beispielen das abzuleiten was man möchte und zu verstehen als sich mühsam alles zusammen zu suchen muss. Würde mich hier über jedes "Mini-Tutorial" freuen!
Bitte nutzt für Fragen und Probleme die Threads und bleibt bitte hier beim wesentlichen Thema!
- [alexa-fhem | Custom Skills] Probleme mit euren Setups (https://forum.fhem.de/index.php/topic,67398.0.html)
- [alexa-fhem | Generell] Alles zu Installation und damit verbundenen Problemen (https://forum.fhem.de/index.php/topic,60452.0.html)
- [alexa-fhem | Generell] amazon alexa smart home skill für fhem (https://forum.fhem.de/index.php/topic,60244.0.html)
p7
na dann mache ich mal den Anfang - ist kein Hexenwerk, der eine oder andere Stolperstein (über den ich gestolpert bin) habe ich auch kurz erwähnt, ohne hier eine direkt Schritt für Schritt Anleitung liefern zu wollen.
Also erstmal was zur Umgebung:
Provider - t-online
Externe ip: dyndns über strato IPV4
Erreichbarkeit von FHEM über das Internet: Portweiterleitung von TCP 3000-3000 auf 3000 auf einer Fritzbox eingerichtet
FHEM: SSL mit User/Passwort
daraus ergibt sich dann für mich folgende config.json:
{
"alexa": {
"name": "Alexa Produktiv",
"keyFile": "./key.pem",
"certFile": "./cert.pem",
"applicationId": "amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxxxxxxx",
"oauthClientID": "amzn1.application-oa2-client.xxxxxxxxxxxxxxxxxxxxxxx"
},
"connections": [
{
"name": "FHEM",
"server": "127.0.0.1",
"auth": {
"user": "<username>",
"pass": "<passwort>"
},
"ssl":true,
"port": "8083",
"filter": "room=alexa"
}
]
}
Meine "Stolpersteiner" - beides in AWS:
1. der Code wird nicht von "selbst" übertragen, dieser muss händisch übertragen werden - also copy & paste !!
const PORT=3000;
const HOST='<dyndns_name_externe_IP';
// entry
exports.handler = function(event, context, callback) {
console.log(`EVENT: ${event}`);
console.log(`CONTEXT: ${context}`);
var post_data = JSON.stringify(event);
var options = {
hostname: HOST,
port: PORT,
//family: 6,
//path: '/',
method: 'POST',
rejectUnauthorized: false, // accept self-signed
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(post_data)
}
};
var request = require('https').request(options, (result) => {
console.log(`STATUS: ${result.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(result.headers)}`);
result.setEncoding('utf8');
var body = '';
result.on('data', (chunk) => body += chunk);
result.on('end', () => {
console.log(`BODY: ${JSON.stringify(body)}`);
callback(null, JSON.parse(body) );
return;
});
});
request.on('error', (e) => {
console.log(`problem with request: ${e.message}`);
callback(null, createError(ERROR_TARGET_OFFLINE) );
return;
});
request.write(post_data);
request.end();
return;
}// exports.handler
2. Trigger -
Es muss ein "Alexa Smart Home skill" in aws zu sehen sein und dann ein "Alexa Skills Kit"
Gerne ergänze ich weitere Angaben - ist aber so dass, was für mich hängengeblieben ist wo es gezwickt hat.
Grüße - Bernd
Vielleicht hat ja jemand ne config.json als Beispiel, in der mehrere Custom Skills mit default Room beschrieben sind, sowas suche ich gerade.
P.S. @prodigy7: die Links sind falsch herum, wenn ich auf den Link mit Probleme klicke, komm ich bei dem für Smrt Home Skill aus. ;)
Schade, dass es hier noch nicht mehr content gibt.
Ich habe das Custom Skill eingerichtet, jedoch habe ich noch nicht wirklich das homebridgeMapping durchblickt. :-[
Wenn ich ein Gerät mit dem folgenden Befehl anspreche:
"Alexa, sage <Custom Skill Invocation Name>:...."
Bekomme ich nur eine Antwort, dass keine Geräte vorhanden sind.
Beispielsweise würde ich gerne wie im Wiki (https://wiki.fhem.de/wiki/Alexa-Fhem) einen Wecker einbinden, die Rolladen öffnen ohne eine prozentuale Angabe oder meine Hue Lampen in einer bestimmten Farbe leuchten lassen.
Das sind meine Einträge aus dem Alexa Device in FHEM und analog dazu habe ich auch die Einstellungen für das Custom Skill vorgenommen.
alexaMapping
#Characteristic=<name>=<value>,...
On=verb=schalte,valueOn=an;ein,valueOff=aus,valueToggle=um
Brightness=verb=stelle,property=helligkeit,valuePrefix=auf,values=AMAZON.NUMBER,valueSuffix=prozent
Hue=verb=stelle,valuePrefix=auf,values=rot:0;grün:128;blau:200
Hue=verb=färbe,values=rot:0;grün:120;blau:220
Saturation=verb=stelle,property=sättigung,valuePrefix=auf,values=AMAZON.NUMBER
Saturation=verb=sättige,values=AMAZON.NUMBER
TargetPosition=verb=mach,articles=den,values=auf:100;zu:0
TargetPosition=verb=stelle,valuePrefix=auf,values=AMAZON.NUMBER,valueSuffix=prozent
TargetTemperature=verb=stelle,valuePrefix=auf,values=AMAZON.NUMBER,valueSuffix=grad
Volume:verb=stelle,valuePrefix=auf,values=AMAZON.NUMBER,valueSuffix=prozent
#Weckzeit=verb=stelle,valuePrefix=auf;für,values=AMAZON.TIME,valueSuffix=uhr
alexaTypes
#Type=<alias>[,<alias2>[,...]]
light=licht,lampen
blind=rolladen,rolläden,jalousie,jalousien,rollo,rollos
fhemIntents
#IntentName=<sample utterance>
gutenMorgen=guten morgen
guteNacht=gute nacht
Vielleicht hat ja jemand von euch schon was umgesetzt und kann mich ein wenig unterstützen. Leider habe ich mit homebridgeMapping noch gar nichts gemacht und bisher auch keine einfache Erklärung für Anfänger mit Beispielen gefunden.
Bin für jede Unterstützung dankbar. :D
@bene_dicere
Ein FHEM-Objekt wird erst dann als Alexa-Gerät erkannt, wenn es einem FHEM-Room zugeordnet ist, der im Filter-Parameter der alexa-fhem-Konfigurationsdatei config.json spezifiziert ist. Der Filter ist ein Regulärer Ausdruck, z.B.
"filter": "room=alexa|Sonos|Heizungssteuerung"
Viele Grüße
Zitat von: Romoker am 10 Februar 2017, 15:18:48
@bene_dicere
Ein FHEM-Objekt wird erst dann als Alexa-Gerät erkannt, wenn es einem FHEM-Room zugeordnet ist, der im Filter-Parameter der alexa-fhem-Konfigurationsdatei config.json spezifiziert ist. Der Filter ist ein Regulärer Ausdruck, z.B.
"filter": "room=alexa|Sonos|Heizungssteuerung"
Viele Grüße
das habe ich auch und funktioniert vom Prinzip auch.
Ich kann auch Alexa mit dem folgenden Befehl ansprechen und sie sagt mir den Status von allen Geräten im "config.json Raum".
Alexa, frage <Custom Skill Invocation Name> Status
alternativ kann ich noch ein Gerätenamen nachfolgend nennen, wie z.B. Rolllade.
Das ganze funktioniert auch nur in genau dieser Reihenfolge, füge ich zb noch ein Pronomen hinzu, gehört es direkt zu den dingen die Alexa nicht weiß.
Jedoch kann ich nichts einstellen/ändern.
Alexa, sage <Custom Skill Invocation Name> Stelle Weckzeit auf Neunzehn Uhr.
Als Beispiel zu dem oben stehenden Befehl, bekomme ich die nachstehende Antwort ca.5x in Schleife
Zitatich kann undefined nicht auf schalten
und dann noch 1x
Zitatauf um gestellt
aber es passiert nichts.
Stelle ich jetzt aber beispielsweise eine Weckzeit in FHEM ein sagt sie mir wenn ich nach dem allgemeinen Statusfrage
ZitatWeckzeit steht auf xx Uhr
jedoch kann ich auch nach der Weckzeit nicht explizit fragen.
Wenn man 2 (oder mehr) Custom Skills verwenden möchteDamit kann man z.B. sagen:
ZitatAlexa sage Fernseher schalte ARD ein
oder
ZitatAlexa sage Badzimmer schalte Licht aus
usw...
Dazu muss der
Invocation Name der Custom Skills bei Skill1 dann
Fernseher heißen und bei Skill2 dann
Badezimmer heißen usw...
Das ist natürlich jedem selber überlassen wie er die Skills nennt.
Folgendes in die config.json eintragen:
Zitat{
"alexa": {
"name": "Alexa TEST",
"keyFile": "./key.pem",
"certFile": "./cert.pem",
"nat-upnp": false,
"applicationId": [ "amzn1.ask.skill.111..." , "amzn1.ask.skill.222..." ],
"oauthClientID": "amzn1.application-oa2-client.xxx"
},
"connections": [
{
"name": "FHEM",
"server": "192.xxx.xxx.xx",
"port": "8083",
"filter": "room=Alexa"
}
]
}
Rot markierte Stellen müssen auf die eigene Umgebung angepasst werden.
oauthClientID ist vom Smart Home Skill
und
applicationId ist von den Custom Skills
In Bezug auf das hier (alexa-fhem Version 0.2.0) https://forum.fhem.de/index.php/topic,60244.msg540117.html#msg540117 :
Zitatedit 2017-02-10:
- fhem intents der art
{meineSub()}=guten morgen und set|get|attr <device> xyz=gute nacht
sind jetzt möglich. die rückgabe des jeweiligen kommandos wird als antwort für alexa verwendet
d.h man kann damit beliebige texte aus fhem an alexa zurück geben.
habe ich es so gelöst (gibt bestimmt elegantere Wege, aber dieser funktioniert):
Im Alexa device steht unter fhemIntents
{alexa_guten_morgen()}=guten morgen
{alexa_gute_nacht()}=gute nacht
Dann natürlich ein
get <Alexadevice> intercationModel
und die Ergebnisse in
Intent Schema und
Sample Utterances im Custom Skill (oder in mehreren Custom Skills) eintragen und speichern.
Nun habe ich mir eine eigene
99_Alexa_Sprache_Utils.pm angelegt, dazu einfach auf
EDIT FILES dann auf die
myUtilsTemplate.pm klicken und folgenden Text einfügen
Zitatpackage main;
use strict;
use warnings;
use POSIX;
sub
Alexa_Sprache_Utils_Initialize($$)
{
my ($hash) = @_;
}
##### Start guten morgen
sub
alexa_guten_morgen()
{
fhem "set Alexa_Guten_Morgen_dummy on";
return "Guten Morgen, was kann ich für dich tun";
}
#####Ende guten morgen
#
##### Start gute nacht
sub
alexa_gute_nacht()
{
fhem "set Alexa_Guten_Morgen_dummy off";
return "Gute Nacht, wir hören uns morgen wieder";
}
#####Ende gute nacht
1;
Ich habe vor dem "return ....." noch einen Dummy von mir geschaltet, das kann man anpassen oder die ganze Zeile einfach löschen, dann kommt nur ein Sprachrückmeldung.
(Achtung die Datei muss so aussehen "...Utils.pm" damit diese dann auch unter
EDIT FILES zu finden ist <---- Das orange markierte muss am Ende des Namens der zu speichernden Datei stehen)
Jetzt neben
SAVE AS den Namen
99_Alexa_Sprache_Utils.pm eingeben (Achtung, wollt ihr einen anderen Namen verwenden, muss dieser auch im Inhalt der Datei angepasst werden (siehe roter Text)) und auf
SAVE AS klicken.
Zur Sicherheit ein "reload 99_Alexa_Sprache_Utils.pm" in der FHEM Eingabezeile und
die Alexa Bridge (alexa-fhem Version 0.2.0) einmal neustarten.
Nun sollte mit
"Alexa sage FHEM guten morgen" eine Antwort mit "Guten Morgen, was kann ich für dich tun" folgen und der Dummy eingeschaltet werden.
und mit
"Alexa sage FHEM gute nacht" eine Antwort mit "Gute Nacht, wir hören uns morgen" folgen und der Dummy ausgeschaltet werden.
Das ganze kann man jetzt nach belieben erweitern.
Ein Update der alexa-fhem von 0.1.9 auf 0.2.0 habe ich wie folgt gemacht:Datei von hier heruntergeladen : https://forum.fhem.de/index.php/topic,60244.msg540117.html#msg540117
auf meinem Mac entpackt (sollte bei Windoo... genau so gehen), alexa-fhem gestoppt, dann folgende Dateien im alexa-fhem Ordner auf meinem Pi umbenannt:
Die Datei:
package.json in
package.json_originalund den Ordner:
lib in
lib_originalsomit hat man, falls was schief geht immer noch eine funktionierende Backuplösung.
Dann die neu heruntergeladenen Dateien auf den Pi kopieren:
Die Datei:
package.jsonund den Ordner:
libund alexa-fhem zur Kontrolle auf der Console gestartet und geschaut ob die richtige Version läuft.
Edit1: Folgendes steht im Wiki für das Update der alexa-fhem:ZitatUpdate
Hier wir das Update auf eine neue Version von Alexa-Fhem beschrieben
Das Verzeichnis alexa-fhem im Hauptverzeichnis von FHEM (typischerweise /opt/fhem) umbenennen in alexa-fhem.old.
Die tgz-Datei der neuen Alexa-Fhem-Version unter Linux im Hauptverzeichnis von FHEM (typischerweise /opt/fhem) entpacken (nicht unter Windows, das zerstört die Rechteeinstellungen).
Das dabei entstandene Verzeichnis package in alexa-fhem umbenennen, in das Verzeichnis wechseln
Mit
npm install
alle Abhängigkeiten installieren (kein sudo!).
Die Zertifikatsdateien key.pem und cert.pem aus dem alten Verzeichnis alexa-fhem.old ins neue Verzeichnis alexa-fhem kopieren.
Natürlich dann den Dienst neu starten, auch müssen selbstredend irgendwelche Modifikationen an der Datei server.js in der neuen Version nachgezogen werden. Wenn alles läuft, kann das alte Verzeichnis alexa-fhem.old gelöscht werden.
Grüße Marcel
Hey Marcel,
danke das du deine Lösung geteilt hat.Habe es probiert, und es funktioniert soweit. Du hast allerdings einen kleinen Schnitzer in deiner 99_Alexa_Sprache_Utils.pm.
sub
alexa_guten_morgen()
{
fhem "set Alexa_Guten_Morgen_dummy on";
return "Guten Morgen, was kann ich für dich tun";
}
#####Ende guten morgen
#
##### Start gute nacht
sub
alexa_guten_morgen()
{
fhem "set Alexa_Guten_Morgen_dummy off";
return "Gute Nacht, wir hören uns morgen wieder";
}
#####Ende gute nacht
1;
Du nutzt jeweils die gutenMorgen sub.
Hab mich gerade gewundert, warum mir Alexa eine Gute Nacht wünscht, wenn ich Guten morgen sage.
Nochmal danke fürs Bereitstellen.
@bene_dicere:
Wie ist Dein FHEM-Device "Weckzeit" definiert? Im FHEMWiki ist ein Wecker (https://wiki.fhem.de/wiki/Alexa-Fhem#Wecker (https://wiki.fhem.de/wiki/Alexa-Fhem#Wecker)) sehr gut erklärt. Liefere mal ein FHEM-Listing von Deinem Device, z.B. mit:
list Weckzeit
Hast Du nach der FHEM-Konfiguration die Konfiguration vom Interaction Model des Custom Skills in amazon.developer nachgezogen?
Hinweis: dieser Thread sollte nur funktionierende Custom Skills Setups enthalten. Konfigurationsprobleme werden hier besprochen: https://forum.fhem.de/index.php/topic,60244.0.html (https://forum.fhem.de/index.php/topic,60244.0.html)
@Esjay, Danke, da hatte sich der Fehlerteufel eingeschlichen, hab es korrigiert...
Gesendet von iPhone mit Tapatalk
Zitat von: Romoker am 12 Februar 2017, 11:52:02
@bene_dicere:
Wie ist Dein FHEM-Device "Weckzeit" definiert? Im FHEMWiki ist ein Wecker (https://wiki.fhem.de/wiki/Alexa-Fhem#Wecker (https://wiki.fhem.de/wiki/Alexa-Fhem#Wecker)) sehr gut erklärt. Liefere mal ein FHEM-Listing von Deinem Device, z.B. mit:
list Weckzeit
Hast Du nach der FHEM-Konfiguration die Konfiguration vom Interaction Model des Custom Skills in amazon.developer nachgezogen?
Hinweis: dieser Thread sollte nur funktionierende Custom Skills Setups enthalten. Konfigurationsprobleme werden hier besprochen: https://forum.fhem.de/index.php/topic,60244.0.html (https://forum.fhem.de/index.php/topic,60244.0.html)
Danke für deine Unterstützung, hatte den Fehler in der Zwischenzeit schon gefunden. Habe das Weckzeit_prefix nicht mit eingetragen.
Falls es trotzdem jemanden interessiert (habe es aus dem Wiki):
Internals:
CFGFN
NAME Alexa.Weckzeit
NR 77310
STATE 11:45
TYPE dummy
Readings:
2017-02-12 15:37:19 state 11:45
Attributes:
alexaName weckzeit
alexaRoom alexa
genericDeviceType clock
group AlexaGeräte
homebridgeMapping Weckzeit=state,cmd=+
room alexa
setList Weckzeit:time
Leider verstehe ich noch immer nicht so wirklich das HomebridgeMapping und was dadurch passiert. gibt es vll irgendwo ne Anleitung mit ein paar Beispielen an denen man es nachvollziehen kann?
Alexa fragen was gerade im Radio läuft
In fhemIntents hinzugefügt:
{currentRadioTitle()}=was läuft gerade im radio
{currentRadioTitle()}=was gerade im radio läuft
In der 99_myUtils.pm:
sub currentRadioTitle() {
my $title = ReadingsVal("AV_Receiver", "currentTitle", "");
return $title;
}
Damit kann ich jetzt auf 2 Wege den aktuellen Titel ausgeben lassen, der im Radio läuft:
Computer, starte SmartHome -> Was läuft gerade im Radio
oder
Computer, frage SmartHome was gerade im Radio läuft.
Hallo zusammen,
ich wollte hier auch noch mal meine Lösung für fhemIntents vorstellen.
Ich finde es lästig, für jeden fhemIntent eine eigene sub in dem 99_myUtils.pm zu erstellen und habe das mit einer Parameterübergabe gelöst.
Beispiel von fhemIntents
#IntentName=<sample utterance>
{Alexacmd ("gutenmorgen")}=guten morgen
{Alexacmd ("guteNacht")}=gute nacht
{Alexacmd ("tvlauter")}=Fernseher lauter
{Alexacmd ("tvleiser")}=Fernseher leiser
{Alexacmd ("tvprgup")}=Fernseher nächstes Programm
{Alexacmd ("tvprgdown")}=Fernseher vorheriges Programm
{Alexacmd ("tverstes")}=Fernseher das erste
{Alexacmd ("tvzweites")}=Fernseher das zweite
{Alexacmd ("tvsateins")}=fernseher sat eins
{Alexacmd ("tvaus")}=fernseher aus
und das passende sub in der 99_my_Utils
sub Alexacmd {
my $Command = $_[0];
my $ALEXAReturn = "OK";
my $FHEMCommand = "set Dummy_test no_alexa_action"; # falls kein passendes Kommando gefunden wird
fhem("set Dummy_test $Command"); # nur zur Kontrolle um zu sehen was ankommt
$Command =~ s/fhemIntent: //; # das reine Intent extrahieren
my %Alexakommando = (
"gutenmorgen" => "set Dummy_Test guten morgen; Guten Morgen, was kann ich für dich tun",
"tvlauter" => "set LGTV remoteControl volumeUp ;ich habe den fernseher lauter gestellt",
"tvleiser" => "set LGTV remoteControl volumeDown; ich habe den fernseher leiser gestellt",
"tvprgup" => "set LGTV channelUp;OK",
"tvprgdown" => "set LGTV channelDown; OK",
"tverstes" => "set LGTV channel 1; OK",
"tvzweites" => "set LGTV channel 2; OK",
"tvsateins" => "set LGTV channel 3; OK",
"tvaus" => "set LGTV remoteControl power; ich habe den fernseher ausgeschaltet"
);
($FHEMCommand,$ALEXAReturn) = split (/;/, $Alexakommando{$Command});
fhem("$FHEMCommand");
return "$ALEXAReturn";
};
die Variable %Alexakommando kann dann mit beliebig vielen fhemIntents gefüllt werden, Format sollte selbsterklärend sein
fhemInten => <fhemKommando> ; Alexa Antwort
evtl. könnte man das Semikolen als Trenner zwischen fhemKommando und Alexa Antwort ändern falls man mehrere Kommandos ausführen will , dann einfach das Semikolon durch einen anderen Trenner ersetzen und im split ändern.
Gruß
Roman
Trivial, aber morgens sehr hilfreich... Kurz mal fragen, ob die S-Bahn pünktlich ist...
sub sbahnstatus() {
my $bahnoutput1_1 = "Die nächste S Bahn nach XYZ mit der planmäßigen Abfahrt um ";
my $bahnoutput1_2 = " Verspätung";
my $bahnoutputminuten = " Minuten ";
my $bahnoutputminute = " Minute ";
my $bahnuhrhat = " Uhr hat ";
my $bahnabfahrtszeit1 = ReadingsVal("BAHN", "plan_departure_1", "");
my $bahnabfahrtszeit2 = ReadingsVal("BAHN", "plan_departure_2", "");
my $bahnoutputeine = "eine ";
my $delay1 = ReadingsVal("BAHN", "plan_arrival_delay_1", "");
my $delay2 = ReadingsVal("BAHN", "plan_arrival_delay_2", "");
my $bahnoutput2_1 = " Die nachfolgende S Bahn nach XYZ mit der planmäßigen Abfahrt um ";
my $speech = "";
my $bahnzeit2 = " unbekannte ";
my $delayspeech1 = "Fehler";
my $delayspeech2 = "Fehler";
my $delayspeechsubstr1 = "";
my $delayspeechsubstr2 = "";
use Switch;
switch ($delay1) {
case "none" { $delayspeech1 = "keine Verspätung."; }
case "+0" { $delayspeech1 = "keine Verspätung."; }
case "+1" { $delayspeech1 = "eine Minute Verspätung."; }
else { $delayspeechsubstr1 = substr($delay1, 1, 1);
$delayspeech1 = $delayspeechsubstr1 . $bahnoutputminuten . $bahnoutput1_2; }
}
switch ($delay2) {
case "none" { $delayspeech2 = "keine Verspätung."; }
case "+0" { $delayspeech2 = "keine Verspätung."; }
case "+1" { $delayspeech2 = "eine Minute Verspätung."; }
else { $delayspeechsubstr2 = substr($delay1, 1, 1);
$delayspeech2 = $delayspeechsubstr2 . $bahnoutputminuten . $bahnoutput1_2; }
}
$speech = $bahnoutput1_1 . $bahnabfahrtszeit1 . $bahnuhrhat . $delayspeech1 . $bahnoutput2_1 . $bahnabfahrtszeit2 . $bahnuhrhat . $delayspeech2;
return $speech;
}
Angesagt wird im Augenblick nur die nächste S-Bahn. Aber, wie man sieht sind die Vorbereitungen für die Nachfolgende schon im Gange.
Jetzt mit nächster und übernächster S-Bahn.
Und entsprechendes für den Müll...
sub nextrestmuelldate() {
my $tage_bis_restmuell = ReadingsVal("Abfall", "Abfall_Restmuell2woe_tage", "");
my $tage_bis_gelbersack = ReadingsVal("Abfall", "Abfall_GelberSack_tage", "");
my $tag_restmuell = ReadingsVal("Abfall", "Abfall_Restmuell2woe_wochentag", "");
my $tag_gelbersack = ReadingsVal("Abfall", "Abfall_GelberSack_wochentag", "");
my $output_restmuell = "";
my $output_gelbersack = "";
my $muell_output = "";
use Switch;
switch ($tage_bis_restmuell) {
case [0] { $output_restmuell = "Der Restmüll wird heute abgeholt.";}
case [1..6] { $output_restmuell = "Der Restmüll wird am kommenden " . $tag_restmuell . "abgeholt.";}
case [7] { $output_restmuell = "Der Restmüll wird am nächsten " . $tag_restmuell . "abgeholt.";}
else { $output_restmuell = "Der Restmüll wird am übernächsten " . $tag_restmuell . " abgeholt.";}
}
switch ($tage_bis_gelbersack) {
case [0] { $output_gelbersack = "Der gelbe Sack wird heute abgeholt.";}
case [1..6] { $output_gelbersack = "Der gelbe Sack wird am kommenden " . $tag_gelbersack . "abgeholt.";}
case [7] { $output_gelbersack = "Der gelbe Sack wird am nächsten " . $tag_gelbersack . "abgeholt.";}
else { $output_gelbersack = "Der gelbe Sack wird am übernächsten " . $tag_gelbersack . " abgeholt.";}
}
$muell_output = $output_restmuell . " " . $output_gelbersack;
return $muell_output;
}
Letzteres noch quick and dirty. Könnte natürlich auch sagen "wir heute abgeholt".
Jetzt für gelben Sack und Restmüll und auch grammatikalisch korrekt!
Die switch-anweisung benötigt das Perl-Modul SWITCH. Wer es nicht hat, kann es wie folgt nachinstallieren:
sudo apt-get install libswitch-perl
So langsam findet auch meine Frau Alexa prima!
Zitat von: Roman am 15 Februar 2017, 21:48:58
und das passende sub in der 99_my_Utils
Wenn ich den Code in meine my_Utils übernehme erhalte ich folgenden Fehler:
Global symbol "%Alexakommando" requires explicit package name (did you forget to declare "my %Alexakommando"?) at ./FHEM/99_myUtils.pm line 142
Problem ist nur: ein %Alexakommando ist bei mir gar nicht vorhanden...
Hi oli82,
Das wird doch mit 'my %Alexakommando' definiert.
Evtl. Irgendwo einen Tippfehler oder Klammer/Semikolon vergessen?
Wenn du es nicht findest poste Mal deine 99_myUtils bzw. die Sub
Gruß
Roman
Können wir hier nicht einen 2 Beitrag im 1. Post verlinken, in dem Probleme von hier besprochen werden, dann bleibt der Beitrag hier ein wenig übersichtlicher...
@prodigy7: Könntest du den 2 Beitrag eröffnen und ihn im ersten Post hier markieren.
Ist nur ne Idee, möchte hier niemanden angreifen.
Grüße Marcel
Zitat von: Ma_Bo am 17 Februar 2017, 17:31:24
Können wir hier nicht einen 2 Beitrag im 1. Post verlinken, in dem Probleme von hier besprochen werden, dann bleibt der Beitrag hier ein wenig übersichtlicher...
@prodigy7: Könntest du den 2 Beitrag eröffnen und ihn im ersten Post hier markieren.
Ist nur ne Idee, möchte hier niemanden angreifen.
Versteh ehrlich gesagt gerade nicht so ganz, was du meinst :)
Also, ein neues Thema aufmachen, was nur die Probleme, der hier behandelten setups, beinhaltet.
Dieses neue Thema dann bitte in dem ersten Post von dir hier in diesem Thema verlinken, so wie die beiden Links zu den Alexa Themen von justme.
Dann stehen in dem Thema hier nur die setups und im anderen kann man über die Probleme diskutieren.
Gesendet von iPhone mit Tapatalk
Habe meine Müll- und S-Bahnansagen nochmal getweakt. Update hier: https://forum.fhem.de/index.php/topic,65890.msg587062.html#msg587062 (https://forum.fhem.de/index.php/topic,65890.msg587062.html#msg587062)
Hallo,
das hier funktioniert bei mir:
{currentRadioTitle()}=was läuft gerade im radio
{currentRadioTitle()}=was gerade im radio läuft
allerdings nur 1x. Danach kommt die Antwort:
"Bei der Antwort des angeforderten Skill ist ein Problem aufgetreten"
Gleiches Problem trat hier auf:
{alexa_guten_morgen()}=guten morgen
{alexa_gute_nacht()}=gute nacht
Jemand eine Idee was schief läuft bzw. wo und wie ich den Fehler suchen kann?
was steht auf der console bzw. im log?
Ausgabe der console:
[2/19/2017, 1:05:35 PM] IntentRequest
[2/19/2017, 1:05:35 PM] FHEMperlCodeIntent
[2/19/2017, 1:05:35 PM] [FHEM] executing: https://192.168.178.25:8083/fhem?cmd=%7B$defs%7BAlexa%7D-%3E%7B%22active%22%7D%20=%201%7D&XHR=1
[2/19/2017, 1:05:35 PM] [FHEM] executing: https://192.168.178.25:8083/fhem?cmd=setreading%20Alexa%20fhemIntent%20%7BcurrentRadioTitle()%7D&XHR=1
[2/19/2017, 1:05:35 PM] [FHEM] executing: https://192.168.178.25:8083/fhem?cmd=%7B$defs%7BAlexa%7D-%3E%7B%22active%22%7D%20=%200%7D&XHR=1
[2/19/2017, 1:05:36 PM] [FHEM] executing: https://192.168.178.25:8083/fhem?cmd=%7B$defs%7BAlexa%7D-%3E%7B%22active%22%7D%20=%201%7D&XHR=1
[2/19/2017, 1:05:36 PM] [FHEM] executing: https://192.168.178.25:8083/fhem?cmd=%7BcurrentRadioTitle()%7D&XHR=1
[2/19/2017, 1:05:36 PM] [FHEM] executing: https://192.168.178.25:8083/fhem?cmd=%7B$defs%7BAlexa%7D-%3E%7B%22active%22%7D%20=%200%7D&XHR=1
response :{"version":"1.0","sessionAttributes":{},"response":{"outputSpeech":{"type":"PlainText","text":"Hitradio OE3 - LiveStream\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"},"shouldEndSession":false}}
**** Received Directive: {"version":"1.0","session":{"new":false,"sessionId":"amzn1.echo-api.session......","application":{"applicationId":"amzn1.ask.skill........"},"user":{"userId":"amzn1.ask.account..........."}},"context":{"System":{"application":{"applicationId":"amzn1.ask.skill.........."},"user":{"userId":"amzn1.ask.account............."},"device":{"supportedInterfaces":{"AudioPlayer":{}}}}},"request":{"type":"SessionEndedRequest","requestId":"amzn1.echo-api.request...........","timestamp":"2017-02-19T12:05:38Z","locale":"de-DE","reason":"ERROR","error":{"type":"INVALID_RESPONSE","message":"An exception occurred while dispatching the request to the skill."}}}
[2/19/2017, 1:05:39 PM] SessionEndedRequest
[2/19/2017, 1:05:39 PM] [FHEM] executing: https://192.168.178.25:8083/fhem?cmd=%7B$defs%7BAlexa%7D-%3E%7B%22active%22%7D%20=%201%7D&XHR=1
[2/19/2017, 1:05:39 PM] [FHEM] executing: https://192.168.178.25:8083/fhem?cmd=setreading%20Alexa%20intent%20SessionEndedRequest&XHR=1
[2/19/2017, 1:05:39 PM] [FHEM] executing: https://192.168.178.25:8083/fhem?cmd=%7B$defs%7BAlexa%7D-%3E%7B%22active%22%7D%20=%200%7D&XHR=1
response :{"version":"1.0","sessionAttributes":{},"response":{"outputSpeech":{"type":"PlainText","text":"Bye"},"shouldEndSession":true}}
Im log steht nichts. Wie müsste ich was loggen?
Danke für deine Hilfe !
in der antwort sind ein ganzer haufen null bytes. ich vermute mal das alexa damit ein problem hat.
Ich habe einen passenden Thread angelegt. Siehe Post 1!
@prodigy7: Du hast natürlich völlig Recht. Ich glaube aber, es ist schwer, ein Problem losgelöst vom unmittelbaren Kontext zu diskutieren.
Ich traue mich kaum noch dk3572 zu fragen, ob das Problem vielleicht bei anderen Sendern nicht besteht. Denn, wie justme richtig bemerkt, kommt da wohl senderseitig Müll mit.
Insgesamt glaube ich, dass das Alexa Custom Skill Thema so gross ist, dass es 1. unter Sprachsteuerung eine eigene Kategorie Alexa benötigt und darunter weitere Themengruppen. D.h. dieser Thread in eigener Kategorie mit einem Thread pro eigenem Setup und entsprechender Diskussion.
Wollte ich nur mal vorschlagen, bin jetzt aber wieder still. :)
Nur Mut, mich kann man alles fragen ;D
Das Problem tritt bei allen Sendern auf und wir erwähnt auch bei dem Beispiel mit "guten morgen".
dimmen mit itl210-dimmer mit rfxtrx
alexa-mapping: default-Einstellungen
homebridgeMapping: Brightness=state,cmd=level,factor=6.67
Alexa-Befehl: "alexa, sage femm, stelle Helligkeit dimmer auf xy%
@KölnSolar kann ich dieses hier:
alexa-mapping: default-Einstellungen
homebridgeMapping: Brightness=state,cmd=level,factor=6.67
Eventuell direkt für einen Dummy nutzen? ^^
( https://forum.fhem.de/index.php/topic,67721.0.html )
eher nicht :'( aber vielleicht ähnlich ;D
ich hatte ja extra geschrieben, dass ich mit dem rfxtrx arbeite ::) da lautet der Befehl zum dimmen "set Dimmer level x" (x= 0-15)
Im IT-Modul wird mit "set Dimmer dimxy%" (xy=06, 12, 18, ....100) gedimmt.
Das in ein homebridgemapping umzusetzen bin ich nicht in der Lage :-[
Da sind wir schon 2... 8)
Naha ich schau mal, ob jemand wissendes über meinen Thread stolpert... bisher hab ich noch keinen wirklichen Ansatz.
jaja homebridgemapping. Sicherlich einfach und logisch, wenn man aus der homebridge-welt kommt, aber sonst :'(
Guck mal hier. https://forum.fhem.de/index.php/topic,67398.msg590456.html#msg590456 Ich empfinde das zwar als schlechtestmögliche Lösung, aber wenn man keine bessermögliche hat :-[
Mir fehlt aktuell noch der Ansatz wann alexa-fhem überhaupt denkt, dass es den Dimm Befehl gibt :-D
Reine WebCMDs reichen da glaube ich noch nicht.
das ist aber eigentlich leicht: alexa-mapping: Brightness ! Damit hast die die Sprachkommandos, die Erkennung....
Damit ist schon einmal die alexa-Seite gelöst. Nur dann für Deinen Fall ein homebridgemapping, um die aus alexa-fhem kommende Prozentzahl in einen set-Befehl umzusetzen ..... Klingt einfach (und geht wahrscheinlich auch einfach) 6:dim06%, 12:dim12%...100:dim100%... Aber wie schreibt man das, wo es gar keine "Characteristic" im set-Befehl gibt und keine konkreten readings :-\
Ich habe dieses Attribut Alexa-Mapping noch bei keine Combobox in FHEM gesehen ^^ Aber ich schau nachher nochmal.
Danke dir.. Das Mapping kann man sich bestimmt aufdröseln.... und verstehen hoffe ich.
Guten morgen zusammen
ich weiss nicht, ob ich in diesem Thread auch fragen stellen "darf" oder ob hier nur Beispiele vorgestellt werden
daher bitte ich um Nachsicht
@Roman
mein "Verständnis" für die Erstellung funktionstüchtiger Aufgaben für Alexa ist noch sehr gering, doch du hast ein beispiel angebracht, was mir sehr verständlich erscheint - und dazu habe ich noch eine Frage
Zitatmy $Command = $_[0];
my $ALEXAReturn = "OK";
my $FHEMCommand = "set Dummy_test no_alexa_action"; # falls kein passendes Kommando gefunden wird
fhem("set Dummy_test $Command"); # nur zur Kontrolle um zu sehen was ankommt
$Command =~ s/fhemIntent: //; # das reine Intent extrahieren
in deiner Sub erscheint diese Zeile - hast du dazu einen dummy angelegt und wenn ja, welche attr hast du ihn für diese Aufgabe gegeben, bzw welcher genericdevicetyp ist das?
ich möchte hier nicht einfach nur copy/paste veranstalten, sondern das verstehen
eine Antwort wäre toll
gruss tagedieb
Ähm ... kurze Frage - wäre es möglich, dass jemand mal einen "einfachen" Custom Skill (inkl. der erforderlichen Änderungen aller Bereiche (config.json, FHEM, alexa-fhem, lambda, skill set) veröffentlicht.
Ich habe jetzt meine Konfiguration nach einem Kampf mit Apache und Co. lauffähig und würde quasi gerne mit einem einfachen "Wohnzimmer Lampe an/aus" starten, um dann weitere Dinge aufzunehmen.
Ich habe zwar viele Teile gefunden, aber irgendwie erschließt sich mit nicht ganz der Zusammenhang? :-[
das wird dir nicht helfen. für den smart home skill geht das out of the box wenn der
filter zu deinen geräten passt und für den custom skill musst du das get interactionModel selber machen weil es von deinen device und raum namen abhängig ist.
welcher zusammenhang fehlt dir noch? es steht doch alles im wiki und in den diversen threads hier.
Ok - jetzt hab ich's ... er wollte irgendwie meine Geräte nicht annehmen, nachdem ich nun den alexaNamen gesetzt habe funktioniert meine erste Schaltung ... über den alias hat er meine Testlampe nicht gefunden ... aber egal. Jetzt hat sich dann auch der Kreis geschlossen, d.h. FHEM konfigurieren, Model für Amazon exportieren, Alexa-FHEM neu starten - ins Log schauen, ob alles erkannt wurde.
Naja, wenn man ein Weilchen gekämpft hat, dann verlässt einen zum Schluss der Mut ... sorry.
@tagedieb:
Zitat
in deiner Sub erscheint diese Zeile - hast du dazu einen dummy angelegt und wenn ja, welche attr hast du ihn für diese Aufgabe gegeben, bzw welcher genericdevicetyp ist das?
Soweit ich das verstehe brauchst du dafür keinen genericdevicetyp. es geht hierbei einfach um einen befehls-test-dummy, um so zu sehen, was alexa verstanden hat. macht sinn, gerade wenn man mit mehreren parametern in der intent arbeitet. spezielle attribute habe ich bei mir nicht gesetzt.
gruß
thomas
Hallo zusammen
ich komme hier gerade nicht weiter, es wäre schön, wenn mir bitte jemand, den fehlenden Stubs geben könnte ???
ich habe einen dummy Internals:
NAME Wurzelberegnung
NR 1630
STATE aus
TYPE dummy
Readings:
2017-03-19 14:38:42 state off
Attributes:
alexaName Rabatten
alexaRoom Aussen
alexaTypes valve
devStateIcon ein:Restart:off aus:Shutdown:on time:Update
eventMap on:ein off:aus
genericDeviceType valve
group Bewässerung
room Beregnungsanlage,alexa
setList on off
webCmd ein:aus:time
im normalen fhem lassen sich hervorragend durch "set xyz time " seine aufgabe erledigen (zeitliche begrenzte beregnungsdauer)
mit alexa fhem und { fhem("set Wurzelberegnung time");;return "ich habe die bewässerung eingestellt"}=beregnest du bitte die rabatten
auch
da ich jedoch einige von diesen Ventilen mit dieser einrichtung habe, wollte ich es im alexamapping zentralisieren
On=verb=bewässere,valueOn=time,valueOff=aus
leider sagt mir alexa ständig, das sie die bewässerung AUSgeschaltet hat - wie kann ich das ändern?
ein normales einschalten , möchte ich hier vermeiden, denn ein "vergessen" des abstellen, würde unangenehme Folgen haben
gruss tagedieb
die On characteristik
- ist nur zum ein und aus schalten
- kann man (aktuell) im alexaMapping nicht ändern
- hat mit fhemIntents nichts zu tun
du kannst aber mit der version 0.3.1 auch device namen im fhemIntent verwenden.
wenn du on auf on-for-timer oder etwas anderes umbiegen willst musst du das im homebridgeMapping des devices machen.
hallo justme1968
dankeschöön - da komme ich erst einmal weiter
schöne Woche
Zitat von: tagedieb am 05 März 2017, 08:41:02
@Roman
mein "Verständnis" für die Erstellung funktionstüchtiger Aufgaben für Alexa ist noch sehr gering, doch du hast ein beispiel angebracht, was mir sehr verständlich erscheint - und dazu habe ich noch eine Fragein deiner Sub erscheint diese Zeile - hast du dazu einen dummy angelegt und wenn ja, welche attr hast du ihn für diese Aufgabe gegeben, bzw welcher genericdevicetyp ist das?
ich möchte hier nicht einfach nur copy/paste veranstalten, sondern das verstehen
eine Antwort wäre toll
gruss tagedieb
Sorry für die späte Antwort, ich hab letzte Zeit wenig im Forum lesen können-
Es ist aber so wie tklein schon geschrieben hat. Ist einfach ein Dummy in den ich in den Status einfach beliebigen Text schreibe.
Hilft mir zumindest um schnell zu sehen ob und was so verstanden wird, bzw,, durch das Script gesetzt wird.
Ist meiner Meinung nach oft einfacher und schneller, als Logfiles durchsehen zu müssen.
Gruß
Roman
Hallo Roman
danke für die Rückinfo, ich habe es dann doch "copy und paste" probiert, und dabei festgestellt das dieser dummy fehlte und welche Aufgabe hatte ???
gruss tagedieb
Ich möchte den Custom Skill dazu nutzen, um den Status von Geräten abzufragen, z.B. "Alexa frag FHEM status Waschmaschine"
Das Gerät wurde unter FHEM_Device korrekt gelistet und hat die Attribute AlexaName und Alias "Waschmaschine".
Ich bekomme immer die Fehlermeldung: "Ich habe kein Gerät mit Namen waschmaschine im Raum unknown gefunden."
--> Ich will die Abfrage ja ohne Raum machen, aber scheinbar habe ich dort etwas falsch eingestellt - nur wo?
In den Sample Utterances gibt es folgenden Eintrag, die für mich keinen Raum benötigt - aber irgendwo fehlt noch etwas:
StatusIntent {Device} status
Alternativ funktioniert die Abfrage nach einem Raum - ohne Angabe des Gerätes, z.B. "Alexa frag FHEM status Waschraum"
Es werden korrekt die dort enthaltenen Geräte mit Status zurückgegeben, z.B. Waschmaschine ist aus.
Danke für den entscheidenden Tipp, wo ich hier noch eine Änderung machen muss, damit ich direkt nach dem Gerät fragen kann. :)
den fehler mit dem unknown room habe ich vorhin behoben.
neue version hier: https://forum.fhem.de/index.php/topic,60244.msg540117.html#msg540117 (https://forum.fhem.de/index.php/topic,60244.msg540117.html#msg540117)
Danke für die schnelle Antwort, habe es gerade installiert - einen Schritt weiter, noch ein kleines Problem:
ERROR: TypeError: Cannot read property 'roomsOfName' of undefined
Muss ich irgendwo noch eine weiteres Attribut hinzufügen?
Oder kann ich den echoRoom auf "Alexa" setzen, da alle Geräte ja dieser Gruppe in FHEM angehören?
wann genau kommt diese meldung? was steht auf der konsole?
Ich habe zum Testen den Befehl "Alexa frag FHEM status Waschmaschine" über Test bei developers.amazon.com im Custom Skill abgesetzt.
Service Request
{
"session": {
"sessionId": "SessionId.xxx",
"application": {
"applicationId": "amzn1.ask.skill.xxx"
},
"attributes": {},
"user": {
"userId": "amzn1.ask.account.xxx"
},
"new": true
},
"request": {
"type": "IntentRequest",
"requestId": "EdwRequestId.xxx",
"locale": "de-DE",
"timestamp": "2017-04-26T08:01:37Z",
"intent": {
"name": "StatusIntent",
"slots": {
"Device": {
"name": "Device",
"value": "Waschmaschine"
},
"preposition": {
"name": "preposition"
},
"Room": {
"name": "Room"
}
}
}
},
"version": "1.0"
}
Service Response
1. The response is invalid
Im roten X steht folgendes ... copy and paste geht leider nicht:
Parse error on line 1:
The response is inva
Expecting 'String', 'Number' ... got 'undefined'
Im Terminal seh ich folgende Ausgabe:
**** Received Directive: {"version":"1.0","session":{"new":true,"sessionId":"SessionId.xxx","application":{"applicationId":"amzn1.ask.skill.xxx"},"attributes":{},"user":{"userId":"amzn1.ask.account.xxx"}},"request":{"type":"IntentRequest","requestId":"EdwRequestId.xxx","timestamp":"2017-04-26T08:01:37Z","locale":"de-DE","intent":{"name":"StatusIntent","slots":{"preposition":{"name":"preposition"},"Room":{"name":"Room"},"Device":{"name":"Device","value":"Waschmaschine"}}}}}
[4/26/2017, 10:02:43 AM] StatusIntent
[4/26/2017, 10:02:43 AM] [FHEM] executing: http://127.0.0.1:8083/fhem?cmd=%7B$defs%7BmyAlexa%7D-%3E%7B%22active%22%7D%20=%201%7D&XHR=1
[4/26/2017, 10:02:43 AM] [FHEM] executing: http://127.0.0.1:8083/fhem?cmd=setreading%20myAlexa%20intent%20IntentRequest%20StatusIntent&XHR=1
[4/26/2017, 10:02:43 AM] [FHEM] executing: http://127.0.0.1:8083/fhem?cmd=%7B$defs%7BmyAlexa%7D-%3E%7B%22active%22%7D%20=%200%7D&XHR=1
[4/26/2017, 10:02:43 AM] [FHEM] executing: http://127.0.0.1:8083/fhem?cmd=%7B$defs%7BmyAlexa%7D-%3E%7B%22active%22%7D%20=%201%7D&XHR=1
[4/26/2017, 10:02:43 AM] [FHEM] executing: http://127.0.0.1:8083/fhem?cmd=setreading%20myAlexa%20echoId%20unknown&XHR=1
[4/26/2017, 10:02:43 AM] [FHEM] executing: http://127.0.0.1:8083/fhem?cmd=%7B$defs%7BmyAlexa%7D-%3E%7B%22active%22%7D%20=%200%7D&XHR=1
[4/26/2017, 10:02:43 AM] [FHEM] executing: http://127.0.0.1:8083/fhem?cmd=%7B$defs%7BmyAlexa%7D-%3E%7B%22active%22%7D%20=%201%7D&XHR=1
[4/26/2017, 10:02:43 AM] [FHEM] executing: http://127.0.0.1:8083/fhem?cmd=setreading%20myAlexa%20echoRoom%20unknown&XHR=1
[4/26/2017, 10:02:43 AM] [FHEM] executing: http://127.0.0.1:8083/fhem?cmd=%7B$defs%7BmyAlexa%7D-%3E%7B%22active%22%7D%20=%200%7D&XHR=1
[4/26/2017, 10:02:43 AM] [FHEM] caching: On: 0 (as number; from 'off')
[4/26/2017, 10:02:43 AM] ERROR: TypeError: Cannot read property 'roomsOfName' of undefined from ::ffff:52.209.132.237
beim testen musst du aufpassen:
- normalerweise lässt man das 'alexa, frage fhem' weg. es wird nur der text eingegeben der direkt an den skill geht
- ist das invocation word bei dir FHEM oder fhem? die schreibweise ist an dieser stelle wichtig.
der service request scheint aber trotzdem korrekt zu sein. ich habe die oben verlinkte version noch mal aktualisiert. bitte schau mal ob es damit besser geht.
wenn es immer noch nicht geht: starte alexa-fhem mal mit --debug und teste mit einem gesprochenen kommando.
Hey justme1968,
habe die neue Version installiert und es funktioniert jetzt. Vielen Dank dafür und auch generell für den Engagement für Alex FHEM, echt klasse!
Am Testen lag es nicht, das war schon korrekt gewesen. Ich habe auch jeweils andere Befehle ausprobiert, die korrekt funktioniert haben. :)
Wie bekomme ich in dem Beispiel mit der Temperatur es hin, wenn ich den Raum draußen ohne preposition abfragen will?
{alexaRoomTemperature($preposition,$Room)}=wie {preTemperature:warm;kalt} ist es {preposition} {Room}
Die Frage "Wie warm ist es im Bad" klappt prima, aber bei "Wie kalt ist es draußen" wird der Raum nicht geliefert. Wenn ich frage "Wie kalt ist es im draußen" funktioniert die Abfrage......
"FHEMperlCodeIntent_preTemperature": {
"name": "FHEMperlCodeIntent_preTemperature",
"value": "kalt"
},
"preposition": {
"name": "preposition"
},
"Room": {
"name": "Room"
}
mach die präposition optional in dem du eine zweite sample utterance ohne {preposition} angibst:{alexaRoomTemperature($preposition,$Room)}=wie {preTemperature:warm;kalt} ist es {preposition} {Room}|wie {preTemperature:warm;kalt} ist es {Room}
Hi Justme,
das könnte ich mal versuchen.
Jetzt ist die Frage ob ich Amazon die Sample utterance einfach unterjuble, oder sie von FHEM erzeugen lasse, dann benötige ich aber einen neuen fhemIntentes Eintrag.
Ich muss auch mal sehen was meine Ausführende Routine in der MyUtils dazu sagt, wenn ein Parameter fehlt. Ich hoffe der wird dann einfach leer übergeben.
Wenn alle Stricke reißen mache ich einen eigenen Intent für "wie kalt ist es draußen". Da brauche ich dann auch keinen Parameter mehr ;).
Ich hatte erhofft, dass man einen Parameter tatsächlich als optional kennzeichnen kann. Vielleicht kommt das noch mal in der Zukunft.
Viele Grüße
Ohosch
so wie oben geschrieben kannst du in einem fhemIntent mehrtet sampler utterances mit | getrennt angeben.
d.h. du brauchst keinen zweiten fhemIntent.
so ist das auch der offizielle api weg. bei optionalen parameter gibt man je ein beispiel mit und ohne an.
der andere weg ist nicht preposition zu verwenden sondern einen eigenen custom
slot type und hier am anfang ein leeres element einzubauen. ich weiß aber gerade nicht ob das im modul schon komplett eingebaut ist.
fehlende parameter werden als undef übergeben. das musst du in deinem
code berücksichtigen und gut ist.
klappt leider nicht :(
Fhem baut mit dem oder im Intent wie erwartet einen 2ten Eintrag in der Sample Utterance.
Amazon mag es allerdings nicht, wenn wenn derselbe Slot 2 mal durch den intent verwendet wird, und schmeisst mir eine Fehlermeldung.
Ich glaube ich muss das doch durch einen komplett eigenen Intetnt mit eigenem Custom Slot lösen.
Viele Grüße
Ohosch
der slot darf nur ein mal vorhanden sein. wo kommt der zweite her?
Der Slot ist nur einmal vorhanden.
Amazon sagt aber dass er 2 mal vom Intetnt verwendet wird. Ich muss am WE mal genauer schauen warum. Am 2ten Eintrag in der Sample Utterance lag es nicht. Nachdem ich den Manuell raus genommen habe konnte ich das Interaction Model immer noch nicht speichern.
schau noch mal nach.
- jeden intent darf es nur ein mal geben. jeweils mit allen (auch den eventuell unbenutzten slots)
wenn hier etwas doppelt ist -> das wäre ein fehler im alexa modul. oder copy&paste fehler.
- die custom slots darf es je nur ein mal geben. wenn hier etwas doppelt ist -> fehler im modul. oder copy&paste fehler.
- die sample utterances darf es so oft geben wie man es braucht. jeweils mit anderen sätzen und anderer kombination an slot typen.
Könnte es daran liegen? das hat das Alxa Modul so gebaut. ich habe Deinen Vorschlag mit dem | im FhemIntent realisiert.
"slots" : [
{
"name" : "FHEMperlCodeIntent_preTemperature",
"type" : "FHEMperlCodeIntent_preTemperature_Value"
},
{
"name" : "preposition",
"type" : "FHEM_preposition"
},
{
"name" : "Room",
"type" : "FHEM_Room"
},
{
"type" : "FHEMperlCodeIntent_preTemperature_Value",
"name" : "FHEMperlCodeIntent_preTemperature"
},
{
"type" : "FHEM_Room",
"name" : "Room"
}
]
},
FHEM scheint das Interaction Model falsch zu bauen wenn mann ein oder "|" im Intent verwendet.
Ich habe den Code oben in das hier abgeändert und nun schluckt Amazon es. Zumindest beim Test konnte ich jetzt auch mit und ohne Präpositon arbeiten.
So Funktioniert es nun:
"slots" : [
{
"name" : "FHEMperlCodeIntent_preTemperature",
"type" : "FHEMperlCodeIntent_preTemperature_Value"
},
{
"name" : "preposition",
"type" : "FHEM_preposition"
},
{
"name" : "Room",
"type" : "FHEM_Room"
}
]
},
hab es im alexa modul repariert. ab morgen im update.
eine kleine einschränkung gibt es: ich war zu faul den fall zu berücksichtigen das gleiche slot namen mit unterschiedlichen values angegeben werden. deshalb werden nur die values des ersten vorkommen berücksichtigt. streng genommen kann man sogar die values der anderen dann weg lassen. d.h. z.b. beim zweiten preTemperature die warm;kalt aufzählung:{alexaRoomTemperature($preposition,$Room)}=wie {preTemperature:warm;kalt} ist es {preposition} {Room}|wie {preTemperature} ist es {Room}
Cool, vielen Dank und ein riesen Lob für den super Support :)
Dank der guten Beschreibungen habe ich nun auch den Echo problemlos in Betrieb nehmen können. Natürlich habe ich gleich am Custom Skill herumgebastelt und bin sehr schnell an meine eBus Daten und Energiewerte vom Youless Device gekommen. Am einfachsten erscheint mir hier die 99_myUtils geeignet zu sein, da ich mir hier die Messdaten beliebig zusammen stellen kann.
2 FHEMIntents hinzugefügt
{alexaHeizung()}=heizungsstatus
{currentEnergy()}=energieverbrauch
Sample Utterances Skill
FHEMperlCodeIntentB heizungsstatus
FHEMperlCodeIntentC energieverbrauch
und etwas Code in der 99_myUtils.pm
sub currentEnergy() {
my $title = ReadingsVal("LS110_2", "electricityPower", "");
my $titleday = int(ReadingsVal("LS110_2", "electricityConsumed_EnergyDay", ""));
my $titlespitze = int(ReadingsVal("LS110_2", "electricityConsumed_PowerDayMax", ""));
my $titlekosten = int(ReadingsVal("LS110_2", "electricityConsumed_EnergyCostDay", ""));
return "Die aktuelle Leistung beträgt $title Watt und der Tagesverbrauch ist $titleday Kilowatt. Die Spitze betrug $titlespitze Watt. Die Stromkosten betrugen heute $titlekosten Euro";
}
sub alexaHeizung() {
my $titlevorlauf = ReadingsVal("Vorlauf", "temperature", "");
$titlevorlauf =~ s/\./,/g;
my $titlekurve = ReadingsVal("HKurve", "HKurve", "");
$titlekurve =~ s/\./,/g;
my $titletemp = ReadingsVal("HKurve", "Aussentemp", "");
$titletemp =~ s/\./,/g;
my $titlekueche = ReadingsVal("Kueche", "state", "");
$titlekueche =~ s/on/ein/g;
my $titlewohn = ReadingsVal("Wohnzimmer", "state", "");
$titlewohn =~ s/on/ein/g;
my $titleeg = ReadingsVal("PumpeEG", "state", "");
$titleeg =~ s/on/ein/g;
return "Der Vorlauf beträgt $titlevorlauf Grad und die Heizkurve ist auf $titlekurve eingestellt. Die Pumpe in der Küche ist $titlekueche im Wohnzimmer $titlewohn und im Erdgeschoss $titleeg ";
}
hier musste ich zusätzlich noch den Dezimalpunkt und den Text "Ein" korrigieren.
Danke an alle die das ermöglicht haben!
LG
Reinhart
Hier mal mein Setup
Alexa Sub
package main;
use strict;
use warnings;
use POSIX;
sub
Alexa_Sprache_Utils_Initialize($$)
{
my ($hash) = @_;
}
sub get_alexa_skill_name(){
my @skillArray = (["XX","amzn1.ask.skill.www","allen"],
["WZ","amzn1.ask.skill.xxx","wohnzimmer"],
["K1","amzn1.ask.skill.yyy","charlotte"],
["KU","amzn1.ask.skill.zzz","küche"],
["K2","amzn1.ask.skill.ccc","johanna"],
["FL","amzn1.ask.skill.vvv","flur"]);
my $skillID = ReadingsVal("Alexa_Device","fhemIntent",0);
my $ret = "";
for(my $i = 0; $i<@skillArray; $i++){
if( $skillID =~ $skillArray[$i][1] ){
$ret = $skillArray[$i][0]." ".$skillArray[$i][2];
last;
}
}
return $ret;
}
#####################################################################
#
# alexa_guten_morgen
#
#####################################################################
sub alexa_master($)
{
my ($aktion) = @_;
my ($skillName,$skillRoom) = split(m/\ /,get_alexa_skill_name());
fhem "setreading Alexa_Device alexaSub master";
fhem "setreading Alexa_Device skillName ".$skillName;
fhem "setreading Alexa_Device skillRoom ".$skillRoom;
fhem "setreading Alexa_Device aktion ".$aktion;
fhem "setreading Alexa_Device szene ";
if(lc($aktion) =~ m/hallo|guten.morgen/){
if( $skillName eq "XX"){
fhem "set SONOS_Kueche_STATUS on";
fhem "set Rolladen_Gruppe_Alle pct 0";
return $aktion.", ich habe in der Küche Sonos an geschalten und alle Rolladen geöffnet";
}
elsif ( $skillName eq "K1"){
fhem "set K1_RA pct 0";
return $aktion.", ich habe bei ".$skillRoom." das Rollo geöffnet";
}
elsif ( $skillName eq "K2"){
fhem "set K2_RA pct 0";
return $aktion.", ich habe bei ".$skillRoom." das Rollo geöffnet";
}
elsif ( $skillName eq "KU"){
fhem "set SONOS_Kueche_STATUS on";
return $aktion.", ich habe in der ".$skillRoom." das Radio an geschalten";
}
else {
return "Für den Skill ".$skillRoom." gibt es keine Aktion ".$aktion ;
}
}elsif(lc($aktion) =~ m/tschüss|gute.nacht|auf.wiedersehen/){
if( $skillName eq "XX"){
fhem "set SONOS_Kueche_STATUS off";
fhem "set Rolladen_Gruppe_Alle pct 100";
return "Ich habe in der Küche das Radio aus geschalten. ".$aktion;
}
elsif ( $skillName eq "WZ"){
fhem "set WZ_DA_R_SW off";
fhem "set WZ_DA_L_SW off";
fhem "set WZ_HUB activity PowerOff";
return "Ich habe im ".$skillRoom." das Licht und den Fernseher aus geschalten. ".$aktion;
}
elsif ( $skillName eq "K1"){
fhem "set K1_RA pct 100";
return "Ich habe bei ".$skillRoom." das Rollo geschlossen.";
}
elsif ( $skillName eq "K2"){
fhem "set K2_RA pct 100";
return "Ich habe bei ".$skillRoom." das Rollo geschlossen.";
}
elsif ( $skillName eq "KU"){
fhem "set SONOS_Kueche_STATUS off";
return "Ich habe in der ".$skillRoom." das Radio aus geschalten. ".$aktion;
}
else {
return "Für den Skill ".$skillRoom." gibt es keine Aktion ".$aktion ;
}
}elsif(lc($aktion) =~ m/ausschlafen|aus.schlafen/){
if( $skillName eq "XX"){
fhem "set Rollos_Automatik off";
return "Ich habe die Rolladenautomatik aus geschalten. ";
}
else {
return "Für den Skill ".$skillRoom." gibt es keine Aktion ".$aktion ;
}
}else{
return "Für die Master Routine gibt es keine Aktion ".$aktion ;
}
}
#####################################################################
#
# alexa_licht
#
#####################################################################
sub alexa_licht($$){
my ($aktion,$szene) = @_;
my ($skillName,$skillRoom) = split(m/\ /,get_alexa_skill_name());
fhem "setreading Alexa_Device alexaSub licht";
fhem "setreading Alexa_Device skillName ".$skillName;
fhem "setreading Alexa_Device skillRoom ".$skillRoom;
fhem "setreading Alexa_Device aktion ".$aktion;
fhem "setreading Alexa_Device szene ".$szene;
# LichtSzene WZ
if(lc($aktion) eq "lichtszene" && $skillName eq "WZ"){
if( $szene eq "essen" ){
fhem "set WZ_LightSzene_RP Essen";
return "Ich habe die ".$aktion." im ".$skillRoom." auf essen gestellt";
}
elsif( $szene eq "fernsehen" ){
fhem "set WZ_LightSzene_RP TV";
return "Ich habe die ".$aktion." im ".$skillRoom." auf fernsehen gestellt";
}
elsif( $szene eq "film" ){
fhem "set WZ_LightSzene_RP Beamer";
return "Ich habe die ".$aktion." im ".$skillRoom." auf Film schauen gestellt";
}
elsif( $szene eq "an" ){
fhem "set WZ_LightSzene_RP An";
return "Ich habe die ".$aktion." im ".$skillRoom." auf an gestellt";
}
elsif( $szene eq "aus" ){
fhem "set WZ_LightSzene_RP Aus";
return "Ich habe die ".$aktion." im ".$skillRoom." auf aus gestellt";
}
else {
return "Für den Raum ".$skillRoom." gibt es keine ".$aktion." mit dem Namen ".$szene ;
}
# Licht WZ
}elsif(lc($aktion) eq "licht" && $skillName eq "WZ"){
if( $szene eq "an" ){
fhem "set WZ_LightSzene_RP An";
return "Ich habe das ".$aktion." im ".$skillRoom." an gestellt";
}
elsif( $szene eq "aus" ){
fhem "set WZ_LightSzene_RP Aus";
fhem "set WZ_DA_R_SW off";
fhem "set WZ_DA_L_SW off";
return "Ich habe sämtliche Lichter im ".$skillRoom." aus gemacht";
}
else {
return "Für den Raum ".$skillRoom." gibt es keine Aktion ".$aktion." mit der Funktion ".$szene ;
}
# Licht Charlotte
}elsif(lc($aktion) eq "licht" && $skillName eq "K1"){
if( $szene eq "an" ){
fhem "set K1_LE_Ball on";
return "Ich habe das ".$aktion." bei ".$skillRoom." an gestellt";
}
elsif( $szene eq "aus" ){
fhem "set K1_LE_Ball off";
return "Ich habe das ".$aktion." bei ".$skillRoom." aus gemacht";
}
elsif( $szene eq "nacht" ){
fhem "set K1_LE_Ball night";
return "Ich habe das ".$aktion." bei ".$skillRoom." auf Nachtmodus gestellt";
}
else {
return "Für den Raum ".$skillRoom." gibt es keine Aktion ".$aktion." mit der Funktion ".$szene ;
}
# Licht Johanna
}elsif(lc($aktion) eq "licht" && $skillName eq "K2"){
if( $szene eq "an" ){
fhem "set K2_LE_Ball on";
return "Ich habe das ".$aktion." bei ".$skillRoom." an gestellt";
}
elsif( $szene eq "aus" ){
fhem "set K2_LE_Ball off";
return "Ich habe das ".$aktion." bei ".$skillRoom." aus gemacht";
}
else {
return "Für den Raum ".$skillRoom." gibt es keine Aktion ".$aktion." mit der Funktion ".$szene ;
}
# Licht Flur
}elsif(lc($aktion) eq "licht" && $skillName eq "FL"){
if( $szene eq "an" ){
fhem "set FL_SA1_Licht on";
fhem "set TA_SA2_Licht on";
return "Ich habe das ".$aktion." im ".$skillRoom." an gestellt";
}
elsif( $szene eq "aus" ){
fhem "set FL_SA1_Licht off";
fhem "set TA_SA2_Licht off";
return "Ich habe das ".$aktion." im ".$skillRoom." aus gemacht";
}
else {
return "Für den Raum ".$skillRoom." gibt es keine Aktion ".$aktion." mit der Funktion ".$szene ;
}
}else{
return "Für die Licht Routine gibt es keine Aktion ".$aktion." mit der Funktion ".$szene ;
}
}
#####################################################################
#
# alexa_media
#
#####################################################################
sub alexa_media($$){
my ($aktion,$szene) = @_;
my ($skillName,$skillRoom) = split(m/\ /,get_alexa_skill_name());
fhem "setreading Alexa_Device alexaSub media";
fhem "setreading Alexa_Device skillName ".$skillName;
fhem "setreading Alexa_Device skillRoom ".$skillRoom;
fhem "setreading Alexa_Device aktion ".$aktion;
fhem "setreading Alexa_Device szene ".$szene;
# Media KU
if(lc($aktion) eq "radio" && $skillName eq "KU"){
if( $szene eq "an" ){
fhem "set SONOS_Kueche_STATUS on";
return "Ich habe das ".$aktion." in der ".$skillRoom." an gestellt";
}
elsif( $szene eq "aus" ){
fhem "set SONOS_Kueche_STATUS off";
return "Ich habe das ".$aktion." in der ".$skillRoom." aus gemacht";
}
else {
return "In dem Raum ".$skillRoom." gibt es kein ".$aktion ;
}
# Media WZ
}elsif(lc($aktion) eq "fernseher" && $skillName eq "WZ"){
if( $szene eq "an" ){
fhem "set WZ_HUB activity FernsehenTV";
return "Ich habe den ".$aktion." im ".$skillRoom." an gestellt";
}
elsif( $szene eq "aus" ){
fhem "set WZ_HUB activity PowerOff";
return "Ich habe den ".$aktion." im ".$skillRoom." aus gemacht";
}
else {
return "Für den Raum ".$skillRoom." gibt es keine Aktion ".$aktion." mit der Funktion ".$szene ;
}
# Media XX
}elsif(lc($aktion) eq "klingel" && $skillName eq "XX"){
if( $szene eq "an" ){
fhem "set XX_LA_Klingel off";
return "Ich habe die ".$aktion." an gestellt";
}
elsif( $szene eq "aus" ){
fhem "set XX_LA_Klingel on";
return "Ich habe die ".$aktion." stumm geschalten";
}
else {
return "Für den Skill ".$skillRoom." gibt es keine ".$aktion." mit der Funktion ".$szene ;
}
}else{
return "Für die Media Routine gibt es keine Aktion ".$aktion." mit der Funktion ".$szene ;
}
}
1;
fhemIntends im AlexaDevice
{ alexa_master($AKTION) }={AKTION:hallo;guten+morgen;tschüss;gute+nacht;auf+wiedersehen}
{ alexa_licht($AKTION,$SZENE) }={AKTION:licht;lichtszene} {SZENE:essen;fernsehen;film;an;aus}
{ alexa_media($AKTION,$SZENE) }={AKTION:radio;fernseher;klingel} {SZENE:an;aus}
Edit:
Eintrag in den richtigen Thread verschoben
Zitat von: Amenophis86 am 15 Juni 2017, 16:44:31
Ich bin dabei den Custom Skill zu lernen, habe aber noch Verständnisprobleme mit Homemapping und AlexaMapping.
Was will ich machen?
"Alexa, sage Smarti: Melde XY ab/an"
Was soll passieren?
Das Device XY (Aktuell ein Dummy Test, spätere mehrere Dummys) soll auf "anwesend"/"abwesend" gesetzt werden. (Aktuell test ich mit on/off um es einfacher zu verstehen)
Was habe ich bisher:
- Der Custom Skill funktioniert
- Im AlexaMapping habe ich folgendes ergänzt: TargetAnwesenheit=verb=melde,values=an:on;ab:off
- Im Custom Skill:
{
"intent" : "TargetAnwesenheitIntent",
"slots" : [
{
"name" : "article",
"type" : "FHEM_article"
},
{
"name" : "Device",
"type" : "FHEM_Device"
},
{
"type" : "FHEM_preposition",
"name" : "preposition"
},
{
"name" : "Room",
"type" : "FHEM_Room"
},
{
"type" : "TargetAnwesenheit_Value",
"name" : "TargetAnwesenheit_Value"
}
]
},
TargetAnwesenheit_Value an | ab
TargetAnwesenheitIntent melde {Device} {TargetAnwesenheit_Value}
TargetAnwesenheitIntent melde {Device} {preposition} {Room} {TargetAnwesenheit_Value}
TargetAnwesenheitIntent melde {article} {Device} {TargetAnwesenheit_Value}
TargetAnwesenheitIntent melde {article} {Device} {preposition} {Room} {TargetAnwesenheit_Value}
Mein Dummy:
Internals:
CFGFN
NAME test
NR 3092
STATE ???
TYPE dummy
Attributes:
alexaName Anja
alexaRoom Test
genericDeviceType switch
room Z_alexa
Zum testen hatte ich mal genericDeviceType switch
gesetzt
Alex Antwortet mir: "Ich habe Ich kann anja nicht auf ab schalten. ab gestellt"
Vermutlich muss ich jetzt noch irgendwie das homebridgeMapping im Dummy setzen, aber verstehe nicht wie.
[alexa-fhem | Custom Skills] Probleme mit euren Setups (https://forum.fhem.de/index.php/topic,67398.0.html)
Zitat von: prodigy7 am 17 Juni 2017, 08:02:43
[alexa-fhem | Custom Skills] Probleme mit euren Setups (https://forum.fhem.de/index.php/topic,67398.0.html)
Aufgrund der vielen Alexa Threads wohl im falschen gelandet. Danke für den Hinweis.
Hi,
leider kann ich machen was ich will. Ich versuche meine MAX! Tür und Fenster Kontakte mit Alexa abzufragen, doch leider kommt immer nur "Der Status von Fenster im ... ist geschlossen" obwohl es auf ist.
Internals:
CFGFN ./FHEM/Raumklima.cfg
CHANGED
CULMAX_MSGCNT 23
CULMAX_TIME 2017-07-12 00:29:57
DEF ShutterContact 0a5455
IODev CULMAX
LASTInputDev CULMAX
MSGCNT 23
NAME KU_Fenster
NR 815
RSSI -70.5
STATE opened
TYPE MAX
addr 0a5455
backend CULMAX
rferror 0
type ShutterContact
READINGS:
2017-07-12 00:29:57 RSSI -70.5
2017-07-12 00:29:57 battery ok
2017-07-12 00:29:57 onoff 1
2017-07-12 00:29:57 state opened
internals:
interfaces switch_active;battery
Attributes:
IODev CULMAX
alexaName fenster
alexaRoom küche
alias Fenster-Küche
devStateIcon opened:fts_window_2w_open@red closed:fts_window_2w@green
event-on-change-reading state
genericDeviceType contact
homebridgeMapping clear ContactSensorState=state,values=opened:CONTACT_DETECTED,closed:CONTACT_NOT_DETECTED
room Alarm,Alexa,Raumklima
Das Logging gibt folgendes aus:
[2017-07-10 23:32:04] [Alexa_Custom_Skill] BU_Fenster is ContactSensor
[2017-07-10 23:32:04] [Alexa_Custom_Skill] BU_Fenster has
[2017-07-10 23:32:04] [Alexa_Custom_Skill] StatusLowBattery [battery]
[2017-07-10 23:32:04] [Alexa_Custom_Skill] ContactSensorState [state]
[2017-07-10 23:32:04] [Alexa_Custom_Skill] CurrentDoorState [state]
[2017-07-10 23:32:04] [Alexa_Custom_Skill] { reading: 'battery',
values: [ 'ok:BATTERY_LEVEL_NORMAL', '/.*/:BATTERY_LEVEL_LOW' ],
device: 'BU_Fenster',
informId: 'BU_Fenster-battery',
characteristic_type: 'StatusLowBattery',
log:
{ [Function: bound ]
debug: [Function],
info: [Function],
warn: [Function],
error: [Function],
log: [Function],
prefix: 'Alexa_Custom_Skill' },
value2homekit: { ok: 'BATTERY_LEVEL_NORMAL' },
value2homekit_re: [ { re: '.*', to: 'BATTERY_LEVEL_LOW' } ] }
2017-07-10 23:32:04 caching: BU_Fenster-battery: ok
[2017-07-10 23:32:04] [Alexa_Custom_Skill] { reading: 'state',
values: [ 'closed:CONTACT_DETECTED', '/.*/:CONTACT_NOT_DETECTED' ],
device: 'BU_Fenster',
informId: 'BU_Fenster-state',
characteristic_type: 'ContactSensorState',
log:
{ [Function: bound ]
debug: [Function],
info: [Function],
warn: [Function],
error: [Function],
log: [Function],
prefix: 'Alexa_Custom_Skill' },
value2homekit: { closed: 'CONTACT_DETECTED' },
value2homekit_re: [ { re: '.*', to: 'CONTACT_NOT_DETECTED' } ] }
2017-07-10 23:32:04 caching: BU_Fenster-state: closed
[2017-07-10 23:32:04] [Alexa_Custom_Skill] { reading: 'state',
values: [ 'closed:CLOSED', '/.*/:OPEN' ],
device: 'BU_Fenster',
informId: 'BU_Fenster-state',
characteristic_type: 'CurrentDoorState',
log:
{ [Function: bound ]
debug: [Function],
info: [Function],
warn: [Function],
error: [Function],
log: [Function],
prefix: 'Alexa_Custom_Skill' },
value2homekit: { closed: 'CLOSED' },
value2homekit_re: [ { re: '.*', to: 'OPEN' } ] }
Auch muss ich dazu sagen, dass der "state" bei diesen Geräten opened und closed annehmen kann. Als weiteres Reading gibt es noch "onoff", dieses kann "0" und "1" annehmen.
Meine Vermutung ist dass an Stelle von "open" eben "opened" zu Verfügung gestellt wird. Habe das mit dem "onoff" auch schon versucht zu nutzen. Als genericdevice habe ich schon diverse versucht, ohne Erfolg.
Ich hoffe, dass mir von Euch Profis jemand helfen kann.
Danke
Uli
das device listing ist von KU_Fenster, das alexa log von BU_Fenster. kann es sein das du beim falschen device bist?
die max kontakte sollten auch komplett automatisch erkannt werden. ohne das genericDeviceType und homebridgeMapping gesetzt werden muss.
Oh sorry, habe nur einen Ausschnitt kopiert, die sind alle identisch. Es ist aber schon komisch dass er bei mir keinen einzigen Kontakt erkennt. Ich hatte es zuerst ohne jegliche Einträge in den genericDeviceTypes und homebridgeMappings versucht.
Würde eventuell ein Dummy bzw. Notify helfen?
Uli
zeig mal ein jsonlist2 von einem der max devices.
dummys und notifys sind nichtnötig.
Hier ein Jsonlist2 vom Bürofenster:
{
"Name":"BU_Fenster",
"PossibleSets":"wakeUp factoryReset groupid associate:WZ_Termostat deassociate:WZ_Termostat",
"PossibleAttrs":"alias comment:textField-long eventMap group room suppressReading userReadings:textField-long verbose:0,1,2,3,4,5 IODev do_not_notify:1,0 ignore:0,1 dummy:0,1 showtime:1,0 keepAuto:0,1 scanTemp:0,1 event-on-change-reading event-on-update-reading event-aggregator event-min-interval stateFormat:textField-long timestamp-on-change-reading alexaName alexaRoom cmdIcon devStateIcon devStateStyle fm_fav fm_groups fm_name fm_order fm_type fm_view genericDeviceType:security,ignore,switch,outlet,light,blind,thermometer,thermostat,contact,garage,window,lock homebridgeMapping:textField-long icon room_map sortby structexclude webCmd widgetOverride userattr",
"Internals": {
"CFGFN": "./FHEM/Raumklima.cfg",
"CHANGED": "null",
"CULMAX_MSGCNT": "14",
"CULMAX_TIME": "2017-07-13 06:42:59",
"DEF": "ShutterContact 1511a5",
"LASTInputDev": "CULMAX",
"MSGCNT": "14",
"NAME": "BU_Fenster",
"NR": "881",
"RSSI": "-55.5",
"STATE": "closed",
"TYPE": "MAX",
"addr": "1511a5",
"backend": "CULMAX",
"rferror": "0",
"type": "ShutterContact"
},
"Readings": {
"RSSI": { "Value":"-55.5", "Time":"2017-07-13 06:42:59" },
"battery": { "Value":"ok", "Time":"2017-07-13 06:42:59" },
"onoff": { "Value":"0", "Time":"2017-07-13 06:42:59" },
"state": { "Value":"closed", "Time":"2017-07-13 06:42:59" }
},
"Attributes": {
"IODev": "CULMAX",
"alexaName": "fenster",
"alexaRoom": "büro",
"alias": "Fenster-Büro",
"devStateIcon": "opened:fts_window_2w_open@red closed:fts_window_2w@green",
"event-on-change-reading": "state",
"room": "Alarm,Alexa,Raumklima"
}
},
Ich hoffe dass Du da etwas findest.
Danke
Uli
Hallo, vielen dank an die super Beschreibungen und Beispiele!
Ich hab nir auch eine 99_Alexa_Sprache_Utils.pm gebastelt!
package main;
use strict;
use warnings;
use POSIX;
sub
Alexa_Sprache_Utils_Initialize($$)
{
my ($hash) = @_;
}
##### Start Warmwasser
sub
alexa_warmwasser()
{
my $wwasser = ReadingsVal("WarmWasser","alexatemp","");; #Value("Ww_Floorplan");
if ($wwasser >= 42) {
return "Die Warmwassertemperatur beträgt $wwasser °C, wenn du baden oder duschen möchtest ist das kein Problem!";
}elsif ($wwasser >= 35) {
return "Die Warmwassertemperatur beträgt $wwasser °C, wenn du duschen möchtest ist das kein Problem!";
}else{
return "Die Warmwassertemperatur beträgt $wwasser °C.";
}
}
#####Ende Warmwasser
1;
Kann man damit aber auch einen schaltbefehl abarbeiten?
Ich möchte sagen "Alexe, sage Smart Home, lade Warmwasser!"
geht das?
Oder das Alexa gleich fragt, wenn das Wasser unter 35C ist ob ich das Wasser nachladen möchte!
LG
Marlen
Du kannst natürlich in die SUB auch entsprechende set-Befehle einbauen.
Hab ich so zB. bei meiner Kaffeemaschine gemacht:
sub macheKaffee($$) {
my($num,$State) = @_;
if (Value("KM.Kueche_Filterkaffee") eq "ready" && $State eq "schwache") {
fhem ("set KM.Kueche_Filterkaffee brew $num weak");
return "ich mache $num $State Kaffee für dich.";
}
elsif (Value("KM.Kueche_Filterkaffee") eq "ready" && $State eq "mittlere") {
fhem ("set KM.Kueche_Filterkaffee brew $num medium");
return "ich mache $num $State Kaffee für dich.";
}
elsif (Value("KM.Kueche_Filterkaffee") eq "ready" && $State eq "starke") {
fhem ("set KM.Kueche_Filterkaffee brew $num strong");
return "ich mache $num $State Kaffee für dich.";
}
Eine weiterer direkter Befehl bei Rückmeldungen von Alexa geht meines Wissens noch nicht.
Gruß Cobra
Wie schaut das dann in deinem fhemIntents aus?
Was sagst du dann? "Alexa, sage Samrt Home machKaffee stark!"?
LG
Marlen
Hey Marlen,
mein fhemIntent ist folgendermaßen:
{macheKaffee($num,$State)}=mache {num:AMAZON.NUMBER} {State:schwache;mittlere;starke;extrastarke} Kaffee
Also zB.
Alexa, sage James mache 5 mittlere Kaffee
Alexa, sage James mache 9 starke Kaffee
etc.
Gruß Cobra
Hallo,
ich hab jetzt 4 fhemIntents angelegt!
Und natürlich auch in der 99_Alexa_Sprache_Utils.pm!
1.{alexa_tagesverbrauch()}=tagesverbrauch
2.{alexa_garagentor()}=garagentor
3.{alexa_garagentor_auf()}=garagentor auf
4. {alexa_garagentor_zu()}=garagentor zu
3.& 4. funktionieren gut!
aber 1. & 2. wollen nicht so! Liegt das daran, wie ich sage:
"Alexa, frage Smart Home nach Tagesverbrauch!"
"Alexa, frage Smart Home nach Garagentor!"
Liegt das an dem "nach" ????
Wenn ich "Alexa, lade Smart Home" und dann nur "Tagesverbrauch", dann klappt es!
was hast du denn im Skill für den Intent angegeben?
Ich meine dass wenn du sagst:
"Alexa, frage Smart Home nach Tagesverbrauch!"
"Alexa, frage Smart Home nach Garagentor!"
Dass dann das fhemIntent auch z.B. so aussehen muss:
1.{alexa_tagesverbrauch()}=nach tagesverbrauch
2.{alexa_garagentor()}=nach garagentor
Zitat von: Amenophis86 am 20 Juli 2017, 13:16:35
was hast du denn im Skill für den Intent angegeben?
Muss ich da was manuell ändern?
{
"intents": [
{
"slots": [
{
"name": "article",
"type": "FHEM_article"
},
{
"name": "Device",
"type": "FHEM_Device"
},
{
"name": "preposition",
"type": "FHEM_preposition"
},
{
"name": "Room",
"type": "FHEM_Room"
},
{
"name": "Weckzeit_valuePrefix",
"type": "Weckzeit_prefix"
},
{
"name": "uhr_Value",
"type": "AMAZON.TIME"
}
],
"intent": "uhrIntent"
},
{
"slots": [
{
"name": "article",
"type": "FHEM_article"
},
{
"name": "Device",
"type": "FHEM_Device"
},
{
"name": "preposition",
"type": "FHEM_preposition"
},
{
"name": "Room",
"type": "FHEM_Room"
},
{
"name": "prozent_Value",
"type": "AMAZON.NUMBER"
}
],
"intent": "prozentIntent"
},
{
"slots": [
{
"name": "article",
"type": "FHEM_article"
},
{
"name": "Device",
"type": "FHEM_Device"
},
{
"name": "preposition",
"type": "FHEM_preposition"
},
{
"name": "Room",
"type": "FHEM_Room"
},
{
"name": "On_Value",
"type": "On_Value"
}
],
"intent": "OnIntent"
},
{
"slots": [
{
"name": "article",
"type": "FHEM_article"
},
{
"name": "Device",
"type": "FHEM_Device"
},
{
"name": "preposition",
"type": "FHEM_preposition"
},
{
"name": "Room",
"type": "FHEM_Room"
},
{
"name": "TargetPosition_Value",
"type": "TargetPosition_Value"
}
],
"intent": "TargetPositionIntent"
},
{
"slots": [
{
"name": "article",
"type": "FHEM_article"
},
{
"name": "Device",
"type": "FHEM_Device"
},
{
"name": "preposition",
"type": "FHEM_preposition"
},
{
"name": "Room",
"type": "FHEM_Room"
},
{
"name": "Brightness_Value",
"type": "AMAZON.NUMBER"
}
],
"intent": "BrightnessIntent"
},
{
"slots": [
{
"name": "article",
"type": "FHEM_article"
},
{
"name": "Device",
"type": "FHEM_Device"
},
{
"name": "preposition",
"type": "FHEM_preposition"
},
{
"name": "Room",
"type": "FHEM_Room"
},
{
"name": "grad_Value",
"type": "AMAZON.NUMBER"
}
],
"intent": "gradIntent"
},
{
"slots": [
{
"name": "article",
"type": "FHEM_article"
},
{
"name": "Device",
"type": "FHEM_Device"
},
{
"name": "preposition",
"type": "FHEM_preposition"
},
{
"name": "Room",
"type": "FHEM_Room"
},
{
"name": "Saturation_Value",
"type": "AMAZON.NUMBER"
}
],
"intent": "SaturationIntent"
},
{
"slots": [
{
"name": "article",
"type": "FHEM_article"
},
{
"name": "Device",
"type": "FHEM_Device"
},
{
"name": "preposition",
"type": "FHEM_preposition"
},
{
"name": "Room",
"type": "FHEM_Room"
},
{
"name": "Saturation_ValueB",
"type": "AMAZON.NUMBER"
}
],
"intent": "SaturationIntentB"
},
{
"slots": [
{
"name": "article",
"type": "FHEM_article"
},
{
"name": "Device",
"type": "FHEM_Device"
},
{
"name": "preposition",
"type": "FHEM_preposition"
},
{
"name": "Room",
"type": "FHEM_Room"
},
{
"name": "Hue_Value",
"type": "Hue_Value"
}
],
"intent": "HueIntent"
},
{
"slots": [
{
"name": "article",
"type": "FHEM_article"
},
{
"name": "Device",
"type": "FHEM_Device"
},
{
"name": "preposition",
"type": "FHEM_preposition"
},
{
"name": "Room",
"type": "FHEM_Room"
},
{
"name": "Hue_ValueB",
"type": "Hue_ValueB"
}
],
"intent": "HueIntentB"
},
{
"intent": "FHEMperlCodeIntent"
},
{
"intent": "FHEMperlCodeIntentB"
},
{
"intent": "FHEMperlCodeIntentC"
},
{
"intent": "FHEMperlCodeIntentD"
},
{
"intent": "FHEMperlCodeIntentE"
},
{
"intent": "FHEMperlCodeIntentF"
},
{
"intent": "FHEMperlCodeIntentG"
},
{
"slots": [
{
"name": "Device",
"type": "FHEM_Device"
},
{
"name": "preposition",
"type": "FHEM_preposition"
},
{
"name": "Room",
"type": "FHEM_Room"
}
],
"intent": "StatusIntent"
},
{
"slots": [
{
"name": "preposition",
"type": "FHEM_preposition"
},
{
"name": "Room",
"type": "FHEM_Room"
}
],
"intent": "RoomAnswerIntent"
},
{
"intent": "RoomListIntent"
},
{
"slots": [
{
"name": "article",
"type": "FHEM_article"
},
{
"name": "Room",
"type": "FHEM_Room"
}
],
"intent": "DeviceListIntent"
},
{
"intent": "AMAZON.CancelIntent"
},
{
"intent": "AMAZON.StopIntent"
}
]
}
Am einfachsten ist, wenn du nach der Erstellung der fhemIntents nochmal alles wesentliche bei Alexa im Skill auf der Developer-Seite neu reinkopierst.
Ich mag mich ja irren, aber im Sample Utterances musst du es auch anpassen. Hier mal ein Beispiel meiner Intents:
FHEMperlCodeIntent guten morgen
FHEMguteNachtIntent gute nacht
FHEMperlCodeIntentB welche kontakte sind offen
FHEMperlCodeIntentB welche kontakte sind noch offen
FHEMperlCodeIntentB sind noch kontakte offen
FHEMperlCodeIntentC schalte am Fernseher {Programm} {On_Value}
FHEMperlCodeIntentC schalte den Fernseher auf {Programm} um
FHEMperlCodeIntentC stelle den Fernseher auf {Programm}
FHEMperlCodeIntentD stelle den Fernseher {lautstaerke}
FHEMperlCodeIntentD stelle den Ton am Fernseher {lautstaerke}
FHEMperlCodeIntentE stell den Fernseher auf Laustärke {stufe}
FHEMperlCodeIntentE stell den Fernseher auf Stufe {stufe}
FHEMperlCodeIntentE stell den Ton am Fernseher auf Stufe {stufe}
Dazu natürlich das Intent Schema und die Slot Types angepasst.
Ach hier kann man auch mehrer "Auslösetexte" festlegen?
Und das FHEMperlCodeIntentB bedeutet, dass einfach welcher Sub aus der 99_Alexa_Sprache_Utils.pm abgearbeitet wird!?
Wenn ich es richtig verstanden habe (und soweit klappt es bei mir), werden die Intents mittels der Buchstaben durch nummeriert. Im Alexa Device sieht es dazu wie folgt aus bei mir:
#IntentName=<sample utterance>
{alexa_gutenmorgen()}=guten morgen
guteNacht=gute nacht
{alexa_kontakte()}=welche kontakte sind offen
{alexa_tv_programm($Programm)}=schalte am Fernseher {Programm} ein
{alexa_tv_lautstaerke($lautstaerke)}=stellen den Fehrnseher {$lautstaerke}
{alexa_tv_lautstaerke_stufe($stufe)}=stell den Fernseher auf Laustärke {$stufe}
bitten nichts in die namen hinein interpretieren. die können sich ändern. wenn man mehrere sätze für den gleichen intent verwenden möchte einfach mit | getrennt im attribut angeben.
Soll das heißen die Sample Utterances im Skill sind nicht relevant? Dachte dort werden die verschiedenen Sätze abgebildet, wie von mir hier (https://forum.fhem.de/index.php/topic,65890.msg662001.html#msg662001) gepostet? Werden die Sätze etwa alle im Attr fhemIntents angegeben?
die sind relevant aber man sollte sie im attribut anpassen und dann nur das get ergebniss dort eintragen.
das ist zwar aktuell nur zum teil relevant da man noch nichts per api zu amazon hoch laden kann. aber ich denke das kommt irgendwann.
zum anderen überschreibt man sich nicht aus versehen etwas weil man einfach stur die komplette get ausgabe verwenden kann ohne von hand häppchenweise zu kopieren.
ausserdem kann der skill nur die variablen für custom slots füllen die er auch kennt. die information kommt ebenfalls aus dem attribut.
Kann dir leider nicht ganz folgen, kannst du mal ein Beispiel machen? Sry, bin da einfach noch net ganz dahinter gekommen.
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!
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
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
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
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.
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
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
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.
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?
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.
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?
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
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
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
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 (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.
Das Kommando "Alexa, stop" geht bei der Kiste z.B. nicht
Kleine Bemerkung dazu. "stop" geht auch mit dem Sonos-Skill nicht, aber mit "Alexa, <playername> pause"
Nutze zum Musik hören Amazon Music Unlimited und TuneIn auf dem Sonos ONE.
Damit geht "Alexa Stop" zumindest.
ZitatNutze zum Musik hören Amazon Music Unlimited und TuneIn auf dem Sonos ONE.
Damit geht "Alexa Stop" zumindest.
Cool, gerade getestet mit einem Dot und einer Play3, das geht jetzt wirklich.
Anfangs ging das nicht.
Hi,
so Alexa <-> Plex läuft bei mir sehr zufriedenstellend.
Ist sicher nicht ausgereift und schon ein erster Hack, wen es interessiert hier die Details zum Nachbauen:
https://forum.fhem.de/index.php/topic,88038.msg804627.html#msg804627
Gruß,
Stefan
Zitatauf dem Sonos ONE. Damit geht "Alexa Stop" zumindest.
Ja mit einem Echo Dot und einem SONOS:One geht das. der Echo Dot macht den SONOS sogar leiser, wenn man "Alexa, " sagt.
Nur mit einem SONOS:ONE mit eingebautem Echo geht das alles nicht. Tippt das mal bei Google ein. Da gibt es genügend Hineise dazu. Das gin wohl mal, aber dann SONOS eine neue Firmware eingespielt....
ZitatKleine Bemerkung dazu. "stop" geht auch mit dem Sonos-Skill nicht, aber mit "Alexa, <playername> pause"
das probiere ich gleich mal.
Würde mich aber wundern wenn es geht, denn durch das dauernde rumprobieren taucht das Echo-Device im SONOS jetzt mehrfach in der Alexa-App auf und man kann es nicht löschen. Löschen kann das wohl nur der Amazon US support (laut Internetz).
Das SONOS:ONE mit Alexa war wohl eher eine Fehlanschaffung. Ein SONOS und ein getrennter Echo Dot kosten weniger und funktionieren besser :-)
Ist aber alles off-topic hier
ich bin gerade voll im Custom Skill Fieber. Das macht voll Spaß !
Deshalb Frage: wie kann ich denn auf FHEM Seiten auf Amazon Built-In Intents reagieren? Da gibt es ein paar ganz nette Built-In Intents, die ich gerne nutzen will aber wie kriege ich die an FHEM ran? Auch würde ich gerne den CancelIntent überschreiben. Das Codewort Stop soll erstmal alle Player stoppen, den den FHEM Skill zu stoppen macht ja wenig Sinn, da wir eh nur Befehl->Ausführung->Ende haben und keine langen Dialoge.
Hi bugster, das ist im server.js von Alexa.