Hallo,
zur Steuerung meines Aquariums nutze ich eine NETIO230B Netzwerksteckdose. Ich habe mich dafür mal an einem Plugin versucht. Die Steckdose hat 4 Ports, die einzeln konfiguriert werden können. Das Plugin liefert 0 (aus), 1 (an) oder -1 (unbekannt) zurück. Die Portnummern beginnen bei 0. Über set_port(port,state) kann ein Port gesetzt werden. Danke für eure Verbesserungsvorschläge.
Viele Grüße
Mark
plugin.conf
items.conf
plugins/netio230b/__init__.py:
zur Steuerung meines Aquariums nutze ich eine NETIO230B Netzwerksteckdose. Ich habe mich dafür mal an einem Plugin versucht. Die Steckdose hat 4 Ports, die einzeln konfiguriert werden können. Das Plugin liefert 0 (aus), 1 (an) oder -1 (unbekannt) zurück. Die Portnummern beginnen bei 0. Über set_port(port,state) kann ein Port gesetzt werden. Danke für eure Verbesserungsvorschläge.
Viele Grüße
Mark
plugin.conf
Code:
[netio230b] class_name = NetIO230B class_path = plugins.netio230b address = 192.168.2.1 user = username password = password
Code:
[netio0] name = NetIO230B netio_port = 0 type = num value = -1
Code:
#!/usr/bin/env python import logging from urllib2 import Request, urlopen, URLError import re logger = logging.getLogger('netio230b') class NetIO230B(): def __init__(self, smarthome, address, user, password): self._sh = smarthome self.cycle = 10 self.ports = dict() self.timeout = 2 self.address = address self.user = user self.password = password def run(self): self._sh.scheduler.add('NetIO230B', self.update_status, cycle=self.cycle) self.alive = True def stop(self): self.alive = False def parse_item(self, item): if 'netio_port' in item.conf: self.ports[item.conf['netio_port']] = item return None def update_status(self): req = Request('http://'+self.address+'/tgi/control.cgi?login=p:'+self.user+':'+self.password+'&p=l') try: response = urlopen(req, timeout = self.timeout) except URLError as e: if hasattr(e, 'reason'): logger.error("failed to reach server: %s", str(e.reason)) elif hasattr(e, 'code'): logger.error("server could not fulfill the request: %s", str(e.code)) for key in self.ports.keys(): self.ports[key](-1) return else: # read html response of format '<html>1 0 1 0 </html>' html = response.read() r = re.compile('[^0^1]') cur_state = filter(None, r.split(html)) # assign values to items for key in self.ports.keys(): try: self.ports[key](cur_state[int(key)]) except IndexError, e: logger.error("no state for port: %s",str(e)) def set_port(self,port,state): req='' if (state == 1) or (state == 0): for portnr in range(0, 4): if (portnr == port) and ((state == 0) or (state == 1)): req += str(state) else: req += 'u' req = Request('http://'+self.address+'/tgi/control.cgi?login=p:'+self.user+':'+self.password+'&p='+req) try: response = urlopen(req, timeout = self.timeout) except URLError as e: if hasattr(e, 'reason'): logger.error("failed to reach server: %s", str(e.reason)) elif hasattr(e, 'code'): logger.error("server could not fulfill the request: %s", str(e.code)) else: html = response.read()
Kommentar