Cześć.
Mam pewien sterownik który na porcie szeregowym wypluwa dane, dane to temperatury.
Pomoglibyście ogarnąć kod dla esphome aby te temperatury wyłuskać do HA?
W przykładach widzę tylko konfigurację portu ale już odczytu nie.
“Dawno, dawno temu… w odległej galaktyce…”
Podaj jakieś konkrety, wtedy może ktoś pomoże.
W końcu się za to wziąłem.
Esp odbiera mi jakieś dane. Interwały czasowe odbiorów niby się zgadzają bo nadajnik wysyła co minutę i esp tak odbiera ale już odebrane dane są bez sensu.
Nadajnik wysyła takie dane (kod z Bascom):
$baud = 19200
If Minuty_spr <> Minuty Then 'co minute
Disable Interrupts
Stan_pompy = Pompa
Send(1) = Ts 'przepisz wartosci temperatur i stanu sterownika do zmiennej tablicowej
Send(2) = Tb
Send(3) = Tzew
Send(4) = Stan_zaworu
Send(5) = Stan_pompy
Send(6) = Stan_swiatla
Suma_crc_nadajnik = Crc16(send(1) , 12) 'oblicz sume kontrolna dla tablicy
Send(7) = Suma_crc_nadajnik 'dodaj sume kontrolna do tablicy
Printbin Send(1) ; 14 'i wyslij przez uart
Enable Interrupts
End If
Czyli wysyła on 14 bajtów.
Esp odbiera mi takie dane:
[08:14:26][D][uart_debug:158]: <<< "3\x004\x00\xF4\xFF\x00\x01\x00\x01\x00\xD5\xFE"
Baudrate esp ustawiony na 19200
Użyłem tego kodu dla esp:
uart:
- id: uart_bus1
tx_pin: 0
rx_pin: 2
baud_rate: 19200
debug:
direction: BOTH
dummy_receiver: true
sequence:
- lambda: UARTDebug::log_string(direction, bytes);
Dlaczego tak się dzieje?
Co do sensu danych to trudno się wypowiedzieć.
Co do ilości też Brakuje definicji “after” - w jakiś sposób odbiornik powinien się synchronizować z wysyłanymi danymi.
Nie masz czasami reszty bajtów w osobnej linii debug?
Sprawdź czy na pewno wysyłasz 14 bajtów
- UARTDebug::log_string(kierunek, bajty) Rejestruje bajty jako wartości łańcuchowe, unikając znaków niedrukowalnych.
Być może wszystko jest OK, i należy tylko użyć innej funkcji UARTDebug::…
Zmieniłem na:
UARTDebug::log_int(direction, bytes, ',');
No i powiem że w odebranych danych już widać interesujące mnie pozycje. Dziękuję za podsunięcie pozycji.
Teraz tylko potrzebuję te wartości “wydłubać” do HA.
W ogóle nie znam ESPHome i wszystkie rady wyczytałem w dokumentacji - więc polecam.
Próbowałem różnych sposobów, pytałem nawet chatbota i nie umiem wyciągnąć wartości temperatur do encji.
Chatbot podał mi taki kod ale esphome wyświetla błąd:
sensor:
- platform: template
sensors:
first_value:
friendly_name: "KOCIOŁ"
value_template: "{{ value.split(',')[0] | int }}"
second_value:
friendly_name: "ZASOBNIK C.W.U."
value_templte: "{{ value.split(',')[1] | int }}"
Pomoże mi ktoś pobrać pierwszą i trzecią wartość z tego ciągu odebranych danych?
Dane jakie obieram:
65,0,55,0,250,255,0,1,0,1,0,1,74,52
Jeśli o czymś piszesz to to pokaż! Wszystkiego trzeba się domyślać?
Próbujesz podzielić ten łańcuch za pomocą przecinków.
65,0,55,0,250,255,0,1,0,1,0,1,74,52
ale to jest tylko przezentacja bajtów w buforze, poza tym twoja liczba to int16 zapisywana w buforze jako kolejne dwa bajy .
i tak np dla trzeciej danej Tzew = 250,255 wynik to -6
Tak więc twój bufor to baty = B0 B1 B2 B3 B4 B5 … itd i aby wyliczyć Tzew = 256*B5 + B4
Dzięki za wskazówki.
Teraz próbuję wydzielić z tego ciągu wartości temperatur aby je wrzucić do encji.
Bardzo kiepsko mi to idzie, jak na razie bez rezultatu.