Skip to content

Commit

Permalink
Merge branch 'smarthomeNG:develop' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
lgb-this authored Mar 17, 2024
2 parents ba34304 + 2040139 commit dea845d
Show file tree
Hide file tree
Showing 9 changed files with 139 additions and 132 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
6 changes: 3 additions & 3 deletions ical/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@


class iCal(SmartPlugin):
PLUGIN_VERSION = "1.6.3"
PLUGIN_VERSION = "1.6.4"
ALLOW_MULTIINSTANCE = False
DAYS = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")
FREQ = ("YEARLY", "MONTHLY", "WEEKLY", "DAILY", "HOURLY", "MINUTELY", "SECONDLY")
Expand Down Expand Up @@ -294,7 +294,7 @@ def _parse_ical(self, ical, ics, prio):
self.logger.info("Warning in parsing {0} no DTEND for UID: {1}. Setting DTEND from DTSTART".format(ics, event['UID']))
# Set end to start time:
event['DTEND'] = event['DTSTART']
continue
#continue
if 'RRULE' in event:
event['RRULE'] = self._parse_rrule(event, tzinfo)
if event['UID'] in events:
Expand All @@ -314,7 +314,7 @@ def _parse_ical(self, ical, ics, prio):
events[event['UID']] = event
del(event)
elif 'event' in locals():
key, sep, val = line.partition(':')
key, val = line.rsplit(':', 1)
key, sep, par = key.partition(';')
key = key.upper()
# why does the folowing code overwrite the time zone info configured in smarthomeNG?
Expand Down
2 changes: 1 addition & 1 deletion ical/plugin.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ plugin:
# documentation: https://github.com/smarthomeNG/smarthome/wiki/CLI-Plugin # url of documentation (wiki) page
support: https://knx-user-forum.de/forum/supportforen/smarthome-py/1352089-support-thread-zum-ical-plugin

version: 1.6.3 # Plugin version
version: 1.6.4 # Plugin version
sh_minversion: 1.9.0 # minimum shNG version to use this plugin
# sh_maxversion: # maximum shNG version to use this plugin (leave empty if latest)
multi_instance: false # plugin supports multi instance
Expand Down
2 changes: 1 addition & 1 deletion jsonread/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@


class JSONREAD(SmartPlugin):
PLUGIN_VERSION = "1.0.3"
PLUGIN_VERSION = "1.0.4"

def __init__(self, sh):
"""
Expand Down
Binary file added jsonread/assets/jsonread_webif.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 5 additions & 5 deletions jsonread/plugin.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@ plugin:
description:
de: 'json Parser Plugin basierend auf jq'
en: 'json parser plugin based on jq'
maintainer: Torsten Dreyer
tester: onkelandy
maintainer: onkelandy
tester: bmxp
state: ready
keywords: json jq
documentation: http://smarthomeng.de/user/plugins_doc/config/not-yet.html
support: https://knx-user-forum.de/forum/supportforen/smarthome-py/not-yet

version: 1.0.3 # Plugin version
version: 1.0.4 # Plugin version
sh_minversion: 1.4 # minimum shNG version to use this plugin
#sh_maxversion: # maximum shNG version to use this plugin (leave empty if latest)
#py_minversion: 3.6 # minimum Python version to use for this plugin
py_maxversion: 3.9 # maximum Python version to use for this plugin (leave empty if latest)
py_versioncomment: "Die aktuellste Version (2.5.2, released Mai 2021) des benötigten Packages 'pyjq' ist nicht kompatibel mit Python 3.10"
py_maxversion: 3.11 # maximum Python version to use for this plugin (leave empty if latest)
py_versioncomment: "Die aktuellste Version (2.6.0, released August 2022) des benötigten Packages 'pyjq' ist nicht kompatibel mit Python 3.12"
restartable: True
multi_instance: True # plugin supports multi instance
classname: JSONREAD # class containing the plugin
Expand Down
Loading

0 comments on commit dea845d

Please sign in to comment.