From ae1bcf84d593692062329c95da3ed5010ed4b698 Mon Sep 17 00:00:00 2001 From: Tomasz Torcz Date: Sat, 8 Jun 2024 21:13:00 +0200 Subject: [PATCH] support PostgreSQL database --- src/README.md | 5 +++++ src/api.py | 14 +++++++++----- src/moj_licznik.py | 15 +++++++++++---- src/requirements.txt | Bin 656 -> 690 bytes 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/README.md b/src/README.md index 2134996..2eecee8 100644 --- a/src/README.md +++ b/src/README.md @@ -47,6 +47,11 @@ Wymagane parametry: * ENERGA_USERNAME - nazwa użytkownika w aplikacji Energa Mój licznik * ENERGA_PASSWORD - hasło użytkownika w aplikacji Energa Mój licznik +Opcjonalne parametry: + +* POSTGRESQL_CONNSTRING - namiar na bazę PostgreSQL do przechowywania odczytów; +format opisany w [dokumentacji PGSQL](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING-URIS) +(przykładowo `postgresql://uzytkownik:haslo@serwer/mojlicznik`) ## Konfiguracja sensorów Do HA możesz dodać sensory, które zawierają informacje udostępniane przez API diff --git a/src/api.py b/src/api.py index 9fc5920..1f63f8c 100644 --- a/src/api.py +++ b/src/api.py @@ -1,4 +1,4 @@ -from peewee import SqliteDatabase +from peewee import SqliteDatabase, PostgresqlDatabase from flask import Flask, jsonify, request, redirect, url_for, abort from waitress import serve #from datetime @@ -9,10 +9,14 @@ import urllib.parse logger = logging.getLogger("energaMeter.api") - -path = os.path.dirname(os.path.abspath(__file__)) -db_file = 'data/database.sqlite' -db = SqliteDatabase(os.path.join(path, db_file)) +if postgresql_connstring := os.getenv("POSTGRESQL_CONNSTRING"): + from psycopg2.extensions import parse_dsn + db_name = parse_dsn(postgresql_connstring)['dbname'] + db = PostgresqlDatabase(db_name, dsn=postgresql_connstring) +else: + path = os.path.dirname(os.path.abspath(__file__)) + db_file = 'data/database.sqlite' + db = SqliteDatabase(os.path.join(path, db_file)) app = Flask(__name__) diff --git a/src/moj_licznik.py b/src/moj_licznik.py index 7ecfdc0..be11550 100644 --- a/src/moj_licznik.py +++ b/src/moj_licznik.py @@ -1,4 +1,4 @@ -from peewee import SqliteDatabase +from peewee import SqliteDatabase, PostgresqlDatabase from datetime import datetime, timedelta, date import calendar, requests, re, time, json, os, logging import http.cookiejar as cookiejar @@ -10,9 +10,16 @@ import urllib.parse logger = logging.getLogger("energaMeter") -path = os.path.dirname(os.path.abspath(__file__)) -db_file = 'data/database.sqlite' -db = SqliteDatabase(os.path.join(path, db_file)) +if postgresql_connstring := os.getenv("POSTGRESQL_CONNSTRING"): + from psycopg2.extensions import parse_dsn + db_name = parse_dsn(postgresql_connstring)['dbname'] + db_host = parse_dsn(postgresql_connstring)['host'] + db = PostgresqlDatabase(db_name, dsn=postgresql_connstring) + logger.info(f"Używam bazy PostgreSQL „{db_name}” na {db_host}") +else: + path = os.path.dirname(os.path.abspath(__file__)) + db_file = 'data/database.sqlite' + db = SqliteDatabase(os.path.join(path, db_file)) class ChartType(Enum): DAY = "DAY" diff --git a/src/requirements.txt b/src/requirements.txt index d10d411a8d07cc1d973189d3351324d7f85ed566..7533201131452cfe7972c1f377607b0265ffdc06 100644 GIT binary patch delta 41 tcmbQhx`}ne3r5)jhGK?FhGd3(h609k1|tSrAT(moW3U9_$&VS=0s!5m3D^Jt delta 11 ScmdnQI)Qb=3&zP@Oe+8yb_6W|