more updates

This commit is contained in:
Daniël Koek 2024-02-02 13:13:55 +00:00
parent 033475bc83
commit 61c25ae822
3 changed files with 89 additions and 32 deletions

View file

@ -3,48 +3,72 @@ import esphome.config_validation as cv
from esphome import pins from esphome import pins
from esphome.components import sensor, text_sensor, uart from esphome.components import sensor, text_sensor, uart
from esphome.const import * 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'] ebyte_lora_e220_ns = cg.esphome_ns.namespace("ebyte_lora_e220")
AUTO_LOAD = ['uart', 'sensor', 'text_sensor'] 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_AUX = "pin_aux"
CONF_PIN_M0 = "pin_m0" CONF_PIN_M0 = "pin_m0"
CONF_PIN_M1 = "pin_m1" CONF_PIN_M1 = "pin_m1"
CONF_LORA_STATUS = "lora_status"
CONF_LORA_MESSAGE = "lora_message" CONF_LORA_MESSAGE = "lora_message"
CONF_LORA_RSSI = "lora_rssi" CONF_LORA_RSSI = "lora_rssi"
CONFIG_SCHEMA = cv.Schema({ CONFIG_SCHEMA = (
cv.GenerateID(): cv.declare_id(EbyteLoraE220), cv.Schema(
cv.Required(CONF_PIN_AUX): pins.gpio_input_pin_schema, {
cv.Required(CONF_PIN_M0): pins.gpio_output_pin_schema, # if you send gps locations over lora, this will be able to read it
cv.Required(CONF_PIN_M1): pins.gpio_output_pin_schema, cv.Optional(CONF_LATITUDE): sensor.sensor_schema(
cv.Optional(CONF_LORA_MESSAGE): text_sensor.text_sensor_schema(entity_category=ENTITY_CATEGORY_NONE,), unit_of_measurement=UNIT_DEGREES,
cv.Optional(CONF_LORA_STATUS): text_sensor.text_sensor_schema(entity_category=ENTITY_CATEGORY_DIAGNOSTIC,), accuracy_decimals=6,
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(), # 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): async def to_code(config):
var = cg.new_Pvariable(config[CONF_ID]) var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config) await cg.register_component(var, config)
await uart.register_uart_device(var, config) await uart.register_uart_device(var, config)
p = await cg.gpio_pin_expression(config[CONF_PIN_AUX]) p = await cg.gpio_pin_expression(config[CONF_PIN_AUX])
cg.add(var.set_pin_aux(p)) cg.add(var.set_pin_aux(p))
p = await cg.gpio_pin_expression(config[CONF_PIN_M0]) p = await cg.gpio_pin_expression(config[CONF_PIN_M0])
cg.add(var.set_pin_m0(p)) cg.add(var.set_pin_m0(p))
p = await cg.gpio_pin_expression(config[CONF_PIN_M1]) p = await cg.gpio_pin_expression(config[CONF_PIN_M1])
cg.add(var.set_pin_m1(p)) 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: if CONF_LORA_MESSAGE in config:
sens = await text_sensor.new_text_sensor(config[CONF_LORA_MESSAGE]) sens = await text_sensor.new_text_sensor(config[CONF_LORA_MESSAGE])
cg.add(var.set_message_sensor(sens)) 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]) sens = await sensor.new_sensor(config[CONF_LORA_RSSI])
cg.add(var.set_rssi_sensor(sens)) 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))

View file

@ -2,7 +2,20 @@
namespace esphome { namespace esphome {
namespace ebyte_lora_e220 { 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() { void EbyteLoraE220::setup() {
this->pin_aux->setup(); this->pin_aux->setup();
this->pin_m0->setup(); this->pin_m0->setup();
@ -131,8 +144,15 @@ void EbyteLoraE220::loop() {
} }
} }
ESP_LOGD(TAG, "%s", buffer); ESP_LOGD(TAG, "%s", buffer);
this->message_text_sensor->publish_state(buffer.substr(0, buffer.length() - 1)); raw_message_ = buffer.substr(0, buffer.length() - 1);
this->rssi_sensor->publish_state(atoi(buffer.substr(buffer.length() - 1, 1).c_str())); 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 } // namespace ebyte_lora_e220

View file

@ -26,14 +26,16 @@ enum MODE_TYPE {
MODE_3_SLEEP = 3, MODE_3_SLEEP = 3,
MODE_INIT = 0xFF MODE_INIT = 0xFF
}; };
class EbyteLoraE220 : public Component, public uart::UARTDevice { class EbyteLoraE220 : public PollingComponent, public uart::UARTDevice {
public: public:
void setup() override; void setup() override;
void update() override;
void loop() override; void loop() override;
void dump_config() override; void dump_config() override;
// local // 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_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_rssi_sensor(sensor::Sensor *s) { rssi_sensor = s; }
void set_pin_aux(GPIOPin *s) { pin_aux = s; } void set_pin_aux(GPIOPin *s) { pin_aux = s; }
void set_pin_m0(GPIOPin *s) { pin_m0 = 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); bool waitCompleteResponse(unsigned long timeout = 1000, unsigned int waitNoAux = 100);
protected: protected:
std::vector<uint8_t> buffer_; int rssi_ = 0;
text_sensor::TextSensor *message_text_sensor; float latitude_ = -1;
text_sensor::TextSensor *status_text_sensor; float longitude_ = -1;
sensor::Sensor *rssi_sensor; std::string raw_message_;
GPIOPin *pin_aux; sensor::Sensor *latitude_sensor_{nullptr};
GPIOPin *pin_m0; sensor::Sensor *longitude_sensor_{nullptr};
GPIOPin *pin_m1; 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 } // namespace ebyte_lora_e220