Skip to content

Commit 4067b1d

Browse files
authored
fix algorithm to reference raw humidity value (#93)
1 parent a3bc4c8 commit 4067b1d

8 files changed

+31
-28
lines changed

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.6
2+
config_version: 4.0.7
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.6
2+
config_version: 4.0.7
33

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

packages/sensor_pms5003.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ sensor:
1818
if (x == 0.0) {
1919
result = 0.0;
2020
} else if (x < 30.0) {
21-
result = (0.524 * x) - (0.0862 * id(humidity).state) + 5.75;
21+
result = (0.524 * x) - (0.0862 * id(humidity_raw).state) + 5.75;
2222
} else if (x < 50.0) {
23-
result = (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_raw).state) + 5.75;
2424
} else if (x < 210.0) {
25-
result = (0.786 * x) - (0.0862 * id(humidity).state) + 5.75;
25+
result = (0.786 * x) - (0.0862 * id(humidity_raw).state) + 5.75;
2626
} else if (x < 260.0) {
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));
27+
result = (0.69 * (x / 50 - 21/5) + 0.786 * (1 - (x / 50 - 21/5))) * x - (0.0862 * id(humidity_raw).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));
2828
} else {
2929
result = 2.966 + (0.69 * x) + (8.84 * pow(10,-4) * pow(x,2));
3030
}

packages/sensor_pms5003_extended_life.yaml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
substitutions:
22
pm_update_interval: "2min"
33

4+
# Impliments PM2.5 correction algorithm supported by AirGradient from EPA
5+
# https://www.airgradient.com/documentation/correction-algorithms/
6+
# https://document.airnow.gov/airnow-fire-and-smoke-map-questions-and-answers.pdf
47
sensor:
58
- platform: pmsx003
69
# PMS5003 https://esphome.io/components/sensor/pmsx003.html
@@ -16,13 +19,13 @@ sensor:
1619
if (x == 0.0) {
1720
result = 0.0;
1821
} else if (x < 30.0) {
19-
result = (0.524 * x) - (0.0862 * id(humidity).state) + 5.75;
22+
result = (0.524 * x) - (0.0862 * id(humidity_raw).state) + 5.75;
2023
} 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;
24+
result = (0.786 * (x / 20 - 3/2) + 0.524 * (1 - (x / 20 - 3/2))) * x - (0.0862 * id(humidity_raw).state) + 5.75;
2225
} else if (x < 210.0) {
23-
result = (0.786 * x) - (0.0862 * id(humidity).state) + 5.75;
26+
result = (0.786 * x) - (0.0862 * id(humidity_raw).state) + 5.75;
2427
} 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));
28+
result = (0.69 * (x / 50 - 21/5) + 0.786 * (1 - (x / 50 - 21/5))) * x - (0.0862 * id(humidity_raw).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));
2629
} else {
2730
result = 2.966 + (0.69 * x) + (8.84 * pow(10,-4) * pow(x,2));
2831
}

packages/sensor_pms5003t.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,13 @@ sensor:
7171
if (id(pm_2_5_raw).state == 0.0) {
7272
result = 0.0;
7373
} else if (id(pm_2_5_raw).state < 30.0) {
74-
result = (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_raw).state) + 5.75;
7575
} else if (id(pm_2_5_raw).state < 50.0) {
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;
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_raw).state) + 5.75;
7777
} else if (id(pm_2_5_raw).state < 210.0) {
78-
result = (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_raw).state) + 5.75;
7979
} else if (id(pm_2_5_raw).state < 260.0) {
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));
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_raw).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));
8181
} else {
8282
result = 2.966 + (0.69 * id(pm_2_5_raw).state) + (8.84 * pow(10,-4) * pow(id(pm_2_5_raw).state,2));
8383
}

packages/sensor_pms5003t_2.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,13 @@ sensor:
7272
if (id(pm_2_5_2_raw).state == 0.0) {
7373
result = 0.0;
7474
} else if (id(pm_2_5_2_raw).state < 30.0) {
75-
result = (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_raw).state) + 5.75;
7676
} else if (id(pm_2_5_2_raw).state < 50.0) {
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;
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_raw).state) + 5.75;
7878
} else if (id(pm_2_5_2_raw).state < 210.0) {
79-
result = (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_raw).state) + 5.75;
8080
} else if (id(pm_2_5_2_raw).state < 260.0) {
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));
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_raw).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));
8282
} else {
8383
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));
8484
}
@@ -161,7 +161,7 @@ sensor:
161161
- platform: template
162162
id: humidity_avg
163163
name: "Humidity (Average)"
164-
lambda: return (id(humidity).state + id(humidity_2).state) / 2.0;
164+
lambda: return (id(humidity_raw).state + id(humidity_2).state) / 2.0;
165165
unit_of_measurement: '%'
166166
accuracy_decimals: 1
167167
device_class: humidity

packages/sensor_pms5003t_2_extended_life.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,13 @@ sensor:
7575
if (id(pm_2_5_2_raw).state == 0.0) {
7676
result = 0.0;
7777
} else if (id(pm_2_5_2_raw).state < 30.0) {
78-
result = (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_raw).state) + 5.75;
7979
} else if (id(pm_2_5_2_raw).state < 50.0) {
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;
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_raw).state) + 5.75;
8181
} else if (id(pm_2_5_2_raw).state < 210.0) {
82-
result = (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_raw).state) + 5.75;
8383
} else if (id(pm_2_5_2_raw).state < 260.0) {
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));
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_raw).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));
8585
} else {
8686
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));
8787
}
@@ -149,7 +149,7 @@ sensor:
149149
- platform: template
150150
id: humidity_avg
151151
name: "Humidity (Average)"
152-
lambda: return (id(humidity).state + id(humidity_2).state) / 2.0;
152+
lambda: return (id(humidity_raw).state + id(humidity_2).state) / 2.0;
153153
unit_of_measurement: '%'
154154
accuracy_decimals: 1
155155
device_class: humidity

packages/sensor_pms5003t_extended_life.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@ sensor:
7474
if (id(pm_2_5_raw).state == 0.0) {
7575
result = 0.0;
7676
} else if (id(pm_2_5_raw).state < 30.0) {
77-
result = (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_raw).state) + 5.75;
7878
} else if (id(pm_2_5_raw).state < 50.0) {
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;
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_raw).state) + 5.75;
8080
} else if (id(pm_2_5_raw).state < 210.0) {
81-
result = (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_raw).state) + 5.75;
8282
} else if (id(pm_2_5_raw).state < 260.0) {
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));
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_raw).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));
8484
} else {
8585
result = 2.966 + (0.69 * id(pm_2_5_raw).state) + (8.84 * pow(10,-4) * pow(id(pm_2_5_raw).state,2));
8686
}

0 commit comments

Comments
 (0)