25.06.2018

Mit dem Raspberry Pi oder dem ESP32 die Paulmann Bluetooth Smarthome Geräte ansteuern.

Da in einem Ladengeschäft gerade neue Bluetooth Deckenleuchten von Paulmann installiert worden sind, Mit der Original Smarthome App aber leider nur eine eingeschränkte Zeitschalt Einstellung möglich sind habe ich mich etwas mit dem Bluetooth 4.0 BLE Protokoll befasst und kann nun die Leuchten Per Raspberry pi oder sogar mit einem ESP32 Modul ansteuern.



Hier einige daten zu den Leuchten bzw Steuerung:

Es gibt Leuchten in RGB, RGBW, weiß oder in Zwischenbau version

Ich Nehme hier als beispiel den Dimmer 500.18 dieser kann bis 500W Gedimmt werden.

Bluetooth Dimmer/Schalter 500.18
Im inneren ist ein "Normaler" Dimmer verbaut dieser wird mit einem PWM Signal vom verbauten CC2540 Bluetooth 4.0 Module angesteuert.
CC2540 / RFBM-S02 Modul

Hier die Originale App von Paulmann
Screenshot der Original App
Leider ist die Originale Paulmann App leider nicht sehr stabil programmiert und stürzt häufig ab, diese ist mit Cordova geschrieben und quasi nur eine Website die in der App läuft und mit dem Bluetooth Modul von Cordova kommuniziert.

Der Quellcode ist in Javascript und HTML in der App vorhanden und lässt sich einfach bearbeiten, dadurch war es mir möglich die Bluetooth befehle als einfache Alert Meldungen auszugeben und das Protokoll verstehen.  


Ich versuche nun kurz das Bluetooth Low Energy etwas zu erklären leider ist dies aber sehr komplex und wird deshalb nur angeschnitten.

BLE Erklärung:


BLE ist in Gruppen und Untergruppen aufgeteilt, 

Genauer in Service und Charakteristiken 

Der Service ist die Obergruppe in der sich die Charakteristiken befinden und sich dort auch ansprechen lassen, eine Charakteristik kann zb. bei einem BLE Herzfrequenzsensor die aktuelle Herzfrequenz beinhalten oder der Akkuzustand. 

Meist haben die Charakteristiken eine Bekannte ID im falle des AKKU Status ist es 0x2A19

Da in den Paulmann Leuchten jedoch eine Custom Steuerung zum Einsatz kommt ist es hier eine Unbekannte ID aber zb. beispiel zum licht ein aus schalten ist es 0xffb7

Hier ein Screenshot der nRF Connect App mit dieser Lassen sich sehr einfach BLE Geräte auslesen. 

Hier ist der Unknown service zu sehen und 8 Charakteristiken anhand der Beschreibung lässt sich schon sehr genau erahnen welche Charakteristik für was zuständig ist.

Versucht man nun zb. den Brightness wert zu senden oder zu lesen wird man direkt von dem Controller getrennt, dies passiert weil bei jeder Verbindung zuerst das Aktuelle Passwort zum Controller gesendet werden muss. 

Dieses Passwort ist bei Werkseinstellung 0123 und kann in einfach ASCII Zeichen gesendet werden. 

Danach ist auch über die nrF Connect App eine Steuerung der leuchte möglich dieses ist jedoch sehr umständlich und nur zum Testen sinnvoll.

Hier alle Kommandos die es insgesamt gibt, da es verschiedene RGB Leuchten, Dimmer oder nur einfache schalter gibt funktionieren nicht alle Kommandos bei jedem Kontroller


setCharacteristic("ffba", [48, 49, 50, 51])  //PASSWORD
setCharacteristic("ffb1", [0, 0, 5]) 
setCharacteristic("ffb2", [255, 255, 255])  // RGB
setCharacteristic("ffb3", [7, 224, 3, 1, 16, 0, 0])  // system time
setCharacteristic("ffb4", [0, 0, 0, 0, 1, 16, 0, 2]) // Timer  
setCharacteristic("ffb5", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) // device name
setCharacteristic("ffb6", [96, 9])
setCharacteristic("ffb7", [1]) // switch
setCharacteristic("ffb8", [50]) //brightness
setCharacteristic("ffb9", [1, 1, 0, 0]) // working mode
setCharacteristic("ffbb", [1]) // controller enable// fernbedienung zulassen


Das Passwort kann auch geändert werden, dazu einfach an ffba in einem Kommando das alte Passwort senden und danach das neue.
zb. ist das alte Passwort 0123 und das neue soll 5678 werden der Befehl würde nun einfach 01235678 lauten danach ist bei jeder neu Verbindung das neue Passwort zu nutzen.

Arduino/ESP32 Ansteuerung:



Um eine Leuchte mit einem ESP32 zu steuern habe hier einen einfachen Quellcode in diesem muss noch die MAC Adresse eingegeben werden von der zu steuernden Leuchte.

ESP32 Arduino Code


In diesem Beispiel wird der Inegrierte Touchsensor T0 vom ESP32 Abgefragt und danach Die Leuchte gestuert, Erst wird das Passwort an 0xFFBA gesendet und dann an 0xFFB7 der soll zustand als Byte 1 oder 0, zudem wird auch der wert von 0xFFB7 ausgelesen und über die serielle Schnittstelle erkennbar gemacht.

Wenn mit dem ESP32 nur eine Leuchte angesteuert werden soll funktioniert das soweit auch sehr zuverlässig, leider startet der ESP aber neu sobald man versucht eine andere Leuchte zu steuern.

In dem Ladengeschäft sind insgesamt 14 Leuchten vorhanden und somit ist diese Methode nicht in frage gekommen, nach weiterem Testen und suchen hat es auch mit dem Raspberry Pi einwandfrei funktioniert, dazu jetzt mehr.

RaspberryPi / Python Ansteuerung:


Ich nutze zur Steuerung mit dem Raspberry pi Python und das gatttool um mit Bluetooth Geräten zu Kommunizieren.
Eine weitere gute Erklärung zu dem gatttool gibt es hier.



Hier wieder ein Beispiel Quellcode: 
Python Quellcode für BLE Ansteuerung
CodeDownload

Der Code selber baut sich sehr ähnlich auf es wird mit pexpect ein Hintergrund Prozess gestartet und sich mit der Leuchten MAC Adresse verbunden, wenn ein Connection successful vom gatttool gesendet wird wird erst das Password an 0xFFBA gesendet und dann an 0xFFB7 ein einschalt Kommando. Im Quellcode stehen nicht die richtigen Karakteristiken da Gatttool mit anderen werten arbeitet, um diese zu erhalten ist es nötig gatttool zu starten, mit der Leuchte Verbinden und mit dem befehl "characteristics" die sich die werte anzeigen lassen.



Mithilfe von Cron jobs und dem Telegram Bot habe ich mir eine sehr leistungsstarke Zeitschaltuhr programmiert die Täglich 6 mal die Leuchten An, Aus oder in einen Farbwechsel Modus Schaltet und bei jeglichem Fehlverhalten eine nachricht sendet.

Ein sehr schönes und abgeschlossenes Projekt :)

1 Kommentar:

  1. Hi Aaron,
    dieser Beitrag ist ja nun schon ziemlich alt, da ich gerade mit einer Paulmann BLE Beleuchtung kämpfe, bin ich aber darauf gestoßen. Ich hoffe, dass Du mein Hilfegesuch auch registrierst.
    Ich habe dein Arduino/ESP32 Code verwendet und stosse auf folgende Schwierigkeit: Ich kann mich verbinden, das Pwd senden und den Schaltzustand und Helligkeit auslesen. Schalten ging erst mal nicht. Ich habe nun dein pClient->setValue(BLEUUID((uint16_t)0xffb0), BLEUUID((uint16_t)0xffb7), std::string ("\001",1)); in pClient->setValue(BLEUUID((uint16_t)0xffb0), BLEUUID((uint16_t)0xffb7), std::string ("\01",1)); geändert, damit schaltet die Lampe an. Ich kann aber machen was ich will, aus geht sie nicht, nicht mit "\000" und auch nicht mit "\00":-(
    Hast Du einen Tip?
    mfg Ralph

    AntwortenLöschen