diff --git a/FileIO/__init__.py b/FileIO/__init__.py index 0c6ff54..b717e6b 100644 --- a/FileIO/__init__.py +++ b/FileIO/__init__.py @@ -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 diff --git a/SystemSettings.py b/SystemSettings.py index 0ca6a50..1891b36 100644 --- a/SystemSettings.py +++ b/SystemSettings.py @@ -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 \ No newline at end of file + self.multiZoneIrrigation = multiZoneIrrigation + self.defaultAutoIrrigationDuration = defaultAutoIrrigationDuration + self.defaultManualIrrigationDuration = defaultManualIrrigationDuration + self.defaultManualOffDuration = defaultManualOffDuration + self.webDurationOptions = webDurationOptions \ No newline at end of file diff --git a/Webserver/Translater.py b/Webserver/Translater.py index fb9f9b0..5dfa484 100644 --- a/Webserver/Translater.py +++ b/Webserver/Translater.py @@ -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", } diff --git a/Webserver/__init__.py b/Webserver/__init__.py index d71fa3b..3c0bf0c 100644 --- a/Webserver/__init__.py +++ b/Webserver/__init__.py @@ -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/') - # def gfg(page): - # return render_template('gfg.html', page=page) + # Example Route with pages: + # @app.route('/gfg/') + # 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///') - 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/', methods=['GET', 'POST']) + @app.route('/action//', methods=['GET', 'POST']) + @app.route('/action///', 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/') - 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/') + 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) diff --git a/Zone.py b/Zone.py index 457f84f..56ca729 100644 --- a/Zone.py +++ b/Zone.py @@ -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: diff --git a/ZoneManager.py b/ZoneManager.py index eb3fc7f..516e840 100644 --- a/ZoneManager.py +++ b/ZoneManager.py @@ -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") diff --git a/main.py b/main.py index 5a46f41..93cfb6e 100644 --- a/main.py +++ b/main.py @@ -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") \ No newline at end of file + cronjob_Thread = threading.Thread(target=cronJobs) + cronjob_Thread.start() + webserver.startWebserver()