Atenuar dimmers BLE desde un slider del panel mediante un puente ESP32
Traducido del Türkçe por IA ·
Hola. En el taller tenemos 6 dimmers LED BLE baratos. Lo bueno es que el brillo se ajusta escribiendo un único byte entre 0 y 255 en una característica GATT; lo probé con nRF Connect y funciona. Monté un ESP32 como puente: se conecta a los dimmers por BLE y a Hermetry por Wi-Fi con MQTT. Los dimmers aparecen como dispositivos hijos de la pasarela, envío su brillo con v1/gw/telemetry y los gráficos llegan bien.Ahora puse un Slider en el panel, pero la tarjeta dice «Choose a command in this widget’s settings» y me he atascado. No sé dónde definir el comando ni cómo lo recibirá el ESP32. Como los dimmers son dispositivos separados, creo que tengo que vincular el slider al dispositivo hijo.
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.
Traducido del Türkçe por IA ·
¿Definiste el comando en la pestaña Commands de tu perfil? El panel solo puede enviar comandos del catálogo del perfil, no acepta métodos sin procesar.
Profilin Commands sekmesinde komut tanımladın mı? Pano sadece profilin kataloğundaki komutları gönderebiliyor, ham method kabul etmiyor.
Traducido del Türkçe por IA ·
Lo definí. light.set, con el parámetro level. Primero cambié el Tier a Privileged, recibí el error «This command cannot be sent from a board» y luego lo pasé a Basic. Pero al seleccionar el dispositivo hijo, el comando no se envía, se queda en Sent.
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.
Traducido del Türkçe por IA ·
El child recibe el comando, y el punto donde te atascas está en el lado del ESP32. Un comando enviado a un dispositivo detrás del gateway baja al gateway por v1/gw/rpc, y los cambios de atributos compartidos llegan por v1/gw/attributes. Tu código probablemente solo escucha v1/rpc/req/+, que es para los comandos propios del gateway. Por eso el comando se queda en Sent. Yo me quedé atascado exactamente en el mismo punto con las estaciones de agua.Esto es lo que hice:
- Añadí el comando light.set al perfil de los dimmers (no al del gateway), nivel Basic, parámetro level (Number, 0-100).
- En la tarjeta deslizador: Run a command: Device = child atolye-3, Command = light.set, para level The control’s value. Convierto el deslizador 0-100 a 0-255 en el lado del ESP32.
- Vinculé el slot Current value a la telemetría level del mismo child, para que la tarjeta muestre el valor real del dimmer.
- Para la luz desactivé Ask before running, para que no pida confirmación en cada desplazamiento.
En el lado del ESP32, después de cada conexión, suscríbete a v1/gw/rpc. Muestra primero el mensaje recibido en el puerto serie para ver su estructura, luego determina de ahí para qué child es y haz la escritura 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));
}
}
Las reglas de las tarjetas de control están aquí: 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ı
Traducido del Türkçe por IA ·
Funcionó, gracias. El ESP32 en realidad no estaba suscrito a v1/gw/rpc, y yo había puesto el comando en el perfil de la gateway. Añadí 6 sliders, cada uno vinculado a su propio child. Además, el slider solo envía al soltarlo. Pensaba que enviaba en cada movimiento y me estaba preparando para escribir una cola en el ESP32, pero ya no hace falta.
Ç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ı.
- Debes estar registrado para responder a este debate.
Únete a la conversación
Inicia sesión para preguntar y responder, dar me gusta a las publicaciones útiles y marcar la respuesta que resolvió tu problema. Cada aportación suma puntos y niveles.

