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/__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