ESPHome global as boolean in lambda not compiling

I have the following global variable

globals:
  - id: water_change_in_progress
    type: bool
    restore_value: no
    initial_value: 'false'

and want to test it’s state in the following

  - platform: gpio
    pin: 
      number: GPIO33
      mode: INPUT_PULLUP
    name: "Water level high sensor"
    id: water_level_high_sensor
    on_press:
      then:
        - if:
            condition:
              lambda: 'return id(water_change_in_progress).state == 'false';'
        then:
          - switch.turn_off: water_fill_valve
        else:
          - logger.log: "Water change in progress"

However, the validation fails with

while parsing a block mapping
  in "/config/esphome/pond_control.yaml", line 252, column 15:
                  lambda: 'return id(water_change_ ... 
                  ^
expected <block end>, but found '<scalar>'
  in "/config/esphome/pond_control.yaml", line 252, column 70:
     ... r_change_in_progress).state == 'false';'

I’ve exhausted my current capability with this so am seeking some help.

Any ideas?

Solved by me!

Indentation and quotes were the problem.

  - platform: gpio
    pin: 
      number: GPIO33
      mode: INPUT_PULLUP
    name: "Water level high sensor"
    id: water_level_high_sensor
    on_press:
      then:
        - if:
            condition:
              lambda: 'return id(water_change_in_progress).state == false;'
            then:
              - switch.turn_off: water_fill_valve
            else:
              - logger.log: "Water change in progress"

Try:

lambda: "return id(water_change_in_progress).state == 'false';"

Look at the red text in your post. See how the single quotes match?

1 Like

Thank you.

Hi guys,

I’m still facing issues with this.
This my my code “on boot”:

esphome:
  name: esp32-cam-deepsleep
  on_boot:
....
....
     - if:
         condition:
           lambda: "return id(defeat).state == 'true';"
         then:
           - logger.log: "Prevent Sleep"
           - deep_sleep.prevent: deep_sleep_1
         else:
           - logger.log: "Sleeping"
           - deep_sleep.enter:
               id: deep_sleep_1
               sleep_duration: 300s 

This is my global config:


globals:
  - id: defeat
    type: bool
    restore_value: no
    initial_value: "false"

And i get this error:

Compiling .pioenvs/esp32-cam-deepsleep/src/main.cpp.o
/config/esp32-cam-deepsleep.yaml:37:39: warning: multi-character character constant [-Wmultichar]
            lambda: "return id(defeat).state == 'true';"
                                       ^
/config/esp32-cam-deepsleep.yaml: In lambda function:
/config/esp32-cam-deepsleep.yaml:37:30: error: request for member 'state' in 'defeat->esphome::globals::GlobalsComponent<T>::value<bool>()', which is of non-class type 'bool'
            lambda: "return id(defeat).state == 'true';"
                              ^
*** [.pioenvs/esp32-cam-deepsleep/src/main.cpp.o] Error 1

Try:
lambda: 'return id(defeat) == true;'
or just
lambda: 'return id(defeat);'