Freitextausgabe

Hab mich mal den beiden Alexa Modulen auseinandergesetzt. Funktioniert soweit. Ich würde gerne einen Freitext an jenen Lautsprecher ausgeben, von wo die Anfrage gekommen ist.
z.B.
Alexa, gib mir Informationen zum Pool
Dann soll sie mir Temperatur, PH-Wert und Redox-Wert ausgeben. Ich hab auch noch min und max Variablen zur verfügung. Kann das mit den vorhandenen Modulen realisiert werden? Was ich gefunden hab, sind Szenen. Die könnte man eventuell dafür hernehmen, da hier ein Skript gestartet wird. In diesem Skript könnte ich dann die Sprachausgabe anwerfen. Aber ich müsste halt wissen, von welchem Echo die Anfrage gekommen ist. Und das sind bei mir sechs :wink:

Diese Information steht leider nicht zur Verfügung. (Bisher gibt es auch keinen Kniff oder Trick dies herauszufinden)

paresy

Hallo hfichtinger,

habe dieses bei mir vorerst so gelöst: Script anlegen, in meinem Fall heisst es Aussenklima.

<?php
$temp = GetValueFloat(16536);
$wet = GetValueFloat(41187);
RequestAction(39319, "Die Aussentemperatur beträgt: $temp Grad. Die Luftfeuchtigkeit beträgt: $wet Prozent.");

Man kann hier so viele Variablen abrufen, wie man möchte.

Das Ganze dann als Szene in der Alexa-Kerninstanz verknüpft.
Hört sich zwar etwas komisch an, wenn ich sage „Alexa, schalte Aussenklima ein.“ Aber es funktioniert und ich kriege alle Werte die ich im Script definiert habe genannt.

Allerdings habe ich auch noch keine Lösung gefunden, wie man das an die jeweilige Alexa übermitteln kann.

Du kannst natürlich für jede Alexa dieses Script anlegen und dann in der Alexa-Instanz für jede Alexa eine Szene anlegen, Bsp.:

Büro_Aussenklima
Küche_Aussenklima

Dann müsstest Du halt sagen: „Alexa, starte Büro Aussenklima“ oder „Alexa, starte Küche Aussenklima“.

Gruß

Burkhard

Das mit der TextToSpeech hab ich schon. Auch das mit der Szene.

<?php

//Start writing your code here
$LetzteAktion='';
$LetzterBefehl='';
$Schluesselwort='poolinformationen';
$EchoID=0;
//Echo ermitteln
//Badezimmer
$LetzteAktion=getvalue(54626);
$LetzterBefehl = getvalue(15096);
if (strpos($LetzterBefehl,$Schluesselwort)>0 and date("H",$LetzteAktion) == date('H',time()) and date("i",$LetzteAktion) == date('i',time())) {
    $EchoID=29712;
}

//Garten
$LetzteAktion=getvalue(52902);
$LetzterBefehl = getvalue(37894);
if ($EchoID==0 and strpos($LetzterBefehl,$Schluesselwort)>0 and date("H",$LetzteAktion) == date('H',time()) and date("i",$LetzteAktion) == date('i',time())) {
    $EchoID=25449;
}

//Kinderzimmer
$LetzteAktion=getvalue(46002);
$LetzterBefehl = getvalue(35497);
if ($EchoID==0 and strpos($LetzterBefehl,$Schluesselwort)>0 and date("H",$LetzteAktion) == date('H',time()) and date("i",$LetzteAktion) == date('i',time())) {
    $EchoID=13661;
    WFC_SendNotification(17134,"Pool","Pool","",0);
}
echo $EchoID;
echo $LetzterBefehl;

if ($EchoID>0){
    RequestAction($EchoID, "Die aktuelle Temperatur beträgt ".getvalue(15709)." Grad. 
    Der PH Wert beträgt ".getvalue(16167).". 
    Der Redoxwert beträgt ". getvalue(45202)." millivolt. 
    Temperaturminimum ".getvalue(42988)." Grad.
    Temperaturmaximum ".getvalue(33317)."Grad.");
}

Das ist mein erster Ansatz. Ich schaue einfach, wo der letzte Befehl, bzw. das Schlüsselwort in der letzten Aktion drinnensteht. Gleichzeitig vergleiche ich Stunde und Minute mit der aktuellen Uhrzeit und hole mit dann die EchoID heraus. Diese entspricht dem TextToSpeech Befehl.
Funktioniert leider noch nicht so ganz, weil meine EchoID derzeit noch immer 0 bleibt obwohl sie größer 0 sein müsste. Weiters müsste ich „bemängeln“, dass der Zeitstempfel für die Letzte Aktion immer wieder aktualisiert wird, obwohl sich nichts tut. Mal schauen wo da bei mir der Hund begraben ist.

Habs gefunden. Der Suchtext „poolinformationen“ stand bei Letztem Befehl an erster Stelle. Somit liefert die Funktion 0 und nicht ungleich 0 zurück mit „!==“ statt „>0“ funktioniert es.

Die finale Fassung für meine Echos. Nicht perfekt, aber besser bekomme ich es nicht hin. Ein weiteres Problem ist, wenn man das Schlüselwort Alexa, gefolgt von einer Pause bis der Echo anspringt sagt, und erst dann in meinem Fall „Poolinformtaionen ein“, dann ist im Letzten Befehl das Schlüsselwort „alexa“ gespeichert und nicht der folgetext. Inzwischen wird aber das Skript schon ausgeführt, weil der Echo bestätigt hat. Das heißt, zum Zeitpunkt der Skriptausführung ist noch nicht mein Schlüsselwort im Letzten Befehl drinnen. Das kommten den Ticken zu spät. Ich hab es mit sleep (4) versucht, weil ich gesehen habe, dass die Werte so ca. alle vier Sekunden aktualisiert werden. Das hilft aber gar nichts, weil dann offenbar die gesamte Skriptverarbeitung von IPS wartet. Jetzt hab ich es mit einer langen for-Schleife gemacht. Funktioniert auch nicht wirklich. Ein sehr hohe Trefferquote erreicht man, in dem man „Alexa, Poolinformation ein“ in einem durch sagt. dann steht auch der komplette Befehl in der Variable.
Sollte jemand Verbesserungen oder andere Ideen haben, nur her damit.

<?php

//Start writing your code here

$LetzteAktion='';
$LetzterBefehl='';
$Schluesselwort='poolinformationen';
$EchoID=0;
//Echo ermitteln
//Badezimmer
$LetzteAktion=getvalue(54626);
$LetzterBefehl = getvalue(15096);
if (strpos($LetzterBefehl,$Schluesselwort)!== false and date("H",$LetzteAktion) == date('H',time()) and date("i",$LetzteAktion) == date('i',time())) {
    $EchoID=29712;
}

//Garten
$LetzteAktion=getvalue(52902);
$LetzterBefehl = getvalue(37894);
if ($EchoID==0 and strpos($LetzterBefehl,$Schluesselwort)!== false and date("H",$LetzteAktion) == date('H',time()) and date("i",$LetzteAktion) == date('i',time())) {
    $EchoID=25449;
}

//Kinderzimmer
$LetzteAktion=getvalue(46002);
$LetzterBefehl = getvalue(35497);
if ($EchoID==0 and strpos($LetzterBefehl,$Schluesselwort) !== false and date("H",$LetzteAktion) == date('H',time()) and date("i",$LetzteAktion) == date('i',time())) {
    $EchoID=13661;
}

//Schlafzimmer
$LetzteAktion=getvalue(58165);
$LetzterBefehl = getvalue(54910);
if ($EchoID==0 and strpos($LetzterBefehl,$Schluesselwort) !== false and date("H",$LetzteAktion) == date('H',time()) and date("i",$LetzteAktion) == date('i',time())) {
    $EchoID=19948;
}

//Schlafzimmer2
$LetzteAktion=getvalue(32137);
$LetzterBefehl = getvalue(49099);
if ($EchoID==0 and strpos($LetzterBefehl,$Schluesselwort) !== false and date("H",$LetzteAktion) == date('H',time()) and date("i",$LetzteAktion) == date('i',time())) {
    $EchoID=47871;
}

//Wohnzimmer
$LetzteAktion=getvalue(18006);
$LetzterBefehl = getvalue(52728);
if ($EchoID==0 and strpos($LetzterBefehl,$Schluesselwort) !== false and date("H",$LetzteAktion) == date('H',time()) and date("i",$LetzteAktion) == date('i',time())) {
    $EchoID=15960;
}


if ($EchoID>0){
    RequestAction($EchoID, "Die aktuelle Temperatur beträgt ".getvalue(15709)." Grad. 
    Der PH Wert beträgt ".getvalue(16167).". 
    Der Redoxwert beträgt ". getvalue(45202)." millivolt. 
    Temperaturminimum ".getvalue(42988)." Grad.
    Temperaturmaximum ".getvalue(33317)."Grad.");
}

Edit: Die For-Schleife hab ich jetzt entfernt. Es ändert nichts. Lediglich die Reaktionszeit.

Warum hast Du aus !== 0 ein !== false gemacht? Mein System zeigt dann immer die ID 0 an und es gibt keine Reaktion mehr von den Echos. Wenn ich false wieder auf 0 korrigiere läuft es wieder.:confused:

Das mit dem Schlüsselwort habe ich auch schon festgestellt. Ich schaue heute Abend mal, was man da anders machen kann.

Gruß

Burkhard

Ich hab das so in der anleitung von strpos gefunden
https://www.php.net/manual/de/function.strpos.php

<?php
$meinString = 'abc';
$findMich   = 'a';
$pos = strpos($meinString, $findMich);

// Der !==-Operator kann ebenfalls verwendet werden. Die Verwendung von !=
// würde in unserem Beispiel nicht wie erwartet arbeiten, da die Position
// von 'a' 0 ist. Das Statement (0 != false) evaluiert hierbei zu false.
if ($pos !== false) {
    echo "Der String '$findMich' wurde im String '$meinString' gefunden";
    echo " und befindet sich an Position $pos";
} else {
    echo "Der String '$findMich' wurde nicht im String '$meinString' gefunden";
}
?>

Mir ist die Position ja egentlich egal. Ich möchte nur wissen, ob das Wort in dem String vorkommt, oder nicht.

Um das Probem mit dem möglicherweise nicht ganz aktuellen Wert vom LetztenBefehl hab ich ganz zu Beginn eine aktive Aktualisierung der Werte der Echos eingebaut inkl. einer kurzen Einschlafphase. Somit funktioniert es in ca. 70-80 Prozent der Fälle. Für Schaltvorgänge wäre das nicht akzeptabel aber für eine reine Abfrage ok. Das Schlüsselwort hab ich auf „Poolwerte“ geändert, weil ich eine Szene „Garten“ habe und zu oft „Garten ein“ verstanden wurde. Da leuchtet dann alles im Garten. Nett, aber nicht das was ich wollte. mit „Poolwerte“ versteht sie, was ich will. Nur an der Ausführung harpert es noch.

<?php

//Start writing your code 
sleep(3);
ECHOREMOTE_UpdateStatus(46676);
ECHOREMOTE_UpdateStatus(42838);
ECHOREMOTE_UpdateStatus(25372);
ECHOREMOTE_UpdateStatus(20982);
ECHOREMOTE_UpdateStatus(39893);
ECHOREMOTE_UpdateStatus(22576);

Die ID’s entsprechen den ID’S der Instanzen der Echos