Forum Francophone Home Assistant

Lecture UART

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…

image

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

A vu de nez ça ressemble à un problème de conversion binaire/texte, il faudrait les convertir en ASCII pour l’affichage.

Pour pas vous fatiguer vous pouvez mettre les case avec le même code l’un sous l’autre

		case 0x0A: 		// Return on CR
		case 0x00: 		// Return on CR

Si nécessaire il faudrait aussi traiter le cas ou vous avez rempli votre buffer sans rencontrer de retour à la ligne sinon vous risquez d’être bloqué indéfiniment.

En effet, c’est bien vu.
Mon code à bien changé depuis ce post mais un simple ‹ to_string › et c’est bon.
Merci pour la simplification des ‹ case › l’un sous l’autre et au plaisir. :wink:

1 J'aime