I am working on a system of I2C sensors connected together and communicating to a raspberry pi4B. With the code below I am able to save the measurements in a excel file. I would like to store them in a table inside a sql database that I have created locally on my laptop. What should I change in this code?
import time import datetime import bme680 from as7262 import AS7262 from datetime import date from openpyxl import load_workbook as7262 = AS7262() as7262.set_gain(1) # 1, 3.7, 16, 64 as7262.set_integration_time(10) #1 to 255 x 2.8ms exposure #mode 0 - bank 1 only continuous, mode 1 - bank 2 only continuous, mode 2 - both banks continuous, mode 3 - both banks single read as7262.set_measurement_mode(2) #2 all colours continuous as7262.set_illumination_led_current(12.5) #12.5mA 25mA 50mA 100mA as7262.set_illumination_led(0) sensor_bme680 = bme680.BME680() # Load the workbook and select the sheet wb = load_workbook('/mypath/data.xlsx') sheet = wb['data_log'] try: while True: values = as7262.get_calibrated_values() #get values from scan spec = [float(i) for i in list(values)] #convert results from string to float temperature = round(sensor_bme680.data.temperature, 2) pressure = round (sensor_bme680.data.pressure, 2) humidity = round(sensor_bme680.data.humidity, 2) gas_resistance = round(sensor_bme680.data.gas_resistance, 2) red_light = round(spec[0], 4) orange_light = round(spec[1], 4) yellow_light = round(spec[2], 4) green_light = round(spec[3], 4) blue_light = round(spec[4], 4) violet_light = round(spec[5], 4) today = date.today() now = datetime.datetime.now().time() # Inform the user! print('Adding this data to the spreadsheet:') print(today) print(now) print('{}*C {}hPa {}% {}res microM microM microM microM microM microM'.format(temperature, pressure, humidity, gas_resistance, red_light,orange_light,yellow_light,green_light,blue_light,violet_light)) # Append data to the spreadsheet row = (today, now, temperature, pressure, humidity, gas_resistance, red_light,orange_light,yellow_light,green_light,blue_light,violet_light) sheet.append(row) #Save the workbook wb.save('/home/pi/Documents/sensors/data.xlsx') # Wait for 10 minutes seconds (600 seconds) time.sleep(10) finally: # Make sure the workbook is saved! wb.save('/mypath/data.xlsx') print('Goodbye!')
Advertisement
Answer
I personally like to work with sqlalchemy in most cases when interacting with databases from python. it represents table-definitions as classes and for adding a row to your db, you only have to create an object of your class and add it via sqlalchemy commands to database. Therefore, you have to define your database in python, so that its structure is known to your code.
for an example, I assume we only have one table in your database, having the same columns as your excel sheet. the definition of your table and creation of your db (a local sqlite db created in the same folder this script is in) would look like this as a script (lets call this script db.py):
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Float, DateTime, Date from sqlalchemy import create_engine engine = create_engine('sqlite:///foo.db') Base = declarative_base() class Example(Base): id = Column(Integer, primary_key=True) temperature = Column(Float) humidity = Column(Float) . . # your other variables . . today = Column(Date) now = Column(DateTime) if __name__ == '__main__': Base.metadata.create_all(engine)
after running the above script, in your script (the one you posted) you have to import your Example
class and replace the line where you add a row to excel with one where you add an Example
object (after creating it) to your database.
import time import datetime import bme680 from as7262 import AS7262 from datetime import date from openpyxl import load_workbook from db import Example from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # create a session for writing to your db engine = create_engine('sqlite:///foo.db') Session = sessionmaker(bind=engine) session = Session() as7262 = AS7262() as7262.set_gain(1) # 1, 3.7, 16, 64 as7262.set_integration_time(10) #1 to 255 x 2.8ms exposure #mode 0 - bank 1 only continuous, mode 1 - bank 2 only continuous, mode 2 - both banks continuous, mode 3 - both banks single read as7262.set_measurement_mode(2) #2 all colours continuous as7262.set_illumination_led_current(12.5) #12.5mA 25mA 50mA 100mA as7262.set_illumination_led(0) sensor_bme680 = bme680.BME680() try: while True: example_object = Example( temperature = round(sensor_bme680.data.temperature, 2), humidity = round(sensor_bme680.data.humidity, 2), . . # you other attributes . . today = date.today(), now = datetime.datetime.now().time()) # Inform the user! print('Adding this data to the spreadsheet:') print(today) print(now) print('{}*C {}hPa {}% {}res microM microM microM microM microM microM'.format(example_object.temperature, example_object.pressure, example_object.humidity, example_object.gas_resistance, example_object.red_light,example_object.orange_light,example_object.yellow_light,example_object.green_light,example_object.blue_light,example_object.violet_light)) # Add object to database session.add(example_object) session.commit() finally: print('Goodbye!')