Webserver_Dashboard and basic functionality #1

Merged
Roman_Schenk merged 12 commits from Webserver_Layout into master 2022-08-23 20:28:05 +02:00
7 changed files with 114 additions and 73 deletions
Showing only changes of commit 69d9638456 - Show all commits

View File

@ -8,5 +8,5 @@ class FileIO:
def loadZones(self):
zones = []
for i in range(12):
zones.append(Zone(number=i+1, name="Zone " + str(i+1), actualHumidity=100, desiredHumidity=0, autoMode=False, state=False, setState=0, endTimeSetState=0, planedDuration=0))
zones.append(Zone(number=i+1, name="Zone " + str(i+1), actualHumidity=50, desiredHumidity=30, autoMode=True, state=False, setState=0, endTimeSetState=0, planedDuration=0))
return zones

View File

@ -1,6 +1,10 @@
class SystemSettings:
def __init__(self, dataDir="/Data", multiZoneIrrigation=False):
def __init__(self, dataDir="/Data", multiZoneIrrigation=False, defaultAutoIrrigationDuration=10, defaultManualIrrigationDuration=10, defaultManualOffDuration=10, webDurationOptions=[5, 10, 15, 20, 25, 30, 45, 60]):
self.dataDir = dataDir
self.multiZoneIrrigation = multiZoneIrrigation
self.multiZoneIrrigation = multiZoneIrrigation
self.defaultAutoIrrigationDuration = defaultAutoIrrigationDuration
self.defaultManualIrrigationDuration = defaultManualIrrigationDuration
self.defaultManualOffDuration = defaultManualOffDuration
self.webDurationOptions = webDurationOptions

View File

@ -25,6 +25,7 @@ class Translater:
"automatic mode": "Automatikbetrieb",
"switch to manual mode": "Auf Handbetrieb umstellen",
"switch to automatic mode": "Auf Automatikbetrieb umstellen",
"minutes": "Minuten",
}

View File

@ -1,79 +1,99 @@
from flask import Flask, render_template, request, redirect, url_for
from flask_navigation import Navigation
from Webserver.Translater import Translater, Language
from Zone import Zone
def startWebserver(port, zoneManager):
translater_EN = Translater(Language.ENGLISH)
translater_DE = Translater(Language.GERMAN)
translater = translater_EN
class Webserver:
def __init__(self, zoneManager, port=80):
self.port = port
self.zoneManager = zoneManager
self.translater_EN = Translater(Language.ENGLISH)
self.translater_DE = Translater(Language.GERMAN)
self.translater = self.translater_EN
app = Flask("Bewässerungssystem", template_folder="Webserver/templates", static_folder="Webserver/static")
nav = Navigation(app)
def startWebserver(self):
app = Flask("Bewässerungssystem", template_folder="Webserver/templates", static_folder="Webserver/static")
nav = Navigation(app)
nav.Bar('top', [
nav.Item(translater.getTranslation('Dashboard'), 'showDashboard'),
nav.Item(translater.getTranslation('irrigation zones'), 'showZones'),
nav.Item(translater.getTranslation('blocking times'), 'showTimes'),
nav.Item(translater.getTranslation('system settings'), 'showSystem')
# nav.Item('Gfg', 'gfg', {'page': 5}), #(example with pages)
])
nav.Bar('top', [
nav.Item(self.translater.getTranslation('Dashboard'), 'showDashboard'),
nav.Item(self.translater.getTranslation('irrigation zones'), 'showZones'),
nav.Item(self.translater.getTranslation('blocking times'), 'showTimes'),
nav.Item(self.translater.getTranslation('system settings'), 'showSystem')
# nav.Item('Gfg', 'gfg', {'page': 5}), #(example with pages)
])
# Example Route with pages:
# @app.route('/gfg/<int:page>')
# def gfg(page):
# return render_template('gfg.html', page=page)
# Example Route with pages:
# @app.route('/gfg/<int:page>')
# def gfg(page):
# return render_template('gfg.html', page=page)
@app.route('/')
def startPage():
return redirect(url_for('showDashboard'))
@app.route('/')
def startPage():
return redirect(url_for('showDashboard'))
@app.route('/action/<command>/<index_str>/<value_str>')
def executeAction(command=False, index_str=False, value_str=False):
sucess = False
index = int(index_str)
value = int(value_str)
match command:
case "switch_zone_on":
if (index and value):
zoneManager.switchZoneIndexState(zoneIndex=index, state=True, duration=value)
case "switch_zone_off":
if (index and value):
zoneManager.switchZoneIndexState(zoneIndex=index, state=False, duration=value)
case "switch_zone_mode":
if (index and value):
zone = zoneManager.getZone(index)
match value:
case "automatic":
zone.switchMode(autoMode=True)
case "manual":
zone.switchMode(autoMode=False)
case "set_desired_humidity":
if (index and value):
zone = zoneManager.getZone(index)
zone.desiredHumidity = value
@app.route('/action', methods=['GET', 'POST'])
@app.route('/action/<command>', methods=['GET', 'POST'])
@app.route('/action/<command>/<index_str>', methods=['GET', 'POST'])
@app.route('/action/<command>/<index_str>/<value_str>', methods=['GET', 'POST'])
def executeAction(command=False, index_str=False, value_str=False):
sucess = False
try:
index = int(index_str)
value = int(value_str)
except:
pass
match command:
case "switch_zone_on":
if (index and value):
self.zoneManager.switchZoneIndexState(zoneIndex=index, state=True, duration=value)
sucess = True
elif(index):
self.zoneManager.switchZoneIndexState(zoneIndex=index, state=True, duration=self.zoneManager.systemSettings.defaultManualIrrigationDuration)
sucess = True
case "switch_zone_off":
if (index and value):
self.zoneManager.switchZoneIndexState(zoneIndex=index, state=False, duration=value, instant=True)
sucess = True
elif(index):
self.zoneManager.switchZoneIndexState(zoneIndex=index, state=False, duration=self.zoneManager.systemSettings.defaultManualOffDuration, instant=True)
sucess = True
case "switch_zone_mode":
if (index and value_str):
zone = self.zoneManager.getZone(index)
match value_str:
case "automatic":
zone.switchMode(autoMode=True)
sucess = True
case "manual":
zone.switchMode(autoMode=False)
sucess = True
case "set_desired_humidity":
if (index and value):
zone = self.zoneManager.getZone(index)
zone.desiredHumidity = value
sucess = True
return render_template('action.html', translater=translater, zones=zoneManager.zones)
return render_template('action.html', translater=self.translater, zones=self.zoneManager.zones, sucess=sucess)
@app.route('/dashboard')
def showDashboard():
return render_template('dashboard.html', translater=translater, zones=zoneManager.zones)
@app.route('/dashboard')
def showDashboard():
return render_template('dashboard.html', translater=self.translater, zoneManager=self.zoneManager)
@app.route('/zones')
@app.route('/zones/<zoneNumber>')
def showZones(zoneNumber=False):
if (zoneNumber):
return render_template('zone.html', translater=translater, zone=zoneManager.getZone(zoneNumber))
else:
return render_template('zones.html', translater=translater, zones=zoneManager.zones)
@app.route('/zones')
@app.route('/zones/<zoneNumber>')
def showZones(zoneNumber=False):
if (zoneNumber):
return render_template('zone.html', translater=self.translater, zone=self.zoneManager.getZone(zoneNumber))
else:
return render_template('zones.html', translater=self.translater, zones=self.zoneManager.zones)
@app.route('/times')
def showTimes():
return render_template('times.html', translater=translater)
@app.route('/times')
def showTimes():
return render_template('times.html', translater=self.translater)
@app.route('/system')
def showSystem():
return render_template('system.html', translater=translater)
@app.route('/system')
def showSystem():
return render_template('system.html', translater=self.translater)
app.run(debug=True, port=port)
app.run(debug=True, port=self.port)

View File

@ -13,6 +13,9 @@ class Zone:
self.endTimeSetState = endTimeSetState
self.planedDuration = planedDuration
def setZoneManager(self, zoneManager):
self.zoneManager = zoneManager
def timeOver(self):
return time.time() > self.endTimeSetState
@ -20,7 +23,7 @@ class Zone:
match self.setState:
case 0:
if(self.desiredHumidity > self.actualHumidity):
self.state = True
self.zoneManager.switchZoneState(zone=self, state=True, duration=self.zoneManager.systemSettings.defaultAutoIrrigationDuration, instant=False)
else:
self.state = False
case 1:

View File

@ -5,6 +5,8 @@ class ZoneManager:
self.systemSettings = systemSettings
self.fileIO = FileIO
self.zones = fileIO.loadZones()
for zone in self.zones:
zone.setZoneManager(self)
self.pipeLine = []
def getZone(self, number):
@ -44,6 +46,7 @@ class ZoneManager:
def cronJobs(self):
self.refreshStates()
self.processPipeline()
print("Executed Cron Jobs of ZoneManager")

22
main.py
View File

@ -1,12 +1,22 @@
from Webserver import startWebserver
import threading
import time
from Webserver import Webserver
from ZoneManager import ZoneManager
from SystemSettings import SystemSettings
from FileIO import FileIO
systemSettings = SystemSettings(dataDir="/Data", multiZoneIrrigation=False, defaultAutoIrrigationDuration=10, defaultManualIrrigationDuration=10, defaultManualOffDuration=10, webDurationOptions=[5, 10, 15, 20, 25, 30, 45, 60])
fileIO = FileIO(systemSettings)
zoneManager = ZoneManager(systemSettings=systemSettings, fileIO=fileIO)
webserver = Webserver(zoneManager=zoneManager, port=80)
def cronJobs():
while True:
time.sleep(1)
zoneManager.cronJobs()
if __name__ == "__main__":
systemSettings = SystemSettings(dataDir="/Data", multiZoneIrrigation=True)
fileIO = FileIO(systemSettings)
zoneManager = ZoneManager(systemSettings=systemSettings, fileIO=fileIO)
startWebserver(port=80, zoneManager=zoneManager)
print("webserver started")
cronjob_Thread = threading.Thread(target=cronJobs)
cronjob_Thread.start()
webserver.startWebserver()