My app enables users to collects data from laboratory equipment (analog, digital) and arranges the data collected per day/per experiment. Besides the output data from the equipment it shows the settings of the equipment during the experiment. it also allows the user to interact with the individual machines directly via the app to change settings of the machine.
To upload files, please first save the app
import streamlit as st
import pandas as pd
import numpy as np
from datetime import datetime, date
import plotly.express as px
from sqlalchemy import create_engine, Column, Integer, Float, String, DateTime, Date, ForeignKey
from sqlalchemy.orm import DeclarativeBase, Session, relationship
# Database setup
class Base(DeclarativeBase):
pass
class Equipment(Base):
__tablename__ = "equipment"
id = Column(Integer, primary_key=True)
name = Column(String, unique=True)
type = Column(String) # analog or digital
readings = relationship("Reading", back_populates="equipment")
settings = relationship("Setting", back_populates="equipment")
class Reading(Base):
__tablename__ = "readings"
id = Column(Integer, primary_key=True)
equipment_id = Column(Integer, ForeignKey("equipment.id"))
timestamp = Column(DateTime, default=datetime.utcnow)
value = Column(Float)
experiment_date = Column(Date)
equipment = relationship("Equipment", back_populates="readings")
class Setting(Base):
__tablename__ = "settings"
id = Column(Integer, primary_key=True)
equipment_id = Column(Integer, ForeignKey("equipment.id"))
parameter = Column(String)
value = Column(Float)
timestamp = Column(DateTime, default=datetime.utcnow)
equipment = relationship("Equipment", back_populates="settings")
# Create database and tables
engine = create_engine("sqlite:///lab_equipment.sqlite")
Base.metadata.create_all(engine)
# Initialize session state for equipment selection
if "selected_equipment" not in st.session_state:
st.session_state.selected_equipment = None
st.title("Laboratory Equipment Dashboard")
# Sidebar for equipment selection and control
with st.sidebar:
st.header("Equipment Control Panel")
# Add new equipment
with st.expander("Add New Equipment"):
new_name = st.text_input("Equipment Name")
new_type = st.selectbox("Equipment Type", ["analog", "digital"])
if st.button("Add Equipment"):
with Session(engine) as session:
new_equipment = Equipment(name=new_name, type=new_type)
session.add(new_equipment)
session.commit()
st.success(f"Added {new_name}")
# Select equipment to monitor/control
with Session(engine) as session:
equipment_list = session.query(Equipment).all()
equipment_names = [eq.name for eq in equipment_list]
if equipment_names:
selected_name = st.selectbox("Select Equipment", equipment_names)
st.session_state.selected_equipment = selected_name
else:
st.warning("No equipment registered")
# Main content area
if st.session_state.selected_equipment:
with Session(engine) as session:
equipment = session.query(Equipment).filter_by(name=st.session_state.selected_equipment).first()
# Equipment details and controls
col1, col2 = st.columns(2)
with col1:
st.subheader(f"{equipment.name} Controls")
# Simulated equipment controls
new_setting = st.slider("Power Level", 0, 100, 50)
if st.button("Apply Setting"):
setting = Setting(
equipment_id=equipment.id,
parameter="power_level",
value=new_setting
)
session.add(setting)
session.commit()
st.success("Setting applied")
with col2:
st.subheader("Current Settings")
current_settings = session.query(Setting).filter_by(equipment_id=equipment.id).order_by(Setting.timestamp.desc()).limit(5).all()
if current_settings:
settings_df = pd.DataFrame([
{"Parameter": s.parameter, "Value": s.value, "Time": s.timestamp}
for s in current_settings
])
st.dataframe(settings_df)
# Data collection
st.subheader("Data Collection")
if st.button("Record Reading"):
new_reading = Reading(
equipment_id=equipment.id,
value=np.random.normal(50, 10), # Simulated reading
experiment_date=date.today()
)
session.add(new_reading)
session.commit()
st.success("Reading recorded")
# Historical data visualization
st.subheader("Historical Data")
readings = session.query(Reading).filter_by(equipment_id=equipment.id).all()
if readings:
readings_df = pd.DataFrame([
{"Value": r.value, "Timestamp": r.timestamp, "Date": r.experiment_date}
for r in readings
])
fig = px.line(readings_df, x="Timestamp", y="Value", title="Equipment Readings Over Time")
st.plotly_chart(fig)
# Daily aggregation
daily_avg = readings_df.groupby("Date")["Value"].agg(['mean', 'min', 'max']).reset_index()
st.subheader("Daily Statistics")
st.dataframe(daily_avg)
else:
st.info("Please select or add equipment from the sidebar to begin")
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?