mirror of
https://github.com/esphome/esphome.git
synced 2024-12-01 03:04:12 +01:00
more updates
This commit is contained in:
parent
033475bc83
commit
61c25ae822
3 changed files with 89 additions and 32 deletions
|
@ -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))
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue