From cd3b7c4786f609efe983c9894e27f07c2518b822 Mon Sep 17 00:00:00 2001 From: Onkel Andy Date: Fri, 29 Dec 2023 22:56:47 +0100 Subject: [PATCH 1/5] memlog plugin: create and update user_doc, include info about replacement using core features --- memlog/README.md | 169 ----------------- memlog/assets/visu_callable.png | Bin 0 -> 29018 bytes memlog/user_doc.rst | 229 ++++++++++++++++++++++++ memlog/webif/static/img/plugin_logo.svg | 69 +++++++ 4 files changed, 298 insertions(+), 169 deletions(-) delete mode 100755 memlog/README.md create mode 100755 memlog/assets/visu_callable.png create mode 100644 memlog/user_doc.rst create mode 100644 memlog/webif/static/img/plugin_logo.svg diff --git a/memlog/README.md b/memlog/README.md deleted file mode 100755 index 7dcf8c289..000000000 --- a/memlog/README.md +++ /dev/null @@ -1,169 +0,0 @@ -# memlog - -This plugins can be used to create in-memory logs which can be used by items or other -plugins. - -## Requirements - -No special requirements. - -## Configuration - -### plugin.yaml - -Use the plugin configuration to configure the in-memory logs. - -``` -memlog: - plugin_name: memlog - name: alert - mappings: - - time - - thread - - level - - message -# maxlen: 50 -# items -# - first.item.now -# - second.item.thread.info -# - third.item.level -# - fourth.item.msg -``` - -This will register a in-memory log with the name "alert". This can be used to attach -to items. - -#### name attribute - -This will give the in-memory log a name which can be used when accessing them. - -#### mappings attribute - -This configures the list of values which are logged for each log message. The following -internal mappings can be used and will be automatically set - if not given explicitely -when logging data: - -* ``time`` - the timestamp of log -* ``thread`` - the thread logging data -* ``level`` - the log level (defaults to INFO) - -#### maxlen attribute - -Defines the maximum amount of log entries in the in-memory log. - -#### items attribute - -Each time an item is updated using the `memlog` configuration setting, a log entry will -be written using the list of items configured in this attribute as log values. - -If items are defined, then four items should be named, -each with the following purpose: - - * Item A - the value of this item is entered as the timestamp - * Item B - the value of this item is entered as the thread info - * Item C - the value of this item is entered as the level of log message - * Item D - the value of this item is entered as the message - -Using Items this way it is possible to set the values of those items first -and then trigger the item which has the ``memlog`` attribute. - -When the items attribute is not configured, the default mapping values will be used and the value of the item will be logged which has the ``memlog`` attribute. - -### items.yaml - -The following attributes can be used. - -#### memlog - -Defines the name of in-memory log which should be used to log the item's content to -the log. Everything is logged with 'INFO' level. - -#### Example - -Simple item logging: - -```yaml -some: - item: - type: str - memlog: alert -``` - -An update to item ``some.item`` will cause a log entry to be generated with the value of item ``some.item``. - -### logic.yaml - -#### memlog - -Configures that a message should be logged whenever the logic was triggered. It logs a -default message which can be overwritten by the `memlog_message` attribute. - -#### memlog_message - -Defines the message to be logged. It configures a string which may contain placeholders -which got replaced by using the `format()` function. - -The following placeholders or object can be used in the message string: -* `logic` - the logic object. A format of ``{logic.name}`` will include the logics name -* `plugin` - the memlog plugin instance object -* `by` - the string containing the origin of logic trigger -* `source` - the source -* `dest` - the destination - -The `logic` and `plugin` placeholders are always available, the rest depends on the -logic invocation/trigger. - -Example: - -```yaml -memlog_message: The logic {logic.name} was triggered! -``` - -## Methods - -The plugin name defined it ``etc/plugin.yaml`` can be used as callable. - -### memlog(entry) -This log the given list of elements of `entry` parameter. The list should have the same amount -of items you used in the mapping parameter (see also the default for this value). - -`sh.memlog((self._sh.now(), threading.current_thread().name, 'INFO', 'Some information'))` - -### memlog(msg) - -This log the given message in `msg` parameter with the default log level. - -### memlog(lvl, msg) - -This logs the message in ``msg`` parameter with the given log level specified in ``lvl`` -parameter. - -### Examples - -Given the following base snippet of ``etc/plugin.yaml``: - -```yaml -my_memlog: - plugin_name: memlog - name: my_personal_memlog -``` - -The following expressions (e.g. in a logic) - -```python -sh.my_memlog("DEBUG","Debug Message") -sh.my_memlog("Hello world!") # info -sh.my_memlog("WARNING","This is a warning!") -sh.my_memlog("ERROR","This is already an error!!") -sh.my_memlog("CRITICAL","This is critical, just shutdown everything!!!") -``` - -together with this definition in SmartVISU pages: - -```html -{{ status.log('log_id', 'my_personal_memlog', 10) }} -``` - -will show a screen like this: - -![Screenshot of messages displayed with SmartVISU](callable.png "Result with SmartVISU") diff --git a/memlog/assets/visu_callable.png b/memlog/assets/visu_callable.png new file mode 100755 index 0000000000000000000000000000000000000000..7fa4eac43bc596dd6f5c541e434076a66a9afd69 GIT binary patch literal 29018 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 literal 0 HcmV?d00001 diff --git a/memlog/user_doc.rst b/memlog/user_doc.rst new file mode 100644 index 000000000..7d07f1e41 --- /dev/null +++ b/memlog/user_doc.rst @@ -0,0 +1,229 @@ +.. index:: Plugins; memlog +.. index:: memlog + +====== +memlog +====== + +.. image:: webif/static/img/plugin_logo.svg + :alt: plugin logo + :width: 300px + :height: 300px + :scale: 50 % + :align: left + + +Dieses Plugin stellt für Items und Plugins eine Loggingvariante +zur Verfügung, bei der die Logeinträge im Arbeitsspeicher abgelegt werden. + +.. important:: + + Die Funktionalität des Plugins ist auch über entsprechende Konfiguration der + ``etc/logging.yaml`` Datei sowie durch Nutzen des ``log_change`` Itemattributs abbildbar. + +Ersatz durch Bordmittel +======================= + +Details zum Memory Loghandler sind unter :doc:`Logging Handler ` +zu finden. Informationen zum Loggen bei Itemänderungen findet man unter +:doc:` log_change `. + +Beispiel Logik +-------------- + +In diesem Beispiel werden sämtliche Aufrufe des Loggers in der Logik ex_logging +in das Memorylog namens memory_info geschrieben. Während beim memlog Plugin durch +einen Eintrag in der ``etc/logic.yaml`` Datei beim Triggern einer Logik +automatisch ein Logeintrag erstellt wird, sind hier in der Logik selbst die +entsprechenden logger Methoden einzubinden. Somit können wie gewohnt auch +verschiedene Loglevel genutzt werden. + +Das Memorylog wird in der Datei ``etc/logging.yaml`` wie folgt konfiguriert: + +.. code-block:: yaml + + # etc/logging.yaml + handlers: + memory_info: + (): lib.log.ShngMemLogHandler + logname: memory_info + maxlen: 60 + level: INFO + cache: True + + loggers: + logics.ex_logging: + handlers: [memory_info] + level: INFO + +Die Logeinträge werden aus der Logik ``logics/.py`` wie folgt erstellt: + +.. code-block:: python + + # logics/ex_logging.py + sourceitem = items.return_item(trigger['source']) + logger.info(f"Logik '{logic.name}' wurde durch {trigger} getriggert. Source = {sourceitem}") + logger.debug(f"Logik '{logic.name}' (filename '{logic.filename}') wurde getriggert (DEBUG)") + +Beispiel Item +------------- + +Das Memorylog wird in der Datei ``etc/logging.yaml`` wie folgt konfiguriert: + +.. code-block:: yaml + + # etc/logging.yaml + handlers: + memory_info: + (): lib.log.ShngMemLogHandler + logname: memory_info + maxlen: 60 + level: INFO + cache: True + + loggers: + items.memory-items: + handlers: [memory_info] + level: INFO + +Nun können mehrere Items über die entsprechenden Attribute in das Memory Log +schreiben. Möchte man dabei die Möglichkeit des memlog Plugins, Mitteilungen +über ein Item zu deklarieren, nutzen, kommt das Attribut +``log_rules: "{'itemvalue': ''}"`` zum Einsatz. + +.. code-block:: yaml + + item: + type: num + log_change: memory-items + log_level: INFO + log_text: 'Wert={mvalue}, Alter={age}, Zeit={now}' + +Das Einbinden in eine SmartVISU Seite erfolgt mittels: + +.. code-block:: html + + {{ status.log('', 'memory_info', 10) }} + +Konfiguration +============= + +.. important:: + + Detaillierte Informationen zur Konfiguration des Plugins sind + unter :doc:`/plugins_doc/config/memlog` zu finden. + +plugin.yaml +----------- + +.. code-block:: yaml + + # etc/plugin.yaml + memlog: + plugin_name: memlog + name: alert + mappings: + - time + - thread + - level + - message + #maxlen: 50 + #items: + # - first.item.now + # - second.item.thread.info + # - third.item.level + # - fourth.item.msg + +Das angegebene Beispiel registriert ein Memory Log namens "alert". +Das `mappings` Attribut konfiguriert die Liste der Werte, die für jede Protokollmeldung +genutzt werden sollen. Die Werte werden dabei aus den angegebenen Items ausgelesen. + +items.yaml +---------- + +Das ``memlog`` Attribut legt den Namen des speicherinternen Logs fest, +das verwendet werden soll, um den Inhalt des Elements ins Log zu schreiben. + +.. code-block:: yaml + + some: + item: + type: str + memlog: alert + +Eine Aktualisierung des Eintrags "some.item" führt zur Erstellung eines Protokolleintrags +mit dem Wert des Eintrags ``some.item``. + +logic.yaml +---------- + +.. code-block:: yaml + + # etc/logic.yaml + ex_logging: + filename: example_logging.py + memlog: testing + memlog_message: The logic {logic.name} was triggered! + +Bei jeder Auslösung der Logik, im Beispiel example_logging.py, wird der Eintrag +im optionalen Attribut ``memlog_message`` in das entsprechende Speicherprotokoll geschrieben. + +Einsatz in Logiken +================== + +Funktionsaufruf +--------------- + +Der unter ``etc/plugin.yaml`` angegebene Pluginname kann durch () aufgerufen werden. +Dies protokolliert die angegebene Liste der Elemente des Parameters ``Eintrag``. Die Liste +sollte die gleiche Anzahl an Elementen haben, die in dem Mapping-Parameter angegeben wurde. + +.. code-block:: python + + sh.memlog((self._sh.now(), threading.current_thread().name, 'INFO', 'Some information')) + +Wird im Eintrag nur eine Mitteilung als String angegeben, werden die anderen Werte +entsprechend den Vorgaben in etc/plugin.yaml genutzt. Außerdem ist es möglich, +nur das Loglevel und die Mitteilung anzugeben, also z.B. +``sh.memlog('INFO', 'Some information')``. + +Beispiel +-------- + +In ``etc/plugin.yaml`` wird das Plugin wie folgt eingebunden: + +.. code-block:: yaml + + my_memlog: + plugin_name: memlog + name: my_personal_memlog + +Die folgenden Aufrufe können in einer Logik eingebunden werden: + +.. code-block:: python + + sh.my_memlog("DEBUG", "Debug Message") + sh.my_memlog("Hello world!") # info + sh.my_memlog("WARNING", "This is a warning!") + sh.my_memlog("ERROR", "This is already an error!!") + sh.my_memlog("CRITICAL", "This is critical, just shutdown everything!!!") + +Das Einbinden in eine SmartVISU Seite erfolgt mittels: + +.. code-block:: html + + {{ status.log('log_id', 'my_personal_memlog', 10) }} + +Das resultiert in einer Liste von Logeinträgen wie beispielsweise: + +.. image:: assets/visu_callable.png + :height: 302px + :width: 528px + :scale: 100% + :alt: Visu + :align: center + +Web Interface +============= + +Das Plugin verfügt über kein Web Interface, es kann aber in der SmartVISU genutzt werden. diff --git a/memlog/webif/static/img/plugin_logo.svg b/memlog/webif/static/img/plugin_logo.svg new file mode 100644 index 000000000..90543db16 --- /dev/null +++ b/memlog/webif/static/img/plugin_logo.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + MEMLOG + \ No newline at end of file From eae8e9db8e91d9644148806c060a0ab16dc7de60 Mon Sep 17 00:00:00 2001 From: Onkel Andy Date: Fri, 29 Dec 2023 22:57:06 +0100 Subject: [PATCH 2/5] memlog plugin: clean files --- memlog/callable.png | Bin 29018 -> 0 bytes memlog/webif/static/img/readme.txt | 6 -- memlog/webif/templates/index.html | 124 ----------------------------- 3 files changed, 130 deletions(-) delete mode 100755 memlog/callable.png delete mode 100755 memlog/webif/static/img/readme.txt delete mode 100755 memlog/webif/templates/index.html diff --git a/memlog/callable.png b/memlog/callable.png deleted file mode 100755 index 7fa4eac43bc596dd6f5c541e434076a66a9afd69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29018 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 diff --git a/memlog/webif/static/img/readme.txt b/memlog/webif/static/img/readme.txt deleted file mode 100755 index 1a7c55eef..000000000 --- a/memlog/webif/static/img/readme.txt +++ /dev/null @@ -1,6 +0,0 @@ -This directory is for storing images that are used by the web interface. - -If you want to have your own logo on the top of the web interface, store it here and name it plugin_logo.. - -Extension can be png, svg or jpg - diff --git a/memlog/webif/templates/index.html b/memlog/webif/templates/index.html deleted file mode 100755 index 0d49ce7de..000000000 --- a/memlog/webif/templates/index.html +++ /dev/null @@ -1,124 +0,0 @@ -{% extends "base_plugin.html" %} - -{% set logo_frame = false %} - - -{% set update_interval = 0 %} - - -{% block pluginscripts %} - -{% endblock pluginscripts %} - - -{% block headtable %} - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Prompt 1{% if 1 == 2 %}{{ _('Ja') }}{% else %}{{ _('Nein') }}{% endif %}Prompt 4{{ _('Wert 4') }}
Prompt 2{{ _('Wert 2') }}Prompt 5-
Prompt 3-Prompt 6-
-{% endblock headtable %} - - - -{% block buttons %} -{% if 1==2 %} -
- -
-{% endif %} -{% endblock %} - - -{% set tabcount = 4 %} - - - -{% if item_count==0 %} - {% set start_tab = 2 %} -{% endif %} - - - -{% set tab1title = "" ~ p.get_shortname() ~ " Items (" ~ item_count ~ ")" %} -{% block bodytab1 %} -
- {{ _('Hier kommt der Inhalt des Webinterfaces hin.') }} -
-{% endblock bodytab1 %} - - - -{% set tab2title = "" ~ p.get_shortname() ~ " Geräte (" ~ device_count ~ ")" %} -{% block bodytab2 %} -{% endblock bodytab2 %} - - - -{% block bodytab3 %} -{% endblock bodytab3 %} - - - -{% block bodytab4 %} -{% endblock bodytab4 %} From 68a0a9b2a44fecd27c7ae6e46b97d955ef0fd27e Mon Sep 17 00:00:00 2001 From: Onkel Andy Date: Fri, 29 Dec 2023 22:57:26 +0100 Subject: [PATCH 3/5] memlog plugin: push version 1.6.1., mark deprecated --- memlog/__init__.py | 5 ++--- memlog/plugin.yaml | 48 +++++++++++++++++++++------------------------- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/memlog/__init__.py b/memlog/__init__.py index 5b2437f4a..478309b99 100755 --- a/memlog/__init__.py +++ b/memlog/__init__.py @@ -30,10 +30,10 @@ class MemLog(SmartPlugin): - PLUGIN_VERSION = '1.6.0' + PLUGIN_VERSION = '1.6.1' def __init__(self, sh, *args, **kwargs): - + super().__init__() self.name = self.get_parameter_value('name') self.mappings = self.get_parameter_value('mappings') self.items = self.get_parameter_value('items') @@ -139,4 +139,3 @@ def log(self, logvalues, level = 'INFO'): logvalues = logvalues[1:] self._log.add(log) - diff --git a/memlog/plugin.yaml b/memlog/plugin.yaml index a27eacd94..248d5e444 100755 --- a/memlog/plugin.yaml +++ b/memlog/plugin.yaml @@ -3,15 +3,14 @@ plugin: # Global plugin attributes type: system # plugin type (gateway, interface, protocol, system, web) description: - de: 'Speichern der Logeinträge im Speicher (zur Anzeige in der VISU)' - en: 'Store log entries in memory (for display in VISU)' + de: 'Speichern der Logeinträge im Speicher (zur Anzeige in der VISU). Durch Bordmittel ersetzbar.' + en: 'Store log entries in memory (for display in VISU). Can be replaced by standard config.' maintainer: ohinckel tester: cmalo - state: ready + state: deprecated keywords: memory log # keywords, where applicable -# documentation: https://github.com/smarthomeNG/plugins/blob/develop/mqtt/README.md # url of documentation (wiki) page - version: 1.6.0 # Plugin version + version: 1.6.1 # 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) multi_instance: True @@ -40,26 +39,26 @@ parameters: # [time, thread, level, message] description: de: > - Definiert eine Liste mit kommagetrennten Werten die für jede Nachricht geloggt werden. + Definiert eine Liste mit kommagetrennten Werten die für jede Nachricht geloggt werden. Die folgenden internen Zuordnungen können benutzt werden: - + time - Zeitstempel des Eintrags thread - Thread der die Daten erzeugt level - Der log level (Standard ist INFO) message - Die Nachricht - - Die Vorgabe sollte beibehalten werden, wenn das Log in SmartVISU angezeigt werden soll, + + Die Vorgabe sollte beibehalten werden, wenn das Log in SmartVISU angezeigt werden soll, sonst werden die Werte von der SmartVISU für die Darstellung nicht korrekt interpretiert. en: > - This configures the list of values with comma separated values which are logged for each log message. + This configures the list of values with comma separated values which are logged for each log message. The following internal mappings can be used and will be automatically set if not given explicitely when logging data: - + time - the timestamp of log thread - the thread logging data level - the log level (defaults to INFO) message - the message - + The default value should not be changed. Otherwise the SmartVISU might misinterpret the values for display. maxlen: @@ -75,7 +74,7 @@ parameters: de: > Jedes mal wenn ein Item aktualisiert wird, wird ein Logeintrag geschrieben unter der Berücksichtigung der konfigurierten Items und deren Werte als Log Werte - + Wird dies nicht angegeben, dann werden die vorgegebenen Zuordnungswerte verwendet: - item_a --> now - item_b --> thread info @@ -85,7 +84,7 @@ parameters: en: > Each time an item is updated using the memlog configuration setting, a log entry will be written using the list of items configured in this attribute as log values. - + When this is not configured, the default mapping values will be used the associated item's value will be logged. e.g.: - item_a --> now @@ -100,7 +99,7 @@ item_attributes: description: de: > Bezeichnet den Namen des Logs in dem die Nachricht aufgezeichnet werden soll. - Alle´Einträge werden mit Level INFO erstellt + Alle Einträge werden mit Level INFO erstellt en: > Defines the name of in-memory log which should be used to log the item's content to the log. Everything is logged with 'INFO' level. @@ -128,36 +127,33 @@ logic_parameters: type: str description: de: > - Legt das Mitteilungsformat des Logeintrages fest. In der Zeichenkette können folgende Platzhalter enthalten + Legt das Mitteilungsformat des Logeintrages fest. In der Zeichenkette können folgende Platzhalter enthalten sein, die durch eine format Anweisung ersetzt werden: - + logic - Das Logik Objekt, z.B. logic.name für den Logiknamen plugin - Die Instanz des Memlog Plugins by - Ursprung des Logiktriggers source - Die Quelle dest - Das Ziel - Die Logik und Plugin Platzhalter sind immer verfügbar, die weiteren hängen davon ab + Die Logik und Plugin Platzhalter sind immer verfügbar, die weiteren hängen davon ab wie die Logik aufgerufen bzw. getriggert wurde - + Beispiel: memlog_message: "Die Logik {logic.name} wurde getriggert!" en: > Defines the message to be logged. It configures a string which may contain placeholders which got replaced by using the format() function. - + The following placeholders or object can be used in the message string: - + logic - the logic object, e.g. logic.name for the logic's name plugin - the memlog plugin instance object by - the string containing the origin of logic trigger source - the source dest - the destination - The logic and plugin placeholders are always available, the rest depends on the logic + The logic and plugin placeholders are always available, the rest depends on the logic invocation/trigger. - + Example: memlog_message: "The logic {logic.name} was triggered!" - - - From 4a19eba3a9fb506516f57a5ff01849bad8107b67 Mon Sep 17 00:00:00 2001 From: Onkel Andy Date: Fri, 29 Dec 2023 23:09:14 +0100 Subject: [PATCH 4/5] memlog plugin: fix docu --- memlog/user_doc.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/memlog/user_doc.rst b/memlog/user_doc.rst index 7d07f1e41..e8062804a 100644 --- a/memlog/user_doc.rst +++ b/memlog/user_doc.rst @@ -26,7 +26,7 @@ Ersatz durch Bordmittel Details zum Memory Loghandler sind unter :doc:`Logging Handler ` zu finden. Informationen zum Loggen bei Itemänderungen findet man unter -:doc:` log_change `. +:doc:`log_change `. Beispiel Logik -------------- From 29469f0106f78015d9e0779d57ca098b31999aac Mon Sep 17 00:00:00 2001 From: Morg42 <43153739+Morg42@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:56:59 +0100 Subject: [PATCH 5/5] Update user_doc.rst --- memlog/user_doc.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/memlog/user_doc.rst b/memlog/user_doc.rst index e8062804a..8be5a1962 100644 --- a/memlog/user_doc.rst +++ b/memlog/user_doc.rst @@ -18,8 +18,7 @@ zur Verfügung, bei der die Logeinträge im Arbeitsspeicher abgelegt werden. .. important:: - Die Funktionalität des Plugins ist auch über entsprechende Konfiguration der - ``etc/logging.yaml`` Datei sowie durch Nutzen des ``log_change`` Itemattributs abbildbar. + Das Plugin ist als "deprecated" abgekündigt. Ersatz der Funktionalität ist im nächsten Absatz beschrieben. Ersatz durch Bordmittel =======================