From 61c25ae82221698b6883aa08123996537f72b94a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Koek?= Date: Fri, 2 Feb 2024 13:13:55 +0000 Subject: [PATCH] more updates --- .../components/ebyte_lora_e220/__init__.py | 73 +++++++++++++------ .../ebyte_lora_e220/ebyte_lora_e220.cpp | 24 +++++- .../ebyte_lora_e220/ebyte_lora_e220.h | 24 +++--- 3 files changed, 89 insertions(+), 32 deletions(-) diff --git a/esphome/components/ebyte_lora_e220/__init__.py b/esphome/components/ebyte_lora_e220/__init__.py index 07d4454f1a..59948e8c5e 100644 --- a/esphome/components/ebyte_lora_e220/__init__.py +++ b/esphome/components/ebyte_lora_e220/__init__.py @@ -3,48 +3,72 @@ import esphome.config_validation as cv from esphome import pins from esphome.components import sensor, text_sensor, uart from esphome.const import * -ebyte_lora_e220_ns = cg.esphome_ns.namespace('ebyte_lora_e220') -EbyteLoraE220 = ebyte_lora_e220_ns.class_('EbyteLoraE220', cg.PollingComponent) -DEPENDENCIES = ['uart'] -AUTO_LOAD = ['uart', 'sensor', 'text_sensor'] +ebyte_lora_e220_ns = cg.esphome_ns.namespace("ebyte_lora_e220") +EbyteLoraE220 = ebyte_lora_e220_ns.class_( + "EbyteLoraE220", cg.Component, uart.UARTDevice +) + +DEPENDENCIES = ["uart"] +AUTO_LOAD = ["uart", "sensor", "text_sensor"] CONF_PIN_AUX = "pin_aux" CONF_PIN_M0 = "pin_m0" CONF_PIN_M1 = "pin_m1" -CONF_LORA_STATUS = "lora_status" CONF_LORA_MESSAGE = "lora_message" CONF_LORA_RSSI = "lora_rssi" -CONFIG_SCHEMA = cv.Schema({ - cv.GenerateID(): cv.declare_id(EbyteLoraE220), - cv.Required(CONF_PIN_AUX): pins.gpio_input_pin_schema, - cv.Required(CONF_PIN_M0): pins.gpio_output_pin_schema, - cv.Required(CONF_PIN_M1): pins.gpio_output_pin_schema, - cv.Optional(CONF_LORA_MESSAGE): text_sensor.text_sensor_schema(entity_category=ENTITY_CATEGORY_NONE,), - cv.Optional(CONF_LORA_STATUS): text_sensor.text_sensor_schema(entity_category=ENTITY_CATEGORY_DIAGNOSTIC,), - cv.Optional(CONF_LORA_RSSI): - sensor.sensor_schema(device_class=DEVICE_CLASS_SIGNAL_STRENGTH,unit_of_measurement=UNIT_DECIBEL_MILLIWATT,accuracy_decimals=0,state_class=STATE_CLASS_MEASUREMENT).extend(), +CONFIG_SCHEMA = ( + cv.Schema( + { + # if you send gps locations over lora, this will be able to read it + cv.Optional(CONF_LATITUDE): sensor.sensor_schema( + unit_of_measurement=UNIT_DEGREES, + accuracy_decimals=6, + ), + # if you send gps locations over lora, this will be able to read it + cv.Optional(CONF_LONGITUDE): sensor.sensor_schema( + unit_of_measurement=UNIT_DEGREES, + accuracy_decimals=6, + ), + cv.GenerateID(): cv.declare_id(EbyteLoraE220), + # for communication to let us know that we can receive data + cv.Required(CONF_PIN_AUX): pins.gpio_input_pin_schema, + # for communication set the mode + cv.Required(CONF_PIN_M0): pins.gpio_output_pin_schema, + # for communication set the mode + cv.Required(CONF_PIN_M1): pins.gpio_output_pin_schema, + # if you want to see the raw messages + cv.Optional(CONF_LORA_MESSAGE): text_sensor.text_sensor_schema( + entity_category=ENTITY_CATEGORY_NONE, + ), + # if you want to see the rssi + cv.Optional(CONF_LORA_RSSI): sensor.sensor_schema( + device_class=DEVICE_CLASS_SIGNAL_STRENGTH, + unit_of_measurement=UNIT_DECIBEL_MILLIWATT, + accuracy_decimals=0, + state_class=STATE_CLASS_MEASUREMENT, + ), + } + ) + # check values every 20s + .extend(cv.polling_component_schema("20s")).extend(uart.UART_DEVICE_SCHEMA) +) -}).extend(uart.UART_DEVICE_SCHEMA) async def to_code(config): var = cg.new_Pvariable(config[CONF_ID]) await cg.register_component(var, config) await uart.register_uart_device(var, config) - + p = await cg.gpio_pin_expression(config[CONF_PIN_AUX]) cg.add(var.set_pin_aux(p)) - + p = await cg.gpio_pin_expression(config[CONF_PIN_M0]) cg.add(var.set_pin_m0(p)) p = await cg.gpio_pin_expression(config[CONF_PIN_M1]) cg.add(var.set_pin_m1(p)) - if CONF_LORA_STATUS in config: - sens = await text_sensor.new_text_sensor(config[CONF_LORA_STATUS]) - cg.add(var.set_status_sensor(sens)) - if CONF_LORA_MESSAGE in config: sens = await text_sensor.new_text_sensor(config[CONF_LORA_MESSAGE]) cg.add(var.set_message_sensor(sens)) @@ -53,4 +77,11 @@ async def to_code(config): sens = await sensor.new_sensor(config[CONF_LORA_RSSI]) cg.add(var.set_rssi_sensor(sens)) + # if you are sending gps data over lora + if CONF_LATITUDE in config: + sens = await sensor.new_sensor(config[CONF_LATITUDE]) + cg.add(var.set_latitude_sensor(sens)) + if CONF_LONGITUDE in config: + sens = await sensor.new_sensor(config[CONF_LONGITUDE]) + cg.add(var.set_longitude_sensor(sens)) diff --git a/esphome/components/ebyte_lora_e220/ebyte_lora_e220.cpp b/esphome/components/ebyte_lora_e220/ebyte_lora_e220.cpp index 504959a844..a304536826 100644 --- a/esphome/components/ebyte_lora_e220/ebyte_lora_e220.cpp +++ b/esphome/components/ebyte_lora_e220/ebyte_lora_e220.cpp @@ -2,7 +2,20 @@ namespace esphome { namespace ebyte_lora_e220 { +void EbyteLoraE220::update() { + if (this->latitude_sensor_ != nullptr) + this->latitude_sensor_->publish_state(this->latitude_); + if (this->longitude_sensor_ != nullptr) + this->longitude_sensor_->publish_state(this->longitude_); + + if (this->rssi_sensor != nullptr) + this->rssi_sensor->publish_state(this->rssi_); + + // raw info + if (this->message_text_sensor != nullptr) + this->message_text_sensor->publish_state(this->raw_message_); +} void EbyteLoraE220::setup() { this->pin_aux->setup(); this->pin_m0->setup(); @@ -131,8 +144,15 @@ void EbyteLoraE220::loop() { } } ESP_LOGD(TAG, "%s", buffer); - this->message_text_sensor->publish_state(buffer.substr(0, buffer.length() - 1)); - this->rssi_sensor->publish_state(atoi(buffer.substr(buffer.length() - 1, 1).c_str())); + raw_message_ = buffer.substr(0, buffer.length() - 1); + if (raw_message_.find('gps:') != std::string::npos) { + int start = raw_message_.find(','); + // minus gps + latitude_ = atof(raw_message_.substr(4, start).c_str()); + latitude_ = atof(raw_message_.substr(start + 1, raw_message_.length()).c_str()); + } + // set the rssi + rssi_ = atoi(buffer.substr(buffer.length() - 1, 1).c_str()); } } // namespace ebyte_lora_e220 diff --git a/esphome/components/ebyte_lora_e220/ebyte_lora_e220.h b/esphome/components/ebyte_lora_e220/ebyte_lora_e220.h index 22f3a24c18..3c01f0b7c0 100644 --- a/esphome/components/ebyte_lora_e220/ebyte_lora_e220.h +++ b/esphome/components/ebyte_lora_e220/ebyte_lora_e220.h @@ -26,14 +26,16 @@ enum MODE_TYPE { MODE_3_SLEEP = 3, MODE_INIT = 0xFF }; -class EbyteLoraE220 : public Component, public uart::UARTDevice { +class EbyteLoraE220 : public PollingComponent, public uart::UARTDevice { public: void setup() override; + void update() override; void loop() override; void dump_config() override; // local + void set_latitude_sensor(sensor::Sensor *latitude_sensor) { latitude_sensor_ = latitude_sensor; } + void set_longitude_sensor(sensor::Sensor *longitude_sensor) { longitude_sensor_ = longitude_sensor; } void set_message_sensor(text_sensor::TextSensor *s) { message_text_sensor = s; } - void set_status_sensor(text_sensor::TextSensor *s) { status_text_sensor = s; } void set_rssi_sensor(sensor::Sensor *s) { rssi_sensor = s; } void set_pin_aux(GPIOPin *s) { pin_aux = s; } void set_pin_m0(GPIOPin *s) { pin_m0 = s; } @@ -47,13 +49,17 @@ class EbyteLoraE220 : public Component, public uart::UARTDevice { bool waitCompleteResponse(unsigned long timeout = 1000, unsigned int waitNoAux = 100); protected: - std::vector buffer_; - text_sensor::TextSensor *message_text_sensor; - text_sensor::TextSensor *status_text_sensor; - sensor::Sensor *rssi_sensor; - GPIOPin *pin_aux; - GPIOPin *pin_m0; - GPIOPin *pin_m1; + int rssi_ = 0; + float latitude_ = -1; + float longitude_ = -1; + std::string raw_message_; + sensor::Sensor *latitude_sensor_{nullptr}; + sensor::Sensor *longitude_sensor_{nullptr}; + text_sensor::TextSensor *message_text_sensor{nullptr}; + sensor::Sensor *rssi_sensor{nullptr}; + GPIOPin *pin_aux{nullptr}; + GPIOPin *pin_m0{nullptr}; + GPIOPin *pin_m1{nullptr}; }; } // namespace ebyte_lora_e220