executor

plugin logo

Einführung

Das executor Plugin kann genutzt werden, um Python Code (z.B. für Logiken) zu testen.

Wichtig

Seien Sie sich bewusst, dass die Aktivierung dieses Plugins ein Sicherheitsrisiko darstellen könnte. Wenn andere Personen Zugriff auf die Web-Schnittstelle erhalten, kann man das ganze SmartHomeNG-Biest kontrollieren. Seien Sie also vorsichtig!!!

Konfiguration

Das Aktivieren des Plugins ist ausreichend. Optional kann noch ein Verzeichnis für Skripte konfiguriert werden über das Attribut executor_scripts in der plugin.yaml. Damit wird dem Plugin eine relative Pfadangabe unterhalb var angegeben wo Skripte für das Executor Plugin abgelegt werden.

Webinterface

Im Webinterface findet sich eine Listbox mit den auf dem Rechner gespeicherten Skripten. Um das Skript in den Editor zu laden, entweder ein Skript in der Liste einfach anklicken und auf aus Datei laden klicken oder direkt in der Liste einen Doppelklick auf die gewünschte Datei ausführen.

Der Dateiname wird entsprechend der gewählten Datei gesetzt. Mit Klick auf aktuellen Code speichern wird der Code im konfigurierten Skript Verzeichnis unter dem aktuell in der Eingabebox vorgegebenem Dateinamen abgespeichert.

Mit einem Klick auf Code ausführen! oder der Kombination Ctrl+Return wird der Code an SmartHomeNG gesendet und ausgeführt. Das kann gerade bei Datenbank Abfragen recht lange dauern. Es kann keine Rückmeldung von SmartHomeNG abgefragt werden wie weit der Code derzeit ist. Das Ergebnis wird unten angezeigt. Solange kein Ergebnis vorliegt, steht im Ergebniskasten … processing …

Mit einem Klick auf Datei löschen wird versucht, die unter Dateiname angezeigte Datei ohne Rückfrage zu löschen. Anschliessend wird die Liste der Skripte aktualisiert.

Beispiel Python Code

Sowohl logger als auch print funktionieren für die Ausgabe von Ergebnissen. Die Idee ist, dass Logiken mehr oder weniger 1:1 kopiert und getestet werden können.

Loggertest

logger.warning("Eine Warnung")
logger.info("Eine Info")
logger.debug("Eine Debugmeldung")
logger.error("Eine Debugmeldung")

Datenserien für ein Item ausgeben

Abfragen von Daten aus dem database plugin für ein spezifisches Item:

import json

def myconverter(o):
    import datetime
    if isinstance(o, datetime.datetime):
      return o.__str__()
data = sh.<your item here>.series('max','1d','now')
pretty = json.dumps(data, default = myconverter, indent = 2, separators=(',', ': '))
print(pretty)

würde in folgendem Ergebnis münden:

{
  "sid": "ArbeitszimmerOG.Raumtemperatur|max|1d|now|100",
  "cmd": "series",
  "update": "2019-11-09 17:54:22.205668+01:00",
  "params": {
    "sid": "ArbeitszimmerOG.Raumtemperatur|max|1d|now|100",
    "update": true,
    "start": 1573317598203,
    "end": "now",
    "func": "max",
    "item": "ArbeitszimmerOG.Raumtemperatur",
    "step": 864000
  },
  "series": [
    [
      1573231198203,
      21.0
    ],
    [
      1573232535421,
      21.2
    ]
  ]
}

Zählen der Datensätze in der Datenbank

Das folgende Snippet zeigt alle Datenbank-Items an und zählt die Einträge in der Datenbank. Vorsicht: Dies kann sehr lange dauern, wenn Sie eine große Anzahl von Einträgen mit Datenbankattributen haben.

from lib.item import Items
items = Items.get_instance()
myfiller = "                                                            "
allItems = items.return_items()
for myItem in allItems:
    if not hasattr(myItem,'db'):
        continue
    mycount = myItem.db('countall', 0)
    print (myItem.property.name + myfiller[0:len(myfiller)-len(myItem.property.name)]+ ' - Anzahl Datensätze :'+str(mycount))