Grafiken Spiegelverkehrt

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Hallo,
kann mir irgendwer vlt. erklären warum ich meine Grafiken wenn ich die Funktion datatime ausführe so bekomme das links der älteste und rechts der neuste Wert angezeigt wird und in der Funktion data dies genau andersherum angezeigt wird obwohl sie gleich aufgebaut ist wie datatime?

Code: Alles auswählen

PLOTS = {
    'luftfeuchtigkeit': {
        'label1': 'Luftfeuchtigkeit innen',
        'label2': 'Luftfeuchtigkeit ausen',
        'ylabel': 'Luftfeuchtigkeit in %',
        'rowone': 1,
        'rowtwo': 3
    },
    'temperatur': {
        'label1': 'Temperatur innen',
        'label2': 'Temperatur ausen',
        'ylabel': 'Temperatur in °C',
        'rowone': 2,
        'rowtwo': 4
    },
    'erdfeuchtigkeit': {
        'label1': 'Erdfeuchtigkeit',
        'ylabel': 'Erdfeuchtigkeit ins %',
        'rowone': 5
    },
    'lux': {
        'label1': 'Lichtitensität(lux)',
        'ylabel': 'Lichtitensität in Lux',
        'rowone': 6
    },
}

app = Flask(__name__)

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

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

    plot = PLOTS[datatype]
    for row in rows:
        time.append(row[0])
        wertone.append(row[plot['rowone']])
        if datatype == 'luftfeuchtigkeit' or datatype == 'temperatur':
            werttwo.append(row[plot['rowtwo']])
    
    fig, ax = plt.subplots(figsize=(600/my_dpi, 400/my_dpi), dpi=my_dpi)
    ax.plot(time, wertone, label=plot['label1'])
    if datatype == 'luftfeuchtigkeit' or datatype == 'temperatur':
        ax.plot(time, werttwo, label=plot['label2'])
    ax.grid(True)
    fig.legend()
    ax.set_ylabel(plot['ylabel'])
    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/<datatype>.png/<ask_length>', methods=['GET', 'POST'])
def data(datatype, ask_length):
    time = []
    wertone = []
    werttwo = []
    rowone = 1
    rowtwo = 3
    my_dpi=96

    ask_length = int(ask_length)

    conn = psycopg2.connect( port = "5432")
    print ("Opened database " + datatype + " successfully")
    cur = conn.cursor()
    cur.execute("SELECT TIMESTAMP, LUFTFEUCHTIGKEITDRIN, TEMPERATURDRIN, LUFTFEUCHTIGKEITAUSEN, TEMPERATURAUSEN, ERDFEUCHTIGKEIT, LUX  FROM messdaten ORDER BY timestamp DESC LIMIT '{0}'".format(ask_length)) 
    rows = cur.fetchall()

    plot = PLOTS[datatype]
    for row in rows:
        time.append(row[0])
        wertone.append(row[plot['rowone']])
        if datatype == 'luftfeuchtigkeit' or datatype == 'temperatur':
            werttwo.append(row[plot['rowtwo']])
    
    fig, ax = plt.subplots(figsize=(600/my_dpi, 400/my_dpi), dpi=my_dpi)
    ax.plot(time, wertone, label=plot['label1'])
    if datatype == 'luftfeuchtigkeit' or datatype == 'temperatur':
        ax.plot(time, werttwo, label=plot['label2'])
    ax.grid(True)
    fig.legend()
    ax.set_ylabel(plot['ylabel'])
    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/'
    srctemp = '/image/'
    srcerde = '/image/'
    srclux = '/image/'

    srcluftask = '/image/'
    srctempask = '/image/'
    srcerdeask = '/image/'
    srcluxask = '/image/'

    last = ""
    ask_length = ""

    if request.method == 'GET':
        ask_length = "24"
        datatype = 'luftfeuchtigkeit'
        srcluftask = '/image/' + datatype + '.png/' + ask_length
        data(datatype, ask_length)
            
        datatype = 'temperatur'
        srctempask = '/image/' + datatype + '.png/' + ask_length
        data(datatype, ask_length)

        datatype = 'erdfeuchtigkeit'
        srcerdeask = '/image/' + datatype + '.png/' + ask_length
        data(datatype, ask_length)

        datatype = 'lux'
        srcluxask = '/image/' + datatype + '.png/' + ask_length
        data(datatype, ask_length)
    elif request.method == 'POST':
        if 'rr' in request.form:
            last = request.form['rr']
            if last == 'tag':
                ask_length = "24"
                datatype = 'luftfeuchtigkeit'
                srcluftask = '/image/' + datatype + '.png/' + ask_length
                data(datatype, ask_length)
            
                datatype = 'temperatur'
                srctempask = '/image/' + datatype + '.png/' + ask_length
                data(datatype, ask_length)

                datatype = 'erdfeuchtigkeit'
                srcerdeask = '/image/' + datatype + '.png/' + ask_length
                data(datatype, ask_length)

                datatype = 'lux'
                srcluxask = '/image/' + datatype + '.png/' + ask_length
                data(datatype, ask_length)
            elif last == 'woche':
                ask_length = "168"
                datatype = 'luftfeuchtigkeit'
                srcluftask = '/image/' + datatype + '.png/' + ask_length
                data(datatype, ask_length)
            
                datatype = 'temperatur'
                srctempask = '/image/' + datatype + '.png/' + ask_length
                data(datatype, ask_length)

                datatype = 'erdfeuchtigkeit'
                srcerdeask = '/image/' + datatype + '.png/' + ask_length
                data(datatype, ask_length)

                datatype = 'lux'
                srcluxask = '/image/' + datatype + '.png/' + ask_length
            else:
                ask_length = "720"
                datatype = 'luftfeuchtigkeit'
                srcluftask = '/image/' + datatype + '.png/' + ask_length
                data(datatype, ask_length)
            
                datatype = 'temperatur'
                srctempask = '/image/' + datatype + '.png/' + ask_length
                data(datatype, ask_length)

                datatype = 'erdfeuchtigkeit'
                srcerdeask = '/image/' + datatype + '.png/' + ask_length
                data(datatype, ask_length)

                datatype = 'lux'
                srcluxask = '/image/' + datatype + '.png/' + ask_length
        elif 'date' in request.form:
            print ('date')
            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
        
            datatype = 'luftfeuchtigkeit'
            srcluft = '/image/' + datatype + '.png/' + start + '/' + end
            datatime(datatype, start, end)

            datatype = 'temperatur'
            srctemp = '/image/' + datatype + '.png/' + start + '/' + end
            datatime(datatype, start, end)

            datatype = 'erdfeuchtigkeit'
            srcerde = '/image/' + datatype + '.png/' + start + '/' + end
            datatime(datatype, start, end)

            datatype = 'lux'
            srclux = '/image/' + datatype + '.png/' + start + '/' + end
            datatime(datatype, start, end)

            #letzter tag
            ask_length = "24"
            datatype = 'luftfeuchtigkeit'
            srcluftask = '/image/' + datatype + '.png/' + ask_length
            data(datatype, ask_length)
            
            datatype = 'temperatur'
            srctempask = '/image/' + datatype + '.png/' + ask_length
            data(datatype, ask_length)

            datatype = 'erdfeuchtigkeit'
            srcerdeask = '/image/' + datatype + '.png/' + ask_length
            data(datatype, ask_length)

            datatype = 'lux'
            srcluxask = '/image/' + datatype + '.png/' + ask_length
            data(datatype, ask_length)

    conn = psycopg2.connect(port = "5432")
    print ("Opened database successfully")
    cur = conn.cursor()
    cur.execute("SELECT timestamp, luftfeuchtigkeitdrin, temperaturdrin, luftfeuchtigkeitausen, temperaturausen, erdfeuchtigkeit, lux FROM messdaten ORDER BY timestamp DESC LIMIT 1")
    row = cur.fetchall()

    row = str(row)
    row = row.replace("(", "")
    row = row.replace(")", "")
    row = row.replace("[", "")
    row = row.replace("]", "")
    row = row.replace("'", "")
    timestamp, luftfeuchtigkeitdrin, temperaturdrin, luftfeuchtigkeitausen, temperaturausen, erdfeuchtigkeit, lux = row.split(", ")

    return render_template('index.html', data_one=data_one, srcluftask=srcluftask, srctempask=srctempask, srcerdeask=srcerdeask, srcluxask=srcluxask, srcluft=srcluft, srctemp=srctemp, srcerde=srcerde, srclux=srclux, timestamp=timestamp, luftfeuchtigkeitdrin=luftfeuchtigkeitdrin, temperaturdrin=temperaturdrin, luftfeuchtigkeitausen=luftfeuchtigkeitausen, temperaturausen=temperaturausen, erdfeuchtigkeit=erdfeuchtigkeit, lux=lux)    
 
 if __name__ == '__main__': app.run(debug=True)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hypec: irgendwie habe ich das Gefühl, da kann man schreiben was man will, es kommt nicht an.
MAN FORMATIERT KEINE PARAMETER IN SQL-STATEMENTS!!!!!
`datatime` und `data` sehen so gleich aus, das kann man bestimmt einfach in eine Funktion zusammenfassen. In `index` steht gefühlt 8mal der selbe Code und alle data und datatime-Aufrufe sind ÜBERFLÜSSIG!
Und nein, es ist keine gute IDEE, die Stringrepräsentation einer Liste, die nur für Debuggingzwecke da ist, zu nehmen und so lange mit replace zu bearbeiten, bis etwas rauskommt, das scheinbar dem entspricht, was man haben möchte, statt einfach Tupleunpacking zu benutzen.
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Ich hab jetzt data und datatime zusammen gefügt und die aufrufe von data entfernt und die anderen Definitionen zusammengefasst das was ich mit formatieren von SQL STATEMENTS verbinde habe ich auch geändert, den Rest mach ich nach dem Urlaub mein eigentliches Problem mit den verdrehten Werten besteht aber immernoch.

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

PLOTS = {
    'luftfeuchtigkeit': {
        'label1': 'Luftfeuchtigkeit innen',
        'label2': 'Luftfeuchtigkeit ausen',
        'ylabel': 'Luftfeuchtigkeit in %',
        'rowone': 1,
        'rowtwo': 3
    },
    'temperatur': {
        'label1': 'Temperatur innen',
        'label2': 'Temperatur ausen',
        'ylabel': 'Temperatur in °C',
        'rowone': 2,
        'rowtwo': 4
    },
    'erdfeuchtigkeit': {
        'label1': 'Erdfeuchtigkeit',
        'ylabel': 'Erdfeuchtigkeit ins %',
        'rowone': 5
    },
    'lux': {
        'label1': 'Lichtitensität(lux)',
        'ylabel': 'Lichtitensität in Lux',
        'rowone': 6
    },
}

app = Flask(__name__)

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

    execute_type = ""
    if ask_type == "1" :
        execute_type = "ORDER BY timestamp DESC LIMIT " + ask_length
    elif ask_type == "2":
        execute_type = "WHERE TIMESTAMP BETWEEN '" + start + "' AND  '" + end + "'"

    conn = psycopg2.connect(port = "5432")
    print ("Opened database " + datatype + " successfully")
    cur = conn.cursor()
    cur.execute("SELECT TIMESTAMP, LUFTFEUCHTIGKEITDRIN, TEMPERATURDRIN, LUFTFEUCHTIGKEITAUSEN, TEMPERATURAUSEN, ERDFEUCHTIGKEIT, LUX  FROM messdaten " + execute_type) 
    rows = cur.fetchall()

    plot = PLOTS[datatype]
    for row in rows:
        time.append(row[0])
        wertone.append(row[plot['rowone']])
        if datatype == 'luftfeuchtigkeit' or datatype == 'temperatur':
            werttwo.append(row[plot['rowtwo']])
    
    fig, ax = plt.subplots(figsize=(600/my_dpi, 400/my_dpi), dpi=my_dpi)
    ax.plot(time, wertone, label=plot['label1'])
    if datatype == 'luftfeuchtigkeit' or datatype == 'temperatur':
        ax.plot(time, werttwo, label=plot['label2'])
    ax.grid(True)
    fig.legend()
    ax.set_ylabel(plot['ylabel'])
    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"
    end_date = "2019-01-01"
    end_time = "01:01"
    data_one = ""
    
    datatype = ''
    ask_type = "0"
    ask_length = ""
    start = start_date + "_" + start_time
    end = end_date + "_" + end_time

    srcluft = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end
    srctemp = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end
    srcerde = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end
    srclux = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end

    srcluftask = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end
    srctempask = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end
    srcerdeask = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end    
    srcluxask = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end

    start_src = 0
    start_src_ask = 0

    if request.method == 'GET':
        ask_type = "1"
        ask_length = "24"
        start_src_ask = 1
    elif request.method == 'POST':
        if 'rr' in request.form:
            last = request.form['rr']
            if last == 'tag':
                ask_type = "1"
                ask_length = "24"            
                start_src_ask = 1
            elif last == 'woche':
                ask_type = "1"
                ask_length = "168"
                start_src_ask = 1
            else:
                ask_type = "1"
                ask_length = "720"
                start_src_ask = 1
        elif 'date' in request.form:
            ask_type = "2"
            ask_length = "24"
            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
            start_src = 1
            
            #letzter tag
            ask_type = "1"
            datatype = ""
            start_src_ask = 1

    if start_src_ask == 1:
        datatype = 'luftfeuchtigkeit'
        srcluftask = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end
   
        datatype = 'temperatur'
        srctempask = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end
    
        datatype = 'erdfeuchtigkeit'
        srcerdeask = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end
    
        datatype = 'lux'
        srcluxask = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end
        x = 0
    
    if start_src == 1:
        datatype = 'luftfeuchtigkeit'
        srcluft = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end

        datatype = 'temperatur'
        srctemp = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end

        datatype = 'erdfeuchtigkeit'
        srcerde = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end

        datatype = 'lux'
        srclux = '/image/' + datatype + '.png/' + ask_type + '/' + ask_length + '/' + start + '/' + end

    conn = psycopg2.connect( port = "5432")
    print ("Opened database successfully")
    cur = conn.cursor()
    cur.execute("SELECT timestamp, luftfeuchtigkeitdrin, temperaturdrin, luftfeuchtigkeitausen, temperaturausen, erdfeuchtigkeit, lux FROM messdaten ORDER BY timestamp DESC LIMIT 1")
    row = cur.fetchall()

    row = str(row)
    row = row.replace("(", "")
    row = row.replace(")", "")
    row = row.replace("[", "")
    row = row.replace("]", "")
    row = row.replace("'", "")
    timestamp, luftfeuchtigkeitdrin, temperaturdrin, luftfeuchtigkeitausen, temperaturausen, erdfeuchtigkeit, lux = row.split(", ")

    return render_template('index.html', data_one=data_one, srcluftask=srcluftask, srctempask=srctempask, srcerdeask=srcerdeask, srcluxask=srcluxask, srcluft=srcluft, srctemp=srctemp, srcerde=srcerde, srclux=srclux, timestamp=timestamp, luftfeuchtigkeitdrin=luftfeuchtigkeitdrin, temperaturdrin=temperaturdrin, luftfeuchtigkeitausen=luftfeuchtigkeitausen, temperaturausen=temperaturausen, erdfeuchtigkeit=erdfeuchtigkeit, lux=lux)      

if __name__ == '__main__': app.run(debug=True)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hypec: Das mit den SQL-Anweisungen hast Du falsch verstanden: Es geht nicht darum ob man das nun mit `format()` oder mit ``+`` macht, das Problem ist das erstellen von SQL-Anweisungen als Zeichenketten mit Werten die Du da selbst reinbastelst. Und dann auch noch Teile die der Benutzer von aussen direkt vorgeben kann. Im besten Fall funktioniert das einfach nur nicht, wenn Du Pech hast probiert der Benutzer einfach mal aus was er da so reinbasteln kann um mit der Datenbank Spass zu haben. Angefangen vom Auslesen beliebiger Daten bis hin zum Verändern oder löschen von Daten oder gleich ganzen Tabellen. Für Werte gehören in das SQL nur Platzhalter und die Werte übergibt man dann `execute()` und lässt das Datenbankmodul das Problem *sicher* (und eventuell auch effizienter) lösen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dazu sei auch auf das Thema SQL-Injection verwiesen.
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Oke danke jetzt habe ich Verstanden was hierbei das Problem ist. Ich versuche dann jetzt mal mich mit der Sicherheitslücke zu befassen und das Problem richtig zu beseitigen.
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Also so wie ich es verstanden habe was ich gelesen habe sollte hiermit das Problem behoben sein, falls das nicht stimmt sagt es mir bitte. Hat irgendjemand eine Ahnung warum die Messwerte wenn ich die letzten 24 Werte abrufe in der falschen Reihenfolge angezeigt werden und wenn ich die Messwerte zwischen 2 Zeitpunkten abrufe sie in der richtigen Reihenfolge angezeigt werden?

Code: Alles auswählen

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

    execute_type = ""

    conn = psycopg2.connect(port = "5432")
    print ("Opened database " + datatype + " successfully")
    cur = conn.cursor()
    if ask_type == "1" :
        cur.execute("SELECT TIMESTAMP, LUFTFEUCHTIGKEITDRIN, TEMPERATURDRIN, LUFTFEUCHTIGKEITAUSEN, TEMPERATURAUSEN, ERDFEUCHTIGKEIT, LUX  from MESSDATEN ORDER BY timestamp DESC LIMIT (%s);", [ask_length])
    elif ask_type == "2":
        cur.execute("SELECT TIMESTAMP, LUFTFEUCHTIGKEITDRIN, TEMPERATURDRIN, LUFTFEUCHTIGKEITAUSEN, TEMPERATURAUSEN, ERDFEUCHTIGKEIT, LUX  from MESSDATEN WHERE TIMESTAMP BETWEEN (%s) AND (%s);", (start, end))

    rows = cur.fetchall()

    plot = PLOTS[datatype]
    for row in rows:
        time.append(row[0])
        wertone.append(row[plot['rowone']])
        if datatype == 'luftfeuchtigkeit' or datatype == 'temperatur':
            werttwo.append(row[plot['rowtwo']])
    
    fig, ax = plt.subplots(figsize=(600/my_dpi, 400/my_dpi), dpi=my_dpi)
    ax.plot(time, wertone, label=plot['label1'])
    if datatype == 'luftfeuchtigkeit' or datatype == 'temperatur':
        ax.plot(time, werttwo, label=plot['label2'])
    ax.grid(True)
    fig.legend()
    ax.set_ylabel(plot['ylabel'])
    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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Im ersten Fall sortierst Du die Werte absteigend, im zweiten gar nicht. In beiden Fällen mußt Du noch so sortieren, wie Du willst. Und in beiden SQL-Statements sind da noch zu viele Klammern.

Statt auf luftfeuchtigkeit oder temperatur würde man prüfen, ob ein Schlüssel rowtwo existiert.
Es fehlt ein plt.close(fig).
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Kann ich die Werte im ersten Fall auch mit reverse umdrehen da sie ja nur in der richtigenReihenfolge in die Datenbank eingetragen werden und nur in der umgekehrte dann ausgegeben werden. Der zweite Fall funktioniert ja auch richtig.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Es gibt keine Reihenfolge bei Datenbanktabellen. Da der erste Fall umgekehrt sortiert ist, geht ein reverse, beim zweiten Fall ist die Reihenfolge dagegen nicht garantiert und muß sortiert werden. Am einfachsten mit `ORDER BY timestamp DESC`, dann ist die Reihenfolge bei beiden Fällen gleich.
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Ich habe jetzt alles Gelöst und drehe das ganze mit reverse um hat noch jemand Verbessrungsvorschläge?

Code: Alles auswählen

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

    execute_type = ""

    conn = psycopg2.connect(port = "5432")
    print ("Opened database " + datatype + " successfully")
    cur = conn.cursor()
    if ask_type == "1" :
        cur.execute("SELECT TIMESTAMP, LUFTFEUCHTIGKEITDRIN, TEMPERATURDRIN, LUFTFEUCHTIGKEITAUSEN, TEMPERATURAUSEN, ERDFEUCHTIGKEIT, LUX  from MESSDATEN ORDER BY timestamp DESC LIMIT %s;", [ask_length])
    elif ask_type == "2":
        cur.execute("SELECT TIMESTAMP, LUFTFEUCHTIGKEITDRIN, TEMPERATURDRIN, LUFTFEUCHTIGKEITAUSEN, TEMPERATURAUSEN, ERDFEUCHTIGKEIT, LUX  from MESSDATEN WHERE TIMESTAMP BETWEEN %s AND %s ORDER BY timestamp DESC;", (start, end))

    rows = cur.fetchall()

    plot = PLOTS[datatype]
    for row in rows:
        time.append(row[0])
        wertone.append(row[plot['rowone']])
        if 'rowtwo' in plot:
            werttwo.append(row[plot['rowtwo']])
    
    time.reverse()
    wertone.reverse()
    if 'rowtwo' in plot:
        werttwo.reverse()


    fig, ax = plt.subplots(figsize=(600/my_dpi, 400/my_dpi), dpi=my_dpi)
    ax.plot(time, wertone, label=plot['label1'])
    if datatype == 'luftfeuchtigkeit' or datatype == 'temperatur':
        ax.plot(time, werttwo, label=plot['label2'])
    ax.grid(True)
    fig.legend()
    ax.set_ylabel(plot['ylabel'])
    fig.autofmt_xdate()

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

    response = make_response(plot_data)
    response.headers['Content-type'] = 'image/png'
    return response
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Die URLs sind schlecht, so sehen keine URLs für Bilder aus. Besser:
- /image/<datatype>_<ask_length>.png
- /image/<datatype>_<start>_<end>.png
POST-Method ist für Bilder auch nicht sinnvoll. `rowone`, `rowtwo` und `execute_type` werden definiert aber nicht benutzt. my_dpi sollte wohl IMGAGE_DPI heißen und eine Konstante sein.
Statt drei Listen per reverse umzudrehen, wäre ein reversed(rows)-Aufruf bei der for-Schleife besser.
»'rowtwo' in plot« hast Du einmal vergessen.
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Oke danke habe die URL jetzt so angepasst "'/image/<datatype>/<ask_type>/<ask_length>/<start>/<end>.png'" mit unterstrichen zu verbinden hat nicht geklappt da hab ich probleme mit cur.fetchall() bekommen. POST habe ich ebenso entfernt, my_dpi in eine Konstante geändert, und die 3 nicht benutzten Variabeln entfernt. Ich habe jetzt midestens eine stunde probiert über reversed und reverse in allen möglichen Varianten die 3 Listen zusammen umzudrehen und es nicht hinbekommen. Kannst du mir bitte die genaue Stelle nennen wo »'rowtwo' in plot« fehlt da ich einfach nicht rausgefunden habe wo du meinst.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Zeig doch, was Du jetzt versucht hast.
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Das sind halt recht viele unterschiedliche halt so alle möglichen Varianten die ich gefunden habe.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei einer Liste, die es umzudrehen gilt, kann ich mir da nicht sehr viele Varianten vorstellen.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Nur um sicherzugehen dass das überhaupt notwendig ist: Die Listen kommen nicht etwa falsch sortiert von Datenbank? Da ist ja schon ein ORDER BY … DESC in der Abfrage. Vielleicht ohne verstanden zu haben was das macht…
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Mit ORDER BY DESC werden mir die neusten angezeigt aber eben links der neuste und rechts der älteste und das soll andersrum sein.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hypec: Ah, ich hatte nur die SQL-Abfrage ohne das LIMIT gesehen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten