@justair/justair-library 7.9.0 → 7.10.0-alpha.1a4bd33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -121,6 +121,31 @@ Same install-time visibility caveat as the 7.4.0 section above.
121
121
 
122
122
  `HI` is **derived, not measured**. Processing-Engine computes it from that reading's own `T_AMB` / `RH_AMB` pair using the NOAA formula (JA-3120); no supplier reports it. It takes no `_AMB` suffix because there is no internal counterpart — an enclosure Heat Index would describe the inside of the housing. Never compute it from the bare `T` / `RH`.
123
123
 
124
+ ### New parameter and type changes in 7.10.0
125
+
126
+ | id | Name | Unit |
127
+ |---|---|---|
128
+ | `RN` | Radon | `pCi/L` |
129
+
130
+ Same install-time visibility caveat as the 7.4.0 section above. Nothing normalizes radon today, so no
131
+ monitor carries it yet, but the first one that does will surface publicly. JA-3427 records that radon
132
+ should start admin only; that gating lives only in JustAir-Client's `parameterFiltering.js` and V2 has
133
+ no equivalent.
134
+
135
+ `RN.rfc` is `4`, the EPA indoor action level in pCi/L. It is **not** an IRIS chronic inhalation RfC in
136
+ µg/m³, which is what every `HEAVY_METALS` `rfc` is. Nothing reads `rfc` off `PARAMETERS` today.
137
+
138
+ Two `type` values also changed, so a service that groups by `type` will show these in a new group
139
+ after install:
140
+
141
+ | id | Was | Now |
142
+ |---|---|---|
143
+ | `H2S` | `Volatile Organic Compound` | `Gas` |
144
+ | `CH4` | `Volatile Organic Compound` | `Gas` |
145
+
146
+ `origin` and `impacts` were also filled in for the non-AQI pollutants that had them blank. Display
147
+ only, no shape change.
148
+
124
149
  ### Object shape
125
150
 
126
151
  Each constant is an object with the following fields:
@@ -132,7 +157,7 @@ Each constant is an object with the following fields:
132
157
  | `name` | `string` | Full descriptive name (e.g. `"Particulate Matter 2.5 (PM₂.₅)"`) |
133
158
  | `unit` | `string` | Measurement unit (e.g. `"µg/m³"`) |
134
159
  | `type` | `string` | Category: `"Particulate Matter"`, `"Gas"`, `"Volatile Organic Compound"`, `"Weather"`, `"Heavy Metal"`, `"Heavy Metal - Essential Nutrient"` |
135
- | `rfc` | `number \| null` | EPA IRIS chronic inhalation reference concentration (µg/m³) |
160
+ | `rfc` | `number \| null` | EPA IRIS chronic inhalation reference concentration (µg/m³). Exception: `RN.rfc` is the EPA indoor action level in pCi/L |
136
161
  | `origin` | `string \| null` | Description of pollution source |
137
162
  | `impacts` | `string \| null` | Human health impact description |
138
163
 
@@ -6,8 +6,8 @@ export namespace PARAMETERS {
6
6
  let unit: string;
7
7
  let type: string;
8
8
  let rfc: any;
9
- let origin: any;
10
- let impacts: any;
9
+ let origin: string;
10
+ let impacts: string;
11
11
  }
12
12
  namespace NO2 {
13
13
  let id_1: string;
@@ -94,9 +94,9 @@ export namespace PARAMETERS {
94
94
  export { type_5 as type };
95
95
  let rfc_5: any;
96
96
  export { rfc_5 as rfc };
97
- let origin_5: any;
97
+ let origin_5: string;
98
98
  export { origin_5 as origin };
99
- let impacts_5: any;
99
+ let impacts_5: string;
100
100
  export { impacts_5 as impacts };
101
101
  }
102
102
  namespace BC {
@@ -112,9 +112,9 @@ export namespace PARAMETERS {
112
112
  export { type_6 as type };
113
113
  let rfc_6: any;
114
114
  export { rfc_6 as rfc };
115
- let origin_6: any;
115
+ let origin_6: string;
116
116
  export { origin_6 as origin };
117
- let impacts_6: any;
117
+ let impacts_6: string;
118
118
  export { impacts_6 as impacts };
119
119
  }
120
120
  namespace BRC {
@@ -130,9 +130,9 @@ export namespace PARAMETERS {
130
130
  export { type_7 as type };
131
131
  let rfc_7: any;
132
132
  export { rfc_7 as rfc };
133
- let origin_7: any;
133
+ let origin_7: string;
134
134
  export { origin_7 as origin };
135
- let impacts_7: any;
135
+ let impacts_7: string;
136
136
  export { impacts_7 as impacts };
137
137
  }
138
138
  namespace CO2 {
@@ -148,9 +148,9 @@ export namespace PARAMETERS {
148
148
  export { type_8 as type };
149
149
  let rfc_8: any;
150
150
  export { rfc_8 as rfc };
151
- let origin_8: any;
151
+ let origin_8: string;
152
152
  export { origin_8 as origin };
153
- let impacts_8: any;
153
+ let impacts_8: string;
154
154
  export { impacts_8 as impacts };
155
155
  }
156
156
  namespace H2S {
@@ -166,9 +166,9 @@ export namespace PARAMETERS {
166
166
  export { type_9 as type };
167
167
  let rfc_9: any;
168
168
  export { rfc_9 as rfc };
169
- let origin_9: any;
169
+ let origin_9: string;
170
170
  export { origin_9 as origin };
171
- let impacts_9: any;
171
+ let impacts_9: string;
172
172
  export { impacts_9 as impacts };
173
173
  }
174
174
  namespace CH4 {
@@ -184,9 +184,9 @@ export namespace PARAMETERS {
184
184
  export { type_10 as type };
185
185
  let rfc_10: any;
186
186
  export { rfc_10 as rfc };
187
- let origin_10: any;
187
+ let origin_10: string;
188
188
  export { origin_10 as origin };
189
- let impacts_10: any;
189
+ let impacts_10: string;
190
190
  export { impacts_10 as impacts };
191
191
  }
192
192
  namespace NO {
@@ -202,12 +202,12 @@ export namespace PARAMETERS {
202
202
  export { type_11 as type };
203
203
  let rfc_11: any;
204
204
  export { rfc_11 as rfc };
205
- let origin_11: any;
205
+ let origin_11: string;
206
206
  export { origin_11 as origin };
207
- let impacts_11: any;
207
+ let impacts_11: string;
208
208
  export { impacts_11 as impacts };
209
209
  }
210
- namespace PM1 {
210
+ namespace RN {
211
211
  let id_12: string;
212
212
  export { id_12 as id };
213
213
  let label_12: string;
@@ -218,14 +218,14 @@ export namespace PARAMETERS {
218
218
  export { unit_12 as unit };
219
219
  let type_12: string;
220
220
  export { type_12 as type };
221
- let rfc_12: any;
221
+ let rfc_12: number;
222
222
  export { rfc_12 as rfc };
223
- let origin_12: any;
223
+ let origin_12: string;
224
224
  export { origin_12 as origin };
225
- let impacts_12: any;
225
+ let impacts_12: string;
226
226
  export { impacts_12 as impacts };
227
227
  }
228
- namespace UFP {
228
+ namespace PM1 {
229
229
  let id_13: string;
230
230
  export { id_13 as id };
231
231
  let label_13: string;
@@ -238,12 +238,12 @@ export namespace PARAMETERS {
238
238
  export { type_13 as type };
239
239
  let rfc_13: any;
240
240
  export { rfc_13 as rfc };
241
- let origin_13: any;
241
+ let origin_13: string;
242
242
  export { origin_13 as origin };
243
- let impacts_13: any;
243
+ let impacts_13: string;
244
244
  export { impacts_13 as impacts };
245
245
  }
246
- namespace VOC {
246
+ namespace UFP {
247
247
  let id_14: string;
248
248
  export { id_14 as id };
249
249
  let label_14: string;
@@ -256,12 +256,12 @@ export namespace PARAMETERS {
256
256
  export { type_14 as type };
257
257
  let rfc_14: any;
258
258
  export { rfc_14 as rfc };
259
- let origin_14: any;
259
+ let origin_14: string;
260
260
  export { origin_14 as origin };
261
- let impacts_14: any;
261
+ let impacts_14: string;
262
262
  export { impacts_14 as impacts };
263
263
  }
264
- namespace DP {
264
+ namespace VOC {
265
265
  let id_15: string;
266
266
  export { id_15 as id };
267
267
  let label_15: string;
@@ -274,12 +274,12 @@ export namespace PARAMETERS {
274
274
  export { type_15 as type };
275
275
  let rfc_15: any;
276
276
  export { rfc_15 as rfc };
277
- let origin_15: any;
277
+ let origin_15: string;
278
278
  export { origin_15 as origin };
279
- let impacts_15: any;
279
+ let impacts_15: string;
280
280
  export { impacts_15 as impacts };
281
281
  }
282
- namespace DP_AMB {
282
+ namespace DP {
283
283
  let id_16: string;
284
284
  export { id_16 as id };
285
285
  let label_16: string;
@@ -297,7 +297,7 @@ export namespace PARAMETERS {
297
297
  let impacts_16: any;
298
298
  export { impacts_16 as impacts };
299
299
  }
300
- namespace RH {
300
+ namespace DP_AMB {
301
301
  let id_17: string;
302
302
  export { id_17 as id };
303
303
  let label_17: string;
@@ -315,7 +315,7 @@ export namespace PARAMETERS {
315
315
  let impacts_17: any;
316
316
  export { impacts_17 as impacts };
317
317
  }
318
- namespace RH_AMB {
318
+ namespace RH {
319
319
  let id_18: string;
320
320
  export { id_18 as id };
321
321
  let label_18: string;
@@ -333,7 +333,7 @@ export namespace PARAMETERS {
333
333
  let impacts_18: any;
334
334
  export { impacts_18 as impacts };
335
335
  }
336
- namespace T {
336
+ namespace RH_AMB {
337
337
  let id_19: string;
338
338
  export { id_19 as id };
339
339
  let label_19: string;
@@ -351,7 +351,7 @@ export namespace PARAMETERS {
351
351
  let impacts_19: any;
352
352
  export { impacts_19 as impacts };
353
353
  }
354
- namespace T_AMB {
354
+ namespace T {
355
355
  let id_20: string;
356
356
  export { id_20 as id };
357
357
  let label_20: string;
@@ -369,7 +369,7 @@ export namespace PARAMETERS {
369
369
  let impacts_20: any;
370
370
  export { impacts_20 as impacts };
371
371
  }
372
- namespace WD {
372
+ namespace T_AMB {
373
373
  let id_21: string;
374
374
  export { id_21 as id };
375
375
  let label_21: string;
@@ -387,7 +387,7 @@ export namespace PARAMETERS {
387
387
  let impacts_21: any;
388
388
  export { impacts_21 as impacts };
389
389
  }
390
- namespace WS {
390
+ namespace WD {
391
391
  let id_22: string;
392
392
  export { id_22 as id };
393
393
  let label_22: string;
@@ -405,7 +405,7 @@ export namespace PARAMETERS {
405
405
  let impacts_22: any;
406
406
  export { impacts_22 as impacts };
407
407
  }
408
- namespace GS {
408
+ namespace WS {
409
409
  let id_23: string;
410
410
  export { id_23 as id };
411
411
  let label_23: string;
@@ -423,7 +423,7 @@ export namespace PARAMETERS {
423
423
  let impacts_23: any;
424
424
  export { impacts_23 as impacts };
425
425
  }
426
- namespace HI {
426
+ namespace GS {
427
427
  let id_24: string;
428
428
  export { id_24 as id };
429
429
  let label_24: string;
@@ -441,7 +441,7 @@ export namespace PARAMETERS {
441
441
  let impacts_24: any;
442
442
  export { impacts_24 as impacts };
443
443
  }
444
- namespace R {
444
+ namespace HI {
445
445
  let id_25: string;
446
446
  export { id_25 as id };
447
447
  let label_25: string;
@@ -459,7 +459,7 @@ export namespace PARAMETERS {
459
459
  let impacts_25: any;
460
460
  export { impacts_25 as impacts };
461
461
  }
462
- namespace SR {
462
+ namespace R {
463
463
  let id_26: string;
464
464
  export { id_26 as id };
465
465
  let label_26: string;
@@ -477,7 +477,7 @@ export namespace PARAMETERS {
477
477
  let impacts_26: any;
478
478
  export { impacts_26 as impacts };
479
479
  }
480
- namespace P {
480
+ namespace SR {
481
481
  let id_27: string;
482
482
  export { id_27 as id };
483
483
  let label_27: string;
@@ -495,7 +495,7 @@ export namespace PARAMETERS {
495
495
  let impacts_27: any;
496
496
  export { impacts_27 as impacts };
497
497
  }
498
- namespace PAR {
498
+ namespace P {
499
499
  let id_28: string;
500
500
  export { id_28 as id };
501
501
  let label_28: string;
@@ -513,7 +513,7 @@ export namespace PARAMETERS {
513
513
  let impacts_28: any;
514
514
  export { impacts_28 as impacts };
515
515
  }
516
- namespace ARM {
516
+ namespace PAR {
517
517
  let id_29: string;
518
518
  export { id_29 as id };
519
519
  let label_29: string;
@@ -531,7 +531,7 @@ export namespace PARAMETERS {
531
531
  let impacts_29: any;
532
532
  export { impacts_29 as impacts };
533
533
  }
534
- namespace ARW {
534
+ namespace ARM {
535
535
  let id_30: string;
536
536
  export { id_30 as id };
537
537
  let label_30: string;
@@ -549,7 +549,7 @@ export namespace PARAMETERS {
549
549
  let impacts_30: any;
550
550
  export { impacts_30 as impacts };
551
551
  }
552
- namespace ARD {
552
+ namespace ARW {
553
553
  let id_31: string;
554
554
  export { id_31 as id };
555
555
  let label_31: string;
@@ -567,7 +567,7 @@ export namespace PARAMETERS {
567
567
  let impacts_31: any;
568
568
  export { impacts_31 as impacts };
569
569
  }
570
- namespace ARH {
570
+ namespace ARD {
571
571
  let id_32: string;
572
572
  export { id_32 as id };
573
573
  let label_32: string;
@@ -585,9 +585,7 @@ export namespace PARAMETERS {
585
585
  let impacts_32: any;
586
586
  export { impacts_32 as impacts };
587
587
  }
588
- }
589
- export namespace HEAVY_METALS {
590
- export namespace AS {
588
+ namespace ARH {
591
589
  let id_33: string;
592
590
  export { id_33 as id };
593
591
  let label_33: string;
@@ -598,14 +596,16 @@ export namespace HEAVY_METALS {
598
596
  export { unit_33 as unit };
599
597
  let type_33: string;
600
598
  export { type_33 as type };
601
- let rfc_33: number;
599
+ let rfc_33: any;
602
600
  export { rfc_33 as rfc };
603
- let origin_33: string;
601
+ let origin_33: any;
604
602
  export { origin_33 as origin };
605
- let impacts_33: string;
603
+ let impacts_33: any;
606
604
  export { impacts_33 as impacts };
607
605
  }
608
- export namespace BA {
606
+ }
607
+ export namespace HEAVY_METALS {
608
+ export namespace AS {
609
609
  let id_34: string;
610
610
  export { id_34 as id };
611
611
  let label_34: string;
@@ -616,14 +616,14 @@ export namespace HEAVY_METALS {
616
616
  export { unit_34 as unit };
617
617
  let type_34: string;
618
618
  export { type_34 as type };
619
- let rfc_34: any;
619
+ let rfc_34: number;
620
620
  export { rfc_34 as rfc };
621
621
  let origin_34: string;
622
622
  export { origin_34 as origin };
623
623
  let impacts_34: string;
624
624
  export { impacts_34 as impacts };
625
625
  }
626
- export namespace C6H6 {
626
+ export namespace BA {
627
627
  let id_35: string;
628
628
  export { id_35 as id };
629
629
  let label_35: string;
@@ -634,14 +634,14 @@ export namespace HEAVY_METALS {
634
634
  export { unit_35 as unit };
635
635
  let type_35: string;
636
636
  export { type_35 as type };
637
- let rfc_35: number;
637
+ let rfc_35: any;
638
638
  export { rfc_35 as rfc };
639
639
  let origin_35: string;
640
640
  export { origin_35 as origin };
641
641
  let impacts_35: string;
642
642
  export { impacts_35 as impacts };
643
643
  }
644
- export namespace BE {
644
+ export namespace C6H6 {
645
645
  let id_36: string;
646
646
  export { id_36 as id };
647
647
  let label_36: string;
@@ -659,7 +659,7 @@ export namespace HEAVY_METALS {
659
659
  let impacts_36: string;
660
660
  export { impacts_36 as impacts };
661
661
  }
662
- export namespace CD {
662
+ export namespace BE {
663
663
  let id_37: string;
664
664
  export { id_37 as id };
665
665
  let label_37: string;
@@ -677,7 +677,7 @@ export namespace HEAVY_METALS {
677
677
  let impacts_37: string;
678
678
  export { impacts_37 as impacts };
679
679
  }
680
- export namespace CR {
680
+ export namespace CD {
681
681
  let id_38: string;
682
682
  export { id_38 as id };
683
683
  let label_38: string;
@@ -695,7 +695,7 @@ export namespace HEAVY_METALS {
695
695
  let impacts_38: string;
696
696
  export { impacts_38 as impacts };
697
697
  }
698
- export namespace CO_1 {
698
+ export namespace CR {
699
699
  let id_39: string;
700
700
  export { id_39 as id };
701
701
  let label_39: string;
@@ -706,15 +706,14 @@ export namespace HEAVY_METALS {
706
706
  export { unit_39 as unit };
707
707
  let type_39: string;
708
708
  export { type_39 as type };
709
- let rfc_39: any;
709
+ let rfc_39: number;
710
710
  export { rfc_39 as rfc };
711
711
  let origin_39: string;
712
712
  export { origin_39 as origin };
713
713
  let impacts_39: string;
714
714
  export { impacts_39 as impacts };
715
715
  }
716
- export { CO_1 as CO };
717
- export namespace CU {
716
+ export namespace CO_1 {
718
717
  let id_40: string;
719
718
  export { id_40 as id };
720
719
  let label_40: string;
@@ -732,7 +731,8 @@ export namespace HEAVY_METALS {
732
731
  let impacts_40: string;
733
732
  export { impacts_40 as impacts };
734
733
  }
735
- export namespace FE {
734
+ export { CO_1 as CO };
735
+ export namespace CU {
736
736
  let id_41: string;
737
737
  export { id_41 as id };
738
738
  let label_41: string;
@@ -750,7 +750,7 @@ export namespace HEAVY_METALS {
750
750
  let impacts_41: string;
751
751
  export { impacts_41 as impacts };
752
752
  }
753
- export namespace PB {
753
+ export namespace FE {
754
754
  let id_42: string;
755
755
  export { id_42 as id };
756
756
  let label_42: string;
@@ -761,14 +761,14 @@ export namespace HEAVY_METALS {
761
761
  export { unit_42 as unit };
762
762
  let type_42: string;
763
763
  export { type_42 as type };
764
- let rfc_42: number;
764
+ let rfc_42: any;
765
765
  export { rfc_42 as rfc };
766
766
  let origin_42: string;
767
767
  export { origin_42 as origin };
768
768
  let impacts_42: string;
769
769
  export { impacts_42 as impacts };
770
770
  }
771
- export namespace MN {
771
+ export namespace PB {
772
772
  let id_43: string;
773
773
  export { id_43 as id };
774
774
  let label_43: string;
@@ -786,7 +786,7 @@ export namespace HEAVY_METALS {
786
786
  let impacts_43: string;
787
787
  export { impacts_43 as impacts };
788
788
  }
789
- export namespace NI {
789
+ export namespace MN {
790
790
  let id_44: string;
791
791
  export { id_44 as id };
792
792
  let label_44: string;
@@ -797,14 +797,14 @@ export namespace HEAVY_METALS {
797
797
  export { unit_44 as unit };
798
798
  let type_44: string;
799
799
  export { type_44 as type };
800
- let rfc_44: any;
800
+ let rfc_44: number;
801
801
  export { rfc_44 as rfc };
802
802
  let origin_44: string;
803
803
  export { origin_44 as origin };
804
804
  let impacts_44: string;
805
805
  export { impacts_44 as impacts };
806
806
  }
807
- export namespace SE {
807
+ export namespace NI {
808
808
  let id_45: string;
809
809
  export { id_45 as id };
810
810
  let label_45: string;
@@ -822,7 +822,7 @@ export namespace HEAVY_METALS {
822
822
  let impacts_45: string;
823
823
  export { impacts_45 as impacts };
824
824
  }
825
- export namespace ZN {
825
+ export namespace SE {
826
826
  let id_46: string;
827
827
  export { id_46 as id };
828
828
  let label_46: string;
@@ -840,5 +840,23 @@ export namespace HEAVY_METALS {
840
840
  let impacts_46: string;
841
841
  export { impacts_46 as impacts };
842
842
  }
843
+ export namespace ZN {
844
+ let id_47: string;
845
+ export { id_47 as id };
846
+ let label_47: string;
847
+ export { label_47 as label };
848
+ let name_47: string;
849
+ export { name_47 as name };
850
+ let unit_47: string;
851
+ export { unit_47 as unit };
852
+ let type_47: string;
853
+ export { type_47 as type };
854
+ let rfc_47: any;
855
+ export { rfc_47 as rfc };
856
+ let origin_47: string;
857
+ export { origin_47 as origin };
858
+ let impacts_47: string;
859
+ export { impacts_47 as impacts };
860
+ }
843
861
  }
844
862
  //# sourceMappingURL=pollutants.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@justair/justair-library",
3
- "version": "7.9.0",
3
+ "version": "7.10.0-alpha.1a4bd33",
4
4
  "description": "JustAir Internal Library",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -11,8 +11,8 @@ export const PARAMETERS = {
11
11
  unit: "ppm",
12
12
  type: "Gas",
13
13
  rfc: null,
14
- origin: null,
15
- impacts: null,
14
+ origin: "Made when fuel burns without enough oxygen. Comes mostly from car exhaust outdoors, and from heaters, furnaces, and gas stoves indoors. Has no color or smell.",
15
+ impacts: "Makes it harder for blood to carry oxygen to the heart and brain. High indoor levels can cause confusion, passing out, or death.",
16
16
  },
17
17
  NO2: {
18
18
  id: "NO2",
@@ -21,7 +21,7 @@ export const PARAMETERS = {
21
21
  unit: "ppb",
22
22
  type: "Gas",
23
23
  rfc: null,
24
- origin: "Harmful gas from cars, power plants, and industrial equipment that contributes to smog and acid rain.",
24
+ origin: "Harmful gas from cars, power plants, and industrial equipment that contributes to smog and acid rain. Smells sharp and bitter.",
25
25
  impacts: "Can cause respiratory problems, worsen asthma and bronchitis, and increase heart-related health risks.",
26
26
  },
27
27
  O3: {
@@ -31,7 +31,7 @@ export const PARAMETERS = {
31
31
  unit: "ppm",
32
32
  type: "Gas",
33
33
  rfc: null,
34
- origin: "Harmful smog component formed when pollution reacts with sunlight, especially problematic on hot, sunny days.",
34
+ origin: "Harmful smog component formed when pollution reacts with sunlight, especially problematic on hot, sunny days. Smell described as fresh or clean.",
35
35
  impacts: "Can irritate lungs, intensify asthma and chronic bronchitis, and increase heart problems and mortality rates.",
36
36
  },
37
37
  PM2_5: {
@@ -61,8 +61,8 @@ export const PARAMETERS = {
61
61
  unit: "ppb",
62
62
  type: "Gas",
63
63
  rfc: null,
64
- origin: null,
65
- impacts: null,
64
+ origin: "Comes mostly from burning fossil fuels at power plants and factories. Smaller amounts come from metal processing and volcanoes. Smells sharp or pungent.",
65
+ impacts: "Can make it hard to breathe and irritate the lungs, especially for people with asthma. Also helps form fine particle pollution and acid rain.",
66
66
  },
67
67
  BC: {
68
68
  id: "BC",
@@ -71,8 +71,8 @@ export const PARAMETERS = {
71
71
  unit: "ng/m³",
72
72
  type: "Particulate Matter",
73
73
  rfc: null,
74
- origin: null,
75
- impacts: null,
74
+ origin: "Black, sooty particles from burning fuel. Comes mostly from diesel and gas engines, coal power plants, and cookstoves that burn wood or coal. A major part of fine particle matter (PM₂.₅) in the air.",
75
+ impacts: "Can cause respiratory and cardiovascular disease, including asthma, heart attacks, and lung cancer.",
76
76
  },
77
77
  BRC: {
78
78
  id: "BRC",
@@ -81,8 +81,8 @@ export const PARAMETERS = {
81
81
  unit: "ng/m³",
82
82
  type: "Particulate Matter",
83
83
  rfc: null,
84
- origin: null,
85
- impacts: null,
84
+ origin: "Organic particles released by burning wood and plants, especially in wildfire smoke and wood fires at home.",
85
+ impacts: "Can cause respiratory and cardiovascular illnesses, exacerbate asthma, and increase mortality risk with prolonged exposure.",
86
86
  },
87
87
  CO2: {
88
88
  id: "CO2",
@@ -91,28 +91,28 @@ export const PARAMETERS = {
91
91
  unit: "ppm",
92
92
  type: "Gas",
93
93
  rfc: null,
94
- origin: null,
95
- impacts: null,
94
+ origin: "Comes mostly from burning fossil fuels, plus burning waste and plant material, and industrial processes like making cement. Has no color or smell.",
95
+ impacts: "Can cause drowsiness and reduced concentration, worsen headaches and fatigue, and increase breathing and heart-related health risks.",
96
96
  },
97
97
  H2S: {
98
98
  id: "H2S",
99
99
  label: "H₂S",
100
- name: "Hydrogen Sulfide (H₂S)",
100
+ name: "Hydrogen sulfide (H₂S)",
101
101
  unit: "ppm",
102
- type: "Volatile Organic Compound",
102
+ type: "Gas",
103
103
  rfc: null,
104
- origin: null,
105
- impacts: null,
104
+ origin: "Found naturally in crude oil, natural gas, and volcanic gas. Also released by oil refineries, wastewater plants, farms with livestock, and landfills. Smells of rotten-eggs.",
105
+ impacts: "Low levels over a long time can irritate eyes and airways and cause headaches or nausea. Very high levels can cause someone to pass out or die.",
106
106
  },
107
107
  CH4: {
108
108
  id: "CH4",
109
109
  label: "CH₄",
110
110
  name: "Methane (CH₄)",
111
111
  unit: "ppm",
112
- type: "Volatile Organic Compound",
112
+ type: "Gas",
113
113
  rfc: null,
114
- origin: null,
115
- impacts: null,
114
+ origin: "Comes from landfills, oil and gas drilling, livestock and farming, coal mines, and wastewater treatment. Has no natural smell, sometimes it is added to detect leaks.",
115
+ impacts: "Not harmful to breathe at normal outdoor levels. In a closed space, high levels can push out oxygen and cause dizziness or passing out. It also heats the planet, since it traps heat in the air like other gases that cause climate change.",
116
116
  },
117
117
  NO: {
118
118
  id: "NO",
@@ -121,8 +121,18 @@ export const PARAMETERS = {
121
121
  unit: "ppb",
122
122
  type: "Gas",
123
123
  rfc: null,
124
- origin: null,
125
- impacts: null,
124
+ origin: "Made when fuel burns in car engines, power plants, and factories. Turns into NO₂ once it's in the air. Smells sharp and sweet.",
125
+ impacts: "Can irritate the eyes, nose, throat, and lungs at low levels, and cause serious airway damage, fluid buildup in the lungs, and death at high levels.",
126
+ },
127
+ RN: {
128
+ id: "RN",
129
+ label: "Radon",
130
+ name: "Radon (Rn)",
131
+ unit: "pCi/L",
132
+ type: "Gas",
133
+ rfc: 4, // EPA indoor action level (pCi/L), not an IRIS inhalation RfC like the HEAVY_METALS values
134
+ origin: "A radioactive gas that comes naturally from uranium breaking down in rock, soil, and water. It can leak into buildings through cracks in the foundation. Has no color or smell.",
135
+ impacts: "The second leading cause of lung cancer in the US, after smoking. Linked to about 21,000 lung cancer deaths a year.",
126
136
  },
127
137
  PM1: {
128
138
  id: "PM1",
@@ -131,8 +141,8 @@ export const PARAMETERS = {
131
141
  unit: "µg/m³",
132
142
  type: "Particulate Matter",
133
143
  rfc: null,
134
- origin: null,
135
- impacts: null,
144
+ origin: "Very fine particles that can penetrate deep into lungs and bloodstream, originating from vehicle emissions, industrial processes, and wildfires.",
145
+ impacts: "Can cause respiratory and cardiovascular illnesses, exacerbate asthma, and increase mortality risk with prolonged exposure.",
136
146
  },
137
147
  UFP: {
138
148
  id: "UFP",
@@ -141,18 +151,18 @@ export const PARAMETERS = {
141
151
  unit: "pt/cm³",
142
152
  type: "Particulate Matter",
143
153
  rfc: null,
144
- origin: null,
145
- impacts: null,
154
+ origin: "Very tiny particles from burning fuel, especially from cars, trucks, factories, power plants, and home heating.",
155
+ impacts: "Can raise the risk of lung and heart disease.",
146
156
  },
147
157
  VOC: {
148
158
  id: "VOC",
149
159
  label: "VOC",
150
- name: "Volatile Organic Compounds (VOC)",
160
+ name: "Volatile organic compounds (VOC)",
151
161
  unit: "ppm",
152
162
  type: "Volatile Organic Compound",
153
163
  rfc: null,
154
- origin: null,
155
- impacts: null,
164
+ origin: "Released when making or using everyday products like paint, cleaning supplies, solvents, and fuel.",
165
+ impacts: "Can harm health when breathed in indoors. Outdoors, reacts with sunlight to form smog. Some VOCs can cause cancer.",
156
166
  },
157
167
  // ---- T/RH/DP and their _AMB pairs (JA-3058). Does not apply to WD/WS below. ----
158
168
  // Bare ids (T/RH/DP) are enclosure-internal, for corrections and fog detection only. The _AMB
@@ -1,11 +1,17 @@
1
1
  import { PARAMETERS, HEAVY_METALS } from "../pollutants.js";
2
2
 
3
3
  const REQUIRED_FIELDS = ["id", "label", "name", "unit", "type"];
4
+
5
+ // The one type that is not a pollutant. Stated, not derived: deriving the exemption from the
6
+ // entries would make the origin/impacts test assert nothing, since a new entry shipped blank
7
+ // would exempt itself.
8
+ const WEATHER_TYPE = "Weather";
9
+
4
10
  const VALID_TYPES = [
5
11
  "Particulate Matter",
6
12
  "Gas",
7
13
  "Volatile Organic Compound",
8
- "Weather",
14
+ WEATHER_TYPE,
9
15
  "Heavy Metal",
10
16
  "Heavy Metal - Essential Nutrient",
11
17
  ];
@@ -67,8 +73,25 @@ function sharedAssertions(constants) {
67
73
  });
68
74
  }
69
75
 
76
+ // JA-3460: every pollutant needs Origin and Impacts copy. Weather parameters are exempt: they
77
+ // are not pollutants, and the Centralized Constants doc leaves both columns blank for them.
78
+ function hasOriginAndImpacts(constants) {
79
+ const pollutants = Object.entries(constants).filter(([, p]) => p.type !== WEATHER_TYPE);
80
+
81
+ test.each(pollutants)("%s: origin is populated", (key, pollutant) => {
82
+ expect(typeof pollutant.origin).toBe("string");
83
+ expect(pollutant.origin.trim().length).toBeGreaterThan(0);
84
+ });
85
+
86
+ test.each(pollutants)("%s: impacts is populated", (key, pollutant) => {
87
+ expect(typeof pollutant.impacts).toBe("string");
88
+ expect(pollutant.impacts.trim().length).toBeGreaterThan(0);
89
+ });
90
+ }
91
+
70
92
  describe("PARAMETERS", () => {
71
93
  sharedAssertions(PARAMETERS);
94
+ hasOriginAndImpacts(PARAMETERS);
72
95
 
73
96
  // JA-3060: Processing-Engine hardcodes these ids, so lock the ambient/internal pairing.
74
97
  const ambientKeys = Object.keys(PARAMETERS).filter((key) => key.endsWith("_AMB"));
@@ -90,7 +113,7 @@ describe("PARAMETERS", () => {
90
113
  test("is declared as a Weather parameter in °F", () => {
91
114
  expect(PARAMETERS.HI).toBeDefined();
92
115
  expect(PARAMETERS.HI.unit).toBe("°F");
93
- expect(PARAMETERS.HI.type).toBe("Weather");
116
+ expect(PARAMETERS.HI.type).toBe(WEATHER_TYPE);
94
117
  });
95
118
 
96
119
  test("shares T_AMB's unit, since it is an apparent temperature", () => {
@@ -105,6 +128,7 @@ describe("PARAMETERS", () => {
105
128
 
106
129
  describe("HEAVY_METALS", () => {
107
130
  sharedAssertions(HEAVY_METALS);
131
+ hasOriginAndImpacts(HEAVY_METALS);
108
132
 
109
133
  test("PB.rfc is exactly 0, not null", () => {
110
134
  expect(HEAVY_METALS.PB.rfc).toBe(0);