Merge pull request #33 from ElVit/heishamon_sync
Sync with Heishamon v4.1.2
This commit is contained in:
parent
d1717adcbc
commit
41e3440b84
|
|
@ -473,6 +473,8 @@ text_sensor:
|
||||||
name: "SmartDHW"
|
name: "SmartDHW"
|
||||||
top141:
|
top141:
|
||||||
name: "Quiet Mode Priority"
|
name: "Quiet Mode Priority"
|
||||||
|
top143:
|
||||||
|
name: "DHW Sensor Selection"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Numbers
|
### Numbers
|
||||||
|
|
@ -551,6 +553,8 @@ number:
|
||||||
name: "Set Bivalent AP Start Temp"
|
name: "Set Bivalent AP Start Temp"
|
||||||
set38:
|
set38:
|
||||||
name: "Set Bivalent AP Stop Temp"
|
name: "Set Bivalent AP Stop Temp"
|
||||||
|
set46:
|
||||||
|
name: "Set Heater On Outdoor Temp"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Switches
|
### Switches
|
||||||
|
|
@ -624,6 +628,12 @@ select:
|
||||||
name: "Set Quiet Mode Priority"
|
name: "Set Quiet Mode Priority"
|
||||||
set42:
|
set42:
|
||||||
name: "Set Pump Flow Rate Mode"
|
name: "Set Pump Flow Rate Mode"
|
||||||
|
set43:
|
||||||
|
name: "Set DHW Sensor Selection"
|
||||||
|
set44:
|
||||||
|
name: "Set DHW Heater State"
|
||||||
|
set45:
|
||||||
|
name: "Set Room Heater State"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Climates
|
### Climates
|
||||||
|
|
@ -713,8 +723,12 @@ When the ESP controller is connected initially to the heatpump (and the heatpump
|
||||||
the heatpump may not respond to any request messages.
|
the heatpump may not respond to any request messages.
|
||||||
If the CZ-TAW1 is also connected to the ESP controller you will probably see some requests like 0x31 05 10 01 ...
|
If the CZ-TAW1 is also connected to the ESP controller you will probably see some requests like 0x31 05 10 01 ...
|
||||||
These are initial request messages.
|
These are initial request messages.
|
||||||
If the heatpump is not responding, it may help to turn off and on the power of the heatpump (switching the heatpump off is not enough).
|
To solve this problem you can try one of the follwing:
|
||||||
After a power on the heatpump should respond to the requests.
|
|
||||||
|
* enable the switch `error_reset`
|
||||||
|
* turn off and on the power of the heatpump (switching the heatpump off is not enough)
|
||||||
|
|
||||||
|
The heatpump will restart and should respond to the requests.
|
||||||
|
|
||||||
## Sources
|
## Sources
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,16 +85,15 @@ constexpr const uint8_t KnownModels[NUMBER_OF_MODELS][10] = {
|
||||||
{0x12, 0xD7, 0x0D, 0x98, 0x11, 0x33, 0x94, 0x0C, 0x83, 0x10}, // 55
|
{0x12, 0xD7, 0x0D, 0x98, 0x11, 0x33, 0x94, 0x0C, 0x83, 0x10}, // 55
|
||||||
{0xE2, 0xD5, 0x0B, 0x08, 0x95, 0x02, 0xD6, 0x0F, 0x67, 0x95}, // 56
|
{0xE2, 0xD5, 0x0B, 0x08, 0x95, 0x02, 0xD6, 0x0F, 0x67, 0x95}, // 56
|
||||||
{0xE2, 0xD5, 0x0D, 0x36, 0x99, 0x02, 0xD6, 0x10, 0x66, 0x95}, // 57
|
{0xE2, 0xD5, 0x0D, 0x36, 0x99, 0x02, 0xD6, 0x10, 0x66, 0x95}, // 57
|
||||||
{0xE2, 0xCF, 0x0B, 0x84, 0x05, 0x12, 0xD0, 0x0B, 0x93, 0x05}, // 58
|
{0xE2, 0xD5, 0x0F, 0x99, 0x94, 0x02, 0xD6, 0x10, 0x68, 0x95}, // 58
|
||||||
{0xE2, 0xD5, 0x0C, 0x67, 0x00, 0x83, 0x92, 0x0C, 0x28, 0x98}, // 59
|
{0xE2, 0xD5, 0x0C, 0x67, 0x00, 0x83, 0x92, 0x0C, 0x28, 0x98}, // 59
|
||||||
{0xE2, 0xD5, 0x0C, 0x67, 0x00, 0x83, 0x92, 0x0D, 0x29, 0x98}, // 60
|
{0xE2, 0xCF, 0x0D, 0x86, 0x05, 0x12, 0xD0, 0x0E, 0x95, 0x05}, // 60
|
||||||
{0xE2, 0xD5, 0x0D, 0x08, 0x95, 0x02, 0xD6, 0x10, 0x67, 0x95}, // 61
|
{0x12, 0xD7, 0x0C, 0x98, 0x14, 0x35, 0x94, 0x0D, 0x83, 0x10}, // 61
|
||||||
{0xE2, 0xD5, 0x0C, 0x08, 0x95, 0x02, 0xD6, 0x0D, 0x67, 0x95}, // 62
|
{0xE2, 0xD5, 0x0C, 0x08, 0x95, 0x02, 0xD6, 0x10, 0x67, 0x95}, // 62
|
||||||
{0xE2, 0xD5, 0x0C, 0x08, 0x95, 0x02, 0xD6, 0x10, 0x67, 0x95}, // 63
|
{0xC2, 0xD3, 0x0D, 0x35, 0x65, 0xB2, 0xD3, 0x0B, 0x96, 0x65}, // 63
|
||||||
{0xE2, 0xD5, 0x0C, 0x08, 0x95, 0x02, 0xD6, 0x10, 0x66, 0x95}, // 64
|
{0xE2, 0xD5, 0x0C, 0x29, 0x99, 0x83, 0x92, 0x0C, 0x29, 0x98}, // 64
|
||||||
{0xE2, 0xD5, 0x0B, 0x08, 0x95, 0x02, 0xD6, 0x0E, 0x68, 0x95}, // 65
|
{0x62, 0xD2, 0x0B, 0x45, 0x54, 0x42, 0xD2, 0x0B, 0x72, 0x66}, // 65
|
||||||
{0xE2, 0xCF, 0x0C, 0x88, 0x05, 0x12, 0xD0, 0x0C, 0x97, 0x05}, // 66
|
{0xE2, 0xCF, 0x0B, 0x82, 0x09, 0x12, 0xD0, 0x0B, 0x10, 0x11}, // 66
|
||||||
{0x12, 0xD7, 0x0D, 0x85, 0x11, 0x37, 0x94, 0x0E, 0x84, 0x10}, // 67
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int PanasonicDecode::getBit1(uint8_t input) {
|
int PanasonicDecode::getBit1(uint8_t input) {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
#define RESPONSE_MSG_SIZE 203
|
#define RESPONSE_MSG_SIZE 203
|
||||||
#endif
|
#endif
|
||||||
#ifndef NUMBER_OF_MODELS
|
#ifndef NUMBER_OF_MODELS
|
||||||
#define NUMBER_OF_MODELS 68
|
#define NUMBER_OF_MODELS 67
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
|
|
@ -70,8 +70,9 @@ class PanasonicDecode {
|
||||||
static const constexpr char* const HeatingControl[] = {"2", "Comfort", "Efficiency"};
|
static const constexpr char* const HeatingControl[] = {"2", "Comfort", "Efficiency"};
|
||||||
static const constexpr char* const SmartDHW[] = {"2", "Variable", "Standard"};
|
static const constexpr char* const SmartDHW[] = {"2", "Variable", "Standard"};
|
||||||
static const constexpr char* const QuietModePriority[] = {"2", "Sound", "Capacity"};
|
static const constexpr char* const QuietModePriority[] = {"2", "Sound", "Capacity"};
|
||||||
|
static const constexpr char* const DHWSensorSelection[] = {"2", "Top", "Center"};
|
||||||
static const constexpr char* const ModelNames[] = {
|
static const constexpr char* const ModelNames[] = {
|
||||||
"58", // string representation of number of known models (last model number + 1)
|
"67", // string representation of number of known models (last model number + 1)
|
||||||
"WH-MDC05H3E5", // 0
|
"WH-MDC05H3E5", // 0
|
||||||
"WH-MDC07H3E5", // 1
|
"WH-MDC07H3E5", // 1
|
||||||
"IDU:WH-SXC09H3E5, ODU:WH-UX09HE5", // 2
|
"IDU:WH-SXC09H3E5, ODU:WH-UX09HE5", // 2
|
||||||
|
|
@ -130,16 +131,15 @@ class PanasonicDecode {
|
||||||
"IDU:WH-ADC0316M9E8AN2, ODU:WH-WXG09ME8", // 55
|
"IDU:WH-ADC0316M9E8AN2, ODU:WH-WXG09ME8", // 55
|
||||||
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 56
|
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 56
|
||||||
"IDU:WH-ADC0309K3E5AN, ODU:WH-UDZ05KE5", // 57
|
"IDU:WH-ADC0309K3E5AN, ODU:WH-UDZ05KE5", // 57
|
||||||
"IDU:WH-SQC16H9E8, ODU:WH-UQ16HE8", // 58
|
"IDU:WH-ADC0309K3E5, ODU:WH-UDZ09KE5", // 58
|
||||||
"IDU:WH-ADC0509L3E5AN, ODU:WH-WDG07LE5", // 59
|
"IDU:WH-ADC0509L3E5AN, ODU:WH-WDG07LE5", // 59
|
||||||
"IDU:WH-ADC0509L3E5AN, ODU:WH-WDG09LE5", // 60
|
"IDU:WH-SXC12H9E8, ODU:WH-UX12HE8", // 60
|
||||||
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 61
|
"IDU:WH-SDC0316M9E8, ODU:WH-WXG09ME8", // 61
|
||||||
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 62
|
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 62
|
||||||
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ07KE5", // 63
|
"WH-MDC09J3E5-1", // 63
|
||||||
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ05KE5", // 64
|
"IDU:WH-ADC0509L3E5, ODU:WH-WDG09LE5", // 64
|
||||||
"IDU:WH-SDC0309K3E5, ODU:WH-UDZ09KE5", // 65
|
"IDU:WH-ADC0309J3E5, ODU:WH-UD09JE5-1", // 65
|
||||||
"IDU:WH-SDC09H3E8, ODU:WH-UD09HE8", // 66
|
"IDU:WH-SDC12H6E5, ODU:WH-UD12HE5", // 66
|
||||||
"WH-WXG12ME8", // 67
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ from esphome.const import (
|
||||||
CONF_MIN_VALUE,
|
CONF_MIN_VALUE,
|
||||||
CONF_MAX_VALUE,
|
CONF_MAX_VALUE,
|
||||||
CONF_STEP,
|
CONF_STEP,
|
||||||
|
CONF_MODE,
|
||||||
)
|
)
|
||||||
from .. import (
|
from .. import (
|
||||||
CONF_PANASONIC_HEATPUMP_ID,
|
CONF_PANASONIC_HEATPUMP_ID,
|
||||||
|
|
@ -49,6 +50,7 @@ CONF_SET29 = "set29" # Set Heating Off Outdoor Temp
|
||||||
CONF_SET36 = "set36" # Set Bivalent Start Temp
|
CONF_SET36 = "set36" # Set Bivalent Start Temp
|
||||||
CONF_SET37 = "set37" # Set Bivalent AP Start Temp
|
CONF_SET37 = "set37" # Set Bivalent AP Start Temp
|
||||||
CONF_SET38 = "set38" # Set Bivalent AP Stop Temp
|
CONF_SET38 = "set38" # Set Bivalent AP Stop Temp
|
||||||
|
CONF_SET46 = "set46" # Set Heater On Outdoor Temp
|
||||||
|
|
||||||
TYPES = [
|
TYPES = [
|
||||||
CONF_SET5,
|
CONF_SET5,
|
||||||
|
|
@ -84,6 +86,7 @@ TYPES = [
|
||||||
CONF_SET36,
|
CONF_SET36,
|
||||||
CONF_SET37,
|
CONF_SET37,
|
||||||
CONF_SET38,
|
CONF_SET38,
|
||||||
|
CONF_SET46,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -93,6 +96,9 @@ def number_options(min_val, max_val, step) -> cv.Schema:
|
||||||
cv.Optional(CONF_MIN_VALUE, default=min_val): cv.float_,
|
cv.Optional(CONF_MIN_VALUE, default=min_val): cv.float_,
|
||||||
cv.Optional(CONF_MAX_VALUE, default=max_val): cv.float_,
|
cv.Optional(CONF_MAX_VALUE, default=max_val): cv.float_,
|
||||||
cv.Optional(CONF_STEP, default=step): cv.float_range(min=1.0, max=10.0),
|
cv.Optional(CONF_STEP, default=step): cv.float_range(min=1.0, max=10.0),
|
||||||
|
cv.Optional(CONF_MODE, default="BOX"): cv.enum(
|
||||||
|
number.NUMBER_MODES, upper=True
|
||||||
|
),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
return schema
|
return schema
|
||||||
|
|
@ -254,6 +260,10 @@ CONFIG_SCHEMA = cv.Schema(
|
||||||
PanasonicHeatpumpNumber,
|
PanasonicHeatpumpNumber,
|
||||||
unit_of_measurement=UNIT_CELSIUS,
|
unit_of_measurement=UNIT_CELSIUS,
|
||||||
).extend(number_options(-10.0, 0.0, 1.0)),
|
).extend(number_options(-10.0, 0.0, 1.0)),
|
||||||
|
cv.Optional(CONF_SET46): number.number_schema(
|
||||||
|
PanasonicHeatpumpNumber,
|
||||||
|
unit_of_measurement=UNIT_CELSIUS,
|
||||||
|
).extend(number_options(-15.0, 20.0, 1.0)),
|
||||||
}
|
}
|
||||||
).extend(cv.COMPONENT_SCHEMA)
|
).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,9 @@ void PanasonicHeatpumpNumber::control(float value) {
|
||||||
case NumberIds::CONF_SET38:
|
case NumberIds::CONF_SET38:
|
||||||
this->parent_->set_command_byte(PanasonicCommand::setPlus128(value_int), 68);
|
this->parent_->set_command_byte(PanasonicCommand::setPlus128(value_int), 68);
|
||||||
break;
|
break;
|
||||||
|
case NumberIds::CONF_SET46:
|
||||||
|
this->parent_->set_command_byte(PanasonicCommand::setPlus128(value_int), 85);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
@ -129,26 +132,6 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
|
||||||
|
|
||||||
float new_state;
|
float new_state;
|
||||||
switch (this->id_) {
|
switch (this->id_) {
|
||||||
case NumberIds::CONF_SET11:
|
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[42]);
|
|
||||||
if (this->has_state() && this->state == new_state)
|
|
||||||
return;
|
|
||||||
break;
|
|
||||||
case NumberIds::CONF_SET20:
|
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[99]);
|
|
||||||
if (this->has_state() && this->state == new_state)
|
|
||||||
return;
|
|
||||||
break;
|
|
||||||
case NumberIds::CONF_SET18:
|
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[84]);
|
|
||||||
if (this->has_state() && this->state == new_state)
|
|
||||||
return;
|
|
||||||
break;
|
|
||||||
case NumberIds::CONF_SET19:
|
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[94]);
|
|
||||||
if (this->has_state() && this->state == new_state)
|
|
||||||
return;
|
|
||||||
break;
|
|
||||||
case NumberIds::CONF_SET5:
|
case NumberIds::CONF_SET5:
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[38]);
|
new_state = PanasonicDecode::getByteMinus128(data[38]);
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
|
|
@ -159,26 +142,6 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case NumberIds::CONF_SET16_01:
|
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[75]);
|
|
||||||
if (this->has_state() && this->state == new_state)
|
|
||||||
return;
|
|
||||||
break;
|
|
||||||
case NumberIds::CONF_SET16_02:
|
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[76]);
|
|
||||||
if (this->has_state() && this->state == new_state)
|
|
||||||
return;
|
|
||||||
break;
|
|
||||||
case NumberIds::CONF_SET16_04:
|
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[78]);
|
|
||||||
if (this->has_state() && this->state == new_state)
|
|
||||||
return;
|
|
||||||
break;
|
|
||||||
case NumberIds::CONF_SET16_03:
|
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[77]);
|
|
||||||
if (this->has_state() && this->state == new_state)
|
|
||||||
return;
|
|
||||||
break;
|
|
||||||
case NumberIds::CONF_SET7:
|
case NumberIds::CONF_SET7:
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[40]);
|
new_state = PanasonicDecode::getByteMinus128(data[40]);
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
|
|
@ -189,28 +152,33 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case NumberIds::CONF_SET16_09:
|
case NumberIds::CONF_SET11:
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[86]);
|
new_state = PanasonicDecode::getByteMinus128(data[42]);
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case NumberIds::CONF_SET16_10:
|
case NumberIds::CONF_SET15:
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[87]);
|
new_state = PanasonicDecode::getByteMinus1(data[45]);
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case NumberIds::CONF_SET16_12:
|
case NumberIds::CONF_SET16_01:
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[89]);
|
new_state = PanasonicDecode::getByteMinus128(data[75]);
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case NumberIds::CONF_SET16_11:
|
case NumberIds::CONF_SET16_02:
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[88]);
|
new_state = PanasonicDecode::getByteMinus128(data[76]);
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case NumberIds::CONF_SET29:
|
case NumberIds::CONF_SET16_03:
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[83]);
|
new_state = PanasonicDecode::getByteMinus128(data[77]);
|
||||||
|
if (this->has_state() && this->state == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case NumberIds::CONF_SET16_04:
|
||||||
|
new_state = PanasonicDecode::getByteMinus128(data[78]);
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
|
@ -224,13 +192,33 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
case NumberIds::CONF_SET16_07:
|
||||||
|
new_state = PanasonicDecode::getByteMinus128(data[81]);
|
||||||
|
if (this->has_state() && this->state == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
case NumberIds::CONF_SET16_08:
|
case NumberIds::CONF_SET16_08:
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[82]);
|
new_state = PanasonicDecode::getByteMinus128(data[82]);
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case NumberIds::CONF_SET16_07:
|
case NumberIds::CONF_SET16_09:
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[81]);
|
new_state = PanasonicDecode::getByteMinus128(data[86]);
|
||||||
|
if (this->has_state() && this->state == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case NumberIds::CONF_SET16_10:
|
||||||
|
new_state = PanasonicDecode::getByteMinus128(data[87]);
|
||||||
|
if (this->has_state() && this->state == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case NumberIds::CONF_SET16_11:
|
||||||
|
new_state = PanasonicDecode::getByteMinus128(data[88]);
|
||||||
|
if (this->has_state() && this->state == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case NumberIds::CONF_SET16_12:
|
||||||
|
new_state = PanasonicDecode::getByteMinus128(data[89]);
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
|
@ -244,18 +232,28 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case NumberIds::CONF_SET16_16:
|
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[93]);
|
|
||||||
if (this->has_state() && this->state == new_state)
|
|
||||||
return;
|
|
||||||
break;
|
|
||||||
case NumberIds::CONF_SET16_15:
|
case NumberIds::CONF_SET16_15:
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[92]);
|
new_state = PanasonicDecode::getByteMinus128(data[92]);
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case NumberIds::CONF_SET15:
|
case NumberIds::CONF_SET16_16:
|
||||||
new_state = PanasonicDecode::getByteMinus1(data[45]);
|
new_state = PanasonicDecode::getByteMinus128(data[93]);
|
||||||
|
if (this->has_state() && this->state == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case NumberIds::CONF_SET18:
|
||||||
|
new_state = PanasonicDecode::getByteMinus128(data[84]);
|
||||||
|
if (this->has_state() && this->state == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case NumberIds::CONF_SET19:
|
||||||
|
new_state = PanasonicDecode::getByteMinus128(data[94]);
|
||||||
|
if (this->has_state() && this->state == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case NumberIds::CONF_SET20:
|
||||||
|
new_state = PanasonicDecode::getByteMinus128(data[99]);
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
|
@ -279,6 +277,11 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
case NumberIds::CONF_SET29:
|
||||||
|
new_state = PanasonicDecode::getByteMinus128(data[83]);
|
||||||
|
if (this->has_state() && this->state == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
case NumberIds::CONF_SET36:
|
case NumberIds::CONF_SET36:
|
||||||
new_state = PanasonicDecode::getByteMinus128(data[65]);
|
new_state = PanasonicDecode::getByteMinus128(data[65]);
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
|
|
@ -294,6 +297,11 @@ void PanasonicHeatpumpNumber::publish_new_state(const std::vector<uint8_t>& data
|
||||||
if (this->has_state() && this->state == new_state)
|
if (this->has_state() && this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
case NumberIds::CONF_SET46:
|
||||||
|
new_state = PanasonicDecode::getByteMinus128(data[85]);
|
||||||
|
if (this->has_state() && this->state == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ enum NumberIds : uint8_t {
|
||||||
CONF_SET36,
|
CONF_SET36,
|
||||||
CONF_SET37,
|
CONF_SET37,
|
||||||
CONF_SET38,
|
CONF_SET38,
|
||||||
|
CONF_SET46,
|
||||||
};
|
};
|
||||||
|
|
||||||
class PanasonicHeatpumpNumber : public number::Number,
|
class PanasonicHeatpumpNumber : public number::Number,
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
#include "commands.h"
|
#include "commands.h"
|
||||||
|
|
||||||
#ifndef PANASONIC_HEATPUMP_VERSION
|
#ifndef PANASONIC_HEATPUMP_VERSION
|
||||||
#define PANASONIC_HEATPUMP_VERSION "0.0.8-beta.3"
|
#define PANASONIC_HEATPUMP_VERSION "0.0.9-beta.1"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef KEEP_STATE
|
#ifndef KEEP_STATE
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,9 @@ CONF_SET39 = "set39" # Set Heating Control
|
||||||
CONF_SET40 = "set40" # Set Smart DHW
|
CONF_SET40 = "set40" # Set Smart DHW
|
||||||
CONF_SET41 = "set41" # Set Quiet Mode Priority
|
CONF_SET41 = "set41" # Set Quiet Mode Priority
|
||||||
CONF_SET42 = "set42" # Set Pump Flow Rate Mode
|
CONF_SET42 = "set42" # Set Pump Flow Rate Mode
|
||||||
|
CONF_SET43 = "set43" # Set DHW Sensor Selection
|
||||||
|
CONF_SET44 = "set44" # Set DHW Heater State
|
||||||
|
CONF_SET45 = "set45" # Set Room Heater State
|
||||||
|
|
||||||
TYPES = [
|
TYPES = [
|
||||||
CONF_SET2,
|
CONF_SET2,
|
||||||
|
|
@ -33,6 +36,9 @@ TYPES = [
|
||||||
CONF_SET40,
|
CONF_SET40,
|
||||||
CONF_SET41,
|
CONF_SET41,
|
||||||
CONF_SET42,
|
CONF_SET42,
|
||||||
|
CONF_SET43,
|
||||||
|
CONF_SET44,
|
||||||
|
CONF_SET45,
|
||||||
]
|
]
|
||||||
|
|
||||||
CONF_SELECTS = [
|
CONF_SELECTS = [
|
||||||
|
|
@ -81,6 +87,18 @@ CONF_SELECTS = [
|
||||||
"DeltaT",
|
"DeltaT",
|
||||||
"Max. Duty",
|
"Max. Duty",
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
"Top",
|
||||||
|
"Center",
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Blocked",
|
||||||
|
"Free",
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Blocked",
|
||||||
|
"Free",
|
||||||
|
],
|
||||||
]
|
]
|
||||||
|
|
||||||
CONF_SELECT_COOL_MODE = [
|
CONF_SELECT_COOL_MODE = [
|
||||||
|
|
@ -136,6 +154,15 @@ CONFIG_SCHEMA = cv.Schema(
|
||||||
cv.Optional(CONF_SET42): select.select_schema(
|
cv.Optional(CONF_SET42): select.select_schema(
|
||||||
PanasonicHeatpumpSelect,
|
PanasonicHeatpumpSelect,
|
||||||
),
|
),
|
||||||
|
cv.Optional(CONF_SET43): select.select_schema(
|
||||||
|
PanasonicHeatpumpSelect,
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_SET44): select.select_schema(
|
||||||
|
PanasonicHeatpumpSelect,
|
||||||
|
),
|
||||||
|
cv.Optional(CONF_SET45): select.select_schema(
|
||||||
|
PanasonicHeatpumpSelect,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
).extend(cv.COMPONENT_SCHEMA)
|
).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,15 @@ void PanasonicHeatpumpSelect::control(const std::string& value) {
|
||||||
case SelectIds::CONF_SET42:
|
case SelectIds::CONF_SET42:
|
||||||
this->parent_->set_command_byte(PanasonicCommand::setPlus1Multiply16(index), 29);
|
this->parent_->set_command_byte(PanasonicCommand::setPlus1Multiply16(index), 29);
|
||||||
break;
|
break;
|
||||||
|
case SelectIds::CONF_SET43:
|
||||||
|
this->parent_->set_command_byte(PanasonicCommand::setPlus1(index), 11);
|
||||||
|
break;
|
||||||
|
case SelectIds::CONF_SET44:
|
||||||
|
this->parent_->set_command_byte(PanasonicCommand::setPlus1Multiply4(index), 9);
|
||||||
|
break;
|
||||||
|
case SelectIds::CONF_SET45:
|
||||||
|
this->parent_->set_command_byte(PanasonicCommand::setPlus1(index), 9);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
@ -67,14 +76,8 @@ void PanasonicHeatpumpSelect::publish_new_state(const std::vector<uint8_t>& data
|
||||||
|
|
||||||
std::string new_state;
|
std::string new_state;
|
||||||
switch (this->id_) {
|
switch (this->id_) {
|
||||||
case SelectIds::CONF_SET9:
|
case SelectIds::CONF_SET2:
|
||||||
new_state =
|
new_state = PanasonicDecode::getTextState(PanasonicDecode::HolidayState, PanasonicDecode::getBit3and4(data[5]));
|
||||||
PanasonicDecode::getTextState(PanasonicDecode::OperationMode, PanasonicDecode::getOperationMode(data[6]));
|
|
||||||
if (this->has_state() && this->current_option() == new_state)
|
|
||||||
return;
|
|
||||||
break;
|
|
||||||
case SelectIds::CONF_SET4:
|
|
||||||
new_state = PanasonicDecode::getTextState(PanasonicDecode::PowerfulMode, PanasonicDecode::getBit6and7and8(data[7]));
|
|
||||||
if (this->has_state() && this->current_option() == new_state)
|
if (this->has_state() && this->current_option() == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
|
@ -83,8 +86,14 @@ void PanasonicHeatpumpSelect::publish_new_state(const std::vector<uint8_t>& data
|
||||||
if (this->has_state() && this->current_option() == new_state)
|
if (this->has_state() && this->current_option() == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case SelectIds::CONF_SET2:
|
case SelectIds::CONF_SET4:
|
||||||
new_state = PanasonicDecode::getTextState(PanasonicDecode::HolidayState, PanasonicDecode::getBit3and4(data[5]));
|
new_state = PanasonicDecode::getTextState(PanasonicDecode::PowerfulMode, PanasonicDecode::getBit6and7and8(data[7]));
|
||||||
|
if (this->has_state() && this->current_option() == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case SelectIds::CONF_SET9:
|
||||||
|
new_state =
|
||||||
|
PanasonicDecode::getTextState(PanasonicDecode::OperationMode, PanasonicDecode::getOperationMode(data[6]));
|
||||||
if (this->has_state() && this->current_option() == new_state)
|
if (this->has_state() && this->current_option() == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
|
@ -126,6 +135,22 @@ void PanasonicHeatpumpSelect::publish_new_state(const std::vector<uint8_t>& data
|
||||||
if (this->has_state() && this->current_option() == new_state)
|
if (this->has_state() && this->current_option() == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
case SelectIds::CONF_SET43:
|
||||||
|
new_state =
|
||||||
|
PanasonicDecode::getTextState(PanasonicDecode::DHWSensorSelection, PanasonicDecode::getBit7and8(data[11]));
|
||||||
|
if (this->has_state() && this->current_option() == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case SelectIds::CONF_SET44:
|
||||||
|
new_state = PanasonicDecode::getTextState(PanasonicDecode::BlockedFree, PanasonicDecode::getBit5and6(data[9]));
|
||||||
|
if (this->has_state() && this->current_option() == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case SelectIds::CONF_SET45:
|
||||||
|
new_state = PanasonicDecode::getTextState(PanasonicDecode::BlockedFree, PanasonicDecode::getBit7and8(data[9]));
|
||||||
|
if (this->has_state() && this->current_option() == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,9 @@ enum SelectIds : uint8_t {
|
||||||
CONF_SET40,
|
CONF_SET40,
|
||||||
CONF_SET41,
|
CONF_SET41,
|
||||||
CONF_SET42,
|
CONF_SET42,
|
||||||
|
CONF_SET43,
|
||||||
|
CONF_SET44,
|
||||||
|
CONF_SET45,
|
||||||
};
|
};
|
||||||
|
|
||||||
class PanasonicHeatpumpSelect : public select::Select,
|
class PanasonicHeatpumpSelect : public select::Select,
|
||||||
|
|
|
||||||
|
|
@ -588,16 +588,16 @@ CONFIG_SCHEMA = cv.Schema(
|
||||||
cv.Optional(CONF_TOP62): sensor.sensor_schema(
|
cv.Optional(CONF_TOP62): sensor.sensor_schema(
|
||||||
PanasonicHeatpumpSensor,
|
PanasonicHeatpumpSensor,
|
||||||
accuracy_decimals=2,
|
accuracy_decimals=2,
|
||||||
icon=ICON_FAN,
|
|
||||||
state_class=STATE_CLASS_MEASUREMENT,
|
state_class=STATE_CLASS_MEASUREMENT,
|
||||||
unit_of_measurement=UNIT_ROTATIONS_PER_MINUTE,
|
unit_of_measurement=UNIT_ROTATIONS_PER_MINUTE,
|
||||||
|
icon=ICON_FAN,
|
||||||
),
|
),
|
||||||
cv.Optional(CONF_TOP63): sensor.sensor_schema(
|
cv.Optional(CONF_TOP63): sensor.sensor_schema(
|
||||||
PanasonicHeatpumpSensor,
|
PanasonicHeatpumpSensor,
|
||||||
accuracy_decimals=2,
|
accuracy_decimals=2,
|
||||||
icon=ICON_FAN,
|
|
||||||
state_class=STATE_CLASS_MEASUREMENT,
|
state_class=STATE_CLASS_MEASUREMENT,
|
||||||
unit_of_measurement=UNIT_ROTATIONS_PER_MINUTE,
|
unit_of_measurement=UNIT_ROTATIONS_PER_MINUTE,
|
||||||
|
icon=ICON_FAN,
|
||||||
),
|
),
|
||||||
cv.Optional(CONF_TOP64): sensor.sensor_schema(
|
cv.Optional(CONF_TOP64): sensor.sensor_schema(
|
||||||
PanasonicHeatpumpSensor,
|
PanasonicHeatpumpSensor,
|
||||||
|
|
@ -924,9 +924,9 @@ CONFIG_SCHEMA = cv.Schema(
|
||||||
cv.Optional(CONF_TOP142): sensor.sensor_schema(
|
cv.Optional(CONF_TOP142): sensor.sensor_schema(
|
||||||
PanasonicHeatpumpSensor,
|
PanasonicHeatpumpSensor,
|
||||||
accuracy_decimals=0,
|
accuracy_decimals=0,
|
||||||
icon=ICON_VALVE,
|
|
||||||
state_class=STATE_CLASS_MEASUREMENT,
|
state_class=STATE_CLASS_MEASUREMENT,
|
||||||
unit_of_measurement=UNIT_EMPTY,
|
unit_of_measurement=UNIT_EMPTY,
|
||||||
|
icon=ICON_VALVE,
|
||||||
),
|
),
|
||||||
cv.Optional(CONF_XTOP0): sensor.sensor_schema(
|
cv.Optional(CONF_XTOP0): sensor.sensor_schema(
|
||||||
PanasonicHeatpumpSensor,
|
PanasonicHeatpumpSensor,
|
||||||
|
|
|
||||||
|
|
@ -83,11 +83,6 @@ void PanasonicHeatpumpSwitch::publish_new_state(const std::vector<uint8_t>& data
|
||||||
if (this->state == new_state)
|
if (this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case SwitchIds::CONF_SET24:
|
|
||||||
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit1and2(data[5]));
|
|
||||||
if (this->state == new_state)
|
|
||||||
return;
|
|
||||||
break;
|
|
||||||
case SwitchIds::CONF_SET12:
|
case SwitchIds::CONF_SET12:
|
||||||
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[111]));
|
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[111]));
|
||||||
if (this->state == new_state)
|
if (this->state == new_state)
|
||||||
|
|
@ -98,8 +93,8 @@ void PanasonicHeatpumpSwitch::publish_new_state(const std::vector<uint8_t>& data
|
||||||
if (this->state == new_state)
|
if (this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case SwitchIds::CONF_SET28:
|
case SwitchIds::CONF_SET24:
|
||||||
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[24]));
|
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit1and2(data[5]));
|
||||||
if (this->state == new_state)
|
if (this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
|
@ -108,13 +103,13 @@ void PanasonicHeatpumpSwitch::publish_new_state(const std::vector<uint8_t>& data
|
||||||
if (this->state == new_state)
|
if (this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case SwitchIds::CONF_SET30:
|
case SwitchIds::CONF_SET28:
|
||||||
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit7and8(data[23]));
|
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[24]));
|
||||||
if (this->state == new_state)
|
if (this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case SwitchIds::CONF_SET33:
|
case SwitchIds::CONF_SET30:
|
||||||
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[23]));
|
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit7and8(data[23]));
|
||||||
if (this->state == new_state)
|
if (this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
|
@ -128,6 +123,11 @@ void PanasonicHeatpumpSwitch::publish_new_state(const std::vector<uint8_t>& data
|
||||||
if (this->state == new_state)
|
if (this->state == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
case SwitchIds::CONF_SET33:
|
||||||
|
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit5and6(data[23]));
|
||||||
|
if (this->state == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
case SwitchIds::CONF_SET34:
|
case SwitchIds::CONF_SET34:
|
||||||
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit7and8(data[26]));
|
new_state = PanasonicDecode::getBinaryState(PanasonicDecode::getBit7and8(data[26]));
|
||||||
if (this->state == new_state)
|
if (this->state == new_state)
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ ICON_THERMOMETER = "mdi:thermometer"
|
||||||
ICON_BIVALENT = "mdi:vector-combine"
|
ICON_BIVALENT = "mdi:vector-combine"
|
||||||
ICON_HEATING_CONTROL = "mdi:thermostat-auto"
|
ICON_HEATING_CONTROL = "mdi:thermostat-auto"
|
||||||
ICON_SMART_DHW = "mdi:water-boiler-auto"
|
ICON_SMART_DHW = "mdi:water-boiler-auto"
|
||||||
|
ICON_DHW = "mdi:water-boiler"
|
||||||
|
|
||||||
CONF_TOP4 = "top4" # Operation Mode
|
CONF_TOP4 = "top4" # Operation Mode
|
||||||
# TODO: Split up top4 into top4_1 (Heating Mode State) and top4_2 (DHW Mode State)
|
# TODO: Split up top4 into top4_1 (Heating Mode State) and top4_2 (DHW Mode State)
|
||||||
|
|
@ -52,6 +53,7 @@ CONF_TOP130 = "top130" # Bivalent Mode
|
||||||
CONF_TOP139 = "top139" # HeatingControl
|
CONF_TOP139 = "top139" # HeatingControl
|
||||||
CONF_TOP140 = "top140" # SmartDHW
|
CONF_TOP140 = "top140" # SmartDHW
|
||||||
CONF_TOP141 = "top141" # Quiet Mode Priority
|
CONF_TOP141 = "top141" # Quiet Mode Priority
|
||||||
|
CONF_TOP143 = "top143" # DHW Sensor Selection
|
||||||
|
|
||||||
TYPES = [
|
TYPES = [
|
||||||
CONF_TOP4,
|
CONF_TOP4,
|
||||||
|
|
@ -78,6 +80,7 @@ TYPES = [
|
||||||
CONF_TOP139,
|
CONF_TOP139,
|
||||||
CONF_TOP140,
|
CONF_TOP140,
|
||||||
CONF_TOP141,
|
CONF_TOP141,
|
||||||
|
CONF_TOP143,
|
||||||
]
|
]
|
||||||
|
|
||||||
PanasonicHeatpumpTextSensor = panasonic_heatpump_ns.class_(
|
PanasonicHeatpumpTextSensor = panasonic_heatpump_ns.class_(
|
||||||
|
|
@ -185,6 +188,10 @@ CONFIG_SCHEMA = cv.Schema(
|
||||||
PanasonicHeatpumpTextSensor,
|
PanasonicHeatpumpTextSensor,
|
||||||
icon=ICON_QUIET_MODE,
|
icon=ICON_QUIET_MODE,
|
||||||
),
|
),
|
||||||
|
cv.Optional(CONF_TOP143): text_sensor.text_sensor_schema(
|
||||||
|
PanasonicHeatpumpTextSensor,
|
||||||
|
icon=ICON_DHW,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
).extend(cv.COMPONENT_SCHEMA)
|
).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,12 @@ void PanasonicHeatpumpTextSensor::publish_new_state(const std::vector<uint8_t>&
|
||||||
if (this->has_state() && this->get_state() == new_state)
|
if (this->has_state() && this->get_state() == new_state)
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
case TextSensorIds::CONF_TOP143:
|
||||||
|
new_state =
|
||||||
|
PanasonicDecode::getTextState(PanasonicDecode::DHWSensorSelection, PanasonicDecode::getBit7and8(data[11]));
|
||||||
|
if (this->has_state() && this->get_state() == new_state)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ enum TextSensorIds : uint8_t {
|
||||||
CONF_TOP139,
|
CONF_TOP139,
|
||||||
CONF_TOP140,
|
CONF_TOP140,
|
||||||
CONF_TOP141,
|
CONF_TOP141,
|
||||||
|
CONF_TOP143,
|
||||||
};
|
};
|
||||||
|
|
||||||
class PanasonicHeatpumpTextSensor : public text_sensor::TextSensor,
|
class PanasonicHeatpumpTextSensor : public text_sensor::TextSensor,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue