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