implemented Webhooks

This commit is contained in:
schrom01 2022-08-16 03:13:10 +02:00
parent f1d73676f5
commit 69d9638456
7 changed files with 114 additions and 73 deletions

View File

@ -8,5 +8,5 @@ class FileIO:
def loadZones(self): def loadZones(self):
zones = [] zones = []
for i in range(12): 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 return zones

View File

@ -1,6 +1,10 @@
class SystemSettings: 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.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", "automatic mode": "Automatikbetrieb",
"switch to manual mode": "Auf Handbetrieb umstellen", "switch to manual mode": "Auf Handbetrieb umstellen",
"switch to automatic mode": "Auf Automatikbetrieb 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 import Flask, render_template, request, redirect, url_for
from flask_navigation import Navigation from flask_navigation import Navigation
from Webserver.Translater import Translater, Language from Webserver.Translater import Translater, Language
from Zone import Zone
def startWebserver(port, zoneManager): class Webserver:
translater_EN = Translater(Language.ENGLISH) def __init__(self, zoneManager, port=80):
translater_DE = Translater(Language.GERMAN) self.port = port
translater = translater_EN 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") def startWebserver(self):
nav = Navigation(app) app = Flask("Bewässerungssystem", template_folder="Webserver/templates", static_folder="Webserver/static")
nav = Navigation(app)
nav.Bar('top', [ nav.Bar('top', [
nav.Item(translater.getTranslation('Dashboard'), 'showDashboard'), nav.Item(self.translater.getTranslation('Dashboard'), 'showDashboard'),
nav.Item(translater.getTranslation('irrigation zones'), 'showZones'), nav.Item(self.translater.getTranslation('irrigation zones'), 'showZones'),
nav.Item(translater.getTranslation('blocking times'), 'showTimes'), nav.Item(self.translater.getTranslation('blocking times'), 'showTimes'),
nav.Item(translater.getTranslation('system settings'), 'showSystem') nav.Item(self.translater.getTranslation('system settings'), 'showSystem')
# nav.Item('Gfg', 'gfg', {'page': 5}), #(example with pages) # nav.Item('Gfg', 'gfg', {'page': 5}), #(example with pages)
]) ])
# Example Route with pages: # Example Route with pages:
# @app.route('/gfg/<int:page>') # @app.route('/gfg/<int:page>')
# def gfg(page): # def gfg(page):
# return render_template('gfg.html', page=page) # return render_template('gfg.html', page=page)
@app.route('/') @app.route('/')
def startPage(): def startPage():
return redirect(url_for('showDashboard')) return redirect(url_for('showDashboard'))
@app.route('/action/<command>/<index_str>/<value_str>') @app.route('/action', methods=['GET', 'POST'])
def executeAction(command=False, index_str=False, value_str=False): @app.route('/action/<command>', methods=['GET', 'POST'])
sucess = False @app.route('/action/<command>/<index_str>', methods=['GET', 'POST'])
index = int(index_str) @app.route('/action/<command>/<index_str>/<value_str>', methods=['GET', 'POST'])
value = int(value_str) def executeAction(command=False, index_str=False, value_str=False):
match command: sucess = False
case "switch_zone_on": try:
if (index and value): index = int(index_str)
zoneManager.switchZoneIndexState(zoneIndex=index, state=True, duration=value) value = int(value_str)
case "switch_zone_off": except:
if (index and value): pass
zoneManager.switchZoneIndexState(zoneIndex=index, state=False, duration=value) match command:
case "switch_zone_mode": case "switch_zone_on":
if (index and value): if (index and value):
zone = zoneManager.getZone(index) self.zoneManager.switchZoneIndexState(zoneIndex=index, state=True, duration=value)
match value: sucess = True
case "automatic": elif(index):
zone.switchMode(autoMode=True) self.zoneManager.switchZoneIndexState(zoneIndex=index, state=True, duration=self.zoneManager.systemSettings.defaultManualIrrigationDuration)
case "manual": sucess = True
zone.switchMode(autoMode=False) case "switch_zone_off":
case "set_desired_humidity": if (index and value):
if (index and value): self.zoneManager.switchZoneIndexState(zoneIndex=index, state=False, duration=value, instant=True)
zone = zoneManager.getZone(index) sucess = True
zone.desiredHumidity = value 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') @app.route('/dashboard')
def showDashboard(): def showDashboard():
return render_template('dashboard.html', translater=translater, zones=zoneManager.zones) return render_template('dashboard.html', translater=self.translater, zoneManager=self.zoneManager)
@app.route('/zones') @app.route('/zones')
@app.route('/zones/<zoneNumber>') @app.route('/zones/<zoneNumber>')
def showZones(zoneNumber=False): def showZones(zoneNumber=False):
if (zoneNumber): if (zoneNumber):
return render_template('zone.html', translater=translater, zone=zoneManager.getZone(zoneNumber)) return render_template('zone.html', translater=self.translater, zone=self.zoneManager.getZone(zoneNumber))
else: else:
return render_template('zones.html', translater=translater, zones=zoneManager.zones) return render_template('zones.html', translater=self.translater, zones=self.zoneManager.zones)
@app.route('/times') @app.route('/times')
def showTimes(): def showTimes():
return render_template('times.html', translater=translater) return render_template('times.html', translater=self.translater)
@app.route('/system') @app.route('/system')
def showSystem(): def showSystem():
return render_template('system.html', translater=translater) 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.endTimeSetState = endTimeSetState
self.planedDuration = planedDuration self.planedDuration = planedDuration
def setZoneManager(self, zoneManager):
self.zoneManager = zoneManager
def timeOver(self): def timeOver(self):
return time.time() > self.endTimeSetState return time.time() > self.endTimeSetState
@ -20,7 +23,7 @@ class Zone:
match self.setState: match self.setState:
case 0: case 0:
if(self.desiredHumidity > self.actualHumidity): if(self.desiredHumidity > self.actualHumidity):
self.state = True self.zoneManager.switchZoneState(zone=self, state=True, duration=self.zoneManager.systemSettings.defaultAutoIrrigationDuration, instant=False)
else: else:
self.state = False self.state = False
case 1: case 1:

View File

@ -5,6 +5,8 @@ class ZoneManager:
self.systemSettings = systemSettings self.systemSettings = systemSettings
self.fileIO = FileIO self.fileIO = FileIO
self.zones = fileIO.loadZones() self.zones = fileIO.loadZones()
for zone in self.zones:
zone.setZoneManager(self)
self.pipeLine = [] self.pipeLine = []
def getZone(self, number): def getZone(self, number):
@ -44,6 +46,7 @@ class ZoneManager:
def cronJobs(self): def cronJobs(self):
self.refreshStates() self.refreshStates()
self.processPipeline() 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 ZoneManager import ZoneManager
from SystemSettings import SystemSettings from SystemSettings import SystemSettings
from FileIO import FileIO 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__": if __name__ == "__main__":
systemSettings = SystemSettings(dataDir="/Data", multiZoneIrrigation=True) cronjob_Thread = threading.Thread(target=cronJobs)
fileIO = FileIO(systemSettings) cronjob_Thread.start()
zoneManager = ZoneManager(systemSettings=systemSettings, fileIO=fileIO) webserver.startWebserver()
startWebserver(port=80, zoneManager=zoneManager)
print("webserver started")