def __init__(self, **kwargs):

        debug = False
        raceid = 0

        if kwargs.has_key("raceid"):
            raceid = kwargs.get("raceid")

        if kwargs.has_key("debug"):
            debug = (kwargs.get("debug") == 1)

        self.__serial = None
        self.__debugmode = debug
        self.__msg_temp = ""
        self.__lastCardId = ""
        self.__lastCards = {}
        self.__nodes = {}
        self.__nodeQueues = {}
        self.__nodesAngemeldet = 0

        #setup
        self.__active = True
        self.__port = '/dev/ttyUSB0'
        self.__raceid = raceid

        self.__setupRace(raceid)

        self.__starten()

        ausgabe(TYPE_DBG, "INIT beendet", self.__debugmode)

        return None
    def __parseCommand(self, newcommand):

        returnStatus = True

        if self.__raceid > 0:

            if newcommand.isValid:

                ausgabe(
                    TYPE_CMD, newcommand.commando + " " + newcommand.cardId +
                    " " + newcommand.slot, self.__debugmode)

                if newcommand.commando == COM_COMMAND_ADD:
                    self.__command_ADD(newcommand.cardId, newcommand.slot)

                elif newcommand.commando == COM_COMMAND_RMV:
                    self.__command_RMV(newcommand.cardId, newcommand.slot)

                elif newcommand.commando == COM_COMMAND_CHK:
                    self.__command_CHK(newcommand.cardId, newcommand.slot)

                elif newcommand.commando == COM_COMMAND_COL:
                    self.__command_COL(newcommand.slot)

                elif newcommand.commando == COM_COMMAND_WLK:
                    self.__command_WLK(newcommand.cid)

                elif newcommand.commando == COM_COMMAND_EXS:
                    self.__command_EXS(newcommand.cardId, newcommand.accessory,
                                       newcommand.slot)

        else:
            ausgabe(TYPE_ERR, "Kein Race gewaehlt", self.__debugmode)

        return returnStatus
    def beenden(self):

        returnStatus = True

        self.__active = False

        ausgabe(TYPE_DBG, "Node ({}) beenden".format(self.slot),
                self.__debugmode)

        #Threads beenden
        #Serial schliessen
        if not self.__con is None:
            self.__con.close()

        self.__queue.put(None)

        return returnStatus
    def sendToNode(self, message, nodeId=None):

        returnStatus = True

        if not nodeId is None:
            pass

        if not self.__con is None:

            message = message + ";"

            self.__con.write(message)

        else:
            ausgabe(TYPE_ERR, "Slot {} nicht verfuegbar".format(self.slot))

            returnStatus = False

        return returnStatus
    def __sendToNode(self, message, slot, nodeId=None):

        returnStatus = True

        if not nodeId is None:
            ausgabe(TYPE_DBG, str(nodeId), self.__debugmode)

        message = message + ";"

        #Nodeid stellt die i2c-adresse dar
        ausgabe(TYPE_OUT, message, self.__debugmode)

        if self.__nodes.has_key(slot):
            node = self.__nodes[slot]
            node.sendToNode(message, nodeId)
        else:
            returnStatus = False

        return returnStatus
    def __listenToNode(self):

        try:

            while self.__active == True:
                message = ""

                if not self.__con is None:
                    message = self.__con.readline().strip()

                if len(message) > 0:
                    #print(message)
                    message = self.__msg_temp + message
                    #print message

                    if message[:
                               3] == COM_PREFIX_CMD or message[:
                                                               3] == COM_PREFIX_ASK:

                        if message[-1:] == ";":
                            #Hier jetzt irgenwat machen
                            newcommand = self.__parseCommand(
                                message.replace(";", ""))
                            newcommand.cid = self.channelid
                            self.__queue.put(newcommand)

                            self.__msg_temp = ""
                        else:
                            self.__msg_temp = message

                    elif message[:3] == COM_INFO_RSP:
                        #sollte eigentlich nicht vorkommen
                        ausgabe(TYPE_RSP, message, self.__debugmode)

                    else:
                        ausgabe(TYPE_INF, message, self.__debugmode)

                time.sleep(0.01)

        except KeyboardInterrupt:
            ausgabe(TYPE_DBG,
                    "Abbruch mit STRG+C ({}) beendet".format(self.port),
                    self.__debugmode)
            self.beenden()

        except:
            self.beenden()

        ausgabe(TYPE_DBG, "ListenToNode ({}) beendet".format(self.port),
                self.__debugmode)
    def __readQueue(self):

        try:
            while self.__active:
                if self.__nodesAngemeldet > 0:
                    newcommand = self.__q.get()
                    if not newcommand is None:
                        ausgabe(TYPE_DBG,
                                "Neue Meldung von {}".format(newcommand.slot),
                                self.__debugmode)

                        self.__parseCommand(newcommand)
                    else:
                        ausgabe(TYPE_DBG, "None erhalten", self.__debugmode)
                        self.__nodesAngemeldet = self.__nodesAngemeldet - 1
                    self.__q.task_done()

                time.sleep(0.01)
        except KeyboardInterrupt:
            ausgabe(TYPE_DBG, "Abbruch mit STRG+C readQueue", self.__debugmode)

        ausgabe(TYPE_DBG, "readQueue beendet", self.__debugmode)
    def beenden(self):

        for cid, node in self.__nodes.items():
            ausgabe(TYPE_DBG, "Node {} beenden".format(node.slot),
                    self.__debugmode)
            node.beenden()
            #print(node.active, node.slot)
            self.__nodes[cid] = None
            time.sleep(1)

        self.__active = False

        ausgabe(TYPE_DBG, "Alle Node beendet", self.__debugmode)
        time.sleep(3)

        ausgabe(TYPE_DBG, "q-Thread Status: {}".format(self.__thQ.is_alive()),
                self.__debugmode)

        self.__thQ = None
    def __del__(self):

        ausgabe(TYPE_DBG, "Node ({}) beendet".format(self.slot),
                self.__debugmode)