abbrechen
Suchergebnisse werden angezeigt für 
Anzeigen  nur  | Stattdessen suchen nach 
Meintest du: 


REST API Zugriff mit ESP32

tobo123
Experienced Homie

Hallo zusammen,

 

ich versuche über einen ESP32 Mikrocontroller auf den BSH Controller II über die REST API zuzugreifen. Ich möchte gerne Zustände auslesen, um bei meiner Smarten Anzeige auf eine Ledvance-Platine verzichten zu können. Den ESP32 programmiere ich über die Arduino IDE.

 

Bisher habe ich folgendes erreicht:

- Abfrage der Public Information, Anlegen eines neuen Client und anschließende Abfrage z.B. des room arrays über Postman.

- Ich kann über den ESP32 über Port 8446 per GET die Public Information auslesen.

- Ich kann über den ESP32 über Port 8443 per POST einen neuen Client anlegen. Dieser erscheint auch in der Smart Home APP unter "Weitere Mobilgeräte".

 

So weit, so gut. Was jetzt aber nicht geht, ist anschließend über Port 8444 per GET z.B. das room array abzufragen. Die Verbindung kommt hier nicht zustande. Laut Postman muss ich doch im Header außer dem Host nichts mit senden, oder?

 

Ich habe schon viel rumprobiert und bin jetzt etwas ratlos. Hat jemand eine Idee, woran es liegen könnte?

 

VG tobo

Seit 2024 privater BSH Nutzer. SHC II + 26 Geräte + 33 Automationen + 14 Zustände.
Samsung S22+, Samsung Tab S9 FE, ESP8266-basierte Geräte
13 ANTWORTEN 13

tobo123
Experienced Homie

Ein Update von mir: ich habe alles mögliche probiert, um die REST API auf meinem ESP32 zum laufen zubekommen, ohne Erfolg. Ich bin jetzt auf ein ESP8266 umgestiegen und hier geht es 🙂

 

Ich kann den ESP als Client anmelden und Geräte und die Zustände abfragen. Der Hammer! Das eröffnet echt viele Möglichkeiten. Ich werde als nächstes mein smarte Anzeige auf die REST API umstellen.

 

 VG tobo

Seit 2024 privater BSH Nutzer. SHC II + 26 Geräte + 33 Automationen + 14 Zustände.
Samsung S22+, Samsung Tab S9 FE, ESP8266-basierte Geräte

ilja-stas
Apprentice Homie

Hi @tobo123,

 

könntest du ein Beispiel Code hier reinposten? Ich bekomme ständig SSL Certificat Issues. Auch wenn ich requests.get(..., verify=False) mache (mit Python).

 

Danke

Ilja

ilja-stas
Apprentice Homie
import requests
import base64
import urllib3

# Suppress the InsecureRequestWarning related to verify=False
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# Variables (replace with actual values)
shc_api = "https://192.168.0.10:8444"  # Replace with your actual SHC API URL
api_version = "3.13"  # Replace with the actual API version you're using
system_password_base64 = base64.b64encode(b'testtest').decode('utf-8')  # Replace with your password

# Endpoint for devices
url = f"{shc_api}/smarthome/devices"  # Replace with the actual devices endpoint

# Path to client certificate and key files (replace with actual paths)
client_cert = ('/home/ilja/python-cert.pem', '/home/ilja/python-key.pem')  # Update these paths

# Headers
headers = {
    'Content-Type': 'application/json',
    'User-Agent': 'PostmanRuntime/7.42.0',
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'keep-alive',
    'Systempassword': system_password_base64,
    'api-version': api_version,
    'Host': '192.168.0.10:8444',
}

# No payload needed for GET request to /smarthome/devices

# Make the GET request with client certificate
response = requests.get(url, headers=headers, cert=client_cert, verify=False, timeout=120)

# Print the response
print(f"Status Code: {response.status_code}")
print(f"Response Body: {response.text}")

ilja-stas
Apprentice Homie

That code is working

Sehr gut, wenn es damit geht. Ich programmiere mit C++ / Arduino, weiß daher nicht, ob dir mein Code nützt. Den kannst du dir hier anschauen: https://github.com/tobo-123/smart-home-display

 

Den Header kannst du kürzen. Das Passwort brauchst du z.B. nicht mitsenden.

Seit 2024 privater BSH Nutzer. SHC II + 26 Geräte + 33 Automationen + 14 Zustände.
Samsung S22+, Samsung Tab S9 FE, ESP8266-basierte Geräte

Sulaco
Apprentice Homie

Hi,

erstmal vielen Dank für die Bereitstellung des Quelltextes und der Druckdateien!

Damit hast du mir sehr viel Arbeit erspart, da ich genau das benötige, was du entwickelt hast.

Ich habe bereits alles nach der Materialliste bestellt und das Gehäuse in den Druck gegeben.

Zwei Fragen hätte ich dazu:

du nutzt bei den Zuständen Fenster auf/zu und Alarm an/aus.

Wie genau hast du das in den Automationen gelöst? 

Den Zustand des Alarmsystems kann man zwar als Bedingung aber nicht als Auslöser nutzen?

Ich habe mir die API angeschaut und hätte erst gedacht, dass du das z.B. über 

/intrusion/states/system abfragen würdest. 

 

Sind die zusätzlichen Erhebungen im Front-Gehäuse eventuell dafür gedacht, einen Batteriebetrieb zu ermöglichen?

 

 

viele Grüße  

Christian

tobo123
Experienced Homie

Hey, cool dass du meine Anzeige nachbauen willst.

 

Für Fenster auf habe ich jeweils eine Automation, die den Zustand "Fenster auf" aktiviert bzw. deaktiviert. Fenster auf Automation sieht so aus: WENN Fenster X geöffnet wird oder Fenster Y geöffnet wird.... DANN Zustand Fester auf aktivieren.

 

Fenster zu Automation: WENN Fenster X geschlossen wird oder Fernster Y geschlossen wird oder.... UND Fenster X geschlossen ist und Fenster Y geschlossen ist und... DANN Zustand Fenster offen deaktiveren.

 

Das Alarmsystem aktiviere ich durch eine Automation (entweder manuell oder mit einem Universalschalter II) , die dann gleichzeitig für 30s den Zustand "Alarmerinnerung" aktiviert. Die 30s entsprechen der Aktivierungszeit im Alarmsystem. Ebenso geht der Zustand Alarmerinnerung an, wenn das Alarmsystem aktiviert ist und ich nachhause komme (Türkontakt an der Haustür), bis ich das Alarmsystem durch eine Automation ausschalte.

 

Klar könnte man den Zustand des Alarmsystems auch direkt aus der API abfragen. Ich wollte aber als Schnittstelle zwischen meiner Anzeige und der API nur die Zustände nutzen. Das macht das Programm einfacher.

 

Die zusätzlichen Erhebungen im Frontgehäuse sind noch Überbleibsel aus der Zeit, wo ich neben dem ESP noch eine Ledvance-Platine verbaut hatte. Die sind jetzt also ohne Funktion. Mit Batterie würde die Anzeige leider nicht lange laufen, dafür braucht der ESP und die LED zuviel Strom.

Seit 2024 privater BSH Nutzer. SHC II + 26 Geräte + 33 Automationen + 14 Zustände.
Samsung S22+, Samsung Tab S9 FE, ESP8266-basierte Geräte

Sulaco
Apprentice Homie

Danke für die schnelle und ausführliche Rückmeldung!

Ich hatte schon befürchtet, dass der Batteriebetrieb schwierig sein würde.

Muss dann mal schauen, wie ich dann Strom in die Ecke bekomme, wo deine Anzeige hinkommen soll.

 

Ich erzähle mal kurz, wofür ich die Anzeige hauptsächlich benötige:

Anfangs haben wir über die Handy App scharf und unscharf geschaltet. Das hatte leider zur Folge, dass oftmals gar nicht scharf geschaltet wurde oder kurz nach dem öffnen der Eingangstür der Alarm ausgelöst wurde.

Ich dachte mir, die praktikabelste Lösung wäre die Einbindung des Smartlocks von Yale.

Was ich damals noch nicht wusste: die Übermittlung der Schließzustände läuft über die Cloud und nicht über Lan oder ZigBee. Hin und wieder kommt es dadurch zu einer Verzögerung von 30 - 90 Sekunden (manchmal sogar noch mehr), bis der SHC mitbekommt, dass die Tür ordentlich geöffnet wurde. Dies führte immer wieder zu Fehlalarmen, da ich eine Alarm Verzögerung von 30 Sekunden und dann später 60 Sekunden eingestellt habe.

 

Es ist nervig immer erst aufs Handy zu schauen, ob wirklich unscharf geschaltet wurde, daher wäre ein kurzer Blick auf die Anzeige wesentlich angenehmer und auch verlässlicher, da ein rotes Blinken der LED direkt ins Auge sticht.

Daher muss ich den tatsächlichen Zustand der Alarmanlage abfragen können.

 

Sulaco
Apprentice Homie

Ich bräuchte mal deine Hilfe:

Hab wirklich viel gelesen und gesucht, bevor ich dich damit belästige.

Den LongPoll startest du über "com/bosch/sh/remote/userdefinedstates" und beschränkst damit die Nachrichten, die empfangen werden.

Ich finde aber nirgendwo eine Übersicht, wie die anderen Topics heißen. Finde nur Beispiele, wo über * alles abgerufen wird.

Ich dachte über die JSON Daten würde ich das ableiten können, aber die Userdefinitedstates haben den Typ  "@type": "userDefinedState" und nicht "userdefinedstates", wie ich erwarten würde

 

Hab hier schon einen kleinen Testaufbau mit deinem Programm laufen, warte jetzt noch auf das Gehäuse. Nachdem ich festgestellt habe, dass die Pinbelegung des Boards anders ist als auf der Webseite des Verkäufers angegeben, funktionierte alles! 

 

 

tobo123
Experienced Homie

Hey, ich antworte mal mit zwei Ideen 🙂

 

Ich verstehe, dass du dein Alarmsystem aus der App scharf stellst. Du hast recht, dass man das Alarmsystem nicht als Auslöser nutzen kann, um dann in einer Automation einen Zustand zu aktivieren, den meine Anzeige erkennt. Du kannst aber eine Automation ohne Auslöser und Bedingung erstellen, die das Alarmsystem aktiviert und einen Zustand "Alarm an" aktiviert, den dann meine Anzeige auslesen kann. Diese Automation kannst du dir auf die Favoritenseite legen und damit bequem dein Alarmsystem aktivieren. Analog dann auch fürs deaktivieren.

 

Möglichkeit 2 ist, dass du mein Programm abänderst und du den Long Poll auf /intrusion/states/system gibst (das hab ich zwar noch nicht probiert, sollte aber funktionieren). Du bekommst dann einen JSON zurück, der so aussieht:

 

 

{
  "systemAvailability": {
    "available": true,
    "deleted": true,
    "id": "string"
  },
  "armingState": {
    "remainingTimeUntilArmed": 0,
    "state": "SYSTEM_ARMING",
    "deleted": true,
    "id": "string"
  },
  "alarmState": {
    "value": "ALARM_OFF",
    "incidents": [
      {
        "id": "string",
        "triggerName": "string",
        "type": "SYSTEM_ARMED",
        "time": 0,
        "location": "string",
        "locationId": "string"
      }
    ],
    "deleted": true,
    "id": "string"
  },
  "activeConfigurationProfile": {
    "profileId": "string",
    "deleted": true,
    "id": "string"
  },
  "deleted": true,
  "id": "string"
}

 

 

Die Info, die du brauchst ist "armingState": {"state": "SYSTEM_ARMING"}. Da gibt es die Werte SYSTEM_DISARMED, SYSTEM_ARMED und SYSTEM_ARMING. Auch damit liese sich dann eine Led schalten. Du müsstest dann im Code ändern, wie der JSON decodiert wird.

 

Die API ist ünrigens hier dokumentiert: https://local.apidocs.bosch-smarthome.com/#/States/get_intrusion_states_system

 

Da ist auch die JSON-Antwort gezeigt.

Seit 2024 privater BSH Nutzer. SHC II + 26 Geräte + 33 Automationen + 14 Zustände.
Samsung S22+, Samsung Tab S9 FE, ESP8266-basierte Geräte

Sulaco
Apprentice Homie

Danke für die Hilfe!

 

Die Scharfschaltung übers Handy hat sich ja bei uns nicht wirklich gut funktioniert.
Daher wurde immer scharf geschaltet, wenn du mit dem Haustürschlüssel, die Tür verriegelt hast. Das bemerkt das Yale Smartschluss und gibt dem BHC den Befehlt zum scharf schalten bzw. zum deaktivieren.

 

 

Die Kommunikation zwischen dem Smartlock und dem BSH läuft aber über eine Cloud, die oftmals eine sehr große Verzögerung hatte. Länger als die eingestellte Alarmverzögerung, was dann immer zu Fehlalarmen geführt hat.

 

Daher brauchte ich eine Anzeige, die mir zuverlässig und auf einen Blick anzeigt, wie der Status der Alarmanlage ist ohne das wir erst auf das Handy blicken müssen.

 

Der Long Poll auf /intrusion/states/system gibt leider keine Daten raus (hab das über Postman geprüft) daher polle ich nun auf * 

Es hagelt dann zwar immer wieder DeserializationErrors, aber es geht trotzdem.

 

Dann musste ich noch ein wenig basteln, da die States wie SYSTEM_DISARMED zwar auf 1 gesetzt werden, aber nicht auf 0 wenn z.B. SYSTEM_ARMED auf 1 wechselt.

Ich wollte auch, dass die rote LED bei ARMING blinkt und bei ARMED dauerhaft leuchtet.

 

// Flip states

if (String(name) == "SYSTEM_ARMED")
{
analogWrite(parameter[0].pin, parameter[0].brightness);
state_array[0]=true;
state_array[1]=false;
state_array[2]=false;
digitalWrite(parameter[1].pin, false);
}

 

Meine Programmierfähigkeiten in C sind beschränkt, du hättest das bestimmt wesentlich eleganter lösen können .

Ich hab mir schon einen zweiten ESP32 Controller bestellt, wo ich im Nachgang mit experimentieren und bestimmt meinen Teil des Quellcodes optimieren kann

 

Jetzt nur noch alles in das Gehäuse verbauen (wenn es hoffentlich bald geliefert wird) und dann geht deine Anzeige in Betrieb!

 

PS: da die Bosch API per JSON auch Zustände verändern kann (z.B. scharf / unscharf schalten), möchte ich prüfen, ob YALE nicht auch eine Möglichkeit bietet, die Zustände des Schlosses per LAN über eine API auszulesen. Damit könnte ich die Cloud komplett übergehen und das lokal steuern.

Sulaco
Apprentice Homie

Heute ist die Anzeige in Betrieb gegangen und ich bin damit sehr zufrieden

 

Mittlerweile verstehe ich deinen Quellcode deutlich besser und muss sagen, ich ziehe meinen Hut vor dir!

Über ein x509 Zertifikat authentifizieren, Polling aktivieren, die Daten empfangen und auswerten und darauf die Aktionen schalten und dazu noch die Registrierung des Clients. Ohne deine Vorlage wäre ich da nie hingekommen.

 

Nochmal ein großes Dankeschön, dass du bereit bist dein Projekt "einfach so" mit anderen zu teilen

 

Es gab programmiertechnisch für mich noch einige Hürden zu nehmen:

z.B. bei dem long poll auf * wurde SYSTEM_ARMED an unterschiedlichen Stellen im JSON Array ausgegeben. 

Nachdem ich über den ArduinoJson Assistant vier unterschiedliche Varianten hinterlegt habe und es immer noch nicht zuverlässig lief, musste ein anderer Weg her:

 

int armed = json.indexOf("SYSTEM_ARMED");

if (armed > 0)
{
alarmanlagenstatus("SYSTEM_ARMED");
}
Somit war es dann nicht mehr wichtig, an welcher Stelle der Wert steht, da ich den kompletten JSON String auswerte und nicht die serialisierten Daten.
 
Die Leds haben die folgenden Funktionen:
Grün: Alarmanlage unscharf
Rot blinkend: Alarmanlage wird gerade scharf geschaltet
Rot permanent: Alarmanlage ist scharf
Blau: Fenster oder Türen sind während der Scharfschaltung auf Vollschutz geöffnet
Weiss: Haustür ist abgeschlossen
 
Bildschirmfoto 2025-01-18 um 18.52.28.png

 

tobo123
Experienced Homie

Hey, mega dass das mit dem Nachbauen funktioniert hat. Dann hat sich das Dokumentieren gelohnt. Und mit indexof hast du dein Problem ja auch geschickt gelöst 🙂

Seit 2024 privater BSH Nutzer. SHC II + 26 Geräte + 33 Automationen + 14 Zustände.
Samsung S22+, Samsung Tab S9 FE, ESP8266-basierte Geräte



Rechtswidrigen Inhalt melden