Skript mit Alexa (Amazon Echo Skill & Modul) starten

Hallo liebe IPS Community,

ich habe das geniale Amazon Echo Skill & Modul im Einsatz und es funktioniert bisher (fast) alles wunderbar. :slight_smile:

Ich möchte jedoch nicht nur einzelne Geräte, Lampen und Gruppen schalten, sondern ganze Szenen mit einem Sprachbefehl steuern.
Dazu würde ich gerne meinen Szenen-Skripte (z.B. Guten Morgen, Frühstück, Gute Nacht, etc.) über Alexa ausführen lassen. Bisher ist mir das leider noch nicht gelungen.
Habe es bisher mit Variablen, virtuellen Tastern, etc. versucht, aber leider hat das alles nicht funktioniert. Alexa sagt mir immer, dass dieses Gerät nicht verwendet werden kann.

Hat jemand von Euch schon Skripte über Alexa zu ausführen gebracht? Wenn ja, würde ich mich über eine Hilfestellung sehr freuen. :wink:

LG Michi

Hallo Michi,
schau mal hiernach.
Musst halt an deine Gegebenheiten anpassen.

Hallo drdigital,

danke für Deine Rückmeldung.
Leider weiß ich nicht, wie ich damit ein IPS Skript starten soll.

LG Michi

Hallo Michi,

was genau wird denn in den Scripts gestartet?

Ich habe zum Beispiel das Script „Fernsehen an“. Dieses habe ich ganz normal wie die anderen Aktoren unter dem IQL4Smarthome verlinkt.

Wenn ich jetzt sage „Alexa - Kino an“ dann wird folgendes ausgeführt:

Rollläden im Essbereich und Couchfenster werden gesenkt.
Ambiente-Beleuchtung (RGBW-Stripes) um den Fernseher werden eingeschaltet.
Deckenfluter im Wohnbereich wird eingeschaltet.

Das dazu passende Script sieht so aus:

<?
HM_WriteValueFloat(32330 /*[Räume\Wohnzimmer\Wohnzimmer - Rolladen Couch]*/, "LEVEL", 0);

HM_WriteValueFloat(28483 /*[Räume\Wohnzimmer\Wohnzimmer - Rolladen Essbereich]*/, "LEVEL", 0);
HUE_SetState(38687 /*[Räume\# Hue\Couch]*/, true);
HM_WriteValueFloat(14254 /*[Räume\Wohnzimmer\Wohnzimmer - Ambiente Dimmer]*/, "LEVEL", 1);
?>

Alexa behandelt dieses Script dann wie einen ganz normalen Aktor. Ein zweites Script Namens „Fernsehen Aus“ schaltet dann Alles wieder zurück.

Viele Grüße,

Burkhard

Hallo Burki,

Du meinst du verlinkst einfach das entsprechende Skript unter IQL4SmartHome?
Ich habe das auch schon mal probiert. Hat aber irgendwie auch nicht funktioniert.

Mein Skript für die Szene Frühstück sieht ähnlich wie Deines aus:

<?
$ID_KeyMatic = XXX /*[Hardware\Gewerke\Wohnbereich\Eingang\Eingang:Keymatic]*/;
$ID_LichtArbeitsplatte = XXX /*[Hardware\Gewerke\Wohnbereich\Küche\Licht an der Arbeitsplatte]*/;
$ID_LichtKaffeemaschine = XXX /*[Hardware\Gewerke\Wohnbereich\Küche\Licht an der Kaffeemaschine]*/;
$ID_LichtTisch = XXX /*[Hardware\Gewerke\Wohnbereich\Küche\Licht am Esstisch]*/;
$ID_LichtGang = XXX /*[Hardware\Gewerke\Wohnbereich\Gang EG\Wandlicht im Gang]*/;
$ID_InfrarotHeizung = XXX /*[Hardware\Gewerke\Wohnbereich\Küche\Strom an der Infrarotheizung]*/;
$ID_SonosKueche = XXX /*[Hardware\Sonos\Sonos]*/;
$Zentralheizung = GetValue(XXX /*[Hardware\Gewerke\Zentrale\Systemvariablen\Zentralheizung]*/);
$Szene_Zeit = XXX /*[Software\Szenen\Frühstück\Szene:Frühstück:Zeit:AUSLESEN]*/; 

// KeyMatic entriegeln
HM_WriteValueBoolean($ID_KeyMatic, "STATE" , true);

// HUE Lichter einstellen
	HUE_SetValue($ID_LichtGang, 'BRIGHTNESS', 254);                   // = 100%
	HUE_SetValue($ID_LichtGang, 'COLOR_TEMPERATURE',370);    // = 37%
	HUE_SetValue($ID_LichtTisch, 'BRIGHTNESS', 254);                   // = 100%
	HUE_SetValue($ID_LichtTisch, 'COLOR_TEMPERATURE',326);    // = 50%
	HUE_SetValue($ID_LichtKaffeemaschine, 'BRIGHTNESS', 254);                   // = 100%
	HUE_SetValue($ID_LichtKaffeemaschine, 'COLOR_TEMPERATURE',370);    // = 37%

// Lichter einschalten
HM_WriteValueBoolean($ID_LichtArbeitsplatte, "STATE", true);
HUE_SetState($ID_LichtTisch, true);
HUE_SetState($ID_LichtGang, true);
HUE_SetState($ID_LichtKaffeemaschine, true);

// Radio einschalten  (Default-Radio und Default-Lautstärke)
SNS_SetDefaultVolume($ID_SonosKueche);
SNS_SetRadio($ID_SonosKueche, "BAYERN 1 Oberbayern");
SNS_Play($ID_SonosKueche);

// Heizung für 2 Stunden einschalten, wenn Zentralheitung eingeschaltet ist
if ($Zentralheizung == false) 
{
HM_WriteValueFloat($ID_InfrarotHeizung, "ON_TIME",  120*60);
HM_WriteValueBoolean($ID_InfrarotHeizung, "STATE", true);
}

// Führe das Script zum Abgleich der Variablen zwischen Homematic und IPS aus
IPS_RunScript ( XXX /*[Hardware\Gewerke\Zentrale\Systemvariablen\HM:Systemvariablen:AUSLESEN]*/ );

IPS_Sleep(5000);

// Setzte die Zeitvariable der letzten Ausführung des Skriptes
IPS_RunScript ($Szene_Zeit);



?>

Hallo McHennsy,

ich habe direkt das Script verlinkt. Was ich empfehlen würde, probiere mal ein Test-Script, ohne If…then, etc. Also einfach nur ein Gerät per script einschalten. Das dann abspeichern und verlinken. Dann per App bei Alexa nach neuen Geräten suchen lassen und neues Gerät (Script-Link) ansprechen.

Schauen, ob diese einfachste Variante zumindest funktioniert. Ich habe gemerkt, dass meine Alexa sehr eigenwillig ist, ob sie die verlinkten Bezeichnungen verstehen will oder nicht (Bei dem o.g. Script: Fernsehen an hat sie nicht beachtet. Kino an ging dagegen sofort).

Viele Grüße,

Burkhard

Hallo wenn Ihr eure Scripte wie im nachfolgenden Beispiel anlegt und verlinkt,
könnt Ihr mit nur einem Script An/Aus und Wert von Alexa auswerten.
Vorteil ist ein Link (Rufname) und 3 Aktionen in einem Script.


<?
//$_IPS['VALUE'] entspricht dem Wert der von Alexa kommt entweder Zahl 0-100 oder True/False
$WertInt = (is_int($_IPS['VALUE']));//prueft ob ein Integerwert von Alexa kommt
 IPS_LogMessage("Alexa Integer: ",$WertInt);//erzeugt Log im Meldungsfenster
 IPS_LogMessage("Alexa Boolean: ",$_IPS['VALUE']);//erzeugt Log im Meldungsfenster 
If ($WertInt == true) //prueft ob ein Integerwert von Alexa kommt
{
 //Hier Aktion mit Wertuebernahme einfuegen
//Beispiel mit SC_Move --- Alexa setze "verlinkter Rufname" auf xx%
SC_Move(56225 , $_IPS['VALUE']);
 }
else
{
 if ($_IPS['VALUE'] == true) //prueft ob ein Boolean von Alexa kommt
{
 //hier Aktion für Ein einfuegen
//Beispiel mit EIB_Switch  --- Alexa schalte "verlinkte Rufname" ein
EIB_Switch(49225 , true);
 }
 else
 {
 //hier Aktion für Aus einfuegen
//Beispiel mit EIB_Switch  --- Alexa schalte "verlinkte Rufname" aus
EIB_Switch(49225 , false);
 }
 }
 ?>

Gruß
Giuseppe

Kannst Du mir kurz erklären was dieses Skript macht?
Ich steige da leider gerade nicht durch.

Also bei mir läuft das mit den Scripten auch super. Einfach ein Script für das Einschalten aller benötigten Autoren und ein Script zum Auschalten. Das ganze unterhalb von IQL4smarthome.
Wichtig ist nur einen einfachen Namen geben.
Bei mir klappt zum Beispiel der Name „alle Lautsprecher an“ und „alle Lautsprecher aus“ gut. Die benennung von " überall Musik einschalten" wird aber mit einer Frage nach dem genauen Gerät bestätigt.
Am besten mal ein paar verschiedene Schreibweisen versuchen :wink:

Gesendet von meinem SM-G930F mit Tapatalk

Du verlinkst auf das Script und im Script definierst Du was bei
Alexa setze „Rufname“ auf xx% (oberer Bereich des Scripts)
und bei
Alexa schalte „Rufname“ ein oder aus (unterer Bereich des Scripts)
passiert.

Weitere Ausführungen und Tipps findest hier.

Gruß
Giuseppe

Hallo Giuseppe,

vielen Dank für Deine Hilfe.

Habe Dein Script übernommen und läuft sofort. :smiley:

Somit habe ich für die Szenensteuerung nicht mehr 2 Scripte und Alexa unterlässt die Frage, wegen mehrerer Geräte. Perfekt !!!

Viele Grüße,

Burkhard

Danke Giuseppe,

hat funktioniert! :slight_smile:

LG Michi

Hi Giuseppe,
Vielen Dank für das Skript. Hat super geklappt.
Nun funktionieren Skripte mit Alexa schnell und einfach!
LG
jaybee

Hallo Giuseppe,

danke für dein super Skript, konnte damit mein großes Problem mit der Sonnenbeschattung lösen.
Da es sofort geklappt hat, wollte ich das ganze auch für meinen Homematic RGBW Controler verwenden. Hier hatte ich bisher 2 Links mit 2 Namen verwendet: Einmal „Couchlicht“ zum Ein- und Ausschalten des LED-Balkens und einmal „Couch“ um die Farbe zu verändern. Hat grundsätzlich sehr gut funktioniert, aber da man sich immer den richtigen Namen zur passenden Funktion merken musste, keine schöne Lösung.
Jetzt habe ich dein Skript dahingehend umgebaut. Das Ein- und Ausschalten funktioniert. Wenn ich jedoch die Farbe ändern möchte, sagt Alexa „OK“ aber es passiert nichts. Im Log wird der Farbencode angezeigt. Zur Info, ich habe das Skript vom Color-Picker in deines integriert, dies sollte ja normal funktionieren…
Bitte schau dir mein Skript an, wo hier der Fehler liegen kann. Vielleicht hat ja noch jemand anderer eine bessere Lösung.

<?

//$_IPS['VALUE'] entspricht dem Wert der von Alexa
$WertInt = (is_int($_IPS['VALUE']));//prüft ob ein Integerwert von Alexa kommt
 IPS_LogMessage("Alexa Integer: ",$WertInt);//erzeugt Log im Meldungsfenster
 IPS_LogMessage("Alexa Boolean: ",$_IPS['VALUE']);//erzeugt Log im Meldungsfenster 
if ($WertInt == true) //prüft ob ein Integerwert von Alexa kommt
{
//Hier Aktion mit Wertuebernahme einfuegen
//Ab jetzt kommt das Color-Picker-Skript:
// Speichert den HEX-Wert vom Color-Picker
$Farbe = $_IPS['VALUE'];
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);

// HEX-Wert in einzelne Werte für Rot / Grün / Blau zerlegen
$r = (($Farbe >> 16) & 0xFF);
$g = (($Farbe >> 8) & 0xFF);
$b = (($Farbe >> 0) & 0xFF);

// Umwandeln der RGB Werte
$hsv =  RGBtoHSV($r, $g, $b);

// Schreiben des Homematic Hue Wert in den Controller
HM_WriteValueInteger(44690 /*[Lichter\RGBW Wohnzimmer\RGBW_COLOR]*/, 'COLOR', $hsv);

/**
 *     Umwandeln der RGB-Werte in ein Farbwert des HSV-Farbraum
 *        RGB Werte:          0-255, 0-255, 0-255
 *        H Wert:                   0-360°
 *        Homematic H Wert: 0-199
 */
function RGBtoHSV($R, $G, $B)
{
    $R = ($R / 255);
    $G = ($G / 255);
    $B = ($B / 255);

    $maxRGB = max($R, $G, $B);
    $minRGB = min($R, $G, $B);
    $chroma = $maxRGB - $minRGB;

    if ($chroma == 0)
        return 0;

    if ($R == $minRGB)
        $h = 3 - (($G - $B) / $chroma);
    elseif ($B == $minRGB)
        $h = 1 - (($R - $G) / $chroma);
    else // $G == $minRGB
        $h = 5 - (($B - $R) / $chroma);

    $Hue = (60 * $h);
     $HomematicHue = ($Hue/1.8);

     if ($HomematicHue == 200)
       $HomematicHue = 199;

    return $HomematicHue;
}

 }
else
{
 if ($_IPS['VALUE'] == true) //prüft ob ein Boolean von Alexa kommt
{
 //hier Aktion für Ein einfügen
HM_WriteValueFloat(56504 /*[Lichter\RGBW Wohnzimmer\DIMMER]*/, "LEVEL", 100);
 }
 else
 {
//hier Aktion für Aus einfügen
HM_WriteValueFloat(56504 /*[Lichter\RGBW Wohnzimmer\DIMMER]*/, "LEVEL", 0);
 }
 }

?>

Hallo Loewenkoenig,
welche Version des Alexa Modul verwendest Du?
Wenn Du schon auf 2.0 bist gibt es andere Wege um ans Ziel zu kommen.
Ich vermute es liegt daran wie der Farbwert bei dem Script ankommt und weiter verarbeitet wird.
Hast Du mal geprüft wie die Farbwerte im Log ankommen?

Hier ein Beispiel für Alexa Modul 2.0 mit mehreren Unterscheidungen in einem Script.


<?
if($_IPS['REQUEST'] == "TurnOnRequest")
{
HUE_SetValue(51652 ,STATE ,$_IPS['VALUE']);
}
elseif($_IPS['REQUEST'] == "TurnOffRequest")
{
HUE_SetValue(51652 ,STATE ,$_IPS['VALUE']);
}
elseif($_IPS['REQUEST'] == "SetPercentageRequest")
{
$dimmwert = ($_IPS['VALUE'] / 100 * 255);
HUE_SetBrightness(51652 , $dimmwert);
}
elseif($_IPS['REQUEST'] == "SetTargetTemperatureRequest")
{
//hier Aktion eintragen
}
elseif($_IPS['REQUEST'] == "SetColorRequest")
{
HUE_SetColor(51652 , hexdec($_IPS['VALUE']));
}
?>

Soweit ich weiß, habe ich das Modul 2.0
Habe dein neues Skript getestet --> Ein / Aus funktioniert, Dimmen geht jetzt auch (nach einer kleinen Änderung der Prozentberechnung).
Zum Farbwechsel: Wenn ich als Bezug die Integer-Variable des Homematic-Controlers verwende, ändert er jetzt zwar Farben, aber komplett durcheinander. Dies kommt vermutlich daher, dass der Controler mit einem Wert von 0 bis 199 arbeitet und nicht mit einem Hex-Wert. Dazu habe ich dieses Color-Picker Skript, welches diese Daten umschlüsselt. Ich habe es wieder eingebaut und getestet --> der Wert wird in der Varibale (sie nennt sich „RGBW_Wohnzimmer_HEX“) zwar richtig verändert, aber die Varibale des Controlers ändert sich nicht mit. Ich vermute, dass es mit $_IPS[‚VALUE‘] zu tun hat. Schau dir das veränderte Skript nochmals an. Ist dies so richtig?

LG Peter

<?

if($_IPS['REQUEST'] == "TurnOnRequest")
{
HM_WriteValueFloat(56504 /*[Lichter\RGBW Wohnzimmer\DIMMER]*/, "LEVEL", 100);
}
elseif($_IPS['REQUEST'] == "TurnOffRequest")
{
HM_WriteValueFloat(56504 /*[Lichter\RGBW Wohnzimmer\DIMMER]*/, "LEVEL", 0);
}
elseif($_IPS['REQUEST'] == "SetPercentageRequest")
{
$dimmwert = ($_IPS['VALUE'] / 100);
HM_WriteValueFloat(56504 /*[Lichter\RGBW Wohnzimmer\DIMMER]*/, "LEVEL", $dimmwert);
}
elseif($_IPS['REQUEST'] == "SetTargetTemperatureRequest")
{
//hier Aktion eintragen
}
elseif($_IPS['REQUEST'] == "SetColorRequest")
{
$Farbe = $_IPS['VALUE'];
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);

// HEX-Wert in einzelne Werte für Rot / Grün / Blau zerlegen
$r = (($Farbe >> 16) & 0xFF);
$g = (($Farbe >> 8) & 0xFF);
$b = (($Farbe >> 0) & 0xFF);

// Umwandeln der RGB Werte
$hsv =  RGBtoHSV($r, $g, $b);

// Schreiben des Homematic Hue Wert in den Controller
HM_WriteValueInteger(44690 /*[Lichter\RGBW Wohnzimmer\RGBW_COLOR]*/, 'COLOR', $hsv);


/**
 *     Umwandeln der RGB-Werte in ein Farbwert des HSV-Farbraum
 *        RGB Werte:          0-255, 0-255, 0-255
 *        H Wert:                   0-360°
 *        Homematic H Wert: 0-199
 */
function RGBtoHSV($R, $G, $B)
{
    $R = ($R / 255);
    $G = ($G / 255);
    $B = ($B / 255);

    $maxRGB = max($R, $G, $B);
    $minRGB = min($R, $G, $B);
    $chroma = $maxRGB - $minRGB;

    if ($chroma == 0)
        return 0;

    if ($R == $minRGB)
        $h = 3 - (($G - $B) / $chroma);
    elseif ($B == $minRGB)
        $h = 1 - (($R - $G) / $chroma);
    else // $G == $minRGB
        $h = 5 - (($B - $R) / $chroma);

    $Hue = (60 * $h);
     $HomematicHue = ($Hue/1.8);

     if ($HomematicHue == 200)
       $HomematicHue = 199;

    return $HomematicHue;
}
}

?>

Hallo Peter,
da kann ich Dir leider nicht weiter helfen, da ich keinen Homematic Controller besitze.
Aber wenn der Farbwert schon mal ankommt,
wirst den bestimmt auch irgendwie an deinen Homematic Controller weiter geben können.

Wenn es klappt würde mich es interessieren, wie es dann aussieht.

Gruß
Giuseppe

Es geht zumindest schon mal besser bzw. mehr als vorher - danke dir!
Wenn ich es hin bekomme, sag ich dir bescheid.

LG Peter

Hi,
ich habe das ganze wie Burkhard konfiguriert, also jeweils ein Scirpt für Fernseher an und aus. Habe das ganze verlinkt, doch sowohl wenn ich es Fernseher An und Aus, als auch Fernseher Ein und Aus, als auch Kino An und Aus nenne, sagt Alexa mir nach „Alexa, Kino An“ „Es gibt mehrere Geräte mit diesem Namen, welches wolltest du?“. Wenn ich dann nochmal sage „Kino An“ klappt es, aber das ist ja nicht Sinn der Sache… Kommt jemandem das Problem bekannt vor?

Gruß

Um besten ist es ein Skript aufzurufen, dass dann sowohl je nach übergebenen Kommando das Skript zum Ein- bzw. Ausschalten übergibt. Ansonsten ist eben auch darauf zu achten das es keine Namens Überschneidungen mit eventuell weiteren Skills gibt. Wie sind denn die Skripte, die in IP-Symcon aufgerufen werden, für Alexa benannt worden?