mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-24 19:26:37 +00:00
Fix multipler not applied #9499
This commit is contained in:
parent
3264acfffe
commit
737e5b260f
@ -1478,12 +1478,12 @@ void ZCLFrame::syntheticAqaraSensor(Z_attribute_list &attr_list, class Z_attribu
|
|||||||
Z_attribute attr; // temporary attribute
|
Z_attribute attr; // temporary attribute
|
||||||
i += parseSingleAttribute(attr, buf2, i);
|
i += parseSingleAttribute(attr, buf2, i);
|
||||||
int32_t ival32 = attr.getInt();
|
int32_t ival32 = attr.getInt();
|
||||||
float fval = attr.getFloat();
|
uint32_t uval32 = attr.getUInt();
|
||||||
bool translated = false; // were we able to translate to a known format?
|
bool translated = false; // were we able to translate to a known format?
|
||||||
if (0x01 == attrid) {
|
if (0x01 == attrid) {
|
||||||
float batteryvoltage = fval / 100;
|
float batteryvoltage = attr.getFloat() / 100;
|
||||||
attr_list.addAttribute(0x0001, 0x0020).setFloat(batteryvoltage);
|
attr_list.addAttribute(0x0001, 0x0020).setFloat(batteryvoltage);
|
||||||
uint8_t batterypercentage = toPercentageCR2032(fval);
|
uint8_t batterypercentage = toPercentageCR2032(uval32);
|
||||||
attr_list.addAttribute(0x0001, 0x0021).setUInt(batterypercentage * 2);
|
attr_list.addAttribute(0x0001, 0x0021).setUInt(batterypercentage * 2);
|
||||||
} else if ((nullptr != modelId) && (0 == getManufCode())) {
|
} else if ((nullptr != modelId) && (0 == getManufCode())) {
|
||||||
translated = true;
|
translated = true;
|
||||||
@ -1495,7 +1495,7 @@ void ZCLFrame::syntheticAqaraSensor(Z_attribute_list &attr_list, class Z_attribu
|
|||||||
if (0x64 == attrid) {
|
if (0x64 == attrid) {
|
||||||
attr_list.addAttribute(0x0402, 0x0000).setInt(ival32); // Temperature
|
attr_list.addAttribute(0x0402, 0x0000).setInt(ival32); // Temperature
|
||||||
} else if (0x65 == attrid) {
|
} else if (0x65 == attrid) {
|
||||||
attr_list.addAttribute(0x0405, 0x0000).setFloat(fval); // Humidity * 100
|
attr_list.addAttribute(0x0405, 0x0000).setUInt(uval32); // Humidity * 100
|
||||||
} else if (0x66 == attrid) {
|
} else if (0x66 == attrid) {
|
||||||
attr_list.addAttribute(0x0403, 0x0000).setUInt((ival32 + 50) / 100); // Pressure
|
attr_list.addAttribute(0x0403, 0x0000).setUInt((ival32 + 50) / 100); // Pressure
|
||||||
}
|
}
|
||||||
@ -1718,6 +1718,7 @@ void ZCLFrame::postProcessAttributes(uint16_t shortaddr, Z_attribute_list& attr_
|
|||||||
Z_Data_Type map_type;
|
Z_Data_Type map_type;
|
||||||
uint8_t map_offset;
|
uint8_t map_offset;
|
||||||
uint8_t zigbee_type;
|
uint8_t zigbee_type;
|
||||||
|
int8_t conv_multiplier;
|
||||||
for (uint32_t i = 0; i < ARRAY_SIZE(Z_PostProcess); i++) {
|
for (uint32_t i = 0; i < ARRAY_SIZE(Z_PostProcess); i++) {
|
||||||
const Z_AttributeConverter *converter = &Z_PostProcess[i];
|
const Z_AttributeConverter *converter = &Z_PostProcess[i];
|
||||||
uint16_t conv_cluster = CxToCluster(pgm_read_byte(&converter->cluster_short));
|
uint16_t conv_cluster = CxToCluster(pgm_read_byte(&converter->cluster_short));
|
||||||
@ -1725,6 +1726,7 @@ void ZCLFrame::postProcessAttributes(uint16_t shortaddr, Z_attribute_list& attr_
|
|||||||
|
|
||||||
if ((conv_cluster == cluster) &&
|
if ((conv_cluster == cluster) &&
|
||||||
((conv_attribute == attribute) || (conv_attribute == 0xFFFF)) ) {
|
((conv_attribute == attribute) || (conv_attribute == 0xFFFF)) ) {
|
||||||
|
conv_multiplier = CmToMultiplier(pgm_read_byte(&converter->multiplier_idx));
|
||||||
zigbee_type = pgm_read_byte(&converter->type);
|
zigbee_type = pgm_read_byte(&converter->type);
|
||||||
uint8_t mapping = pgm_read_byte(&converter->mapping);
|
uint8_t mapping = pgm_read_byte(&converter->mapping);
|
||||||
map_type = (Z_Data_Type) ((mapping & 0xF0)>>4);
|
map_type = (Z_Data_Type) ((mapping & 0xF0)>>4);
|
||||||
@ -1735,7 +1737,6 @@ void ZCLFrame::postProcessAttributes(uint16_t shortaddr, Z_attribute_list& attr_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// apply multiplier if needed
|
|
||||||
float fval = attr.getFloat();
|
float fval = attr.getFloat();
|
||||||
if (found && (map_type != Z_Data_Type::Z_Unknown)) {
|
if (found && (map_type != Z_Data_Type::Z_Unknown)) {
|
||||||
// We apply an automatic mapping to Z_Data_XXX object
|
// We apply an automatic mapping to Z_Data_XXX object
|
||||||
@ -1772,6 +1773,16 @@ void ZCLFrame::postProcessAttributes(uint16_t shortaddr, Z_attribute_list& attr_
|
|||||||
case 0x00068000: device.setPower(attr.getBool(), src_ep); break;
|
case 0x00068000: device.setPower(attr.getBool(), src_ep); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// now apply the multiplier to make it human readable
|
||||||
|
if (found) {
|
||||||
|
if (0 == conv_multiplier) { attr_list.removeAttribute(&attr); continue; } // remove attribute if multiplier is zero
|
||||||
|
if (1 != conv_multiplier) {
|
||||||
|
if (conv_multiplier > 0) { fval = fval * conv_multiplier; }
|
||||||
|
else { fval = fval / (-conv_multiplier); }
|
||||||
|
attr.setFloat(fval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Replace cluster/attribute with name
|
// Replace cluster/attribute with name
|
||||||
if (found) {
|
if (found) {
|
||||||
if (0x00 != pgm_read_byte(conv_name)) {// if name is not null, replace it
|
if (0x00 != pgm_read_byte(conv_name)) {// if name is not null, replace it
|
||||||
|
Loading…
x
Reference in New Issue
Block a user