Skip to content

Commit

Permalink
Merge pull request #843 from Morg42/uzsu-1
Browse files Browse the repository at this point in the history
uzsu: use own interpolation methods, remove scipy/numpy dependencies
  • Loading branch information
onkelandy authored Nov 5, 2023
2 parents 3ee29c1 + 1572283 commit afa2a1a
Show file tree
Hide file tree
Showing 13 changed files with 2,632 additions and 318 deletions.
548 changes: 255 additions & 293 deletions uzsu/__init__.py

Large diffs are not rendered by default.

1,381 changes: 1,381 additions & 0 deletions uzsu/_pv_1_6_6/__init__.py

Large diffs are not rendered by default.

Binary file added uzsu/_pv_1_6_6/assets/uzsu_webif.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
19 changes: 19 additions & 0 deletions uzsu/_pv_1_6_6/locale.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
plugin_translations:
# Translations for the plugin specially for the web interface
'Die folgenden Items sind dem UZSU Plugin zugewiesen': {'de': '=', 'en': 'The following items are assigned to the UZSU plugin'}
'Klick auf ein Item um dessen Konfiguration anzuzeigen': {'de': '=', 'en': 'Click on an item to show its configuration'}
'Aktives Item, keine (aktiven) Einträge!': {'de': '=', 'en': 'Active item, no (active) entries!'}
'Item existiert nicht!': {'de': '=', 'en': 'Item does not exist!'}
'fehlt!': {'de': '=', 'en': 'missing!'}
'UZSU Item': {'de': '=', 'en': '='}
'Abhängige Items (mit Typ)': {'de': '=', 'en': 'Dependant Item (with type)'}
'Wert': {'de': '=', 'en': 'Value'}
'Interpolation (Intervall)': {'de': '=', 'en': 'Interpolation (interval)'}
'Back in Time': {'de': '=', 'en': '='}
'Dictionary': {'de': '=', 'en': '='}
'Letzter Wert': {'de': '=', 'en': 'Last Value'}
'Sonnenaufgang': {'de': '=', 'en': 'sun rise'}
'Sonnenuntergang': {'de': '=', 'en': 'sun set'}
'Uhr': {'de': '=', 'en': "o'clock"}
'Initialisiere...': {'de': '=', 'en': 'Initializing...'}
'Init': {'de': '=', 'en': '='}
272 changes: 272 additions & 0 deletions uzsu/_pv_1_6_6/plugin.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,272 @@
# Metadata for the Smart-Plugin
plugin:
# Global plugin attributes
type: system # plugin type (gateway, interface, protocol, system, web)
description: # Alternative: description in multiple languages
de: 'Universelle Zeitschaltuhr'
en: 'Universal time switch'
description_long: # Alternative: description in multiple languages
de: 'Dieses Plugin ermöglicht gezielte Schaltvorgänge von Items zu bestimmten Uhrzeiten oder
abhängig vom Sonnenstand. Die automatischen Schaltungen können dabei pro Wochentag separat
definiert werden.\n
Außerdem ermöglicht eine Interpolationsfunktion das Errechnen von
Werten zwischen zwei manuell angelegten Schaltzeiten, wodurch z.B. Lichtkurven über den
Tagesverlauf umgesetzt werden können.
'
en: 'This plugin provides specific item changes at a given time or sun position. Those automatic
switchings can be defined for each day of the week separately.\n
Furthermore the interpolation function allows the calculation of values between two manual
settings. You can use this feature for smooth light curves based on the time of the day.
'
requirements:
de: 'SciPy python Modul'
en: 'SciPy python module'
requirements_long:
de: 'Das Plugin benötigt die folgende Software:\n
\n
- libatlas-base-dev: Zumindest auf einem Raspberry Pi mit Debian Stretch ist der Befehl nötig: ``sudo apt install libatlas-base-dev``\n
- Bei neueren SciPy Versionen kann auf einem Raspi der Build trotzdem scheitern. Es ist dann empfohlen, die aktuellste passende Datei (armv6 = Raspi1, armv7 = Rest)
von hier herunterzuladen und ``pip3 install scipy*.whl`` zu starten: https://www.piwheels.org/simple/scipy/\n
- Python Modul scipy: ``pip3 install scipy``. Es wird empfohlen, zuerst die Pythonmodule zu aktualisieren,
aber unbedingt darauf zu achten, dass die Requirements von SmarthomeNG erfüllt bleiben!
Sollte die Installation via pip nicht funktionieren: ``sudo apt update && sudo apt install -y python3-scipy``\n
'
en: 'This plugin needs the following software to be installed and running:\n
\n
- libatlas-base-dev: On Raspberry Pi debian stretch you also have to run ``sudo apt install libatlas-base-dev``\n
- With newer SciPy versions build can still fail on Raspis. It is recommended to download the most recent file (armv6 = Raspi1, armv7 = others) from here and run
``pip3 install scipy*.whl``: https://www.piwheels.org/simple/scipy/\n
- Python module scipy: ``pip3 install scipy``. Update your Python packages first
(but make sure they still meet the requirements for smarthomeng)!
If that does not work you can use: ``sudo apt update && sudo apt install -y python3-scipy``\n
'
maintainer: cmalo, bmxp, onkelandy, andrek
tester: Sandman60, cmalo, schuma
state: ready
keywords: scheduler uzsu trigger series
support: https://knx-user-forum.de/forum/supportforen/smarthome-py/1364692-supportthread-für-uzsu-plugin

version: 1.6.6 # Plugin version
sh_minversion: 1.6 # 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
restartable: unknown
classname: UZSU # class containing the plugin

parameters:
# Definition of parameters to be configured in etc/plugin.yaml
remove_duplicates:
type: bool
default: True
description:
de: 'Falls True, werden Einträge mit exakt den selben Einstellungen, aber unterschiedlichem Wert durch einen neu getätigten Eintrag ersetzt'
en: 'If True, existing entries with exactly the same settings except the value get replaced by the new entry'

suncalculation_cron:
type: str
default: '0 0 * *'
description:
de: 'Cron-Angabe, wann für die UZSU Einträge mit Sonnenstandbezug die errechnete Uhrzeit ins dict Item geschrieben werden soll.'
en: 'Cron definition when the UZSU item should be updated with the calculated times for sun-related UZSU entries.'
description_long:
de: 'Cron-Angabe, wann für die UZSU Einträge mit Sonnenstandbezug die errechnete Uhrzeit ins dict Item geschrieben werden soll. Diese "calculated" Einträge sind relevant für diverse UZSU Widgets der SmartVisu.'
en: 'Cron definition when the UZSU item should be updated with the calculated times for sun-related UZSU entries.There "calculated" entries are relevant for some SmartVisu UZSU widgets.'

interpolation_interval:
type: int
default: 5
valid_min: 0
description:
de: 'Standardintervall in Minuten, in dem ein interpolierter Wert erneut errechnet werden soll. Kann pro UZSU individuell konfiguriert werden.'
en: 'Standard interval in minutes that is used to re-calculate an interpolated value. Can be configured for each UZSU individually.'

interpolation_type:
type: str
default: 'none'
valid_list:
- 'none'
- 'cubic'
- 'linear'
description:
de: 'Standardintervall in Minuten, in dem ein interpolierter Wert erneut errechnet werden soll. Kann pro UZSU individuell konfiguriert werden.'
en: 'Standard interval in minutes that is used to re-calculate an interpolated value. Can be configured for each UZSU individually.'

backintime:
type: int
default: 0
valid_min: 0
description:
de: 'Standardmaximalalter eines UZSU Eintrags in Minuten, um beim Plugin-Start versäumte Einträge nachzuholen. Kann pro UZSU individuell konfiguriert werden.'
en: 'Standard maximum age of an uzsu entry in minutes to be catched up at the plugin start. Can be configured for each UZSU individually'

interpolation_precision:
type: int
default: 2
valid_min: 0
valid_max: 4
description:
de: 'Anzahl an Dezimalstellen bei der Berechnung der Interpolation'
en: 'Amount of decimal places when calculating interpolation values'

item_attributes:
# Definition of item attributes defined by this plugin
uzsu_item:
type: str
description:
de: 'Das Item, das durch die UZSU geschaltet werden soll. Entweder als komplette ID oder relativer Pfad angegeben.'
en: 'The item that gets changed by the UZSU. Declare as full ID or relative path.'
description_long:
de: '**Das Item, das durch die UZSU geschaltet werden soll:**\n
Im items Ordner ist pro Item, das geschaltet werden soll, ein UZSU Item-Eintrag mit
``type: dict`` zu erstellen. Die Hierarchie spielt dabei keine Rolle, es wird allerdings empfohlen,
das UZSU Item als Kind des zu schaltenden Items zu deklarieren und die relative Item-Referenzierung
``".."`` für den Parameter ``uzsu_item`` zu nutzen. Es wird dringend empfohlen,
``cache: True`` zu setzen, damit die Einstellungen bei einem Neustart nicht verloren gehen.
'
en: '**The item that gets changed by the UZSU:**\n
You have to specify an item with ``type: dict`` and with the ``uzsu_item``
attribute set to the path of the item which will be set by this item.
The hierarchy does not matter but it is recommended to define the UZSU item
as a child of the item to be set and use the relative item reference ``".."``
for the uzsu_item parameter. It is highly recommended to specify
``cache: True`` as well for persistent storage of the UZSU information.
'

item_structs:
child:
name: Vorlage-Struktur für Zeitschaltuhren

uzsu:
type: dict
uzsu_item: ..
cache: True
visu_acl: rw

last:
remark: The last set value if UZSU is active
type: foo
visu_acl: ro
eval: sh...lastvalue('uzsu_dict_updated')
crontab: init = None
eval_trigger: ..

active:
remark: Use this item to easily turn on or off your UZSU
type: bool
eval: sh...activate(value)
visu_acl: rw

status:
type: bool
eval: sh....activate()
eval_trigger:
- ..
- ...
on_change: .. = value
crontab: init = 0

logic_parameters: NONE
# Definition of logic parameters defined by this plugin

plugin_functions:
# Definition of function interface of the plugin
planned:
type: dict
description:
de: 'Abfrage des nächsten Aktualisierungszeitpunkts'
en: 'Query the next scheduled value and time'
description_long:
de: 'Abfrage des nächsten Aktualisierungszeitpunkts. Ist keine Aktualisierung geplant, z.B. weil das
UZSU Item nicht aktiviert ist, wird None zurückgegeben, ansonsten ein Dictionary
mit den Einträgen Zeit und Wert.
'
en: 'Query the next scheduled value and time. If no update is planned, e.g. if the UZSU item
is not active, the result is None, otherwise a dictionary containing entries for time and value.
'

resume:
type: foo
description:
de: 'Fortsetzen der UZSU Evaluierung: Aktivieren des Items und Setzen des zuletzt festgelegten Wertes.'
en: 'Resuming the UZSU evaluation: activating the item and setting the last defined value.'

lastvalue:
type: foo
description:
de: 'Abfrage des zuletzt gesetzten Werts. Kann z.B. beim Aktivieren der UZSU genutzt werden, um sofort auf den gewünschten Wert zu schalten.'
en: 'Query the last value. Can be used to immediately set the correct value after activating an UZSU.'
parameters:
by:
type: str
default: None
description:
de: 'Für eine entsprechende Info im Logfile kann hier z.B. der Itemname, der den Wert abruft eingetragen werden'
en: 'For respective info in the log file you can choose to put the item name that queries the value.'

clear:
type: bool
description:
de: 'Beim Aufrufen mit dem Parameter True werden die Einträge der UZSU gelöscht.'
en: 'Using this function with the parameter True clears the UZSU.'
description_long:
de: 'Löschen der UZSU Einträge eines Items.\n
- Leer: nichts ausführen\n
- True: löschen\n
'
en: 'Delete the UZSU entries of an item.\n
- Empty: do nothing\n
- True: delete\n
'

activate:
type: bool
description:
de: 'Abfrage oder Setzen, ob die uzsu aktiv ist oder nicht.'
en: 'query or set whether the uzsu is set active or not.'
description_long:
de: 'Abfrage oder Setzen, ob die uzsu aktiv ist oder nicht.\n
- Leer: Abfrage\n
- True: aktivieren\n
- False: deaktivieren\n
'
en: 'Query or set whether the uzsu is set active or not.\n
- Empty: query\n
- True: activate\n
- False: deactivate\n
'

interpolation:
type: dict
description:
de: 'Abfrage (leerer Parameter) oder Setzen der Interpolationseinstellungen'
en: 'Query (empty parameter) or set the interpolation settings'
parameters:
'type':
type: str
default: none
description:
de: 'Interpolationstyp: linear/none/cubic'
en: 'interpolation type: linear/none/cubic'
description_long:
de: 'Interpolationstyp:\n
- linear: konstant gleiche Zwischenberechnung\n
- cubic: Spline-Interpolation mit verzögertem Start und sanftem Verlangsamen\n
- none: keine Interpolation\n
'
en: 'interpolation type:\n
- linear: constant interpolation\n
- cubic: splinte interpolation with ease in and out\n
- none: no interpolation\n
'
interval:
type: int
default: 5
description:
de: 'Intervall in Minuten, in dem der interpolierte Wert aktualisiert werden soll'
en: 'Interval in minutes to re-calculate the interpolated value'
backintime:
type: int
default: 0
description:
de: 'Maximales Alter eines UZSU Eintrags in Minuten, um beim Plugin-Start versäumte Einträge nachzuholen.'
en: 'maximum age of an uzsu entry in minutes to be catched up at the plugin start'
File renamed without changes.
Loading

0 comments on commit afa2a1a

Please sign in to comment.