[Neues Modul] Xiaomi Smart Home ohne Gateway direkt an FHEM

Begonnen von neumann, 22 Februar 2018, 18:00:22

Vorheriges Thema - Nächstes Thema

neumann

Hey zusammen!

Ich habe an einer Lösung gearbeitet, um die Xiaomi Smart Home Geräte direkt über FHEM pairen zu können aus folgenden Gründen:
- Unabhängigkeit vom Gateway
- Keine China-Cloud mehr
- bis zu 48 Sensoren verbinden (statt der 30 vom Gateway)

Folgendes wird benötigt:
- CC2531 USB Stick https://de.aliexpress.com/item/DC-DC-LTC1871-Boost-Module-3-5-to-30V-100W-With-Dual-Display-Voltmeter/1859124945.html
- CC Debugger https://de.aliexpress.com/item/Bluetooth-zigbee-Emulator-CC-Debugger-original-shell-2540-2541-2530-protocol-analysis/32798394717.html
- Adapterkabel https://de.aliexpress.com/item/Downloader-Cable-Bluetooth-4-0-CC2540-zigbee-CC2531-Sniffer-USB-dongle-BTool-Programmer-Wire-Download-Programming/32767478130.html

Wenn man keinen Freund hat, der einen CC Debugger besitzt, kommt das preislich etwa gleich raus, wie wenn man das Gateway kauft. Die Einrichtung ist aufwändiger als beim Gateway.

Das ganze basiert auf dem CC2531 SoC von Texas Instruments sowie einer angepassten Version von Zigbee-Shepherd.

Zunächst muss der CC2531 USB Stick mit einer angepassten Variante des Z-Stacks von TI geflasht werden. Dazu brauch man leider einmalig einen CC Debugger sowie ein Adapterkabel. Da man die Firmware nur mit einem kommerziellen Compiler kompilieren kann, liegt das fertige hex file in meinem Repo bei.
Während des flashens muss der Stick über USB mit Strom versorgt werden, dann über das Adapterkabel mit dem CC Debugger verbunden werden (Richtung: Kabel geht über den Rand der Platine weg, nicht über die andere Seite)

Clone dir nun die Repo und flashe den Stick mit der Firmware unter Verwendung des SmartRF Flash Programmers von TI:
Repo: https://github.com/Koenkk/zigbee2mqtt
Programmer (V1 verwenden, NICHT V2): http://www.ti.com/tool/FLASH-PROGRAMMER
Treiber für den CC Debugger (für den Stick braucht man keinen!): http://www.ti.com/tool/CC-DEBUGGER

Führe anschließend die Installationsanleitung aus und starte den nodejs Server.

Damit der nodejs Server beim Start automatisch mitgestartet wird, lege folgende Datei an /etc/systemd/system/xiaomi.service:
[Unit]
Description=Xiaomi

[Service]
ExecStart=/usr/bin/node /opt/zigbee2mqtt/index.js
Restart=always
RestartSec=5
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=xiaomi

[Install]
WantedBy=multi-user.target

Dabei müssen die Pfade unter ExecStart entsprechend angepasst werden.

Aktiviere den Service nun mit
systemctl enable xiaomi

Die Werte der Sensoren werden über MQTT an FHEM gemeldet - das index.js Script geht davon aus, dass der Server auf dem gleichen Gerät läuft - das kann im Programmcode aber entsprechend angepasst werden.
Installiere nun das FHEM-Modul: https://github.com/oskarn97/fhem-xiaomi-mqtt

Vorher der eigentlichen Definition muss aktuell bereits das MQTT IODev vorhanden sein, welches über
define MQTT MQTT localhost:1883 angelegt werden kann, sofern das noch nicht der Fall ist. Eine Definition ohne Vorhandensein des IODev führt aktuell zum Crash von FHEM.

Die Verbindung zum Stick wird anschließend wie folgt hergestellt:
define xBridge XiaomiMQTTDevice bridge

Paring
Das Pairing benötigt etwas Geduld. Während des Pairing muss man sich so nah wie möglich am Stick befinden!

Aktiviere zunächst das Pairing per
set xBridge pair 1

Alle Komponenten werden wie folgt gepairt.
Halte den Pairing-Knopf für 4 Sekunden gedrückt, lasse ihn los und drücke ihn über den Zeitraum von einer Minute ganz kurz alle 2 Sekunden.
Der Stick benötigt knapp eine Minute um alle Eigenschaften des Geräts auszulesen, dabei darf es nicht schlafen gehen, da sonst das Pairing fehlschlägt.
Geräte werden nach dem Pairing per autocreate angelegt - geschieht dies nicht, versuche es erneut.
Lediglich der Wandschalter bleibt von alleine wach.

Update:
Ich habe meinen eigenen Gateway-Server nun eingestellt und arbeite stattdessen mit Koenkk zusammen.
Das hat den Vorteil, dass das Projekt besser aktualisiert wird (mit neuen Geräten etc). Das Plugin habe ich dafür bereits angepasst - die neue Version des Plugins ist vorerst noch abwärtskompatibel zu meinem Gateway-Server.
Um von meiner Repo auf die neue zu wechseln, führe Installationsanleitung aus. Um das Pairing zu behalten, kopiere anschließend die devices.db aus dem alten Ordner, benenne sie in database.db um, und füge sie im Ordner data der neuen Repo ein.
Modulentwickler
- Spotify #72490
- Nello #75127

ThoTo

Super Idee und tolle Arbeit!
Komponenten sind bestellt, dauert noch bis zu den ersten Tests  8)

Kannst du auch eine Unterstützung für den Xiaomi Mi Magic Cube Controller einbauen?

LG Thomas
KNX | MQTT | Docker | Sonos | FHEMapp

"Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher." (Albert Einstein)

neumann

Danke dir - bestimmt, habe ich nur nicht hier.
Wenn du mir aber die Logs der Events schickst, baue ich sie ein :)
Lg
Modulentwickler
- Spotify #72490
- Nello #75127

ThoTo

Zitat von: neumann am 22 Februar 2018, 22:35:14
Danke dir - bestimmt, habe ich nur nicht hier.
Wenn du mir aber die Logs der Events schickst, baue ich sie ein :)
Lg
Mache ich sobald die Komponenten bei mir sind!!

LG Thomas
KNX | MQTT | Docker | Sonos | FHEMapp

"Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher." (Albert Einstein)


neumann

Ja - beim Temperatursensor habe ich nur den Aqara getestet, der von dir wird aber auch sehr sicher gehen.
Modulentwickler
- Spotify #72490
- Nello #75127

majestro84

Wurde der Xiaomi mijia Honeywell Rauchmelder mit deinen Modul funktionieren?
https://de.gearbest.com/alarm-systems/pp_615081.html



Gesendet von meinem Redmi Note 4 mit Tapatalk

Server: Fujitsu ESPRIMO Q920 - aktuellen FHEM-Docker Image:Z-Wave (RollerShutter,DoorWindow,Socket,PIR,....) | ENIGMA2 | EGPM2LAN | BLE-Tag(PRESENCE) | HUE | alexa-fhem | Shelly | MQTT2
1.Pi-Zero:Viessmann(optolink) mit 89_VCONTROL300.pm
2.Pi3 Dongle Server: Zigbee2MQTT(CC1352P-2), Z-Wave(UZB1), BT

wertz

Hallo neumann, als allererstes !!Sehr gute Idee!! :-)

ich hab nun einen USB Stik CC2513, einen CC Debugger und das Adapterkabel besorgt.
Das hex-file aus dem repo von Oskarn97 geholt und geflasht. Meldung im TI Flash Programmer war: OK
nach Anleitung aus dem Repo von Oskarn97 die Installation durchgeführt und den Nodejs Server gestartet
Das hat bis hierher soweit (mit Umwegen) funktioniert
Dann habe ich das Modul 72_XiaomiMQTTDevice.pm gezogen und in den FHEM Ordner kopiert
und danach die Eigenschaften der Datei geprüft. (Gruppe Dialout 20 / fhem 999)
Sobald ich "define xBridge XiaomiMQTTDevice bridge" in der Fhem eingabemaske bestätige stürtzt Fhem ab!  :-[
und lässt sich nurn noch mit einem
sudo /etc/init.d/fhem stop
sudo /etc/init.d/fhem start
wieder in Gang setzen. Auch ein reboot des RPI bringt keine Veränderung.
Würde mich freuen wenn du mir helfen könntest,
Im Voraus schon mal Danke!!

neumann

was sagt denn der Log (/opt/fhem/log/fhem-2018-03.log)?
Vermutlich fehlt irgendeine dependency... :)
Modulentwickler
- Spotify #72490
- Nello #75127

MiKn

läuft MQTT auch. Erst nachdem dies installiert war stürzte fhem bei mir auch nicht mehr ab.

Bei mir werden nur noch keine Geräte gefunden...

neumann

Modulentwickler
- Spotify #72490
- Nello #75127

wertz

Zitat von: neumann am 21 März 2018, 16:55:18
was sagt denn der Log (/opt/fhem/log/fhem-2018-03.log)?
Vermutlich fehlt irgendeine dependency... :)

Hallo neumann, vielen Dank!
hier der eintrag in der log:
2018.03.22 20:20:31 1: PERL WARNING: XiaomiMQTT::DEVICE::Expand() called too early to check prototype at ./FHEM/72_XiaomiMQTTDevice.pm line 263.
2018.03.22 20:20:31 1: PERL WARNING: XiaomiMQTT::DEVICE::Expand() called too early to check prototype at ./FHEM/72_XiaomiMQTTDevice.pm line 269.
2018.03.22 20:20:34 3: No I/O device found for xBridge
Undefined subroutine &XiaomiMQTT::DEVICE::client_subscribe_topic called at ./FHEM/72_XiaomiMQTTDevice.pm line 80.
-
der Server läuft:
pi@raspberrypi:~ $ sudo service mosquitto status
● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
   Loaded: loaded (/etc/init.d/mosquitto)
   Active: active (running) since Thu 2018-03-22 20:06:10 CST; 35min ago
  Process: 1088 ExecStop=/etc/init.d/mosquitto stop (code=exited, status=0/SUCCESS)
  Process: 1948 ExecStart=/etc/init.d/mosquitto start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/mosquitto.service
           └─1953 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

Mar 22 20:06:10 raspberrypi mosquitto[1948]: Starting network daemon:: mosqu....
Mar 22 20:06:10 raspberrypi systemd[1]: Started LSB: mosquitto MQTT v3.1 mes....
Hint: Some lines were ellipsized, use -l to show in full.
-
npm Version:
pi@raspberrypi:~ $ npm -v
5.6.0
-
node version:
pi@raspberrypi:~ $ node -v
v8.10.0
-
USB-Stick ist wie folgt eingebunden:
pi@raspberrypi:~ $ ls -l /dev/serial/by-id
lrwxrwxrwx 1 root root 13 Mar 22 20:12 usb-Texas_Instruments_TI_CC2531_USB_CDC___0X00124B0012022E2B-if00 -> ../../ttyACM0
-
in der der index.js habe ich folgendes für serial port und mqtt broker eingetragen:
var client  = mqtt.connect('mqtt:/etc/init.d/mosquitto')
var shepherd = new ZShepherd('/dev/ttyACM0', {
-
Ich habe keine Ahnung was ich da falsch mache,
ich hoffe du kannst mit weiterhelfen, würde mich freuen.
Gruß

neumann

Hey,

bei mqtt.connect muss der Host stehen, nicht der Dateipfad. Wenn der Server auf dem selben Pi läuft ist mqtt.connect('mqtt://localhost') korrekt.
bei new ZShepherd ist ACM0 korrekt, du kannst auch
var shepherd = new ZShepherd('/dev/serial/by-id/usb-Texas_Instruments_TI_CC2531_USB_CDC___0X00124B0012022E2B-if00', {
reinschreiben, spielt aber keine Rolle.
Wenn du dann startest sollte Server is ready kommen.
Modulentwickler
- Spotify #72490
- Nello #75127

wertz

Zitat von: neumann am 22 März 2018, 14:10:27
Hey,

bei mqtt.connect muss der Host stehen, nicht der Dateipfad. Wenn der Server auf dem selben Pi läuft ist mqtt.connect('mqtt://localhost') korrekt.
bei new ZShepherd ist ACM0 korrekt, du kannst auch
var shepherd = new ZShepherd('/dev/serial/by-id/usb-Texas_Instruments_TI_CC2531_USB_CDC___0X00124B0012022E2B-if00', {
reinschreiben, spielt aber keine Rolle.
Wenn du dann startest sollte Server is ready kommen.

Also,
beides in der index.js eingetragen,
-
root@raspberrypi:~/xiaomi-zb2mqtt# node index.js
Server is ready. Current devices:
-
Fhem stürtzt bei der Eingabe von "define xBridge XiaomiMQTTDevice bridge" in der Fhem eingabemaske immer noch ab.
im Log stehen immer noch die gleichen Meldungen wie vorher
-
2018.03.22 22:19:06 1: PERL WARNING: XiaomiMQTT::DEVICE::Expand() called too early to check prototype at ./FHEM/72_XiaomiMQTTDevice.pm line 263.
2018.03.22 22:19:06 1: PERL WARNING: XiaomiMQTT::DEVICE::Expand() called too early to check prototype at ./FHEM/72_XiaomiMQTTDevice.pm line 269.
2018.03.22 22:19:06 3: No I/O device found for xBridge
Undefined subroutine &XiaomiMQTT::DEVICE::client_subscribe_topic called at ./FHEM/72_XiaomiMQTTDevice.pm line 80.
-
Hast du noch nen Tipp,?
würde sonst nochmal von vorne anfangen....

neumann

Ja, du musst erst ein MQTT Device definieren.
define MQTT MQTT localhost:1883
Modulentwickler
- Spotify #72490
- Nello #75127