Hallo,
ich bin gerade dran das dmx Modul anzupassen, dass auch mein DMX Adapter (DMXKing DMX512a) funktioniert.
Der verwendet ein völlig anderes Protokoll als die nanodmx dinger.
Zu meinem Problem: Im DMX512a Protokoll gibt es leider keine Möglichkeit einzelne Kanäle zu modifizieren. Es müssen immer die Kompletten 512 Kanäle (oder zumindest von Kanal 1 bis x durchgehend) geschickt werden. Der integrierte Microcontroller refresht dann automatisch (wie auch beim NanoDMX).
Da man keine einzelnen Kanäle aktualisieren kann, brauche ich ein Array dass während der Laufzeit von smarthome.py erhalten bleibt. Soweit ich das nachvollziehen kann, wird das Plugin ausgeführt und danach wieder beendet (was ja auch logisch ist).
Nachdem ich absolut keine python Erfahrung habe: Weiss jemand Rat ?
Hier noch der Code:
PS: ich bin auch für Tipps/Feedback jeglicher Art empfänglich
ich bin gerade dran das dmx Modul anzupassen, dass auch mein DMX Adapter (DMXKing DMX512a) funktioniert.
Der verwendet ein völlig anderes Protokoll als die nanodmx dinger.
Zu meinem Problem: Im DMX512a Protokoll gibt es leider keine Möglichkeit einzelne Kanäle zu modifizieren. Es müssen immer die Kompletten 512 Kanäle (oder zumindest von Kanal 1 bis x durchgehend) geschickt werden. Der integrierte Microcontroller refresht dann automatisch (wie auch beim NanoDMX).
Da man keine einzelnen Kanäle aktualisieren kann, brauche ich ein Array dass während der Laufzeit von smarthome.py erhalten bleibt. Soweit ich das nachvollziehen kann, wird das Plugin ausgeführt und danach wieder beendet (was ja auch logisch ist).
Nachdem ich absolut keine python Erfahrung habe: Weiss jemand Rat ?
Hier noch der Code:
PS: ich bin auch für Tipps/Feedback jeglicher Art empfänglich

Code:
#!/usr/bin/env python
# vim: set encoding=utf-8 tabstop=4 softtabstop=4 shiftwidth=4 expandtab
#########################################################################
# Copyright 2011 KNX-User-Forum e.V. https://knx-user-forum.de/
#########################################################################
# This file is part of SmartHome.py. http://smarthome.sourceforge.net/
#
# SmartHome.py 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. If not, see <http://www.gnu.org/licenses/>.
#########################################################################
import logging
import threading
import serial
logger = logging.getLogger('')
class DMX():
# _dim = 10^((n-1)/(253/3)-1) by JNK from KNX UF
#_dim = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 28, 29, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 50, 51, 52, 54, 55, 57, 58, 60, 62, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 86, 88, 90, 93, 95, 98, 101, 104, 106, 109, 112, 115, 119, 122, 125, 129, 132, 136, 140, 144, 148, 152, 156, 160, 165, 169, 174, 179, 184, 189, 194, 199, 205, 211, 216, 222, 228, 235, 241, 248, 255 ]
self._dmxdata=[chr(0)]*513
def __init__(self, smarthome, tty, adapter):
self._sh = smarthome
self._adapter = adapter
self._is_connected = False
self._lock = threading.Lock()
try:
self._port = serial.Serial(tty, 38400, timeout=1)
except:
logger.error("Could not open %s." % tty)
return
else:
self._is_connected = True
if not self._send_nanodmx("C?") and adapter == "nanodmx":
logger.warning("Could not communicate with dmx adapter.")
self._is_connected = False
if adapter == "dmx512a":
self._dmxopen=chr(126)
self._dmxclose=chr(231)
self._dmxinit1=chr(03)+chr(02)+chr(0)+chr(0)+chr(0)
self._dmxinit2=chr(10)+chr(02)+chr(0)+chr(0)+chr(0)
self._dmxintensity=chr(6)+chr(1)+chr(2)
self._port.write(self._dmxopen+self._dmxinit1+self._dmxclose)
self._port.write(self._dmxopen+self._dmxinit2+self._dmxclose)
def _send_dmx512a(self, data):
if not self._is_connected:
return False
self._lock.acquire()
self._port.write(data)
self._lock.release()
return True
def _send_nanodmx(self, data):
if not self._is_connected:
return False
self._lock.acquire()
try:
self._port.write(data)
ret = self._port.read(1)
except:
logger.warning("Problem sending data to dmx adapter.")
ret = 'F'
self._lock.release()
if ret == 'G':
return True
else:
return False
def run(self):
self.alive = True
def stop(self):
self._port.close()
self.alive = False
def send(self, channel, value):
logger.debug("update dmx channel {0:03d} {1:03d}".format(channel, int(value)))
if self._adapter == "nanodmx":
self._send_nanodmx("C{0:03d}L{1:03d}".format(int(channel), int(value)))
if self._adapter == "dmx512a":
self._dmxdata[channel]=chr(value)
sdata=''.join(self._dmxdata)
self._send_dmx512a(self._dmxopen+self._dmxintensity+sdata+self._dmxclose)
def parse_item(self, item):
if 'dmx_ch' in item.conf:
channels = item.conf['dmx_ch']
if isinstance(channels, str):
channels = [channels, ]
channels = map(int, channels)
item.conf['dmx_ch'] = channels
return self.update_item
else:
return None
def update_item(self, item, caller=None, source=None, dest=None):
#logger.debug("update dmx channel {0:03d}".format(item.dmx_ch))
for channel in item.conf['dmx_ch']:
self.send(channel, item())


Kommentar