-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdb_schema.py
More file actions
188 lines (166 loc) · 5.76 KB
/
Copy pathdb_schema.py
File metadata and controls
188 lines (166 loc) · 5.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
from db import get_conn
def init_beds_and_sensors_tables():
with get_conn() as conn:
cur = conn.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS beds (
bed_id TEXT PRIMARY KEY,
zone_id TEXT NOT NULL,
active INTEGER DEFAULT 1,
FOREIGN KEY (zone_id) REFERENCES zones(zone_id)
)
""")
cur.execute("""
CREATE TABLE IF NOT EXISTS zones (
zone_id TEXT PRIMARY KEY,
name TEXT,
active INTEGER DEFAULT 1
)
""")
cur.execute("""
CREATE TABLE IF NOT EXISTS sensors (
sensor_id TEXT PRIMARY KEY,
bed_id TEXT NOT NULL,
sensor_type TEXT DEFAULT 'moisture',
depth_cm INTEGER,
active INTEGER DEFAULT 1,
FOREIGN KEY (bed_id) REFERENCES beds(bed_id)
)
""")
cur.execute("""
CREATE TABLE IF NOT EXISTS plants (
plant_id TEXT PRIMARY KEY,
name TEXT NOT NULL,
scientific_name TEXT,
category TEXT,
family TEXT,
icon_key TEXT,
emoji TEXT,
photo_key TEXT,
spacing_in_row_cm INTEGER,
spacing_between_rows_cm INTEGER,
root_depth_min_cm INTEGER,
root_depth_max_cm INTEGER,
root_type TEXT,
water_need_overall TEXT,
irrigation_sensitivity TEXT,
mulch_helpful INTEGER,
min_moisture INTEGER,
max_moisture INTEGER,
base_minutes INTEGER,
soil_json TEXT,
calendar_json TEXT,
nutrition_json TEXT,
care_json TEXT,
plant_json TEXT,
schema_version INTEGER DEFAULT 1
)
""")
cur.execute("""
CREATE TABLE IF NOT EXISTS plant_varieties (
plant_id TEXT NOT NULL,
variety_id TEXT NOT NULL,
name TEXT NOT NULL,
notes TEXT,
overrides_json TEXT NOT NULL,
resolved_json TEXT,
PRIMARY KEY (plant_id, variety_id),
FOREIGN KEY (plant_id) REFERENCES plants(plant_id)
)
""")
cur.execute("""
CREATE TABLE IF NOT EXISTS plant_companions (
plant_id TEXT NOT NULL,
other_plant_id TEXT NOT NULL,
relation TEXT NOT NULL,
reason TEXT,
confidence TEXT,
mechanism TEXT,
PRIMARY KEY (plant_id, other_plant_id, relation),
FOREIGN KEY (plant_id) REFERENCES plants(plant_id),
FOREIGN KEY (other_plant_id) REFERENCES plants(plant_id)
)
""")
cur.execute("""
CREATE TABLE IF NOT EXISTS bed_plantings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
bed_id TEXT NOT NULL,
plant_id TEXT NOT NULL,
variety_id TEXT,
quantity INTEGER DEFAULT 1,
planted_at TEXT,
removed_at TEXT,
overrides_json TEXT,
notes TEXT,
FOREIGN KEY (bed_id) REFERENCES beds(bed_id),
FOREIGN KEY (plant_id) REFERENCES plants(plant_id)
)
""")
cur.execute("""
CREATE TABLE IF NOT EXISTS system_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL,
date TEXT NOT NULL,
level TEXT NOT NULL,
source TEXT NOT NULL,
bed_id TEXT,
message TEXT NOT NULL,
details TEXT
)
""")
def init_watering_events_table():
with get_conn() as conn:
cur = conn.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS watering_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT,
date TEXT,
zone_id TEXT,
bed_id TEXT,
minutes INTEGER,
mode TEXT,
soil_factor REAL,
temp_factor REAL,
rain_factor REAL,
source_decision_id INTEGER,
note TEXT
)
""")
def init_watering_decisions_table():
with get_conn() as conn:
cur = conn.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS watering_decisions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT,
date TEXT,
zone_id TEXT,
bed_id TEXT,
plant_name TEXT,
avg_moisture INTEGER,
temp_max REAL,
precipitation REAL,
base_minutes INTEGER,
final_minutes INTEGER,
soil_factor REAL,
temp_factor REAL,
rain_factor REAL
)
""")
def init_sensor_readings_table():
with get_conn() as conn:
cur = conn.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS sensor_readings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL,
date TEXT NOT NULL,
bed_id TEXT,
sensor_id TEXT NOT NULL,
slot INTEGER NOT NULL,
moisture_raw INTEGER NOT NULL,
moisture_pct INTEGER NOT NULL,
UNIQUE (sensor_id, date, slot)
)
""")