Пример #1
0
    def connect(self):
        """
        Connect to a knxd server, after connection commands can be sent.
        """

        self.socket = socket.socket()
        self.socket.connect((self.ip, int(self.port)))
        self.socket.send(encode_data('HHB', [self.EIB_OPEN_GROUPCON, 0, 0]))
        self.connected = True
Пример #2
0
    async def connect(self):
        """
        Connect to a knxd server

        """

        self.socket = socket.socket()
        self.socket.connect((self.ip, int(self.port)))
        self.socket.send(encode_data('HHB', [self.EIB_OPEN_GROUPCON, 0, 0]))

        reader, writer = await asyncio.open_connection(self.ip, self.port)
        writer.write(encode_data('HHB', [self.EIB_OPEN_GROUPCON, 0, 0]))

        async def listen(reader):
            while True:
                data = await reader.read(100)
                self.callback(data)

        self.loop.create_task(listen(reader))
Пример #3
0
        def listen():
            self.listening = True
            while self.listening:
                logger.debug('opening new connection')
                recv_socket = socket.socket()
                recv_socket.connect((self.ip, int(self.port)))
                recv_socket.send(
                    encode_data('HHB', [self.EIB_OPEN_GROUPCON, 0, 0]))

                buf = bytearray()
                num_read = 0
                telegram_length = 2

                # while self.listening:
                #     data = recv_socket.recv(100)
                #     print(data)

                while self.listening:
                    try:
                        data = recv_socket.recv(100)
                        if not data:
                            break

                        num_read += len(data)
                        buf.extend(data)
                        if num_read < telegram_length:
                            continue

                        telegram_length = (buf[0] << 0 | buf[1])
                        if num_read < telegram_length + 2:
                            continue

                        ttype = (buf[2] << 8 | buf[3])
                        if ttype != 39 or len(buf) < 6:
                            buf = bytearray()
                            num_read = 0
                            telegram_length = 2
                            continue

                        message = decode_telegram(buf)
                        callback(message)

                        telegram_length = 2
                        num_read = 0
                        buf = bytearray()

                    except:
                        logger.exception('exception while listening')
                        break

                recv_socket.close()
                time.sleep(1)
Пример #4
0
    async def group_read(self, ga):
        """
        Reads a value from the KNX bus

        Parameters
        ----------
        ga : string or int
            the group address to write to as a string (e.g. '1/1/64') or an integer (0-65535)

        """
        if type(ga) is str:
            addr = encode_ga(ga)
        else:
            addr = ga
        self.socket.send(
            encode_data('HHBB',
                        [self.EIB_GROUP_PACKET, addr, 0, self.KNXREAD]))
Пример #5
0
    def group_write(self, ga, data, dpt=None):
        """
        Writes a value to the KNX bus

        Parameters
        ----------
        ga : string or int
            the group address to write to as a string (e.g. '1/1/64') or an integer (0-65535)

        dpt : string
            the data point type of the group address, used to encode the data

        """

        if type(ga) is str:
            addr = encode_ga(ga)
        else:
            addr = ga
        if dpt is not None:
            encode_dpt(data, dpt)
        self.socket.send(
            encode_data(
                'HHBB',
                [self.EIB_GROUP_PACKET, addr, 0, self.KNXWRITE | data]))