FHEM Sprachsteuerung mit AMAD 2.6 und AutoVoice/Automagic

Begonnen von CoolTux, 11 August 2016, 14:15:31

Vorheriges Thema - Nächstes Thema

CoolTux

Hallo,

Ich hatte nun endlich etwas Zeit mich intensiver um meine Sprachsteuerung mit AutoVoice und Automagic in Verbindung mit AMAD zu kümmern.
Raus gekommen ist ein Flowset welches Euch einen Überblick über die Möglichkeiten geben soll wie man mittels Sprachbefehl Bsp. "Ok Google" "schalte das Licht am Esstisch im Wohnzimmer an" FHEM Geräte steuern kann.

Voraussetzung

  • AutoVoice
  • Automagic ab Version 1.31.0
  • AMAD ab Version 2.6


Support für

  • Alles was Eure Phantasie umsetzen kann :-)
  • Licht und Steckdosen
  • Abfragen von Sensoren(z.B. Temperatur)
  • Abfragen Müllabfuhrstatus
  • Temperatureinstellung an Thermostaten
  • Medianlautstärke mit Stufen Angabe und lauter/leiser

Bitte schaut Euch die einzelnen Flows genau an und ändert entsprechend die Variablen so wie Ihr sie benötigt.

Bei Fragen einfach hier melden


Video: Google steuert Kaffeemaschine



Grüße
Leon
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Pythonf

Ich verfolge gerade einen eigenen Ansatz für die Sprachsteuerung. Da mir die Auswertung der Befehle auf dem Handy nur so halbherzig gefällt, werte ich die Sprachbefehle aus, die an die AMADCommBridge gesendet werden. Dazu hab ich mir einen Flow angelegt, der bei einem Triggerwort - in meinem Fall jeder Satz der mit "Hey" beginnt - die Informationen an FHEM sendet. Ausgewertet wird es dann folgendermaßen in einem Notify:

AMADCommBridge:receiveVoiceCommand:.* {
my $USER = ReadingsVal("AMADCommBridge","receiveVoiceDevice","");
my $DEVICE = "0";
my $ROOM = "0";
my $STATE = "0";
if($EVENT =~ m/\blicht\b/i){$DEVICE = "Licht"};
if($EVENT =~ m/\b[fernseher|tv]\b/i){$DEVICE = "Fernseher"};
if($EVENT =~ m/\bschlafzimmer\b/i){$ROOM = "Schlafzimmer"};
if($EVENT =~ m/\bflur\b/i){$ROOM = "Flur"};
if($EVENT =~ m/\besszimmer\b/i){$ROOM = "Esszimmer"};
if($EVENT =~ m/\bwohnzimmer\b/i){$ROOM = "Wohnzimmer"};
if($EVENT =~ m/an|ein/i){$STATE = "on"};
if($EVENT =~ m/\baus\b/i){$STATE = "off"};

#Ausführen des Befehls
fhem("set group=$DEVICE:FILTER=room=$ROOM $STATE");
#Sonderregelungen
if($ROOM eq "Wohnzimmer"){
fhem("set group=$DEVICE:FILTER=room=$ROOM scene $STATE"); #LightScene
}
##Individuelle Räume
if($USER eq "OnePlus.Fabian.AMAD"){
if($ROOM eq "Schlafzimmer"){$ROOM = "Fabian"};
#fhem("set SV.Dummy01 ($DEVICE $ROOM $STATE $USER)");
if($DEVICE eq "Licht"){fhem("set TYPE=IT:FILTER=room=$ROOM $STATE");}  #IT lässt sich nich über group Filtern, da ein Reading "Group" vorhanden ist.
}
}

Notwendig ist jediglich das passende attribut group und der richtige Raum, aber auch dass lässt sich ja anpassen. Sonderregelungen könnte man vielleicht auch schöner über ein elsif einbauen.
Da Ich fand, dass es zur AMAD-Sprachsteuerung passt wollte ich das hier mal anfügen.

Grüße
Fabian

Amenophis86

#2
Also ich habe mir die Flows mal angeschaut und ich habe es leider noch nicht verstanden, wie ich sie auf meine Bedürfnisse anpassen muss. Muss ich für jedes Gerät einen Flow anlegen, oder wie müsste eine einfach Abfrage lauten? Muss der exakte Name des Geräts genannt werden? Sry, stehe komplett auf dem Schlauch und bräuchte mal Hilfe als Denkanstoß :)

Edit:
Und meinst du mit AutoVoice das Tasker Plugin https://play.google.com/store/apps/details?id=com.joaomgcd.autovoice&hl=de ??
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

CoolTux

Genau die App meine ich.

Alles was Du anpassen musst sind die Devicenamen und natürlich die Regexzeilen. Den Rest macht AMAD.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

visionsurfer

Hi,

ich will mir das auch anschauen. Aber bearbeitet werden muss es dann in Automagic, richtig ? Also nicht diese XML Datei ?

Grüße,
Visionsurfer

CoolTux

Nicht die xml. Die importierst Du in Automagic und hast dann die Flows. Da gibt es dann weit oben ein Viereck Script und da stehen alle Sachen drin die angepasst werden sollen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

visionsurfer


Amenophis86

Ich brauche wohl doch etwas Hilfe.

Ich habe mir jetzt Autovoice besorgt und mit der Test Version installiert. Nun will ich zB den Status des Device "KU.Steckdose.Kocher_Sw" ansagen lassen. Dazu bin ich in den Flow "Abfrage Gerätestatus per Sprache" und auf Script gegangen. Dort sieht es noch meine gedacht richtigen Änderung wie folgt aus:


fhemdevice = "null";

if(matches(avcomm, '(?i:.+(wasserkocher).+)'))
{
fhemdevice = "KU.Steckdose.Kocher_Sw";
name = "wasserkocher";
}


Wenn ich über "Ok Google" zum Testen einfach nur "wasserkocher" sage, wird mir auch von Autovoice eine Benachrichtigung mit dem Text:

Received possible Commands:
wasserkocher

angezeigt, aber es passiert sonst nichts. Der Flow wird nicht gestartet. Natürlich habe ich den Flow auch aktiviert, dass er blau und nicht mehr grau ist. Was mache ich falsch? :)

Edit:
Unter Plugin ist natürlich "Autovoice Recognized" eingestellt.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

CoolTux

Hast du denn auch unter Trigger die RegEx entsprechend gesetzt? Trigger plugin AutoVoice müsste ja schon da sein und dann auf Konfigurieren und da Command Filter. Da setzt den Teil des Satzes ein auf welcher der Trigger ansprechen soll.

Zu Beispiel. "Ist der Wasserkocher an"

Wenn du dann mehr Geräte machen willst

"Ist (der|die) (Wasserkocher|Waschmaschine) an"

Und so weiter. Kannst auch an Weg lassen. Dann reagiert er halt auf alles so lange der Textteil drin enthalten ist.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Amenophis86

Das war es. Danke, jetzt habe ich es verstanden. Geilo :)
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

RedOne

Hey CoolTux also erst mal muss ich sagen dein Modul ist Klasse.

Soweit funktioniert auch alles bis auf eins zwei Sachen das frag ich doch dann aber in dem Amad2 Thread.

Bei deinem Sprach Flow komm ich aber auch nicht weiter.
Ich hab ihn nun so angepasst er funktioniert aber nicht.
Wenn ich nur das Esszimmer If lasse und die restlichen If's Lösche geht es.
Kannst du mir sagen was ich falsch mache.

Und noch was für steht das matches ?

 
fhemdevice = "null";


if(matches(avcomm, '.+(an|ein)$'))
{
value = "on";
}
if(matches(avcomm, '.+(aus)$'))
{
value = "off";
}



// Steckdosen schalten

if(matches(avcomm, '(?i:.+(Esszimmer).+)'))
   {
    if(matches(avcomm, '(?i:.+(Licht).+)'))
   {
    fhemdevice = "FSD_5";
   }
}


if(matches(avcomm, '(?i:.+(Wohnzimmer).+)'))
   {
    if(matches(avcomm, '(?i:.+(Licht).+)'))
   {
    fhemdevice = "FSD_6";
   }
}



    if(matches(avcomm, '(?i:.+(lampen).+)'))
   {
    fhemdevice = "AlleLichter";
   }

       


setcmd = "{fhemdevice} {value}";
fhemcmd = "set";


Grus Chris

Gesendet von meinem SM-G935F mit Tapatalk

FHEM auf RaspberryPi
AVR-NET-IO mit Ethersex
HM-LAN-Adapter
4 HM-RT-CC-DN
CUL886Mhz culfw 1.55 + FHEMduino V 1.0b1

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

RedOne

"Schalte das Esszimmer licht an"
Oder
"Schalte das Wohnzimmer licht an"

Das Esszimmer funktioniert wenn ich das Wohnzimmer und Lampen if lösche sind die
dabei funktioniert kein befehl.

Die Trigger wörter sind die wo du  dem Flow mit gegeben hast ich habe nur das Script geändert

Gesendet von meinem SM-G935F mit Tapatalk

FHEM auf RaspberryPi
AVR-NET-IO mit Ethersex
HM-LAN-Adapter
4 HM-RT-CC-DN
CUL886Mhz culfw 1.55 + FHEMduino V 1.0b1

CoolTux

Du hast falsch angefangen. Du hast den Part für die Steckdosen genommen.

Aber davon mal ab musst du etwas strukturierter Vorgehen. Als aller erstes if im Teil für das Licht kommt das if mit RegEx Licht. Bedeutet, springe hier rein wenn das Wort Licht erkannt wird. Dann geht es in einen weiteren if zweig darum welcher Raum. Also Wohnzimmer oder Esszimmer und als letzter zweig kommt wenn gewünscht welches Licht. Deckenlampe oder Schranklicht.

Schau dir noch mal in Ruhe mein Flow an und Versuche zu erkennen wo Steckdose oder Licht erkannt werden soll und wo unter Licht die Räume erkannt werden.

Wie gesagt nur einmal Licht und dann dadrunter die Räume
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net