diff --git a/components/jiecang_desk_controller/__init__.py b/components/jiecang_desk_controller/__init__.py index aa95a57..0c79f0a 100644 --- a/components/jiecang_desk_controller/__init__.py +++ b/components/jiecang_desk_controller/__init__.py @@ -2,7 +2,7 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome import pins from esphome.components import uart, sensor, button, number -from esphome.const import CONF_ID, CONF_HEIGHT, UNIT_CENTIMETER, UNIT_PERCENT +from esphome.const import CONF_ID, CONF_HEIGHT, CONF_UNIT_OF_MEASUREMENT, CONF_ACCURACY_DECIMALS, UNIT_CENTIMETER, UNIT_PERCENT DEPENDENCIES = ['uart'] AUTO_LOAD = ['sensor', 'button', 'number'] @@ -43,6 +43,7 @@ button_constants[CONF_SAVE_POSITION] = 7 number_constants = {} number_constants[CONF_HEIGHT] = 0 +number_constants[CONF_HEIGHT_PCT] = 1 CONFIG_SCHEMA = cv.COMPONENT_SCHEMA.extend({ cv.GenerateID(): cv.declare_id(JiecangDeskController), @@ -84,10 +85,16 @@ CONFIG_SCHEMA = cv.COMPONENT_SCHEMA.extend({ ), }), 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_HEIGHT): number.NUMBER_SCHEMA.extend({ + cv.GenerateID(): cv.declare_id(JiecangDeskNumber), + cv.Optional(CONF_ACCURACY_DECIMALS, default=1): cv.int_, + cv.Optional(CONF_UNIT_OF_MEASUREMENT, default=UNIT_CENTIMETER): cv.string, + }), + cv.Optional(CONF_HEIGHT_PCT): number.NUMBER_SCHEMA.extend({ + cv.GenerateID(): cv.declare_id(JiecangDeskNumber), + cv.Optional(CONF_ACCURACY_DECIMALS, default=1): cv.int_, + cv.Optional(CONF_UNIT_OF_MEASUREMENT, default=UNIT_PERCENT): cv.string, + }), }), cv.Optional(CONF_BUTTONS): cv.Schema({ cv.Optional(CONF_RAISE): button.BUTTON_SCHEMA.extend({cv.GenerateID(): cv.declare_id(JiecangDeskButton)}), diff --git a/components/jiecang_desk_controller/example_full.yaml b/components/jiecang_desk_controller/example_full.yaml index 18d7fd3..ffa9b21 100644 --- a/components/jiecang_desk_controller/example_full.yaml +++ b/components/jiecang_desk_controller/example_full.yaml @@ -69,6 +69,8 @@ jiecang_desk_controller: numbers: height: name: "Height" + height_pct: + name: "Height Percent" ## lambda usage # button: diff --git a/components/jiecang_desk_controller/jiecang_desk_controller.cpp b/components/jiecang_desk_controller/jiecang_desk_controller.cpp index 0c8a66d..9fad3d5 100644 --- a/components/jiecang_desk_controller/jiecang_desk_controller.cpp +++ b/components/jiecang_desk_controller/jiecang_desk_controller.cpp @@ -63,6 +63,8 @@ namespace esphome { if (height_pct != nullptr && limit_max != 0) height_pct->publish_state((current_height - limit_min) / (limit_max - limit_min) * 100); + if (number_height_pct != nullptr && limit_max != 0) + number_height_pct->publish_state(roundf((current_height - limit_min) / (limit_max - limit_min) * 1000)/10); break; case 0x20: @@ -267,6 +269,11 @@ namespace esphome { case NUMBER_HEIGHT: number_height = number; break; + case NUMBER_HEIGHT_PCT: + number_height_pct = number; + number_height_pct->set_min_value(0); + number_height_pct->set_max_value(100); + break; default: return; } @@ -280,6 +287,9 @@ namespace esphome { case NUMBER_HEIGHT: goto_height(value); break; + case NUMBER_HEIGHT_PCT: + if (limit_max != 0) goto_height((limit_max - limit_min) * value / 100 + limit_min); + break; } } diff --git a/components/jiecang_desk_controller/jiecang_desk_controller.h b/components/jiecang_desk_controller/jiecang_desk_controller.h index 726dc01..f2439bb 100644 --- a/components/jiecang_desk_controller/jiecang_desk_controller.h +++ b/components/jiecang_desk_controller/jiecang_desk_controller.h @@ -19,6 +19,7 @@ #define BUTTON_SAVE_POSITION 7 #define NUMBER_HEIGHT 0 +#define NUMBER_HEIGHT_PCT 1 namespace esphome { namespace jiecang_desk_controller { @@ -79,6 +80,7 @@ namespace esphome { Sensor *position4{nullptr}; JiecangDeskNumber *number_height{nullptr}; + JiecangDeskNumber *number_height_pct{nullptr}; void button_press_action(int type); };