BLE-Dimmer über einen Slider im Dashboard steuern, mit einer ESP32-Bridge
Von Türkçe mit KI übersetzt ·
Hallo. In der Werkstatt haben wir 6 günstige BLE-LED-Dimmer. Das Gute ist, dass die Helligkeit durch Schreiben eines einzelnen Bytes zwischen 0 und 255 in eine einzige GATT-Characteristic eingestellt wird. Ich habe es mit nRF Connect getestet und es funktioniert. Ich habe einen ESP32 als Bridge aufgebaut: Er verbindet sich per BLE mit den Dimmern und per Wi-Fi mit MQTT zu Hermetry. Die Dimmer erscheinen als Child-Geräte des Gateways, ich sende ihre Helligkeit mit v1/gw/telemetry, und die Diagramme kommen an.Jetzt habe ich einen Slider auf das Dashboard gesetzt, aber auf der Karte steht „Choose a command in this widget’s settings“ und ich komme nicht weiter. Ich weiß nicht, wo ich den Befehl definieren soll und wie der ESP32 ihn empfängt. Da die Dimmer eigenständige Geräte sind, denke ich, dass ich den Slider mit dem Child-Gerät verbinden muss.
Selam. Atölyede 6 tane ucuz BLE LED dimmer var. Güzel tarafı, parlaklık tek bir GATT karakteristiğine 0-255 arası tek bayt yazılarak ayarlanıyor, nRF Connect ile denedim çalışıyor. Bir ESP32’yi köprü yaptım: BLE’den dimmer’lara bağlanıyor, Wi-Fi’dan MQTT ile Hermetry’ye bağlı. Dimmer’lar gateway’in child cihazları olarak görünüyor, v1/gw/telemetry ile parlaklıklarını gönderiyorum, grafikleri geliyor.
Şimdi panoya bir Slider koydum ama kartta „Choose a command in this widget’s settings“ yazıyor ve takıldım. Komutu nereye tanımlayacağımı ve ESP32’nin bunu nasıl alacağını bilmiyorum. Dimmer’lar ayrı ayrı cihaz olduğu için slider’ı child cihaza bağlamam gerekir diye düşündüm.
Von Türkçe mit KI übersetzt ·
Hast du den Befehl im Reiter Commands deines Profils definiert? Das Dashboard kann nur Befehle aus dem Katalog des Profils senden und akzeptiert keine rohen Methoden.
Profilin Commands sekmesinde komut tanımladın mı? Pano sadece profilin kataloğundaki komutları gönderebiliyor, ham method kabul etmiyor.
Von Türkçe mit KI übersetzt ·
Ich habe es definiert. light.set, mit dem Parameter level. Zuerst habe ich den Tier auf Privileged gesetzt, bekam die Fehlermeldung „This command cannot be sent from a board“ und habe ihn dann auf Basic zurückgestellt. Wenn ich aber das Child-Gerät auswähle, wird der Befehl nicht gesendet, er bleibt bei Sent hängen.
Tanımladım. light.set diye, parametre level. Tier’ı Privileged yaptım önce, „This command cannot be sent from a board“ hatası aldım, Basic’e çektim. Ama child cihazı seçince komut gitmiyor, Sent’te kalıyor.
Von Türkçe mit KI übersetzt ·
Der Child-Device bekommt den Befehl, und die Stelle, an der du hängst, ist die ESP32-Seite. Ein Befehl an ein Gerät hinter dem Gateway kommt über v1/gw/rpc beim Gateway an, Änderungen an Shared Attributes kommen über v1/gw/attributes. Dein Code hört wahrscheinlich nur auf v1/rpc/req/+, und das gilt für die eigenen Befehle des Gateways. Deshalb bleibt der Befehl im Status Sent. Bei den Wasserstationen bin ich genau an derselben Stelle hängengeblieben.Das habe ich gemacht:
- Den Befehl light.set zum Profil der Dimmer hinzugefügt (nicht zu dem des Gateways), Basic Tier, Parameter level (Number, 0-100).
- In der Slider-Karte: Run a command: Device = atolye-3 Child, Command = light.set, für level The control’s value. Den Slider 0-100 wandle ich auf der ESP32-Seite in 0-255 um.
- Den Slot Current value mit der Level-Telemetrie desselben Child verbunden, damit die Karte den echten Wert des Dimmers anzeigt.
- Für das Licht habe ich Ask before running ausgeschaltet, damit bei jedem Verschieben keine Bestätigung abgefragt wird.
Auf der ESP32-Seite abonnierst du nach jeder Verbindung v1/gw/rpc. Gib die eingehende Nachricht zuerst auf der seriellen Schnittstelle aus und schau dir ihre Struktur an. Daraus bestimmst du, für welches Child sie gedacht ist, und schreibst dann per BLE:
mqtt.subscribe("v1/gw/rpc", 1);
void onMsg(char* topic, byte* payload, unsigned int len) {
if (strcmp(topic, "v1/gw/rpc") == 0) {
Serial.write(payload, len); // önce yapıya bak
Serial.println();
// child adını ve level'ı çöz:
// bleSetLevel(name, map(level, 0, 100, 0, 255));
}
}
Die Regeln für Kontrollkarten findest du hier: Kontrol kartları
Child’a komut gidiyor, takıldığın yer ESP32 tarafı. Gateway arkasındaki bir cihaza gönderilen komut gateway’e v1/gw/rpc üzerinden iniyor, shared attribute değişiklikleri de v1/gw/attributes üzerinden. Senin kod büyük ihtimalle sadece v1/rpc/req/+ dinliyor, o da gateway’in kendi komutları için. Komut o yüzden Sent’te kalıyor. Ben de su istasyonlarında aynı yerde takılmıştım.
Yaptığım şey şöyle:
- light.set komutunu dimmer’ların profiline ekle (gateway’inkine değil), Basic tier, parametre level (Number, 0-100).
- Slider kartında Run a command: Device = atolye-3 child’ı, Command = light.set, level için The control’s value. 0-100 slider’ı ESP32 tarafında 0-255’e çeviriyorum.
- Current value slot’unu aynı child’ın level telemetrisine bağla, kart dimmer’ın gerçek değerini göstersin.
- Işık için Ask before running’i kapattım, her kaydırmada onay sormasın.
ESP32 tarafında her bağlantıdan sonra v1/gw/rpc‚ye abone ol. Gelen mesajı önce seri porta bastırıp yapısına bak, hangi child için geldiğini oradan çözüp BLE yazmasını yaparsın:
mqtt.subscribe("v1/gw/rpc", 1);
void onMsg(char* topic, byte* payload, unsigned int len) {
if (strcmp(topic, "v1/gw/rpc") == 0) {
Serial.write(payload, len); // önce yapıya bak
Serial.println();
// child adını ve level'ı çöz:
// bleSetLevel(name, map(level, 0, 100, 0, 255));
}
}
Kontrol kartlarının kuralları burada: Kontrol kartları
Von Türkçe mit KI übersetzt ·
Hat funktioniert, danke. Der ESP32 hat tatsächlich nicht auf v1/gw/rpc abonniert, und den Befehl hatte ich im Profil des Gateways hinterlegt. Ich habe 6 Slider angelegt, jeder davon ist an sein eigenes Child gebunden. Außerdem sendet der Slider erst beim Loslassen. Ich dachte, er sendet bei jeder Bewegung, und wollte schon eine Warteschlange auf dem ESP32 programmieren, aber das ist jetzt nicht mehr nötig.
Çalıştı, sağ olun. ESP32 gerçekten v1/gw/rpc’ye abone değilmiş, komutu da gateway’in profiline koymuşum. 6 slider koydum, her biri kendi child’ına bağlı. Bir de slider sadece bırakınca gönderiyor, ben her harekette gidiyor sanıp ESP32’de kuyruk yazmaya hazırlanıyordum, gerek kalmadı.
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.
Mitdiskutieren
Melde dich an, um Fragen zu stellen und zu beantworten, hilfreiche Beiträge mit „Gefällt mir“ zu markieren und die Antwort zu kennzeichnen, die dein Problem gelöst hat. Jeder Beitrag bringt Punkte und Stufen.

