154 lines
3.7 KiB
Markdown
154 lines
3.7 KiB
Markdown
# CO2 Sensor Integration Guide
|
|
|
|
This document explains how to write CO2 sensor data directly to the `ac_data.db` SQLite database so it appears under the "Wall" device on the dashboard.
|
|
|
|
## Database Location
|
|
|
|
```
|
|
/home/seb/src/actest/ac_data.db
|
|
```
|
|
|
|
## Current Schema
|
|
|
|
```sql
|
|
CREATE TABLE readings (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
dev_id TEXT,
|
|
dev_name TEXT,
|
|
port INTEGER,
|
|
port_name TEXT,
|
|
temp_c REAL,
|
|
humidity REAL,
|
|
vpd REAL,
|
|
fan_speed INTEGER,
|
|
on_speed INTEGER,
|
|
off_speed INTEGER
|
|
);
|
|
```
|
|
|
|
## Inserting CO2 Data
|
|
|
|
Add CO2 readings as a **new port** on the "Wall" device. Use **port 2** with `port_name = 'CO2'`.
|
|
|
|
### SQL Insert Statement
|
|
|
|
```sql
|
|
INSERT INTO readings (dev_name, port, port_name, temp_c, humidity, vpd, fan_speed)
|
|
VALUES ('Wall', 2, 'CO2', NULL, NULL, NULL, <CO2_VALUE_PPM>);
|
|
```
|
|
|
|
> **Note**: The `fan_speed` column stores the CO2 ppm value. This reuses the existing integer column for sensor readings.
|
|
|
|
### Example: Insert 850 ppm
|
|
|
|
```sql
|
|
INSERT INTO readings (dev_name, port, port_name, temp_c, humidity, vpd, fan_speed)
|
|
VALUES ('Wall', 2, 'CO2', NULL, NULL, NULL, 850);
|
|
```
|
|
|
|
### From Command Line (bash)
|
|
|
|
```bash
|
|
sqlite3 /home/seb/src/actest/ac_data.db \
|
|
"INSERT INTO readings (dev_name, port, port_name, fan_speed) VALUES ('Wall', 2, 'CO2', 850);"
|
|
```
|
|
|
|
### From Node.js
|
|
|
|
```javascript
|
|
import Database from 'better-sqlite3';
|
|
|
|
const db = new Database('/home/seb/src/actest/ac_data.db');
|
|
|
|
function insertCO2Reading(ppm) {
|
|
const stmt = db.prepare(`
|
|
INSERT INTO readings (dev_name, port, port_name, fan_speed)
|
|
VALUES ('Wall', 2, 'CO2', ?)
|
|
`);
|
|
stmt.run(ppm);
|
|
}
|
|
|
|
// Example: Insert reading
|
|
insertCO2Reading(850);
|
|
```
|
|
|
|
### From Python
|
|
|
|
```python
|
|
import sqlite3
|
|
|
|
DB_PATH = '/home/seb/src/actest/ac_data.db'
|
|
|
|
def insert_co2_reading(ppm):
|
|
conn = sqlite3.connect(DB_PATH)
|
|
cursor = conn.cursor()
|
|
cursor.execute('''
|
|
INSERT INTO readings (dev_name, port, port_name, fan_speed)
|
|
VALUES ('Wall', 2, 'CO2', ?)
|
|
''', (ppm,))
|
|
conn.commit()
|
|
conn.close()
|
|
|
|
# Example: Insert reading
|
|
insert_co2_reading(850)
|
|
```
|
|
|
|
## Dashboard Display
|
|
|
|
Once data is inserted, the dashboard will automatically:
|
|
|
|
1. Detect "Wall" device now has **2 ports**: Fan (port 1) and CO2 (port 2)
|
|
2. Display a new chart card labeled "CO2" under the Wall controller
|
|
|
|
### Current Limitation
|
|
|
|
The `LevelChart` component currently:
|
|
- Uses `fan_speed` for the Y-axis data ✅ (works for CO2)
|
|
- Labels chart as "Fan Speed" for non-light ports ⚠️
|
|
- Has Y-axis scale 0-10 ⚠️ (too small for CO2 ppm)
|
|
|
|
**The chart will display CO2 data, but the label and scale won't be ideal.**
|
|
|
|
## Recommended Dashboard Enhancements
|
|
|
|
To properly display CO2 data, modify `src/client/LevelChart.js`:
|
|
|
|
```javascript
|
|
// Detect CO2 sensor type
|
|
const isCO2 = portName?.toLowerCase().includes('co2');
|
|
|
|
// Set appropriate label
|
|
const levelLabel = isLight ? 'Brightness' : (isCO2 ? 'CO2 (ppm)' : 'Fan Speed');
|
|
|
|
// Set appropriate Y-axis scale
|
|
const yScale = isCO2
|
|
? { suggestedMin: 400, suggestedMax: 2000 }
|
|
: { suggestedMin: 0, suggestedMax: 10, ticks: { stepSize: 1 } };
|
|
```
|
|
|
|
## Testing
|
|
|
|
After inserting test data, verify it appears:
|
|
|
|
```bash
|
|
# Check if data was inserted
|
|
sqlite3 /home/seb/src/actest/ac_data.db \
|
|
"SELECT * FROM readings WHERE port_name = 'CO2' ORDER BY timestamp DESC LIMIT 5;"
|
|
|
|
# View all ports for Wall device
|
|
sqlite3 /home/seb/src/actest/ac_data.db \
|
|
"SELECT DISTINCT dev_name, port, port_name FROM readings WHERE dev_name = 'Wall';"
|
|
```
|
|
|
|
## Cron Job Example
|
|
|
|
To log CO2 every minute from another script:
|
|
|
|
```bash
|
|
# crontab -e
|
|
* * * * * /path/to/your/co2_logger.sh >> /var/log/co2_logger.log 2>&1
|
|
```
|
|
|
|
Where `co2_logger.sh` reads your sensor and inserts to the database.
|