A friend recently installed a Toyotomi FF-55 petroleum heat in their cabin.
By default it’s dumb and cannot even do frost watch, sadly.
But, no worries, from the factory it comes with the option to install a WiFi module and pictures already made me hopeful, because they showed a Tuya TYWE1S.
Once installed, we hooked the WiFi module up, and I paralleled a small ESP32-C3 super mini OLED to sniff on the connection.
And great success, they talked Tuya MCU and no custom protocol.
So far I have just hooked up the climate control integration to it, but also identified several other data-points.
DP 1: power, boolean
DP 2: set temp in °C
DP 3: temperature measurement, 4 bytes, as integer 00 00 00 19 -> 25°C
DP 4: working mode, enum, 00 manual, 01 schedule
DP 6: Power-saver, bool, on/off
DP 7: child lock, boolean
DP 13: bitmask (seems to be 0) ?!?!? errorcodes??? 0x004000 << fuel empty
DP 14: enum 1:heating, 0 not heating
DP 17: schedule, schedule data is organized as TIME 2 bytes, in minutes since 00:00, then 2 bytes of target temperature *10, 4 slots per day, 7 times "01 86 00 D2 | 01 E0 00 B4 | 04 38 00 D2 | 05 46 00 A0" for a day
DP 19: temperature display unit, enum, 01 for Fahrenheit, 00 for Celsius
DP 20: set temp in °F
DP 21: temperature in Fahrenheit: 4 bytes integer same as DP3
I created a quick config, nothing fancy, but it works
uart:
- id: uart_toyotomi
rx_pin: GPIO08
tx_pin: GPIO09
baud_rate: 9600
tuya:
id: from_heater
uart_id: uart_db1
time_id: home_time
on_datapoint_update:
- sensor_datapoint: 13
datapoint_type: bitmask
then:
- lambda: |-
// Check if bit 0x04000 is set
if ((x & 0x04000) != 0) {
id(low_fuel_sensor).publish_state(true); // Fuel is empty
} else {
if (id(heater_power).state){
id(low_fuel_sensor).publish_state(false); // Fuel is OK
}
}
binary_sensor:
- platform: template
id: low_fuel_sensor
name: "Low fuel warning"
icon: "mdi:fuel"
- platform: tuya
sensor_datapoint: 14
id: heating_active
internal: True
on_press:
then:
- binary_sensor.template.publish:
id: low_fuel_sensor
state: False
- platform: tuya
sensor_datapoint: 1
id: heater_power
internal: True
on_press:
then:
- binary_sensor.template.publish:
id: low_fuel_sensor
state: False
climate:
- platform: tuya
name: "Toyotomi FF-55"
switch_datapoint: 1
target_temperature_datapoint: 2
current_temperature_datapoint: 3
supports_heat: true
supports_cool: false
active_state:
datapoint: 14
heating_value: 1
Toyotomi’s wifi module is placed INSIDE the case, which is completely made of metal, once close the Tuya module has 0 WiFi, only if the AP is within ~3m it seems to work.
I am not sure what they thought when they designed the box, but I will have to find a way to install the module outside, I will probaly take a ESP-01 or something with an external antenna, which I can place inside the grill, so it can actually have reception.
Edit: I have since switched to another board:
with an external PCB antenna.
The antenna is placed outside the case, almost invisible, inside the grill on ~3mm of foam, to keep some distance to the metal grill.
I also added a bit of decoding for the error bitmask.
0x4000 is out of fuel, but the heater turns off in that state, and the bitmask gets set back to 0x0, which is why I only reset it back when either the heater is turned on again or the heating is enabled again.



