Ein wirklich nützliches Feature ist die Steuerung der Zentralverriegelung über meine Smart Camper App. Das eröffnet viele neue Möglichkeiten.

  • Wenn jemand zu Besuch kommt man aber noch nicht am Camper ist, kann man den Besuch schonmal hineinlassen.
  • Wenn ich nur einen Fahrzeugschlüssel habe, können alle anderen mit der App das Auto öffnen und schließen.

Dazu habe ich mich zunächst in den Karosserie-CAN vom Ducato eingeklinkt. Beim Öffnen und Verschließen ist der CAN-Bus sehr aktiv. Über einige Sekunden werden viele Daten von den verschiedensten Geräten gesendet. Leider ist es nicht möglich, über ein Datenpaket auf dem Karosserie-CAN die Zentralverriegelung anzusteuern. Ich habe mir angeschaut wie meine Alarmanlage (Thitronik Wipro) das macht und dabei gesehen, dass diese 2 weitere Pins (Pin 53 blau/gelb und Pin 27 grau/weiß am grünen Stecker am Steuergerät) anzapft, um die Zentralverriegelung zu schalten. Leider bin ich aus dem Signal nicht wirklich schlau geworden, da es sich nicht um ein mir bekanntes Protokoll handelt. (Falls jemand hierzu Informationen hat, würde ich mich freuen, wenn er sie mit mir teilt). Meinen Exkurs mit dem Karosserie-CAN beschreibe ich demnächst in einem anderen Artikel.

Da es mein Ziel war die Zentralverriegelung zu steuern, ich aus dem Signal aber nicht schlau wurde, brauchte ich eine andere Lösung. Ich habe mich entschlossen einfach über meine Alarmanlage (Thitronik Wipro) zu gehen, diese kann ja die Zentralverriegelung schalten. Hier habe ich vor einiger Zeit das Thitronik Bluetooth Modul nachgerüstet. Da ich mich spätestes seit meinen Versuchen mit dem Votronic Bluetooth Modul mit Bluetooth Low Energy auskenne, müsste es doch ein Leichtes sein, mit einem Mikrocontroller eine Verbindung herzustellen und damit die Zentralverriegelung zu schalten.

Erforschen der Bluetooth-Verbindung zum Thitronik Bluetooth-Modul

Ich habe das gleiche Vorgehen wie beim Votronic Bluetooth Connector gewählt und einfach mit der Android App NRF Connect die BLE Verbindung getrackt. Es gibt einen Service (UUID: 20546869-7472-6f6e-696b-20476d624820) mit 3 Charakteristika. 2 davon senden etwas und über einen kann ich der Wipro Befehle senden. Über die Bluetooth Logs meines Mobiltelefons (lassen sich in Android, über Bluetooth logs aufzeichnen) konnte ich herausfinden, dass man mit den Befehlen „”:WMw04Lock78″“ und “:WMw06Unlock61”  über die Charakteristik UUID: 54686974-726f-6e69-6b20-4354524c2020 die Zentralverriegelung schalten kann.

Einbindung in mein Smart Camper System

Die Hardware ist dieselbe wie beim Votronic Artikel, ich habe einfach die Software etwas angepasst, sodass sich der ESP32 Microcontroller mit der Wipro verbindet und die Befehle zum Öffnen und Schließen der Zentralverriegelung sendet. Um Strom zu sparen, befindet sich der ESP32 eigentlich immer im Deep-Sleep-Modus. Nur wenn ich die Zentralverriegelung schalten will, wecke ich ihn über ein Funkmodul auf, dass in mein Smart-Camper System eingebunden ist. Sobald er erwacht, prüft der Microcontroller, was er machen soll. Von den 8 Schaltausgängen des Homematic Schaltmoduls dient einer zum Wecken und die anderen 7 um spezielle Aufgaben zu erledigen. Ich benutze 2 Kanäle um das Fahrzeug zu öffnen oder zu schließen. Die Sicherheit ist dabei gewährleistet, da das WLAN, die Funkverbindung und die Bluetooth Low Energy Verbindung gesichert sind.

Fazit

Ich hätte die Zentralverriegelung zwar lieber direkt als indirekt über die Thitronik Wipro angesteuert, aber dafür fehlte mir leider die Information über das richtige Signal. Das Ergebnis ist fast dasselbe, außer, dass ich einen kurzen Zeitversatz von ca. 2 Sekunden habe, die der Microcontroller braucht, um sich mit der Wipro zu verbinden. Damit kann ich aber erstmal leben. Es ist auf jeden Fall um Welten besser als diese SMS-Lösung, die von Thitronik über den Pro-finder angeboten wird.

Das Ganze wird natürlich wieder in meine App eingebunden, mit der ich mittlerweile schon eine beachtliche Zahl an Funktionen steuern kann. Den Quellcode stelle ich hier wie immer für interessierte Bastler zur Verfügung. Beim ersten Connect muss der Thitronik Bluetooth Connector durch drücken der einzigen Taste für ca. 5 Sekunden in den Bonding-Modus versetzt werden. Im Code müsst ihr natürlich die MAC-Adresse eures Bluetooth Moduls eintragen, die ihr über die App NFR Connect findet.

Viel Spaß beim Nachbasteln!

Und nochmal die Bitte: Falls jemand Information zur Steuerung der Ducato Zentralverriegelung hat (ich meine nicht die Taste im Armaturenbrett, diese wird nämlich beim echten Verriegeln mit dem Schlüssel deaktiviert und ist auch schon in meinen Smart-Camper integriert), würde ich mich sehr freuen, wenn ihr diese Information mit mir teilt!

#include <Arduino.h>
#include "BLEDevice.h"
#include <ESP32CAN.h>
#include <driver/rtc_io.h>

//BLE
#define Thitronik_BLE_MAC "80:1f:12:be:32:6c"  // Adresse über nRF Connect App finden
uint32_t PIN = 0000 ;             // Bonding Passwort

// Service und Characteristic des Thitronik Bluetooth Connectors
static BLEUUID Thitronik_serviceUUID("20546869-7472-6f6e-696b-20476d624820");
static BLEUUID Thitronik_Antwort_charUUID("54686974-726f-6e69-6b20-524553502020");
static BLEUUID Thitronik_Befehl_charUUID("54686974-726f-6e69-6b20-4354524c2020"); 

//BLE
static BLEAddress *pServerAddress;
BLEClient*  pClient;
static BLERemoteCharacteristic* pRemoteCharacteristic_Thitronik_Befehl;
static BLERemoteCharacteristic* pRemoteCharacteristic_Thitronik_Antwort;


///////////////////////////////////////////////////////////////////////////////////
/////////////////////////            SETUP          ///////////////////////////////
///////////////////////////////////////////////////////////////////////////////////

//GPIOs konfigurieren
void Setup_GPIO(){
 
      // Pins sind mit dem Homematic 8-Kanal-Empfangsmodul verbunden
      pinMode(GPIO_NUM_33, INPUT_PULLUP);
      pinMode(GPIO_NUM_25, INPUT_PULLUP);
      pinMode(GPIO_NUM_26, INPUT_PULLUP);
      pinMode(GPIO_NUM_27, INPUT_PULLUP);
      pinMode(GPIO_NUM_14, INPUT_PULLUP);
      pinMode(GPIO_NUM_12, INPUT_PULLUP);
      pinMode(GPIO_NUM_13, INPUT_PULLUP);
    
      //WakeupPin Homematic
      pinMode(GPIO_NUM_32, INPUT_PULLUP);
      esp_sleep_enable_ext0_wakeup(GPIO_NUM_32, LOW);
      rtc_gpio_pullup_en(GPIO_NUM_32);    
}

//BLE Thitronik Setup
bool Setup_Thitronik(){
  PIN = 0000;
  BLEDevice::init("");
  pServerAddress = new BLEAddress(Thitronik_BLE_MAC);
  return connect_To_Thitronik_Server(*pServerAddress);
}

void setup() {
  Serial.begin(115200);
  Setup_GPIO();
}

void loop()
{
  if(digitalRead(GPIO_NUM_32)==0){
        Serial.println("HomeMatic Weckruf");
        //Unlock Zentralverriegelung
        if(digitalRead(GPIO_NUM_25)==0){
          if(Setup_Thitronik()== true){        
            // Send: :WMw06Unlock61
            if (pRemoteCharacteristic_Thitronik_Befehl != nullptr) {
              pRemoteCharacteristic_Thitronik_Befehl->writeValue(":WMw06Unlock61", true);
              Serial.println("Send: :WMw06Unlock61"); 
            }
          }
        }
        //Lock Zentralverriegelung
        if(digitalRead(GPIO_NUM_26)==0){
          if(Setup_Thitronik()== true){        
            // Send: :WMw04Lock78
            if (pRemoteCharacteristic_Thitronik_Befehl != nullptr) {
              pRemoteCharacteristic_Thitronik_Befehl->writeValue(":WMw04Lock78", true);
              Serial.println("Send: :WMw04Lock78"); 
            }
          }
        }
        //Aktuell Unbenutzt
        if(digitalRead(GPIO_NUM_33)==0){}
        if(digitalRead(GPIO_NUM_27)==0){}
        if(digitalRead(GPIO_NUM_14)==0){Serial.println("GPIO_NUM_14");}
        if(digitalRead(GPIO_NUM_12)==0){Serial.println("GPIO_NUM_12");}
        if(digitalRead(GPIO_NUM_13)==0){Serial.println("GPIO_NUM_13");}
  }
  Serial.println("ich gehen schlafen!!");
  esp_deep_sleep_start();
}


///////////////////////////////////////////////////////////////////////////////////
/////////////////////////             BLE           ///////////////////////////////
///////////////////////////////////////////////////////////////////////////////////

// Security Callback für Login
class MySecurity : public BLESecurityCallbacks {
  bool onConfirmPIN(uint32_t pin){
    return false;
  }
  uint32_t onPassKeyRequest(){
        ESP_LOGI(LOG_TAG, "PassKeyRequest");
    return PIN;
  }
  void onPassKeyNotify(uint32_t pass_key){
        ESP_LOGI(LOG_TAG, "On passkey Notify number:%d", pass_key);
  }
  bool onSecurityRequest(){
      ESP_LOGI(LOG_TAG, "On Security Request");
    return true;
  }
  void onAuthenticationComplete(esp_ble_auth_cmpl_t cmpl){
    ESP_LOGI(LOG_TAG, "Starting BLE work!");
    if(cmpl.success){
      uint16_t length;
      esp_ble_gap_get_whitelist_size(&length);
      ESP_LOGD(LOG_TAG, "size: %d", length);
    }
  }
};

// Verbinde mit Thitronik BLE Server.
bool connect_To_Thitronik_Server(BLEAddress pAddress)
{
  Serial.print("Verbinde Thitronik: ");
  Serial.println(pAddress.toString().c_str());
 
  //BLEDevice::setEncryptionLevel(ESP_BLE_SEC_ENCRYPT );
  BLEDevice::setEncryptionLevel(ESP_BLE_SEC_ENCRYPT );
  BLEDevice::setSecurityCallbacks(new MySecurity());
 
  BLESecurity *pSecurity = new BLESecurity();
  pSecurity->setAuthenticationMode(ESP_LE_AUTH_REQ_SC_BOND); //
  pSecurity->setCapability(ESP_IO_CAP_OUT);
  pSecurity->setRespEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK);
  pClient = BLEDevice::createClient();

  if ( pClient->connect(pAddress) ) {
          Serial.println("Thitronik BLE Verbunden");
          delay(100);
          BLERemoteService* pRemoteService = pClient->getService(Thitronik_serviceUUID);
          if (pRemoteService == nullptr)
          {
            Serial.print("Service UUID nicht gefunden: ");
            Serial.println(Thitronik_serviceUUID.toString().c_str());
            return false;
          }
          else{
            //Characteristic für Befehl an Thitronik
            pRemoteCharacteristic_Thitronik_Befehl = pRemoteService->getCharacteristic(Thitronik_Befehl_charUUID);
            if (pRemoteCharacteristic_Thitronik_Befehl == nullptr) {
              Serial.print("Characteristic UUID nicht gefunden: ");
              Serial.println(Thitronik_Befehl_charUUID.toString().c_str());
              return false;
            }
            //Characteristik für Callback von Thitronik
            pRemoteCharacteristic_Thitronik_Antwort = pRemoteService->getCharacteristic(Thitronik_Antwort_charUUID);
            if (pRemoteCharacteristic_Thitronik_Antwort == nullptr) {
              Serial.print("Characteristic UUID nicht gefunden: ");
              Serial.println(Thitronik_Antwort_charUUID.toString().c_str());
              return false;
            }
            // Read the value of the characteristic.
            if(pRemoteCharacteristic_Thitronik_Antwort->canRead()) {
              std::string value = pRemoteCharacteristic_Thitronik_Antwort->readValue();
              Serial.println(value.c_str());
            }
          }
        
  }
  else{
      Serial.println("Thitronik BLE nicht Verbunden");
  }
  return true;
}

Leave a Reply