mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-27 04:36:31 +00:00
Fix TWAI extended identifier support
This commit is contained in:
parent
8fa33ff4da
commit
884e795dff
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user