Gefrierer Management mit Home Assistant

Kennt Ihr das? Man hat viele Sachen in Plastikdosen im Gefrierschrank, hat aber trotz Beschriftung keinen überblick, was alles und vor allem seit wann im Gefrierer ist.

Da bietet sich Home Assistant zusammen mit einem Etikettendrucker an um zum einen die Etiketten zu drucken und zum Anderen eine Liste mit dem Inhalt des Gefrierers zu verwalten.

Zum Eingeben nutze ich eine solche Dashboard-Card:

Home Assistant Card: Produkteingabe

Hier gebe ich Produkt, Menge und Daten zum verwendeten Beh?lter ein. Dann kann ich ein Etikett drucken. Dazu nutze ich einen Brother QL 810W Etikettendrucker. Dieser verfügt über die Funktion, eine Vorlage im Drucker zu speichern und das Etikett über einen einfachen Befehl zu drucken. Mit dem Befehl, werden die Inhalte gesendet, die dann in die Vorlage übernommen werden. Das Etikett sieht dann so aus:

Etikett

Gleichzeitig mit dem Druck, wird das Produkt zur der Inhaltsliste des Gefrierschrankes hinzugefügt. Dabei handelt es sich um eine ToDo-Liste, diese kann man in einer weiteren Card im Dashboard von Home Assistant anzeigen und sich so die Produkte anzeigen lassen und beim Entnehmen abhaken.

Liste mit Gefrierer-Inhalt

Vorteil ist auch, dass man einen überblick darüber hat, wie lange die unterschiedlichen Dinge schon im Eis sind.

Eine detaillierte Anleitung dazu habe ich in einem GitHub Repository erstellt, Ihr k?nnt es Euch hier anschauen: https://github.com/dcbo/homeassistant-frosterlabels

OpenWB Bridge zu Home Assistant

Was und Wozu

Ich bin stolzer Besitzer einer OpenWB und habe diese bislang immer über NodeRed gesteuert. Neulich bin ich jedoch auf Home Assistant umgestiegen und da ist es nicht m?glich sich mit zwei unterschiedlichen MQTT-Brockern zu verbinden.

„Warum zwei MQTT-Brocker?“ wird sich der Leser jetzt fragen. Ganz einfach: Die OpenWB bringt intern ihren eigenen MQTT-Brocker mit und ich selber betreibe seit über 10 Jahren meinen eigenen MQTT-Brocker auf der Basis von Mosquitto (Damals noch in der Version 0.9.3). Zudem kommunizieren fast alle meine Devices hier im Hause über MQTT und deren Nachrichten m?chte ich nicht drau?en vor der Tür in der Wallbox haben.

Funktionsweise

Von daher beschreibe ich hier die L?sung, wie man alle Topics der OpenWB auf einen anderen mosquitto MQTT-Broker weiterleiten kann.

Dazu muss die mosquitto.conf des eigenen (Ziel-)Brokers wie folgt erweitert werden:

# =================================================================
# Bridge to OpenWB
# =================================================================
# see:
# https://mosquitto.org/man/mosquitto-conf-5.html -
# Chapter: Configuring Bridges
# =================================================================

connection OpenWB

# IP-Address/DNS ans Port of OpenWB
# Example:
# address openwb.example.com:1883
# address 203.0.113.80:1883
address 203.0.113.80:1883

# Configure Topics
# - Local-Prefix: openWB
# - Remote-Prefix: #
# - Direction: share messages in both directions
# - QoS-Level: 2
topic openWB/# both 2

start_type automatic
local_clientid openwb.mosquitto
try_private false
cleansession true

Danach nur noch den Broker neu starten und man wird alle Nachrichten der OpenWB auch auf dem Ziel-Broker sehen.

Selbstverst?ndlich kann man von einem Client nun auch Nachrichten an ein Topic OpenWB/$WB_TOPIC senden, diese wird dann über die Bridge als $WB_TOPIC an die OpenWB weitergeleitet.

Einbindung in Home Assistant

Die Integration OpenWB over MQTT in Home Assistant muss man jetzt nur noch so Konfigurieren, dass sie das Topic auch nutzt:

Fertig

Davis Vantage Vue – final Chapter

Years ago i discovered the RF-protocol of the Davis Vantage Vue ISS Weather station (see Davis Vue Hacking – Part 1 and Davis Vue Hacking – Part 2)

I used an Moteino to receive and decode the data. But the moteino lacks of IP-Support and i used a Gateway to bridge the serial output from the Moteino to MQTT.

Now i wanted to get rid of this setup and have an All-In-One sollution. Therfore i used a RFM69 Board and an ESP32 and wired both together with seven wires, added some programming and now ist is up and running since some weeks.

You’ll find the source-code and some documentation on in the github repository. https://github.com/dcbo/ISS-MQTT-Gateway

You’ll need only an ESP32 and an RFM69 Board. The Wiring is documented in the Repository. It all fits in small Box.

The Data which is received will be decoded and publishe to the MQTT Server as a JSON Message. In the following picture you’ll see an example Message:

One of the main goals was to test my skeleton https://github.com/dcbo/HelloESP32 for ESP32 projects with VS-Code and PlattformIO which provides the user with the most basic functionalities, needed for nearly all projects this:

  • WiFi-Connection with Monitoring and Re-Connection if necessary.
  • User-Configuration and Credentials are provided in platformio.ini, so it is detached from the code.
  • Different compile Targets which can use different Configuration Parameters. So it is possible to have a Test-System and a Productive-System with the same Code but when compiled it uses different WiFi, MQTT-Broker, passwords and so on according to the chosen Target.
  • MQTT connection with Monitoring and Re-Connection if necessary.
  • MQTT-Publication of Status in configurable Intervals: Network-State, Firmware-Version, System-State
  • MQTT-Command parser, which can be easily extended to additional Commands.
  • OTA-Update, with different Settings for the Compile Targets. The OTA-Update is Password-protected and only the Hash of the Password is stored on the ESP32. So reading out the Flash an adversary will not get knowledge of the Password.
  • Automatic Versioning. Version will be updated also in Sourcecode, so that it can be accessed by the Program e.g.: to publish its own Version and Compile-Time. The Version will be only incremented after the OTA Update of the main target, so testing will not increment Version Numbers.

Bluetooth-LE-Scanner

A.K.A. Corona-Warn-App Token-Scanner

Ende 2020 habe ich dieses kleine Projekt umgesetzt um mit einem ESP32 die Bluetooth-Tokens zu empfangen. Damit lassen sich auch die Tokens der Corona-Warn-App empfangen.

Funktion

Der ESP32 führt regelm??ig BTLE-Scans durch und erzeugt aus den Scanergebnissen ein JSON-Sting mit allen, innerhalb des letzten Intervalls empfangenen Token. Dieser JSON-String wird über die serielle Schnittstelle ausgegeben. Zus?tzlich kann ein WIFI-Netzwerk und ein MQTT-Broker konfiguriert werden, dann wird das Scan-Ergebnis zus?tzlich als MQTT-Nachricht gesendet.

Hardware

Ausser einem ESP32 wird nichts ben?tigt.

Sourcecode

Der Code steht unter GPL v3 und ist in meinem Github Repository zu finden

Scanergebnis

Hier ein Beispielhaftes Scan-Ergebnis:

{
    "Results":{
       "01:1d:1a:3b:2c:60":{
          "serviceuuid":"0000fd6f-0000-1000-8000-00805f9b34fb",
          "rssi":"-58"
       },
       "2b:92:20:e5:3f:d7":{
          "serviceuuid":"0000fd6f-0000-1000-8000-00805f9b34fb",
          "rssi":"-69"
       },
       "a4:c1:38:91:31:25":{
          "name":"ATC_######",
          "rssi":"-68"
       }
    }
 }

Hier sieht man zwei Corona-Warn-App Token (0000fd6f) und ein SumUp-Kartenleseger?t.

Reverse-Proxy Traefik mit Wildcard Zertifikaten

Einleitung

Betreibt man einen Server mit mehreren Diensten, bietet es sich an einen Reverse-Proxy davor zuschalten. So kann man mit einer IP-Adresse viele Dienste auf dem selben Port laufen lassen. Die Unterscheidung erfolgt dann durch den FQDN. Zum Beispiel:

  • www.example.com
  • dokuwiki.example.com
  • nextcloud.example.com
  • ichhabsmirausgedacht.example.com

Der Reverse-Proxy kümmert sich dann bestenfalls auch um die TLS-Zertifikate, sodass man bei der Konfiguration der Dienste sich darum nicht mehr kümmern muss.

Die folgende Anleitung nutzt Traefik als reverse-Proxy und Let’s-Encrypt Wildcard-Zertifikate. So kann man schnell neue Services aufsetzen, ohne ein neues Zertifikat beantragen zu müssen. Zusammen mit einem Catchall-DNS Eintrag für die Domain kann man alle Einstellungen für einen neuen Service in dessen docker-compose.yml vornehmen.

Um Wildcard-Zertifikate über LetsEncrypt zu beantragen muss man das DNS-01 Protokoll zu Verifikation nutzen. Dieses verlangt zwingend eine DNS-API mit derer man per automatisiert die DNS-Eintr?ge verwalten kann. Bietet der DNS-Server der Domain, für die das Wildcard-Zertifikat beantragt werden soll keine solche API kann mit Hilfe der CNAME-Validation auf einen zweiten DNS-Server mit DNS-API verwiesen werden.
Genau dieses Vorgehen beschreibe ich hier.

Voraussetzung

  • Domain netcuphosted.com die auf Netcup (bietet DNS-API an) gehostet wird
    • API-Zugangsdaten aus dem Customer-Controlpanel über?Stammdaten /?_Api abzurufen bzw zu erzeugen:
      • API-Passwort
      • API-Key
      • Netcup-Kundennummer
    • Praktisch w?re die TTL für die Zone netcuphosted.com im Customer-Controlpanel zumindest w?hrend der ersten Versuche deutlich herunterzusetzen (z.B: 120)
  • DNS-Eintr?ge für?nodnsapi.com – Domain ohne?DNS-API
    • traefik.nodnsapi.com 
      • Entwerer als FQDN oder (besser) als Wildcard (*.nodnsapi.com),
      • Kann ein A-Record oder CNAME sein (zB: ein CNAME auf den DynDNS)
    • _acme-challenge.nodnsapi.com CNAME acme.validation.netcuphosted.com
      • Dieser CNAME Eintrag wird ben?tigt um die DNS-01 Validation auf den Netcup-DNS umzuleiten

Docker-Installation

Wenn Docker noch nicht installiert wurde hier eine Schnellanleitung

### Docker installieren ###
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
sudo apt update
apt-cache policy docker-ce
#  > [es sollte auf das Docker-Repository zeigen]
#  > ... https://download.docker.com/linux/ubuntu ... 
sudo apt install docker-ce
 
# add user to Docker Group
sudo usermod -aG docker [myusername]
 
# install docker-compose 
sudo apt install docker-compose

Traefik-Installation

Nun geht es an die eigentliche Installation von Traefik.

htpasswd

Zuerst braucht man htpasswd um den den PasswortHash zu erzeugen, den man sp?ter zur HTTP-AUTH-Anmeldung an dem Traefik-Dashboard ben?tigt:

# install htpasswd
sudo apt-get update
sudo apt-get install apache2-utils
# generate password
echo $(htpasswd -nb USER PASSWORD) | sed -e s/\\$/\\$\\$/g
# USER:$$apr1$$cC4LUELx$$6M4T7Y803yVXPM7lJo0Pp1

Die Ausgabe des letzten Befehls, wird sp?ter ben?tigt.

Verzeichnisse anlegen

Im Beispiel wird ein Ordner docker im Home-Dir des Benutzers angelegt und darunter ein Order für jeden Service, den wir bereitstellen wollen. Traefik ist der erste Service:

cd ~
mkdir -p ~/docker/traefik
mkdir -p ~/docker/traefik/data
touch ~/docker/traefik/data/traefik.yml
touch ~/docker/traefik/data/dynamic_conf.yml
touch ~/docker/traefik/data/acme.json
chmod 600 ~/docker/traefik/data/acme.json
cd ~/docker/traefik

Jetzt die einzelnen Dateien editieren:

data/dynamic_conf.yml
tls:
  options:
    default:
      minVersion: VersionTLS12
      cipherSuites:
        - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
        - TLS_AES_256_GCM_SHA384
        - TLS_CHACHA20_POLY1305_SHA256
      curvePreferences:
        - CurveP521
        - CurveP384
      sniStrict: true

http:
  middlewares:    
    # secHeaders@file
    # - Set Sameorigin
    # - Set HSTS
    # - enforce HTTPS
    secHeaders:
      headers:
        browserXssFilter: true
        contentTypeNosniff: true
        customFrameOptionsValue: "SAMEORIGIN"
        sslRedirect: true
        #HSTS Configuration
        #stsIncludeSubdomains: true
        #stsPreload: true
        #stsSeconds: 15552000
            
    # redirect@file: Redirect HTTP -> HTTPS
    redirect:
      redirectScheme:
        scheme: "https"

Folgendes sollte angepasst werden:

  • Sie HSTS Konfiguration sollte erst ganz zum Schluss, wenn alles l?uft aktiviert werden

data/traefik.yml

log:
  # DEBUG, PANIC, FATAL, ERROR, WARN, and INFO.
  level: DEBUG

api:
  dashboard: true

entryPoints:
  http:
    address: ":80"
  https:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
  file:
    filename: "/dynamic_conf.yml"

certificatesResolvers:
  dns:
    acme:
      email: ############@############.##
      storage: acme.json
      keyType: RSA4096
      # Production 
      # caServer: https://acme-v02.api.letsencrypt.org/directory
      # Staging
      caServer: https://acme-staging-v02.api.letsencrypt.org/directory
      dnschallenge: 
        provider: netcup
        delaybeforecheck: 300
        resolvers: 
        - root-dns.netcup.net:53
        - second-dns.netcup.net:53
        - 8.8.8.8:53
        - 1.1.1.1:53

Folgendes muss angepasst werden:

  • E-Mail Adresse für die Let’s-Encrypt Beantragung
  • Solange man noch experimentiert sollte der Staging-Server genutzt werden,
    erst wenn alles funktioniert sollte man auf Production umstellen.

docker-compose.yml

version: '3'
services:
  traefik:
    image: traefik:latest
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
    ports:
      - 80:80
      - 443:443
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/traefik.yml:/traefik.yml:ro
      - ./data/acme.json:/acme.json
      - ./data/dynamic_conf.yml:/dynamic_conf.yml
    environment:
      # Wildcard-Cert for Domain without DNS-API
      # - nodnsapi.com      - DNS hosted by Server without DNS-API
      # - netcuphosted.com  - DNS hosted by Netcup-Nameserver with DNS-API
      # Manual set the folowing DNS-CNAME Entry
      # _acme-challenge.nodnsapi.com CNAME acme.validation.netcuphosted.com
      - NETCUP_CUSTOMER_NUMBER=######
      - NETCUP_API_KEY=##################################################
      - NETCUP_API_PASSWORD=##################################################
      - LEGO_EXPERIMENTAL_CNAME_SUPPORT=true
    labels:
      - "traefik.enable=true"
      # --------------------------------------------------------
      # INCLUDE: dynamic_conf.yml
      # - redirect@file
      # - secHeaders@file
      - "providers.file.filename=/dynamic_conf.yml"
      # --------------------------------------------------------
      # Middleware: traefik-auth
      # - generate Hash with: echo $(htpasswd -nb USER PASSWORD) | sed -e s/\\$/\\$\\$/g
      - "traefik.http.middlewares.traefik-auth.basicauth.users=##########:$$apr1$$########$$######################"
      # --------------------------------------------------------
      #?Router?"traefik":?http://traefik.nodnsapi.com?->?Redirect?????
      - "traefik.http.routers.traefik.entrypoints=http"
      - "traefik.http.routers.traefik.rule=Host(`traefik.nodnsapi.com`)"      
      - "traefik.http.routers.traefik.middlewares=redirect@file"
      # --------------------------------------------------------      
      #?Router?"traefik-secure":?https://traefik.nodnsapi.com?->?Traefik Dashboard
      - "traefik.http.routers.traefik-secure.entrypoints=https"
      - "traefik.http.routers.traefik-secure.rule=Host(`traefik.nodnsapi.com`)"
      - "traefik.http.routers.traefik-secure.middlewares=traefik-auth,secHeaders@file"
      - "traefik.http.routers.traefik-secure.tls=true"      
      - "traefik.http.routers.traefik-secure.service=api@internal"
      # --------------------------------------------------------
      #?Router?"whoami-secure":?To?get?Wildcard-Certs,?no?Service
      -?"traefik.http.routers.whoami-secure.service=noop@internal"
      - "traefik.http.routers.whoami-secure.tls.certResolver=dns"
      - "traefik.http.routers.whoami-secure.tls.domains[0].main=*.${DOMAIN}"
      # Activate this, if you also need a certificate for root Domain
      # - "traefik.http.routers.whoami-secure.tls.domains[0].sans=${DOMAIN}"
      # --------------------------------------------------------
networks:
  proxy:
    external: true

Folgendes muss angepasst werden:

  • NETCUP_CUSTOMER_NUMBER
  • NETCUP_API_KEY
  • NETCUP_API_PASSWORD
  • Die Ausgabe von echo $(htpasswd -nb USER PASSWORD) | sed -e s/\\$/\\$\\$/g
    in traefik.http.middlewares.traefik-auth.basicauth.users
  • Die Domain für den Server in
    • traefik.http.routers.traefik.rule=Host(`traefik.nodnsapi.com`)
    • traefik.http.routers.traefik-secure.rule=Host(`traefik.nodnsapi.com`)
    • traefik.http.routers.whoami-secure.tls.domains[0].main=*.nodnsapi.com"
    • Sofern man auch die Domain nodnsapi.com nutzen m?chte die Zeile
      traefik.http.routers.whoami-secure.tls.domains[0].sans=nodnsapi.com"

Docker Netzwerk anlegen

Jetzt noch das Proxy-Netzwerk anlegen

docker network create proxy

Traefik starten

Wir starten das Traefik zum ersten Mal ohne -d, dann k?nnen wir das Log durchlaufen lassen und mit CTRL-C beenden.

docker-compose up -d

Hinweise:

  • Das Erstellung des Wildcard-Zertifikats dauert immer eine Zeit, da zuerst der DNS-Eintrag angelegt wird und dann delaybeforecheck Sekunden gewartet wird, dass dieser durchs Netz propagiert wurde. 5 Minuten funktionieren hier wohl sehr gut. Wenn man die TTL ge?ndert hat, geht es eventuell auch schneller.
  • Beim Experimentieren sollte der Container immer mal wieder gel?scht werden
    (docker-compose rm)
  • Die Zertifikate kann man sich in der Datei data/adme.json ansehen und ggf l?schen, falls man eine Neuerstellung antriggern will.

Test

Um zu Testen, ob alles geklappt hat, dann man sich nun mit dem Traefik-Dashboard verbinden, welches unter
https://traefik.nodnsapi.com
erreichbar sein sollte. (Username und Passwort wurden oben erzeugt)
Jetzt wird man eine Zertifikats-Fehlermeldung bekommen, da das Root-Zertifikat der Staging-CA nicht im Browser hinterlegt ist. Ich habe die CA als vertrauenswürdiges Root-Zertifikat in meinem Chrome hinterlegt. Wer das nachmacht, sollte hinterher nicht vergessen, dieses nach den Tests wieder zu entfernen.

Wechsel auf Production-CA

Sofern die Tests erfolgreich verlaufen sind, kann man das System auf die Produktive CA umstellen. Dazu:

  • Container anhalten docker-compose down
  • Container l?schen docker-compose rm
  • Inhalt von data/adme.json l?schen
    • rm ~/docker/traefik/data/acme.json
    • touch ~/docker/traefik/data/acme.json
    • chmod 600 ~/docker/traefik/data/acme.json
  • HSTS aktivieren (in dynamic_conf.yml)
  • Logging auf ERROR stellen (in data/traefik.yml)
  • Auf die Produktive CA umstellen (in data/traefik.yml)
    • caServer: https://acme-02.api.letsencrypt.org/directory      
    • #caServer: https://acme-staging-v02.api.letsencrypt.org/directory
  • Container neu bauen und starten docker-compose up -d
  • Zertifikat der Staging-CA aus vertrauenswürdige Root-Zertifikate des Browsers entfernen.

MQTT Befehle für Valetudo

Nachdem ich den Roborock S50 von der China-Cloud getrennt habe, geht es nun daran diesen in die vorhandene Hausautomatisierung mit NodeRed einzubinden. Da die MQTT Befehle nicht wirklich dokumentiert sind, hier eine übersicht der Befehle

Statusnachrichten

Diese MQTT-Nachrichten sendet der Roboter jede Minute:

valetudo/robot/state

Als JSON Sting werden drei Parameter übergeben:

  • state
    "docked", "cleaning", "returning"
  • battery_level
    0-100%
  • fan_speed
    "low", "medium", "high", "max", "off"
valetudo/robot/state "state":"docked","battery_level":100,"fan_speed":"medium"}

valetudo/robot/ConsumableStateAttribute_…

Mit diesen Topics werden die Restlaufzeiten von Bürsten, Filtern und Sensoren in Minuten gemeldet:

valetudo/robot/ConsumableStateAttribute_brush_main/state 17616                      
valetudo/robot/ConsumableStateAttribute_brush_side_right/state 9377                 
valetudo/robot/ConsumableStateAttribute_filter_main/state 8219                      
valetudo/robot/ConsumableStateAttribute_sensor_all/state 1418                       

valetudo/robot/ZoneCleaningCapability/presets

Hier wird ein JSON formatiertes Objekt mit allen im Roborock konfigurierten Zonen ausgeben. Damit kann man die Zuordnung der Zonen-IDs zu deren Namen ermitteln:

valetudo/robot/ZoneCleaningCapability/presets {JSON formatted Zone-List}

valetudo/robot/GoToLocationCapability/presets

Hier werden die GoTo Locations als JSON formatiertes Objekt ausgeben.

valetudo/robot/ZoneCleaningCapability/presets {JSON formatted Zone-List}

valetudo/robot/WifiConfigurationCapability/state

Die WiFi Verbindungsdaten werden hier JSON formatiert ausgegeben

valetudo/robot/WifiConfigurationCapability/state {"state":-48,"attributes":{"ssid":"[SSID]","upspeed":150,"ips":["[IP Address]","[IPv6 Address]"],"frequency":"2.4ghz"}}

Commands

Einfache Kommandos werden mit dem Topic valetudo/robot/command versendet

Locate Robot

mosquitto_pub -t valetudo/robot/command -m locate

Der Roboter sagt dann: ?Hello I’m over here“

Start Cleaning

mosquitto_pub -t valetudo/robot/command -m start

Stop Cleaning

mosquitto_pub -t valetudo/robot/command -m stop

Goto Docking Station

mosquitto_pub -t valetudo/robot/command -m return_to_base

Pause

mosquitto_pub -t valetudo/robot/command -m pause

Custom Commands

Für erweiterte Befehle, zum Beispiel um eine oder mehrere Zonen saugen zu lassen, muss man das Topic valetudo/robot/custom_command nutzen. Hier müssen Befehl und Parameter als JSON kodierte Nachricht übergeben werden.

Zone Cleaning

Zuerst werden die ZoneIDs ben?tigt, diese findet man am einfachten im Web-Frontend, wenn man die Zonen editiert. Dort unten Links auf (i) drücken und die Zone ID wird angezeigt (z.B: 92559d71-e971-4101-984b-d0aa85c63911)

Um eine Zone zu reinigen:

mosquitto_pub -t valetudo/robot/custom_command -m {"command": "zoned_cleanup", "zone_ids": ["92559d71-e971-4101-984b-d0aa85c63911"]}

Mehrere Zonen k?nnen als Liste übergeben werden:

mosquitto_pub -t valetudo/robot/custom_command -m {"command": "zoned_cleanup", "zone_ids": ["92559d71-e971-4101-984b-d0aa85c63911", "071bfbf5-1fca-47f3-86b6-c11c33c96cbd", "5fd5859d-628a-4194-ab27-a82151ca7534"]}

Valetudo auf Roborock S50

Herr M machte mich darauf Aufmerksam, dass man mit der alternativen Firmware Valetudo seinen Roborock von der China-Cloud befreien kann. Also habe ich mich dieser Angelegenheit einmal gewidmet. Hier nun die einzelnen Schritte:

  1. Firmware Reset
  2. Token ermitteln
  3. Valetudo flashen
  4. Valetudo mit WiFi verbinden

Da ich keinen Linux-Rechner mit WIFI und Bildschirm habe, sondern nur einen Raspberry PI 3B+ ohne Monitor und Tastatur, musste ich etwas unorthodox vorgehen. Mit einem entsprechend ausgestatteten Linux-Notebook ist es eventuell einfacher. Im Einzelnen ben?tigt man, wenn man dieser Anleitung folgt:

  1. Roborock S50
  2. Raspberry Pi 3B+ mit Raspbian GNU/Linux 10 (buster)
  3. Windows PC mit Wifi Packetsender und SSH-Client
  4. Die Firmware, die man flashen will, die man sich hier erzeugen lassen kann.

Factory Reset

Beim Factory-Rest werden alle Updates gel?scht und die Auslieferungs-Firmware wiederhergestellt. Dazu geht man wie folgt vor:

  1. Roborock vollst?ndig laden
  2. Aus dem Dock nehmen und die Klappe ?ffnen
  3. Den Docking-Knopf (der mit der Steckdose) drücken und halten
  4. Den Reset-Knopf (unter der Klappe, neben der WiFi LED) mit einem Spitzen Gegenstand kurz drücken
    → die Lichter unter den drei Kn?pfen gehen in dem Moment aus
  5. Den Docking-Knopf immer noch gedrückt halten bis
    → Der Power-Button wieder leuchtet und aus dem Lautsprecher ?Restoring initial Version“ ert?nt.
  6. Den Docking-Knopf loslassen
  7. ca. 5 Minuten warten (bei mir kommt keine Meldung, wenn er fertig ist)

Token ermitteln

Das Token ben?tigt man für den OTA (Over-The-Air) Update. Um dieses Auszulesen gibt es mehrere M?glichkeiten, ich zeige hier die, die für mich am einfachsten funktioniert hat.

Man ben?tigt dazu einen Windows Rechner und das Program Packet Sender.

Als erstes stellt man eine Wifi-Verbindung mit dem Access-Point des Roborock her. Dessen SSID f?nt nach dem Firmware Reset mit roborock-vacuum-s5_ an, ein Passwort wird nicht ben?tigt und die IP des Roboters sollte 192.168.8.1 sein.

Nach der Installation startet man Packet Sender und konfiguriert diesen so, dass es eine UDP Verbindung aufbaut, ein Paket an den Roboter sendet und die Antwort ausgibt.

HEX: 21310020ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
IP: 192.168.8.1
Port: 54321
Protocol dropdown: UDP

Jetzt auf send klicken und sofern alles richtig l?uft, sollte der Roboter mit einem Paket geantwortet haben. Die letzten 16 Byte der Antwort sind das Token, was wir ben?tigen

Answer: 2131002000000000070BE20A000002B668397A4A6873394139414F4F335A7461
                                       |              Token             |
Token:                                  68397A4A6873394139414F4F335A7461 

Valetudo flashen

Ab jetzt arbeiten wir mit dem Raspberry Pi, diesen bediene ich mangels Mnitor und Tastatur über SSH, was etwas kniffelig wird, weil der Flash-Prozess nur funktioniert, wenn die WiFi-Verbindung die einzige aktive Netzwerkverbindung ist. Man muss alsi den SSH-Client (Windows PC) und den Raspoberry Pi mit dem Access-Point des Roborock verbinden.

Laut diverser Anleitung im Internet, sollte das auch gehen, wenn man den Roborock nach dem Factory-Reset wieder mit der MiHome-App verbunden hart und dann ins heimische Netzwerk geh?ngt hat. Bei mir war das nicht der Fall: Sobald ich den Roborock mit der MiHome-App verbunden habe, wird das Token nicht mehr akzeptiert. Daher der etwas abenteuerliche Aufbau.

Software installieren

Das geht noch alles per SSH über Ethernet. Dabei kann man auch gleich Firmware-Image in das Homeverzeichnis kopieren. Hat man sich diese über https://builder.dontvacuum.me/_s5.html erzeugen kassen, bekommt man eine E-Mail mit einem Link zur Firmware. Den jetzt einfach per wget herunterladen

# Update
sudo apt-get update
sudo apt-get upgrade
# Install Tools
sudo apt-get install python3
sudo apt-get install python3-pip
sudo apt-get install python3-venv
# Get Firmware
cd ~
wget https://builder.dontvacuum.me/jobs/j.../v11_002034.pkg 

Raspberry Pi mit Roborock-AccessPoint verbinden

Dazu /etc/wpa_supplicant/wpa_supplicant.conf editieren:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=DE
network={
        ssid="roborock-vacuum-s5_miap8A8F"
        key_mgmt=NONE
}

Nun sollte sich (sp?testens nach einem Reboot) der RasPi mit dem Roborock-AP verbunden haben. Mit ip link kann man das überprüfen und gleich die IP-Adresse notieren.

Setup virtual env

Jetzt noch Python konfigurieren

# Setup virtual env
cd ~
mkdir flasher
cd flasher
python3 -m venv venv
# activate virtual envand install miio
source venv/bin/activate
pip3 install wheel
pip3 install python-miio
cd ..

Ethernet Verbindung zum Raspberry Pi trennen

Jetzt muss die Ethernet Verbindung zum Raspi getrennt werden und die SSH Verbindung über den WiFi AP des Roborock neu hergestellt werden.

Token testen

Um den Token zu testen k?nnen wir nun

cd ~
mirobo --ip 192.168.8.1 --token 68397A4A6873394139414F4F335A7461 status

Flash Firmware

Wenn das alle geklappt hat k?nnen wir endlich den Staubsauger flashen

mirobo --ip 192.168.8.1 --token 52637863696D4263715A67654C706645 update-firmware ~/v11_002034.pkg

(alles in eine Zeile)

Valetudo mit WiFi verbinden

Jetzt kann man sich wieder mit dem AP des Roborock verbinden und dessen Webseite unter http://192.168.8.1 abrufen. In dem Interface kann man nun den eigenen Accesspoint konfigurieren.

Socks Proxy mit Putty unter Windows 10 einrichten

Will man die IP eines Servers, auf dem man einen SSH-Zugang hat, als Absende-IP beim Browsen verwenden, so geht das mittels SOCKS,

Die Einrichtung ist denkbar einfach:

Putty-Einstellung

Connection / SSH / Tunnels:
Source Port: 8080
Dynamic
Auto
ADD

Windows Proxy-Einstellung

Netzwerk und Internet / Proxy:
Proxyserver verwenden: Ein
Adresse: socks=localhost
Port: 8080
Speichern

Fertig

Umw?lzpumpe Grundfos UPE 25-60 130

Umw?lzpumpe Grundfos UPE 25-60 130

Umw?lzpumpe Grundfos UPE 25-60 130

 

Nach knapp neun Jahren versagte?unsere Umw?lzpumpe Grundfos UPE 25-60 130.

Fehlerbild: Rote und Grüne LED flackern leicht.

L?sung: Anlaufkondensator defekt.

Ersatzteil: Conrad Kondensator?Bestell-Nr.: 441475 (EAN: 4016138426434).

Reparatur:

  • Pumpe stromlos schalten.
  • Geh?use der Elektronik ?ffnen.
  • Alten Kondensator entfernen (ist nur eingeklipst und gesteckt).
  • Das Geh?use des Kondensators mit einem Messer?oben um 2-3mm kürzen.
  • Die Ummantelung der Kabel?bis zum Geh?use entfernen und kürzen.
  • Zwei starre Dr?hte an die Kabelenden anl?ten (hier bieten sich die Anschlu?beine des defekten Kondensators an).
  • Kondensator einsetzen und Kabelenden in die L?cher der Elektronik stecken,
  • Pumpe wieder einschalten.
  • Fertig.

 

The Poor Man’s Solution

I use Truecrypt Full-Disk-Encryption on nearly all my hard-drives.

About seven years ago Joanna Rutkowska and Alex Tereshkin released an USB-Image which can be used to attack this Full-Disk-Encryption by manipulating the (unencrypted) MBR.

I decided to protect my systems against THIS attack.

How does it work?
My Poor Man’s Solution works like this:

  • Inital step: Store a copy of the original MBR on the encrypted part of the disk.
  • During each Boot: Verify that current MBR and previously stored MBR from the inital step are identical.

What does it protect against:

  • It does protect against the above mentioned Evil-Mail Attack, which manipulates the MBR.
  • It does not protect against so called stealth attacks, where the attacker changes the MBR to boot the original system as a virtual machine (which contains a copy of the original mbr).
  • Either it does not protect against keyloggers, CCTV and many more attacks.

Details:
This is tested for Windows 64Bit (Win7)
You need a copy of MBRWizard Command Line, which you can find here.
Save a copy of the MBR to the encrypted part of the harddisk when the system is running:

MBRWiz64.exe /disk=0 /save=range /range=0-64 /filename=mbr.sav /NoHdr

Save the following File as mbrtest.bat to the encrypted part of the harddisk:

MBRWiz64.exe /disk=0 /save=range /range=0-64 /filename=mbr.akt /NoHdr
fc /b mbr.sav mbr.akt
if errorlevel 1 (
    msg * "Bootloader HACKED !!" 
) else (
    msg * "Bootloader OK !!" 
)
del mbr.akt

Put all Files (mbrtest.bat, mbr.sav, MBRWiz64.exe) in the same folder.
Configure the system, that the Batch-File will be started during each boot.