Skip to content
Advertisement

Python code to send data from I2C sensor to a local SQL database

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!')
User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement