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.

was vor allem gerade schief läuft

felix schwenzel, in links    

manchmal macht es klick, wenn ich texte lese. dann kommen sachen die mir im kopf schwirren plötzlich zusammen, weil irgendwer es geschafft hat die schwirrenden dinge zu verbunden und per logik das schwirren zumindest für eine weile zu unterbinden. zuletzt ist das vor ein paar tagen robert reich gelungen, dessen leider etwas bescheuert übertitelter text Amazon Is Everything That's Wrong With America viel weniger polemisch ist, als die überschrift vermuten lässt.

in aller kürze sagt reich im text, dass amazon ein symptom der derzeitigen krise in amerika ist, bzw. dass amazons jüngste entscheidung für zwei neue hauptquartiere das problem deutlich macht, an dem amerika leidet — aber auch andere westliche länder:

das problem ist eine wachsende ungleichheit von orten („widening inequalities of place“). amazon habe sich entschieden seine zwei neuen hauptquartiere nicht in einer ländlicheren, konservativen gegend anzusiedeln, sondern im liberalen new york und der metropolengegend washingtons.

aus amazons perspektive ist das folgerichtig, weil amazon gebildete, talentierte menschen benötigt um sein geschäft zu betreiben und weiterzuentwickeln. amazon verkauft eben nicht nur sachen im internet, sondern erfindet sich ständig neu, und verbessert seine methoden kontinuierlich, um konsumenten besser und schneller zu bedienen. amazon ist auf technologie angewiesen und technologie, technologieentwicklung ist eben kein ding an sich, sondern ein prozess, ein hin und her, dialoge zwischen menschen, die voneiander lernen, sich inspirieren und sich gegenseit (intellektuell) auf die schultern steigen. und genau das, schreibt reich, passiere eben in hauptsächlich in wenigen geographischen clustern, in den USA vor allem an den küsten. an der westküste, in den bundesstaaten washinton und kalifornien oder an der ostküste um washington DC, boston und new york herum. in europa ist das nicht anders, auch hier findet technologische innovation eher in urbanen gegenden statt, weniger im ländlichen raum.

die talentierten menschen, die technologie vorantreiben, die in technologie-firmen arbeiten, studieren in städten und ziehen die grossräume von städten auch zum späteren leben und arbeiten vor.

und genau das ist das problem: der ländliche raum bleibt vom derzeitigen fortschrittstreiber ausgeschlossen. der ländliche raum ist nahezu ausgeschlossen von jobwachstum, den geld- und steuerströmen, die sich fast ausschliesslich in die städtischen räume ergiessen.

Between 2010 and 2017, according to Brookings, nearly half of the America’s employment growth centered in just 20 large metro areas, now home to about a third of the U.S. population.

Relative to these booming hubs, America’s heartland is becoming older, less well-educated, and poorer.

The so-called “tribal” divide in American politics, which Trump has exploited, is better understood in these economic and cultural terms: On one side, mega-urban clusters centered on technologies of the future. On the other, great expanses of space inhabited by people left behind.

überspitzt formuliert: der ländliche raum verarmt, verblödet, überaltert. populisten wie trump wissen das mit ihren lügen, hohlen versprechen und vermeintlichem mitgefühl für die unterpriviligierten auszunutzen. die gutbezahlten jobs entstehen in den metropolen, aber auch hier entstehen durch einkommensungleichheit immer mehr prekäre einkommenssituationen.

auch in deutschland scheinen sich diese probleme zuzuspitzen. die unterschiede zwischen arm und reich steigen, die mittelschicht verschwindet und die gutbezahlten jobs entstehen in den städten. amazon hat sein hauptquartier in münchen schwabing, „am Berliner Standort entwickelt Amazon“, laut selbstbeschreibung, „seit 2013 zukunftsweisende Technologien“, „In Dresden ist das Amazon Office ein Kompetenzzentrum für Linux Kern- und Hypervisor-Entwicklung“, die eher schlechtbezahlten jobs in logistikzentren siedelt amazon dann auch im ländlichen raum an (graben, bad hersfeld, rheinberg, werne, pforzheim, koblenz, brieselang oder winsen).

in deutschland wie in amerika tendieren die metropolen politisch nach links. seattle, kalifornien, new york, washington DC, alle nennt robert reich „true blue“, also demokratisch dominiert. die republikaner sind dafür in den ländlichen gegenden stärker. in deutschland sind die metropolen zwar nicht blau, aber dafür stark von rot und grüntönen dominiert. in den USA verzerrt sich durch die konzentration der progressiven wähler in den metropolen auch das politische klima:

Another consequence is a more distorted democracy. California (now inhabited by 39.54 million) and New York (19.85 million) each get two senators, as do Wyoming (573,000) and North Dakota (672,591).

Even though Democratic Senate candidates in the midterm elections received 12 million more votes than Republican Senate candidates, Republicans still gained at least one more Senate seat.

ich vermute, dass das sich das in deutschland tendenziell ähnlich verhält, auch wenn die gleichheit der wahl in deutschland offenbar ein höheres gewicht hat, als in den USA.

das problem des „tribal divide“ dürfte sich aber in den kommenden jahren genauso verstärken, wie sich die trends der wachsenden einkommenungleichheit und der sich ausdünnenden mittelschicht auch langsam aber sicher bei uns breit machen.

robert reichs wikipedia-artikel zu lesen, lohnt sich übrigens auch:

In seinem Werk Supercapitalism stellte Reich fest, im vorherrschenden Wirtschaftssystem würden Personen als Verbraucher und Anleger zunehmend mehr Macht erhalten, als Arbeitnehmer und Bürger jedoch immer weniger. Ein Primat der Ökonomie über die Politik untergrabe die Demokratie. Reich stellte dem eine Forderung nach dem Primat der Politik entgegen.

Reich begründet seine Auffassung mit dem Paradox des Superkapitalismus. Dieses besagt: Die Bürger in den Industrieländern und immer mehr Menschen in Schwellenländern profitieren als Verbraucher und Anleger von der Globalisierung und Liberalisierung der Märkte, als Bürger ihrer Staaten lehnen sie jedoch deren negative Folgen weitgehend ab. Als Konsumenten suchen sie nach den besten Preisen, als Bürger beklagen sie jedoch das Aussterben der kleinen Quartierläden und die schlechten Arbeitsbedingungen in den Supermärkten. Als Anleger erwarten sie hohe Renditen, als Bürger verurteilen sie jedoch die Manager, die aus Renditegründen Arbeitsstellen kürzen. Für Reich ist die Bilanz dieser Ambivalenz eindeutig: Die Anleger und Konsumenten sind die Gewinner der Globalisierung. Ihre Auswahlmöglichkeiten nehmen laufend zu. Die Bürger hingegen sind immer öfter die Verlierer: Die Löhne nehmen ab, die Arbeitsunsicherheit nimmt zu und ebenso die gesellschaftliche Ungleichheit.

Der Vorzug von Robert Reichs Superkapitalismus-Konzept liegt darin, dass es nicht zu unsachlicher System- oder Kapitalismuskritik verleitet, denn neoliberal sind in dieser Betrachtungsweise nicht Systeme, sondern Personen, die als Investoren und Konsumenten handeln.

das ist eigentlich ein schöner schlusssatz, auch wenn vieles von dem was reich sagt nachdenkenswert und diskussionswürdig ist: neoliberal sind nicht „die da oben“, sondern wir konsumenten.

das rezept heisst süsskartoffel-suppe mit kokosmilch, war aber eher cremig. aber super-lecker. aus m

das rezept heisst süsskartoffel-suppe mit kokosmilch, war aber eher cremig. aber super-lecker. aus maria ellas vegetarische küche.

laut rezept besteht die suppe nur aus 700 gramm süsskartoffeln (40-50 minuten ganz im ofen bei 180° gegart) und 800 millilitern kokosmilch mit einem esslöffel „thailändischer roter currypaste“.

die kokosmilch mit der currypaste soll man im topf erwärmen und dann mit den gegarten süsskartoffeln im mixer vercremen. hab ich gemacht (allerdings mit der lila-currypaste), dachte dann aber nur mit koriander garnieren ist ein bisschen öde und hab surimi-stäbchen (die hausmarke von real,- sind nach meinung der beifahrerin die besten surimi-sticks), etwas thai-basilikum und (sehr) feine zwiebelringe dazu serviert (statt deko-koriander, wie im kochbuch angegeben). dazu ein bisschen sojasosse war das sehr lecker und extrem sättigend.

die beifahrerin und ich haben jetzt jeweils 350 gramm süsskartoffel und 400 milliliter kokosmilch intus.