Seite 1 von 1

Verbesserungsvorschläge für Script

Verfasst: Montag 17. Dezember 2018, 18:12
von Hypec
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)

Re: Verbesserungsvorschläge für Script

Verfasst: Montag 17. Dezember 2018, 18:49
von Sirius3
@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.