/DeepOta

Tool to automate ESPHome DeepSleep Enabled Device Update through OTA

Primary LanguagePythonOtherNOASSERTION

Tool to Automate ESPHome DeepSleep Enabled Devices Update through OTA

[NOT READY YET - IN DEVELOPMENT]

This is Python scripts to automate the update of ESPHome devices that are using DeepSleep.

THIS DOCUMENTATION IS OUT OF DATE. Will be updated soon.

The script requires the following call parameters:

  • The device name. The name must be related to an ESPHome-managed device.
  • Duration in seconds to wait for the device availability. Beyond that wait time, the script will exit with exit code 2

Here is a call example:

$ ./deep_ota.py mailbox 24

The script requires many parameters to be updated for your specific environment. The file config.py content must be created accordingly. A file named config-sample.py is supplied and must be renamed to config.py and updated with your information.

The synchronization with the device is done using MQTT.

After requesting ESPHome to compile the device code, the script send a MQTT "ON" message payload to the <topic_prefix><device_name>/ota-req topic and wait for a "READY" message payload from the <topic_prefix><device_name>/ota topic. It then compiles and transmits the new binary using the ESPHome CLI command.

It is expected that the device, receiving the "ON" message will put the deep sleep function on hold.

As this script waits for the "READY" message, it could stay there for a long period depending on the device's deep sleep duration.

Exit Code:

  • 0: The new binary upload succeeded
  • 1: An error occurred
  • 2: The device didn't answer on time

The following is an example of an ESPHome device content required to properly synchronize with this script:

deep_sleep:
  id: deep_sleep_1
  run_duration: 10s
  sleep_duration: 24h
  wakeup_pin: 15
  wakeup_pin_mode: INVERT_WAKEUP

mqtt:
  broker: <broker_address>
  username: !secret mqtt_username
  password: !secret mqtt_password
  discovery: true
  discovery_retain: true
  on_message:
    - topic: home/<device_name>/ota-req
      payload: 'ON'
      then:
        - deep_sleep.prevent: deep_sleep_1
        - mqtt.publish: 
            topic: home/<device_name>/ota
            payload: 'READY'
            qos: 0
    - topic: home/<device_name>/ota-req
      payload: 'OFF'
      then:
        - deep_sleep.enter: deep_sleep_1

Guy Turcotte - May 2022