Skip to content

Commit

Permalink
Merge pull request smarthomeNG#925 from sisamiwe/dev-dbaddon
Browse files Browse the repository at this point in the history
DB_ADDON Plugin Bugfix
  • Loading branch information
Morg42 authored Mar 13, 2024
2 parents 009b064 + 03334da commit 2040139
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 46 deletions.
72 changes: 33 additions & 39 deletions db_addon/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class DatabaseAddOn(SmartPlugin):
Main class of the Plugin. Does all plugin specific stuff and provides the update functions for the items
"""

PLUGIN_VERSION = '1.2.7'
PLUGIN_VERSION = '1.2.8'

def __init__(self, sh):
"""
Expand Down Expand Up @@ -1739,8 +1739,8 @@ def _handle_temp_sums(self, func: str, database_item: Item, year: Union[int, str
:param func: defines which temperature sum or count should be calculated
:param database_item: item object or item_id for which the query should be done
:param year: year the kaeltesumme should be calculated for
:param month: month the kaeltesumme should be calculated for
:param year: year the temperature should be calculated for
:param month: month the temperature should be calculated for
:param params: params to be used for executing function (see below)
:return: temperature sum or day count
Expand Down Expand Up @@ -1787,9 +1787,10 @@ def _handle_temp_sums(self, func: str, database_item: Item, year: Union[int, str
def kaeltesumme() -> float:
"""Berechnung der Kältesumme durch Akkumulieren aller negativen Tagesdurchschnittstemperaturen im Abfragezeitraum
:return: value of waermesumme
:return: value of kaeltesumme
"""


# akkumulieren alle Werte, kleiner 0
ks = 0
for entry in raw_data:
if entry[1] < 0:
Expand Down Expand Up @@ -1832,19 +1833,22 @@ def gruenlandtempsumme() -> float:
return int(round(gts, 0))

def wachstumsgradtage() -> Union[list, float, None]:
"""Berechnet die Wachstumsgradtage noch 3 möglichen Methoden und gibt entweder den Gesamtwert oder eine Liste mit kumulierten Werten pro Tag zurück
variant 1: Berechnung des einfachen Durchschnitts
variant 2: modifizierte Berechnung des einfachen Durchschnitts.
variant 3: Zähle Tage, bei denen die Tagesmitteltemperatur oberhalb des Schwellenwertes lag
"""Berechnet die Wachstumsgradtage noch 2 möglichen Varianten und gibt entweder den Gesamtwert oder eine Liste mit kumulierten Werten pro Tag zurück
variant 0: Berechnungsmethode "Berechnung des einfachen Durchschnitts" mit Vergleich des Durchschnitts der täglichen Minimal- und Maximaltemperatur mit Schwellenwert.
Maximaltemperaturen werden bei 30 °C gekappt.
variant 1: Berechnungsmethode "modifizierte Berechnung des einfachen Durchschnitts" mit Vergleich des Durchschnitts der täglichen Minimal- und Maximaltemperatur mit Schwellenwert.
Vor der Berechnung des Durchschnittes wird jede Temperatur, die den Schwellenwert unterschreitet, auf den Schwellenwert geändert.
Maximaltemperaturen werden bei 30 °C gekappt.
result 'value': Rückgabe als Gesamtwert
result 'series: Rückgabe als Liste mit kumulierten Werten pro Tag zurück [['timestamp1', 'kumulierter Wert am Ende von Tag1'], ['timestamp2', ''kumulierter Wert am Ende von Tag2', [...], ...]
"""

# define defaults
wgte = 0
wgte_list = []
upper_limit = 30

# get threshold and set to min 0
threshold = params.get('threshold', 10)
Expand All @@ -1855,40 +1859,28 @@ def wachstumsgradtage() -> Union[list, float, None]:

# get result type
result = params.get('result', 'value')
# Berechnung des einfachen Durchschnitts

# variant handling
if variant == 0:
self.logger.info(f"Calculate 'Wachstumsgradtag' according to 'Berechnung des einfachen Durchschnitts'.")
# Die modifizierte Berechnung des einfachen Durchschnitts. // akkumuliere positive Differenz aus Mittelwert aus Tagesminimaltemperatur mit mind Schwellentemperatur und Tagesmaximaltemperatur limitiert auf 30°C und Schwellenwert
self.logger.info(f"Calculate 'Wachstumsgradtage' according to 'Berechnung des einfachen Durchschnitts'.")
min_val_c = 'min_val'
elif variant == 1:
self.logger.info(f"Calculate 'Wachstumsgradtag' according to 'Modifizierte Berechnung des einfachen Durchschnitts'.")
# Zähle Tage, bei denen die Tagesmitteltemperatur oberhalb des Schwellenwertes lag
elif variant == 2:
self.logger.info(f"Calculate 'Wachstumsgradtag' according to 'Anzahl der Tage, bei denen die Tagesmitteltemperatur oberhalb des Schwellenwertes lag'.")
self.logger.info(f"Calculate 'Wachstumsgradtage' according to 'Modifizierte Berechnung des einfachen Durchschnitts'.")
min_val_c = 'max(threshold, min_val)'
else:
self.logger.warning(f"Requested variant of 'Wachstumsgradtag' not defined. Aborting...")
self.logger.warning(f"Requested variant of 'Wachstumsgradtage' not defined. Aborting...")
return

# accumulate values
for entry in raw_data:
timestamp, min_val, max_val = entry

if variant == 0:
wgt = (((min_val + min(30, max_val)) / 2) - threshold)
elif variant == 1:
wgt = (((max(threshold, min_val) + min(30.0, max_val)) / 2) - threshold)
elif variant == 2:
wgt = (((min_val + min(30, max_val)) / 2) - threshold)
else:
wgt = None

if wgt and wgt > 0:
wgt = ((eval(min_val_c) + min(upper_limit, max_val)) / 2 ) - threshold
if wgt > 0:
wgte += wgt
wgte_list.append([timestamp, int(round(wgte, 0))])

if result == 'series':
return wgte_list
else:
return int(round(wgte, 0))
# return result
return wgte_list if result == 'series' else int(round(wgte, 0))

def temperaturserie() -> list:
"""provide list of lists having timestamp and temperature(s) per day"""
Expand Down Expand Up @@ -1951,6 +1943,8 @@ def _count(op, minmax: str, limit: int) -> int:
elif not self._valid_year(year):
self.logger.error(f"Year for item={database_item.property.path} was {year}. This is not a valid year. Aborting...")
return
if func == 'kaeltesumme' and 1 <= today.month <= 9:
year -= 1

# define start_date, end_date
if month is None:
Expand Down Expand Up @@ -2641,7 +2635,7 @@ def _query_log_timestamp(self, func: str, item_id: int, ts_start: int, ts_end: i
'last': 'LIMIT 1 ',
}

_where = "item_id = :item_id AND time < :ts_start " if func == "next" else "item_id = :item_id AND time BETWEEN :ts_start AND :ts_end "
_where = "item_id = :item_id AND time < :ts_end " if func == "next" else "item_id = :item_id AND time BETWEEN :ts_start AND :ts_end "

_db_table = 'log '

Expand Down Expand Up @@ -2691,9 +2685,9 @@ def _query_log_timestamp(self, func: str, item_id: int, ts_start: int, ts_end: i
_where = f'{_where}AND val_num {entry.strip()} '

# set params
params = {'item_id': item_id, 'ts_start': ts_start}
if func != "next":
params.update({'ts_end': ts_end})
params = {'item_id': item_id, 'ts_start': ts_start, 'ts_end': ts_end}
if func == "next":
params.pop('ts_start', None)

# assemble query
query = f"SELECT {_select[func]}FROM {_db_table}WHERE {_where}{_group_by.get(group, '')}{_order.get(func, '')}{_limit.get(func, '')}{_table_alias.get(func, '')}{_group_by.get(group2, '')}".strip()
Expand Down
2 changes: 1 addition & 1 deletion db_addon/plugin.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ plugin:
# keywords: iot xyz
# documentation: https://github.com/smarthomeNG/smarthome/wiki/CLI-Plugin # url of documentation (wiki) page
support: https://knx-user-forum.de/forum/supportforen/smarthome-py/1848494-support-thread-databaseaddon-plugin
version: 1.2.7 # Plugin version (must match the version specified in __init__.py)
version: 1.2.8 # Plugin version (must match the version specified in __init__.py)
sh_minversion: 1.9.3.5 # minimum shNG version to use this plugin
# sh_maxversion: # maximum shNG version to use this plugin (leave empty if latest)
py_minversion: 3.8 # minimum Python version to use for this plugin
Expand Down
14 changes: 8 additions & 6 deletions db_addon/user_doc.rst
Original file line number Diff line number Diff line change
Expand Up @@ -664,24 +664,26 @@ Folgende Parameter sind möglich / notwendig:
- year: Jahreszahl (str oder int), für das die Berechnung ausgeführt werden soll oder "current" für aktuelles Jahr (default: 'current')


Wachstumsgradtag
----------------
Wachstumsgradtage
-----------------
Der Begriff Wachstumsgradtage (WGT) ist ein Überbegriff für verschiedene Größen.
Gemeinsam ist ihnen, daß zur Berechnung eine Lufttemperatur von einem Schwellenwert subtrahiert wird.
Je nach Fragestellung und Pflanzenart werden der Schwellenwert unterschiedlich gewählt und die Temperatur unterschiedlich bestimmt.
Verfügbar sind die Berechnung über 0) "einfachen Durchschnitt der Tagestemperaturen", 1) "modifizierten Durchschnitt der Tagestemperaturen"
und 2) Anzahl der Tage, deren Mitteltempertatur oberhalb der Schwellentemperatur lag.
Verfügbar sind die Berechnung über die Methoden:

- 0) "einfachen Durchschnitt der Tagestemperaturen": Vergleich des Durchschnitts der täglichen Minimal- und Maximaltemperatur mit Schwellenwert. Die Maximaltemperaturen werden bei 30 °C gekappt.
- 1) "modifizierten Durchschnitt der Tagestemperaturen": Vergleich des Durchschnitts der täglichen Minimal- und Maximaltemperatur mit Schwellenwert. Vor der Berechnung des Durchschnittes wird jede Temperatur, die den Schwellenwert unterschreitet, auf den Schwellenwert geändert. Maximaltemperaturen werden bei 30 °C gekappt.

siehe `Wikipedia Wachstumsgradtag <https://de.wikipedia.org/wiki/Wachstumsgradtag>`_

Folgende Parameter sind möglich / notwendig:

.. code-block:: yaml
db_addon_params: "year=current, method=1, threshold=10"
db_addon_params: "year=current, variant=1, threshold=10"
- year: Jahreszahl (str oder int), für das die Berechnung ausgeführt werden soll oder "current" für aktuelles Jahr (default: 'current')
- method: 0-Berechnung über "einfachen Durchschnitt der Tagestemperaturen", 1-Berechnung über "modifizierten Durchschnitt (default: 0) der Tagestemperaturen" 2-Anzahl der Tage, mit Mitteltempertatur oberhalb Schwellentemperatur// 10, 11 Ausgabe aus Zeitserie
- variant: 0-Berechnung über "einfachen Durchschnitt der Tagestemperaturen", 1-Berechnung über "modifizierten Durchschnitt (default: 0) der Tagestemperaturen" // 10, 11 Ausgabe aus Zeitserie (default: 0)
- threshold: Schwellentemperatur in °C (int) (default: 10)


Expand Down

0 comments on commit 2040139

Please sign in to comment.