mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-25 03:36:42 +00:00
Zigbee fix regression when reporting a command
This commit is contained in:
parent
5d63fc1cf0
commit
d0f5c80ae1
@ -317,6 +317,7 @@ public:
|
|||||||
// if suffix == 0, we don't care and find the first match
|
// if suffix == 0, we don't care and find the first match
|
||||||
Z_attribute & findOrCreateAttribute(uint16_t cluster, uint16_t attr_id, uint8_t suffix = 0);
|
Z_attribute & findOrCreateAttribute(uint16_t cluster, uint16_t attr_id, uint8_t suffix = 0);
|
||||||
Z_attribute & findOrCreateAttribute(const char * name, uint8_t suffix = 0);
|
Z_attribute & findOrCreateAttribute(const char * name, uint8_t suffix = 0);
|
||||||
|
Z_attribute & findOrCreateCmd(uint16_t cluster, uint8_t cmd_id, bool direction, uint8_t suffix = 0);
|
||||||
// always care about suffix
|
// always care about suffix
|
||||||
Z_attribute & findOrCreateAttribute(const Z_attribute &attr);
|
Z_attribute & findOrCreateAttribute(const Z_attribute &attr);
|
||||||
// replace attribute with new value, suffix does care
|
// replace attribute with new value, suffix does care
|
||||||
@ -558,27 +559,25 @@ bool Z_attribute::equalsKey(const Z_attribute & attr2, bool ignore_key_suffix) c
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Z_attribute::equalsId(uint16_t _cluster, uint16_t _attr_id, uint8_t suffix) const {
|
bool Z_attribute::equalsId(uint16_t _cluster, uint16_t _attr_id, uint8_t suffix) const {
|
||||||
if (!key_is_str) {
|
if (key_is_cmd || key_is_str) { return false; }
|
||||||
if ((this->cluster == _cluster) && (this->attr_id == _attr_id) && (!this->key_is_cmd)) {
|
if ((this->cluster == _cluster) && (this->attr_id == _attr_id) && (!this->key_is_cmd)) {
|
||||||
if (suffix) {
|
if (suffix) {
|
||||||
if (key_suffix == suffix) { return true; }
|
if (key_suffix == suffix) { return true; }
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Z_attribute::equalsCmd(uint16_t _cluster, uint8_t _cmd_id, bool _direction, uint8_t suffix) const {
|
bool Z_attribute::equalsCmd(uint16_t _cluster, uint8_t _cmd_id, bool _direction, uint8_t suffix) const {
|
||||||
if (!key_is_str) {
|
if (!key_is_cmd ||key_is_str) { return false; }
|
||||||
uint16_t _attr_id = _cmd_id | (_direction ? 0x100 : 0x000);
|
uint16_t _attr_id = _cmd_id | (_direction ? 0x100 : 0x000);
|
||||||
if ((this->cluster == _cluster) && (this->attr_id == _attr_id) && (!this->key_is_cmd)) {
|
if ((this->cluster == _cluster) && (this->attr_id == _attr_id) && (!this->key_is_cmd)) {
|
||||||
if (suffix) {
|
if (suffix) {
|
||||||
if (key_suffix == suffix) { return true; }
|
if (key_suffix == suffix) { return true; }
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -813,7 +812,7 @@ Z_attribute & Z_attribute_list::addAttributeCmd(uint16_t cluster, uint8_t cmd_id
|
|||||||
Z_attribute & attr = addToLast();
|
Z_attribute & attr = addToLast();
|
||||||
attr.cluster = cluster;
|
attr.cluster = cluster;
|
||||||
attr.attr_id = cmd_id | (direction ? 0x100 : 0);
|
attr.attr_id = cmd_id | (direction ? 0x100 : 0);
|
||||||
attr.key_is_str = true;
|
attr.key_is_cmd = true;
|
||||||
if (!suffix) { attr.key_suffix = countAttribute(attr.cluster, attr.attr_id); }
|
if (!suffix) { attr.key_suffix = countAttribute(attr.cluster, attr.attr_id); }
|
||||||
else { attr.key_suffix = suffix; }
|
else { attr.key_suffix = suffix; }
|
||||||
return attr;
|
return attr;
|
||||||
@ -891,7 +890,7 @@ const Z_attribute * Z_attribute_list::findAttribute(const Z_attribute &attr) con
|
|||||||
|
|
||||||
const Z_attribute * Z_attribute_list::findAttribute(uint16_t cluster, uint16_t attr_id, uint8_t suffix) const {
|
const Z_attribute * Z_attribute_list::findAttribute(uint16_t cluster, uint16_t attr_id, uint8_t suffix) const {
|
||||||
for (const auto & attr : *this) {
|
for (const auto & attr : *this) {
|
||||||
if (attr.equalsId(cluster, attr_id, suffix)) { return &attr; }
|
if (attr.equalsId(cluster, attr_id, suffix) && !attr.key_is_cmd) { return &attr; }
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -916,6 +915,11 @@ Z_attribute & Z_attribute_list::findOrCreateAttribute(uint16_t cluster, uint16_t
|
|||||||
return found ? *found : addAttribute(cluster, attr_id, suffix);
|
return found ? *found : addAttribute(cluster, attr_id, suffix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Z_attribute & Z_attribute_list::findOrCreateCmd(uint16_t cluster, uint8_t cmd_id, bool direction, uint8_t suffix) {
|
||||||
|
Z_attribute * found = findAttributeCmd(cluster, cmd_id, direction, suffix);
|
||||||
|
return found ? *found : addAttributeCmd(cluster, cmd_id, direction, suffix);
|
||||||
|
}
|
||||||
|
|
||||||
const Z_attribute * Z_attribute_list::findAttribute(const char * name, uint8_t suffix) const {
|
const Z_attribute * Z_attribute_list::findAttribute(const char * name, uint8_t suffix) const {
|
||||||
for (const auto & attr : *this) {
|
for (const auto & attr : *this) {
|
||||||
if (attr.equalsKey(name, suffix)) { return &attr; }
|
if (attr.equalsKey(name, suffix)) { return &attr; }
|
||||||
@ -938,7 +942,9 @@ Z_attribute & Z_attribute_list::findOrCreateAttribute(const char * name, uint8_t
|
|||||||
// same but passing a Z_attribute as key
|
// same but passing a Z_attribute as key
|
||||||
Z_attribute & Z_attribute_list::findOrCreateAttribute(const Z_attribute &attr) {
|
Z_attribute & Z_attribute_list::findOrCreateAttribute(const Z_attribute &attr) {
|
||||||
Z_attribute & ret = attr.key_is_str ? findOrCreateAttribute(attr.key, attr.key_suffix)
|
Z_attribute & ret = attr.key_is_str ? findOrCreateAttribute(attr.key, attr.key_suffix)
|
||||||
: findOrCreateAttribute(attr.cluster, attr.attr_id, attr.key_suffix);
|
: attr.key_is_cmd ?
|
||||||
|
findOrCreateCmd(attr.cluster, attr.attr_id & 0xFF, attr.attr_id & 0x100 ? true : false, attr.key_suffix)
|
||||||
|
: findOrCreateAttribute(attr.cluster, attr.attr_id, attr.key_suffix);
|
||||||
ret.key_suffix = attr.key_suffix;
|
ret.key_suffix = attr.key_suffix;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user