Change format of KNX Energy to match specifications (#21074)

* take 1

* refactor knx enhancement

* round on energy + auto show temp/hum sensors
This commit is contained in:
Barbudor 2024-03-31 21:15:53 +02:00 committed by GitHub
parent 60666fa1c5
commit 0422b25e31
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -210,6 +210,50 @@ const char kKnxCommands[] PROGMEM = D_PRFX_KNX "|" // Prefix
void (* const KnxCommand[])(void) PROGMEM = { void (* const KnxCommand[])(void) PROGMEM = {
&CmndKnxTxCmnd, &CmndKnxTxVal, &CmndKnxEnabled, &CmndKnxEnhanced, &CmndKnxPa, &CmndKnxGa, &CmndKnxCb, &CmndKnxTxScene }; &CmndKnxTxCmnd, &CmndKnxTxVal, &CmndKnxEnabled, &CmndKnxEnhanced, &CmndKnxPa, &CmndKnxGa, &CmndKnxCb, &CmndKnxTxScene };
#ifndef KNX_ENHANCEMENT_REPEAT
#define KNX_ENHANCEMENT_REPEAT 3
#endif
void KNX_Send_1bit(address_t const &receiver, uint8_t value, knx_command_type_t ct)
{
uint8_t repeat = Settings->flag.knx_enable_enhancement ? KNX_ENHANCEMENT_REPEAT : 1;
while ( repeat-- )
knx.send_1bit(receiver, ct, value);
}
#define KNX_WRITE_1BIT(r,v) KNX_Send_1bit((r),(v),KNX_CT_WRITE)
#define KNX_ANSWER_1BIT(r,v) KNX_Send_1bit((r),(v),KNX_CT_ANSWER)
void KNX_Send_1byte_uint(address_t const &receiver, uint8_t value, knx_command_type_t ct)
{
uint8_t repeat = Settings->flag.knx_enable_enhancement ? KNX_ENHANCEMENT_REPEAT : 1;
while ( repeat-- )
knx.send_1byte_uint(receiver, ct, value);
}
#define KNX_WRITE_1BYTE_UINT(r,v) KNX_Send_1byte_uint((r),(v),KNX_CT_WRITE)
#define KNX_ANSWER_1BYTE_UINT(r,v) KNX_Send_1byte_uint((r),(v),KNX_CT_ANSWER)
void KNX_Send_4byte_float(address_t const &receiver, float value, knx_command_type_t ct)
{
uint8_t repeat = Settings->flag.knx_enable_enhancement ? KNX_ENHANCEMENT_REPEAT : 1;
while ( repeat-- )
knx.send_4byte_float(receiver, ct, value);
}
#define KNX_WRITE_4BYTE_FLOAT(r,v) KNX_Send_4byte_float((r),(v),KNX_CT_WRITE)
#define KNX_ANSWER_4BYTE_FLOAT(r,v) KNX_Send_4byte_float((r),(v),KNX_CT_ANSWER)
void KNX_Send_4byte_int(address_t const &receiver, int value, knx_command_type_t ct)
{
uint8_t repeat = Settings->flag.knx_enable_enhancement ? KNX_ENHANCEMENT_REPEAT : 1;
while ( repeat-- )
knx.send_4byte_int(receiver, ct, value);
}
#define KNX_WRITE_4BYTE_INT(r,v) KNX_Send_4byte_int((r),(v),KNX_CT_WRITE)
#define KNX_ANSWER_4BYTE_INT(r,v) KNX_Send_4byte_int((r),(v),KNX_CT_ANSWER)
uint8_t KNX_GA_Search( uint8_t param, uint8_t start = 0 ) uint8_t KNX_GA_Search( uint8_t param, uint8_t start = 0 )
{ {
for (uint32_t i = start; i < Settings->knx_GA_registered; ++i) for (uint32_t i = start; i < Settings->knx_GA_registered; ++i)
@ -475,7 +519,7 @@ void KNX_INIT(void)
} }
} }
*/ */
for (uint32_t i = 0; i < TasmotaGlobal.devices_present; ++i) { for (uint32_t i = 0; i < (TasmotaGlobal.devices_present <= 8 ? TasmotaGlobal.devices_present : 8); ++i) {
device_param[i].show = true; device_param[i].show = true;
} }
for (uint32_t i = 0; i < 4; i++) { for (uint32_t i = 0; i < 4; i++) {
@ -488,15 +532,6 @@ void KNX_INIT(void)
device_param[8 + i].show = true; device_param[8 + i].show = true;
} }
} }
if (PinUsed(GPIO_DHT11) || PinUsed(GPIO_DHT22) || PinUsed(GPIO_SI7021)) {
device_param[KNX_TEMPERATURE-1].show = true;
device_param[KNX_HUMIDITY-1].show = true;
}
#ifdef USE_DS18x20
if (PinUsed(GPIO_DSB, GPIO_ANY)) {
device_param[KNX_TEMPERATURE-1].show = true;
}
#endif
#if defined(USE_ENERGY_SENSOR) #if defined(USE_ENERGY_SENSOR)
// Any device with a Power Monitoring // Any device with a Power Monitoring
@ -623,85 +658,43 @@ void KNX_CB_Action(message_t const &msg, void *arg)
case KNX_CT_READ: case KNX_CT_READ:
if (chan->type < 9) // reply Relays status if (chan->type < 9) // reply Relays status
{ KNX_Send_1bit(msg.received_on, chan->last_state, KNX_CT_ANSWER);
knx.answer_1bit(msg.received_on, chan->last_state);
if (Settings->flag.knx_enable_enhancement) {
knx.answer_1bit(msg.received_on, chan->last_state);
knx.answer_1bit(msg.received_on, chan->last_state);
}
}
else if (chan->type == KNX_TEMPERATURE) // Reply Temperature else if (chan->type == KNX_TEMPERATURE) // Reply Temperature
{ {
knx.answer_4byte_float(msg.received_on, last_temp); KNX_ANSWER_4BYTE_FLOAT(msg.received_on, last_temp);
if (Settings->flag.knx_enable_enhancement) {
knx.answer_4byte_float(msg.received_on, last_temp);
knx.answer_4byte_float(msg.received_on, last_temp);
}
} }
else if (chan->type == KNX_HUMIDITY) // Reply Humidity else if (chan->type == KNX_HUMIDITY) // Reply Humidity
{ {
knx.answer_4byte_float(msg.received_on, last_hum); KNX_ANSWER_4BYTE_FLOAT(msg.received_on, last_hum);
if (Settings->flag.knx_enable_enhancement) {
knx.answer_4byte_float(msg.received_on, last_hum);
knx.answer_4byte_float(msg.received_on, last_hum);
}
} }
#if defined(USE_ENERGY_SENSOR) #if defined(USE_ENERGY_SENSOR)
else if (chan->type == KNX_ENERGY_VOLTAGE) // Reply KNX_ENERGY_VOLTAGE else if (chan->type == KNX_ENERGY_VOLTAGE) // Reply KNX_ENERGY_VOLTAGE
{ {
knx.answer_4byte_float(msg.received_on, Energy->voltage[0]); KNX_ANSWER_4BYTE_FLOAT(msg.received_on, Energy->voltage[0]);
if (Settings->flag.knx_enable_enhancement) {
knx.answer_4byte_float(msg.received_on, Energy->voltage[0]);
knx.answer_4byte_float(msg.received_on, Energy->voltage[0]);
}
} }
else if (chan->type == KNX_ENERGY_CURRENT) // Reply KNX_ENERGY_CURRENT else if (chan->type == KNX_ENERGY_CURRENT) // Reply KNX_ENERGY_CURRENT
{ {
knx.answer_4byte_float(msg.received_on, Energy->current[0]); KNX_ANSWER_4BYTE_FLOAT(msg.received_on, Energy->current[0]);
if (Settings->flag.knx_enable_enhancement) {
knx.answer_4byte_float(msg.received_on, Energy->current[0]);
knx.answer_4byte_float(msg.received_on, Energy->current[0]);
}
} }
else if (chan->type == KNX_ENERGY_POWER) // Reply KNX_ENERGY_POWER else if (chan->type == KNX_ENERGY_POWER) // Reply KNX_ENERGY_POWER
{ {
knx.answer_4byte_float(msg.received_on, Energy->active_power[0]); KNX_ANSWER_4BYTE_FLOAT(msg.received_on, Energy->active_power[0]);
if (Settings->flag.knx_enable_enhancement) {
knx.answer_4byte_float(msg.received_on, Energy->active_power[0]);
knx.answer_4byte_float(msg.received_on, Energy->active_power[0]);
}
} }
else if (chan->type == KNX_ENERGY_POWERFACTOR) // Reply KNX_ENERGY_POWERFACTOR else if (chan->type == KNX_ENERGY_POWERFACTOR) // Reply KNX_ENERGY_POWERFACTOR
{ {
knx.answer_4byte_float(msg.received_on, Energy->power_factor[0]); KNX_ANSWER_4BYTE_FLOAT(msg.received_on, Energy->power_factor[0]);
if (Settings->flag.knx_enable_enhancement) {
knx.answer_4byte_float(msg.received_on, Energy->power_factor[0]);
knx.answer_4byte_float(msg.received_on, Energy->power_factor[0]);
}
} }
else if (chan->type == KNX_ENERGY_YESTERDAY) // Reply KNX_ENERGY_YESTERDAY else if (chan->type == KNX_ENERGY_YESTERDAY) // Reply KNX_ENERGY_YESTERDAY
{ {
knx.answer_4byte_float(msg.received_on, Energy->yesterday_sum); KNX_ANSWER_4BYTE_INT(msg.received_on, round(1000.0 * Energy->yesterday_sum));
if (Settings->flag.knx_enable_enhancement) {
knx.answer_4byte_float(msg.received_on, Energy->yesterday_sum);
knx.answer_4byte_float(msg.received_on, Energy->yesterday_sum);
}
} }
else if (chan->type == KNX_ENERGY_DAILY) // Reply KNX_ENERGY_DAILY else if (chan->type == KNX_ENERGY_DAILY) // Reply KNX_ENERGY_DAILY
{ {
knx.answer_4byte_float(msg.received_on, Energy->daily_sum); KNX_ANSWER_4BYTE_INT(msg.received_on, round(1000.0 * Energy->daily_sum));
if (Settings->flag.knx_enable_enhancement) {
knx.answer_4byte_float(msg.received_on, Energy->daily_sum);
knx.answer_4byte_float(msg.received_on, Energy->daily_sum);
}
} }
else if (chan->type == KNX_ENERGY_TOTAL) // Reply KNX_ENERGY_TOTAL else if (chan->type == KNX_ENERGY_TOTAL) // Reply KNX_ENERGY_TOTAL
{ {
knx.answer_4byte_float(msg.received_on, Energy->total_sum); KNX_ANSWER_4BYTE_INT(msg.received_on, round(1000.0 * Energy->total_sum));
if (Settings->flag.knx_enable_enhancement) {
knx.answer_4byte_float(msg.received_on, Energy->total_sum);
knx.answer_4byte_float(msg.received_on, Energy->total_sum);
}
} }
#endif #endif
#ifdef USE_RULES #ifdef USE_RULES
@ -732,11 +725,7 @@ void KnxUpdatePowerState(uint8_t device, power_t state)
uint8_t i = KNX_GA_Search(device); uint8_t i = KNX_GA_Search(device);
while ( i != KNX_Empty ) { while ( i != KNX_Empty ) {
KNX_addr.value = Settings->knx_GA_addr[i]; KNX_addr.value = Settings->knx_GA_addr[i];
knx.write_1bit(KNX_addr, device_param[device -1].last_state); KNX_WRITE_1BIT(KNX_addr, device_param[device -1].last_state);
if (Settings->flag.knx_enable_enhancement) {
knx.write_1bit(KNX_addr, device_param[device -1].last_state);
knx.write_1bit(KNX_addr, device_param[device -1].last_state);
}
AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_KNX "%s = %d " D_SENT_TO " %d/%d/%d"), AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_KNX "%s = %d " D_SENT_TO " %d/%d/%d"),
device_param_ga[device -1], device_param[device -1].last_state, device_param_ga[device -1], device_param[device -1].last_state,
@ -766,11 +755,7 @@ void KnxSendButtonPower(void)
uint8_t i = KNX_GA_Search(device + 8); uint8_t i = KNX_GA_Search(device + 8);
while ( i != KNX_Empty ) { while ( i != KNX_Empty ) {
KNX_addr.value = Settings->knx_GA_addr[i]; KNX_addr.value = Settings->knx_GA_addr[i];
knx.write_1bit(KNX_addr, !(state == 0)); KNX_WRITE_1BIT(KNX_addr, !(state == 0));
if (Settings->flag.knx_enable_enhancement) {
knx.write_1bit(KNX_addr, !(state == 0));
knx.write_1bit(KNX_addr, !(state == 0));
}
AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_KNX "%s = %d " D_SENT_TO " %d/%d/%d"), AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_KNX "%s = %d " D_SENT_TO " %d/%d/%d"),
device_param_ga[device + 7], !(state == 0), device_param_ga[device + 7], !(state == 0),
@ -787,9 +772,12 @@ void KnxSensor(uint8_t sensor_type, float value)
if (sensor_type == KNX_TEMPERATURE) if (sensor_type == KNX_TEMPERATURE)
{ {
last_temp = value; last_temp = value;
device_param[KNX_TEMPERATURE-1].show = true;
} else if (sensor_type == KNX_HUMIDITY) } else if (sensor_type == KNX_HUMIDITY)
{ {
last_hum = value; last_hum = value;
device_param[KNX_HUMIDITY-1].show = true;
} }
if (!(Settings->flag.knx_enabled)) { return; } if (!(Settings->flag.knx_enabled)) { return; }
@ -797,10 +785,14 @@ void KnxSensor(uint8_t sensor_type, float value)
uint8_t i = KNX_GA_Search(sensor_type); uint8_t i = KNX_GA_Search(sensor_type);
while ( i != KNX_Empty ) { while ( i != KNX_Empty ) {
KNX_addr.value = Settings->knx_GA_addr[i]; KNX_addr.value = Settings->knx_GA_addr[i];
knx.write_4byte_float(KNX_addr, value); switch(sensor_type) {
if (Settings->flag.knx_enable_enhancement) { case KNX_ENERGY_DAILY:
knx.write_4byte_float(KNX_addr, value); case KNX_ENERGY_YESTERDAY:
knx.write_4byte_float(KNX_addr, value); case KNX_ENERGY_TOTAL:
KNX_WRITE_4BYTE_INT(KNX_addr, round(1000.0 * value));
break;
default:
KNX_WRITE_4BYTE_FLOAT(KNX_addr, value);
} }
AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_KNX "%s " D_SENT_TO " %d/%d/%d"), AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_KNX "%s " D_SENT_TO " %d/%d/%d"),
@ -1081,11 +1073,7 @@ void CmndKnxTxCmnd(void)
uint8_t i = KNX_GA_Search(XdrvMailbox.index + KNX_SLOT1 -1); uint8_t i = KNX_GA_Search(XdrvMailbox.index + KNX_SLOT1 -1);
while ( i != KNX_Empty ) { while ( i != KNX_Empty ) {
KNX_addr.value = Settings->knx_GA_addr[i]; KNX_addr.value = Settings->knx_GA_addr[i];
knx.write_1bit(KNX_addr, !(XdrvMailbox.payload == 0)); KNX_WRITE_1BIT(KNX_addr, !(XdrvMailbox.payload == 0));
if (Settings->flag.knx_enable_enhancement) {
knx.write_1bit(KNX_addr, !(XdrvMailbox.payload == 0));
knx.write_1bit(KNX_addr, !(XdrvMailbox.payload == 0));
}
AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_KNX "%s = %d " D_SENT_TO " %d/%d/%d"), AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_KNX "%s = %d " D_SENT_TO " %d/%d/%d"),
device_param_ga[XdrvMailbox.index + KNX_SLOT1 -2], !(XdrvMailbox.payload == 0), device_param_ga[XdrvMailbox.index + KNX_SLOT1 -2], !(XdrvMailbox.payload == 0),
@ -1110,11 +1098,7 @@ void CmndKnxTxVal(void)
float tempvar = CharToFloat(XdrvMailbox.data); float tempvar = CharToFloat(XdrvMailbox.data);
dtostrfd(tempvar,2,XdrvMailbox.data); dtostrfd(tempvar,2,XdrvMailbox.data);
knx.write_4byte_float(KNX_addr, tempvar); KNX_WRITE_4BYTE_FLOAT(KNX_addr, tempvar);
if (Settings->flag.knx_enable_enhancement) {
knx.write_4byte_float(KNX_addr, tempvar);
knx.write_4byte_float(KNX_addr, tempvar);
}
AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_KNX "%s = %s " D_SENT_TO " %d/%d/%d"), AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_KNX "%s = %s " D_SENT_TO " %d/%d/%d"),
device_param_ga[XdrvMailbox.index + KNX_SLOT1 -2], XdrvMailbox.data, device_param_ga[XdrvMailbox.index + KNX_SLOT1 -2], XdrvMailbox.data,
@ -1137,11 +1121,7 @@ void CmndKnxTxScene(void)
uint8_t tempvar = TextToInt(XdrvMailbox.data); uint8_t tempvar = TextToInt(XdrvMailbox.data);
dtostrfd(tempvar,0,XdrvMailbox.data); dtostrfd(tempvar,0,XdrvMailbox.data);
knx.write_1byte_uint(KNX_addr, tempvar); KNX_WRITE_1BYTE_UINT(KNX_addr, tempvar);
if (Settings->flag.knx_enable_enhancement) {
knx.write_1byte_uint(KNX_addr, tempvar);
knx.write_1byte_uint(KNX_addr, tempvar);
}
AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_KNX "%s = %s " D_SENT_TO " %d/%d/%d"), AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_KNX "%s = %s " D_SENT_TO " %d/%d/%d"),
device_param_ga[KNX_SCENE-1], XdrvMailbox.data, device_param_ga[KNX_SCENE-1], XdrvMailbox.data,