Hallo zusammen,
ich stelle gerade auf SmarthomeNG V1.4 um und bin am verzweifeln.
Mein selbstgestricktes Plugin zur Rollo-Steuerung bekomme ich einfach nicht zum Laufen.
Beim Starten bekomme ich immer diese Fehlermeldung:
Ich denke ich habe etwas grundlegendes vergessen, aber ich sehe gerade den Wald vor lauter Bäumen nicht.
In der /etc/plugin.yaml steht
/plugins/rrrollo/plugin.yaml
/plugins/rrrollo/__init__.py
In meiner alten Smarthome läuft alles noch wunderbar, aber was mache ich falsch in der V1.4?
ich stelle gerade auf SmarthomeNG V1.4 um und bin am verzweifeln.
Mein selbstgestricktes Plugin zur Rollo-Steuerung bekomme ich einfach nicht zum Laufen.
Beim Starten bekomme ich immer diese Fehlermeldung:
Code:
2018-01-16 20:18:10 ERROR Main Unhandled exception: 'str' object has no attribute 'get' <class 'AttributeError'> File "/usr/local/smarthome/bin/smarthome.py", line 1055, in <module> sh.start() File "/usr/local/smarthome/bin/smarthome.py", line 435, in start self._plugins = lib.plugin.Plugins(self, configfile=self._plugin_conf_basename) File "/usr/local/smarthome/lib/plugin.py", line 98, in __init__ plugin_name, self.meta = self._get_pluginname_and_metadata(plugin, _conf[plugin]) File "/usr/local/smarthome/lib/plugin.py", line 141, in _get_pluginname_and_metadata plugin_name = plg_conf.get('plugin_name','').lower()
In der /etc/plugin.yaml steht
Code:
rollo: class_name = RRRollo class_path = plugins.rrrollo
/plugins/rrrollo/plugin.yaml
Code:
# Metadata for the Smart-Plugin plugin: # Global plugin attributes type: system # plugin type (gateway, interface, protocol, system, web) description: de: 'Steuerung der Rollos' en: '' maintainer: rrauer # tester: rrauer # keywords: rrollo # documentation: # url of documentation (wiki) page # support: version: 1.0.0 # Plugin version sh_minversion: 1.2 # minimum shNG version to use this plugin # sh_maxversion: # maximum shNG version to use this plugin (leave empty if latest) multi_instance: False # plugin supports multi instance classname: RRRollo # class containing the plugin parameters: # Definition of parameters to be configured in etc/plugin.yaml item_attributes: # Definition of item attributes defined by this plugin
/plugins/rrrollo/__init__.py
Code:
#!/usr/bin/env python3 # vim: set encoding=utf-8 tabstop=4 softtabstop=4 shiftwidth=4 expandtab ######################################################################### # Copyright 2017 R.Rauer rainer@rrauer.de ######################################################################### # This file is part of SmartHomeNG. # # Sample plugin for new plugins to run with SmartHomeNG version 1.4 and # upwards. # # 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 <http://www.gnu.org/licenses/>. # ######################################################################### # # info # Das Plugin rr_rollo mit der Klasse RRRollo wird durch ein Item getriggert im dem der # Wert 'RRRollo_Trigger' steht. # Beim sh-Start werden alle Rollos im dict self.rollos gespeichert, welche die Werte # RolloAutoAuf, RolloAutoZu oder RolloAutoSonne enthalten. # sind die jeweiligen icons 'True', wird die Aktion ausgeführt. # In den icons muss ein Wert RolloAutoPause mit dem icon für die Automatikpause angegeben werden # dieser wird vor einer Aktualisierung auf 0 abgefragt # import logging import socket import threading import time from lib.model.smartplugin import SmartPlugin #import sys # debugging #import pydevd class RRRollo(SmartPlugin): PLUGIN_VERSION = "1.0.0" ALLOW_MULTIINSTANCE = False self.logger = logging.getLogger(__name__) # pydevd.settrace('192.168.178.25', port=12000, stdoutToServer=True, stderrToServer=True) # pydevd.settrace('192.168.178.66', port=12000, stdoutToServer=True, stderrToServer=True) def __init__(self): logger.info('Init rrrollo') #self._sh = smarthome self.rollos = {} self.trigger = [] def run(self): self.logger.debug("Plugin '{}': run method called".format(self.get_fullname())) self.alive = True # if you want to create child threads, do not make them daemon = True! # They will not shutdown properly. (It's a python bug) def stop(self): self.logger.debug("Plugin '{}': stop method called".format(self.get_fullname())) self.alive = False def parse_item(self, item): #pydevd.settrace('192.168.178.25', port=12000, stdoutToServer=True, stderrToServer=True) if 'RolloAutoAuf' in item.conf: logger.debug("parse item: {0}".format(item)) path = item._path #self.rollos[path]= {'item' : item, 'AutoZu' : True} self.rollos[item]= {'path' : path, 'AutoAuf' : True} #return self.update_item elif 'RolloAutoZu' in item.conf: logger.debug("parse item: {0}".format(item)) path = item._path #self.rollos[path]= {'item' : item, 'AutoZu' : True} self.rollos[item]= {'path' : path, 'AutoAuf' : True} #return self.update_item elif 'RolloAutoSonne' in item.conf: logger.debug("parse item: {0}".format(item)) path = item._path #self.rollos[path]= {'item' : item, 'AutoZu' : True} self.rollos[item]= {'path' : path, 'AutoAuf' : True} #return self.update_item elif 'RRRollo_Trigger' in item.conf: logger.debug("parse item: {0}".format(item)) self.trigger = item return self.update_item else: return None def parse_logic(self, logic): if 'xxx' in logic.conf: # self.function(logic['name']) pass def update_item(self, item, caller=None, source=None, dest=None): #pydevd.settrace('192.168.178.25', port=12000, stdoutToServer=True, stderrToServer=True) if 'RRRollo_Trigger' in item.conf: logger.debug('RRRollo by: {0}{1}{2} '.format(caller, source, dest)) try: if item._value == 1: # auf fahren self.moved = [] self.move_up(item) item(0, 'rrrollo') elif item._value == 2: # zu fahren self.moved = [] self.move_down(item) item(0, 'rrrollo') elif item._value == 3: # sonnenschutz self.moved = [] self.move_sun(item) item(0, 'rrrollo') elif item._value == 4: # sonnenschutz oder auf je nach Einstellung self.moved = [] self.move_sun(item) self.move_up(item) item(0, 'rrrollo') except: logger.warning('rrrollo: update item error {0}{1}'.format(item),format(item._value)) item(0, 'rrrollo') elif caller != 'plugin': logger.info("update item: {0}".format(item.id())) def move_up(self, item): self.move('RolloAutoAuf','RolloAutoPause', 'auf fahren') #item(0, 'rrrollo') def move_down(self, item): self.move('RolloAutoZu','RolloAutoPause', 'schließen') #item(0, 'rrrollo') def move_sun(self, item): self.move('RolloAutoSonne','RolloAutoPause', 'Sonnenschutz fahren') #item(0, 'rrrollo') def move(self, adressRollo, adressPause, text): for rollo in self.rollos: if adressRollo in rollo.conf: autoPause = False if adressPause in rollo.conf: pauseItem = self._sh.return_item(rollo.conf[adressPause]) if pauseItem._value == 1: autoPause = True if rollo._value == True: try: moveItem = self._sh.return_item(rollo.conf[adressRollo]) except: logger.warning('rrrollo: item not found {}'.format(rollo.conf[adressRollo])) continue try: if autoPause == False: if str(moveItem._Item__parent) in self.moved: logger.info('rrrollo; {} wiederholsperre'.format(str(moveItem._Item__parent))) else: moveItem(rollo.conf['RolloAutoWert'], 'rrrollo') self.moved.append(str(moveItem._Item__parent)) logger.info('rrrollo: {0} automatisch {1} '.format(str(moveItem._Item__parent), text)) else: logger.info('rrrollo: {0} Automatik pausiert'.format(str(moveItem._Item__parent))) except: logger.warning('rrrollo: value not found {}'.format(rollo.conf[adressRollo])) continue
Kommentar