Hi, I’m trying to compile some ESPhome code that involves calculations with seconds.
Since millis() doesn’t seem to work with lambda, I’ve tried using uptime.
I’m also having trouble comparing values using a float variable.
Could you please help me with this?
The code:
---
substitutions:
devicename: esp32-s2-mini-saola
board: esp32-s2-saola-1
upper_devicename: ESP32_S2_TestBoard
device_location: Schreibtisch
device_description: Testboard using ESPhome firmware
ipaddress: !secret ESP32_S2_TESTBOX_IP
last_update: "2025-10-23 22:54:12"
esphome:
name: esp32-s2-mini-saola
comment: Testboard
includes: []
libraries: []
build_path: ESP32_S2_TestBoard
platformio_options: {}
esp32:
board: esp32-s2-saola-1
framework:
type: esp-idf
api:
encryption:
key: !secret ESPHOME_API_KEY
wifi:
power_save_mode: none # none (default for esp8266), light (default for esp32), high
ssid: !secret WLAN_ASUS_SSID
password: !secret WLAN_ASUS_PASSWORD
manual_ip:
static_ip: !secret ESP32_S2_TESTBOX_IP
gateway: !secret WLAN_ASUS_GATEWAY_IP
subnet: !secret WLAN_ASUS_SUBNET
dns1: !secret WLAN_ASUS_DNS1
ap:
ssid: "ESP32-S2-MINI-Testboard"
password: !secret WIFI_AP_PASSWORD
ota:
- platform: esphome
#safe_mode: true
password: !secret HA_OTA_PASSWORD
web_server:
port: 80
auth:
username: admin
password: admin
globals:
# global int variable
- id: heater_run
type: int
restore_value: no
initial_value: '0'
- id: heat_level
type: int
restore_value: no
initial_value: '10'
- id: heat_level_now
type: int
restore_value: no
initial_value: '10'
- id: stepsDown_heatLevel
type: int
restore_value: no
initial_value: '0'
- id: stepsUp_heatLevel
type: int
restore_value: no
initial_value: '0'
- id: set_heat_level_to
type: int
restore_value: no
initial_value: '0'
# global string variable
- id: change_heatLevel
type: int
restore_value: no
initial_value: '0'
# global string variable
- id: string_heater_run_yes
type: std::string
restore_value: yes
max_restore_data_length: 24
initial_value: '"Heizung ist An"'
- id: string_heater_run_no
type: std::string
restore_value: yes
max_restore_data_length: 24
initial_value: '"Heizung ist Aus"'
- id: heater_minRunTimeInHeatLevel
type: int
restore_value: no
initial_value: '0'
- id: startTime
type: int
restore_value: no
# initial_value: '0'
initial_value: '0'
- id: endTime
type: int
restore_value: no
initial_value: '0'
- id: changeHeaterLevel
type: int
restore_value: no
initial_value: '0'
remote_receiver:
pin: GPIO18
#dump: all # rc_switch
dump: # dump: all
- rc_switch
# Settings to optimize recognition of RF devices
tolerance: 50%
idle: 4ms
remote_transmitter:
pin: GPIO17
carrier_duty_percent: 100% # change from 100% to 50%
sensor:
- platform: dht
pin: GPIO11
model: AM2302
temperature:
name: "Garage Temperatur DHT_1"
id: TEMP_DHT_1
unit_of_measurement: "°C"
accuracy_decimals: 2
humidity:
name: "Garage Luftfeuchtigkeit DHT_1"
id: HUMIDITY_DHT_1
unit_of_measurement: "%"
accuracy_decimals: 2
update_interval: 10s
- platform: template
name: "Temp Garage delta"
id: tempGarage_delta
unit_of_measurement: "°C"
accuracy_decimals: 2
update_interval: 60s
lambda: |-
return id(TEMP_DHT_1).state - id(garage_thermostat).target_temperature;
on_value:
then:
- script.execute: update_vevor_heaster_power
- platform: uptime
id: uptime_sec # it's work time esp…
# Example configuration entry
climate:
- platform: thermostat
name: "Garage Vevor Heizung"
id: garage_thermostat
sensor: TEMP_DHT_1
heat_deadband: 0.0
heat_overrun: 0.0
visual:
min_temperature: 15
max_temperature: 40
temperature_step: 0.1
min_heating_off_time: 2s
min_heating_run_time: 2s
min_idle_time: 2s
heat_action: []
idle_action: []
preset:
- name: Kodus
default_target_temperature_low: 20 °C
- name: Eemal
default_target_temperature_low: 18 °C
script:
- id: check_heaterLevel_upDown
parameters:
heaterLevel: int
then:
lambda: |-
if(id(heat_level_now) == heaterLevel){
id(change_heatLevel) = 0;
// return id(heat_level_now);
//return id(heat_level_now);
}else{
if(id(heat_level_now) > heaterLevel){
id(stepsDown_heatLevel) = id(heat_level_now) - heaterLevel;
id(change_heatLevel) = 1;
id(heaterLevel_minus)->execute(id(stepsDown_heatLevel));
};
if(id(heat_level_now) < heaterLevel){
id(stepsUp_heatLevel) = heaterLevel - id(heat_level_now);
id(change_heatLevel) = 1;
id(heaterLevel_plus)->execute(id(stepsUp_heatLevel));
};
};
- id: heaterLevel_plus
parameters:
stepsUp_heaterLevel: int
then:
- remote_transmitter.transmit_rc_switch_raw:
#code Plus x steps up = stepsUp_heat_level
code: '00011100010111100000100011110000'
protocol:
pulse_length: 255
repeat:
times: 5
wait_time: 0s
- logger.log: Heizung Plus!
- id: heaterLevel_minus
parameters:
stepsDown_heaterLevel: int
then:
- remote_transmitter.transmit_rc_switch_raw:
#code Plus
code: '00011100010111100000001010001000'
protocol:
pulse_length: 255
repeat:
times: 5
wait_time: 0s
- logger.log: Heizung Minus!
- id: calc_minRunTimeInHeatLevel
parameters:
delta_degress: float
then:
- lambda: |-
int OneMinute=60;
int threeMinute=180;
int fiveMinute=300;
int sevenMinute=420;
int tenMinute=600;
int thirteenMinute=840;
int sexteenMinute=960;
int twentyMinute=1200;
int seconds = (id(uptime_sec).state);
if(id(startTime) == 0){
id(startTime) = seconds;
}else if (seconds < endTime){
// hier abbruch
id(changeHeaterLevel) = 1;
}else{
id(startTime) = seconds;
if (delta_degress < 0.5) {
id(endTime) = ((id(startTime)) + (OneMinute));
}
if (delta_degress < 1) {
id(endTime) = ((id(startTime)) + (threeMinute));
}
if (delta_degress < 1.5) {
id(endTime) = (id(startTime) + fiveMinute);
}
if (delta_degress < 2) {
id(endTime) = (id(startTime) + sevenMinute);
}
if (delta_degress < 3) {
id(endTime) = (id(startTime) + tenMinute);
}
if (delta_degress < 4) {
id(endTime) = (id(startTime) + thirteenMinute);
}
if (delta_degress < 10) {
id(endTime) = (id(startTime) + sexteenMinute);
}
if (delta_degress >= 10) {
id(endTime) = (id(startTime) + twentyMinute);
}
}
- id: update_vevor_heaster_power
mode: restart
then:
- if:
# Heizstufe 10
condition:
sensor.in_range:
id: tempGarage_delta
below: -3.0
then:
# ausführen der Scripte
#calc_minRunTimeInHeatLevel
- script.execute:
id: calc_minRunTimeInHeatLevel
delta_degress: !lambda return id(tempGarage_delta);
- script.execute:
id: check_heaterLevel_upDown
heaterLevel: 10 # vergleichen & setzen auf Heizstufe 10
- if:
# Heizstufe 9
condition:
sensor.in_range:
id: tempGarage_delta
below: -2.5
above: -3.0
then:
- script.execute:
id: calc_minRunTimeInHeatLevel
delta_degress: !lambda return id(tempGarage_delta);
- script.execute:
id: check_heaterLevel_upDown
heaterLevel: 9 # vergleichen & setzen auf Heizstufe 10
- if:
# Heizstufe 8
condition:
sensor.in_range:
id: tempGarage_delta
below: -2.0
above: -2.49
then:
- script.execute:
id: calc_minRunTimeInHeatLevel
delta_degress: !lambda return id(tempGarage_delta);
- script.execute:
id: check_heaterLevel_upDown
heaterLevel: 8 # vergleichen & setzen auf Heizstufe 10
- if:
# Heizstufe 7
condition:
sensor.in_range:
id: tempGarage_delta
below: -1.6
above: -1.99
then:
- script.execute:
id: calc_minRunTimeInHeatLevel
delta_degress: !lambda return id(tempGarage_delta);
- script.execute:
id: check_heaterLevel_upDown
heaterLevel: 7 # vergleichen & setzen auf Heizstufe 10
- if:
# Heizstufe 6
condition:
sensor.in_range:
id: tempGarage_delta
below: -1.2
above: -1.59
then:
- script.execute:
id: calc_minRunTimeInHeatLevel
delta_degress: !lambda return id(tempGarage_delta);
- script.execute:
id: check_heaterLevel_upDown
heaterLevel: 6 # vergleichen & setzen auf Heizstufe 10
- if:
# Heizstufe 5
condition:
sensor.in_range:
id: tempGarage_delta
below: -0.9
above: -1.19
then:
- script.execute:
id: calc_minRunTimeInHeatLevel
delta_degress: !lambda return id(tempGarage_delta);
- script.execute:
id: check_heaterLevel_upDown
heaterLevel: 5 # vergleichen & setzen auf Heizstufe 10
- if:
# Heizstufe 4
condition:
sensor.in_range:
id: tempGarage_delta
below: -0.6
above: -0.89
then:
- script.execute:
id: calc_minRunTimeInHeatLevel
delta_degress: !lambda return id(tempGarage_delta);
- script.execute:
id: check_heaterLevel_upDown
heaterLevel: 4 # vergleichen & setzen auf Heizstufe 10
- if:
# Heizstufe 3
condition:
sensor.in_range:
id: tempGarage_delta
below: -0.4
above: -0.59
then:
- script.execute:
id: calc_minRunTimeInHeatLevel
delta_degress: !lambda return id(tempGarage_delta);
- script.execute:
id: check_heaterLevel_upDown
heaterLevel: 3 # vergleichen & setzen auf Heizstufe 10
- if:
# Heizstufe 2
condition:
sensor.in_range:
id: tempGarage_delta
below: -0.1
above: -0.39
then:
- script.execute:
id: calc_minRunTimeInHeatLevel
delta_degress: !lambda return id(tempGarage_delta);
- script.execute:
id: check_heaterLevel_upDown
heaterLevel: 2 # vergleichen & setzen auf Heizstufe 10
- if:
# Heizstufe 1
condition:
sensor.in_range:
id: tempGarage_delta
above: 0
then:
- script.execute:
id: calc_minRunTimeInHeatLevel
delta_degress: !lambda return id(tempGarage_delta);
- script.execute:
id: check_heaterLevel_upDown
heaterLevel: 1 # vergleichen & setzen auf Heizstufe 10
switch:
- platform: gpio
pin: GPIO10
name: "Heizung Strom An/Aus"
id: RelayHeater
button:
- platform: template
name: Heizung An
id: heaterOn
on_press:
- remote_transmitter.transmit_rc_switch_raw:
code: '00011100010111100001000110110000'
protocol:
pulse_length: 255
repeat:
times: 5
wait_time: 0s
- logger.log: Heizung ANgeschaltet!
- platform: template
name: Heizung Aus
id: heaterOff
on_press:
- remote_transmitter.transmit_rc_switch_raw:
code: '00011100010111100000010100001000'
protocol:
pulse_length: 255
repeat:
times: 5
wait_time: 0s
- logger.log: Heizung AUSgeschaltet!
- platform: template
name: Heizleistung Plus
id: heaterPlus
on_press:
- remote_transmitter.transmit_rc_switch_raw:
code: '00011100010111100000100011110000'
protocol:
pulse_length: 255
repeat:
times: 5
wait_time: 0s
- platform: template
name: Heizleistung Minus
id: heaterMinus
on_press:
#- script.call: heizleistung_1
- remote_transmitter.transmit_rc_switch_raw:
code: '00011100010111100000001010001000'
protocol:
pulse_length: 255
repeat:
times: 5
wait_time: 0s
improv_serial:
## Enable logging
logger:
level: DEBUG
baud_rate: 9600
ther errors:
Compiling .pioenvs/esp32-s2-mini-saola/src/main.cpp.o
/config/esphome/test1.yaml: In lambda function:
/config/esphome/test1.yaml:261:25: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
261 | }else if (seconds < endTime){
| ~~~~~~~~^~~~~~~~~
/config/esphome/test1.yaml: In lambda function:
/config/esphome/test1.yaml:307:14: error: cannot convert 'esphome::template_::TemplateSensor*' to 'float' in return
307 | - script.execute:
| ^~~~~~~~~~~~~~~~
| |
| esphome::template_::TemplateSensor*
/config/esphome/test1.yaml: In lambda function:
/config/esphome/test1.yaml:322:14: error: cannot convert 'esphome::template_::TemplateSensor*' to 'float' in return
322 | - script.execute:
| ^~~~~~~~~~~~~~~~
| |
| esphome::template_::TemplateSensor*
/config/esphome/test1.yaml: In lambda function:
/config/esphome/test1.yaml:336:14: error: cannot convert 'esphome::template_::TemplateSensor*' to 'float' in return
336 | - script.execute:
| ^~~~~~~~~~~~~~~~
| |
| esphome::template_::TemplateSensor*
/config/esphome/test1.yaml: In lambda function:
/config/esphome/test1.yaml:350:14: error: cannot convert 'esphome::template_::TemplateSensor*' to 'float' in return
350 | - script.execute:
| ^~~~~~~~~~~~~~~~
| |
| esphome::template_::TemplateSensor*
/config/esphome/test1.yaml: In lambda function:
/config/esphome/test1.yaml:365:14: error: cannot convert 'esphome::template_::TemplateSensor*' to 'float' in return
365 | - script.execute:
| ^~~~~~~~~~~~~~~~
| |
| esphome::template_::TemplateSensor*
/config/esphome/test1.yaml: In lambda function:
/config/esphome/test1.yaml:379:14: error: cannot convert 'esphome::template_::TemplateSensor*' to 'float' in return
379 | - script.execute:
| ^~~~~~~~~~~~~~~~
| |
| esphome::template_::TemplateSensor*
/config/esphome/test1.yaml: In lambda function:
/config/esphome/test1.yaml:393:14: error: cannot convert 'esphome::template_::TemplateSensor*' to 'float' in return
393 | - script.execute:
| ^~~~~~~~~~~~~~~~
| |
| esphome::template_::TemplateSensor*
/config/esphome/test1.yaml: In lambda function:
/config/esphome/test1.yaml:407:14: error: cannot convert 'esphome::template_::TemplateSensor*' to 'float' in return
407 | - script.execute:
| ^~~~~~~~~~~~~~~~
| |
| esphome::template_::TemplateSensor*
/config/esphome/test1.yaml: In lambda function:
/config/esphome/test1.yaml:421:14: error: cannot convert 'esphome::template_::TemplateSensor*' to 'float' in return
421 | - script.execute:
| ^~~~~~~~~~~~~~~~
| |
| esphome::template_::TemplateSensor*
/config/esphome/test1.yaml: In lambda function:
/config/esphome/test1.yaml:434:14: error: cannot convert 'esphome::template_::TemplateSensor*' to 'float' in return
434 | - script.execute:
| ^~~~~~~~~~~~~~~~
| |
| esphome::template_::TemplateSensor*
*** [.pioenvs/esp32-s2-mini-saola/src/main.cpp.o] Error 1
========================= [FAILED] Took 65.41 seconds ======================