示例#1
0
    def send(self, command, parameters=None):
        """Build and send the given command."""
        if self._devtype is None or self._serial is None:
            self.__enter__()  # when called outside of cm, initialize.

        cmd = {
            "id": self._id,
            "method": command,
        }

        if parameters:
            cmd["params"] = parameters

        header = {
            'length': 0,
            'unknown': 0x00000000,
            'devtype': self._devtype,
            'serial': self._serial,
            'ts': datetime.datetime.utcnow()
        }

        msg = {
            'data': {
                'value': cmd
            },
            'header': {
                'value': header
            },
            'checksum': 0
        }
        ctx = {'token': self.token}
        m = Message.build(msg, ctx)
        _LOGGER.debug("%s:%s >>: %s" % (self.ip, self.port, cmd))
        if self.debug > 1:
            _LOGGER.debug("send (timeout %s): %s", self._timeout,
                          Message.parse(m, ctx))

        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.settimeout(self._timeout)

        try:
            s.sendto(m, (self.ip, self.port))
        except OSError as ex:
            _LOGGER.error("failed to send msg: %s" % ex)
            raise DeviceException from ex

        try:
            data, addr = s.recvfrom(1024)
            m = Message.parse(data, ctx)
            if self.debug > 1:
                _LOGGER.debug("recv: %s" % m)
            _LOGGER.debug(
                "%s:%s (ts: %s) << %s" %
                (self.ip, self.port, m.header.value.ts, m.data.value))
            return m.data.value["result"]
        except OSError as ex:
            _LOGGER.error("got error when receiving: %s", ex)
            raise DeviceException from ex
示例#2
0
    def send(self, command, parameters=None):
        """Build and send the given command."""
        cmd = {
            "id": self._id,
            "method": command,
        }

        if parameters:
            cmd["params"] = parameters

        header = {
            'length': 0,
            'unknown': 0x00000000,
            'devtype': 0x02f2,
            'serial': 0xa40d,
            'ts': datetime.datetime.utcnow()
        }

        msg = {
            'data': {
                'value': cmd
            },
            'header': {
                'value': header
            },
            'checksum': 0
        }
        m = Message.build(msg)
        _LOGGER.debug("%s:%s >>: %s" % (self.ip, self.port, cmd))
        if self.debug > 1:
            _LOGGER.debug("send (timeout %s): %s", self._timeout,
                          Message.parse(m))

        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.settimeout(self._timeout)

        try:
            s.sendto(m, (self.ip, self.port))
        except Exception as ex:
            _LOGGER.error("failed to send msg: %s" % ex)

        try:
            data, addr = s.recvfrom(1024)
            m = Message.parse(data)
            if self.debug > 1:
                _LOGGER.debug("recv: %s" % m)
            _LOGGER.debug(
                "%s:%s (ts: %s) << %s" %
                (self.ip, self.port, m.header.value.ts, m.data.value))
            return m.data.value["result"]
        except Exception as ex:
            _LOGGER.error("got error when receiving: %s" % ex)
            raise
示例#3
0
    def discover(self):
        """Scan for devices in the network."""
        timeout = 5
        _LOGGER.info(
            "Sending discovery packet to broadcast address with timeout of %ss..",
            timeout)
        # magic, length 32
        helobytes = bytes.fromhex(
            '21310020ffffffffffffffffffffffffffffffffffffffffffffffffffffffff')

        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        s.settimeout(timeout)
        s.sendto(helobytes, ('<broadcast>', 54321))
        while True:
            try:
                data, addr = s.recvfrom(1024)
                m = Message.parse(data)
                # _LOGGER.debug("Got a response: %s" % m)
                _LOGGER.info("  IP %s: %s - token: %s" %
                             (addr[0], m.header.value.devtype,
                              codecs.encode(m.checksum, 'hex')))
            except socket.timeout:
                _LOGGER.info("Discovery done")
                return  #  ignore timeouts on discover
            except Exception as ex:
                _LOGGER.warning("error while reading discover results: %s", ex)
                break
示例#4
0
    def discover(addr=None):
        """Scan for devices in the network."""
        timeout = 5
        is_broadcast = addr is None
        seen_addrs = []
        if is_broadcast:
            addr = '<broadcast>'
            is_broadcast = True
            _LOGGER.info("Sending discovery to %s with timeout of %ss..", addr,
                         timeout)
        # magic, length 32
        helobytes = bytes.fromhex(
            '21310020ffffffffffffffffffffffffffffffffffffffffffffffffffffffff')

        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        s.settimeout(timeout)
        for i in range(3):
            s.sendto(helobytes, (addr, 54321))
        while True:
            try:
                data, addr = s.recvfrom(1024)
                m = Message.parse(data)
                # _LOGGER.debug("Got a response: %s" % m)
                if not is_broadcast:
                    return m

                if addr[0] not in seen_addrs:
                    _LOGGER.info("  IP %s: %s - token: %s" %
                                 (addr[0], m.header.value.devtype,
                                  codecs.encode(m.checksum, 'hex')))
                    seen_addrs.append(addr[0])
            except socket.timeout:
                if is_broadcast:
                    _LOGGER.info("Discovery done")
                return  # ignore timeouts on discover
            except Exception as ex:
                _LOGGER.warning("error while reading discover results: %s", ex)
                break