Novice: Trenutno ni obvestil.
Dobrodošel, Gost. Prosim, prijavi se ali se registriraj.

 ZEVS ForumRačunalništvoOmrežja in razvijanje straniIzris podatkov iz weewx databaze
Strani: [1]
Natisni
Avtor Tema: Izris podatkov iz weewx databaze  (Prebrano 14413 krat)
0 Člani in 1 Gost gledajo to temo.
Tminc
Altokumulus

Odsoten Odsoten

RD: 0000-00-00
Sporočila: 636

Lokacija: Tolmin

WWW
« dne: 28. Januar 2023, 08:29:29 »

weewx je sicer super programček za beleženje podatkov in generacijo spletne strani, vendar mi ni všeč, da so podatki shranjeni v .sdb bazi. Grafi, ki jih rišejo splošne teme, so omejene na tekočih 24h, 1 teden, mesec in leto.
Ker pride včasih potreba po vpogledu v specifično časovno obdobje, sem si vzel malo časa in (s pomočjo googla) pripravil skripto, ki dela prav to. Skripta je zelo enostavna, nisem je še parametriziral, itd.. Če komu pride prav, jo seveda komot poljubno razširi.
Testiral sem s python3 na Ubuntu, z malenkostnim popravkom v modulih pa jo lahko poženeš direktno na Raspberry Pi, kjer je databaza (matplotlibu je potrebno povedati, da nima "zaslona" = headless).
Primer nariše temperaturo, rosišče in veter, graf in skripta sta pripeta.

lp Peter

Koda:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sqlite3, pandas , matplotlib.pyplot as plt
from datetime import datetime
import matplotlib.dates as mdates

# Pot do datoteke s podatki, vkljucno z imenom datoteke
bazafile="weewx.sdb"

conn = sqlite3.connect(bazafile)
c = conn.cursor()

# ------------------- funkcije ------------------------

# Pretvori iz F v C
def ftoc(t):
    return float((t-32)/1.8)

# Pretvori mph v km/h
def mtok(v):
    return (v*1.60934)

def graph_data():

#   Znotraj klica definiraj zacetni in koncni datum/cas

    c.execute('SELECT dateTime, outTemp, dewpoint, windGust, windSpeed FROM archive \
        WHERE dateTime BETWEEN \
                       STRFTIME("%s", "2023-01-23 06:00") AND \
                       STRFTIME("%s", "2023-01-25 06:00") ')
    data = c.fetchall()
    cas = []
    t1 = []
    t2 = []
    v1 = []
    v2 = []
    for row in data:
        cas.append(datetime.fromtimestamp(row[0]))
        t1.append( ftoc(row[1]) )
        t2.append( ftoc(row[2]) )
        v1.append( mtok(row[3]) )
        v2.append( mtok(row[4]) )

    myFmt = mdates.DateFormatter('%d.%m. %Hh')

    plt.figure()
    plt.subplot(211)
    plt.plot(cas,t1)
    plt.plot(cas,t2)
    plt.grid(True)
    plt.xlim(min(cas),max(cas))
    plt.ylabel(u'temperatura [°C]')
    plt.xlabel(u'čas [h]')
    plt.legend([u'temperatura',u'rosišče'])
    plt.gca().xaxis.set_major_formatter(myFmt)

    plt.subplot(212)
    plt.plot(cas,v1)
    plt.plot(cas,v2)
    plt.grid(True)
    plt.xlim(min(cas),max(cas))
    plt.ylabel(u'hitrost [km/h]')
    plt.xlabel(u'čas [h]')
    plt.legend([u'sunek vetra',u'povprečna hitrost'])
    plt.gca().xaxis.set_major_formatter(myFmt)

    plt.show()

# -------------- konec funkcij ----------------

graph_data()
Prijavljen
TgT
Altostratus

Odsoten Odsoten

RD: 1983-06-04
Sporočila: 1657


Lokacija: Dobrava, Slov.Konjice 342m.n.v.
LFC :)


WWW
« Odgovori #1 dne: 28. Januar 2023, 15:18:49 »

Lepo  icon_wink
Prijavljen

Strani: [1]
Natisni
Pojdi na: