SNIPS: Sprachsteuerung (mittlerweile auch per Textcommands) über snips.ai

Begonnen von Thyraz, 21 Juli 2018, 20:28:48

Vorheriges Thema - Nächstes Thema

ahlermi

Ich würde mich sehr darüber freuen, da das ganz neue Möglichkeiten eröffnet, und das könnte dann wirklich wesentlich mehr als Alexa.

Ich habe eh eine Routine um alle Geräte zu pflegen.

Notify auf Dummy

snips_rollout.*on {
  my $single_device = "";
  my $alias = "";
  my @exclude_room_array = ("IT", "Homebridge", "MAX", "YeeLight", "Wettervorhersage", "Snips", "CUL_HM", "Fenster");

  my @device=devspec2array("genericDeviceType=light");
  foreach(@device) {
    Log 3, "$_" . " " . AttrVal("$_","alias", " ");
    fhem("attr $_ snipsMapping SetOnOff:cmdOn=on,cmdOff=off \nGetOnOff:currentVal=state,valueOff=off,valueOn=on");
  }
  @device=devspec2array("genericDeviceType=switch");
  foreach(@device) {
    Log 3, "$_" . " " . AttrVal("$_","alias", " ");
    fhem("attr $_ snipsMapping SetOnOff:cmdOn=on,cmdOff=off \nGetOnOff:currentVal=state,valueOff=off,valueOn=on");
  }
  @device=devspec2array("webCmd=volume");
  foreach(@device) {
    Log 3, "$_" . " " . AttrVal("$_","alias", " ");
    fhem("attr $_ snipsMapping SetNumeric:currentVal=pct,cmd=volume,minVal=0,maxVal=70,step=15,type=Lautstärke \nGetNumeric:currentVal=pct,cmd=volume,minVal=0,maxVal=70,step=15,type=Lautstärke");
  }
  @device=devspec2array("group=Rollade");
  foreach(@device) {
    Log 3, "$_" . " " . AttrVal("$_","alias", " ");
    fhem("attr $_ snipsMapping SetNumeric:currentVal=pct,cmd=pct,minVal=0,maxVal=100,step=25 \nGetNumeric:currentVal=pct,cmd=pct,minVal=0,maxVal=100,step=25");
  }
  @device=devspec2array("alias=Fenster.*");
  foreach(@device) {
    Log 3, "$_" . " " . AttrVal("$_","alias", " ");
    fhem("attr $_ snipsMapping GetOnOff:currentVal=state,valueOff=closed");
  }
  @device=devspec2array("type=HeatingThermostat");
  foreach(@device) {
    Log 3, "$_" . " " . AttrVal("$_","alias", " ");
    fhem("attr $_ snipsMapping SetNumeric:currentVal=desiredTemperature,cmd=desiredTemperature,minVal=5,maxVal=24,step=1,type=Temperatur \nGetNumeric:currentVal=desiredTemperature,minVal=5,maxVal=24,type=Temperatur");
  }


  @device=devspec2array("room=Homebridge");
  foreach(@device) {
    $single_device="$_";
    Log 3, "$_" . " " . AttrVal("$_","alias", " ");

    roomsAdd($single_device, "Snips");
    $alias = ( split / /, AttrVal("$_","alias", "$_"), 2 )[0];
    if ($alias eq "Heizung"){
      fhem("attr $single_device snipsName Heizung, Temperatur");
    }else{
      fhem("attr $single_device snipsName " . $alias);
    }
   
    my @values = split(',', AttrVal($single_device,"room", " "));

    foreach my $val (@values) {
      if ( not $val ~~ @exclude_room_array ){
        Log 3, "attr $single_device snipsRoom " . $val;
        fhem("attr $single_device snipsRoom " . $val);
      }
    }
  }
}
PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN

ahlermi

Hat schon mal einer mit einem "snips/duration" gearbeitet?

Ich bekomme da keine Werte übergeben.


# SetTimer Intent
sub stelleTimer($$) {
        Log 3, dump(@_)
}



2018.09.10 13:17:41 5: Parsed value: Stelle einen Eier timer auf 5 Min for key: input
2018.09.10 13:17:41 5: sending message to NLU: {"id":"{\u0022Channel\u0022:null,\u0022Color\u0022:null,\u0022Device\u0022:\u0022timer\u0022,\u0022Room\u0022:null,\u0022input\u0022:\u0022Stelle einen Eier timer auf 5 Min\u0022,\u0022sessionId\u0022:null,\u0022siteId\u0022:null}","input":"Stelle einen Eier 'standardgerät' auf 5 Min","sessionId":"fhem.textCommand"}
2018.09.10 13:17:41 5: publish received for hermes/nlu/intentParsed, {"id":"{\"Channel\":null,\"Color\":null,\"Device\":\"timer\",\"Room\":null,\"input\":\"Stelle einen Eier timer auf 5 Min\",\"sessionId\":null,\"siteId\":null}","input":"Stelle einen Eier 'standardgerät' auf 5 Min","intent":{"intentName":"ahlermI:SetTimer","probability":0.7526512},"slots":[{"rawValue":"Eier","value":{"kind":"Custom","value":"eier"},"range":{"start":13,"end":17},"entity":"snips/default--Name","slotName":"Name"},{"rawValue":"5 Min","value":{"kind":"Duration","years":0,"quarters":0,"months":0,"weeks":0,"days":0,"hours":0,"minutes":5,"seconds":0,"precision":"Exact"},"range":{"start":38,"end":43},"entity":"snips/duration","slotName":"duration"}],"sessionId":"fhem.textCommand"}
2018.09.10 13:17:41 5: Parsed value:  for key: siteId
2018.09.10 13:17:41 5: Parsed value:  for key: duration
2018.09.10 13:17:41 5: Parsed value: SetTimer for key: intent
2018.09.10 13:17:41 5: Parsed value: timer for key: Device
2018.09.10 13:17:41 5: Parsed value: Stelle einen Eier timer auf 5 Min for key: input
2018.09.10 13:17:41 5: Parsed value: 0.7526512 for key: probability
2018.09.10 13:17:41 5: Parsed value: eier for key: Name
2018.09.10 13:17:41 5: Parsed value: fhem.textCommand for key: sessionId
2018.09.10 13:17:41 5: handleCustomIntent called
2018.09.10 13:17:41 5: snipsIntent selected: SetTimer=stelleTimer(Name,duration)
2018.09.10 13:17:41 5: Calling sub: main::stelleTimer
2018.09.10 13:17:41 3: ("eier", undef)
PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN

jowe

@ahlermi: Probiere mal statt duration snips/datetime.
Bei mir klappt das dann, wenn ich sage "stelle einen alarm in 5 minuten" oder "erinnnere mich in 5 minuten". Als Output kommt dann die Zielzeit, die du dann z.B. für ein at verwenden kannst.
"Stelle einen Timer auf 5 minuten" funktioniert so aber leider halt nicht...

ahlermi

@jowe danke, klappt aber hat leider wie du schon sagst wieder ein paar Nachteile, ich würde schon gerne ergründen warum snips/duration nicht klappt, ist ja vlt eine Kleinigkeit.
PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN

jowe

Ich habe das gerade mal in der Snips Console ausprobiert und den slot duration incl. einiger Trainingssätze hinzugefügt.
Klappt jetzt auch mit "auf 5 minuten". Nur das Rückgabeformat ist dann halt anders, nicht mehr absolute Zeit sondern Dauer. Das kann man aber ja leicht abfangen, da man ja den type (duration oder time) mitgeliefert bekommt:
{
  "input": "stelle einen eier timer auf fünf min",
  "intent": {
    "intentName": "jowe:setAlarm",
    "probability": 0.9125147
  },
  "slots": [
    {
      "rawValue": "eier",
      "value": {
        "kind": "Custom",
        "value": "Die Eier sind fertig"
      },
      "range": {
        "start": 13,
        "end": 17
      },
      "entity": "Thema",
      "slotName": "Thema"
    },
    {
      "rawValue": "timer",
      "value": {
        "kind": "Custom",
        "value": "Timer"
      },
      "range": {
        "start": 18,
        "end": 23
      },
      "entity": "AlarmType",
      "slotName": "Type"
    },
    {
      "rawValue": "fünf min",
      "value": {
        "kind": "Duration",
        "years": 0,
        "quarters": 0,
        "months": 0,
        "weeks": 0,
        "days": 0,
        "hours": 0,
        "minutes": 5,
        "seconds": 0,
        "precision": "Exact"
      },
      "range": {
        "start": 28,
        "end": 36
      },
      "entity": "snips/duration",
      "slotName": "Timer"
    }
  ]
}

ahlermi

Hi, das ist nicht das Problem.

Nur wenn du jetzt im SNIPS


snipsIntents

Wecker=stelleWecker(time,room,device)
SetTimer=stelleTimer(Name,duration)
StopTimer=stoppeTimer(Name)


Intents definierst, dann kommt in der Perl Funktion (bei mir stelleTimer) nur ein "undef" an  :o
PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN

Wal

Ich bin vor einiger Zeit von FHEM auf ioBroker umgestiegen und hatte Snips über den FHEM-Adapter und diesem Plugin in ioBroker eingebunden. Mittlerweile nutze ich den Text2Command Adapter von ioBroker den ich über Node-Red direkt mit dem erkannten Text vom Snips-ASR füttere. Den Snips-NLU brauche ich dadurch nicht mehr.
Der Text2Command Adapter funktioniert über Schlüsselwörter die man angeben und die bei Erkennung eine bestimmte Aktion auslösen und der wenn gewünscht auch eine Antwort geben kann.
Ich denke das es so ein Adapter auch bei FHEM gibt. Man braucht nur dafür zu sorgen das die Wörter erkannt werden.
Man (Thyraz) könnte da viel arbeit sparen.

sehe gerade, bei FHEM heißt das Modul "Talk2Fhem"
Kaum macht man es richtig, funktioniert es auch !

Gruß
Walter

Thyraz

Zitat von: ahlermi am 10 September 2018, 14:16:09
Intents definierst, dann kommt in der Perl Funktion (bei mir stelleTimer) nur ein "undef" an  :o

Dann dürfte unter dem slotname aber an sich nichts angekommen sein.
Slotname ist wahrscheinlich Case Sensitive falls das noch ein Problem sein könnte.

Noch ein anderer Ansatz: Einfach einen Number Type nehmen und einen zusätzlichen Slot den ihr mit Sekunde|Sekunden, Minute|Minuten, Stunde|Stunden als Values füllt?
Dann seit ihr beim Satzbau evtl. flexibler.

Noch zum Thema Replies vom Snips Modul:
Ich denke ich setze ggf. mal die schnelle Lösung um, damit kud mit seiner Ausgabe geholfen ist.
Die komplexere Variante kann gern auf die Todo Liste, allerdings hätte ich gern ein paar Use-Cases um zu begreifen was ihr damit umsetzen wollt, das bisher doof/nicht möglich ist. :P
Und für Anregungen wie die Konfiguration aussehen könnte wäre ich für den Fall einer Umsetzung auch dankbar. ;)
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

ahlermi

PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN

ahlermi

Eine vernünftige Antwort ermöglicht zum Beispiel die Kontrolle was Snips verstanden hat.

Es gibt ja auch Aktionen die man nicht direkt wie eine Lampe sieht.

Außerdem ist es cooler ;-)
Ich freue mich immer wenn Siri antwortet "Die Garage ist dabei sich zu schließen" oder ähnliches.
PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN

ahlermi

Ich habe gerade einfach nur den type von snips/duration auf snips/number gestellt, "sam install assistant" ausgeführt und der Wert kommt an.

Zurück geändert und nix kommt mehr an, muss mit dem duration zusammen hängen.
PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN

kud

@ahlermi
Na klar , da stimme ich schon zu.
Aber mein Plagegeist ist die Mediensteuerung und die Antwort "Kein Wiedergabegerät gefunden" obwohl im relativ stillen Raum Niemand das Wort "Snips" gesagt hatte plärrt der Lautsprecher ... Da ich eh alles über voiceResponse und tts in FHEM ausgebe habe ich jetzt ein Filter vorgeschaltet. Für mich ne Quick und Dirty-Lösung ;-)

Thyraz

Zitat von: ahlermi am 10 September 2018, 15:29:00
Zurück geändert und nix kommt mehr an, muss mit dem duration zusammen hängen.

Ok, dann muss ich mal schauen was da ankommt wenn man das als Type wählt.
Ich schätze das ist dann kein einfacher String, sondern evtl. ein Key-Value Paar (oder mehrere Werte).

Mit sowas rechnet das Modul bisher nicht, da mir das bisher noch nicht untergekommen ist...

edit: Sowas kommt dann an:

"value": {
        "kind": "Duration",
        "years": 0,
        "quarters": 0,
        "months": 0,
        "weeks": 0,
        "days": 0,
        "hours": 0,
        "minutes": 5,
        "seconds": 0,
        "precision": "Exact"
      }


Ist die Frage: Lohnt sich das zu unterstützen oder macht man das eher mit einem Number Slot + einem Custom Slot für Sekunden/Minuten/Stunden?

Ist halt die Frage was ich eurer Perl Funktion beim Custom Intent übergeben soll nachdem sowas reinkommt...
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

ahlermi

Das bietet gute Möglichkeiten für Timer etc. Erkennung klappt gut.

kannst du nicht mit


$time = Date_to_Time($year,$month,$day, $hour,$min,$sec);


einen Zeitstempel zurück geben, oder das ganze Objekt durchreichen?

Gruß Michael
PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN

Thyraz

Ok, das sieht tatsächlich gut aus.

Was wäre denn geschickter?
Einen TimeStamp auf das aktuelle Datum würde ich ungern aufaddieren.
Wer weiß ob da jemand noch andere Einsatzzwecke als vom aktuellen Datum ausgehend einfallen.

Ich könnte aber entweder die duration in Sekunden errechnen und diesen Wert übergeben,
oder ich übergebe das Objekt das reinkommt.

Variante 1 gefällt mir an sich ein wenig besser aus Nutzersicht, lasse mich aber auch gerne umstimmen. ;)
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...