Kun varovasti aloitin ja yritin keksiä sarjaliikennenuuskun tolle esp-palikalle, siitä olis voinu sit jatkaa vähän pidemmällekin, jos sais toimimaan... Äkkiä hakemalla en tosiaan löytäny yhtään sopivaa mallia, kun täysin noita hienoja kieliä osaamattomana en itse saa tehtyä mitään. Paitsi vähän editoida selkeitä paikkoja. Niinpä kyselin siltä tekoälyltä, vaan ei sekään osannu. Pitäis lukea sarjaliikennettä 100baud ja 6 tavua. Tavut tulee reverse-order, eli msb-edellä.
Pistän tähän nyt tekoälyn parhaat ehdotukset, jos joku osaava kertois, missä meni mettään. Eivät ole kauheen pitkiä kuitenkaan... Ehkä parhaimman virheilmo on tämmönen:
/config/esphome/vilp-data.yaml: In lambda function:/config/esphome/vilp-data.yaml:41:30: error: expected type-specifier before 'CustomComponent' 41 | auto custom_comp = new CustomComponent(&uart_bus); | ^~~~~~~~~~~~~~~
Toi nyt rivittyy väärin tähän. Yaml:
Koodi:
esphome:
name: vilp-data
friendly_name: Vilp data
esp8266:
board: esp01_1m
# Enable logging
logger:
level: DEBUG
# Enable Home Assistant API
api:
encryption:
key: "ouRmAxBaZ1oHNnBGkywWuSptdY7auzRV5Hw399tJPlQ="
ota:
- platform: esphome
password: "cf83c54e7343ce16a80ed154e5d0a2e5"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Vilp-Data Fallback Hotspot"
password: "qx7Oaw19mOdG"
uart:
tx_pin: GPIO1 # Sarjaliikenteen TX-pin
rx_pin: GPIO3 # Sarjaliikenteen RX-pin
baud_rate: 100 # Mukautettu baud-nopeus
stop_bits: 1
parity: ODD # Mukautettu parity-asetus
id: uart_bus
external_components:
- source: "custom_component"
custom_component:
- lambda: |-
auto custom_comp = new CustomComponent(&uart_bus);
App.register_component(custom_comp);
return {};
Ja sitten kaksi lisäkoodia, jotka kyllä on oikeessa paikassa ja löytyvät kääntäjälle. custom_component.h tässä:
Koodi:
#pragma once
#include "esphome.h"
class CustomComponent : public Component, public UARTDevice {
public:
CustomComponent(UARTComponent *parent);
void setup() override;
void loop() override;
private:
uint8_t reverse_byte(uint8_t byte);
};
Ja custom_component.cpp:
Koodi:
#include "custom_component.h"
CustomComponent::CustomComponent(UARTComponent *parent) : UARTDevice(parent) {}
void CustomComponent::setup() {
ESP_LOGD("CustomComponent", "Setup complete");
}
void CustomComponent::loop() {
if (available() >= 6) { // Odottaa 6 tavua
uint8_t data[6];
for (int i = 0; i < 6; i++) {
data[i] = read(); // Lue tavu
}
// Käännä MSB-ensimmäinen data
for (int i = 0; i < 6; i++) {
data[i] = reverse_byte(data[i]);
}
// Tarkista tarkiste
uint8_t checksum = 0;
for (int i = 0; i < 5; i++) {
checksum -= data[i];
}
if (checksum == data[5]) {
ESP_LOGD("CustomComponent", "Data valid: %02X %02X %02X %02X %02X %02X",
data[0], data[1], data[2], data[3], data[4], data[5]);
} else {
ESP_LOGW("CustomComponent", "Checksum error!");
}
}
}
uint8_t CustomComponent::reverse_byte(uint8_t byte) {
uint8_t result = 0;
for (int i = 0; i < 8; i++) {
if (byte & (1 << i)) {
result |= (1 << (7 - i));
}
}
return result;
}
Tulihan tuosta sit kuitenkin aika hankalasti luettava, anteeksi siitä. Laitetaas koodina vielä se virheilmokin:
Koodi:
/config/esphome/vilp-data.yaml: In lambda function:/config/esphome/vilp-data.yaml:41:30: error: expected type-specifier before 'CustomComponent' 41 | auto custom_comp = new CustomComponent(&uart_bus); | ^~~~~~~~~~~~~~~*** [.pioenvs/vilp-data/src/main.cpp.o] Error 1========================= [FAILED] Took 12.39 seconds ====================