Fix TWAI extended identifier support

This commit is contained in:
Theo Arends 2025-01-01 15:48:02 +01:00
parent 8fa33ff4da
commit 884e795dff

View File

@ -94,14 +94,24 @@ class twai_cls
self.dz_flow_temp = 0 self.dz_flow_temp = 0
end end
#----------------------------------------------------------------------------------------------
Allow TWAI driver configuration on restart (if this file is installed by preinit.be)
----------------------------------------------------------------------------------------------#
def config(bus) def config(bus)
# if bus != 1 return nil end # Exit if not my bus # if bus != 1 return nil end # Exit if not my bus
return self.twai_mode << 3 | self.twai_speed # Initial configure TWAI driver return self.twai_mode << 3 | self.twai_speed # Initial configure TWAI driver
end end
def decode(bus, ident, data1, data2) #----------------------------------------------------------------------------------------------
This example decodes Remeha Calenta Ace CAN-bus messages and sends it to predefined Domoticz idx
----------------------------------------------------------------------------------------------#
def decode(param, ident, data1, data2)
var bus = param & 0xF # Bus number (1..3)
# if bus != 1 return nil end # Exit if not my bus # if bus != 1 return nil end # Exit if not my bus
var id = ident & 0x7ff # Remeha uses 11 bit Standard Frame Format var len = param >> 4 & 0xF # Number of data bytes (0..8)
var extended = ident >> 31 & 0x1 # Extended identifier flag (0..1)
if extended == 1 return nil end # Remeha uses 11-bit Standard Frame Format
var id = ident & 0x1fffffff
if id == 0x076 # Incremental counter from 0 to 255 if id == 0x076 # Incremental counter from 0 to 255
# tasmota.log(f"RMH: 0x{id:03x} Count {data1}", 3) # tasmota.log(f"RMH: 0x{id:03x} Count {data1}", 3)
elif id == 0x100 # Date and Time elif id == 0x100 # Date and Time
@ -130,7 +140,9 @@ class twai_cls
self.active = 1 # At least one valid decode self.active = 1 # At least one valid decode
end end
#- add sensor value to teleperiod -# #----------------------------------------------------------------------------------------------
Add sensor value to teleperiod
----------------------------------------------------------------------------------------------#
def json_append() def json_append()
if !self.active return nil end # Exit if never decoded something if !self.active return nil end # Exit if never decoded something
import string import string
@ -139,11 +151,17 @@ class twai_cls
tasmota.response_append(msg) tasmota.response_append(msg)
end end
#- perform action just after teleperiod -# #----------------------------------------------------------------------------------------------
Perform action just after teleperiod (not used)
----------------------------------------------------------------------------------------------#
# def after_teleperiod() # def after_teleperiod()
#- perform action every second -# #----------------------------------------------------------------------------------------------
Perform action every second
As many datagrams can occur sending at teleperiod time takes too long
Also only send if changed to reduce TWAI wait time
----------------------------------------------------------------------------------------------#
def every_second() def every_second()
# Only send if changed to reduce TWAI wait time
if self.dz_pressure != self.pressure if self.dz_pressure != self.pressure
tasmota.cmd('_DzSend1 523,' .. self.pressure) # Send pressure to Domoticz tasmota.cmd('_DzSend1 523,' .. self.pressure) # Send pressure to Domoticz
end end
@ -165,7 +183,9 @@ class twai_cls
self.dz_am014_substatus = self.am014_substatus self.dz_am014_substatus = self.am014_substatus
end end
#- display sensor value in the web UI -# #----------------------------------------------------------------------------------------------
Display sensor value in the web UI
----------------------------------------------------------------------------------------------#
def web_sensor() def web_sensor()
if !self.active return nil end # Exit if never decoded something if !self.active return nil end # Exit if never decoded something
import string import string
@ -178,6 +198,7 @@ class twai_cls
tasmota.web_send_decimal(msg) tasmota.web_send_decimal(msg)
end end
end end
twai = twai_cls() twai = twai_cls()
tasmota.add_driver(twai) tasmota.add_driver(twai)
@ -200,12 +221,13 @@ bool TWAIBerryDecode(uint32_t bus, uint32_t identifier, uint32_t data_length_cod
if (be_getmember(vm, 1, "decode")) { // and function if (be_getmember(vm, 1, "decode")) { // and function
be_pushvalue(vm, -2); be_pushvalue(vm, -2);
uint32_t ident = identifier | data_length_code << 28; uint32_t param = bus +1 | data_length_code << 4;
uint32_t ident = identifier;
uint32_t data1 = data[3] << 24 | data[2] << 16 | data[1] << 8 | data[0]; uint32_t data1 = data[3] << 24 | data[2] << 16 | data[1] << 8 | data[0];
uint32_t data2 = data[7] << 24 | data[6] << 16 | data[5] << 8 | data[4]; uint32_t data2 = data[7] << 24 | data[6] << 16 | data[5] << 8 | data[4];
AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TWA: Bus%d ident %08X, data1 %08X, data2 %08X"), bus +1, ident, data1, data2); AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TWA: Bus%d param %08X, ident %08X, data1 %08X, data2 %08X"), bus +1, param, ident, data1, data2);
be_pushint(vm, bus +1); // Bus 1, 2 or 3 be_pushint(vm, param); // Bus 1, 2 or 3 | data_length
be_pushint(vm, ident); be_pushint(vm, ident);
be_pushint(vm, data1); be_pushint(vm, data1);
be_pushint(vm, data2); be_pushint(vm, data2);
@ -370,12 +392,13 @@ void TWAIRead(uint32_t bus) {
// One or more messages received. Handle all. // One or more messages received. Handle all.
twai_message_t message; twai_message_t message;
while (twai_receive_v2(Twai.bus[bus], &message, 0) == ESP_OK) { while (twai_receive_v2(Twai.bus[bus], &message, 0) == ESP_OK) {
uint32_t identifier = message.identifier | message.extd << 31; // Add extended 29-bit flag
#ifdef USE_BERRY #ifdef USE_BERRY
if (TWAIBerryDecode(bus, message.identifier, message.data_length_code, message.data)) { continue; } if (TWAIBerryDecode(bus, identifier, message.data_length_code, message.data)) { continue; }
#endif // USE_BERRY #endif // USE_BERRY
// Show log if no berry found (Messages come too fast for supporting MQTT at this time) // Show log if no berry found (Messages come too fast for supporting MQTT at this time)
AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TWA: Bus%d Id 0x%08X, Rcvd '%*_H'"), AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TWA: Bus%d Id 0x%08X, Rcvd '%*_H'"),
bus +1, message.identifier, message.data_length_code, message.data); bus +1, identifier, message.data_length_code, message.data);
} }
} }
} }