---
title: timer- und pups-intents für homeassistant und snips
date: "2018-12-04T22:15:00+01:00"
url: "https://wirres.net/articles/11130"
tags: [pupsen, intents, homeassistant, snips, furzen]
category: artikel
additional_categories: [wirres.net, artikel]
author: felix schwenzel
---

# timer- und pups-intents für homeassistant und snips

[alexa, bzw. unser echo-dot](https://wirres.net/article/articleview/11090/1/6) ist jetzt seit ungefähr 6 wochen offline und empfängt [jetzt ihr gnadenbrot](https://wirres.net/article/articleview/11100/1/6). wenn ich artikel über neue oder [nützliche features von alexa](https://t3n.de/news/amazon-alexa-sprachbefehle-echo-2018-796631/) lese zucke ich meist mit der schulter und bemerke, dass mich die meisten skills oder features von alexa ohnehin nicht interessiert haben und dass es gerademal 5 sachen gab, die wir/ich regelmässig an alexa herangetragen haben:

- licht- und gerätesteueerung, vor allem in der küche, wo alexa lebte uns zuhörte
- timer
- füllen unserer gemeinsamen einkaufsliste in *[bring](https://getbring.com/)* per zuruf
- gelegentliche fragen nach öffnungszeiten oder wikipedia-artikeln

die licht und gerätesteuerung macht snips mittlerweile, wie ich finde, besser als alexa, vor allem auch, weil ich den lampen, geräten und räumen einfacher (un beliebig viele) synonyme geben kann und vor allem weil ich die aktionen nach gutdünken, vor allem kurz gefasst aufrufen kann. kann natürlich auch sein, dass mir das merken leichter fällt, weil ich mir die triggersätze ausgedacht habe und nicht ein amazon-mitarbeiter. es kann aber auch sein, dass ich die licht-, geräte- und raumzuordnungen per *homeassistant* besser und einfacher strukturieren konnte, als mit der alexa app. aber das ist ein anderer artikel. genauso werde ich einen artikel darüber schreiben, wie ich *snips* dazu gebracht habe einkaufserinnerungen in [bring](https://getbring.com/) zu bekommen, obwohl bring sich weigert eine öfffentliche API anzubieten (spoiler: sie haben eine API, den alexa-skill). lediglich wissenfragen nach wikipedia-artikeln oder öffnungszeiten von geschäften in der nähe konnte ich *snips* noch nicht beibringen, vor allem weil ein *snips* ein allgemeines deutsches wörterbuch fehlt, *snips* also kurzgesagt nur das versteht, was man *snips* explizit beigebracht hat.
 

was ich bei alexa wirklich häufig genutzt habe war die timer-funktion. was mich allerdings immer gestört hat, war das fehlende visuelle feedback. um zu erfahren wie lange der timer noch läuft, musste ich immer nachfragen. das kann jede eieruhr besser. sämtliche versuche per API auf die alexa/echo timerfunktionen zuzugreifen scheiterten, alles was über die API (per IFTTT) möglich schien, war eine aktion nach dem ablaufen von timern zu triggern, was ich aber nicht brauchte.

![](https://wirres.net/articles/11130/phpRH6y1d.jpg)

die timer-funktion, [die ich hier](https://wirres.net/article/articleview/11102/1/0/) neben der ebenso wichtigen „pups mal!“-aktion abgefilmt habe, habe ich natürlich mit hilfe vom home-assistant gebaut. wie genau, erzähle ich im folgenden, muss dafür aber vorher nochmal kurz ausholen.
 

skills legt man mit *snips* in der (online) [konsole von snips](https://console.snips.ai/) an (das bauen von assistenten und skills ist die einzige funktion von *snips*, die (noch) nicht offline verfügbar ist, nach dem deployment funktioniert *snips* dann aber zu 100% offline).

![phpNNeaCe](https://wirres.net/media/pages/articles/11130/ae0bc27639-1742248630/phpnneace-640x.png)

der „skill“ timer besteht aus zwei „intents“, *timer starten* und *timer stoppen*. die intents findet *snips* „schwach“, weil ich jeweils nur sechs, bzw. elf trainingssätze eingegeben habe.

![php60mUFo](https://wirres.net/media/pages/articles/11130/104b80231b-1742248630/php60mufo-640x.png)

die trainingssätze sind die sätze die *snips* erkennen soll, wenn ich einen timer starten möchte, also zum beispiel:

- Erinner mich in 2 Minuten
- Wecke mich in einer Stunde
- Erinnere mich in 30 Minuten
- Nudeltimer von 8 Minuten
- Eieruhr für 6 Minuten
- Wecker in 15 Sekunden
- Timer 30 Sekunden
- 2 Minuten Countdown
- Starte einen Countdown für 2 Minuten
- 10 Minuten Timer
- Timer 10 Minuten

damit ich nicht je einen trainingssatz für jeden möglichen zeitraum aufschreiben muss, gibt es vorgefertigte *slots* für standardwerte wie die dauer, zahlen, temperaturen oder geldbeträge. deshalb habe ich dem intent einen slot für die timer-dauer hinzugefügt. die satzteile mit der dauer muss man anfangs selbst markieren, nach einer weile lernt die konsole dazu und erkennt die dauer in beispielsätzen alleine. der zweite slot erfasst den namen des timers, so dass ich theoretisch mehrere timer parallel aufsetzen kann oder *snips* mich beim beenden des timers daran erinnern kann, um was der timer geht.

![phpZRxDyc](https://wirres.net/media/pages/articles/11130/0f80e45375-1742248630/phpzrxdyc-640x.png)

im prinzip ist das schon alles was man für meine lösung auf *snips*-seite anlegen muss. den rest erledige ich mit *homeassistant*. man kann für *snips* auch aktionen in python programmieren, die auf den intent reagieren und agieren. diese python-scripte installiert *snips* dann auch lokal auf dem raspberry. es gibt ein paar fertige skills (oder apps) die man in einer art app-store in der konsole installieren kann. ein paar von denen habe ich ausprobiert, aber meistens waren die anpassungen die ich an diesen fertigen apps vornehmen musste oder wollte aufwändiger als es mit *homeassistant* selbst zu machen. die meisten der skills die ich in der konsole anlege haben deshalb gar keine aktionen.

![phpPlyt1n](https://wirres.net/media/pages/articles/11130/3d9287094e-1742248630/phpplyt1n-640x.png)

trotzdem haben die skills, oder genauer die einzelnen intents aktionen zur folge, wenn man [im homeassistant die snips-komponnete installiert hat](https://www.home-assistant.io/components/snips/). dann schnappt sich *homeassistant* sozusagen die intents auf, die man konfiguriert hat. für den intent sieht das dann so aus:
 

diese zeilen bitten *homeassistant*, sobald *snips* das auslösen des -Intents meldet, aktiv zu werden. einerseits mit einem audio-feedback und andererseit mit einer aktion. der intent liefert nach dem auslösen die aufgeschnappten „slots“ mit, also in diesem fall die dauer () und den namen (). wie man sieht, ignoriere ich den namen und werte bis jetzt lediglich die dauer aus.
 

wenn ich also sage „10 minuten timer“ erkennt *snips* die dauer (10 minuten) und den intent (timer start) und gibt das auf dem „mqtt-bus“ bekannt. weil *homeassistant* den bus abhört arbeitet homeassistant dann meine konfiguration ab und weist *snips* folgendes an sprachfeedback zu geben: „timer 10 minuten ab jetzt.“ ausserdem stoppt *homeassistant* eventuell schon laufende timer und startet einen neuen timer mit der übermittelten dauer ( wird von der *homeassistant*-*snips*-komponente freundlicherweise in sekunden umgerechnet, ist der der eingabe-, also der rohe wert).
 

weil jetzt ausser einem laufenden timer nichts weiter passieren würde, muss ich natürlich noch eine automation anlegen, die sich um die darstellung der restlaufzeit kümmert und eine, die den abgelaufenen timer ankündigt.
 

die erste automation läuft jede sekunden **wenn** der läuft (sonst nicht). die berechnet, bzw. zählt die restlaufzeit (in sekunden) und schickt die restlaufzeit auf [meinen selbstgebauten matrix-display](https://wirres.net/article/articleview/10744/1/6/), der sich per mqtt füttern lässt. das payload-template macht nichts anders als aus der timer-zeit und der abgelaufenen zeit die verbleibenden minuten und sekunden auszurechnen und sie im format '%M%:%S' darzustellen.
 

die zweite automation wird getriggert, sobald der timer abgelaufen ist und stellt den text „fertig“ auf dem led-matrix-bildschirm dar und lässt *snips* sagen: „dein timer ist abgelaufen“.
 

das ganze würde eventuell mit einem python-script viel einfacher umzusetzen zu sein, aber für komplexeres python bin ich noch zu doof. die *homeassistant* yaml-konfiguration ist auch nicht gerade trivial, aber weil ich mittlerweile in dieser form gefühlt 800 automatisierungen für die wohnung geschrieben habe, bin ich da relativ trittsicher.
 

das beispiel zeigt die qualität vom zusammenspiel von *snips* und *homeassistant* eigentlich ganz gut: im prinzip ist das alles recht einfach, aber man muss halt fast alles selbst machen. die *snips*konsole und dokumentation helfen, *homeassistant* nimmt einem sowieso einen grossen teil arbeit ab, aber jeden einzelfall, jedes detail muss man selbst bedenken. die nüsse die man für einzelne skills knacken muss sind teils weich, teils sehr hart. mir hat das in den letzten wochen aber grossen spass bereitet diese nüsse einzeln zu knacken: wie bekomme ich *snips*/*homeassistant* dazu einzelne lichter, geräte oder lichtszenen zu schalten, wie kann ich meine bring-einkaufsliste per zuruf füllen, wie nach temperaturen fragen. das ist ein bisschen wie kreuzworträtsel lösen, mit dem unterschied, dass man sich die aufgaben und lösungen hier selbst ausdenken muss und es keine richtige oder falsche lösung gibt, sondern nur jeweils eine, die ausreichend gut funktioniert.

<!-- block:line -->

![phpGSKFiW](https://wirres.net/media/pages/articles/11130/7c85ba669f-1742248630/phpgskfiw-640x.png)

wo ich gerade dabei bin erklär ich noch, wie ich *snips* (ivanka) das pupsen beigebracht habe. den intent, bzw. die trainingssätze anzulegen war eher trivial:

- nochmal pupsen
- bitte pups nochmal
- pups nochmal
- pupsgenerator
- flatulenz
- bitte flatulieren
- flatuliere bitte
- bitte furzen
- bitte pupsen
- pup mal
- kannst du furzen?
- bitte furz mal
- bitte pups mal
- furzen
- furz mal
- pupsen
- pups mal
- pupse bitte
- kannst du pupsen?

jeder dieser sätze triggert im *homeassistant* den intent :
 

sagt *snips* bescheid, dass der intent ausgeführt wurde, auch wenn die aktion noch nicht zuende ausgeführt wurde. die aktion besteht im prinzip aus einem kommandozeilen befehl der *snips* eine wav-datei zum abspielen schickt. die auswahl der wav-datei erfolgt per zufall aus 13 dateien die ich mir zusammengegooglet habe. wichtig sind noch die variablen und . die beiden werte liegen bei jedem intent-aufruf vor und sind dann wichtig, wenn man mehrer *snips*-assistenten zuhause hat, also in verschiedenen räumen. ich habe im kinderzimmer einen *snips*-satelitten installiert und wenn ich *snips* dort frage mal zu pupsen, wird die wav-datei eben auch dort abgespielt.
 

der kommandozeilenbefehl schickt nach dem aufruf durch den intent die wav-datei per mqtt an den *snips*-audio-server. durch die weiss *snips* auf welchem lautsprecher die datei abzuspielen ist und das ist ungefähr alles was man tun muss, um *snips* zum pupsen aufzufordern.
 

weil ich es lustig fand pups geräusche im bad abzuspielen, wenn dort jemand anders sitzt, habe ich mnoch einen zusätzlichen skill zusammengestellt, der genau das macht. eleganter wäre es natürlich alles in einem skill, bzw. intent abzuhandeln, also zu prüfen, ob der intent einen raum mitliefert oder nicht und entsprechend zu agieren (bei keiner raumnennung abspielen im raum wo der intent getriggert wurde, sonst im genannten raum).

> [](https://pbs.twimg.com/media/Dtj5RFQU0AATOhx.jpg)
> 
> so viel spass wie ich mit @[snips](http://twitter.com/intent/user?screen_name=snips) (und @ home_assistant) beim „programmieren“ habe, hatte ich nicht mal ansatzweise bei der benutzung von amazons alexa.[#adventsautomatisierungen](http://twitter.com/search?q=%23adventsautomatisierungen) [pic.twitter.com/OFUXKnkLqp](https://twitter.com/diplix/status/1069878985893560320/photo/1)
> 
> [felix schwenzel](http://twitter.com/intent/user?screen_name=diplix) ([@diplix](http://twitter.com/intent/user?screen_name=diplix)) [**04.12.2018 10:00](http://twitter.com/diplix/status/1069878985893560320)

<!-- block:line -->

[hier ist ein gist, mit der homeassistant konfiguration für den timer und den pups intent.](https://gist.github.com/diplix/f58add2865f7f95dd56896eb6b7b5e31)
