Re: Roomba, Sonos, HomeAssistant

Sie­he https://rainer.sokoll.com/?p=5078 — ja, funk­tio­niert. Also fast rich­tig geil.

- alias: Adele voll
  trigger:
    platform: template
    value_template: "{%if is_state_attr('vacuum.adele', 'bin_full', true) %}true{%endif%}"
  action:
    - service: notify.ios_loopback
      data:
        message: 'Bitte Adele entleeren!'
    - service: script.sonos_say
      data:
#        sonos_entity: group.sonos
        sonos_entity: media_player.arbeitszimmer
        volume: 0.3
        message: 'Adele hat die Windeln voll.'
        delay: '00:00:03'

Mit sonos_entity: media_player.arbeitszimmer funk­tio­niert das rich­tig gut: Lau­fen­de Musik wird ange­hal­ten, 3 Sekun­den Pau­se, Sonos im Arbeits­zim­mer infor­miert über Ade­les vol­le Win­del, und nach wei­te­ren 3 Sekun­den spielt der Sonos wei­ter.
Aber ich will die Ansa­ge auf meh­re­ren Sono­sen haben, und das habe ich nur geschafft, indem ich eine Grup­pe anspre­che (group.sonos). Dann aller­dings wird nicht wei­ter­ge­spielt, und das ist aus­ge­spro­chen doof.
Jetzt beim Schrei­ben fällt mir auf, daß es mit zwei ser­vices gehen soll­te. Schlimms­ten­falls müß­ten die­se unter­schied­li­che Namen haben. Das lie­ße ich aber hof­fent­lich mit Sym­links auf das Skript sonos_say rea­li­sie­ren.
Mal sehen. Mor­gen.

0

Roomba und die Cloud

Da ich mei­nem Room­ba ja de Cloud abge­dreht habe (tcpdump auf dem Rou­ter)

09:34:43.733618 IP 192.168.1.93.49704 > 5.199.135.170.123: NTPv4, Client, length 48
09:34:43.733863 IP 192.168.1.254 > 192.168.1.93: ICMP 5.199.135.170 udp port 123 unreachable, length 84
09:34:54.811635 IP 192.168.1.93.49705 > 5.199.135.170.123: NTPv4, Client, length 48
09:34:54.811882 IP 192.168.1.254 > 192.168.1.93: ICMP 5.199.135.170 udp port 123 unreachable, length 84

Huch, ich sehe gera­de: NTP kann ich ihm ja erlau­ben. Aller­dings kriegt er von mei­nem DHCP-Ser­ver auch mei­nen loka­len NTP-Ser­ver, war­um also 5.199.135.170 (wird wohl einer von pool.ntp.org sein)?
Jeden­falls ist die App auf dem Han­dy ganz trau­rig:

Aller­dings Home­As­si­stant auf dem­sel­ben Tele­fon kann sehr wohl:

Es ist auch wirk­lich nicht ein­zu­se­hen, war­um man zum Ein­schal­ten eines Staub­saugers eine Cloud benö­ti­gen soll­te (Knopf drü­cken am Gerät geht immer­hin noch)

0

Roomba, Sonos, HomeAssistant

Geil­geil­geil. Ich weiß nur noch nicht, obs funk­tio­niert 🙂
Soll­te aber, mit einem Trig­ger “Licht aus” funk­tio­niert es jeden­falls.

Ziel: Wenn der Staub­sauger (wir nen­nen ihn Ade­le) ein Pro­blem hat, soll er das bit­te mel­den. Pro­ble­me könn­ten zwei sein: Dreck­be­häl­ter voll und fest­ge­fah­ren

- alias: Adele voll
  trigger:
    platform: template
    value_template: "{%if is_state_attr('vacuum.adele', 'bin_full', true) %}true{%endif%}"
  action:
    - service: notify.ios_loopback
      data:
        message: 'Bitte Adele entleeren!'
    - service: script.sonos_say
      data:
        sonos_entity: media_player.arbeitszimmer
        volume: 0.3
        message: 'Adele hat die Windeln voll.'
        delay: '00:00:03'

- alias: Adele festgefahren
  trigger:
    platform: template
    value_template: "{%if is_state_attr('vacuum.adele', 'Stuck', true) %}true{%endif%}"
  action:
    - service: notify.ios_loopback
      data:
        message: 'Bitte Adele befreien.'
    - service: script.sonos_say
      data:
        sonos_entity: media_player.arbeitszimmer
        volume: 0.3
        message: 'Adele hat sich festgefahren.'
        delay: '00:00:03'

Und dazu noch das Skript:

sonos_say:
  alias: 'Sonos TTS script'
  sequence:
  - service: sonos.snapshot
    data_template:
      entity_id: "{{ sonos_entity }}"
  - service: sonos.unjoin
    data_template:
      entity_id: "{{ sonos_entity }}"
  - service: media_player.volume_set
    data_template:
      entity_id: "{{ sonos_entity }}"
      volume_level: "{{ volume }}"
  - service: tts.google_say
    data_template:
      entity_id: "{{ sonos_entity }}"
      message: "{{ message }}"
  - delay: "{{ delay }}"
  - service: sonos.restore
    data_template:
      entity_id: "{{ sonos_entity }}"

Geil sind dabei die zwei Funk­tio­nen sonos.snapshot und sonos.restore — die machen genau das: Sta­tus (Grup­pen, aktu­el­les Abspiel­ob­jekt) vor der Sprach­aus­ga­be sichern und danach den Aus­gangs­zu­stand wie­der­her­stel­len.

Mal mor­gen sehen, ob das auch wirk­lich so funk­tio­niert.
Auf dem Reiß­brett jeden­falls sieht es gut aus 🙂

0

HomeAssistant, IOS Notifications

Dadurch, daß HA nun am Inter­net hängt mit SSL und einem “rich­ti­gen” Zer­ti­fi­kat, kann ich mir nun auch Nach­rich­ten ans Tele­fon schi­cken (das ging zwar vor­her auch schon via Tele­gram, aber wenns auch nativ geht…)

Und es ist furcht­bar ein­fach, ich habe mal nur mit einem ein­fa­chen Trig­ger (Licht wird im Arbeits­zim­mer aus­ge­schal­tet) getes­tet: Aus­schnitt aus mei­ner automations.yaml:

- alias: An Rainers Handy petzen
  trigger:
    platform: state
    entity_id: light.arbeitszimmer_deckenlampe
    to: 'off'
  action:
    service: notify.ios_loopback
    data:
      title: "Pullach"
      message: "Licht im Arbeitszimmer ausgeschaltet!"
      data:
        push:
          badge: 0

Und das kommt dann instantan sowohl auf Han­dy als auch auf der Uhr an:

Ganz neue Mög­lich­kei­ten zum Spie­len!

0

HomeAssistant nun am Internet

Das hat­te ich schon län­ger vor: Home­As­si­stant ans Inter­net zu hän­gen. Dann kann ich auch aus der Fer­ne die lie­be Fami­lie erschre­cken 🙂
Nor­ma­ler­wei­se wür­de man auf dem Rou­ter ein Port­for­war­ding ein­rich­ten und gut. Aber das wird dann ganz schnell eklig mit HTTPS und des­sen Zer­ti­fi­ka­ten. Außer­dem spricht mein Home­As­si­stant kein HTTPS, und ich woll­te mög­lichst wenig dar­an rum­kon­fi­gu­rie­ren. Letzt­lich muße ich dort (HA) gar nichts machen.

Mei­ne Lösung: HA läuft auf einem Raspi, auf dem auch ein Apa­che läuft. Der stellt einen rever­se Pro­xy mit HTTPS (selbst­si­gnier­te Zer­ti­fi­kat) zur ver­fü­gung, der dann mit plain HTTP auf HA wei­ter­ver­mit­telt. Bleibt aber das Pro­blem mit den Zer­ti­fi­ka­ten.
Aber ich habe ja noch einen Root-Ser­ver im Inter­net! Und der hat ein rich­ti­ges Wild­card-Zer­ti­fi­kat. Also habe ich auch dort einen rever­se Pro­xy instal­liert, der dann per HTTPS auf mei­nen Heim-IP geht, dort gibt es dann in der Tat ein Port­for­war­ding auf den HTTPS-Pro­xy auf dem Raspi.
Funk­tio­niert!
Der Apa­che auf dem Raspi:


  ServerName hass.sokoll.com
  ServerAdmin webmaster@sokoll.com
  ErrorLog ${APACHE_LOG_DIR}/hass.sokoll.com-error.log
  CustomLog ${APACHE_LOG_DIR}/hass.sokoll.com-access.log combined
  SSLEngine on
  SSLCertificateFile /etc/ssl/private/raspi.crt
  SSLCertificateKeyFile /etc/ssl/private/raspi.key
  ProxyPreserveHost On
  ProxyRequests off
  ProxyPass /api/websocket ws://localhost:8123/api/websocket
  ProxyPassReverse /api/websocket ws://localhost:8123/api/websocket
  ProxyPass / http://127.0.0.1:8123/
  ProxyPassReverse / http://127.0.0.1:8123/
  RewriteEngine on
  RewriteCond %{HTTP:Upgrade} =websocket [NC]
  RewriteRule /(.*)  ws://localhost:8123/$1 [P,L]
  RewriteCond %{HTTP:Upgrade} !=websocket [NC]
  RewriteRule /(.*)  http://localhost:8123/$1 [P,L]

Der auf dem Root-Ser­ver:


  Protocols h2 http/1.1
  ServerName hass.sokoll.com
  ServerAlias home.sokoll.com
  ServerAdmin webmaster@sokoll.com
  ErrorLog ${APACHE_LOG_DIR}/hass.sokoll.com-error.log
  CustomLog ${APACHE_LOG_DIR}/hass.sokoll.com-access.log combined
  SSLEngine on
  SSLCertificateFile  /etc/dehydrated/certs/wildcard_sokoll.com/fullchain.pem
  SSLCertificateKeyFile /etc/dehydrated/certs/wildcard_sokoll.com/privkey.pem
  ProxyRequests off
  ProxyPreserveHost On
  ProxyPass /api/websocket wss://91.66.58.188/api/websocket
  ProxyPassReverse /api/websocket wss://91.66.58.188/api/websocket
  ProxyPass / https://91.66.58.188/
  ProxyPassReverse / https://91.66.58.188/
  SSLProxyEngine on
  SSLProxyCheckPeerCN off
  SSLProxyCheckPeerExpire off
  SSLProxyCheckPeerName off


  ServerName hass.sokoll.com
  ServerAlias home.sokoll.com
  ServerAdmin webmaster@sokoll.com
  RedirectMatch permanent ^/(.*) https://hass.sokoll.com/$1

Die webso­cket-Geschich­ten habe ich mir aus dem Inter­net zusammengeklau(b)t, natür­lich. Bis­lang habe ich kei­ne Feh­ler bemerkt.

0

Home Automation wird niemals das große Ding werden

Weil es kein home auto­ma­ti­on gibt. “Ale­xa, fah­re die Rol­lä­den¹ run­ter!” ist kaum intel­li­gen­ter als “Frau, hol’ das Bier aus dem Kühl­schrank!” Home auto­ma­ti­on ist dann, wenn Gerä­te regel­ge­steu­ert inter­agie­ren kön­nen, auch unter Berück­sich­ti­gung äuße­rer Bedin­gun­gen.

Wenn die Bes­te Ehe­frau von allen² Früh­dienst hat, dann klin­gelt ihr Wecker um 04:30:00 Uhr, und ihre Nacht­tisch­lam­pe geht exakt um 04:30:03 an für 3 Minu­ten. Aber eben nur wenn sie Früh­dienst hat. Das zu beto­nen ist wich­tig. Ob sie Früh­dienst hat, steht in ihrem Kalen­der. Die Ver­knüp­fung von Kalen­der­ein­trag und Lam­pe ist ein schö­nes Bei­spiel für Auto­ma­ti­sie­rung (hier für die Neu­gie­ri­gen).

Aber wer bie­tet mir das? Klar könn­te es einen Anbie­ter für Lam­pen-Kalen­der-Soft­ware geben. Aber das ist nicht die Lösung. Und so geht der Trend schein­bar zu Dut­zen­den Apps, die jede ein­zeln ent­we­der Lam­pen oder Toas­ter oder Staub­sauger oder… steu­ern. Aber ver­knüp­fen kön­nen sie dies sel­ten, und wenn über­haupt, dann nur weni­ge Lam­pen­her­stel­ler mit weni­gen Toas­ter­her­stel­lern. IFTTT? Damit dürf­te Otto Nor­ma­luser über­for­dert sein, und natur­ge­mäß benö­tigt IFTTT die Zugangs­da­ten für alle betei­lig­ten Diens­te, das will man wohl eher nicht. Und natür­lich: Inter­net-Zwang, denn ohne gehts nicht.

Aber es gibt ja noch die gan­zen tol­len Pro­jek­te: Open­HAB, FHEM, Home­As­si­stant… Ja, die kön­nen wirk­lich home auto­ma­ti­on in groß­ar­ti­ger Qua­li­tät — für die Nerds. Jeden­falls Home­As­si­stant ist affen­geil (und es gibt wenig Grün­de anzu­neh­men die ande­ren sei­en weni­ger affen­geil) — wenn man sich dar­auf ein­läßt.
Aber mas­sen­taug­lich ist das nicht — und wird es nie wer­den kön­nen.
Es sei denn, die Indus­trie einig­te sich auf einen gemein­sa­men Stan­dard, und wir wis­sen alle, daß die Indus­trie Stan­dards liebt — jeder Her­stel­ler einen ande­ren.

Momen­tan scheint ja Ama­zon mit Ale­xa-Skills Köni­gin der Blin­den und Ein­äu­gi­gen zu sein — nur intel­li­gent ist das alles nicht.

Smart home wird es nicht geben, nicht für die Mas­se.


¹ ja, ich mei­de die neue Recht­schrei­bung, auch wenn Roll­lä­den in der Tat logisch ist 😉
² Daß mir Kis­hon die­se Idee geklaut hat, wer­de ich ihm nie ver­zei­hen

0

Roomba

Da steht er nun unschul­dig in der Ecke, der neue Haus­halts­hel­fer.

Mit Cloud!

Aber nicht lan­ge. Auf dem Rou­ter sieht das näm­lich momen­tan so aus:

        rule 40 {
            action reject
            description "Roomba bleibt zu Hause!"
            log disable
            source {
                mac-address d0:c5:d3:bd:c4:f1
            }
        }

Mac-Adres­se aus zwei Grün­den:

    • IPv6 mit pri­va­cy exten­si­ons (das Teil scheint aber kein v6 zu kön­nen)
    • DHCP (IP ist zwar fest­ge­tackert, aber wer weiß…)
    • IPX/SPX ja viel­leicht? 😉

Und ein tcpdump meint dazu:

18:47:16.280486 IP 192.168.1.254 > 192.168.1.93: ICMP 52.2.109.246 tcp port 8883 unreachable, length 52

Und was meint das IoT so zu 52.2.109.246:8883?
Das hier:

Ah — ja. Syman­tec.
Immer­hin hat der Staub­sauger sel­ber kei­ne Ports offen.

0

Netzwerk-Monitoring für zuhause

MariaDB [zabbix]> select count(*) from history ;
+----------+
| count(*) |
+----------+
| 10486167 |
+----------+
1 row in set (24 min 38.85 sec)

MariaDB [zabbix]> select count(*) from history_text ;
+----------+
| count(*) |
+----------+
|  2976094 |
+----------+
1 row in set (5 min 20.50 sec)

MariaDB [zabbix]> select count(*) from history_uint ;
+----------+
| count(*) |
+----------+
| 17956517 |
+----------+
1 row in set (54 min 55.19 sec)

MariaDB [zabbix]>

Über 30 Mil­lio­nen Daten­sät­ze!!!
An den Ant­wort­zei­ten kann man schon erken­nen, daß der Datenbank-“Server” nicht unbe­dingt geeig­net für die­se Grö­ßen­ord­nun­gen ist — es ist ein Odro­id C2 mit einer USB-2-Plat­te als Sto­rage 🙂
Wer­te wer­den 90 Tage gespei­chert, Trends 365 Tage.

0