Zibro Toyotomi FF-55 simple local controller

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.

1 Like