From 4734b0075ed34f0bf47c4479fe58221aeef5dc90 Mon Sep 17 00:00:00 2001 From: "juergen.heckmann heckmann" Date: Thu, 23 Mar 2017 23:27:23 +0100 Subject: [PATCH 1/3] bcontrolEM300 plugin --- bcontrolEM300/__init__.py | 102 ++++++++++++++++++++++++++++++++++++++ bcontrolEM300/config.md | 5 ++ bcontrolEM300/item.md | 74 +++++++++++++++++++++++++++ bcontrolEM300/plugin.conf | 3 ++ 4 files changed, 184 insertions(+) create mode 100644 bcontrolEM300/__init__.py create mode 100644 bcontrolEM300/config.md create mode 100644 bcontrolEM300/item.md create mode 100644 bcontrolEM300/plugin.conf diff --git a/bcontrolEM300/__init__.py b/bcontrolEM300/__init__.py new file mode 100644 index 0000000..ae6ff3c --- /dev/null +++ b/bcontrolEM300/__init__.py @@ -0,0 +1,102 @@ +################################################################################ +# Copyright 2017 Jürgen Heckmann heckmannju (at) gmail.com +################################################################################ +# +# EM300 plugin for Callidomus. https://www.callidomus.com +# +# This plugin 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. +# +# This Plugin 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 Foobar. If not, see . +# +# EM300 plugin für Callidomus. https://www.callidomus.com +# +# Diese Plugin ist Freie Software: Sie können es unter den Bedingungen +# der GNU General Public License, wie von der Free Software Foundation, +# Version 3 der Lizenz oder (nach Ihrer Wahl) jeder späteren +# veröffentlichten Version, weiterverbreiten und/oder modifizieren. +# +# Dises Plugin wird in der Hoffnung, dass es nützlich sein wird, aber +# OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite +# Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. +# Siehe die GNU General Public License für weitere Details. +# +# Sie sollten eine Kopie der GNU General Public License zusammen mit diesem +# Programm erhalten haben. Wenn nicht, siehe . +# +################################################################################ + +import lib.plugin +import requests +import time + +class EM300LR(lib.plugin.Plugin): + + def __init__(self, core, conf): + lib.plugin.Plugin.__init__(self, core, conf) + self.ip = str(conf.get('host')) + self.items = {} + self.sessioncookie = None + core.scheduler.add('EM300:'+self.id, self.update, cycle=int(conf.get('cycle', 300))) + + def start(self): + self.alive = True + + def stop(self): + self.alive = False + + def pre_stage(self): + if self.instances > 1: + for node in self._core.config.query_nodes('em300', children=self.path): + self.parse_node(node) + for node in self._core.config.query_nodes('em300', em300_node=self.path): + self.parse_node(node) + else: + for node in self._core.config.query_nodes('em300'): + self.parse_node(node) + + def parse_node(self, node): + value = node.attr['em300'] + self.items[value] = node + + def update(self, value=None, trigger=None): + #start = time.time() + urlstart = 'http://{}/start.php'.format(self.ip) + urldata = 'http://{}/mum-webservice/data.php'.format(self.ip) + headers = {'Content-Type': 'application/x-www-form-urlencoded'} + + if self.sessioncookie == None: + self.logger.debug("collectiong session cookie...") + r = requests.get(urlstart, headers=headers) + response = r.json() + serial = response['serial'] + authentication = response['authentication'] + + if( authentication != True): + self.logger.error("Support only EM300LRs without password") + return + + PHPSESSID = r.cookies['PHPSESSID'] + self.sessioncookie = dict(PHPSESSID=PHPSESSID) + self.logger.debug("Session Cookie {} for {} serial {} found".format(PHPSESSID,self.ip,serial)) + + r = requests.get(urldata, cookies=self.sessioncookie, headers=headers) + if r.status_code == 200: + response = r.json() + for keyword, item in self.items.items(): + try: + value = response[keyword] + item(value, trigger=self.get_trigger()) + except: + self.logger.warning("keyword {} not in json response".format(keyword)) + #self.logger.debug("EM300: reading took: {:.4f}s".format(time.time() - start)) + else: + self.sessioncookie = None # hoffentlich klappts dann beim nächsten mal \ No newline at end of file diff --git a/bcontrolEM300/config.md b/bcontrolEM300/config.md new file mode 100644 index 0000000..15ddcdd --- /dev/null +++ b/bcontrolEM300/config.md @@ -0,0 +1,5 @@ +{{ +form.guiInput('host', label='Host', required=None, help="""IP Adresse der EM300 LR""") +select_data = oDict([('10', '10 Sekunden'), ('60', '1 Minute'), ('300', '5 Minuten'), ('900', '15 Minuten'), ('1800', '30 Minuten')]) +form.guiSelect('cycle', label='Abfrageintervall', named=select_data) +}} diff --git a/bcontrolEM300/item.md b/bcontrolEM300/item.md new file mode 100644 index 0000000..a063050 --- /dev/null +++ b/bcontrolEM300/item.md @@ -0,0 +1,74 @@ +{{ +form.guiSelect('em300_node', label='EM300 LR', named={'': 'Automatik'}, data_plugin='EM300LR') + +select_data = oDict([ + ('', ''), + + ('serial', 'Seriennummer'), + + ('1-0:1.4.0*255', 'Active power+ Wirkleistung Bezug W'), + ('1-0:1.8.0*255', 'Active energy+ Wirkenergie Bezug Wh'), + ('1-0:2.4.0*255', 'Active power- Wirkleistung Einspeisung W'), + ('1-0:2.8.0*255', 'Active energy- Wirkenergie Einspeisung Wh'), + ('1-0:3.4.0*255', 'Reactive power+ Blindleistung Bezug var'), + ('1-0:3.8.0*255', 'Reactive energy+ Blindenergy Bezug varh'), + ('1-0:4.4.0*255', 'Reactive power- Blindleistung Einspeisung var'), + ('1-0:4.8.0*255', 'Reactive energy- Blindenergy Einspeisung varh'), + ('1-0:9.4.0*255', 'Apparent power+ Scheinleistung Bezug VA'), + ('1-0:9.8.0*255', 'Apparent energy+ Scheinenergy Bezug VAh'), + ('1-0:10.4.0*255', 'Apparent power- Scheinleistung Einspeisung VA'), + ('1-0:10.8.0*255', 'Apparent energy- Scheinenergy Einspeisung VAh'), + ('1-0:13.4.0*255', 'Power factor Leistungsfaktor'), + ('1-0:14.4.0*255', 'Supply frequency Netzfrequenz Hz'), + + ('1-0:21.4.0*255', 'Active power+ (L1) Wirkleistung Bezug (L1) W'), + ('1-0:21.8.0*255', 'Active energy+ (L1) Wirkenergie Bezug (L1) Wh'), + ('1-0:22.4.0*255', 'Active power- (L1) Wirkleistung Einspeisung (L1) W'), + ('1-0:22.8.0*255', 'Active energy- (L1) Wirkenergie Einspeisung (L1) Wh'), + ('1-0:23.4.0*255', 'Reactive power+ (L1) Blindleistung Bezug (L1) var'), + ('1-0:23.8.0*255', 'Reactive energy+ (L1) Blindenergy Bezug (L1) varh'), + ('1-0:24.4.0*255', 'Reactive power- (L1) Blindleistung Einspeisung (L1) var'), + ('1-0:24.8.0*255', 'Reactive energy- (L1) Blindenergy Einspeisung (L1) varh'), + ('1-0:29.4.0*255', 'Apparent power+ (L1) Scheinleistung Bezug (L1) VA'), + ('1-0:29.8.0*255', 'Apparent energy+ (L1) Scheinenergy Bezug (L1) VAh'), + ('1-0:30.4.0*255', 'Apparent power- (L1) Scheinleistung Einspeisung (L1) VA'), + ('1-0:30.8.0*255', 'Apparent energy- (L1) Scheinenergy Einspeisung (L1) VAh'), + ('1-0:31.4.0*255', 'Current (L1) Strom (L1) A'), + ('1-0:32.4.0*255', 'Voltage (L1) Spannung (L1) V'), + ('1-0:33.4.0*255', 'Power factor (L1) Leistungsfaktor (L1)'), + + ('1-0:41.4.0*255', 'Active power+ (L2) Wirkleistung Bezug (L2) W'), + ('1-0:41.8.0*255', 'Active energy+ (L2) Wirkenergie Bezug (L2) Wh'), + ('1-0:42.4.0*255', 'Active power- (L2) Wirkleistung Einspeisung (L2) W'), + ('1-0:42.8.0*255', 'Active energy- (L2) Wirkenergie Einspeisung (L2) Wh'), + ('1-0:43.4.0*255', 'Reactive power+ (L2) Blindleistung Bezug (L2) var'), + ('1-0:43.8.0*255', 'Reactive energy+ (L2) Blindenergy Bezug (L2) varh'), + ('1-0:44.4.0*255', 'Reactive power- (L2) Blindleistung Einspeisung (L2) var'), + ('1-0:44.8.0*255', 'Reactive energy- (L2) Blindenergy Einspeisung (L2) varh'), + ('1-0:49.4.0*255', 'Apparent power+ (L2) Scheinleistung Bezug (L2) VA'), + ('1-0:49.8.0*255', 'Apparent energy+ (L2) Scheinenergy Bezug (L2) VAh'), + ('1-0:50.4.0*255', 'Apparent power- (L2) Scheinleistung Einspeisung (L2) VA'), + ('1-0:50.8.0*255', 'Apparent energy- (L2) Scheinenergy Einspeisung (L2) VAh'), + ('1-0:51.4.0*255', 'Current (L2) Strom (L2) A'), + ('1-0:52.4.0*255', 'Voltage (L2) Spannung (L2) V'), + ('1-0:53.4.0*255', 'Power factor (L2) Leistungsfaktor (L2)'), + + ('1-0:61.4.0*255', 'Active power+ (L3) Wirkleistung Bezug (L3) W'), + ('1-0:61.8.0*255', 'Active energy+ (L3) Wirkenergie Bezug (L3) Wh'), + ('1-0:62.4.0*255', 'Active power- (L3) Wirkleistung Einspeisung (L3) W'), + ('1-0:62.8.0*255', 'Active energy- (L3) Wirkenergie Einspeisung (L3) Wh'), + ('1-0:63.4.0*255', 'Reactive power+ (L3) Blindleistung Bezug (L3) var'), + ('1-0:63.8.0*255', 'Reactive energy+ (L3) Blindenergie Bezug (L3) varh'), + ('1-0:64.4.0*255', 'Reactive power- (L3) Blindleistung Einspeisung (L3) var'), + ('1-0:64.8.0*255', 'Reactive energy- (L3) Blindenergie Einspeisung (L3) varh'), + ('1-0:69.4.0*255', 'Apparent power+ (L3) Scheinleistung Bezug (L3) VA'), + ('1-0:69.8.0*255', 'Apparent energy+ (L3) Scheinenergie Bezug (L3) VAh'), + ('1-0:70.4.0*255', 'Apparent power- (L3) Scheinleistung Einspeisung (L3) VA'), + ('1-0:70.8.0*255', 'Apparent energy- (L3) Scheinenergie Einspeisung (L3) VAh'), + ('1-0:71.4.0*255', 'Current (L3) Strom (L3) A'), + ('1-0:72.4.0*255', 'Voltage (L3) Spannung (L3) V'), + ('1-0:73.4.0*255', 'Power factor (L3) Leistungsfaktor (L3)'), + + ]) +form.guiSelect('em300', label='Wert', named=select_data) +}} diff --git a/bcontrolEM300/plugin.conf b/bcontrolEM300/plugin.conf new file mode 100644 index 0000000..316609c --- /dev/null +++ b/bcontrolEM300/plugin.conf @@ -0,0 +1,3 @@ +[EM300LR] + class = EM300LR + items = items.conf From 56eb85bae949599e21cadc510b6f4a1c915603be Mon Sep 17 00:00:00 2001 From: "juergen.heckmann heckmann" Date: Thu, 23 Mar 2017 23:49:26 +0100 Subject: [PATCH 2/3] bcontrolEM300 readme --- bcontrolEM300/README.md | 25 +++++++++++++++++++++++++ bcontrolEM300/README.md.bak | 1 + 2 files changed, 26 insertions(+) create mode 100644 bcontrolEM300/README.md create mode 100644 bcontrolEM300/README.md.bak diff --git a/bcontrolEM300/README.md b/bcontrolEM300/README.md new file mode 100644 index 0000000..ef24721 --- /dev/null +++ b/bcontrolEM300/README.md @@ -0,0 +1,25 @@ +# plugins + +# Das Plugin liest die Zähler EM300 aus. + +welche folgende Daten liefert. +* Wirkleistung +* Blindleistung +* Scheinleistung +* Summe und Einzelphasen +* Leiterspannungen +* Leiterströme +* Leistungsfaktor + +Auf der Website +https://www.b-control.com/produkte/em-300.html +findet man mehr Details darüber. + +Programmiert wurde das ganze gegen diese API beschreibung +https://www.b-control.com/fileadmin/Webdata/b-control/Uploads/Downloads/Energy_Management/Deutsch/B-control_Energy_Manager_-_JSON-API.0101.pdf + +Wenn ich mich nicht verzählt habe gibt es 59 Messerte die ausgelesen werden können. + +Getestet wurde es mit den Zählern EM300 LR die Versionen EM300 L und EM300 LRW sollten aber auch gehen. + +Zum einrichten muss man nur die IP angeben unter welcher der Zähler erreichbar ist und die Abfragefrequenz. diff --git a/bcontrolEM300/README.md.bak b/bcontrolEM300/README.md.bak new file mode 100644 index 0000000..f130fd1 --- /dev/null +++ b/bcontrolEM300/README.md.bak @@ -0,0 +1 @@ +# plugins From c32b8a9bc22d6f51c02bcc469d35e2be4b6c1b31 Mon Sep 17 00:00:00 2001 From: heckmannju Date: Thu, 23 Mar 2017 23:54:23 +0100 Subject: [PATCH 3/3] Delete README.md.bak --- bcontrolEM300/README.md.bak | 1 - 1 file changed, 1 deletion(-) delete mode 100644 bcontrolEM300/README.md.bak diff --git a/bcontrolEM300/README.md.bak b/bcontrolEM300/README.md.bak deleted file mode 100644 index f130fd1..0000000 --- a/bcontrolEM300/README.md.bak +++ /dev/null @@ -1 +0,0 @@ -# plugins