From 2eccb243d6235f7fa2827d08b0ca8f61b95c5507 Mon Sep 17 00:00:00 2001 From: Rocka84 Date: Sun, 2 Jun 2024 16:58:35 +0200 Subject: [PATCH] added number entity for height --- components/jiecang_desk_controller/README.md | 9 +++++ .../jiecang_desk_controller/__init__.py | 21 ++++++++++-- .../jiecang_desk_controller.cpp | 26 +++++++++++++++ .../jiecang_desk_controller.h | 8 +++++ .../jiecang_desk_number.cpp | 32 ++++++++++++++++++ .../jiecang_desk_number.h | 33 +++++++++++++++++++ example_jiecang_desk_controller.yaml | 3 ++ 7 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 components/jiecang_desk_controller/jiecang_desk_number.cpp create mode 100644 components/jiecang_desk_controller/jiecang_desk_number.h diff --git a/components/jiecang_desk_controller/README.md b/components/jiecang_desk_controller/README.md index 59bb152..824f67b 100644 --- a/components/jiecang_desk_controller/README.md +++ b/components/jiecang_desk_controller/README.md @@ -124,6 +124,15 @@ position2 | 2nd stored height position3 | 3rd stored height position4 | 4th stored height +### Available number entities + +Hold current values read from the desk and set values to desk when changed. + +sensor | description +-----------|---------------------------- +height | current height of the desk + + ### Available buttons and methods button | lambda method | description diff --git a/components/jiecang_desk_controller/__init__.py b/components/jiecang_desk_controller/__init__.py index 0a77bd8..0528f0e 100644 --- a/components/jiecang_desk_controller/__init__.py +++ b/components/jiecang_desk_controller/__init__.py @@ -1,20 +1,22 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome import pins -from esphome.components import uart, sensor, button +from esphome.components import uart, sensor, button, number from esphome.const import CONF_ID, CONF_HEIGHT, UNIT_CENTIMETER, UNIT_PERCENT DEPENDENCIES = ['uart'] -AUTO_LOAD = ['sensor', 'button'] +AUTO_LOAD = ['sensor', 'button', 'number'] jiecang_desk_controller_ns = cg.esphome_ns.namespace('jiecang_desk_controller') JiecangDeskController = jiecang_desk_controller_ns.class_('JiecangDeskController', cg.Component, uart.UARTDevice) JiecangDeskButton = jiecang_desk_controller_ns.class_('JiecangDeskButton', button.Button, cg.Component) +JiecangDeskNumber = jiecang_desk_controller_ns.class_('JiecangDeskNumber', number.Number, cg.Component) CONF_SENSORS = "sensors" CONF_BUTTONS = "buttons" +CONF_NUMBERS = "numbers" CONF_UNIT = "unit" CONF_RAISE = "raise" CONF_LOWER = "lower" @@ -37,6 +39,9 @@ button_constants[CONF_POSITION2] = 4 button_constants[CONF_POSITION3] = 5 button_constants[CONF_POSITION4] = 6 +number_constants = {} +number_constants[CONF_HEIGHT] = 0 + CONFIG_SCHEMA = cv.COMPONENT_SCHEMA.extend({ cv.GenerateID(): cv.declare_id(JiecangDeskController), cv.Optional(CONF_SENSORS): cv.Schema({ @@ -76,6 +81,12 @@ CONFIG_SCHEMA = cv.COMPONENT_SCHEMA.extend({ unit_of_measurement = UNIT_CENTIMETER ), }), + cv.Optional(CONF_NUMBERS): cv.Schema({ + cv.Optional(CONF_HEIGHT): number.NUMBER_SCHEMA.extend({cv.GenerateID(): cv.declare_id(JiecangDeskNumber)}), + # cv.Optional(CONF_HEIGHT): number.number_schema( + # unit_of_measurement = UNIT_CENTIMETER + # ), + }), cv.Optional(CONF_BUTTONS): cv.Schema({ cv.Optional(CONF_RAISE): button.BUTTON_SCHEMA.extend({cv.GenerateID(): cv.declare_id(JiecangDeskButton)}), cv.Optional(CONF_LOWER): button.BUTTON_SCHEMA.extend({cv.GenerateID(): cv.declare_id(JiecangDeskButton)}), @@ -129,3 +140,9 @@ async def to_code(config): btn = await button.new_button(buttons[button_type]) cg.add(var.add_button(btn, button_constants[button_type])) + if CONF_NUMBERS in config: + numbers = config[CONF_NUMBERS] + for number_type in numbers.keys(): + num = await number.new_number(numbers[number_type], min_value=0, max_value=100, step=.1) + cg.add(var.add_number(num, number_constants[number_type])) + diff --git a/components/jiecang_desk_controller/jiecang_desk_controller.cpp b/components/jiecang_desk_controller/jiecang_desk_controller.cpp index 708d146..d28b4b1 100644 --- a/components/jiecang_desk_controller/jiecang_desk_controller.cpp +++ b/components/jiecang_desk_controller/jiecang_desk_controller.cpp @@ -59,6 +59,7 @@ namespace esphome { if (new_height == current_height) return; current_height = new_height; if (height != nullptr) height->publish_state(current_height); + if (number_height != nullptr) number_height->publish_state(current_height); if (height_pct != nullptr && limit_max != 0) height_pct->publish_state((current_height - limit_min) / (limit_max - limit_min) * 100); @@ -70,10 +71,12 @@ namespace esphome { if ((message[2] & 1) == 0) { // low nibble 0 -> no max limit, use physical_max limit_max = physical_max; if (height_max != nullptr) height_max->publish_state(limit_max); + if (number_height != nullptr) number_height->set_max_value(limit_max); } if ((message[2]>>4) == 0) { // high nibble 0 -> no min limit, use physical_min limit_min = physical_min; if (height_min != nullptr) height_min->publish_state(limit_min); + if (number_height != nullptr) number_height->set_min_value(limit_min); } break; @@ -87,12 +90,14 @@ namespace esphome { ESP_LOGV("jiecang_desk_controller", "height_max 0x%02X%02X", message[2], message[3]); limit_max = byte2float(message[2], message[3]); if (height_max != nullptr) height_max->publish_state(limit_max); + if (number_height != nullptr) number_height->set_max_value(limit_max); break; case 0x22: ESP_LOGV("jiecang_desk_controller", "height_min 0x%02X%02X", message[2], message[3]); limit_min = byte2float(message[2], message[3]); if (height_min != nullptr) height_min->publish_state(limit_min); + if (number_height != nullptr) number_height->set_min_value(limit_min); break; case 0x25: @@ -216,6 +221,27 @@ namespace esphome { } } + void JiecangDeskController::add_number(JiecangDeskNumber *number, int type) { + switch (type) { + case NUMBER_HEIGHT: + number_height = number; + break; + default: + return; + } + number->set_type(type); + number->set_parent(this); + } + + void JiecangDeskController::number_control(int type, float value) { + ESP_LOGV("JiecangDeskController", "number_control %i", type); + switch (type) { + case NUMBER_HEIGHT: + goto_height(value); + break; + } + } + void JiecangDeskButton::press_action() {} } //namespace jiecang_desk_controller diff --git a/components/jiecang_desk_controller/jiecang_desk_controller.h b/components/jiecang_desk_controller/jiecang_desk_controller.h index 56d2205..818d642 100644 --- a/components/jiecang_desk_controller/jiecang_desk_controller.h +++ b/components/jiecang_desk_controller/jiecang_desk_controller.h @@ -7,6 +7,7 @@ #include "esphome/components/uart/uart.h" #include "esphome/core/hal.h" #include "esphome/core/log.h" +#include "jiecang_desk_number.h" #define BUTTON_RAISE 0 #define BUTTON_LOWER 1 @@ -16,6 +17,8 @@ #define BUTTON_POSITION3 5 #define BUTTON_POSITION4 6 +#define NUMBER_HEIGHT 0 + namespace esphome { namespace jiecang_desk_controller { @@ -46,6 +49,7 @@ namespace esphome { void send_simple_command(unsigned char cmd); void add_button(button::Button *btn, int action); + void add_number(JiecangDeskNumber *number, int type); void raise(); void lower(); @@ -57,6 +61,8 @@ namespace esphome { void request_limits(); void request_settings(); + void number_control(int type, float value); + protected: Sensor *height{nullptr}; Sensor *height_min{nullptr}; @@ -68,6 +74,8 @@ namespace esphome { Sensor *position3{nullptr}; Sensor *position4{nullptr}; + JiecangDeskNumber *number_height{nullptr}; + void button_press_action(int type); }; diff --git a/components/jiecang_desk_controller/jiecang_desk_number.cpp b/components/jiecang_desk_controller/jiecang_desk_number.cpp new file mode 100644 index 0000000..de15d91 --- /dev/null +++ b/components/jiecang_desk_controller/jiecang_desk_number.cpp @@ -0,0 +1,32 @@ +#include "jiecang_desk_number.h" +#include "jiecang_desk_controller.h" +#include "esphome/core/log.h" + +namespace esphome { + namespace jiecang_desk_controller { + + static const char *const TAG = "jiecang_desk.number"; + + void JiecangDeskNumber::setup() {} + + void JiecangDeskNumber::dump_config() { + LOG_NUMBER("", "JiecangDeskNumber", this); + ESP_LOGCONFIG(TAG, " type %i", type); + } + + void JiecangDeskNumber::control(float value) { + this->publish_state(value); + parent->number_control(this->type, value); + } + + void JiecangDeskNumber::set_min_value(float value) { + traits.set_min_value(value); + } + + void JiecangDeskNumber::set_max_value(float value) { + traits.set_max_value(value); + } + + + } // namespace jiecang_desk_controller +} // namespace esphome diff --git a/components/jiecang_desk_controller/jiecang_desk_number.h b/components/jiecang_desk_controller/jiecang_desk_number.h new file mode 100644 index 0000000..72e0a5d --- /dev/null +++ b/components/jiecang_desk_controller/jiecang_desk_number.h @@ -0,0 +1,33 @@ +#pragma once + +#include "esphome/core/component.h" +#include "esphome/components/number/number.h" +#include "esphome/core/log.h" + +namespace esphome { + namespace jiecang_desk_controller { + + class JiecangDeskController; + + class JiecangDeskNumber : public number::Number, public Component { + private: + int type; + JiecangDeskController *parent; + + public: + void setup() override; + void dump_config() override; + + void set_parent(JiecangDeskController *parent) { this->parent = parent; } + void set_type(int type) { this->type = type; } + + void set_min_value(float value); + void set_max_value(float value); + + protected: + void control(float value) override; + + }; + + } // namespace jiecang_desk_controller +} // namespace esphome diff --git a/example_jiecang_desk_controller.yaml b/example_jiecang_desk_controller.yaml index 8d67ede..87ab8ab 100644 --- a/example_jiecang_desk_controller.yaml +++ b/example_jiecang_desk_controller.yaml @@ -60,6 +60,9 @@ jiecang_desk_controller: name: "Position 3" position4: name: "Position 4" + numbers: + height: + name: "Height" ## lambda usage # button: