befriedigende automatisierung

felix schwenzel, , in artikel    

so wie das modewort „nachhaltig“ eigentlich nichts anderes als „zukunftsfähig“ bedeutet, sind sogenannte „smart-home“ geräte oder apparate mit dem präfix „smart“ eigentlich eine umschreibung für „vernetzt“. un-smarte geräte sind auch vernetzt, aber lediglich mit dem stromnetz. vom stromnetz werden sie mit schaltern am gerät oder in der nähe des geräts geschaltet und machen dann ihr unvernetztes ding, für das sie gebaut sind.

vernetzte geräte, die sich dank ihrer vernetzung nicht nur durch schalter fernsteuern lassen, sondern durch apps oder sprach-assistenten, sind toll. ich beschäftige mich jetzt seit zwei, drei jahren intensiv mit ihnen. dabei haben sich ein paar eigentlich triviale, aber dennoch zentrale erkenntnisse herausgebildet:

erstens: fernbedienung ist toll, aber wichtiger sind offene, programmierbare schnittstellen
eine lampe mit einer app zu steuern ist vielleicht für ein paar wochen aufregend. danach wünscht man sich schalter oder andere ergonomisch angebrachte steuerelemente, zum beispiel ein touchpad, drehregler oder — seit knapp zwei jahren ganz neu — sprachsteuerung. aber am allermeisten wünscht und fragt man sich, also ich zumindest, wie man das vielleicht alles ein bisschen automatisieren, abkürzen kann — und nicht mehr alles selbst zusammenklicken muss.

zweitens: beware of the cloud
es gibt kaum noch „smarte“ (also vernetzte) geräte zu kaufen, die ohne „cloud“, also mit einer direkten leitung zum hersteller, angeboten werden. gegen die cloud sprechen nicht nur allerlei datenschutz- und privatshären-gründe, sondern auch praktische erwägungen: die cloud hat hohe latenzzeiten und die internet-verbindung ist öfter weg als man denkt, aber noch öfter sind die hersteller die einem das gerät verkauft haben und die cloud am laufen halten, plötzlich vom fenster weg oder werden von arschloch-firmen aufgekauft. geräte die sich nicht auch lokal, vor ort vernetzen lassen, also auch eine lokale API (schnittstelle) anbieten, haben im haus oder der wohnung eigentlich nichts verloren. abhängigkeit von der cloud ist alles andere als „smart“.

worauf ich aber eigentlich heraus will, und weshalb ich den artikel vor ein paar tagen ursprünglich angefangen zu schreiben habe, ist automatisierung. was mich (als frickler), aber (hoffentlich) auch andere haushaltsmitglieder dauerhaft begeistert, sind ausgefeilte automatisierungen.

anfang der woche habe ich die spülmaschine eingeschaltet und 5 sekunden später plärrte es aus meinem lautsprecher: „es sind nur noch wenige geschirrtabs da. ich hab tabs auf die einkaufsliste gesetzt.“

das schöne ist: ohne weiteres zutun hat das auch funktioniert.

automatisierungsergebnis

die automatisierung die die aktion ausgelöst hat ist alles andere als „smart“ oder wirklich intelligent; eigentlich ist sie sogar trivial:

automatisierung

so trivial diese automatik auch ist, ich habe noch keinen weg gefunden, soetwas mit systemen der grossen player abzubilden, weder mit homekit, bzw. der home-app von apple, noch mit alexa-routinen oder dem google-home gedöns. samsung hat ein cloud-basiertes system namens „smartthings“, mit dem man sowas vielleicht machen könnte, aber das problem, das alle grossen hersteller bisher nicht mal in ansätzen gelöst haben, ist die integration von sensoren und aktoren über herstellergrenzen hinweg.

ansätze dafür gibt es, aber lösungen die über viele herstellergrenzen hinweg funktionieren, sind bisher nur im DIY (do it yourself) bereich zu finden. lösungen wie home assistant, openHAB und viele andere ermöglichen alle möglichen geräte, sensoren, aktoren zusammenzuflanschen und in einem guss zu automatisieren.

zurück zum beispiel: grundlage der bestell-automatik sind natürlich erst mal sensoren, an erster stelle ein sensor der die anzahl verbliebener tabs verzeichnet. die anzahl tabs ist ein abgeleiter sensor. ich leite die zahl der tabs von einem sensor ab, der registriert wenn die spülmschine angeschaltet wird (und wann sie fertig ist). das wiederum leite ich von einem senor ab, der den stromverbrauch der spülmaschine misst und daraus den betriebszustand der spülmaschine ableitet.

die aktoren sind schon etwas komplexer. es gibt derzeit keinen weg der bring.app einkäufe hinzuzufügen — ausser über die app oder über alexa. bring hält es für unnötig hier eine öffentlich zugängliche API zur verfügung zu stellen. über die alexa-integration, die selbstverständlich auf einer (geschlossenen) API basiert, zu der nur amazon und bring selbst zugang haben, kann ich mich aber trotzdem einklinken.

der dienst bespoken.io erlaubt es mir statt alexa ein komando zuzurufen, alexa ein kommando per rest-schnittstelle zu übermitteln. obwohl ich keinen echo-lauschsprecher mehr in betrieb habe, kann ich so mit alexa-skills kommunizieren die mit meinem amazon-konto verknüpft sind.

shell_command:
  ask_alexa: >-
      /usr/bin/curl -X PUT -G 'https://virtual-device.bespoken.io/process' --data-urlencode 'message={{message}}' --data-urlencode user_id=alexa-xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx --data-urlencode language_code=de-DE -H 'content-length: 0' -o /Users/ix/.homeassistant/scripts/alexa_response.json

wenn ich bespoken programmatisch bitte die nachricht „öfffne bring und füge geschirrtabs hinzu“ an mein alexa-amazon konto zu senden, hat das die gleiche wirkung als würde ich das in ein amazon-echo-mikrofon sprechen. die antwort des bring-skills liefert bespoken freundlicherweise auch gleich mit, so dass ich den auch wieder ausgeben kann — ganz ohne echo dot. (ein weiterer vorteil der lösung über snips ist übrigens auch, dass ich jetzt einfach sagen kann: „wir brauchen milch“, wohingegen mich die alexa-lösung dazu zwingt einen quatsch-satz zu sagen wie: „öffne bring und füge milch zu meiner liste hinzu“)

der zweite aktor macht nichts anderes als snips zu bitten eine tts (text to speech) nachricht in der küche abzuspielen: „es sind nur noch wenige geschirrtabs da. ich hab tabs auf die einkaufsliste gesetzt.“

aufmerksame leser bemerken jetzt natürlich einen widerspruch: ich nutze die cloud für unseren einkaufszettel und um diesen zu füllen. wichtig ist (mir) aber ein prinzip, von dem ich zuerst im architekturstudium gehört habe, und dem ich später in der programmierung und webseitengestaltung wiederbegegnet bin: das prinzip der würdevollen fehlfunktion („degrade in grace“). beim studium ging es eigentlich um materialien „die würdevoll altern“, aber egal ob es sich um material, code oder eine benutzerschnittstelle handelt, alle sollten bei fehlfunktion die würde und ihr gesicht wahren. wenn der eintrag nicht in der einkaufsliste auftaucht, weil die cloudanbindung nicht funktioniert: halb so schlimm, mich hat zumindest die nachricht erreicht, dass nur noch wenige tabs da sind. vielleicht habe ich das auch schon so gesehen. wichtiger ist mir hingegen die zahl der spülzyklen zu erfassen (und daraus den strom und spülmittelverbrauch abzuleiten und gegebenenfalls auszuwerten). das funktioniert auch ohne internet verbindung und diese sensor-daten bleiben in der wohnung. sollte das lokale netzwerk ausfallen ist es zwar schade, dass dann die laufzeiten nicht erfasst werden und ich keine spülmaschine-ist-fertig-nachricht mehr auf mein handy bekomme, aber immerhin funktioniert die spülmaschine noch. fällt der strom aus, kann ich immer noch wasser mit dem gasherd aufkochen und mit der hand spülen. ohne gas ist es dann aber aus mit der wohnwürde.

dieser schichtweise aufbau der technik-funktionen ist meiner meinung nach bei der konzipierung aller aspekte der heimautomatisierung essentiell. die äusserste schicht, die cloud, auf die ich den wenigsten einfluss und kaum kontrolle habe, sollte, wenn überhaupt, nur für komfort-/luxusfunktionen dienen. alles was essentiell ist, licht, wärme, schlösser, geräuschquellen sollten mindestens zwei ebenen tiefer liegen und möglichst eine optionale manuelle steuerung bieten.

tl;dr: weder vernetzung, noch fernbedienung oder automatisierung verdienen im heim wirklich das label „smart“. aber die automatisierung von (am besten lokal) vernetzten, fernbedienbaren geräten macht wirklich spass und befriedigt (wenns funktioniert) tief.

„Der Protest-Strich“

felix schwenzel, , in antworten    

kusanowsky:

Soweit ich informiert bin – und es kann ja sein, dass ich mich irre – unterliegen Kinder unter 18 Jahren der Aufsicht durch Eltern, Lehrer oder sonstigen, mit der Ausübung einer Aufsichtspflicht beauftragten Personen, die selber mindestens 18 Jahre alt sind. Dazu zählt vor allem auch die Bestimmung über den Aufenthaltsort, den Kinder von 15 Jahren nicht gegen den Willen ihres Vormunds wählen dürfen. Das ist das eine.

Das andere ist, dass Kinder aus eigenem Antrieb sehr viele Dinge tun oder lassen, Schule schwänzen beispielsweise, Mitschüler mobben, Lehrer ärgern, Eltern anschreien, Murmeln spielen, Kaninchen streicheln oder Bettnässen. Dass sich Kinder aus eigenem Antrieb weigern, die Schule aufzusuchen, kann jeder glauben, der selber Kind war und zur Schule gehen musste.
Dass ein 15 jähriges Mädchen schulfrei dafür bekommt, gegen etwas zu protestieren, über das sie nur von ihren Lehrern informiert und unterrichtet wurde, hat sie gewiss nicht aus eigenem Antrieb geschafft.

Vielleicht wäre es an dieser Stelle gar nicht so schlecht, du würdest dich etwas differenzierter mit meiner verquasten Ausdrucksweise beschäftigen.
Manche Dinge sind nämlich gar nicht so kompliziert zu verstehen,

verquasung raubt mir meisten nur die lust auf auseinandersetzung oder weiterlesen, nicht unbedingt das verständnis. auch hier, in deinem kommentar, ist deine argumentation intellektuell einwandfrei, aber sie scheint mir eher auf nachdenken als einer auseinandersetzung mit der eigentlichen situation zu beruhen. gerade wenn man andere leute mit sexuell und gewalttätig konnotierten und herabsetzenden methaphern beschreibt, kann es ja nichts schaden nicht nur in den eigenen kopf zu schauen, sondern zum beispiel auch auf die berichterstattung.

ich nehme mir nicht heraus genau zu verstehen, was das mädchen im einzelnen antreibt, aber was ich über sie gelesen habe, lässt mich eher in eine andere richtung denken als dich.

ich habe gelesen, dass das mädchen dem autistischen spektrum zugeordnet ist (asperger) und vom zustand der welt so frustriert war, dass sie erkrankte. der aktivismus, so habe ich verschiedene artikel über sie verstanden, war ihr weg aus der krankheit — dem sich ihre eltern nicht in den weg stellen wollten, ihn aber auch nicht explizit gefördert haben.

der spiegel zitiert das mädchen:

Ihre Eltern wollten sie überzeugen, es sein zu lassen. „Und als sie nicht nachgab“, erzählt Vater Svante Thunberg, „haben wir ihr gesagt: ’Wir können nicht hinter dir stehen. Du musst es ganz allein machen.‘“

natürlich kann man darüber streiten ob diese form des protests pampige machtkommunikation ist, an der politischen und gesellschaftlichen realität vorbeigeht oder insgesamt untauglich ist, aber einfach aus dem eigenen, beschränkten erfahrungshorizont jemanden zu verurteilen ist dann auch wieder nicht anderes als ein kleines, vom schreibtisch initiertes machtspiel, ohne jedes risiko und mit minimalem einsatz. aber immerhin trägst du deine überzeugungen genauso unerschütterlich selbstbewusst vor, wie greta thunberg. mit dem unterschied, dass du ihr das verlassen auf den gesunden menschenverstand, das weglassen von „empirizität“ ankreidest, dir selbst aber zusätzlich auch das weglassen von evidenz erlaubst.

links vom 17.12.2018

felix schwenzel, , in wirres.net    

links vom 16.12.2018

felix schwenzel, , in wirres.net    

in der letzten woche waren in meinem feedreader so viele gute artikel, dass ich die am liebsten alle teilen wollte. tatsächlich tue ich das bereits (schon immer): alles was mir gefällt, was ich später lesen möchte, was ich später verlinken möchte oder was ich glaube später in einem artikel oder vortrag benutzen zu können versehe ich in meinem feedreader mit einem stern. und dann landet es hier: pinboard.in/u:diplix

um mal ein paar links loszuwerden, hier mal wieder eine auswahl aus den letzten tagen.

unterzucker

felix schwenzel, , in notiert    

das ARD-morgenmagazin habe ich zu studienzeiten, also vor einer halben ewigkeit, gerne geguckt. wir hatten damals ja nichts, vor allem kaum internet.

was ich sowohl beindruckend, als auch erschütternd finde: der sportmoderator ist immer noch der gleiche. in der wikipedia steht, dass peter grossmann das seit 1996 macht.

peter grossmann bei der arbeit

ich mein, wo gibt’s sowas heutzutage noch, dass jemand 22 jahre lang gutgelaunt einer extrem langweiligen tätigkeit nachgeht?

heute habe ich zufällig ins morgenmagazin reingeguckt, weil ich meinen TV-stick neu kalibrieren musste und die sender testen musste. gerade war eine ernährungsexpertin dran, die den zuschauern empfahl zu weihnachten den zuckerkonsum ein bisschen einzuschränken. man könne auch kristallzucker „eins zu eins ein bisschen“ mit kokosblüten-zucker ersetzen.

zucker reduzieren!

im weiteren gespräch fing die expertin an leicht zu zittern, was auch die kamera nicht verschleiern konnte. der moderator sprach das dann auch an: „ich glaube es geht ihnen gerade nicht so gut?“

„ja“, sagte die zitternde ernährungsexpertin die sich gerade für weniger zucker in der ernährung ausgesprochen hatte: „ich hab glaub ich gerade ein bisschen unterzucker.“

das ist nicht nur wunderbar und erfreulich, sondern auch exemplarisch. man sollte nicht nur auf’s lebensglück hinarbeiten, sondern auch und vor allem auf die fähigkeit glück zu erkennen.

erstmal ist es nicht unbedingt grandios, nur weil gerade alle davon reden, sondern vor allem neu (in deutschland). ansonsten; gute frage, ich hab noch ein paar mehr:

  • was ist so toll daran zeitung oder bücher auf dem handy zu lesen? (statt auf papier, das keinen akku braucht?)
  • was ist so toll daran bordkarten, eintrittkarten, kundenkarten auf dem handy zu haben? (statt sie übersichtlich auf papier oder plastik im geldbeutel zu haben?)
  • was ist so toll daran strassenkarten auf dem handy zu haben?
  • was ist so toll daran eine foto- und video-kamera auf dem handy zu haben?

* * *

ne antwort auf all die rhetorischen fragen hab ich natürlich auch: es ist irre praktisch, alles was man unterwegs so braucht an einem ort und leicht zugänglich zu haben. ob das nun apple-, google- oder kreissparkasse-hintertupfingen-pay ist, ob es google-, here- oder apple-karten sind, ob es das apple-wallet oder irgendeine andere app ist, die meine bord- und eintrittkarten verwaltet, dürfte in den meisten fällen egal sein.

grandios wird es aber dann, wenn die nutzung wirklich einfach und reibungsfrei ist, wenn sich die lösung im alltag bewährt und auch tatsächlich sicher und datensparsam ist.

* * *

letzte woche habe ich bemerkt, dass mein #aufdemwegzurarbeit-netto (ohne hund) jetzt auch selbstbedienungskassen installiert hat. ich bin einfach an der kassenschlange von 8 leuten vorbeigegengen, habe mein mittagessen gescant und meine EC karte auf das zahlterminal gelegt. keine PIN, keine unterschrift, super, raus, fertig.

heute früh hab ich mich wieder selbst im netto bedient, statt der EC karte habe ich heute aber mein handy ans zahlterminal gehalten. keine PIN, keine unterschrift, super, raus, fertig.

weil ich ungefähr 20 karten in meiner tasche habe werde ich künftig wohl die zahlung mit dem handy vorziehen, weil sie mir das rausgesuche erspart. mein handy habe ich immer griffbereit, meine EC karte (und PIN) nicht. ist das grandios? nö, aber ziemlich praktisch.

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

felix schwenzel, , in artikel    

alexa, bzw. unser echo-dot ist jetzt seit ungefähr 6 wochen offline und empfängt jetzt ihr gnadenbrot. wenn ich artikel über neue oder nützliche features von alexa 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 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 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.

die timer-funktion, die ich hier 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 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).

snips konsole

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.

snips timer app

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.

snips intent TimerStart

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.

snips timer app aktionen (keine)

trotzdem haben die skills, oder genauer die einzelnen intents aktionen zur folge, wenn man im homeassistant die snips-komponnete installiert hat. dann schnappt sich homeassistant sozusagen die intents auf, die man konfiguriert hat. für den TimerStart intent sieht das dann so aus:


intent_script:
  TimerStart:
    speech:
      text: >-
          timer {{timer_duration_raw}} ab jetzt.
          {% if timer_duration > 3600 %}
              Timer von mehr als einer Stunde stelle ich wahrscheinlich falsch dar.
              Felix ist da zu doof für, das ordentlich zu machen.
          {% endif %}
    action:
      - service: timer.finish
        entity_id: timer.snips
      - service: timer.start
        data_template:
          entity_id: timer.snips
          duration: '{{ timer_duration }}'

diese zeilen bitten homeassistant, sobald snips das auslösen des TimerStart-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 (timer_duration) und den namen (timer_name). 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 (timer_duration wird von der homeassistant-snips-komponente freundlicherweise in sekunden umgerechnet, timer_raw 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.


automation:
  - alias: timerstarted
    trigger:
      platform: time
      seconds: '/1'
    condition:
      condition: state
      entity_id: timer.snips
      state: active
    action:
      - service: counter.increment
        data:
          entity_id: counter.snips_elapsed
      - service: mqtt.publish
        data_template:
          topic: "devices/led-matrix/light/print/set"
          payload: >-
              {% set duration = states.timer.snips.attributes.duration %}
              {% set elapsed = states("counter.snips_elapsed") | default(0) | int %}
              {% set hms_split = duration.split(':') %}
              {% set hours = hms_split[0] | int %}
              {% set minutes = hms_split[1] | int %}
              {% set seconds = hms_split[2] | int %}
              {% set duration = seconds + (minutes * 60) + (hours * 60 * 60) %}
              {{ (duration - elapsed ) | int | timestamp_custom('%M%:%S') }}
  - alias: timerfinished
    trigger:
      platform: event
      event_type: timer.finished
      event_data:
        entity_id: timer.snips
    action:
      - service: counter.reset
        data:
          entity_id: counter.snips_elapsed
      - condition: state
        entity_id: timer.snips
        state: idle
      - service: mqtt.publish
        data_template:
          topic: "devices/led-matrix/light/print/set"
          payload: 'fertig!'
      - service: snips.say
        data_template:
          site_id: "ivanka"
          text: "dein timer ist abgelaufen"

die erste automation läuft jede sekunden wenn der timer.snips läuft (sonst nicht). die action berechnet, bzw. zählt die restlaufzeit (in sekunden) und schickt die restlaufzeit auf meinen selbstgebauten matrix-display, 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 snipskonsole 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.

* * *

snips pupsen app und pupsen intent

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 pupsen:


intent:
  pupsen:
    async_action: True
    action:
      - service: shell_command.snips_wav
        data_template:
          site_id: "{{ site_id }}"
          session_id: "{{ session_id }}"
          wav_file: >-
              {%- set file = [
              "Girl Fart-SoundBible.com-669012925",
              "Quick An Small Fart-SoundBible.com-958779407.wav",
              "Fart Reverberating Bathroom-SoundBible.com-2032114496.wav",
              "Wet Fart Squish-SoundBible.com-332766022.wav",
              "Fart Short Ripper-SoundBible.com-1317602707.wav",
              "King Farthur-SoundBible.com-922925717.wav",
              "Funny Fart Trail-SoundBible.com-1691782690.wav",
              "Squish Fart-SoundBible.com-115133916.wav",
              "Rigid Fart-SoundBible.com-1121832279.wav",
              "Quick Fart-SoundBible.com-655578646.wav",
              "Windy Fart-SoundBible.com-1980462064.wav",
              "Bean Fart-SoundBible.com-215806729.wav",
              "Silly_Farts-Joe-1473367952.wav"
              ] | random -%}
              /Users/ix/.homeassistant/sounds/pupse/{{ file }}
shell_command:
  snips_wav: >-
      /usr/local/Cellar/mosquitto/1.4.14_2/bin/mosquitto_pub -h ivanka.local -p 1883 -u <USER> -P <PASSWORD> -t 'hermes/audioServer/{{ site_id }}/playBytes/{{ session_id }}' -f '{{wav_file}}'

async_action 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 site_id und session_id. 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 site_id 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).

* * *

hier ist ein gist, mit der homeassistant konfiguration für den timer und den pups intent.