added number entity for height

This commit is contained in:
Rocka84
2024-06-02 16:58:35 +02:00
parent c10ab706a3
commit 2eccb243d6
7 changed files with 130 additions and 2 deletions

View File

@@ -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

View File

@@ -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]))

View File

@@ -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

View File

@@ -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);
};

View File

@@ -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

View File

@@ -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