Verbesserungsvorschläge für Script

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Hallo,
das Script funktioniert gut allerding ähneln sich viele Funktionen sehr und es sind zwischen denen Funktionen nur unterschieden wie z.B.: Welche row soll ausgelesen werden oder was für ein Plotlabel angezeigt werden soll. Hat irgendwer eine Idee/Anregung wie ich das ganze Script sauberer Programmieren kann?

Code: Alles auswählen

from flask import Flask, render_template, url_for, request, make_response
import matplotlib 
matplotlib.use('agg') 
import matplotlib.pyplot as plt     #Csv Daten plotten
import datetime                     #Uhrzeit
import pytz                         #Zeitzone
import io                           #io
import os
from configparser import ConfigParser
import psycopg2
import config

app = Flask(__name__)

@app.route('/senddata', methods=['GET', 'POST'])
def senddata():

    if request.method == 'POST':
        data = request.data
        data = data.decode("utf-8", "replace")
        luftfeuchtigkeitdrin,temperaturdrin,luftfeuchtigkeitausen,temperaturausen,erdfeuchtigkeit,lux = data.split(',')

        insert_data(luftfeuchtigkeitdrin,temperaturdrin,luftfeuchtigkeitausen,temperaturausen,erdfeuchtigkeit,lux)
        return data
    return render_template('senddata.html')

@app.route('/image/luftfeuchtigkeit.png/<start>/<end>', methods=['GET', 'POST'])
def dataluft(start, end):
    time = []
    wertone = []
    werttwo = []
    rowone = 1
    rowtwo = 3
    my_dpi=96

    conn = psycopg2.connect( port = "5432")
    print ("Opened database successfully")
    cur = conn.cursor()
    cur.execute("SELECT TIMESTAMP, LUFTFEUCHTIGKEITDRIN, TEMPERATURDRIN, LUFTFEUCHTIGKEITAUSEN, TEMPERATURAUSEN, ERDFEUCHTIGKEIT, LUX  from MESSDATEN WHERE TIMESTAMP > '{0}' AND TIMESTAMP < '{1}'".format(start, end))
    rows = cur.fetchall()

    for row in rows:
        time.append(row[0])
        wertone.append(row[rowone])
        werttwo.append(row[rowtwo])
    
    fig, ax = plt.subplots(figsize=(600/my_dpi, 400/my_dpi), dpi=my_dpi)
    ax.plot(time, wertone, label='Luftfeuchtigkeit innen')
    ax.plot(time, werttwo, label='Luftfeuchtigkeit ausen')
    ax.grid(True)
    fig.legend()
    #ax.set_title('Luftfeuchtigkeit')
    ax.set_ylabel('Luftfeuchtigkeit in %')
    fig.autofmt_xdate()

    buffer = io.BytesIO()
    plt.savefig(buffer, format = 'png')
    plot_data = buffer.getvalue()

    response = make_response(plot_data)
    response.headers['Content-type'] = 'image/png'
    return response

@app.route('/image/temperatur.png/<start>/<end>', methods=['GET', 'POST'])
def datatemp(start, end):
    time = []
    wertone = []
    werttwo = []
    rowone = 2
    rowtwo = 4
    my_dpi=96

    conn = psycopg2.connect(port = "5432")
    print ("Opened database successfully")
    cur = conn.cursor()
    cur.execute("SELECT TIMESTAMP, LUFTFEUCHTIGKEITDRIN, TEMPERATURDRIN, LUFTFEUCHTIGKEITAUSEN, TEMPERATURAUSEN, ERDFEUCHTIGKEIT, LUX  from MESSDATEN WHERE TIMESTAMP > '{0}' AND TIMESTAMP < '{1}'".format(start, end))
    rows = cur.fetchall()

    for row in rows:
        time.append(row[0])
        wertone.append(row[rowone])
        werttwo.append(row[rowtwo])
    
    fig, ax = plt.subplots(figsize=(600/my_dpi, 400/my_dpi), dpi=my_dpi)
    ax.plot(time, wertone, label='Temperatur innen')
    ax.plot(time, werttwo, label='Temperatur ausen')
    ax.grid(True)
    fig.legend()
    #ax.set_title('Temperatur')
    ax.set_ylabel('Temperatur in °C')
    fig.autofmt_xdate()

    buffer = io.BytesIO()
    plt.savefig(buffer, format = 'png')
    plot_data = buffer.getvalue()

    response = make_response(plot_data)
    response.headers['Content-type'] = 'image/png'
    return response

@app.route('/image/erdfeuchtigkeit.png/<start>/<end>', methods=['GET', 'POST'])
def dataerde(start, end):
    time = []
    wertone = []
    rowone = 5
    my_dpi=96

    conn = psycopg2.connect( port = "5432")
    print ("Opened database successfully")
    cur = conn.cursor()
    cur.execute("SELECT TIMESTAMP, LUFTFEUCHTIGKEITDRIN, TEMPERATURDRIN, LUFTFEUCHTIGKEITAUSEN, TEMPERATURAUSEN, ERDFEUCHTIGKEIT, LUX  from MESSDATEN WHERE TIMESTAMP > '{0}' AND TIMESTAMP < '{1}'".format(start, end))
    rows = cur.fetchall()

    for row in rows:
        time.append(row[0])
        wertone.append(row[rowone])
    
    fig, ax = plt.subplots(figsize=(600/my_dpi, 400/my_dpi), dpi=my_dpi)
    ax.plot(time, wertone, label='Erdfeuchtigkeit')
    ax.grid(True)
    fig.legend()
    #ax.set_title('Erdfeuchtigkeit')
    ax.set_ylabel('Erdfeuchtigkeit in %')
    fig.autofmt_xdate()

    buffer = io.BytesIO()
    plt.savefig(buffer, format = 'png')
    plot_data = buffer.getvalue()

    response = make_response(plot_data)
    response.headers['Content-type'] = 'image/png'
    return response

@app.route('/image/lux.png/<start>/<end>', methods=['GET', 'POST'])
def datalux(start, end):
    time = []
    wertone = []
    rowone = 6
    my_dpi=96

    conn = psycopg2.connect( port = "5432")
    print ("Opened database successfully")
    cur = conn.cursor()
    cur.execute("SELECT TIMESTAMP, LUFTFEUCHTIGKEITDRIN, TEMPERATURDRIN, LUFTFEUCHTIGKEITAUSEN, TEMPERATURAUSEN, ERDFEUCHTIGKEIT, LUX  from MESSDATEN WHERE TIMESTAMP > '{0}' AND TIMESTAMP < '{1}'".format(start, end))
    rows = cur.fetchall()

    for row in rows:
        time.append(row[0])
        wertone.append(row[rowone])
    
    fig, ax = plt.subplots(figsize=(600/my_dpi, 400/my_dpi), dpi=my_dpi)
    ax.plot(time, wertone, label='Lichtitensität(lux)')
    ax.grid(True)
    fig.legend()
    #ax.set_title('Lichtitensität')
    ax.set_ylabel('Lichtitensität in Lux')
    fig.autofmt_xdate()

    buffer = io.BytesIO()
    plt.savefig(buffer, format = 'png')
    plot_data = buffer.getvalue()

    response = make_response(plot_data)
    response.headers['Content-type'] = 'image/png'
    return response

@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def index():
    start_date = "2018-01-01"
    start_time = "01:01"
    start = start_date + "_" + start_time
    end_date = "2019-01-01"
    end_time = "01:01"
    end = end_date + "_" + end_time

    data_one = ""
    srcluft = '/image/luftfeuchtigkeit.png/' + start + '/' + end
    srctemp = '/image/temperatur.png/' + start + '/' + end
    srcerde = '/image/erdfeuchtigkeit.png/' + start + '/' + end
    srclux = '/image/lux.png/' + start + '/' + end

    if request.method == 'POST':
        start_date = request.form['start_date']
        start_time = request.form['start_time']
        start = start_date + "_" + start_time
        end_date = request.form['end_date']
        end_time = request.form['end_time']
        end = end_date + "_" + end_time

        data_one = 2
        srcluft = '/image/luftfeuchtigkeit.png/' + start + '/' + end
        srctemp = '/image/temperatur.png/' + start + '/' + end
        srcerde = '/image/erdfeuchtigkeit.png/' + start + '/' + end
        srclux = '/image/lux.png/' + start + '/' + end
        
    dataluft(start, end)
    datatemp(start, end)
    dataerde(start, end)
    datalux(start, end)

    
    return render_template('index.html', data_one=data_one, srcluft=srcluft, srctemp=srctemp, srcerde=srcerde, srclux=srclux, start=start, end=end)      

def insert_data(luftfeuchtigkeitdrin,temperaturdrin,luftfeuchtigkeitausen,temperaturausen,erdfeuchtigkeit,lux):
    my_date = datetime.datetime.now(pytz.timezone('Europe/Berlin'))
    fmt = '%Y-%m-%d %H:%M'
    conn = psycopg2.connect( port = "5432")
    print ("Opened database successfully")

    cur = conn.cursor()

    cur.execute("INSERT INTO MESSDATEN (TIMESTAMP,LUFTFEUCHTIGKEITDRIN,TEMPERATURDRIN,LUFTFEUCHTIGKEITAUSEN,TEMPERATURAUSEN,ERDFEUCHTIGKEIT,LUX) \
        VALUES (%s, %s, %s, %s, %s, %s, %s)", (my_date.strftime(fmt) ,luftfeuchtigkeitdrin, temperaturdrin, luftfeuchtigkeitausen, temperaturausen, erdfeuchtigkeit, lux)) 

    conn.commit()
    print ("Records created successfully")
    conn.close()
    
if __name__ == '__main__': app.run(debug=True)
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hypec: ich glaube das Problem habe ich Dir schon vor einem halben Jahr gelöst.

MAN FORMATIERT KEINE DATEN IN EIN SQL-STATEMENT! Man benutzt Platzhalter. Statt > und < benutzt man BETWEEN.

In `index` werden die ganzen src...-Variablen doppelt definiert, das reicht einmal nach dem if.
Die ganzen `data...`-Aufrufe sind unsinnig.

Statt Strings als Datum in die Tabelle zu schreiben, solltest Du direkt TIMESTAMP aka datetime-Objekte schreiben.
Antworten