#!/usr/bin/python from flask import Flask, render_template, jsonify, request from datetime import datetime from flask.wrappers import Request import redis import socket from werkzeug.utils import redirect #create a socket object s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #connect to the server on local computer s.connect(("8.8.8.8", 80)) #assegno a variabile indirizzo ip per usi futuri ipv4 = s.getsockname()[0] s.close() #volendo stampo a video IPv4 #print("Indirizzo Ipv4 assegnato: ",s.getsockname()[0]) #configurazione per lavorare su server redis locale REDIS_PORT = 6379 REDIS_HOST = '127.0.0.1' redSrv0 = redis.Redis( host=REDIS_HOST, port=REDIS_PORT, db=0) #funzione per leggere e decodificare da redis def getRedisVal(redisKey): return redSrv0.get(redisKey).decode('utf-8') flaskApp = Flask(__name__) @flaskApp.route("/") #funzione main: passa al template home il titolo def main(): channelsData = { 'title' : 'Home' } #assegno il template html di riferimento return render_template('home.html', **channelsData) @flaskApp.route("/logger") #funzione logger, route a pagina /logger def logger(): channelsData = { 'title' : 'Logger', 'timeSrv' : getRedisVal('RTDATA:TIME:SRV'), 'timeLog' : getRedisVal('RTDATA:TIME:LOG'), 'Freq' : getRedisVal('SETTINGS:LOG:FREQ'), 'Ch0' : getRedisVal('RTDATA:CH:0'), 'Ch1' : getRedisVal('RTDATA:CH:1'), 'Ch2' : getRedisVal('RTDATA:CH:2'), 'Ch3' : getRedisVal('RTDATA:CH:3'), 'Ch4' : getRedisVal('RTDATA:CH:4'), 'Ch5' : getRedisVal('RTDATA:CH:5'), 'Ch6' : getRedisVal('RTDATA:CH:6'), 'Ch7' : getRedisVal('RTDATA:CH:7'), 'Out0' : getRedisVal('RTDATA:OUT:0'), 'Out1' : getRedisVal('RTDATA:OUT:1'), 'Out2' : getRedisVal('RTDATA:OUT:2'), 'Out3' : getRedisVal('RTDATA:OUT:3'), 'Out4' : getRedisVal('RTDATA:OUT:4'), 'Out5' : getRedisVal('RTDATA:OUT:5'), 'Out6' : getRedisVal('RTDATA:OUT:6'), 'Out7' : getRedisVal('RTDATA:OUT:7') } #assegno il template html di riferimento return render_template('logger.html', **channelsData) @flaskApp.route("/settings") #funzione setup, route a pagina /setup def setup(): channelsData = { 'title' : 'Settings', 'Freq' : getRedisVal('SETTINGS:LOG:FREQ'), 'Ch0' : getRedisVal('RTDATA:CH:0'), 'Ch1' : getRedisVal('RTDATA:CH:1'), 'Ch2' : getRedisVal('RTDATA:CH:2'), 'Ch3' : getRedisVal('RTDATA:CH:3'), 'Ch4' : getRedisVal('RTDATA:CH:4'), 'Ch5' : getRedisVal('RTDATA:CH:5'), 'Ch6' : getRedisVal('RTDATA:CH:6'), 'Ch7' : getRedisVal('RTDATA:CH:7'), 'Out0' : getRedisVal('RTDATA:OUT:0'), 'Out1' : getRedisVal('RTDATA:OUT:1'), 'Out2' : getRedisVal('RTDATA:OUT:2'), 'Out3' : getRedisVal('RTDATA:OUT:3'), 'Out4' : getRedisVal('RTDATA:OUT:4'), 'Out5' : getRedisVal('RTDATA:OUT:5'), 'Out6' : getRedisVal('RTDATA:OUT:6'), 'Out7' : getRedisVal('RTDATA:OUT:7') } #assegno il template html di riferimento return render_template('settings.html', **channelsData) @flaskApp.route("/about") #funzione about, route a pagina /about def about(): channelsData = { 'title' : 'About' } #assegno il template html di riferimento return render_template('about.html', **channelsData) # definisco una NUOVA route a cui rispondere su chiamta in metodo GET x restituire dati aggiornati @flaskApp.route("/api/v1/channels/all", methods=['GET']) def api_channels_all(): numCh = redSrv0.get('SETTINGS:SELECTED_CH').decode('utf-8') #funzione api_channels_all: legge direttamente da redis, ritorna jsonify channelsData = { 'timeSrv' : getRedisVal('RTDATA:TIME:SRV'), 'timeLog' : getRedisVal('RTDATA:TIME:LOG'), 'Freq' : getRedisVal('SETTINGS:LOG:FREQ'), 'Ch0' : getRedisVal('RTDATA:CH:0'), 'Ch1' : getRedisVal('RTDATA:CH:1'), 'Ch2' : getRedisVal('RTDATA:CH:2'), 'Ch3' : getRedisVal('RTDATA:CH:3'), 'Ch4' : getRedisVal('RTDATA:CH:4'), 'Ch5' : getRedisVal('RTDATA:CH:5'), 'Ch6' : getRedisVal('RTDATA:CH:6'), 'Ch7' : getRedisVal('RTDATA:CH:7'), 'Out0' : getRedisVal('RTDATA:OUT:0'), 'Out1' : getRedisVal('RTDATA:OUT:1'), 'Out2' : getRedisVal('RTDATA:OUT:2'), 'Out3' : getRedisVal('RTDATA:OUT:3'), 'Out4' : getRedisVal('RTDATA:OUT:4'), 'Out5' : getRedisVal('RTDATA:OUT:5'), 'Out6' : getRedisVal('RTDATA:OUT:6'), 'Out7' : getRedisVal('RTDATA:OUT:7'), 'ChScaleMax' : getRedisVal('SETTINGS:IN:MAX:'+str(numCh)), 'ChScaleMin' : getRedisVal('SETTINGS:IN:MIN:'+str(numCh)), 'ChRealMax' : getRedisVal('SETTINGS:OUT:MAX:'+str(numCh)), 'ChRealMin' : getRedisVal('SETTINGS:OUT:MIN:'+str(numCh)), 'LastSessionName' : getRedisVal('RTDATA:SESSION:NAME') } # restituisce in formato json i dati letti da redis return jsonify(channelsData) # definisco una NUOVA route a cui rispondere su chiamta in metodo GET x restituire dati aggiornati @flaskApp.route("/api/v1/channels/current", methods=['GET']) def api_channels_current(): numCh = redSrv0.get('SETTINGS:SELECTED_CH').decode('utf-8') #funzione api_channels_all: legge direttamente da redis, ritorna jsonify result = { 'numCh' : numCh, 'timeSrv' : getRedisVal('RTDATA:TIME:SRV'), 'timeLog' : getRedisVal('RTDATA:TIME:LOG'), 'Freq' : getRedisVal('SETTINGS:LOG:FREQ'), 'CurrIn' : getRedisVal('RTDATA:CH:'+str(numCh)), 'CurrOut' : getRedisVal('RTDATA:OUT:'+str(numCh)), 'MaxOut' : getRedisVal('SETTINGS:OUT:MAX:'+str(numCh)), 'MinOut' : getRedisVal('SETTINGS:OUT:MIN:'+str(numCh)), 'MaxIn' : getRedisVal('SETTINGS:IN:MAX:'+str(numCh)), 'MinIn' : getRedisVal('SETTINGS:IN:MIN:'+str(numCh)) } # restituisce in formato json i dati letti da redis return jsonify(result) # Route di comando x LOG: start e stop @flaskApp.route("/api/v1/log/start", methods=['PUT']) def start_log(): #funzione start_log: scrive su redis LOG:STATUS -> 1 redSrv0.set('SETTINGS:LOG:STATUS', 1) #data e time ora lastDate = datetime.now() #formato per data e time: dd/mm/YYYY H:M:S format = "%d/%m/%Y_%H:%M:%S" #format date e time adando strftime() nameDate = lastDate.strftime(format) + ".csv" redSrv0.set('RTDATA:SESSION:NAME', nameDate) return "OK" @flaskApp.route("/api/v1/log/stop", methods=['PUT']) def stop_log(): #funzione stop_log: scrive su redis LOG:STATUS -> 0 redSrv0.set('SETTINGS:LOG:STATUS', 0) redSrv0.set('RTDATA:SESSION:NAME', "-") return "OK" @flaskApp.route("/api/v1/setup/saveInMin", methods=['PUT']) def setupInMin(): # devo leggere il channel attualmente selezionato indCh = getRedisVal('SETTINGS:SELECTED_CH') currChVal = redSrv0.get('RTDATA:CH:'+ str(indCh)) redSrv0.set('SETTINGS:IN:MIN:'+ str(indCh), currChVal) return redirect("/settings") @flaskApp.route("/api/v1/setup/saveInMax", methods=['PUT']) def setupInMax(): # devo leggere il channel attualmente selezionato indCh = getRedisVal('SETTINGS:SELECTED_CH') currChVal = redSrv0.get('RTDATA:CH:'+ str(indCh)) redSrv0.set('SETTINGS:IN:MAX:'+ str(indCh), currChVal) return redirect("/settings") @flaskApp.route("/api/v1/setup/selectChannel/", methods=['PUT']) def selectChannel(numCh): print(numCh) # request_data = request.get_json() # # devo leggere il channel attualmente selezionato, x ora cablo a 0... # numCh = request_data['channel'] redSrv0.set('SETTINGS:SELECTED_CH', numCh) return "OK" @flaskApp.route("/api/v1/frequency", methods=['POST']) def setFrequency(): #funzione set frequenza scrive su redis LOG:FREQ prendendolo dall'input in pagina html con nome LogFreq newFrequency = request.form['LogFreq'] redSrv0.set('SETTINGS:LOG:FREQ', newFrequency) # rimando in settings return redirect("/settings") @flaskApp.route("/api/v1/scaleout", methods=['POST']) def setScale(): indexCh = redSrv0.get('SETTINGS:SELECTED_CH').decode('utf-8') scaleMin = request.form['MinOut'] redSrv0.set('SETTINGS:OUT:MIN:'+ str(indexCh), scaleMin) scaleMax = request.form['MaxOut'] redSrv0.set('SETTINGS:OUT:MAX:'+ str(indexCh), scaleMax) # rimando in settings return redirect("/settings") #dichiaro host ipv4 (ottenuto sopra utilizzando il modulo socket) if __name__ == "__main__": flaskApp.run(host=ipv4, port=80, debug=True)