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
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))
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)
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]))
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]))