Hallo,
leider haben bei mir die Plugins zum Auslesen meines SMA-Wechselrichters über bluetooth nicht zuverlässig funktioniert.
Deshalb habe ich mich als blutiger Anfänger in Sachen Python an einem neuen Plugin versucht.
Bitte beachtet auch die Hinweise des Herstellers und prüft vorher auf der Homepage https://www.sma.de/ ob Euer Wechselrichter die Modbusregister unterstützt.
Bei Fragen, Anregungen und Verbesserungen bitte melden.
Nutzung auf eigene Gefahr :-)
Modul installieren:
plugin.yaml
item.conf
Gruß
Klaus
leider haben bei mir die Plugins zum Auslesen meines SMA-Wechselrichters über bluetooth nicht zuverlässig funktioniert.
Deshalb habe ich mich als blutiger Anfänger in Sachen Python an einem neuen Plugin versucht.
Bitte beachtet auch die Hinweise des Herstellers und prüft vorher auf der Homepage https://www.sma.de/ ob Euer Wechselrichter die Modbusregister unterstützt.
Bei Fragen, Anregungen und Verbesserungen bitte melden.
Nutzung auf eigene Gefahr :-)
Modul installieren:
Code:
pip3 install pymodbus
Code:
#!/usr/bin/env python3 # ######################################################################### # Copyright 2017 kla.b kla.b(a)gmx.de # Version 1.3.0 ######################################################################### # Free for non-commercial use # # Plugin for the software SmartHome.py (NG), which allows to read # devices such as the SMA Inverter # # 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. # # SmartHome.py 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 SmartHome.py (NG). If not, see <http://www.gnu.org/licenses/>. # ######################################################################### import logging import time from lib.model.smartplugin import SmartPlugin # Modbus from pymodbus.constants import Endian from pymodbus.payload import BinaryPayloadDecoder from pymodbus.client.sync import ModbusTcpClient as ModbusClient class SMAModbus(SmartPlugin): ALLOW_MULTIINSTANCE = True PLUGIN_VERSION = '1.3.0' def __init__(self, sh, port = 502, host = '', cycle = 300): self.logger = logging.getLogger(__name__) self.logger.debug("starting monitoring service") self._sh = sh self._port = int(port) self._cycle = int(cycle) self._host = host self._items = {} def run(self): self.alive = True self._sh.scheduler.add('SMAModbus', self.update_status, cycle=self._cycle) def stop(self): self.alive = False def parse_item(self, item): if self.has_iattr(item.conf, 'register'): modbus_register = self.get_iattr_value(item.conf, 'register') self._items[modbus_register]=item self.logger.debug("item: {0} added with modbus_register: {1}".format(item,modbus_register)) return self.update_item else: return None def parse_logic(self, logic): pass def update_item(self, item, caller=None, source=None, dest=None): if caller != 'SMAModbus': self.logger.info("update item: {0}".format(item.id())) def update_status(self): for read_parameter in self._items: client = ModbusClient(self._host, self._port) client.connect() result = client.read_holding_registers((int(read_parameter)), 2, unit=3) decoder = BinaryPayloadDecoder.fromRegisters(result.registers, byteorder=Endian.Big) decoded = { 'value': decoder.decode_32bit_uint(), } valueend = decoded.get("value") self.logger.debug("value is {0} key is {1} self._item is {2}".format(valueend, read_parameter, self._items[read_parameter])) if read_parameter in self._items: # self. logger.debug("update item {0} with {1}".format(self._items[read_parameter], value)) item = self._items[read_parameter] item (valueend, 'register') client.close() return
plugin.yaml
Code:
SMAModbus1: class_name: SMAModbus class_path: plugins.smamb instance: sb3000tl host: 192.168.1.16 # port: 502 #optional # cycle: 150 #optional SMAModbus2: class_name: SMAModbus class_path: plugins.smamb instance: sb5000tl host: 192.168.1.17 # port: 502 #optional # cycle: 300 #optional
Code:
[SB3000TL] [[leistung]] type = num visu_acl = ro register@sb3000tl = 30775 [SB5000TL] [[seriennummer]] type = num visu_acl = ro register@sb5000tl = 30057
Klaus
Kommentar