diff --git a/jsonread/README.md b/jsonread/README.md deleted file mode 100644 index db32150f8..000000000 --- a/jsonread/README.md +++ /dev/null @@ -1,221 +0,0 @@ -# The jsonread plugin - -This is a generic JSON to smarthome plugin. Fetch any JSON encoded -data via http(s) or from a file, extract the interesting data and feed -the values to smarthome items. - -It uses the lightweight and flexible JSON processor jq [https://stedolan.github.io/jq/] - -# Dependencies - -This plugin requires -- requests -- requests-file -- pyjq - -# Configuration - -## Enable the plugin in etc/plugin.yaml - -You can add as many instances as you have JSON sources to process. Make sure to add a -unique instance name to each instance if you configure more than on instance. That -instance name will serve as a key to the item configuration further down. - -### Plugin specific attributes -#### url - -The address of the json data. Currently http://, https:// and file:// schemes are supported. -Note: using absolute file paths for the file:// schema yields in tripple forward slashes. This -might look funny but it is not an error. - -#### cycle - -The repetitive polling interval in seconds. Defaults to 30 seconds. - -### Example - -The following examples uses openweathermap and it's sample API Key. Don't use this key for anything else -but testing. Examples were taken from -[https://openweathermap.org/current]. - -### http client - - jsonread: - class_name: JSONREAD - class_path: plugins.jsonread - url: https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22 - cycle: 30 - -### file client - - jsonread: - class_name: JSONREAD - class_path: plugins.jsonread - url: file:///path/to/data.json - cycle: 30 - -### multi instance - jsonreadlon: - class_name: JSONREAD - class_path: plugins.jsonread - url: https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22 - instance: london - - jsonreadcair: - class_name: JSONREAD - class_path: plugins.jsonread - url: https://samples.openweathermap.org/data/2.5/weather?id=2172797&appid=b6907d289e10d714a6e88b30761fae22 - instance: cairns - - -## item configuration in items/myitem.yaml -This is the fun part. This is a sample item. Notice the special attribute jsonread_filter. - -### Single instance -just use the jsonread_filter attribute - - temperature: - type: num - jsonread_filter: .main.temp - -### Multi instance -Use the jsonread_filter@instance attribute syntax - - temperature: - london: - type: num - jsonread_filter@london: .main.temp - cairns: - type: num - jsonread_filter@cairns: .main.temp - -The value for the jsonread_filter attribute is a jq filter, passed directly to jq itself -Use any kind of jq filter that suites your needs. Make sure your filter returns a single value. -Jq filters can be tricky to develop for complex json structures. Getting them straight might be easier -outside of smarthome by using the commandline version of jq and curl like this - - curl https://json.server.org/data.json | jq '.object' - -Look at [https://stedolan.github.io/jq/tutorial/] to get startet with jq filters. - -# Example -## Fetch data from a SolarWatt Energy Manager and MyReserve -Note: this example uses the mutli-instance feature as it fetches data from two -sources. - -### Sample input data -#### BMSData.shtml -This file gets generated by SolarWatt's receiveBLE.py process on their raspi. The interesting -part looks like this: - - { - "FData": { - "IPV": 5.17, - "VBat": 170.1, - "VPV": 418.5, - "PGrid": 18, - "IBat": -9.91 - }, - "SData": { - "ACS": { - "U_L2": 239, - "f": 49.98 - }, - "SoC": 10 - } - } - -#### energy-manager json data -The energy manager produces a fairly huge JSON dataset, more than 4500 lines on my system. -This is an example, stripped down to what we use in this document - - { - "result": { - "items": [ - { - "guid": "urn:your-inverter-guid", - "tagValues": { - "PowerACOut": { - "value": 2419, - "tagName": "PowerACOut" - } - } - } - ] - } - } - -### etc/plugin.yaml - - swem: - class_name: JSONREAD - class_path: plugins.jsonread - # Replace with the ip address or hostname of your energy-manager - url: http://192.168.x.y/rest/kiwigrid/wizard/devices - instance: swem - cycle: 30 - - myreserve: - class_name: JSONREAD - class_path: plugins.jsonread - # Replace with the path to your BMSData-file - url: file:///tmp/BMSData.shtml - instance: myreserve - cycle: 10 - - -### items/myenergy.yaml - -Get the batteries voltage, charge current and charge power. - - battery: - u: - # note: we are fetching from the 'myreserve' plugin instance - # easy: get attribute VBat of the FData object - type: num - jsonread_filter@myreserve: .FData.VBat - i: - # easy: get attribute IBat of the FData object - type: num - jsonread_filter@myreserve: .FData.IBat - power: - # doing simple math is also straightforward - type: num - jsonread_filter@myreserve: (.FData.VBat * .FData.IBat * -1) - -Get the current inverter AC out power - - inverter: - type: num - # note: we are fetching from the 'swem' plugin instance - # from the items array in the result object, fetch the object where the guid matches our given guid - # from the resulting object, walk down the tree and fetch the "value" attribute - jsonread_filter@swem: (.result.items[] | select(.guid == "urn:your-inverter-guid").tagValues.PowerACOut.value) - # all standard attributes work as expected - visu_acl: r - sqlite: yes - -Compute the grid power, use yaml's block style feature (https://yaml-multiline.info/) to wrap long lines - - grid: - type: num - jsonread_filter@swem: > - (.result.items[] | - select(.deviceModel[].deviceClass == "com.kiwigrid.devices.solarwatt.MyReservePowermeter").tagValues.PowerOut.value) - - (.result.items[] | - select(.deviceModel[].deviceClass == "com.kiwigrid.devices.solarwatt.MyReservePowermeter").tagValues.PowerIn.value) - -# Disclaimer and License -This document and the jsonread plugin for smarthome.py is free software: -you can redistribute it and/or modify it under the terms of the -GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -smjq is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with jsonread. If not, see . diff --git a/jsonread/__init__.py b/jsonread/__init__.py deleted file mode 100644 index fa29ec54a..000000000 --- a/jsonread/__init__.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python3 -# -######################################################################### -# Copyright 2019 Torsten Dreyer torsten (at) t3r (dot) de -# Version 1.0.0 -######################################################################### -# -# This file is part of SmartHomeNG. -# -# SmartHomeNG is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# SmartHomeNG is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with SmartHomeNG. If not, see . -# -######################################################################### - -import logging -import requests -from requests_file import FileAdapter -import pyjq -from lib.model.smartplugin import SmartPlugin - - -class JSONREAD(SmartPlugin): - ALLOW_MULTIINSTANCE = True - PLUGIN_VERSION = "1.0.0" - - def __init__(self, sh, *args, **kwargs): - """ - Initializes the plugin - @param url: URL of the json data to fetch - @param cycle: the polling interval in seconds - """ - self.logger = logging.getLogger(__name__) - self._url = self.get_parameter_value('url') - self._cycle = self.get_parameter_value('cycle') - self._session = requests.Session() - self._session.mount('file://', FileAdapter()) - self._items = {} - - def run(self): - self.alive = True - self.scheduler_add(__name__, self.poll_device, cycle=self._cycle) - - def stop(self): - self.scheduler_remove(__name__ ) - self.alive = False - - def parse_item(self, item): - if self.has_iattr(item.conf, 'jsonread_filter'): - self._items[item] = self.get_iattr_value(item.conf, 'jsonread_filter') - - def poll_device(self): - try: - response = self._session.get(self._url) - - except Exception as ex: - self.logger.error("Exception when sending GET request for {}: {}".format(self._url,str(ex))) - return - - if response.status_code != 200: - self.logger.error("Bad response code from GET '{}': {}".format(self._url, response.status_code)) - return - - try: - json_obj = response.json() - except Exception as ex: - self.logger.error("Response from '{}' doesn't look like json '{}'".format(self._url, str(response.content)[:30])) - return - - for k in self._items.keys(): - try: - jqres = pyjq.first(self._items[k], json_obj) - - except Exception as ex: - self.logger.error("jq filter failed: {}'".format(str(ex))) - continue - - k(jqres) - diff --git a/jsonread/plugin.yaml b/jsonread/plugin.yaml deleted file mode 100755 index b58fd55f3..000000000 --- a/jsonread/plugin.yaml +++ /dev/null @@ -1,42 +0,0 @@ -# Metadata for the Smart-Plugin -plugin: - # Global plugin attributes - type: interface # plugin type (gateway, interface, protocol, system, web) - description: - de: 'json parser plugin basierend auf jq' - en: 'json parser plugin based on jq' - maintainer: Torsten Dreyer - tester: none (yet) - keywords: json - 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.0 # 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 # plugin supports multi instance - classname: JSONREAD # class containing the plugin - -parameters: - # Definition of parameters to be configured in etc/plugin.yaml - url: - type: str - mandatory: True - description: - de: 'URL der json Eingabe-Daten (z.B. http://foo.bar/input.json oder file:///pfad/zu/data.json)' - en: 'URL of the json input (e.g. http://foo.bar/input.json or file:///path/to/data.json)' - cycle: - type: int - mandatory: False - default: 30 - valid_min: 0 - description: - de: 'Das Abfrage-Intervall für die gegebene URL in Sekunden' - en: 'The polling interval for the given url in seconds' - - -item_attributes: - # Definition of item attributes defined by this plugin - jsonread_filter: - type: str - diff --git a/jsonread/requirements.txt b/jsonread/requirements.txt deleted file mode 100644 index de5b5f3aa..000000000 --- a/jsonread/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests-file -pyjq