# -*- coding: utf-8 -*-
# 创建应用
import json
import re
import threading
import traceback
from flask import Flask, jsonify, render_template, request, url_for, redirect, abort
from flask_bootstrap import Bootstrap
from common import RaspberryConfig
from model import DBUtil
from model.JsonSchema import DHT11ResultSechema, SensorSechema, PlantModelDTO, PlantModelSchema, PlantTypeSchema
from model.PlantModel import PlantType, sensor, PlantModel
from sensor import ControlCenter
app = Flask(__name__)
# 加载配置文件
app.config.from_object('RaspberryConfig')
app.config['JSON_AS_ASCII'] = False
app.config['BOOTSTRAP_SERVE_LOCAL'] = True
Bootstrap(app)
# lock
controlcenter_lock = threading.Lock()
@app.route('/', methods=['GET'])
def hello():
return redirect('/docs')
@app.route('/api/config',methods=['GET'])
def config():
"""
查看树莓派所有配置
:return: JSON字符串
"""
return jsonify(RaspberryConfig.getAllStr())
@app.route('/config',methods=['GET'])
def listConfig():
"""
树莓派配置列表页
:return: html
"""
configs = RaspberryConfig.getAllStr()
return render_template('config.html',config = configs)
@app.route('/api/config/<key>/<value>',methods=['GET','PUT','POST'])
def updateConfig(key,value):
"""
修改树莓派配置
:param key: 将要修改的配置属性键值
:param value: 将要修改的配置属性值
:return: 修改后的树莓派配置
"""
# todo 对key和value需要验证
RaspberryConfig.setAttr(key, value)
return '修改成功,key={},value={}'.format(key, RaspberryConfig.getAttr(key))
# 传感器部分
@app.route('/api/sensors', methods=['GET'])
def listSensors():
"""
列出树莓派支持的所有传感器
:return: list
"""
sensors = DBUtil.getAllSensors()
schema = SensorSechema()
result = schema.dump(sensors,many=True)
return jsonify(result)
@app.route('/sensors',methods=['GET'])
def sensors():
return render_template('sensors.html')
@app.route('/api/sensors/<sensorId>/<status>')
def updateSensor(sensorId,status):
"""
修改传感器状态
:param sensorId: 传感器ID
:param status: 修改的状态
:return:
"""
if status == 'false':
status = False
elif status == 'true':
status = True
sens = sensor(isActive=status)
sens.id = sensorId
try:
# 数据库修改状态
DBUtil.updateSensorState(sens)
# 重新加载内存传感器列表
ControlCenter.loadActiveSensors()
return '修改成功'
except Exception,e:
DBUtil.rollback()
return e.message
@app.route('/api/light',methods=['GET','POST'])
def getLight():
return jsonify({"light":ControlCenter.getLight()})
@app.route('/api/sensor/soilHum',methods=['GET','POST'])
def getSoilHum():
"""
获取土壤湿度
:return: {'soilHum': 12}
"""
soilhum = ControlCenter.getSoilHum()
result = {}
result['soilHum'] = soilhum
return jsonify(result)
@app.route('/api/sensor/camera/<filename>')
def getPic(filename):
"""
获取植物当前图像
:param filename: 图像文件名
:return:
"""
return jsonify({"pic":ControlCenter.getPic(filename)})
def getLight():
"""
获取植物当前光照情况
:return:
"""
return jsonify({'light':ControlCenter.getLight()})
@app.route('/api/sensor/airTempHum', methods=['GET'])
def getAirTempHum():
"""
获取空气温度和湿度
:return: {
"error_code": 0,
"humidity": 39,
"temperature": 21
}
"""
schema = DHT11ResultSechema()
result = ControlCenter.getAirTempHum()
result = schema.dump(result)
return jsonify(result)
@app.route('/api/sensor/all', methods=['GET'])
def getAllSensorData():
"""
获取一次全量传感器数据并与生长模型比较
:return: {time} :本次读取植物环境数据为:{data},结果为{compare_result}
"""
return jsonify(ControlCenter.getAndCompareAll())
# 植物生长模型
@app.route('/plantmodel',methods=['GET','POST'])
def plantModelIndex():
return render_template('plantmodel.html')
@app.route('/api/plantmodel',methods=['GET'])
def getAllPlantModel():
"""
获取所有植物生长类型列表
:return:
"""
plantmodels = DBUtil.getAllPlantModel()
print '查询出{}条植物生长类型'.format(len(plantmodels))
plantmodelDtos = [PlantModelDTO().convertFromPlantModel(plantmodel) for plantmodel in plantmodels ]
result = PlantModelSchema().dump(plantmodelDtos,many=True)
return jsonify(result)
@app.route('/api/plantmodel',methods=['DELETE'])
def delPlantModelByIds():
"""
根据植物生长模型id列表删除植物生长模型
:param: {delIds:[]}
:return:
"""
# 接收参数为数组时,需要先将参数通过json转化
delIds = request.form.get("delIds")
delIds = json.loads(delIds)
print delIds
DBUtil.deletePlantModelsByIds(delIds)
return '删除成功'
@app.route('/addPlantModel.html')
def renderAddPlantModel():
return render_template('addPlantModel.html')
@app.route('/api/plantmodel',methods=['POST'])
def addPlantModel():
"""
添加植物生长模型
:return:
"""
# 组装对象
plantModel = PlantModel()
plantModel.typeId = request.form.get('typeId')
print request.values
print request.values.get('light_low',default='0')
plantModel.lightIntensity_low = request.form.get('light_low',default='0')
plantModel.lightIntensity_high = request.form.get('light_high',default='0')
plantModel.soilHumidity_low = request.form.get('soilhum_low',default='0')
plantModel.soilHumidity_high = request.form.get('soilhum_high',default='0')
plantModel.airTemprature_high = request.form.get('airTemp_high',default='0')
plantModel.airTemprature_low = request.form.get('airTemp_low',default='0')
plantModel.airHumidity_low = request.form.get('airHum_low',default='0')
plantModel.airHumidity_high = request.form.get('airHum_high',type=str,default='0')
plantModel.CO2concetration_low = request.form.get('co2_low',type=str,default='0')
plantModel.CO2concetration_high = request.form.get('co2_high',default='0')
try:
DBUtil.addOrUpdatePlantModel(plantModel)
return '添加成功'
except Exception,e:
print e
DBUtil.rollback()
return 'false'
@app.route('/api/editPlantmodel',methods=['POST'])
def updatePlantModel():
"""
更新植物生长模型,请求content-type必须为application/json
:return:
"""
if not request.json:
abort(400)
jsonData = request.data
# loads方法接受一个json string 而load方法接受一个字典
schema = PlantModelSchema()
plantModelDto = schema.loads(jsonData,partial=True)
plantModel = plantModelDto.convertToPlantModel()
try:
DBUtil.addOrUpdatePlantModel(plantModel)
return "更新成功"
except Exception,e:
DBUtil.rollback()
return "更新失败"
# 植物类型
@app.route('/api/planttypes',methods=['GET'])
def getPlantTypes():
"""
获取所有植物类型,参数isAll为True代表获取所有,否则获取没有对应植物生长模型的植物类型
:return:
"""
isAll = request.args.get('isAll')
if isAll == "True":
result = DBUtil.getAllPlantType()
else:
result = DBUtil.getActivePlantType()
result = PlantTypeSchema().dump(result,many=True)
return jsonify(result)
@app.route('/api/run', methods=['GET'])
# 开启或关闭控制中心,on/off
def controlCenter():
"""
开启或关闭控制中心,mode=on代表开启,默认为on,若开启还需plantTypeId参数或者plantType参数
:return: 开启成功或失败提示
"""
mode = request.args.get('mode', default='on')
# 加锁
global controlcenter_lock
if mode == '
没有合适的资源?快使用搜索试试~ 我知道了~
基于python实现树莓派和传感器的植物生长环境评估信息系统
共55个文件
py:23个
js:9个
html:8个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 74 浏览量
2024-05-13
19:06:57
上传
评论
收藏 161KB ZIP 举报
温馨提示
【作品名称】:基于python实现树莓派和传感器的植物生长环境评估信息系统 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:基于python实现树莓派和传感器的植物生长环境评估信息系统
资源推荐
资源详情
资源评论
收起资源包目录
raspberry_plant-code.zip (55个子文件)
raspberry_plant-code
__init__.py 0B
.DS_Store 8KB
sensor
__init__.py 0B
.DS_Store 6KB
camera.py 2KB
MCP3008.py 1KB
ControlCenter.py 5KB
GY30.py 714B
dh11.py 10KB
Sensor.py 435B
Buzzer.py 835B
yl69.py 1KB
app.py 11KB
dataanalysis
__init__.py 0B
DataUtil.py 7KB
templates
.DS_Store 6KB
sensors.html 754B
plantmodel.html 2KB
api
api_docs.html 574B
api_index.html 429B
addPlantModel.html 5KB
layout.html 5KB
index.html 1KB
config.html 2KB
.idea
rasperry.iml 398B
workspace.xml 52KB
misc.xml 288B
modules.xml 268B
common
QiniuUploadUtil.py 898B
__init__.py 0B
Util.py 1001B
.qiniu_pythonsdk_hostscache.json 235B
Logger.py 837B
RaspberryConfig.py 1KB
model
__init__.py 0B
PlantModel.py 5KB
JsonSchema.py 2KB
DBUtil.py 4KB
logs
__main__.logs 0B
.gitignore 1KB
test.py 62B
static
style.css 886B
.DS_Store 8KB
js
plantmodel.js 3KB
config.js 2KB
addPlantModel.js 877B
sensors.js 2KB
bootstrap-table
bootstrap-table.css 7KB
.DS_Store 6KB
x-editable
bootstrap-editable.js 226KB
bootstrap-table.js 115KB
bootstrap-table-zh-CN.js 1KB
switch
bootstrap-switch.min.js 25KB
bootstrap-switch-min.css 6KB
bootstrap-table-edittable.js 5KB
共 55 条
- 1
资源评论
MarcoPage
- 粉丝: 3014
- 资源: 3186
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功