Bonjour
J’ai une télécommande IR qui possède un port série (UART).
J’écoute ce port avec un ESP8266 pour comprendre les échanges série.
Voici mon code :
uart:
- id: uart_bus
tx_pin: D5
rx_pin: D6
baud_rate: 9600
stop_bits: 1
debug:
direction: BOTH
dummy_receiver: true
after:
bytes: 256
sequence:
- lambda: UARTDebug::log_hex(direction, bytes, ':');
Et ce que je vois dans la fenêtre debug :
[14:08:27][D][uart_debug:109]: <<< 56:62:02:6C:18:00
[14:08:28][D][uart_debug:109]: >>> 2F:33:0A
[14:08:29][D][uart_debug:109]: <<< 56:62:02:6C:18:00
[14:08:30][D][uart_debug:109]: >>> 2F:33:0A
[14:08:31][D][uart_debug:109]: <<< 56:62:02:6C:18:00
[14:08:32][D][uart_debug:109]: >>> 2F:33:0A
Je visualise donc parfaitement les échanges UART.
Je me suis alors attelé à faire un ‹ Custom Text Sensor › que voici :
#include "esphome.h"
class UartReadLineSensor_rx : public Component, public UARTDevice, public TextSensor {
public:
UartReadLineSensor_rx(UARTComponent *parent) : UARTDevice(parent) {}
void setup() override {
// nothing to do here
}
int readline(int readch, char *buffer, int len)
{
static int pos = 0;
int rpos;
if (readch > 0) {
switch (readch) {
case 0x0A: // Return on CR
rpos = pos;
pos = 0; // Reset position index ready for next time
return rpos;
case 0x00: // Return on CR
rpos = pos;
pos = 0; // Reset position index ready for next time
return rpos;
default:
if (pos < len-1) {
buffer[pos++] = readch;
buffer[pos] = 0;
}
}
}
return -1; // No end of line has been found, so return -1.
}
void loop() override {
const int max_line_length = 80;
static char buffer[max_line_length];
while (available()) {
if(readline(read(), buffer, max_line_length) > 0) {
publish_state(buffer);
}
}
}
};
et le YAML correspondant :
text_sensor:
- platform: custom
lambda: |-
auto remote = new UartReadLineSensor_rx(id(uart_bus));
App.register_component(remote);
return {remote};
text_sensors:
id: "remote"
name: "Télécommande IR"
Seulement voilà…
Les échanges que je vois parfaitement en ‹ debug › ne remontent pas en ‹ text_sensor › et je ne comprends pas pourquoi…
Qui pourrait m’orienter sur la solution ?
Je souhaite récupérer dans Home Assistant le code reçu : 56:62:02:6C:18:00
et émettre depuis home Assistant l’accusé de réception : 2F:33:0A
Par avance merci.
Bruno