demeter

Autonomous Hydroponic Intelligence

backend/node_server/schema/cropSchema.js (1449B)


 1const mongoose = require("mongoose");
 2
 3const sensorSchema = new mongoose.Schema(
 4  {
 5    pH: [Number],
 6    EC: [Number],
 7    temp: [Number],
 8    humidity: [Number],
 9  },
10  { _id: false },
11);
12
13const sensorIdsSchema = new mongoose.Schema(
14  {
15    ph_sensor: { type: String, default: "" },
16    ec_sensor: { type: String, default: "" },
17    temp_sensor: { type: String, default: "" },
18    humidity_sensor: { type: String, default: "" },
19  },
20  { _id: false },
21);
22
23const cropStateSchema = new mongoose.Schema({
24  crop_id: { type: String, required: true, unique: true },
25  crop: String,
26  stage: String,
27  sequence_number: { type: Number, default: 0 },
28  cycle_duration_hours: { type: Number, default: 1 },
29  total_crop_lifetime_days: { type: Number, default: 0 },
30  simulated_age_hours: { type: Number, default: 0 },
31  planted_at: { type: Date, default: Date.now },
32  last_updated: { type: Date, default: Date.now },
33
34  sensors: sensorSchema,
35
36  sensor_ids: { type: sensorIdsSchema, default: () => ({}) },
37  location: { type: String, default: "" },
38  notes: { type: String, default: "" },
39  image_url: { type: String, default: "" },
40
41  action_taken: mongoose.Schema.Types.Mixed,
42  outcome: String,
43  explanation_log: String,
44  bandit_action_id: Number,
45  strategic_intent: String,
46  reward_score: Number,
47  visual_diagnosis: String,
48
49  schema_version: { type: String, default: "1.2" },
50});
51
52module.exports = mongoose.model("CropState", cropStateSchema);