From 6454dc6d58fcad451c32e670e30161718974d5a6 Mon Sep 17 00:00:00 2001 From: T Date: Fri, 14 Mar 2025 17:57:43 +0100 Subject: [PATCH] Add select --- __init__.py | 7 ++++--- optoma_rs232.cpp | 38 +++++++++++++++++++++++++++++++++++++- optoma_rs232.h | 10 ++++++++++ select.py | 5 +++-- sensor.py | 9 ++++++--- text_sensor.py | 3 +-- 6 files changed, 61 insertions(+), 11 deletions(-) diff --git a/__init__.py b/__init__.py index b7c141f..9b58c30 100644 --- a/__init__.py +++ b/__init__.py @@ -14,9 +14,10 @@ OptomaRS232Component = optoma_ns.class_("OptomaRS232Component", cg.PollingCompon CONFIG_SCHEMA = ( cv.Schema({ cv.GenerateID(): cv.declare_id(OptomaRS232Component), - }) - .extend(cv.polling_component_schema("10s")) - .extend(uart.UART_DEVICE_SCHEMA) + }).extend( + cv.polling_component_schema("10s"), + uart.UART_DEVICE_SCHEMA + ) ) diff --git a/optoma_rs232.cpp b/optoma_rs232.cpp index b64d3f6..78408f4 100644 --- a/optoma_rs232.cpp +++ b/optoma_rs232.cpp @@ -56,6 +56,29 @@ void OptomaRS232Component::update() { write_array(reinterpret_cast(QUERIES[last_query_]), strlen(QUERIES[last_query_])); } +void OptomaRS232Component::beamer_input_select_changed(const std::string &state, size_t) { + const char *data; + Inputs inp{UNKNOWN}; + if (state == "Unknown") + return; + if (state == "HDMI 1") { + inp = HDMI_1; + data = "~0012 1\r"; + } else if (state == "HDMI 2") { + inp = HDMI_2; + data = "~0012 15\r"; + } else if (state == "VGA") { + inp = VGA; + data = "~0012 5\r"; // VGA 1 + } else { + return; + } + if (inp == current_input_) + return; + current_input_ = inp; + write_array(reinterpret_cast(data), strlen(data)); +} + void OptomaRS232Component::process_line_(const std::string &str) { // if we are waiting for the projector to respond to a command. // it will respond P (pass) or F (fail) before giving us the actual response to the command. @@ -110,19 +133,23 @@ void OptomaRS232Component::process_query_response_(const std::string &str) { // publish(beamer_firmware_,strtol(buf + 10, 0, 10)); buf[10] = 0; - int input = -1; // atol(buf + 8); BUGGY + int input = strtol(buf + 8, 0, 10); // BUGGY switch (input) { case Inputs::HDMI_1: + current_input_ = Inputs::HDMI_1; publish(beamer_input_text_sensor_, "HDMI 1"); break; case Inputs::HDMI_2: + current_input_ = Inputs::HDMI_2; publish(beamer_input_text_sensor_, "HDMI 2"); break; case Inputs::VGA: + current_input_ = Inputs::VGA; publish(beamer_input_text_sensor_, "VGA"); break; default: case Inputs::UNKNOWN: + current_input_ = Inputs::UNKNOWN; publish(beamer_input_text_sensor_, "Unknown"); break; } @@ -139,5 +166,14 @@ void OptomaRS232Component::process_query_response_(const std::string &str) { } } +#ifdef USE_SELECT +void InputSelect::control(const std::string &value) { + this->publish_state(value); + auto index = this->index_of(value); + if (index.has_value()) + this->parent_->beamer_input_select_changed(value, *index); +} +#endif + } // namespace optoma_rs232 } // namespace esphome diff --git a/optoma_rs232.h b/optoma_rs232.h index 9771d5e..d504b91 100644 --- a/optoma_rs232.h +++ b/optoma_rs232.h @@ -36,6 +36,7 @@ class OptomaRS232Component : public uart::UARTDevice, public PollingComponent { void loop() override; float get_setup_priority() const override { return setup_priority::DATA; } void update() override; + void beamer_input_select_changed(const std::string &, size_t); // clang-format off #ifndef USE_SENSOR @@ -61,6 +62,8 @@ class OptomaRS232Component : public uart::UARTDevice, public PollingComponent { SUB_SELECT(beamer_input) protected: + Inputs current_input_{UNKNOWN}; + void process_line_(const std::string &str); void process_query_response_(const std::string &str); bool waiting_for_command_response_ = false; @@ -71,5 +74,12 @@ class OptomaRS232Component : public uart::UARTDevice, public PollingComponent { size_t cursor_ = 0; }; +#ifdef USE_SELECT +class InputSelect : public select::Select, public Parented { + protected: + void control(const std::string &value) override; +}; +#endif + } // namespace optoma_rs232 } // namespace esphome diff --git a/select.py b/select.py index f6f656e..0e66f5f 100644 --- a/select.py +++ b/select.py @@ -6,6 +6,8 @@ from . import CONF_OPTOMA_RS232_ID, OptomaRS232Component, optoma_ns DEPENDENCIES = ["optoma_rs232"] +InputSelect = optoma_ns.class_("InputSelect", select.Select) + Inputs = optoma_ns.enum("Inputs") INPUT_OPTIONS = { "Unknown": 0, @@ -14,8 +16,7 @@ INPUT_OPTIONS = { "HDMI 2": 8, } -CONFIG_SCHEMA = select.select_schema( -).extend({ +CONFIG_SCHEMA = select.select_schema(InputSelect).extend({ cv.GenerateID(CONF_OPTOMA_RS232_ID): cv.use_id(OptomaRS232Component), }) diff --git a/sensor.py b/sensor.py index 8830a00..85d41c6 100644 --- a/sensor.py +++ b/sensor.py @@ -19,6 +19,7 @@ from . import CONF_OPTOMA_RS232_ID, optoma_ns, OptomaRS232Component DEPENDENCIES = ["optoma_rs232"] CONF_FAN_SPEED = "fan_speed" +CONF_LAMP_TIME = "lamp_hours" CONFIG_SCHEMA = ( cv.Schema({ @@ -29,7 +30,7 @@ CONFIG_SCHEMA = ( device_class=DEVICE_CLASS_TEMPERATURE, state_class=STATE_CLASS_MEASUREMENT, ), - cv.Optional(CONF_DURATION): sensor.sensor_schema( + cv.Optional(CONF_LAMP_TIME): sensor.sensor_schema( unit_of_measurement=UNIT_HOUR, accuracy_decimals=0, device_class=DEVICE_CLASS_DURATION, @@ -42,8 +43,10 @@ CONFIG_SCHEMA = ( state_class=STATE_CLASS_MEASUREMENT, ), }) - .extend(cv.polling_component_schema("10s")) - .extend(uart.UART_DEVICE_SCHEMA) + .extend( + cv.polling_component_schema("10s"), + uart.UART_DEVICE_SCHEMA + ) ) diff --git a/text_sensor.py b/text_sensor.py index a31c3b5..5f5123c 100644 --- a/text_sensor.py +++ b/text_sensor.py @@ -6,8 +6,7 @@ from . import CONF_OPTOMA_RS232_ID, OptomaRS232Component DEPENDENCIES = ["optoma_rs232"] -CONFIG_SCHEMA = text_sensor.text_sensor_schema( -).extend({ +CONFIG_SCHEMA = text_sensor.text_sensor_schema().extend({ cv.GenerateID(CONF_OPTOMA_RS232_ID): cv.use_id(OptomaRS232Component), })