Einbindung des Xiomi Stubsaugerroboters in OpenHAB und Alexa

Nachdem der kleine Saugroboter von Xiaomi nun eingetroffen ist und ich etwas länger brauchte ihn mit der App unter IOS bekannt zu machen, soll er nun natürlich auch in Openhab eingebunden werden.

Ich habe hierfür eine vielversprechende Anleitung gefunden.

Schritt 1: Mit der Mi-App koppeln (erledigt)

Schritt 2: Token für die Kommunikation auslesen

Hiefür erstellen wir zuerst mit ITunes ein ungesichertes lokales Backup des IPhone, aus dem wir das Token auslesen können.

Anschliessend greifen wir hierauf mittels der Software IPhoneBackupViewer(kostenlose Version reicht) zu und extrahieren die Datei XXXXXX_mihome.sqlite 

IPhoneBackupViewer 1

IPhoneBackupViewer 2

Um an den Token in dieser SQL Lite Datei zu kommen nutzen wir eine Zweite Software (SQLite Browser).

In dem SQL Browser öffnen wir die gerade extrahierte SQLite-Datei und wählen die Tabelle ZDEVICE

SQLiteBrowser 1

In der Spalte ganz rechts (ZTOKEN) ist das entsprechende Token, also kopieren wir uns das einmal.

SQLiteBrowser 2

Dieser Token hat noch nicht das richtige Format, also entspechend kodieren. Dies geht unter Online-domain-tools.com am einfachsten. Hier das Token unter Input einfügen, bei Funktion AES und Modus ECB wählen und als Key 32 0en nutzen( 00000000000000000000000000000000 ). Der zu verwendende Token ist nun unten rechts im Hex-Format ersichtlich.

aes online

Schritt 3: Binding installieren und Konfigurieren

Unter unserem Openhabianpi(HABmin) Aktivieren wir nun zuerst unter Konfiguration->Erweiterungen->Misc die Option für den Eclipse IoT Market. Also: Installieren anklicken.

Nun sollte auch unter der Option Bindings die Erweiterung "Xiaomi Mi IO Binding" verfügbar sein. Also aktivieren.

Es sollte nun direkt auch ein "Thing(Discovered Xiaomi Mi IO Device)" in der Inbox erscheinen und aktiviert werden.

Also noch konfigurieren. Dementsprechend im Menueintrag Konfiguration -> Things den Eintrag auswählen und mit Konfiguration definieren.

HABMIN Xiaomi konf

 Hier tragen wir seine IP Adresse und den kodierten HEX-Token ein.

Damit sollte der kleine Kollege sich schon ansprechen lassen.

Für die Darstellung/Sitemap bediene ich mich vorerst bei der wunderbaren Vorlage von marcel_verpaalen der mich durch diesen Thread auch hierzu inspirierte (Vielen Dank an dieser Stelle).

Hinzugefügte Items in xiaomi.items:


Group  gVac     "Xiaomi Robot Vacuum"      
Group  gVacStat "Status Details"            (gVac)
Group  gVacCons "Consumables Usage"         (gVac)
Group  gVacDND  "Do Not Disturb Settings"   (gVac)
Group  gVacHist "Cleaning History"          (gVac)
Group  gVacNetwork "Network Details"        (gVac)

String actionControl  "Vacuum Control"     (gVac)     {channel="miio:generic:034F0E45:actions#control" }
Number actionFan      "Vacuum Fan"         (gVac)   {channel="miio:generic:034F0E45:actions#fan" }
String actionCommand  "Vacuum Command"          {channel="miio:generic:034F0E45:actions#commands" }

Number statusBat    "Battery Level [%1.0f%%]"    (gVac,gVacStat) {channel="miio:generic:034F0E45:status#battery" }
Number statusArea    "Cleaned Area [%1.0fm²]"    (gVac,gVacStat) {channel="miio:generic:034F0E45:status#clean_area" }
Number statusTime    "Cleaning Time [%1.0f']"    (gVac,gVacStat) {channel="miio:generic:034F0E45:status#clean_time" }
String  statusError    "Error [%s]"    (gVac,gVacStat) {channel="miio:generic:034F0E45:status#error_code" }
Number statusFanPow    "Fan Power [%1.0f %%]"     (gVacStat) {channel="miio:generic:034F0E45:status#fan_power" } 
Number statusClean    "In Cleaning Status [%1.0f]"     (gVacStat) {channel="miio:generic:034F0E45:status#in_cleaning" }
Switch statusDND    "DND Activated"    (gVacStat) {channel="miio:generic:034F0E45:status#dnd_enabled" }
String statusStatus    "Status [%s]"    (gVacStat) {channel="miio:generic:034F0E45:status#state"} 

Number consumableMainT    "Main Brush [%1.0f]"    (gVacCons) {channel="miio:generic:034F0E45:consumables#main_brush_time"}
Number consumableMainP    "Main Brush [%1.0f%%]"    (gVacCons) {channel="miio:generic:034F0E45:consumables#main_brush_percent"}
Number consumableSideT    "Side Brush [%1.0f]"    (gVacCons) {channel="miio:generic:034F0E45:consumables#side_brush_time"}
Number consumableSideP    "Side Brush [%1.0f%%]"    (gVacCons) {channel="miio:generic:034F0E45:consumables#side_brush_percent"}
Number consumableFilterT    "Filter Time[%1.0f]"    (gVacCons) {channel="miio:generic:034F0E45:consumables#filter_time" }
Number consumableFilterP    "Filter Time[%1.0f%%]"    (gVacCons) {channel="miio:generic:034F0E45:consumables#filter_percent" }
Number consumableSensorT    "Sensor [%1.0f]"    (gVacCons) {channel="miio:generic:034F0E45:consumables#sensor_dirt_time"}
Number consumableSensorP    "Sensor [%1.0f%%]"    (gVacCons) {channel="miio:generic:034F0E45:consumables#sensor_dirt_percent"}


Switch dndFunction   "DND Function"    (gVacDND) {channel="miio:generic:034F0E45:dnd#dnd_function"}
String dndStart   "DND Start Time [%s]"    (gVacDND) {channel="miio:generic:034F0E45:dnd#dnd_start"}
String dndEnd   "DND End Time [%s]"     (gVacDND) {channel="miio:generic:034F0E45:dnd#dnd_end"}

Number historyArea    "Total Cleaned Area [%1.0fm²]"     (gVacHist) {channel="miio:generic:034F0E45:history#total_clean_area"}
Number historyTime    "Total Clean Time [%1.0f']"        (gVacHist) {channel="miio:generic:034F0E45:history#total_clean_time"}
Number historyCount    "Total # Cleanings [%1.0f]"    (gVacHist) {channel="miio:generic:034F0E45:history#total_clean_count"}

String  miNetSSID    "Network SSID [%s]"    (gVac,gVacNetwork) {channel="miio:generic:034F0E45:network#ssid" }
String  miNetBSSID    "Network BSSID [%s]"    (gVac,gVacNetwork) {channel="miio:generic:034F0E45:network#bssid" }
Number  miNetRSSI    "Network RSSI [%1.0f]"    (gVac,gVacNetwork) {channel="miio:generic:034F0E45:network#rssi" }
Number  miNetLife    "Uptime [%1.0f]"    (gVac,gVacNetwork) {channel="miio:generic:034F0E45:network#life" }

sowie die Einbindung in die Sitemap default.sitemap


Group item=gVac {
		Switch item=actionControl mappings=[vacuum="Vacuum", pause="Pause",spot="Spot", dock="Dock"]
 		Switch item=actionFan mappings=[38="Silent", 60="Normal", 77="Power",90="Full", -1="Custom"]
		Default item=statusBat 
		Default item=statusArea 
		Default item=statusTime 
		Group  item=gVacStat
		Group  item=gVacCons
		Group  item=gVacDND
		Group  item=gVacHist
		Group  item=gVacNetwork
}

 Allerdings wäre es ja Verschwendung, wenn wir unsere Alexa-Sprachsteuerung nicht auch verwenden würden. Dementsprechen noch eine kleine Ergänzung um dies einzurichten.

alexa.items


// Staubsauger (virtual)
Switch Staubsauger “Staubsauger” [“Lighting”]
sowie alexa.rules

rule "vacuum on"
when
    Item Staubsauger received command ON
then    
    actionControl.sendCommand("vacuum")
end

rule "vacuum off"
when
    Item Staubsauger received command OFF
then
    actionControl.sendCommand("dock")
end

 So nun sollte alles erst einmal alles funktionieren:

IMG 1982IMG 1983IMG 1984IMG 1985IMG 1986IMG 1987

Allerdings werde ich die Items noch entsprechend meinem Namensschema anpassen um diese einfacher wiederfinden zu könnne.