added number entity for height
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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]))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
32
components/jiecang_desk_controller/jiecang_desk_number.cpp
Normal file
32
components/jiecang_desk_controller/jiecang_desk_number.cpp
Normal 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
|
||||
33
components/jiecang_desk_controller/jiecang_desk_number.h
Normal file
33
components/jiecang_desk_controller/jiecang_desk_number.h
Normal 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
|
||||
@@ -60,6 +60,9 @@ jiecang_desk_controller:
|
||||
name: "Position 3"
|
||||
position4:
|
||||
name: "Position 4"
|
||||
numbers:
|
||||
height:
|
||||
name: "Height"
|
||||
|
||||
## lambda usage
|
||||
# button:
|
||||
|
||||
Reference in New Issue
Block a user