From c5d0d37d2603c49322a7c484c6ed1807666b3279 Mon Sep 17 00:00:00 2001 From: Kristian Wiklund Date: Mon, 23 Dec 2024 22:01:47 +0100 Subject: [PATCH 1/6] Support for DPS310 sensor (pressure/temperature) --- openplotterI2c/i2cPostInstall.py | 2 +- openplotterI2c/openplotterI2c.py | 2 +- openplotterI2c/openplotterI2cRead.py | 42 +++++++++++++++++++++++++++- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/openplotterI2c/i2cPostInstall.py b/openplotterI2c/i2cPostInstall.py index 71f52cb..1fdbe57 100644 --- a/openplotterI2c/i2cPostInstall.py +++ b/openplotterI2c/i2cPostInstall.py @@ -28,7 +28,7 @@ def main(): print(_('Installing python packages...')) try: - subprocess.call(['pip3', 'install', 'adafruit-blinka','adafruit-circuitpython-tca9548a','adafruit-circuitpython-bme680','adafruit-circuitpython-ads1x15', 'adafruit-circuitpython-htu21d', 'adafruit-circuitpython-bmp280', 'adafruit-circuitpython-bme280', 'adafruit-circuitpython-bmp3xx', 'adafruit-circuitpython-ina260', 'adafruit-circuitpython-ina219', 'adafruit-circuitpython-lps35hw', 'adafruit-circuitpython-bh1750','adafruit-circuitpython-ahtx0', '-U', '--break-system-packages']) + subprocess.call(['pip3', 'install', 'adafruit-blinka','adafruit-circuitpython-tca9548a','adafruit-circuitpython-bme680','adafruit-circuitpython-ads1x15', 'adafruit-circuitpython-htu21d', 'adafruit-circuitpython-bmp280', 'adafruit-circuitpython-bme280', 'adafruit-circuitpython-bmp3xx', 'adafruit-circuitpython-ina260', 'adafruit-circuitpython-ina219', 'adafruit-circuitpython-lps35hw', 'adafruit-circuitpython-bh1750','adafruit-circuitpython-ahtx0', 'adafruit-circuitpython-dps310' '-U', '--break-system-packages']) print(_('DONE')) except Exception as e: print(_('FAILED: ')+str(e)) diff --git a/openplotterI2c/openplotterI2c.py b/openplotterI2c/openplotterI2c.py index e247917..ce0f87a 100644 --- a/openplotterI2c/openplotterI2c.py +++ b/openplotterI2c/openplotterI2c.py @@ -51,7 +51,7 @@ def __init__(self): self.i2c_sensors_def['HTU21D'] = {'magnitudes': [_('humidity'),_('temperature')], 'SKkeys': ['environment.inside.relativeHumidity',''], 'multiplexing':True} self.i2c_sensors_def['LPS3X'] = {'magnitudes': [_('pressure'),_('temperature')], 'SKkeys': ['environment.outside.pressure',''], 'multiplexing':True} self.i2c_sensors_def['MS5607-02BA03'] = {'magnitudes': [_('pressure'),_('temperature')], 'SKkeys': ['environment.outside.pressure',''], 'multiplexing':False} - + wx.Frame.__init__(self, None, title='I2C '+version, size=(800,444)) self.SetFont(wx.Font(10, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) icon = wx.Icon(self.currentdir+"/data/openplotter-i2c.png", wx.BITMAP_TYPE_PNG) diff --git a/openplotterI2c/openplotterI2cRead.py b/openplotterI2c/openplotterI2cRead.py index 258bdc7..cb74d3d 100644 --- a/openplotterI2c/openplotterI2cRead.py +++ b/openplotterI2c/openplotterI2cRead.py @@ -286,6 +286,17 @@ def main(): if i2c_sensors[i]['address']: instances.append({'name':i,'type':'ATHX0','tick':[now,now],'sensor':i2c_sensors[i],'object':adafruit_ahtx0.AHTx0(muxInstances[i2c_sensors[i]['address']][i2c_sensors[i]['channel']-1])}) + elif i2c_sensors[i]['type'] == 'DPS310': + import adafruit_dps310 + if i2c_sensors[i]['channel'] == 0: + if i2c_sensors[i]['address']: + instances.append({'name':i,'type':'DPS310','tick':[now,now],'sensor':i2c_sensors[i],'object':adafruit_dps310.basic.DPS310(i2c, address=int(i2c_sensors[i]['address'], 16))}) + else: + if i2c_sensors[i]['address']: + instances.append({'name':i,'type':'DPS310','tick':[now,now],'sensor':i2c_sensors[i],'object':adafruit_dps310.basic.DPS310(muxInstances[i2c_sensors[i]['address']][i2c_sensors[i]['channel']-1])}) + + + except Exception as e: error = 'Error processing '+i+': '+str(e) i2c_sensors[i]['error'] = error @@ -733,6 +744,35 @@ def main(): Erg = getPaths(Erg,humidityValue,humidityValue2,humidityKey,humidityOffset,humidityFactor,humidityRaw) instances[index]['tick'][1] = time.time() + elif i['type'] == 'DPS310': + pressureKey = i['sensor']['data'][0]['SKkey'] + temperatureKey = i['sensor']['data'][1]['SKkey'] + + if temperatureKey: + temperatureRaw = i['object'].temperature + temperatureRate = i['sensor']['data'][1]['rate'] + temperatureOffset = i['sensor']['data'][1]['offset'] + temperatureFactor = i['sensor']['data'][1]['factor'] + tick0 = time.time() + if tick0 - i['tick'][0] > temperatureRate: + temperatureValue = temperatureRaw + try: temperatureValue2 = float(temperatureValue)+273.15 + except: temperatureValue2 = '' + Erg = getPaths(Erg,temperatureValue,temperatureValue2,temperatureKey,temperatureOffset,temperatureFactor,temperatureRaw) + instances[index]['tick'][1] = time.time() + if pressureKey: + pressureRaw = i['object'].pressure + pressureRate = i['sensor']['data'][0]['rate'] + pressureOffset = i['sensor']['data'][0]['offset'] + pressureFactor = i['sensor']['data'][0]['factor'] + tick0 = time.time() + if tick0 - i['tick'][1] > pressureRate: + pressureValue = pressureRaw / 100000 + pressureValue2 = pressureValue + Erg = getPaths(Erg,pressureValue,pressureValue2,pressureKey,pressureOffset,pressureFactor,pressureRaw) + instances[index]['tick'][0] = time.time() + + except Exception as e: if debug: print('Error reading '+i['name']+': '+str(e)) @@ -751,4 +791,4 @@ def main(): if __name__ == '__main__': main() - \ No newline at end of file + From 9831313556de6444174badc03c88c5acc5f0f4eb Mon Sep 17 00:00:00 2001 From: Kristian Wiklund Date: Mon, 23 Dec 2024 22:04:43 +0100 Subject: [PATCH 2/6] dps310 support (pressure/temperature) --- openplotterI2c/i2cPostInstall.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openplotterI2c/i2cPostInstall.py b/openplotterI2c/i2cPostInstall.py index 1fdbe57..9c9b40f 100644 --- a/openplotterI2c/i2cPostInstall.py +++ b/openplotterI2c/i2cPostInstall.py @@ -28,7 +28,7 @@ def main(): print(_('Installing python packages...')) try: - subprocess.call(['pip3', 'install', 'adafruit-blinka','adafruit-circuitpython-tca9548a','adafruit-circuitpython-bme680','adafruit-circuitpython-ads1x15', 'adafruit-circuitpython-htu21d', 'adafruit-circuitpython-bmp280', 'adafruit-circuitpython-bme280', 'adafruit-circuitpython-bmp3xx', 'adafruit-circuitpython-ina260', 'adafruit-circuitpython-ina219', 'adafruit-circuitpython-lps35hw', 'adafruit-circuitpython-bh1750','adafruit-circuitpython-ahtx0', 'adafruit-circuitpython-dps310' '-U', '--break-system-packages']) + subprocess.call(['pip3', 'install', 'adafruit-blinka','adafruit-circuitpython-tca9548a','adafruit-circuitpython-bme680','adafruit-circuitpython-ads1x15', 'adafruit-circuitpython-htu21d', 'adafruit-circuitpython-bmp280', 'adafruit-circuitpython-bme280', 'adafruit-circuitpython-bmp3xx', 'adafruit-circuitpython-ina260', 'adafruit-circuitpython-ina219', 'adafruit-circuitpython-lps35hw', 'adafruit-circuitpython-bh1750','adafruit-circuitpython-ahtx0', 'adafruit-circuitpython-dps310', '-U', '--break-system-packages']) print(_('DONE')) except Exception as e: print(_('FAILED: ')+str(e)) From 8e84ecb01f22eb30910654198ee9281c01efd3c3 Mon Sep 17 00:00:00 2001 From: Kristian Wiklund Date: Mon, 23 Dec 2024 22:40:22 +0100 Subject: [PATCH 3/6] dps310 support --- openplotterI2c/openplotterI2c.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openplotterI2c/openplotterI2c.py b/openplotterI2c/openplotterI2c.py index ce0f87a..a515429 100644 --- a/openplotterI2c/openplotterI2c.py +++ b/openplotterI2c/openplotterI2c.py @@ -51,7 +51,7 @@ def __init__(self): self.i2c_sensors_def['HTU21D'] = {'magnitudes': [_('humidity'),_('temperature')], 'SKkeys': ['environment.inside.relativeHumidity',''], 'multiplexing':True} self.i2c_sensors_def['LPS3X'] = {'magnitudes': [_('pressure'),_('temperature')], 'SKkeys': ['environment.outside.pressure',''], 'multiplexing':True} self.i2c_sensors_def['MS5607-02BA03'] = {'magnitudes': [_('pressure'),_('temperature')], 'SKkeys': ['environment.outside.pressure',''], 'multiplexing':False} - + self.i2c_sensors_def['DPS310'] = {'magnitudes': [_('pressure'),_('temperature')], 'SKkeys': ['environment.outside.pressure',''], 'multiplexing':False} wx.Frame.__init__(self, None, title='I2C '+version, size=(800,444)) self.SetFont(wx.Font(10, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) icon = wx.Icon(self.currentdir+"/data/openplotter-i2c.png", wx.BITMAP_TYPE_PNG) From ea5236afddd9ea5b02c6d6ce7ad8e753ed78b795 Mon Sep 17 00:00:00 2001 From: Kristian Wiklund Date: Tue, 24 Dec 2024 15:22:55 +0100 Subject: [PATCH 4/6] dps310 support. --- openplotterI2c/openplotterI2cRead.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/openplotterI2c/openplotterI2cRead.py b/openplotterI2c/openplotterI2cRead.py index cb74d3d..ddec7a8 100644 --- a/openplotterI2c/openplotterI2cRead.py +++ b/openplotterI2c/openplotterI2cRead.py @@ -292,8 +292,10 @@ def main(): if i2c_sensors[i]['address']: instances.append({'name':i,'type':'DPS310','tick':[now,now],'sensor':i2c_sensors[i],'object':adafruit_dps310.basic.DPS310(i2c, address=int(i2c_sensors[i]['address'], 16))}) else: - if i2c_sensors[i]['address']: - instances.append({'name':i,'type':'DPS310','tick':[now,now],'sensor':i2c_sensors[i],'object':adafruit_dps310.basic.DPS310(muxInstances[i2c_sensors[i]['address']][i2c_sensors[i]['channel']-1])}) + pass + # unable to test this - mux mode should be disabled in the config + #if i2c_sensors[i]['address']: + #instances.append({'name':i,'type':'DPS310','tick':[now,now],'sensor':i2c_sensors[i],'object':adafruit_dps310.basic.DPS310(muxInstances[i2c_sensors[i]['address']][i2c_sensors[i]['channel']-1])}) @@ -750,6 +752,8 @@ def main(): if temperatureKey: temperatureRaw = i['object'].temperature + if debug: + print("DPS310 temperature:",temperatureRaw) temperatureRate = i['sensor']['data'][1]['rate'] temperatureOffset = i['sensor']['data'][1]['offset'] temperatureFactor = i['sensor']['data'][1]['factor'] @@ -762,6 +766,8 @@ def main(): instances[index]['tick'][1] = time.time() if pressureKey: pressureRaw = i['object'].pressure + if debug: + print("DPS310 pressure:",pressureRaw) pressureRate = i['sensor']['data'][0]['rate'] pressureOffset = i['sensor']['data'][0]['offset'] pressureFactor = i['sensor']['data'][0]['factor'] From cb84af73e2ff7cce2651b78bbaa77a28c24c33f5 Mon Sep 17 00:00:00 2001 From: Kristian Wiklund Date: Tue, 24 Dec 2024 15:58:48 +0100 Subject: [PATCH 5/6] DPS310 support (improved error message for no multiplexing) --- openplotterI2c/openplotterI2cRead.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/openplotterI2c/openplotterI2cRead.py b/openplotterI2c/openplotterI2cRead.py index ddec7a8..fa44ba5 100644 --- a/openplotterI2c/openplotterI2cRead.py +++ b/openplotterI2c/openplotterI2cRead.py @@ -78,7 +78,7 @@ def main(): conf2 = conf.Conf() platform2 = platform.Platform() if conf2.get('GENERAL', 'debug') == 'yes': debug = True - else: debug = False + else: debug = True try: i2c_sensors=eval(conf2.get('I2C', 'sensors')) except: i2c_sensors=[] instances = [] @@ -292,10 +292,9 @@ def main(): if i2c_sensors[i]['address']: instances.append({'name':i,'type':'DPS310','tick':[now,now],'sensor':i2c_sensors[i],'object':adafruit_dps310.basic.DPS310(i2c, address=int(i2c_sensors[i]['address'], 16))}) else: - pass - # unable to test this - mux mode should be disabled in the config - #if i2c_sensors[i]['address']: - #instances.append({'name':i,'type':'DPS310','tick':[now,now],'sensor':i2c_sensors[i],'object':adafruit_dps310.basic.DPS310(muxInstances[i2c_sensors[i]['address']][i2c_sensors[i]['channel']-1])}) + if debug: + print('Multiplexing not implemented for DPS310 sensors') + sys.stdout.flush() @@ -764,10 +763,11 @@ def main(): except: temperatureValue2 = '' Erg = getPaths(Erg,temperatureValue,temperatureValue2,temperatureKey,temperatureOffset,temperatureFactor,temperatureRaw) instances[index]['tick'][1] = time.time() + if pressureKey: pressureRaw = i['object'].pressure if debug: - print("DPS310 pressure:",pressureRaw) + print("DPS310 pressure:",pressureRaw,"signalk key:",pressureKey) pressureRate = i['sensor']['data'][0]['rate'] pressureOffset = i['sensor']['data'][0]['offset'] pressureFactor = i['sensor']['data'][0]['factor'] @@ -776,6 +776,7 @@ def main(): pressureValue = pressureRaw / 100000 pressureValue2 = pressureValue Erg = getPaths(Erg,pressureValue,pressureValue2,pressureKey,pressureOffset,pressureFactor,pressureRaw) + instances[index]['tick'][0] = time.time() From 2d6957b8b26087356fde6a9e87444ddc482c98cd Mon Sep 17 00:00:00 2001 From: Kristian Wiklund Date: Tue, 24 Dec 2024 16:09:06 +0100 Subject: [PATCH 6/6] dps310 support - fixed pressure reading unit --- openplotterI2c/openplotterI2cRead.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openplotterI2c/openplotterI2cRead.py b/openplotterI2c/openplotterI2cRead.py index fa44ba5..672e939 100644 --- a/openplotterI2c/openplotterI2cRead.py +++ b/openplotterI2c/openplotterI2cRead.py @@ -773,7 +773,7 @@ def main(): pressureFactor = i['sensor']['data'][0]['factor'] tick0 = time.time() if tick0 - i['tick'][1] > pressureRate: - pressureValue = pressureRaw / 100000 + pressureValue = pressureRaw * 100 pressureValue2 = pressureValue Erg = getPaths(Erg,pressureValue,pressureValue2,pressureKey,pressureOffset,pressureFactor,pressureRaw)