Skip to content

Commit 96b3ab6

Browse files
author
Eric
committed
absolute pressure correction
1 parent 1ea7194 commit 96b3ab6

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,14 @@ into
4242
sensor:
4343
- platform: airthings_wave
4444
scan_interval: 120
45+
elevation: 998
4546
```
4647
### Optional Configuration Variables
4748
49+
**elevation**
50+
51+
(float)(Optional) The current elevation. Used to correct the pressure sensor to sea level conditions.
52+
4853
**mac**
4954
5055
(string)(Optional) The airthings_wave mac address, if not provided will scan for all airthings devices at startup

custom_components/airthings_wave/sensor.py

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@
1414
"""
1515
import logging
1616
from datetime import timedelta
17+
from math import exp
1718

1819
from .airthings import AirthingsWaveDetect
1920

2021
import homeassistant.helpers.config_validation as cv
2122
import voluptuous as vol
2223
from homeassistant.components.sensor import PLATFORM_SCHEMA
2324
from homeassistant.const import (ATTR_DEVICE_CLASS, ATTR_ICON, CONF_MAC,
24-
CONF_NAME, CONF_SCAN_INTERVAL,
25+
CONF_NAME, CONF_SCAN_INTERVAL, CONF_ELEVATION,
2526
CONF_UNIT_SYSTEM, CONF_UNIT_SYSTEM_IMPERIAL,
2627
CONF_UNIT_SYSTEM_METRIC, TEMPERATURE,
2728
TEMP_CELSIUS, DEVICE_CLASS_HUMIDITY,
@@ -81,6 +82,7 @@
8182
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
8283
vol.Optional(CONF_MAC, default=''): cv.string,
8384
vol.Optional(CONF_SCAN_INTERVAL, default=SCAN_INTERVAL): cv.time_period,
85+
vol.Optional(CONF_ELEVATION, default=0): float
8486
})
8587

8688

@@ -91,14 +93,41 @@ def __init__(self, unit, unit_scale, device_class, icon):
9193
self.device_class = device_class
9294
self.icon = icon
9395

96+
def set_parameters(self, parameters):
97+
self.parameters = parameters
98+
9499
def set_unit_scale(self, unit, unit_scale):
95100
self.unit = unit
96101
self.unit_scale = unit_scale
97102

103+
def transform(self, value):
104+
if self.unit_scale == None:
105+
return value
106+
return round(float(value * self.unit_scale), 2)
107+
98108
def get_extra_attributes(self, data):
99109
return {}
100110

101111

112+
class PressureSensor(Sensor):
113+
def __init__(self, *args, **kwargs):
114+
super().__init__(*args, **kwargs)
115+
self.offset = 0
116+
117+
def set_parameters(self, parameters):
118+
super().set_parameters(parameters)
119+
p0 = 101325 # Pa
120+
g = 9.80665 # m/s^2
121+
M = 0.02896968 # kg/mol
122+
T0 = 288.16 # K
123+
R0 = 8.314462618 # J/(mol K)
124+
h = self.parameters['elevation'] # m
125+
self.offset = (p0 - (p0 * exp(-g * h * M / (T0 * R0))))/100.0 # mbar
126+
127+
def transform(self, value):
128+
value = super().transform(value) + self.offset
129+
130+
102131
class RadonSensor(Sensor):
103132
def get_extra_attributes(self, data):
104133
if VERY_LOW[0] <= float(data) <= VERY_LOW[1]:
@@ -115,7 +144,7 @@ def get_extra_attributes(self, data):
115144
DEVICE_SENSOR_SPECIFICS = { "date_time":Sensor('time', None, None, None),
116145
"temperature":Sensor(TEMP_CELSIUS, None, DEVICE_CLASS_TEMPERATURE, None),
117146
"humidity": Sensor(PERCENT, None, DEVICE_CLASS_HUMIDITY, None),
118-
"rel_atm_pressure": Sensor(ATM_METRIC_UNITS, None, DEVICE_CLASS_PRESSURE, None),
147+
"rel_atm_pressure": PressureSensor(ATM_METRIC_UNITS, None, DEVICE_CLASS_PRESSURE, None),
119148
"co2": Sensor(CO2_METRIC_UNITS, None, DEVICE_CLASS_CO2, 'mdi:molecule-co2'),
120149
"voc": Sensor(VOC_METRIC_UNITS, None, DEVICE_CLASS_VOC, 'mdi:cloud'),
121150
"illuminance": Sensor(ILLUMINANCE_LUX, None, DEVICE_CLASS_ILLUMINANCE, None),
@@ -131,10 +160,15 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
131160
mac = config.get(CONF_MAC)
132161
mac = None if mac == '' else mac
133162

163+
elevation = config.get(CONF_ELEVATION)
164+
DEVICE_SENSOR_SPECIFICS["rel_atm_pressure"].set_parameters(
165+
{'elevation': elevation})
166+
134167
if not hass.config.units.is_metric:
135168
DEVICE_SENSOR_SPECIFICS["radon_1day_avg"].set_unit_scale(VOLUME_PICOCURIE, BQ_TO_PCI_MULTIPLIER)
136169
DEVICE_SENSOR_SPECIFICS["radon_longterm_avg"].set_unit_scale(VOLUME_PICOCURIE, BQ_TO_PCI_MULTIPLIER)
137170

171+
138172
_LOGGER.debug("Searching for Airthings sensors...")
139173
airthingsdetect = AirthingsWaveDetect(scan_interval, mac)
140174
try:
@@ -231,8 +265,5 @@ def update(self):
231265
"""
232266
self.device.get_sensor_data()
233267
value = self.device.sensordata[self._mac][self._sensor_name]
234-
if self._sensor_specifics.unit_scale is None:
235-
self._state = value
236-
else:
237-
self._state = round(float(value * self._sensor_specifics.unit_scale), 2)
268+
self._state = self._sensor_specifics.transform(value)
238269
_LOGGER.debug("State {} {}".format(self._name, self._state))

0 commit comments

Comments
 (0)