Skip to content

Commit 1f99a6a

Browse files
committed
Fix possible negative numbers for PM2.5 after correction
1 parent cb4addd commit 1f99a6a

8 files changed

Lines changed: 83 additions & 34 deletions

packages/airgradient_d1_mini_board.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
substitutions:
2-
config_version: 4.0.0
2+
config_version: 4.0.1
33

44
esphome:
55
name: "${name}"

packages/airgradient_esp32-c3_board.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
substitutions:
2-
config_version: 4.0.0
2+
config_version: 4.0.1
33

44
esphome:
55
name: "${name}"

packages/sensor_pms5003.yaml

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,24 @@ sensor:
1414
device_class: pm25 # Added to report properly to HomeKit
1515
filters:
1616
- lambda: |-
17+
float result = 0.0;
1718
if (x == 0.0) {
18-
return 0.0;
19+
result = 0.0;
1920
} else if (x < 30.0) {
20-
return((0.524 * x) - (0.0862 * id(humidity).state) + 5.75);
21+
result = (0.524 * x) - (0.0862 * id(humidity).state) + 5.75;
2122
} else if (x < 50.0) {
22-
return((0.786 * (x / 20 - 3/2) + 0.524 * (1 - (x / 20 - 3/2))) * x - (0.0862 * id(humidity).state) + 5.75);
23+
result = (0.786 * (x / 20 - 3/2) + 0.524 * (1 - (x / 20 - 3/2))) * x - (0.0862 * id(humidity).state) + 5.75;
2324
} else if (x < 210.0) {
24-
return((0.786 * x) - (0.0862 * id(humidity).state) + 5.75);
25+
result = (0.786 * x) - (0.0862 * id(humidity).state) + 5.75;
2526
} else if (x < 260.0) {
26-
return((0.69 * (x / 50 - 21/5) + 0.786 * (1 - (x / 50 - 21/5))) * x - (0.0862 * id(humidity).state * (1 - (x / 50 - 21/5))) + (2.966 * (x / 50 - 21/5)) + (5.75 * (1 - (x / 50 - 21/5))) + (8.84 * pow(10,-4) * pow(x,2) * (x / 50 - 21/5)));
27+
result = (0.69 * (x / 50 - 21/5) + 0.786 * (1 - (x / 50 - 21/5))) * x - (0.0862 * id(humidity).state * (1 - (x / 50 - 21/5))) + (2.966 * (x / 50 - 21/5)) + (5.75 * (1 - (x / 50 - 21/5))) + (8.84 * pow(10,-4) * pow(x,2) * (x / 50 - 21/5));
2728
} else {
28-
return(2.966 + (0.69 * x) + (8.84 * pow(10,-4) * pow(x,2)));
29+
result = 2.966 + (0.69 * x) + (8.84 * pow(10,-4) * pow(x,2));
30+
}
31+
if (result <= 0.0) {
32+
return 0.0;
33+
} else {
34+
return result;
2935
}
3036
pm_1_0:
3137
name: "PM 1.0"

packages/sensor_pms5003_extended_life.yaml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,27 @@ sensor:
1010
name: "PM 2.5"
1111
id: pm_2_5
1212
device_class: pm25 # Added to report properly to HomeKit
13+
filters:
14+
- lambda: |-
15+
float result = 0.0;
16+
if (x == 0.0) {
17+
result = 0.0;
18+
} else if (x < 30.0) {
19+
result = (0.524 * x) - (0.0862 * id(humidity).state) + 5.75;
20+
} else if (x < 50.0) {
21+
result = (0.786 * (x / 20 - 3/2) + 0.524 * (1 - (x / 20 - 3/2))) * x - (0.0862 * id(humidity).state) + 5.75;
22+
} else if (x < 210.0) {
23+
result = (0.786 * x) - (0.0862 * id(humidity).state) + 5.75;
24+
} else if (x < 260.0) {
25+
result = (0.69 * (x / 50 - 21/5) + 0.786 * (1 - (x / 50 - 21/5))) * x - (0.0862 * id(humidity).state * (1 - (x / 50 - 21/5))) + (2.966 * (x / 50 - 21/5)) + (5.75 * (1 - (x / 50 - 21/5))) + (8.84 * pow(10,-4) * pow(x,2) * (x / 50 - 21/5));
26+
} else {
27+
result = 2.966 + (0.69 * x) + (8.84 * pow(10,-4) * pow(x,2));
28+
}
29+
if (result <= 0.0) {
30+
return 0.0;
31+
} else {
32+
return result;
33+
}
1334
pm_1_0:
1435
name: "PM 1.0"
1536
id: pm_1_0

packages/sensor_pms5003t.yaml

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,20 +67,25 @@ sensor:
6767
accuracy_decimals: 0
6868
state_class: measurement
6969
lambda: |-
70+
float result = 0.0;
7071
if (id(pm_2_5_raw).state == 0.0) {
71-
return 0.0;
72+
result = 0.0;
7273
} else if (id(pm_2_5_raw).state < 30.0) {
73-
return((0.524 * id(pm_2_5_raw).state) - (0.0862 * id(humidity).state) + 5.75);
74+
result = (0.524 * id(pm_2_5_raw).state) - (0.0862 * id(humidity).state) + 5.75;
7475
} else if (id(pm_2_5_raw).state < 50.0) {
75-
return((0.786 * (id(pm_2_5_raw).state / 20 - 3/2) + 0.524 * (1 - (id(pm_2_5_raw).state / 20 - 3/2))) * id(pm_2_5_raw).state - (0.0862 * id(humidity).state) + 5.75);
76+
result = (0.786 * (id(pm_2_5_raw).state / 20 - 3/2) + 0.524 * (1 - (id(pm_2_5_raw).state / 20 - 3/2))) * id(pm_2_5_raw).state - (0.0862 * id(humidity).state) + 5.75;
7677
} else if (id(pm_2_5_raw).state < 210.0) {
77-
return((0.786 * id(pm_2_5_raw).state) - (0.0862 * id(humidity).state) + 5.75);
78+
result = (0.786 * id(pm_2_5_raw).state) - (0.0862 * id(humidity).state) + 5.75;
7879
} else if (id(pm_2_5_raw).state < 260.0) {
79-
return((0.69 * (id(pm_2_5_raw).state / 50 - 21/5) + 0.786 * (1 - (id(pm_2_5_raw).state / 50 - 21/5))) * id(pm_2_5_raw).state - (0.0862 * id(humidity).state * (1 - (id(pm_2_5_raw).state / 50 - 21/5))) + (2.966 * (id(pm_2_5_raw).state / 50 - 21/5)) + (5.75 * (1 - (id(pm_2_5_raw).state / 50 - 21/5))) + (8.84 * pow(10,-4) * pow(id(pm_2_5_raw).state,2) * (id(pm_2_5_raw).state / 50 - 21/5)));
80+
result = (0.69 * (id(pm_2_5_raw).state / 50 - 21/5) + 0.786 * (1 - (id(pm_2_5_raw).state / 50 - 21/5))) * id(pm_2_5_raw).state - (0.0862 * id(humidity).state * (1 - (id(pm_2_5_raw).state / 50 - 21/5))) + (2.966 * (id(pm_2_5_raw).state / 50 - 21/5)) + (5.75 * (1 - (id(pm_2_5_raw).state / 50 - 21/5))) + (8.84 * pow(10,-4) * pow(id(pm_2_5_raw).state,2) * (id(pm_2_5_raw).state / 50 - 21/5));
8081
} else {
81-
return(2.966 + (0.69 * id(pm_2_5_raw).state) + (8.84 * pow(10,-4) * pow(id(pm_2_5_raw).state,2)));
82+
result = 2.966 + (0.69 * id(pm_2_5_raw).state) + (8.84 * pow(10,-4) * pow(id(pm_2_5_raw).state,2));
83+
}
84+
if (result <= 0.0) {
85+
return 0.0;
86+
} else {
87+
return result;
8288
}
83-
8489
- platform: template
8590
# Depends on another sensor providing an ID of pm_2_5 such as a pms5003
8691
name: "PM 2.5 AQI"

packages/sensor_pms5003t_2.yaml

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,20 +68,25 @@ sensor:
6868
accuracy_decimals: 0
6969
state_class: measurement
7070
lambda: |-
71+
float result = 0.0;
7172
if (id(pm_2_5_2_raw).state == 0.0) {
72-
return 0.0;
73+
result = 0.0;
7374
} else if (id(pm_2_5_2_raw).state < 30.0) {
74-
return((0.524 * id(pm_2_5_2_raw).state) - (0.0862 * id(humidity).state) + 5.75);
75+
result = (0.524 * id(pm_2_5_2_raw).state) - (0.0862 * id(humidity).state) + 5.75;
7576
} else if (id(pm_2_5_2_raw).state < 50.0) {
76-
return((0.786 * (id(pm_2_5_2_raw).state / 20 - 3/2) + 0.524 * (1 - (id(pm_2_5_2_raw).state / 20 - 3/2))) * id(pm_2_5_2_raw).state - (0.0862 * id(humidity).state) + 5.75);
77+
result = (0.786 * (id(pm_2_5_2_raw).state / 20 - 3/2) + 0.524 * (1 - (id(pm_2_5_2_raw).state / 20 - 3/2))) * id(pm_2_5_2_raw).state - (0.0862 * id(humidity).state) + 5.75;
7778
} else if (id(pm_2_5_2_raw).state < 210.0) {
78-
return((0.786 * id(pm_2_5_2_raw).state) - (0.0862 * id(humidity).state) + 5.75);
79+
result = (0.786 * id(pm_2_5_2_raw).state) - (0.0862 * id(humidity).state) + 5.75;
7980
} else if (id(pm_2_5_2_raw).state < 260.0) {
80-
return((0.69 * (id(pm_2_5_2_raw).state / 50 - 21/5) + 0.786 * (1 - (id(pm_2_5_2_raw).state / 50 - 21/5))) * id(pm_2_5_2_raw).state - (0.0862 * id(humidity).state * (1 - (id(pm_2_5_2_raw).state / 50 - 21/5))) + (2.966 * (id(pm_2_5_2_raw).state / 50 - 21/5)) + (5.75 * (1 - (id(pm_2_5_2_raw).state / 50 - 21/5))) + (8.84 * pow(10,-4) * pow(id(pm_2_5_2_raw).state,2) * (id(pm_2_5_2_raw).state / 50 - 21/5)));
81+
result = (0.69 * (id(pm_2_5_2_raw).state / 50 - 21/5) + 0.786 * (1 - (id(pm_2_5_2_raw).state / 50 - 21/5))) * id(pm_2_5_2_raw).state - (0.0862 * id(humidity).state * (1 - (id(pm_2_5_2_raw).state / 50 - 21/5))) + (2.966 * (id(pm_2_5_2_raw).state / 50 - 21/5)) + (5.75 * (1 - (id(pm_2_5_2_raw).state / 50 - 21/5))) + (8.84 * pow(10,-4) * pow(id(pm_2_5_2_raw).state,2) * (id(pm_2_5_2_raw).state / 50 - 21/5));
8182
} else {
82-
return(2.966 + (0.69 * id(pm_2_5_2_raw).state) + (8.84 * pow(10,-4) * pow(id(pm_2_5_2_raw).state,2)));
83+
result = 2.966 + (0.69 * id(pm_2_5_2_raw).state) + (8.84 * pow(10,-4) * pow(id(pm_2_5_2_raw).state,2));
84+
}
85+
if (result <= 0.0) {
86+
return 0.0;
87+
} else {
88+
return result;
8389
}
84-
8590
8691
# Average the readings from both sensors to return a value
8792
- platform: template

packages/sensor_pms5003t_2_extended_life.yaml

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,24 @@ sensor:
7171
accuracy_decimals: 0
7272
state_class: measurement
7373
lambda: |-
74+
float result = 0.0;
7475
if (id(pm_2_5_2_raw).state == 0.0) {
75-
return 0.0;
76+
result = 0.0;
7677
} else if (id(pm_2_5_2_raw).state < 30.0) {
77-
return((0.524 * id(pm_2_5_2_raw).state) - (0.0862 * id(humidity).state) + 5.75);
78+
result = (0.524 * id(pm_2_5_2_raw).state) - (0.0862 * id(humidity).state) + 5.75;
7879
} else if (id(pm_2_5_2_raw).state < 50.0) {
79-
return((0.786 * (id(pm_2_5_2_raw).state / 20 - 3/2) + 0.524 * (1 - (id(pm_2_5_2_raw).state / 20 - 3/2))) * id(pm_2_5_2_raw).state - (0.0862 * id(humidity).state) + 5.75);
80+
result = (0.786 * (id(pm_2_5_2_raw).state / 20 - 3/2) + 0.524 * (1 - (id(pm_2_5_2_raw).state / 20 - 3/2))) * id(pm_2_5_2_raw).state - (0.0862 * id(humidity).state) + 5.75;
8081
} else if (id(pm_2_5_2_raw).state < 210.0) {
81-
return((0.786 * id(pm_2_5_2_raw).state) - (0.0862 * id(humidity).state) + 5.75);
82+
result = (0.786 * id(pm_2_5_2_raw).state) - (0.0862 * id(humidity).state) + 5.75;
8283
} else if (id(pm_2_5_2_raw).state < 260.0) {
83-
return((0.69 * (id(pm_2_5_2_raw).state / 50 - 21/5) + 0.786 * (1 - (id(pm_2_5_2_raw).state / 50 - 21/5))) * id(pm_2_5_2_raw).state - (0.0862 * id(humidity).state * (1 - (id(pm_2_5_2_raw).state / 50 - 21/5))) + (2.966 * (id(pm_2_5_2_raw).state / 50 - 21/5)) + (5.75 * (1 - (id(pm_2_5_2_raw).state / 50 - 21/5))) + (8.84 * pow(10,-4) * pow(id(pm_2_5_2_raw).state,2) * (id(pm_2_5_2_raw).state / 50 - 21/5)));
84+
result = (0.69 * (id(pm_2_5_2_raw).state / 50 - 21/5) + 0.786 * (1 - (id(pm_2_5_2_raw).state / 50 - 21/5))) * id(pm_2_5_2_raw).state - (0.0862 * id(humidity).state * (1 - (id(pm_2_5_2_raw).state / 50 - 21/5))) + (2.966 * (id(pm_2_5_2_raw).state / 50 - 21/5)) + (5.75 * (1 - (id(pm_2_5_2_raw).state / 50 - 21/5))) + (8.84 * pow(10,-4) * pow(id(pm_2_5_2_raw).state,2) * (id(pm_2_5_2_raw).state / 50 - 21/5));
8485
} else {
85-
return(2.966 + (0.69 * id(pm_2_5_2_raw).state) + (8.84 * pow(10,-4) * pow(id(pm_2_5_2_raw).state,2)));
86+
result = 2.966 + (0.69 * id(pm_2_5_2_raw).state) + (8.84 * pow(10,-4) * pow(id(pm_2_5_2_raw).state,2));
87+
}
88+
if (result <= 0.0) {
89+
return 0.0;
90+
} else {
91+
return result;
8692
}
8793
8894
# Average the readings from both sensors to return a value

packages/sensor_pms5003t_extended_life.yaml

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,18 +70,24 @@ sensor:
7070
accuracy_decimals: 0
7171
state_class: measurement
7272
lambda: |-
73+
float result = 0.0;
7374
if (id(pm_2_5_raw).state == 0.0) {
74-
return 0.0;
75+
result = 0.0;
7576
} else if (id(pm_2_5_raw).state < 30.0) {
76-
return((0.524 * id(pm_2_5_raw).state) - (0.0862 * id(humidity).state) + 5.75);
77+
result = (0.524 * id(pm_2_5_raw).state) - (0.0862 * id(humidity).state) + 5.75;
7778
} else if (id(pm_2_5_raw).state < 50.0) {
78-
return((0.786 * (id(pm_2_5_raw).state / 20 - 3/2) + 0.524 * (1 - (id(pm_2_5_raw).state / 20 - 3/2))) * id(pm_2_5_raw).state - (0.0862 * id(humidity).state) + 5.75);
79+
result = (0.786 * (id(pm_2_5_raw).state / 20 - 3/2) + 0.524 * (1 - (id(pm_2_5_raw).state / 20 - 3/2))) * id(pm_2_5_raw).state - (0.0862 * id(humidity).state) + 5.75;
7980
} else if (id(pm_2_5_raw).state < 210.0) {
80-
return((0.786 * id(pm_2_5_raw).state) - (0.0862 * id(humidity).state) + 5.75);
81+
result = (0.786 * id(pm_2_5_raw).state) - (0.0862 * id(humidity).state) + 5.75;
8182
} else if (id(pm_2_5_raw).state < 260.0) {
82-
return((0.69 * (id(pm_2_5_raw).state / 50 - 21/5) + 0.786 * (1 - (id(pm_2_5_raw).state / 50 - 21/5))) * id(pm_2_5_raw).state - (0.0862 * id(humidity).state * (1 - (id(pm_2_5_raw).state / 50 - 21/5))) + (2.966 * (id(pm_2_5_raw).state / 50 - 21/5)) + (5.75 * (1 - (id(pm_2_5_raw).state / 50 - 21/5))) + (8.84 * pow(10,-4) * pow(id(pm_2_5_raw).state,2) * (id(pm_2_5_raw).state / 50 - 21/5)));
83+
result = (0.69 * (id(pm_2_5_raw).state / 50 - 21/5) + 0.786 * (1 - (id(pm_2_5_raw).state / 50 - 21/5))) * id(pm_2_5_raw).state - (0.0862 * id(humidity).state * (1 - (id(pm_2_5_raw).state / 50 - 21/5))) + (2.966 * (id(pm_2_5_raw).state / 50 - 21/5)) + (5.75 * (1 - (id(pm_2_5_raw).state / 50 - 21/5))) + (8.84 * pow(10,-4) * pow(id(pm_2_5_raw).state,2) * (id(pm_2_5_raw).state / 50 - 21/5));
8384
} else {
84-
return(2.966 + (0.69 * id(pm_2_5_raw).state) + (8.84 * pow(10,-4) * pow(id(pm_2_5_raw).state,2)));
85+
result = 2.966 + (0.69 * id(pm_2_5_raw).state) + (8.84 * pow(10,-4) * pow(id(pm_2_5_raw).state,2));
86+
}
87+
if (result <= 0.0) {
88+
return 0.0;
89+
} else {
90+
return result;
8591
}
8692
8793

0 commit comments

Comments
 (0)