Add relative pressure calculations
This commit is contained in:
parent
742f718a81
commit
cf8838d5a5
@ -94,6 +94,11 @@ globals:
|
|||||||
restore_value: true
|
restore_value: true
|
||||||
initial_value: "0.0"
|
initial_value: "0.0"
|
||||||
|
|
||||||
|
- id: elevation_meters
|
||||||
|
type: float
|
||||||
|
restore_value: true
|
||||||
|
initial_value: "0.0"
|
||||||
|
|
||||||
- id: pir_hold_time
|
- id: pir_hold_time
|
||||||
type: int
|
type: int
|
||||||
restore_value: true
|
restore_value: true
|
||||||
@ -138,7 +143,7 @@ script:
|
|||||||
- light.turn_off:
|
- light.turn_off:
|
||||||
id: output_led
|
id: output_led
|
||||||
transition_length: 1s
|
transition_length: 1s
|
||||||
|
|
||||||
- id: pir_handler
|
- id: pir_handler
|
||||||
then:
|
then:
|
||||||
- lambda: |-
|
- lambda: |-
|
||||||
@ -203,12 +208,12 @@ script:
|
|||||||
// Only light
|
// Only light
|
||||||
new_state = light;
|
new_state = light;
|
||||||
}
|
}
|
||||||
|
|
||||||
ESP_LOGD("occupancy_detect_handler", "New state: %s", new_state ? "true" : "false");
|
ESP_LOGD("occupancy_detect_handler", "New state: %s", new_state ? "true" : "false");
|
||||||
|
|
||||||
// Force update even if state hasn't changed
|
// Force update even if state hasn't changed
|
||||||
id(supersensor_occupancy).publish_state(new_state);
|
id(supersensor_occupancy).publish_state(new_state);
|
||||||
|
|
||||||
// Add a delayed re-publish to ensure state propagation
|
// Add a delayed re-publish to ensure state propagation
|
||||||
if (new_state) {
|
if (new_state) {
|
||||||
id(supersensor_occupancy).publish_state(new_state);
|
id(supersensor_occupancy).publish_state(new_state);
|
||||||
@ -257,12 +262,12 @@ script:
|
|||||||
// Only light
|
// Only light
|
||||||
new_state = light;
|
new_state = light;
|
||||||
}
|
}
|
||||||
|
|
||||||
ESP_LOGD("occupancy_clear_handler", "New state: %s", new_state ? "true" : "false");
|
ESP_LOGD("occupancy_clear_handler", "New state: %s", new_state ? "true" : "false");
|
||||||
|
|
||||||
// Force update even if state hasn't changed
|
// Force update even if state hasn't changed
|
||||||
id(supersensor_occupancy).publish_state(new_state);
|
id(supersensor_occupancy).publish_state(new_state);
|
||||||
|
|
||||||
// Add a delayed re-publish to ensure state propagation
|
// Add a delayed re-publish to ensure state propagation
|
||||||
if (!new_state) {
|
if (!new_state) {
|
||||||
id(supersensor_occupancy).publish_state(new_state);
|
id(supersensor_occupancy).publish_state(new_state);
|
||||||
@ -456,7 +461,7 @@ voice_assistant:
|
|||||||
brightness: 100%
|
brightness: 100%
|
||||||
red: 1
|
red: 1
|
||||||
green: 0
|
green: 0
|
||||||
blue: 0
|
blue: 0
|
||||||
else:
|
else:
|
||||||
- logger.log: "Command successful!"
|
- logger.log: "Command successful!"
|
||||||
- light.turn_on:
|
- light.turn_on:
|
||||||
@ -492,7 +497,7 @@ light:
|
|||||||
sequence:
|
sequence:
|
||||||
- delay: 5s
|
- delay: 5s
|
||||||
- script.execute: light_off
|
- script.execute: light_off
|
||||||
|
|
||||||
output:
|
output:
|
||||||
- platform: ledc
|
- platform: ledc
|
||||||
id: rgb_r
|
id: rgb_r
|
||||||
@ -641,6 +646,41 @@ sensor:
|
|||||||
}
|
}
|
||||||
return normalized_air_quality;
|
return normalized_air_quality;
|
||||||
|
|
||||||
|
# Relative Pressure:
|
||||||
|
# Calculates the relative pressure based on the elevation above sea level
|
||||||
|
- platform: template
|
||||||
|
name: "BME680 Relative Pressure"
|
||||||
|
id: bme680_relative_pressure
|
||||||
|
unit_of_measurement: hPa
|
||||||
|
accuracy_decimals: 1
|
||||||
|
update_interval: 15s
|
||||||
|
lambda: |-
|
||||||
|
// Get the current absolute pressure in hPa
|
||||||
|
float abs_pressure = id(bme680_pressure).state;
|
||||||
|
|
||||||
|
// Get the current temperature in Celsius
|
||||||
|
float temperature = id(bme680_temperature).state;
|
||||||
|
|
||||||
|
// Get the elevation in meters
|
||||||
|
float elevation = id(elevation_meters);
|
||||||
|
|
||||||
|
// Convert temperature to Kelvin
|
||||||
|
float temp_kelvin = temperature + 273.15;
|
||||||
|
|
||||||
|
// Calculate relative pressure using the barometric formula
|
||||||
|
// P0 = P * exp(g * M * h / (R * T))
|
||||||
|
// where:
|
||||||
|
// P0 = sea level pressure
|
||||||
|
// P = absolute pressure
|
||||||
|
// g = gravitational acceleration (9.80665 m/s²)
|
||||||
|
// M = molar mass of Earth's air (0.0289644 kg/mol)
|
||||||
|
// h = height above sea level
|
||||||
|
// R = universal gas constant (8.31432 N·m/(mol·K))
|
||||||
|
// T = temperature in Kelvin
|
||||||
|
float relative_pressure = abs_pressure * exp(9.80665 * 0.0289644 * elevation / (8.31432 * temp_kelvin));
|
||||||
|
|
||||||
|
return relative_pressure;
|
||||||
|
|
||||||
- platform: tsl2591
|
- platform: tsl2591
|
||||||
address: 0x29
|
address: 0x29
|
||||||
update_interval: 1s
|
update_interval: 1s
|
||||||
@ -903,6 +943,22 @@ number:
|
|||||||
id: pressure_offset
|
id: pressure_offset
|
||||||
value: !lambda 'return float(x);'
|
value: !lambda 'return float(x);'
|
||||||
|
|
||||||
|
# Elevation in meters:
|
||||||
|
# The elevation above sea level for relative pressure calculation
|
||||||
|
- platform: template
|
||||||
|
name: "Elevation (meters)"
|
||||||
|
id: elevation_meters_setter
|
||||||
|
min_value: -100
|
||||||
|
max_value: 10000
|
||||||
|
step: 1
|
||||||
|
lambda: |-
|
||||||
|
return id(elevation_meters);
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- globals.set:
|
||||||
|
id: elevation_meters
|
||||||
|
value: !lambda 'return float(x);'
|
||||||
|
|
||||||
# PIR Hold Time:
|
# PIR Hold Time:
|
||||||
# The number of seconds after motion detection for the PIR sensor to remain held on
|
# The number of seconds after motion detection for the PIR sensor to remain held on
|
||||||
- platform: template
|
- platform: template
|
||||||
|
Loading…
x
Reference in New Issue
Block a user