Make whole components optional

This commit is contained in:
sqozz 2024-09-20 00:29:52 +02:00
parent c2d5f8f011
commit d2c5dbeca2
4 changed files with 115 additions and 57 deletions

View file

@ -6,7 +6,6 @@ from esphome.const import CONF_ID
CODEOWNERS = ["@sqozz"] CODEOWNERS = ["@sqozz"]
DEPENDENCIES = ["uart"] DEPENDENCIES = ["uart"]
AUTO_LOAD = ["binary_sensor", "sensor", "text_sensor", "number", "switch"]
tw7100_ns = cg.esphome_ns.namespace("tw7100") tw7100_ns = cg.esphome_ns.namespace("tw7100")
tw7100 = tw7100_ns.class_("tw7100Component", cg.PollingComponent, uart.UARTDevice) tw7100 = tw7100_ns.class_("tw7100Component", cg.PollingComponent, uart.UARTDevice)

View file

@ -1,5 +1,5 @@
#include "tw7100_switch.h"
#include "../tw7100.h" #include "../tw7100.h"
#include "tw7100_switch.h"
#include "esphome/core/log.h" #include "esphome/core/log.h"
#include "esphome/core/defines.h" #include "esphome/core/defines.h"
#include "esphome/core/helpers.h" #include "esphome/core/helpers.h"

View file

@ -1,10 +1,13 @@
#include "tw7100.h" #include "tw7100.h"
#include "select/tw7100_select.h"
#include "esphome/core/log.h" #include "esphome/core/log.h"
#include "esphome/core/defines.h" #include "esphome/core/defines.h"
#include "esphome/core/helpers.h" #include "esphome/core/helpers.h"
#include "esphome/components/uart/uart.h" #include "esphome/components/uart/uart.h"
#ifdef USE_SELECT
#include "select/tw7100_select.h"
#endif
namespace esphome { namespace esphome {
namespace tw7100 { namespace tw7100 {
@ -14,31 +17,21 @@ unsigned long waiting_for_answer_since = 0;
std::deque<std::string> cmd_queue; std::deque<std::string> cmd_queue;
unsigned long last_set_cmd_timestamp; unsigned long last_set_cmd_timestamp;
std::map<int, std::string> sourcelist;
std::vector<std::string> pwr_off_query_cmds{ "PWR?", "LAMP?" }; std::vector<std::string> pwr_off_query_cmds{ "PWR?", "LAMP?" };
std::vector<std::string> pwr_on_query_cmds{ std::vector<std::string> pwr_on_query_cmds{
// Projection screen adjustment settings #ifdef USE_SENSOR
"SIGNAL?",
#endif
#ifdef USE_NUMBER
"VOL?",
"VKEYSTONE?", "VKEYSTONE?",
"HKEYSTONE?", "HKEYSTONE?",
"ASPECT?",
"LUMINANCE?",
"OVSCAN?",
/*
"QC?",
"CORRECTMET?",
*/
// Source/Input/Resolution settings
"SOURCE?",
// Image settings
"BRIGHT?", "BRIGHT?",
"CONTRAST?", "CONTRAST?",
"DENSITY?", "DENSITY?",
"TINT?", "TINT?",
"CTEMP?", "CTEMP?",
"FCOLOR?", "FCOLOR?",
"CMODE?",
"NRS?", "NRS?",
"MPEGNRS?", "MPEGNRS?",
"OFFSETR?", "OFFSETR?",
@ -47,55 +40,58 @@ std::vector<std::string> pwr_on_query_cmds{
"GAINR?", "GAINR?",
"GAING?", "GAING?",
"GAINB?", "GAINB?",
"GAMMA?",
"CSEL?",
"4KENHANCE?",
"IMGPRESET?",
"SHRF?", "SHRF?",
"SHRS?", "SHRS?",
"DERANGE?", "DERANGE?",
"DESTRENGTH?", "DESTRENGTH?",
#endif
#ifdef USE_SWITCH
"BTAUDIO?",
"4KENHANCE?",
"IMGPROC?",
"AUDIOOUT?",
"HREVERSE?",
"VREVERSE?",
"ILLUM?",
"STANDBYCONF?",
"AUTOHOME?",
"WLPWR?",
"LOGTO?",
"MUTE?",
#endif
#ifdef USE_SELECT
"LUMINANCE?",
"SOURCE?",
"ASPECT?",
"OVSCAN?",
"CMODE?",
"GAMMA?",
"IMGPRESET?",
"MCFI?", "MCFI?",
"CLRSPACE?", "CLRSPACE?",
"DYNRANGE?", "DYNRANGE?",
"HDRPQ?",
"HDRHLG?",
"IMGPROC?",
// Sound settings
"VOL?",
"AUDIOOUT?",
"MUTE?",
// Environment settings
"HREVERSE?",
"VREVERSE?",
"MSEL?", "MSEL?",
"SPEED?", "SPEED?",
"ILLUM?", #endif
"STANDBYCONF?", // TODO:
// "PRODUCT?", // produces ERR // "HDRPQ?", // number 01-16
// "HDRHLG?", // number 01-16
// "CSEL?",
// Home Screen settings
"AUTOHOME?",
// Network settings
"WLPWR?",
// Bluetooth
"BTAUDIO?",
// Information
"SIGNAL?",
"LOGTO?", // produces ERR
// "SNO?" // Pushed on demand if sensor value is empty (e.g. after boot-up) // "SNO?" // Pushed on demand if sensor value is empty (e.g. after boot-up)
// "SOURCELIST?" // Parser present in git history but removed until esphome can update selects after api connections are established /*
// "SOURCELISTA?", // same as SOURCELIST "PRODUCT?", // produces ERR
"SOURCELIST?" // Parser present in git history but removed until esphome can update selects after api connections are established
"SOURCELISTA?", // same as SOURCELIST
"QC?",
"CORRECTMET?",
*/
}; };
void tw7100Component::setup() { void tw7100Component::setup() {
static const char *const TAG = "setup()"; static const char *const TAG = "setup()";
ESP_LOGV(TAG, "SETUP"); ESP_LOGV(TAG, "SETUP");
#ifdef USE_SELECT
if (source_select_ != nullptr) source_select_->setup(); if (source_select_ != nullptr) source_select_->setup();
if (luminance_select_ != nullptr) luminance_select_->setup(); if (luminance_select_ != nullptr) luminance_select_->setup();
if (aspect_select_ != nullptr) aspect_select_->setup(); if (aspect_select_ != nullptr) aspect_select_->setup();
@ -108,6 +104,7 @@ void tw7100Component::setup() {
if (dynrange_select_ != nullptr) dynrange_select_->setup(); if (dynrange_select_ != nullptr) dynrange_select_->setup();
if (msel_select_ != nullptr) msel_select_->setup(); if (msel_select_ != nullptr) msel_select_->setup();
if (speed_select_ != nullptr) speed_select_->setup(); if (speed_select_ != nullptr) speed_select_->setup();
#endif
}; };
void tw7100Component::update() { void tw7100Component::update() {
@ -117,9 +114,11 @@ void tw7100Component::update() {
cmd_queue.push_back(cmd); cmd_queue.push_back(cmd);
} }
if ((powered_->state)) { if ((powered_->state)) {
#ifdef USE_TEXT_SENSOR
if (this->serial_->state.length() < 1) { if (this->serial_->state.length() < 1) {
cmd_queue.push_back("SNO?"); cmd_queue.push_back("SNO?");
} }
#endif
for (auto &cmd : pwr_on_query_cmds) { for (auto &cmd : pwr_on_query_cmds) {
cmd_queue.push_back(cmd); cmd_queue.push_back(cmd);
} }
@ -213,8 +212,13 @@ void tw7100Component::update_sensor(std::pair<std::string, std::string> data) {
if (cmd == "PWR") { if (cmd == "PWR") {
ESP_LOGV(TAG, "updating power sensors"); ESP_LOGV(TAG, "updating power sensors");
int value = std::stoi(value_string); int value = std::stoi(value_string);
#ifdef USE_BINARY_SENSOR
powered_->publish_state(value > 0); powered_->publish_state(value > 0);
#endif
#ifdef USE_SWITCH
power_switch_->publish_state(value > 0); // ack previous cmd or update switch power_switch_->publish_state(value > 0); // ack previous cmd or update switch
#endif
#ifdef USE_SENSOR
power_status_->publish_state(value); power_status_->publish_state(value);
} else if (cmd == "LAMP") { } else if (cmd == "LAMP") {
ESP_LOGV(TAG, "updating lamp sensors"); ESP_LOGV(TAG, "updating lamp sensors");
@ -225,6 +229,8 @@ void tw7100Component::update_sensor(std::pair<std::string, std::string> data) {
int value = std::stoi(value_string); int value = std::stoi(value_string);
has_signal_->publish_state(value > 0); has_signal_->publish_state(value > 0);
signal_status_->publish_state(value); signal_status_->publish_state(value);
#endif
#ifdef USE_SELECT
} else if (cmd == "LUMINANCE") { } else if (cmd == "LUMINANCE") {
ESP_LOGV(TAG, "updating luminance sensors"); ESP_LOGV(TAG, "updating luminance sensors");
int value = std::stoi(value_string); int value = std::stoi(value_string);
@ -264,8 +270,12 @@ void tw7100Component::update_sensor(std::pair<std::string, std::string> data) {
ESP_LOGV(TAG, "updating msel select"); ESP_LOGV(TAG, "updating msel select");
} else if (cmd == "SPEED") { } else if (cmd == "SPEED") {
ESP_LOGV(TAG, "updating speed select"); ESP_LOGV(TAG, "updating speed select");
#endif
#ifdef USE_TEXT_SENSOR
} else if (cmd == "SNO") { } else if (cmd == "SNO") {
serial_->publish_state(value_string); serial_->publish_state(value_string);
#endif
#ifdef USE_SWITCH
} else if (cmd == "BTAUDIO") { } else if (cmd == "BTAUDIO") {
ESP_LOGV(TAG, "updating btaudio switch"); ESP_LOGV(TAG, "updating btaudio switch");
int value = std::stoi(value_string); int value = std::stoi(value_string);
@ -311,6 +321,8 @@ void tw7100Component::update_sensor(std::pair<std::string, std::string> data) {
} else if (cmd == "MUTE") { } else if (cmd == "MUTE") {
ESP_LOGV(TAG, "updating mute switch with value %s", value_string.c_str()); ESP_LOGV(TAG, "updating mute switch with value %s", value_string.c_str());
mute_switch_->publish_state(value_string == "ON"); mute_switch_->publish_state(value_string == "ON");
#endif
#ifdef USE_NUMBER
} else if (cmd == "VOL") { } else if (cmd == "VOL") {
int value = std::stoi(value_string); int value = std::stoi(value_string);
ESP_LOGV(TAG, "updating volume number with value %s", value_string.c_str()); ESP_LOGV(TAG, "updating volume number with value %s", value_string.c_str());
@ -395,6 +407,7 @@ void tw7100Component::update_sensor(std::pair<std::string, std::string> data) {
int value = std::stoi(value_string); int value = std::stoi(value_string);
ESP_LOGV(TAG, "updating destrength number with value %s", value_string.c_str()); ESP_LOGV(TAG, "updating destrength number with value %s", value_string.c_str());
destrength_number_->publish_state(value); destrength_number_->publish_state(value);
#endif
} else { } else {
ESP_LOGW(TAG, "Command %s unknown, skipping updating sensor with value", cmd.c_str()); ESP_LOGW(TAG, "Command %s unknown, skipping updating sensor with value", cmd.c_str());
} }

View file

@ -1,16 +1,36 @@
#ifndef TW7100_H_
#define TW7100_H_
#pragma once #pragma once
#include "esphome/core/component.h" #include "esphome/core/component.h"
#include "esphome/core/log.h" #include "esphome/core/log.h"
#include "esphome/components/sensor/sensor.h"
#include "esphome/components/binary_sensor/binary_sensor.h"
#include "esphome/components/text_sensor/text_sensor.h"
#include "esphome/components/switch/switch.h"
#include "esphome/components/select/select.h"
#include "esphome/components/number/number.h"
#include "esphome/components/uart/uart.h" #include "esphome/components/uart/uart.h"
#ifdef USE_SENSOR
#include "esphome/components/sensor/sensor.h"
#endif
#ifdef USE_BINARY_SENSOR
#include "esphome/components/binary_sensor/binary_sensor.h"
#endif
#ifdef USE_TEXT_SENSOR
#include "esphome/components/text_sensor/text_sensor.h"
#endif
#ifdef USE_SWITCH
#include "esphome/components/switch/switch.h"
#endif
#ifdef USE_SELECT
#include "esphome/components/select/select.h"
#include "select/tw7100_select.h" #include "select/tw7100_select.h"
#endif
#ifdef USE_NUMBER
#include "esphome/components/number/number.h"
#include "number/tw7100_number.h" #include "number/tw7100_number.h"
#endif
namespace esphome { namespace esphome {
namespace tw7100 { namespace tw7100 {
@ -35,13 +55,20 @@ class tw7100Component : public PollingComponent, public uart::UARTDevice {
void loop() override; void loop() override;
void dump_config() override; void dump_config() override;
float get_setup_priority() const override { return setup_priority::BUS; } float get_setup_priority() const override { return setup_priority::BUS; }
#ifdef USE_BINARY_SENSOR
void set_powered(binary_sensor::BinarySensor *powered) { this->powered_ = powered; } void set_powered(binary_sensor::BinarySensor *powered) { this->powered_ = powered; }
void set_has_signal(binary_sensor::BinarySensor *has_signal) { this->has_signal_ = has_signal; } void set_has_signal(binary_sensor::BinarySensor *has_signal) { this->has_signal_ = has_signal; }
#endif
#ifdef USE_SENSOR
void set_lamp_hours(sensor::Sensor *lamp_hours) { this->lamp_hours_ = lamp_hours; } void set_lamp_hours(sensor::Sensor *lamp_hours) { this->lamp_hours_ = lamp_hours; }
void set_power_status(sensor::Sensor *power_status) { this->power_status_ = power_status; } void set_power_status(sensor::Sensor *power_status) { this->power_status_ = power_status; }
void set_signal_status(sensor::Sensor *signal_status) { this->signal_status_ = signal_status; } void set_signal_status(sensor::Sensor *signal_status) { this->signal_status_ = signal_status; }
void set_luminance_level(sensor::Sensor *luminance_level) { this->luminance_level_ = luminance_level; } void set_luminance_level(sensor::Sensor *luminance_level) { this->luminance_level_ = luminance_level; }
#endif
#ifdef USE_TEXT_SENSOR
void set_serial(text_sensor::TextSensor *serial) { this->serial_ = serial; } void set_serial(text_sensor::TextSensor *serial) { this->serial_ = serial; }
#endif
#ifdef USE_SWITCH
void set_set_pwr(switch_::Switch *switch_) { this->power_switch_ = switch_; } void set_set_pwr(switch_::Switch *switch_) { this->power_switch_ = switch_; }
void set_set_btaudio(switch_::Switch *switch_) { this->btaudio_switch_ = switch_; } void set_set_btaudio(switch_::Switch *switch_) { this->btaudio_switch_ = switch_; }
void set_set_mute(switch_::Switch *switch_) { this->mute_switch_ = switch_; } void set_set_mute(switch_::Switch *switch_) { this->mute_switch_ = switch_; }
@ -56,6 +83,8 @@ class tw7100Component : public PollingComponent, public uart::UARTDevice {
void set_set_imgproc(switch_::Switch *switch_) { this->img_processing_switch_ = switch_; } void set_set_imgproc(switch_::Switch *switch_) { this->img_processing_switch_ = switch_; }
void set_set_4kenhance(switch_::Switch *switch_) { this->_4kenhance_switch_ = switch_; } void set_set_4kenhance(switch_::Switch *switch_) { this->_4kenhance_switch_ = switch_; }
void set_set_logto(switch_::Switch *switch_) { this->logto_switch_ = switch_; } void set_set_logto(switch_::Switch *switch_) { this->logto_switch_ = switch_; }
#endif
#ifdef USE_SELECT
void set_set_source(tw7100::tw7100Select *select_) { this->source_select_ = select_; } void set_set_source(tw7100::tw7100Select *select_) { this->source_select_ = select_; }
void set_set_luminance(tw7100::tw7100Select *select_) { this->luminance_select_ = select_; } void set_set_luminance(tw7100::tw7100Select *select_) { this->luminance_select_ = select_; }
void set_set_aspect(tw7100::tw7100Select *select_) { this->aspect_select_ = select_; } void set_set_aspect(tw7100::tw7100Select *select_) { this->aspect_select_ = select_; }
@ -68,6 +97,8 @@ class tw7100Component : public PollingComponent, public uart::UARTDevice {
void set_set_dynrange(tw7100::tw7100Select *select_) { this->dynrange_select_ = select_; } void set_set_dynrange(tw7100::tw7100Select *select_) { this->dynrange_select_ = select_; }
void set_set_msel(tw7100::tw7100Select *select_) { this->msel_select_ = select_; } void set_set_msel(tw7100::tw7100Select *select_) { this->msel_select_ = select_; }
void set_set_speed(tw7100::tw7100Select *select_) { this->speed_select_ = select_; } void set_set_speed(tw7100::tw7100Select *select_) { this->speed_select_ = select_; }
#endif
#ifdef USE_NUMBER
void set_set_vol(tw7100::tw7100Number *number_) { this->volume_number_ = number_; } void set_set_vol(tw7100::tw7100Number *number_) { this->volume_number_ = number_; }
void set_set_vkeystone(tw7100::tw7100Number *number_) { this->vkeystone_number_ = number_; } void set_set_vkeystone(tw7100::tw7100Number *number_) { this->vkeystone_number_ = number_; }
void set_set_hkeystone(tw7100::tw7100Number *number_) { this->hkeystone_number_ = number_; } void set_set_hkeystone(tw7100::tw7100Number *number_) { this->hkeystone_number_ = number_; }
@ -89,16 +120,24 @@ class tw7100Component : public PollingComponent, public uart::UARTDevice {
void set_set_shrs(tw7100::tw7100Number *number_) { this->shrs_number_ = number_; } void set_set_shrs(tw7100::tw7100Number *number_) { this->shrs_number_ = number_; }
void set_set_derange(tw7100::tw7100Number *number_) { this->derange_number_ = number_; } void set_set_derange(tw7100::tw7100Number *number_) { this->derange_number_ = number_; }
void set_set_destrength(tw7100::tw7100Number *number_) { this->destrength_number_ = number_; } void set_set_destrength(tw7100::tw7100Number *number_) { this->destrength_number_ = number_; }
#endif
protected: protected:
#ifdef USE_BINARY_SENSOR
binary_sensor::BinarySensor *powered_{nullptr}; binary_sensor::BinarySensor *powered_{nullptr};
binary_sensor::BinarySensor *has_signal_{nullptr}; binary_sensor::BinarySensor *has_signal_{nullptr};
#endif
#ifdef USE_SENSOR
sensor::Sensor *lamp_hours_{nullptr}; sensor::Sensor *lamp_hours_{nullptr};
sensor::Sensor *power_status_{nullptr}; sensor::Sensor *power_status_{nullptr};
sensor::Sensor *signal_status_{nullptr}; sensor::Sensor *signal_status_{nullptr};
sensor::Sensor *luminance_level_{nullptr}; sensor::Sensor *luminance_level_{nullptr};
#endif
#ifdef USE_TEXT_SENSOR
text_sensor::TextSensor *serial_{nullptr}; text_sensor::TextSensor *serial_{nullptr};
#endif
#ifdef USE_SWITCH
switch_::Switch *power_switch_{nullptr}; switch_::Switch *power_switch_{nullptr};
switch_::Switch *btaudio_switch_{nullptr}; switch_::Switch *btaudio_switch_{nullptr};
switch_::Switch *mute_switch_{nullptr}; switch_::Switch *mute_switch_{nullptr};
@ -113,6 +152,8 @@ class tw7100Component : public PollingComponent, public uart::UARTDevice {
switch_::Switch *img_processing_switch_{nullptr}; switch_::Switch *img_processing_switch_{nullptr};
switch_::Switch *_4kenhance_switch_{nullptr}; switch_::Switch *_4kenhance_switch_{nullptr};
switch_::Switch *logto_switch_{nullptr}; switch_::Switch *logto_switch_{nullptr};
#endif
#ifdef USE_SELECT
tw7100::tw7100Select *source_select_{nullptr}; tw7100::tw7100Select *source_select_{nullptr};
tw7100::tw7100Select *luminance_select_{nullptr}; tw7100::tw7100Select *luminance_select_{nullptr};
tw7100::tw7100Select *aspect_select_{nullptr}; tw7100::tw7100Select *aspect_select_{nullptr};
@ -125,6 +166,8 @@ class tw7100Component : public PollingComponent, public uart::UARTDevice {
tw7100::tw7100Select *dynrange_select_{nullptr}; tw7100::tw7100Select *dynrange_select_{nullptr};
tw7100::tw7100Select *msel_select_{nullptr}; tw7100::tw7100Select *msel_select_{nullptr};
tw7100::tw7100Select *speed_select_{nullptr}; tw7100::tw7100Select *speed_select_{nullptr};
#endif
#ifdef USE_NUMBER
tw7100::tw7100Number *volume_number_{nullptr}; tw7100::tw7100Number *volume_number_{nullptr};
tw7100::tw7100Number *vkeystone_number_{nullptr}; tw7100::tw7100Number *vkeystone_number_{nullptr};
tw7100::tw7100Number *hkeystone_number_{nullptr}; tw7100::tw7100Number *hkeystone_number_{nullptr};
@ -146,7 +189,10 @@ class tw7100Component : public PollingComponent, public uart::UARTDevice {
tw7100::tw7100Number *shrs_number_{nullptr}; tw7100::tw7100Number *shrs_number_{nullptr};
tw7100::tw7100Number *derange_number_{nullptr}; tw7100::tw7100Number *derange_number_{nullptr};
tw7100::tw7100Number *destrength_number_{nullptr}; tw7100::tw7100Number *destrength_number_{nullptr};
#endif
}; };
} // namespace tw7100 } // namespace tw7100
} // namespace esphome } // namespace esphome
#endif