class Agrisensor(db.Model): """each agrimodule has a different table where all data that is measured by agrimodule is saved in this model""" __tablename__ = 'agrisensors' id = db.Column(db.Integer, primary_key=True) identifier = db.Column(db.String(50), unique=True) lat = db.Column(db.Float(precision=8)) lon = db.Column(db.Float(precision=8)) batt_status = db.Column(db.Integer) # RELATIONSHIP # agrimodule[1]-AGRIMODULE[M] agrimodule_id = db.Column(db.Integer, db.ForeignKey('agrimodules.id')) # AGRIMODULE[1]-MEASUREMENT[M] measurements = db.relationship('Measurement', backref='agrisensor', lazy='dynamic') # SETTINGS _time_created = db.Column(db.DateTime(timezone=True), server_default=func.now()) _time_updated = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) def __repr__(self): return '<agrisensor {}>'.format(self.identifier)
class Measurement(db.Model): __tablename__ = 'measurements' id = db.Column(db.Integer, primary_key=True) timestamp = db.Column(db.DateTime(timezone=True)) soil_ph = db.Column(db.Float(precision=4)) soil_nutrient = db.Column(db.Float(precision=4)) soil_temp = db.Column(db.Float(precision=4)) soil_humi = db.Column(db.Float(precision=4)) air_temp = db.Column(db.Float(precision=4)) air_humi = db.Column(db.Float(precision=4)) air_pres = db.Column(db.Float(precision=4)) solar_radiation = db.Column(db.Float(precision=4)) batt_status = db.Column(db.Integer) lat = db.Column(db.Float(precision=8)) lon = db.Column(db.Float(precision=8)) # REALTIONSHIPS # AGRIMODULE[1]-MEASUREMENT[M] agrimodule_id = db.Column(db.Integer, db.ForeignKey('agrimodules.id')) # AGRIPUMP[1]-MEASUREMENT[M] agripump_id = db.Column(db.Integer, db.ForeignKey('agrisensors.id')) def __repr__(self): return '<measurement {}>'.format(self.id)
class Farm(db.Model): """Farms Models for Users to create. One User can created as many farms as he wants""" __tablename__ = 'farm' id = db.Column(db.Integer, primary_key=True) farm_name = db.Column(db.String(25), unique=True, nullable=False) farm_location = db.Column(db.String(20)) farm_coordinates = db.Column(db.String(3000)) farm_area = db.Column(db.Float(precision=2)) farm_cultivation_process = db.Column(db.String(20)) # RELATIONSHIP # USER[1]-FARM[M] user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # FARM[1]-FIELD[M] fields = db.relationship('Field', backref='farm', lazy='dynamic') soil_tests = db.relationship('SoilTest', backref='farm', lazy='dynamic') water_tests = db.relationship('WaterTest', backref='farm', lazy='dynamic') _default = db.Column(db.Boolean) _time_created = db.Column(db.DateTime(timezone=True), server_default=func.now()) _time_updated = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) def __repr__(self): return '<farm {}>'.format(self.farm_name)
class Agrimodule(db.Model): """Each agrimodule smart system is unique and has am agrimodule an agripump and maybe agresiensor and other agripumps depending on the complaexity of the farm and can be added to any user any farm with a unique identuifier which can connect the data being sent to server to an specific User.Model/Field.Model Each agrimodule""" __tablename__ = 'agrimodules' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(20)) identifier = db.Column(db.String(100), unique=True, nullable=False) lat = db.Column(db.Float(precision=8)) lon = db.Column(db.Float(precision=8)) batt_status = db.Column(db.Integer) public_id = db.Column(db.String(200)) mac = db.Column(db.String(400)) # RELATIONSHIP # USER[1]-agrimodule[M] user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # FIELD[1]-agrimodule[1] field_id = db.Column(db.Integer, db.ForeignKey('field.id')) # AGRIMODULE[1]-MEASUREMENT[M] measurements = db.relationship('Measurement', backref='agrimodule', lazy='dynamic') # AGRIMODULE[1]-AGRISENSOR[M] agrisensors = db.relationship('Agrisensor', backref='agrimodule', lazy='dynamic') # AGRIMODULE[1]-AGRIPUMP[M] agripumps = db.relationship('Agripump', backref='agrimodule', lazy='dynamic') _time_created = db.Column(db.DateTime(timezone=True), server_default=func.now()) _time_updated = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) def __repr__(self): return '<agrimodule {}>'.format(self.identifier)
class Field(db.Model): """Fields that can exist inside the Farm.Model. One Farm can have as many Fields within for different crops to be cultivated, being limited by the size of the Farm""" __tablename__ = 'field' id = db.Column(db.Integer, primary_key=True) field_name = db.Column(db.String(25), nullable=False) field_cultivation_area = db.Column(db.Float(precision=2)) field_cultivation_start_date = db.Column(db.DateTime(timezone=True)) field_cultivation_finish_date = db.Column(db.DateTime(timezone=True)) field_current_yield = db.Column(db.Float(precision=2)) field_projected_yield = db.Column(db.Float(precision=2)) field_cultivation_state = db.Column(db.String(20)) field_cultivation_type = db.Column(db.String(5)) field_num_plants = db.Column(db.Integer) field_spacing_topology = db.Column(db.String(20)) field_water_required_day = db.Column(db.Integer) # field_ = db.Column(db.Float) # RELATIONSHIP TO BE ADDED agrimodule = db.relationship('Agrimodule', uselist=False, backref='field') # FIELD[1]-AGRIMODULE[1] # RELATIONSHIP # FIELD[M]-CROP[M] crops = db.relationship('Crop', secondary='crops_field', backref='field', lazy='dynamic') # FARM[1]-FIELD[M] farm_id = db.Column(db.Integer, db.ForeignKey('farm.id')) _time_created = db.Column(db.DateTime(timezone=True), server_default=func.now()) _time_updated = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) def __repr__(self): return '<field {}>'.format(self.field_name)
class Pump(db.Model): """pump database used for each field or each agripump whichi is installed in the farm. one farm can ahve as many pump the want as long as the have an agripump for it""" __tablename__ = 'pump' id = db.Column(db.Integer, primary_key=True) pump_name = db.Column(db.String(30)) pump_brand = db.Column(db.String(25)) pump_flow_rate = db.Column(db.Float(precision=2), nullable=False) pump_head = db.Column(db.Float(presicion=2), nullable=False) pump_watts = db.Column(db.Float(precision=2), nullable=False) # RELATIONSHIP # USER[1]-PUMP[M] user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # PUMP[1]-AGRIPUMP agripumps = db.relationship('Agripump', backref='pump', lazy='dynamic') _time_created = db.Column(db.DateTime(timezone=True), server_default=func.now()) _time_updated = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) def __repr__(self): return '<pump {}>'.format(self.pump_brand)
class WaterTest(db.Model): __tablename__ = 'watertest' id = db.Column(db.Integer, primary_key=True) water_ph = db.Column(db.Float(precision=2)) water_ec = db.Column(db.Float(precision=2)) water_bicarbonates = db.Column(db.Float(precision=2)) water_carbonates = db.Column(db.Float(precision=2)) water_potasium = db.Column(db.Float(precision=2)) water_sulphate = db.Column(db.Float(precision=2)) # FARM[1]-TEST[M] farm_id = db.Column(db.Integer, db.ForeignKey('farm.id')) _time_created = db.Column(db.DateTime(timezone=True), server_default=func.now()) _time_updated = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) def __repr__(self): return '<Water Test {}>'.format(self.id)
class SoilTest(db.Model): __tablename__ = 'soiltest' id = db.Column(db.Integer, primary_key=True) soil_ph = db.Column(db.Float(precision=2)) soil_ec = db.Column(db.Float(precision=2)) soil_organic_carbon = db.Column(db.Float(precision=2)) soil_nitrogen = db.Column(db.Float(precision=2)) soil_p205 = db.Column(db.Float(precision=2)) soil_k20 = db.Column(db.Float(precision=2)) # FARM[1]-TEST[M] farm_id = db.Column(db.Integer, db.ForeignKey('farm.id')) _time_created = db.Column(db.DateTime(timezone=True), server_default=func.now()) _time_updated = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) def __repr__(self): return '<Soil Test {}>'.format(self.id)
class Agripump(db.Model): """pump schedule for each farm and agripump, it requires to know which Pump.Model is used in order to make the calculations""" __tablename__ = 'agripumps' id = db.Column(db.Integer, primary_key=True) identifier = db.Column(db.String(50), unique=True) lat = db.Column(db.Float(precision=8)) lon = db.Column(db.Float(precision=8)) status = db.Column(db.Boolean) # REQUIREMENTS _daily_water = db.Column(db.Float(precision=3)) _date = db.Column(db.DateTime(timezone=True)) # SCHEDULE IN MINUTES # _00_HOUR = db.Column(db.Float(precision=1)) # _01_HOUR = db.Column(db.Float(precision=1)) # _02_HOUR = db.Column(db.Float(precision=1)) # _03_HOUR = db.Column(db.Float(precision=1)) # _04_HOUR = db.Column(db.Float(precision=1)) # _05_HOUR = db.Column(db.Float(precision=1)) # _06_HOUR = db.Column(db.Float(precision=1)) # _07_HOUR = db.Column(db.Float(precision=1)) # _08_HOUR = db.Column(db.Float(precision=1)) # _09_HOUR = db.Column(db.Float(precision=1)) # _10_HOUR = db.Column(db.Float(precision=1)) # _11_HOUR = db.Column(db.Float(precision=1)) # _12_HOUR = db.Column(db.Float(precision=1)) # _13_HOUR = db.Column(db.Float(precision=1)) # _14_HOUR = db.Column(db.Float(precision=1)) # _15_HOUR = db.Column(db.Float(precision=1)) # _16_HOUR = db.Column(db.Float(precision=1)) # _17_HOUR = db.Column(db.Float(precision=1)) # _18_HOUR = db.Column(db.Float(precision=1)) # _19_HOUR = db.Column(db.Float(precision=1)) # _20_HOUR = db.Column(db.Float(precision=1)) # _21_HOUR = db.Column(db.Float(precision=1)) # _22_HOUR = db.Column(db.Float(precision=1)) # _23_HOUR = db.Column(db.Float(precision=1)) # TIME USAGE start_hour_per_day = db.Column(db.Integer) qty_hour_per_day = db.Column(db.Integer) time_per_hour = db.Column(db.Float) time_per_day = db.Column(db.Float) time_per_cycle = db.Column(db.Float) # WATER USAGE water_per_hour = db.Column(db.Integer) water_per_day = db.Column(db.Integer) water_per_cycle = db.Column(db.Integer) # ENERGY USAGE energy_per_hour = db.Column(db.Integer) energy_per_day = db.Column(db.Integer) energy_per_cycle = db.Column(db.Integer) # REALTIONSHIPS # AGRIMODULE[1]-AGRIPUMP[M] agrimodule_id = db.Column(db.Integer, db.ForeignKey('agrimodules.id')) # PUMP[1]-AGRIPUMP[M] pump_id = db.Column(db.Integer, db.ForeignKey('pump.id')) # SETTINGS _time_created = db.Column(db.DateTime(timezone=True), server_default=func.now()) _time_updated = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) def __repr__(self): return '<agripump {}>'.format(self.identifier)
class Crop(db.Model): '''The crop database reference from farmers or Users.model that can be be cultivated in the Field.Model''' __tablename__ = 'crop' id = db.Column(db.Integer, primary_key=True) _name = db.Column(db.String(25), unique=True, nullable=False) _variety = db.Column(db.String(25)) _family = db.Column(db.String(25)) _yield = db.Column(db.Float(precision=2)) _space_x = db.Column(db.Float(precision=2)) _space_y = db.Column(db.Float(precision=2)) _space_z = db.Column(db.Float(precision=2)) _density = db.Column(db.Float(precision=2)) image = db.Column(db.String(200), unique=True) # FRUITS EACH PLANT _fruit_quantity = db.Column(db.Integer) _fruit_size = db.Column(db.Float(precision=2)) _fruit_weight = db.Column(db.Float(precision=2)) # RESOURCES REQUIRED _water = db.Column(db.Float(precision=4)) _nutrient = db.Column(db.Float(precision=4)) _radiation = db.Column(db.Float(precision=4)) # CYCLE _dtg = db.Column(db.Integer) _dtm = db.Column(db.Integer) # REQUIREMENTS # SOIL _soil_ph_min = db.Column(db.Float(precision=2)) _soil_ph_opt = db.Column(db.Float(precision=2)) _soil_ph_max = db.Column(db.Float(precision=2)) _soil_temp_min = db.Column(db.Float(precision=2)) _soil_temp_opt = db.Column(db.Float(precision=2)) _soil_temp_max = db.Column(db.Float(precision=2)) _soil_humi_min = db.Column(db.Float(precision=2)) _soil_humi_opt = db.Column(db.Float(precision=2)) _soil_humi_max = db.Column(db.Float(precision=2)) _soil_nutrient_min = db.Column(db.Float(precision=2)) _soil_nutrient_opt = db.Column(db.Float(precision=2)) _soil_nutrient_max = db.Column(db.Float(precision=2)) # AIR _air_temp_min = db.Column(db.Float(precision=2)) _air_temp_opt = db.Column(db.Float(precision=2)) _air_temp_max = db.Column(db.Float(precision=2)) _air_humi_min = db.Column(db.Float(precision=2)) _air_humi_opt = db.Column(db.Float(precision=2)) _air_humi_max = db.Column(db.Float(precision=2)) # WATER _water_needed = db.Column( db.Integer) # not reuired is already declared some lines before _water time_created = db.Column(db.DateTime(timezone=True), server_default=func.now()) time_updated = db.Column(db.DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) def __repr__(self): return '<crop {}>'.format(self._name)