Skocz do zawartości

Pomocna odpowiedź

  • 9 miesiące później...

@Woszu w sumie ten temat gdzieś u mnie przepadł - miałem plan dodać to jako sterownik do wyświetlacza spektrum ale nie skończyłem wyświetlacza więc nie było okazji do kontynuacji.

Dodanie większej liczby własnych komponentów jest w tym miejscu:

sensor:
- platform: custom
  lambda: |-
    auto fps_meter = new FPSCounter();
    App.register_component(fps_meter);
    return {fps_meter};

jest to podobne do klas z C++, a przez dziedziczenie po Component i Sensor masz wystawione metody do łączenia z resztą.

Zrobiłem tak:

	sensor:
	- platform: custom
	  lambda: |-
	    auto my_sensor = new MyCustomSensor();
	    App.register_component(my_sensor);
	    return {my_sensor->water_sensor, my_sensor->id_sensor};
	 
	  sensors:
	  - name: "Stan licznika wody"
	    unit_of_measurement: l
	    accuracy_decimals: 0
	  - name: "Id licznika wody"
	    accuracy_decimals: 0
	

 

a w pliku .h:

	class MyCustomSensor : public Component {
 public:
  Sensor *water_sensor = new Sensor();                            
  Sensor *id_sensor = new Sensor();
	//............
	{
	

 

Kompilacja przeszła, później zobaczę czy działa 🙂

  • 1 miesiąc później...
(edytowany)

Cześć.

Walczę jeszcze z tym custom sensor component. W sumie z sukcesami, ale....

Prosty przykład przepisania wartości MeterID i jej opublikowanie w pliku h:

uint32_t MeterID = 1095753644;

class MyCustomSensor : public Component {
 public:                          
  Sensor *id_sensor = new Sensor();                              
  
void loop() { 
        id_sensor->publish_state(MeterID);
    }

 

natomiast w pliku yaml standardowo:

- platform: custom
  lambda: |-
    auto my_sensor = new MyCustomSensor();
    App.register_component(my_sensor);
    return {my_sensor->id_sensor}; 
  sensors:
  - name: "Meter Id"
    accuracy_decimals: 0

 

I coś dziwnego się dzieje, bo nie przechodzi ta wartość 1095753644 poprawnie. W esphome dostaję 1095753600.

Jakieś ograniczenia są w tym publish_state(), że mi obcina wartość?

Jak przesyłam mniejsze wartości (np. 10957536), to wtedy przechodzi ok....

Edytowano przez Woszu
  • 2 lat(a) później...

Trafiłem na ten stary wątek więc go rozwiążę żeby na później już było 🙂

 

publish_state() w ESPHome nie przyjmuje uint32_t, tylko float (dokładnie: void publish_state(float state) - bo cała klasa Sensor w ESPHome jest float-based).

Co to oznacza?

  • float w ESP32/Arduino ma 32 bity i tylko ok. 7 cyfr znaczących.

  • Twoje 1095753644 mieści się w uint32_t, ale jako float nie da się go zapisać dokładnie.

  • Stąd „obcina” i dostajesz najbliższą możliwą wartość, czyli 1095753600.

Dlatego mniejsze liczby (np. 10957536) wyglądają poprawnie, bo nadal mieszczą się w dokładności float.

 

Co możesz zrobić:

Traktować ID jako string (bo to nie jest liczba do obliczeń, tylko identyfikator).

cpp

TextSensor *id_sensor = new TextSensor();

void loop() override {
    id_sensor->publish_state(String(MeterID).c_str());
}

w YAML wtedy

- platform: custom
  lambda: |-
    auto my_sensor = new MyCustomSensor();
    App.register_component(my_sensor);
    return {my_sensor->id_sensor};
  text_sensors:
    - name: "Meter Id"
  • Jeśli musi być liczba, to możesz przechowywać w dwóch polach (np. dzieląc na starsze i młodsze 16 bitów), albo jako uint32_t w global i tylko raportować jako string do HA.

  • Ewentualnie użyj number lub template w HA i wysyłaj przez ESPHome API jako tekst, a potem konwertuj tam gdzie trzeba.

  • Lubię! 2

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...