Skip to content

Commit

Permalink
operationlog plugin: introduce new placeholders for olog_text and all…
Browse files Browse the repository at this point in the history
…ow highlimit, lowlimit (in addition to highlim, lowlim)
  • Loading branch information
onkelandy committed Jan 2, 2024
1 parent aa737c1 commit 0055d16
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 33 deletions.
71 changes: 47 additions & 24 deletions operationlog/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,8 @@ def parse_item(self, item):
self._item_conf[id]['olog_rules'] = {}
self._item_conf[id]['olog_rules']['lowlim'] = None
self._item_conf[id]['olog_rules']['highlim'] = None
self._item_conf[id]['olog_rules']['lowlimit'] = None
self._item_conf[id]['olog_rules']['highlimit'] = None
self._item_conf[id]['olog_rules']['*'] = 'value'

if 'olog_txt' in item.conf:
Expand Down Expand Up @@ -249,9 +251,9 @@ def parse_item(self, item):
key = float(key_txt)
except:
key = key_txt
if key_txt in ['lowlim', 'highlim']:
self._item_conf[item.id()]['olog_rules']["*"] = 'value'
self._item_conf[item.id()]['olog_rules'][key] = value
if key_txt in ['lowlim', 'highlim', 'lowlimit', 'highlimit']:
self._item_conf[id]['olog_rules']["*"] = 'value'
self._item_conf[id]['olog_rules'][key] = value

self.logger.info('Item: {}, olog rules: {}'.format(id, self._item_conf[id]['olog_rules']))
return self.update_item
Expand Down Expand Up @@ -339,23 +341,32 @@ def update_item(self, item, caller=None, source=None, dest=None):
# this plugin does not change any item thus the check for caller is not really necessary
if item.conf['olog'] == self.name:
if len(self._items) == 0:
if item.id() in self._item_conf and 'olog_txt' in self._item_conf[item.id()]:
mvalue = item()
if 'olog_rules' in self._item_conf[item.id()]:
if 'lowlim' in self._item_conf[item.id()]['olog_rules']:
if item.type() == 'num':
if self._item_conf[item.id()]['olog_rules']['lowlim'] is not None and item() < float(self._item_conf[item.id()]['olog_rules']['lowlim']):
return
elif item.type() == 'str':
if self._item_conf[item.id()]['olog_rules']['lowlim'] is not None and item() < str(self._item_conf[item.id()]['olog_rules']['lowlim']):
return
if 'highlim' in self._item_conf[item.id()]['olog_rules']:
if item.type() == 'num':
if self._item_conf[item.id()]['olog_rules']['highlim'] is not None and item() >= float(self._item_conf[item.id()]['olog_rules']['highlim']):
return
elif item.type() == 'str':
if self._item_conf[item.id()]['olog_rules']['highlim'] is not None and item() >= str(self._item_conf[item.id()]['olog_rules']['highlim']):
return
id = item.property.path
if id in self._item_conf and 'olog_txt' in self._item_conf[id]:
mvalue = item.property.value
if 'olog_rules' in self._item_conf[id]:
if item.type() == 'num':
lowlimit = self._item_conf[id]['olog_rules']['lowlimit']
lowlim = self._item_conf[id]['olog_rules']['lowlim']
highlimit = self._item_conf[id]['olog_rules']['highlimit']
highlim = self._item_conf[id]['olog_rules']['highlim']
if lowlimit is not None and item() < float(lowlimit):
return
elif lowlim is not None and item() < float(lowlim):
return
if highlimit is not None and item() >= float(highlimit):
return
elif highlim is not None and item() >= float(highlim):
return
elif item.type() == 'str':
if lowlimit is not None and item() < str(lowlimit):
return
elif lowlim is not None and item() < str(lowlim):
return
if highlimit is not None and item() >= str(highlimit):
return
elif highlim is not None and item() >= str(highlim):
return
try:
mvalue = self._item_conf[id]['olog_rules'][item()]
except KeyError:
Expand All @@ -371,16 +382,28 @@ def update_item(self, item, caller=None, source=None, dest=None):
except Exception:
pname = ''
pid = ''
logtxt = self._item_conf[item.id()]['olog_txt'].format(*self._item_conf[item.id()]['olog_eval_res'],
time = shtime.now().strftime("%H:%M:%S")
date = shtime.now().strftime("%d.%m.%Y")
stamp = shtime.now().timestamp()
now = str(shtime.now())

logtxt = self._item_conf[id]['olog_txt'].format(*self._item_conf[id]['olog_eval_res'],
**{'value': item(),
'mvalue': mvalue,
'name': str(item),
'age': round(item.prev_age(), 2),
'pname': pname,
'id': item.id(),
'id': id,
'item': id,
'time': time,
'date': date,
'stamp': stamp,
'now': now,
'pid': pid,
'lowlim': self._item_conf[item.id()]['olog_rules']['lowlim'],
'highlim': self._item_conf[item.id()]['olog_rules']['highlim']})
'lowlimit': self._item_conf[id]['olog_rules']['lowlimit'],
'highlimit': self._item_conf[id]['olog_rules']['highlimit'],
'lowlim': self._item_conf[id]['olog_rules']['lowlim'],
'highlim': self._item_conf[id]['olog_rules']['highlim']})
logvalues = [logtxt]
else:
logvalues = [id, '=', item()]
Expand Down
27 changes: 18 additions & 9 deletions operationlog/user_doc.rst
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ operationlog
:height: 300px
:scale: 50 %
:align: left

Das OperationLog-Plugin kann genutzt werden, um Logs zu erzeugen. Diese können im Cache, im RAM und in Dateien gespeichert und durch andere Items oder Plugins angesprochen werden. Weiterhin können sie z.B. in der SmartVISU vom Standardwidget **status.log** angezeigt werden.

.. important::
Expand Down Expand Up @@ -174,7 +174,7 @@ Es wird jeden Tag eine neue Logdatei erzeugt und die letzten 50 Einträge werden

Die Einträge des zweiten Logs werden nicht im RAM gehalten und nicht in den Cache geschrieben, sondern nur in die Datei ``var/log/yearly_log-mylogname2-yyyy.log`` geschrieben.

Die Logdateien können frei benannt werden. Die Schlüsselwörter ``{name}``\ , ``{year}``\ , ``{month}`` und ``{day}`` werden durch den jeweiligen Namen bzw. die jeweilige Zeit ersetzt. Bei jedem Schreibvorgang in die Logdatei wird der Dateiname geprüft und bei Bedarf eine neue Datei erzeugt.
Die Logdateien können frei benannt werden. Die Schlüsselwörter ``{name}``, ``{year}``, ``{month}`` und ``{day}`` werden durch den jeweiligen Namen bzw. die jeweilige Zeit ersetzt. Bei jedem Schreibvorgang in die Logdatei wird der Dateiname geprüft und bei Bedarf eine neue Datei erzeugt.

Wenn die Daten auch in einen Systemlogger von SmartHomeNG geschrieben werden sollen, kann dieser unter ``logger`` angegeben werden.

Expand Down Expand Up @@ -205,7 +205,8 @@ In ``olog_rules`` kann eine Liste von Parametern angegeben werden, die einem Ite
Durch den yaml-Parser werden Angaben wie ``True:text1`` und ``False:text2`` (beachte Großschreibung) den bool-Werten `true` und `false` zugeordnet. Wenn das Item vom Typ `str` ist und der Text "True" oder "False" für die jeweilige Regel verwendet werden soll, muss er in Anführungszeichen gesetzt werden: ``"True:text1"`` bzw. ``"False:text2"``
Umgekehrt werden auch bei einem bool-Item die Angaben ``true:text1`` und ``false:text2`` (beachte Kleinschreibung) nicht als bool-Werte erkannt und führen daher bei Änderung des Items nicht zu einem Logeintrag.

Die zu loggenden Werte können begrenzt werden, indem die Angaben ``lowlimit:<niedrigster Wert>`` und ``highlimit:<höchster Wert>`` verwendet werden, siehe auch untenstehendes Beispiel. Ein Logeintrag wird erzeugt, wenn ``lowlim`` <= item value < ``highlim``.
Die zu loggenden Werte können begrenzt werden, indem die Angaben ``lowlimit:<niedrigster Wert>`` und ``highlimit:<höchster Wert>`` verwendet werden, siehe auch untenstehendes Beispiel. Ein Logeintrag wird erzeugt, wenn lowlimit <= item value < highlimit. Aus Kompatibilitätsgründen sind auch die
Einträge ``lowlim`` und ``highlim`` möglich.
Der auszugebende Text kann mit dem Parameter ``olog_txt`` festgelegt werden. Die folgenden vordefinierten Schlüsselwörter können dabei verwendet werden:

.. list-table::
Expand All @@ -223,13 +224,21 @@ Der auszugebende Text kann mit dem Parameter ``olog_txt`` festgelegt werden. Die
- Zeit seit der letzten Änderung des Items
* - ``{pname}``
- das Attribut ``name`` des Parent-Items
* - ``{id}``
* - ``{id} / {item}``
- die ID des Items
* - ``{pid}``
- die ID des Parent-Items
* - ``{lowlim}``
* - ``{time}``
- die aktuelle Uhrzeit im Format %H:%M:%S
* - ``{date}``
- das aktuele Datum im Format %d.%m.%Y
* - ``{now}``
- aktuelle Zeit, wie sie von shtime.now zurück käme (YYYY-MM-DD HH:MM:SS.ssssss+TZ)
* - ``{stamp}``
- der aktuelle Unix Zeitstempel
* - ``{lowlimit} / {lowlim}``
- unterer Grenzwert für Logeinträge
* - ``{highlim}``
* - ``{highlimit} / {highlim}``
- oberer Grenzwert für Logeinträge


Expand Down Expand Up @@ -287,9 +296,9 @@ Item Log Beispiele
name: Bar4
olog: mylogname1
olog_rules:
- lowlim:-1.0
- highlim:10.0
olog_txt: Item with name {name} has lowlim={lowlim} <= value={value} < highlim={highlim}, the value {eval='increased' if sh.foo.bar4() > sh.foo.bar4.prev_value() else 'decreased'} by {eval=round(abs(sh.foo.bar4() - sh.foo.bar4.prev_value()), 3)}
- lowlimit:-1.0
- highlimit:10.0
olog_txt: Item with name {name} has lowlimit={lowlimit} <= value={value} < highlimit={highlimit}, the value {eval='increased' if sh.foo.bar4() > sh.foo.bar4.prev_value() else 'decreased'} by {eval=round(abs(sh.foo.bar4() - sh.foo.bar4.prev_value()), 3)}
olog_level: info
bar5:
Expand Down

0 comments on commit 0055d16

Please sign in to comment.