| #!/usr/bin/env python |
| |
| |
| # |
| # Copyright (c) 2013-2017 Nest Labs, Inc. |
| # All rights reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| # |
| # @file |
| # Python interface for Weave Device Manager |
| # |
| |
| """Weave Device Manager interface |
| """ |
| |
| import functools |
| import sys |
| import os |
| import re |
| import copy |
| import binascii |
| import datetime |
| import time |
| from threading import Thread, Lock, Event |
| from ctypes import * |
| from plugins.weave.Weave import Weave |
| |
| __all__ = [ 'WeaveDeviceManager', 'NetworkInfo', 'DeviceManagerException', 'DeviceError', 'DeviceManagerError' ] |
| |
| NetworkType_WiFi = 1 |
| NetworkType_Thread = 2 |
| |
| WiFiMode_AdHoc = 1 |
| WiFiMode_Managed = 2 |
| |
| WiFiRole_Station = 1 |
| WiFiRole_AccessPoint = 2 |
| |
| WiFiSecurityType_None = 1 |
| WiFiSecurityType_WEP = 2 |
| WiFiSecurityType_WPAPersonal = 3 |
| WiFiSecurityType_WPA2Personal = 4 |
| WiFiSecurityType_WPA2MixedPersonal = 5 |
| WiFiSecurityType_WPAEnterprise = 6 |
| WiFiSecurityType_WPA2Enterprise = 7 |
| WiFiSecurityType_WPA2MixedEnterprise = 8 |
| |
| RendezvousMode_EnableWiFiRendezvousNetwork = 0x0001 |
| RendezvousMode_Enable802154RendezvousNetwork = 0x0002 |
| RendezvousMode_EnableFabricRendezvousAddress = 0x0004 |
| |
| TargetFabricId_AnyFabric = 0xFFFFFFFFFFFFFFFF |
| TargetFabricId_NotInFabric = 0 |
| |
| TargetDeviceMode_Any = 0x00000000 # Locate all devices regardless of mode. |
| TargetDeviceMode_UserSelectedMode = 0x00000001 # Locate all devices in 'user-selected' mode -- i.e. where the device has |
| # has been directly identified by a user, e.g. by pressing a button. |
| |
| TargetVendorId_Any = 0xFFFF |
| |
| TargetProductId_Any = 0xFFFF |
| |
| TargetDeviceId_Any = 0xFFFFFFFFFFFFFFFF |
| |
| DeviceFeature_HomeAlarmLinkCapable = 0x00000001 # Indicates a Nest Protect that supports connection to a home alarm panel |
| DeviceFeature_LinePowered = 0x00000002 # Indicates a device that requires line power |
| |
| SystemTest_ProductList = { 'thermostat' : 0x235A000A, |
| 'topaz' : 0x235A0003} |
| |
| def _VoidPtrToByteArray(ptr, len): |
| if ptr: |
| v = bytearray(len) |
| memmove((c_byte * len).from_buffer(v), ptr, len) |
| return v |
| else: |
| return None |
| |
| def _ByteArrayToVoidPtr(array): |
| if array != None: |
| return cast( (c_byte * len(array)) .from_buffer_copy(array), c_void_p) |
| else: |
| return c_void_p(0) |
| |
| def _IsByteArrayAllZeros(array): |
| for i in range(len(array)): |
| if (array[i] != 0): |
| return False |
| return True |
| |
| def _ByteArrayToHex(array): |
| return binascii.hexlify(bytes(array)) |
| |
| class NetworkInfo: |
| def __init__(self, networkType=None, networkId=None, wifiSSID=None, wifiMode=None, wifiRole=None, |
| wifiSecurityType=None, wifiKey=None, |
| threadNetworkName=None, threadExtendedPANId=None, threadNetworkKey=None, |
| wirelessSignalStrength=None): |
| self.NetworkType = networkType |
| self.NetworkId = networkId |
| self.WiFiSSID = wifiSSID |
| self.WiFiMode = wifiMode |
| self.WiFiRole = wifiRole |
| self.WiFiSecurityType = wifiSecurityType |
| self.WiFiKey = wifiKey |
| self.ThreadNetworkName = threadNetworkName |
| self.ThreadExtendedPANId = threadExtendedPANId |
| self.ThreadNetworkKey = threadNetworkKey |
| self.WirelessSignalStrength = wirelessSignalStrength |
| |
| def Print(self, prefix=""): |
| print "%sNetwork Type: %s" % (prefix, NetworkTypeToString(self.NetworkType)) |
| if self.NetworkId != None: |
| print "%sNetwork Id: %d" % (prefix, self.NetworkId) |
| if self.WiFiSSID != None: |
| print "%sWiFi SSID: \"%s\"" % (prefix, self.WiFiSSID) |
| if self.WiFiMode != None: |
| print "%sWiFi Mode: %s" % (prefix, WiFiModeToString(self.WiFiMode)) |
| if self.WiFiRole != None: |
| print "%sWiFi Role: %s" % (prefix, WiFiRoleToString(self.WiFiRole)) |
| if self.WiFiSecurityType != None: |
| print "%sWiFi Security Type: %s" % (prefix, WiFiSecurityTypeToString(self.WiFiSecurityType)) |
| if self.WiFiKey != None: |
| print "%sWiFi Key: %s" % (prefix, self.WiFiKey) |
| if self.ThreadNetworkName != None: |
| print "%sThread Network Name: \"%s\"" % (prefix, self.ThreadNetworkName) |
| if self.ThreadExtendedPANId != None: |
| print "%sThread Extended PAN Id: %s" % (prefix, _ByteArrayToHex(self.ThreadExtendedPANId)) |
| if self.ThreadNetworkKey != None: |
| print "%sThread Network Key: %s" % (prefix, _ByteArrayToHex(self.ThreadNetworkKey)) |
| if self.WirelessSignalStrength != None: |
| print "%sWireless Signal Strength: %s" % (prefix, self.WirelessSignalStrength) |
| |
| def SetField(self, name, val): |
| name = name.lower(); |
| if (name == 'networktype' or name == 'network-type' or name == 'type'): |
| self.NetworkType = ParseNetworkType(val) |
| elif (name == 'networkid' or name == 'network-id' or name == 'id'): |
| self.NetworkId = int(val) |
| elif (name == 'wifissid' or name == 'wifi-ssid' or name == 'ssid'): |
| self.WiFiSSID = val |
| elif (name == 'wifimode' or name == 'wifi-mode'): |
| self.WiFiMode = ParseWiFiMode(val) |
| elif (name == 'wifirole' or name == 'wifi-role'): |
| self.WiFiRole = ParseWiFiRole(val) |
| elif (name == 'wifisecuritytype' or name == 'wifi-security-type' or name == 'securitytype' or name == 'security-type' or name == 'wifi-security' or name == 'security'): |
| self.WiFiSecurityType = ParseSecurityType(val) |
| elif (name == 'wifikey' or name == 'wifi-key' or name == 'key'): |
| self.WiFiKey = val |
| elif (name == 'threadnetworkname' or name == 'thread-network-name' or name == 'thread-name'): |
| self.ThreadNetworkName = val |
| elif (name == 'threadextendedpanid' or name == 'thread-extended-pan-id' or name == 'pan-id'): |
| self.ThreadExtendedPANId = val |
| elif (name == 'threadnetworkkey' or name == 'thread-network-key' or name == 'thread-key'): |
| self.ThreadNetworkKey = val |
| elif (name == 'wirelesssignalstrength' or name == 'wireless-signal-strength'): |
| self.WirelessSignalStrength = val |
| else: |
| raise Exception("Invalid NetworkInfo field: " + str(name)) |
| |
| class DeviceDescriptor: |
| def __init__(self, deviceId=None, fabricId=None, vendorId=None, productId=None, productRevision=None, |
| manufacturingYear=None, manufacturingMonth=None, manufacturingDay=None, |
| primary802154MACAddress=None, primaryWiFiMACAddress=None, |
| serialNumber=None, softwareVersion=None, rendezvousWiFiESSID=None, pairingCode=None, |
| pairingCompatibilityVersionMajor=None, pairingCompatibilityVersionMinor=None, |
| deviceFeatures=None): |
| self.DeviceId = deviceId |
| self.FabricId = fabricId |
| self.VendorId = vendorId |
| self.ProductId = productId |
| self.ProductRevision = productRevision |
| self.ManufacturingYear = manufacturingYear |
| self.ManufacturingMonth = manufacturingMonth |
| self.ManufacturingDay = manufacturingDay |
| self.Primary802154MACAddress = primary802154MACAddress |
| self.PrimaryWiFiMACAddress = primaryWiFiMACAddress |
| self.SerialNumber = serialNumber |
| self.SoftwareVersion = softwareVersion |
| self.RendezvousWiFiESSID = rendezvousWiFiESSID |
| self.PairingCode = pairingCode |
| self.PairingCompatibilityVersionMajor = pairingCompatibilityVersionMajor |
| self.PairingCompatibilityVersionMinor = pairingCompatibilityVersionMinor |
| self.DeviceFeatures = [ ] |
| if deviceFeatures != None: |
| featureVal = 1 |
| while featureVal != 0x80000000: |
| if (deviceFeatures & featureVal) == featureVal: |
| self.DeviceFeatures.append(featureVal) |
| featureVal <<= 1 |
| |
| def Print(self, prefix=""): |
| if self.DeviceId != None: |
| print "%sDevice Id: %016X" % (prefix, self.DeviceId) |
| if self.FabricId != None: |
| print "%sFabrid Id: %016X" % (prefix, self.FabricId) |
| if self.VendorId != None: |
| print "%sVendor Id: %X" % (prefix, self.VendorId) |
| if self.ProductId != None: |
| print "%sProduct Id: %X" % (prefix, self.ProductId) |
| if self.ProductRevision != None: |
| print "%sProduct Revision: %X" % (prefix, self.ProductRevision) |
| if self.SerialNumber != None: |
| print "%sSerial Number: %s" % (prefix, self.SerialNumber) |
| if self.SoftwareVersion != None: |
| print "%sSoftware Version: %s" % (prefix, self.SoftwareVersion) |
| if self.ManufacturingYear != None and self.ManufacturingMonth != None: |
| if self.ManufacturingDay != None: |
| print "%sManufacturing Date: %04d/%02d/%02d" % (prefix, self.ManufacturingYear, self.ManufacturingMonth, self.ManufacturingDay) |
| else: |
| print "%sManufacturing Date: %04d/%02d" % (prefix, self.ManufacturingYear, self.ManufacturingMonth) |
| if self.Primary802154MACAddress != None: |
| print "%sPrimary 802.15.4 MAC Address: %s" % (prefix, _ByteArrayToHex(self.Primary802154MACAddress)) |
| if self.PrimaryWiFiMACAddress != None: |
| print "%sPrimary WiFi MAC Address: %s" % (prefix, _ByteArrayToHex(self.PrimaryWiFiMACAddress)) |
| if self.RendezvousWiFiESSID != None: |
| print "%sRendezvous WiFi ESSID: %s" % (prefix, self.RendezvousWiFiESSID) |
| if self.PairingCode != None: |
| print "%sPairing Code: %s" % (prefix, self.PairingCode) |
| if self.PairingCompatibilityVersionMajor != None: |
| print "%sPairing Compatibility Major Id: %X" % (prefix, self.PairingCompatibilityVersionMajor) |
| if self.PairingCompatibilityVersionMinor != None: |
| print "%sPairing Compatibility Minor Id: %X" % (prefix, self.PairingCompatibilityVersionMinor) |
| if self.DeviceFeatures != None: |
| print "%sDevice Features: %s" % (prefix, " ".join([DeviceFeatureToString(val) for val in self.DeviceFeatures])) |
| |
| |
| class DeviceManagerException(Exception): |
| pass |
| |
| class DeviceManagerError(DeviceManagerException): |
| def __init__(self, err, msg=None): |
| self.err = err |
| if msg != None: |
| self.msg = msg |
| else: |
| self.msg = "Device Manager Error %ld" % (err) |
| |
| def __str__(self): |
| return self.msg |
| |
| class DeviceError(DeviceManagerException): |
| def __init__(self, profileId, statusCode, systemErrorCode, msg=None): |
| self.profileId = profileId |
| self.statusCode = statusCode |
| self.systemErrorCode = systemErrorCode |
| if (msg == None): |
| if (systemErrorCode): |
| return "[ %08X:%d ] (system err %d)" % (profileId, statusCode, systemErrorCode) |
| else: |
| return "[ %08X:%d ]" % (profileId, statusCode) |
| self.message = msg |
| |
| def __str__(self): |
| return "Device Error: " + self.message |
| |
| |
| class _DeviceStatusStruct(Structure): |
| _fields_ = [ |
| ("ProfileId", c_uint32), |
| ("StatusCode", c_uint16), |
| ("SysErrorCode", c_uint32) |
| ] |
| |
| |
| class _IdentifyDeviceCriteriaStruct(Structure): |
| _fields_ = [ |
| ("TargetFabricId", c_uint64), |
| ("TargetModes", c_uint32), |
| ("TargetVendorId", c_uint16), |
| ("TargetProductId", c_uint16), |
| ("TargetDeviceId", c_uint64) |
| ] |
| |
| class _NetworkInfoStruct(Structure): |
| _fields_ = [ |
| ('NetworkType', c_int32), # The type of network. |
| ('NetworkId', c_int64), # network id assigned to the network by the device, -1 if not specified. |
| ('WiFiSSID', c_char_p), # The WiFi SSID. |
| ('WiFiMode', c_int32), # The operating mode of the WiFi network. |
| ('WiFiRole', c_int32), # The role played by the device on the WiFi network. |
| ('WiFiSecurityType', c_int32), # The WiFi security type. |
| ('WiFiKey', c_void_p), # The WiFi key, or NULL if not specified. |
| ('WiFiKeyLen', c_uint32), # The length in bytes of the WiFi key. |
| ('ThreadNetworkName', c_char_p), # The name of the Thread network. |
| ('ThreadExtendedPANId', c_void_p), # The Thread extended PAN id (8 bytes). |
| ('ThreadNetworkKey', c_void_p), # The Thread master network key. |
| ('ThreadNetworkKeyLen', c_uint32), # The length in bytes of the Thread master network key. |
| ('WirelessSignalStrength', c_int16),# The signal strength of the network, or INT16_MIN if not available/applicable. |
| ('Hidden', c_bool) # Whether or not the network is hidden. |
| ] |
| |
| def toNetworkInfo(self): |
| return NetworkInfo( |
| networkType = self.NetworkType if self.NetworkType != -1 else None, |
| networkId = self.NetworkId if self.NetworkId != -1 else None, |
| wifiSSID = self.WiFiSSID, |
| wifiMode = self.WiFiMode if self.WiFiMode != -1 else None, |
| wifiRole = self.WiFiRole if self.WiFiRole != -1 else None, |
| wifiSecurityType = self.WiFiSecurityType if self.WiFiSecurityType != -1 else None, |
| wifiKey = _VoidPtrToByteArray(self.WiFiKey, self.WiFiKeyLen), |
| threadNetworkName = self.ThreadNetworkName, |
| threadExtendedPANId = _VoidPtrToByteArray(self.ThreadExtendedPANId, 8), |
| threadNetworkKey = _VoidPtrToByteArray(self.ThreadNetworkKey, self.ThreadNetworkKeyLen), |
| wirelessSignalStrength = self.WirelessSignalStrength if self.WirelessSignalStrength != -32768 else None |
| ) |
| |
| @classmethod |
| def fromNetworkInfo(cls, networkInfo): |
| networkInfoStruct = cls() |
| networkInfoStruct.NetworkType = networkInfo.NetworkType if networkInfo.NetworkType != None else -1 |
| networkInfoStruct.NetworkId = networkInfo.NetworkId if networkInfo.NetworkId != None else -1 |
| networkInfoStruct.WiFiSSID = networkInfo.WiFiSSID |
| networkInfoStruct.WiFiMode = networkInfo.WiFiMode if networkInfo.WiFiMode != None else -1 |
| networkInfoStruct.WiFiRole = networkInfo.WiFiRole if networkInfo.WiFiRole != None else -1 |
| networkInfoStruct.WiFiSecurityType = networkInfo.WiFiSecurityType if networkInfo.WiFiSecurityType != None else -1 |
| networkInfoStruct.WiFiKey = _ByteArrayToVoidPtr(networkInfo.WiFiKey) |
| networkInfoStruct.WiFiKeyLen = len(networkInfo.WiFiKey) if (networkInfo.WiFiKey != None) else 0 |
| networkInfoStruct.ThreadNetworkName = networkInfo.ThreadNetworkName |
| networkInfoStruct.ThreadExtendedPANId = _ByteArrayToVoidPtr(networkInfo.ThreadExtendedPANId) |
| networkInfoStruct.ThreadNetworkKey = _ByteArrayToVoidPtr(networkInfo.ThreadNetworkKey) |
| networkInfoStruct.ThreadNetworkKeyLen = len(networkInfo.ThreadNetworkKey) if (networkInfo.ThreadNetworkKey != None) else 0 |
| networkInfoStruct.WirelessSignalStrength = networkInfo.WirelessSignalStrength if networkInfo.WirelessSignalStrength != None else -32768 |
| return networkInfoStruct |
| |
| class _DeviceDescriptorStruct(Structure): |
| _fields_ = [ |
| ('DeviceId', c_uint64), # Weave device id (0 = not present) |
| ('FabricId', c_uint64), # Id of Weave fabric to which the device belongs (0 = not present) |
| ('DeviceFeatures', c_uint32), # Bit field indicating support for specific device features. |
| ('VendorId', c_uint16), # Device vendor id (0 = not present) |
| ('ProductId', c_uint16), # Device product id (0 = not present) |
| ('ProductRevision', c_uint16), # Device product revision (0 = not present) |
| ('ManufacturingYear', c_uint16), # Year of device manufacture (valid range 2001 - 2099, 0 = not present) |
| ('ManufacturingMonth', c_ubyte), # Month of device manufacture (1 = January, 0 = not present) |
| ('ManufacturingDay', c_ubyte), # Day of device manufacture (0 = not present) |
| ('Primary802154MACAddress', c_ubyte * 8), # MAC address for primary 802.15.4 interface (big-endian, all zeros = not present) |
| ('PrimaryWiFiMACAddress', c_ubyte * 6), # MAC address for primary WiFi interface (big-endian, all zeros = not present) |
| ('SerialNumber', c_char * 33), # Serial number of device (nul terminated, 0 length = not present) |
| ('SoftwareVersion', c_char * 33), # Version of software running on the device (nul terminated, 0 length = not present) |
| ('RendezvousWiFiESSID', c_char * 33), # ESSID for pairing WiFi network (nul terminated, 0 length = not present) |
| ('PairingCode', c_char * 17), # Device pairing code (nul terminated, 0 length = not present) |
| ('PairingCompatibilityVersionMajor', c_uint16), # Pairing software compatibility major version |
| ('PairingCompatibilityVersionMinor', c_uint16), # Pairing software compatibility minor version |
| ] |
| |
| def toDeviceDescriptor(self): |
| return DeviceDescriptor( |
| deviceId = self.DeviceId if self.DeviceId != 0 else None, |
| fabricId = self.FabricId if self.FabricId != 0 else None, |
| vendorId = self.VendorId if self.VendorId != 0 else None, |
| productId = self.ProductId if self.ProductId != 0 else None, |
| productRevision = self.ProductRevision if self.ProductRevision != 0 else None, |
| manufacturingYear = self.ManufacturingYear if self.ManufacturingYear != 0 else None, |
| manufacturingMonth = self.ManufacturingMonth if self.ManufacturingMonth != 0 else None, |
| manufacturingDay = self.ManufacturingDay if self.ManufacturingDay != 0 else None, |
| primary802154MACAddress = bytearray(self.Primary802154MACAddress) if not _IsByteArrayAllZeros(self.Primary802154MACAddress) else None, |
| primaryWiFiMACAddress = bytearray(self.PrimaryWiFiMACAddress) if not _IsByteArrayAllZeros(self.PrimaryWiFiMACAddress) else None, |
| serialNumber = self.SerialNumber if len(self.SerialNumber) != 0 else None, |
| softwareVersion = self.SoftwareVersion if len(self.SoftwareVersion) != 0 else None, |
| rendezvousWiFiESSID = self.RendezvousWiFiESSID if len(self.RendezvousWiFiESSID) != 0 else None, |
| pairingCode = self.PairingCode if len(self.PairingCode) != 0 else None, |
| pairingCompatibilityVersionMajor = self.PairingCompatibilityVersionMajor, |
| pairingCompatibilityVersionMinor = self.PairingCompatibilityVersionMinor, |
| deviceFeatures = self.DeviceFeatures) |
| |
| class AlarmHushResponse: |
| def __init__(self, hushResult, length, conditions): |
| self.hushResult = hushResult |
| self.Conditions = [ ] |
| for x in range(0, length): |
| self.Conditions.append(conditions[x]) |
| |
| def Print(self, prefix=""): |
| print "%sHush Result: %s" % (prefix, _dmLib.nl_Weave_DeviceManager_AlarmHushResultToString(self.hushResult)) |
| for c in self.Conditions: |
| print "%s[%s]: [%s]" % (prefix, _dmLib.nl_Weave_DeviceManager_AlarmSourceToString(c), _dmLib.nl_Weave_DeviceManager_AlarmStateToString(c)) |
| |
| # Library path name. Can be overriden my module user. |
| |
| class WeaveDeviceMgrPath(Weave): |
| def __init__(self): |
| Weave.__init__(self) |
| self.quiet = False |
| self.LibPath = Weave.getWeaveWeaveDeviceMgrLibPath(self); |
| |
| def getLibPath(self): |
| return self.LibPath |
| |
| pyweavepath = WeaveDeviceMgrPath() |
| |
| dmLibName = os.path.join(pyweavepath.getLibPath()) |
| |
| # If the script binding library does not exist at the same level as |
| # this module, then search for it one level up. Otherwise, rely on the |
| # system dynamic loader to find it for us (via LD_LIBRARY_PATH or |
| # DYLD_LIBRARY_PATH. |
| |
| if not os.path.exists(dmLibName): |
| (dmLibDir, dmLibFile) = os.path.split(dmLibName) |
| dmLibName = os.path.normpath(os.path.join(dmLibDir, "..", dmLibFile)) |
| if not os.path.exists(dmLibName): |
| dmLibName = dmLibFile |
| |
| |
| _dmLib = None |
| _CompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p) |
| _IdentifyDeviceCompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p, POINTER(_DeviceDescriptorStruct)) |
| _PairTokenCompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p, c_void_p, c_uint32) |
| _UnpairTokenCompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p) |
| _NetworkScanCompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p, c_uint16, POINTER(_NetworkInfoStruct)) |
| _AddNetworkCompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p, c_uint32) |
| _GetNetworksCompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p, c_uint16, POINTER(_NetworkInfoStruct)) |
| _GetCameraAuthDataCompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p, c_char_p, c_char_p) |
| _GetRendezvousModeCompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p, c_uint16) |
| _GetFabricConfigCompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p, c_void_p, c_uint32) |
| _ErrorFunct = CFUNCTYPE(None, c_void_p, c_void_p, c_ulong, POINTER(_DeviceStatusStruct)) |
| _GetBleEventFunct = CFUNCTYPE(c_void_p) |
| _WriteBleCharacteristicFunct = CFUNCTYPE(c_bool, c_void_p, c_void_p, c_void_p, c_void_p, c_uint16) |
| _HushCompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p, c_uint8, c_uint8, POINTER(c_uint8)) |
| _SubscribeBleCharacteristicFunct = CFUNCTYPE(c_bool, c_void_p, c_void_p, c_void_p, c_bool) |
| _CloseBleFunct = CFUNCTYPE(c_bool, c_void_p) |
| _GetActiveLocaleCompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p, c_char_p) |
| _GetAvailableLocalesCompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p, c_uint16, POINTER(c_char_p)) |
| _ThermostatGetEntryKeyCompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p, c_char_p) |
| _ThermostatSystemTestStatusCompleteFunct = CFUNCTYPE(None, c_void_p, c_void_p, c_uint64) |
| _DeviceEnumerationResponseFunct = CFUNCTYPE(None, c_void_p, POINTER(_DeviceDescriptorStruct), c_char_p) |
| |
| # This is a fix for WEAV-429. Jay Logue recommends revisiting this at a later |
| # date to allow for truely multiple instances so this is temporary. |
| def _singleton(cls): |
| instance = cls() |
| instance.__call__ = lambda: instance |
| return instance |
| |
| @_singleton |
| class WeaveDeviceManager: |
| |
| def __init__(self, startNetworkThread=True): |
| self.devMgr = None |
| self.callbackRes = None |
| self.networkThread = None |
| self.networkThreadRunable = False |
| self.networkLock = Lock() |
| self.completeEvent = Event() |
| |
| self._InitLib() |
| |
| devMgr = c_void_p(None) |
| res = _dmLib.nl_Weave_DeviceManager_NewDeviceManager(pointer(devMgr)) |
| if (res != 0): |
| raise self._ErrorToException(res) |
| |
| self.devMgr = devMgr |
| |
| def HandleComplete(devMgr, reqState): |
| self.callbackRes = True |
| self.completeEvent.set() |
| |
| def HandleError(devMgr, reqState, err, devStatusPtr): |
| self.callbackRes = self._ErrorToException(err, devStatusPtr) |
| self.completeEvent.set() |
| |
| def HandleDeviceEnumerationResponse(devMgr, deviceDescPtr, deviceAddrStr): |
| print " Enumerated device IP: %s" % (deviceAddrStr) |
| deviceDescPtr.contents.toDeviceDescriptor().Print(" ") |
| |
| self.cbHandleComplete = _CompleteFunct(HandleComplete) |
| self.cbHandleError = _ErrorFunct(HandleError) |
| self.cbHandleDeviceEnumerationResponse = _DeviceEnumerationResponseFunct(HandleDeviceEnumerationResponse) |
| self.blockingCB = None # set by other modules(BLE) that require service by thread while thread blocks. |
| self.cbHandleBleEvent = None # set by other modules (BLE) that provide event callback to Weave. |
| self.cbHandleBleWriteChar = None |
| self.cbHandleBleSubscribeChar = None |
| self.cbHandleBleClose = None |
| |
| if (startNetworkThread): |
| self.StartNetworkThread() |
| |
| def __del__(self): |
| if (self.devMgr != None): |
| _dmLib.nl_Weave_DeviceManager_DeleteDeviceManager(self.devMgr) |
| |
| def DriveBleIO(self): |
| # perform asynchronous write to pipe in IO thread's select() to wake for BLE input |
| res = _dmLib.nl_Weave_DeviceManager_WakeForBleIO() |
| if (res != 0): |
| raise self._ErrorToException(res) |
| |
| def SetBleEventCB(self, bleEventCB): |
| if (self.devMgr != None): |
| self.cbHandleBleEvent = _GetBleEventFunct(bleEventCB) |
| _dmLib.nl_Weave_DeviceManager_SetBleEventCB(self.cbHandleBleEvent) |
| |
| def SetBleWriteCharCB(self, bleWriteCharCB): |
| if (self.devMgr != None): |
| self.cbHandleBleWriteChar = _WriteBleCharacteristicFunct(bleWriteCharCB) |
| _dmLib.nl_Weave_DeviceManager_SetBleWriteCharacteristic(self.cbHandleBleWriteChar) |
| |
| def SetBleSubscribeCharCB(self, bleSubscribeCharCB): |
| if (self.devMgr != None): |
| self.cbHandleBleSubscribeChar = _SubscribeBleCharacteristicFunct(bleSubscribeCharCB) |
| _dmLib.nl_Weave_DeviceManager_SetBleSubscribeCharacteristic(self.cbHandleBleSubscribeChar) |
| |
| def SetBleCloseCB(self, bleCloseCB): |
| if (self.devMgr != None): |
| self.cbHandleBleClose = _CloseBleFunct(bleCloseCB) |
| _dmLib.nl_Weave_DeviceManager_SetBleClose(self.cbHandleBleClose) |
| |
| def StartNetworkThread(self): |
| if (self.networkThread != None): |
| return |
| |
| def RunNetworkThread(): |
| while (self.networkThreadRunable): |
| self.networkLock.acquire() |
| _dmLib.nl_Weave_DeviceManager_DriveIO(50) |
| self.networkLock.release() |
| time.sleep(0.005) |
| |
| self.networkThread = Thread(target=RunNetworkThread, name="WeaveNetworkThread") |
| self.networkThread.daemon = True |
| self.networkThreadRunable = True |
| self.networkThread.start() |
| |
| def StopNetworkThread(self): |
| if (self.networkThread != None): |
| self.networkThreadRunable = False |
| self.networkThread.join() |
| self.networkThread = None |
| |
| def IsConnected(self): |
| return self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_IsConnected(self.devMgr) |
| ) |
| |
| def DeviceId(self): |
| return self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_DeviceId(self.devMgr) |
| ) |
| |
| def DeviceAddress(self): |
| return self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_DeviceAddress(self.devMgr) |
| ) |
| |
| def SetRendezvousAddress(self, addr): |
| res = self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_SetRendezvousAddress(self.devMgr, addr) |
| ) |
| if (res != 0): |
| raise self._ErrorToException(res) |
| |
| def SetConnectTimeout(self, timeoutMS): |
| res = self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_SetConnectTimeout(self.devMgr, timeoutMS) |
| ) |
| if (res != 0): |
| raise self._ErrorToException(res) |
| |
| def SetAutoReconnect(self, autoReconnect): |
| res = self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_SetAutoReconnect(self.devMgr, autoReconnect) |
| ) |
| if (res != 0): |
| raise self._ErrorToException(res) |
| |
| def SetRendezvousLinkLocal(self, RendezvousLinkLocal): |
| res = self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_SetRendezvousLinkLocal(self.devMgr, RendezvousLinkLocal) |
| ) |
| if (res != 0): |
| raise self._ErrorToException(res) |
| |
| def StartDeviceEnumeration(self, targetFabricId=TargetFabricId_AnyFabric, |
| targetModes=TargetDeviceMode_Any, |
| targetVendorId=TargetVendorId_Any, |
| targetProductId=TargetProductId_Any, |
| targetDeviceId=TargetDeviceId_Any): |
| |
| deviceCriteria = _IdentifyDeviceCriteriaStruct() |
| deviceCriteria.TargetFabricId = targetFabricId |
| deviceCriteria.TargetModes = targetModes |
| deviceCriteria.TargetVendorId = targetVendorId |
| deviceCriteria.TargetProductId = targetProductId |
| deviceCriteria.TargetDeviceId = targetDeviceId |
| |
| self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_StartDeviceEnumeration(self.devMgr, deviceCriteria, self.cbHandleDeviceEnumerationResponse, self.cbHandleError) |
| ) |
| |
| def StopDeviceEnumeration(self): |
| res = self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_StopDeviceEnumeration(self.devMgr) |
| ) |
| |
| def ConnectDevice(self, deviceId, deviceAddr=None, |
| pairingCode=None, accessToken=None): |
| |
| if (pairingCode != None and accessToken != None): |
| raise ValueError('Must specify only one of pairingCode or accessToken when calling WeaveDeviceManager.ConnectDevice') |
| |
| if (pairingCode == None and accessToken == None): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_ConnectDevice_NoAuth(self.devMgr, deviceId, deviceAddr, self.cbHandleComplete, self.cbHandleError) |
| ) |
| elif (pairingCode != None): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_ConnectDevice_PairingCode(self.devMgr, deviceId, deviceAddr, pairingCode, self.cbHandleComplete, self.cbHandleError) |
| ) |
| else: |
| accessTokenBuf = cast( (c_byte * len(accessToken)) .from_buffer_copy(accessToken), c_void_p) |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_ConnectDevice_AccessToken(self.devMgr, deviceId, deviceAddr, accessTokenBuf, len(accessToken), self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def RendezvousDevice(self, pairingCode=None, accessToken=None, |
| targetFabricId=TargetFabricId_AnyFabric, |
| targetModes=TargetDeviceMode_Any, |
| targetVendorId=TargetVendorId_Any, |
| targetProductId=TargetProductId_Any, |
| targetDeviceId=TargetDeviceId_Any): |
| |
| if (pairingCode != None and accessToken != None): |
| raise ValueError('Must specify only one of pairingCode or accessToken when calling WeaveDeviceManager.RendezvousDevice') |
| |
| deviceCriteria = _IdentifyDeviceCriteriaStruct() |
| deviceCriteria.TargetFabricId = targetFabricId |
| deviceCriteria.TargetModes = targetModes |
| deviceCriteria.TargetVendorId = targetVendorId |
| deviceCriteria.TargetProductId = targetProductId |
| deviceCriteria.TargetDeviceId = targetDeviceId |
| |
| if (pairingCode == None and accessToken == None): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_RendezvousDevice_NoAuth(self.devMgr, deviceCriteria, self.cbHandleComplete, self.cbHandleError) |
| ) |
| elif (pairingCode != None): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_RendezvousDevice_PairingCode(self.devMgr, pairingCode, deviceCriteria, self.cbHandleComplete, self.cbHandleError) |
| ) |
| else: |
| accessTokenBuf = cast( (c_byte * len(accessToken)) .from_buffer_copy(accessToken), c_void_p) |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_RendezvousDevice_AccessToken(self.devMgr, accessTokenBuf, len(accessToken), deviceCriteria, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def TestBle(self, connObj, count, duration, delay, ack, size, rx): |
| res = self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_TestBle(self.devMgr, connObj, self.cbHandleComplete, self.cbHandleError, count, duration, delay, ack, size, rx) |
| ) |
| if (res != 0): |
| raise self._ErrorToException(res) |
| |
| def TestResultBle(self, connObj, local): |
| res = self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_TestResultBle(self.devMgr, connObj, local) |
| ) |
| if (res != 0): |
| raise self._ErrorToException(res) |
| |
| def TestAbortBle(self, connObj): |
| res = self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_TestAbortBle(self.devMgr, connObj) |
| ) |
| if (res != 0): |
| raise self._ErrorToException(res) |
| |
| def TxTimingBle(self, connObj, enabled, remote): |
| res = self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_TxTimingBle(self.devMgr, connObj, enabled, remote) |
| ) |
| if (res != 0): |
| raise self._ErrorToException(res) |
| |
| def ConnectBle(self, bleConnection, pairingCode=None, accessToken=None): |
| if (pairingCode != None and accessToken != None): |
| raise ValueError('Must specify only one of pairingCode or accessToken when calling WeaveDeviceManager.ConnectBle') |
| |
| if (pairingCode == None and accessToken == None): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_ConnectBle_NoAuth(self.devMgr, bleConnection, self.cbHandleComplete, self.cbHandleError) |
| ) |
| elif (pairingCode != None): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_ConnectBle_PairingCode(self.devMgr, bleConnection, pairingCode, self.cbHandleComplete, self.cbHandleError) |
| ) |
| else: |
| accessTokenBuf = cast( (c_byte * len(accessToken)) .from_buffer_copy(accessToken), c_void_p) |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_ConnectBle_AccessToken(self.devMgr, bleConnection, accessTokenBuf, len(accessToken), self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def PassiveRendezvousDevice(self, pairingCode=None, accessToken=None): |
| if (pairingCode != None and accessToken != None): |
| raise ValueError('Must specify only one of pairingCode or accessToken when calling WeaveDeviceManager.PassiveRendezvousDevice') |
| |
| if (pairingCode == None and accessToken == None): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_PassiveRendezvousDevice_NoAuth(self.devMgr, self.cbHandleComplete, self.cbHandleError) |
| ) |
| elif (pairingCode != None): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_PassiveRendezvousDevice_PairingCode(self.devMgr, pairingCode, self.cbHandleComplete, self.cbHandleError) |
| ) |
| else: |
| accessTokenBuf = cast( (c_byte * len(accessToken)) .from_buffer_copy(accessToken), c_void_p) |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_PassiveRendezvousDevice_AccessToken(self.devMgr, accessTokenBuf, len(accessToken), self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def RemotePassiveRendezvous(self, rendezvousDeviceAddr=None, pairingCode=None, accessToken=None, rendezvousTimeout=None, inactivityTimeout=None): |
| if rendezvousDeviceAddr == None: |
| rendezvousDeviceAddr = "::" |
| |
| if (pairingCode == None and accessToken == None): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_RemotePassiveRendezvous_NoAuth(self.devMgr, rendezvousDeviceAddr, rendezvousTimeout, inactivityTimeout, self.cbHandleComplete, self.cbHandleError) |
| ) |
| elif (pairingCode != None): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_RemotePassiveRendezvous_PASEAuth(self.devMgr, rendezvousDeviceAddr, pairingCode, rendezvousTimeout, inactivityTimeout, self.cbHandleComplete, self.cbHandleError) |
| ) |
| else: |
| accessTokenBuf = cast( (c_byte * len(accessToken)) .from_buffer_copy(accessToken), c_void_p) |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_RemotePassiveRendezvous_CASEAuth(self.devMgr, rendezvousDeviceAddr, accessTokenBuf, len(accessToken), rendezvousTimeout, inactivityTimeout, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def ReconnectDevice(self): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_ReconnectDevice(self.devMgr, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def Close(self): |
| self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_Close(self.devMgr) |
| ) |
| |
| def EnableConnectionMonitor(self, interval, timeout): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_EnableConnectionMonitor(self.devMgr, interval, timeout, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def DisableConnectionMonitor(self): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_DisableConnectionMonitor(self.devMgr, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def IdentifyDevice(self): |
| def HandleIdentifyDeviceComplete(devMgr, reqState, deviceDescPtr): |
| self.callbackRes = deviceDescPtr.contents.toDeviceDescriptor() |
| self.completeEvent.set() |
| |
| cbHandleIdentifyDeviceComplete = _IdentifyDeviceCompleteFunct(HandleIdentifyDeviceComplete) |
| |
| return self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_IdentifyDevice(self.devMgr, cbHandleIdentifyDeviceComplete, self.cbHandleError) |
| ) |
| |
| def PairToken(self, pairingToken): |
| def HandlePairTokenComplete(devMgr, reqState, tokenPairingBundlePtr, tokenPairingBundleLen): |
| self.callbackRes = _VoidPtrToByteArray(tokenPairingBundlePtr, tokenPairingBundleLen) |
| self.completeEvent.set() |
| |
| cbHandlePairTokenComplete = _PairTokenCompleteFunct(HandlePairTokenComplete) |
| |
| pairingTokenBuf = cast( (c_byte * len(pairingToken)) .from_buffer_copy(pairingToken), c_void_p) |
| |
| return self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_PairToken(self.devMgr, pairingTokenBuf, len(pairingToken), cbHandlePairTokenComplete, self.cbHandleError) |
| ) |
| |
| def UnpairToken(self): |
| def HandleUnpairTokenComplete(devMgr, reqState): |
| self.callbackRes = True |
| self.completeEvent.set() |
| |
| cbHandleUnpairTokenComplete = _UnpairTokenCompleteFunct(HandleUnpairTokenComplete) |
| |
| return self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_UnpairToken(self.devMgr, cbHandleUnpairTokenComplete, self.cbHandleError) |
| ) |
| |
| def ScanNetworks(self, networkType): |
| def HandleScanNetworksComplete(devMgr, reqState, netCount, netInfoPtr): |
| self.callbackRes = [ netInfoPtr[i].toNetworkInfo() for i in range(netCount) ] |
| self.completeEvent.set() |
| |
| cbHandleScanNetworksComplete = _NetworkScanCompleteFunct(HandleScanNetworksComplete) |
| |
| return self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_ScanNetworks(self.devMgr, networkType, cbHandleScanNetworksComplete, self.cbHandleError) |
| ) |
| |
| def GetNetworks(self, getFlags): |
| def HandleGetNetworksComplete(devMgr, reqState, netCount, netInfoPtr): |
| self.callbackRes = [ netInfoPtr[i].toNetworkInfo() for i in range(netCount) ] |
| self.completeEvent.set() |
| |
| cbHandleGetNetworksComplete = _GetNetworksCompleteFunct(HandleGetNetworksComplete) |
| |
| return self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_GetNetworks(self.devMgr, getFlags, cbHandleGetNetworksComplete, self.cbHandleError) |
| ) |
| |
| def GetCameraAuthData(self, nonce): |
| def HandleGetCameraAuthDataComplete(devMgr, reqState, macAddress, signedCameraPayload): |
| self.callbackRes = [ macAddress, signedCameraPayload ] |
| self.completeEvent.set() |
| |
| cbHandleGetCameraAuthDataComplete = _GetCameraAuthDataCompleteFunct(HandleGetCameraAuthDataComplete) |
| |
| return self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_GetCameraAuthData(self.devMgr, nonce, cbHandleGetCameraAuthDataComplete, self.cbHandleError) |
| ) |
| |
| def AddNetwork(self, networkInfo): |
| def HandleAddNetworkComplete(devMgr, reqState, networkId): |
| self.callbackRes = networkId |
| self.completeEvent.set() |
| |
| cbHandleAddNetworkComplete = _AddNetworkCompleteFunct(HandleAddNetworkComplete) |
| |
| networkInfoStruct = _NetworkInfoStruct.fromNetworkInfo(networkInfo) |
| |
| return self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_AddNetwork(self.devMgr, networkInfoStruct, cbHandleAddNetworkComplete, self.cbHandleError) |
| ) |
| |
| def UpdateNetwork(self, networkInfo): |
| networkInfoStruct = _NetworkInfoStruct.fromNetworkInfo(networkInfo) |
| |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_UpdateNetwork(self.devMgr, networkInfoStruct, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def RemoveNetwork(self, networkId): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_RemoveNetwork(self.devMgr, networkId, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def EnableNetwork(self, networkId): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_EnableNetwork(self.devMgr, networkId, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def DisableNetwork(self, networkId): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_DisableNetwork(self.devMgr, networkId, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def TestNetworkConnectivity(self, networkId): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_TestNetworkConnectivity(self.devMgr, networkId, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def GetRendezvousMode(self): |
| def HandleGetRendezvousModeComplete(devMgr, reqState, modeFlags): |
| self.callbackRes = modeFlags |
| self.completeEvent.set() |
| |
| cbHandleGetRendezvousModeComplete = _GetRendezvousModeCompleteFunct(HandleGetRendezvousModeComplete) |
| |
| return self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_GetRendezvousMode(self.devMgr, cbHandleGetRendezvousModeComplete, self.cbHandleError) |
| ) |
| |
| def SetRendezvousMode(self, modeFlags): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_SetRendezvousMode(self.devMgr, modeFlags, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def GetLastNetworkProvisioningResult(self): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_GetLastNetworkProvisioningResult(self.devMgr, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def CreateFabric(self): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_CreateFabric(self.devMgr, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def LeaveFabric(self): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_LeaveFabric(self.devMgr, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def GetFabricConfig(self): |
| def HandleGetFabricConfigComplete(devMgr, reqState, fabricConfigPtr, fabricConfigLen): |
| self.callbackRes = _VoidPtrToByteArray(fabricConfigPtr, fabricConfigLen) |
| self.completeEvent.set() |
| |
| cbHandleGetFabricConfigComplete = _GetFabricConfigCompleteFunct(HandleGetFabricConfigComplete) |
| |
| return self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_GetFabricConfig(self.devMgr, cbHandleGetFabricConfigComplete, self.cbHandleError) |
| ) |
| |
| def JoinExistingFabric(self, fabricConfig): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_JoinExistingFabric(self.devMgr, _ByteArrayToVoidPtr(fabricConfig), len(fabricConfig), |
| self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def Ping(self): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_Ping(self.devMgr, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def Hush(self, proximityVerificationCode, challenge, keyId, key): |
| def HandleHushComplete(devMgr, reqState, hushResult, length, conditions): |
| self.callbackRes = AlarmHushResponse(hushResult, length, conditions) |
| self.completeEvent.set() |
| |
| cbHandleHushComplete = _HushCompleteFunct(HandleHushComplete) |
| |
| keyBuf = cast( (c_byte * len(key)) .from_buffer_copy(key), c_void_p) |
| |
| return self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_Hush(self.devMgr, proximityVerificationCode, challenge, keyId, keyBuf, len(key), cbHandleHushComplete, self.cbHandleError) |
| ) |
| |
| def RegisterServicePairAccount(self, serviceId, accountId, serviceConfig, pairingToken, pairingInitData): |
| serviceConfigBuf = cast( (c_byte * len(serviceConfig)) .from_buffer_copy(serviceConfig), c_void_p) |
| pairingTokenBuf = cast( (c_byte * len(pairingToken)) .from_buffer_copy(pairingToken), c_void_p) |
| pairingInitDataBuf = cast( (c_byte * len(pairingInitData)) .from_buffer_copy(pairingInitData), c_void_p) |
| |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_RegisterServicePairAccount(self.devMgr, serviceId, accountId, |
| serviceConfigBuf, len(serviceConfig), |
| pairingTokenBuf, len(pairingToken), |
| pairingInitDataBuf, len(pairingInitData), |
| self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def UpdateService(self, serviceId, serviceConfig): |
| serviceConfigBuf = cast( (c_byte * len(serviceConfig)) .from_buffer_copy(serviceConfig), c_void_p) |
| |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_UpdateService(self.devMgr, serviceId, serviceConfigBuf, len(serviceConfig), |
| self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def UnregisterService(self, serviceId): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_UnregisterService(self.devMgr, serviceId, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def ArmFailSafe(self, armMode, failSafeToken): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_ArmFailSafe(self.devMgr, armMode, failSafeToken, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def DisarmFailSafe(self): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_DisarmFailSafe(self.devMgr, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def ResetConfig(self, resetFlags): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_ResetConfig(self.devMgr, resetFlags, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def CloseEndpoints(self): |
| self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_CloseEndpoints() |
| ) |
| def Shutdown(self): |
| self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_Shutdown() |
| ) |
| |
| def SetLogFilter(self, category): |
| self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_SetLogFilter(category) |
| ) |
| |
| def GetLogFilter(self): |
| self._CallDevMgr( |
| lambda: _dmLib.nl_Weave_DeviceManager_GetLogFilter() |
| ) |
| |
| def SetBlockingCB(self, blockingCB): |
| self.blockingCB = blockingCB |
| |
| def GetActiveLocale(self): |
| def HandleGetActiveLocaleComplete(devMgr, reqState, activeLocale): |
| self.callbackRes = activeLocale |
| self.completeEvent.set() |
| |
| cbHandleGetActiveLocaleComplete = _GetActiveLocaleCompleteFunct(HandleGetActiveLocaleComplete) |
| |
| return self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_GetActiveLocale(self.devMgr, cbHandleGetActiveLocaleComplete, self.cbHandleError) |
| ) |
| |
| def SetActiveLocale(self, locale): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_SetActiveLocale(self.devMgr, locale, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def GetAvailableLocales(self): |
| def HandleGetAvailableLocalesComplete(devMgr, reqState, localeCount, localeList): |
| self.callbackRes = [ localeList[i] for i in range(localeCount) ] |
| self.completeEvent.set() |
| |
| cbHandleGetAvailableLocalesComplete = _GetAvailableLocalesCompleteFunct(HandleGetAvailableLocalesComplete) |
| |
| return self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_GetAvailableLocales(self.devMgr, cbHandleGetAvailableLocalesComplete, self.cbHandleError) |
| ) |
| |
| def StartSystemTest(self, profileId, testId): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_StartSystemTest(self.devMgr, profileId, testId, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def StopSystemTest(self): |
| self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_StopSystemTest(self.devMgr, self.cbHandleComplete, self.cbHandleError) |
| ) |
| |
| def ThermostatGetEntryKey(self): |
| def HandleThermostatGetEntryKeyComplete(devMgr, reqState, entryKey): |
| self.callbackRes = entryKey |
| self.completeEvent.set() |
| |
| cbHandleThermostatGetEntryKeyComplete = _ThermostatGetEntryKeyCompleteFunct(HandleThermostatGetEntryKeyComplete) |
| |
| return self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_ThermostatGetEntryKey(self.devMgr, cbHandleThermostatGetEntryKeyComplete, self.cbHandleError) |
| ) |
| |
| def ThermostatSystemTestStatus(self): |
| def HandleThermostatSystemTestStatusComplete(devMgr, reqState, systemTestStatus): |
| self.callbackRes = systemTestStatus |
| self.completeEvent.set() |
| |
| cbHandleThermostatSystemTestStatusComplete = _ThermostatSystemTestStatusCompleteFunct(HandleThermostatSystemTestStatusComplete) |
| |
| return self._CallDevMgrAsync( |
| lambda: _dmLib.nl_Weave_DeviceManager_ThermostatSystemTestStatus(self.devMgr, cbHandleThermostatSystemTestStatusComplete, self.cbHandleError) |
| ) |
| |
| # ----- Private Members ----- |
| def _InitLib(self): |
| global _dmLib |
| if (_dmLib == None): |
| _dmLib = CDLL(dmLibName) |
| _dmLib.nl_Weave_DeviceManager_Init.argtypes = [ ] |
| _dmLib.nl_Weave_DeviceManager_Init.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_Shutdown.argtypes = [ ] |
| _dmLib.nl_Weave_DeviceManager_Shutdown.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_NewDeviceManager.argtypes = [ POINTER(c_void_p) ] |
| _dmLib.nl_Weave_DeviceManager_NewDeviceManager.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_DeleteDeviceManager.argtypes = [ c_void_p ] |
| _dmLib.nl_Weave_DeviceManager_DeleteDeviceManager.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_Close.argtypes = [ c_void_p ] |
| _dmLib.nl_Weave_DeviceManager_Close.restype = None |
| |
| _dmLib.nl_Weave_DeviceManager_DriveIO.argtypes = [ c_uint32 ] |
| _dmLib.nl_Weave_DeviceManager_DriveIO.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_WakeForBleIO.argtypes = [ ] |
| _dmLib.nl_Weave_DeviceManager_WakeForBleIO.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_SetBleEventCB.argtypes = [ _GetBleEventFunct ] |
| _dmLib.nl_Weave_DeviceManager_SetBleEventCB.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_SetBleWriteCharacteristic.argtypes = [ _WriteBleCharacteristicFunct ] |
| _dmLib.nl_Weave_DeviceManager_SetBleWriteCharacteristic.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_SetBleSubscribeCharacteristic.argtypes = [ _SubscribeBleCharacteristicFunct ] |
| _dmLib.nl_Weave_DeviceManager_SetBleSubscribeCharacteristic.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_SetBleClose.argtypes = [ _CloseBleFunct ] |
| _dmLib.nl_Weave_DeviceManager_SetBleClose.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_IsConnected.argtypes = [ c_void_p ] |
| _dmLib.nl_Weave_DeviceManager_IsConnected.restype = c_bool |
| |
| _dmLib.nl_Weave_DeviceManager_DeviceId.argtypes = [ c_void_p ] |
| _dmLib.nl_Weave_DeviceManager_DeviceId.restype = c_uint64 |
| |
| _dmLib.nl_Weave_DeviceManager_DeviceAddress.argtypes = [ c_void_p ] |
| _dmLib.nl_Weave_DeviceManager_DeviceAddress.restype = c_char_p |
| |
| _dmLib.nl_Weave_DeviceManager_StartDeviceEnumeration.argtypes = [ c_void_p, POINTER(_IdentifyDeviceCriteriaStruct), _DeviceEnumerationResponseFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_StartDeviceEnumeration.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_StopDeviceEnumeration.argtypes = [ c_void_p ] |
| _dmLib.nl_Weave_DeviceManager_StopDeviceEnumeration.restype = None |
| |
| _dmLib.nl_Weave_DeviceManager_ConnectDevice_NoAuth.argtypes = [ c_void_p, c_uint64, c_char_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_ConnectDevice_NoAuth.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_ConnectDevice_PairingCode.argtypes = [ c_void_p, c_uint64, c_char_p, c_char_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_ConnectDevice_PairingCode.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_ConnectDevice_AccessToken.argtypes = [ c_void_p, c_uint64, c_char_p, c_void_p, c_uint32, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_ConnectDevice_AccessToken.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_RendezvousDevice_NoAuth.argtypes = [ c_void_p, POINTER(_IdentifyDeviceCriteriaStruct), _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_RendezvousDevice_NoAuth.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_RendezvousDevice_PairingCode.argtypes = [ c_void_p, c_char_p, POINTER(_IdentifyDeviceCriteriaStruct), _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_RendezvousDevice_PairingCode.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_RendezvousDevice_AccessToken.argtypes = [ c_void_p, c_void_p, c_uint32, POINTER(_IdentifyDeviceCriteriaStruct), _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_RendezvousDevice_AccessToken.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_PassiveRendezvousDevice_NoAuth.argtypes = [ c_void_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_PassiveRendezvousDevice_NoAuth.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_PassiveRendezvousDevice_PairingCode.argtypes = [ c_void_p, c_char_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_PassiveRendezvousDevice_PairingCode.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_PassiveRendezvousDevice_AccessToken.argtypes = [ c_void_p, c_void_p, c_uint32, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_PassiveRendezvousDevice_AccessToken.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_TestBle.argtypes = [ c_void_p, c_void_p, _CompleteFunct, _ErrorFunct, c_uint32, c_uint32, c_uint16, c_uint8, c_uint16, c_bool ] |
| _dmLib.nl_Weave_DeviceManager_TestBle.restype = c_uint32 |
| _dmLib.nl_Weave_DeviceManager_TestResultBle.argtypes = [ c_void_p, c_void_p, c_bool ] |
| _dmLib.nl_Weave_DeviceManager_TestResultBle.restype = c_uint32 |
| _dmLib.nl_Weave_DeviceManager_TestAbortBle.argtypes = [ c_void_p, c_void_p ] |
| _dmLib.nl_Weave_DeviceManager_TestAbortBle.restype = c_uint32 |
| _dmLib.nl_Weave_DeviceManager_TxTimingBle.argtypes = [ c_void_p, c_void_p, c_bool, c_bool ] |
| _dmLib.nl_Weave_DeviceManager_TxTimingBle.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_ConnectBle_NoAuth.argtypes = [ c_void_p, c_void_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_ConnectBle_NoAuth.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_ConnectBle_PairingCode.argtypes = [ c_void_p, c_void_p, c_char_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_ConnectBle_PairingCode.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_ConnectBle_AccessToken.argtypes = [ c_void_p, c_void_p, c_void_p, c_uint32, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_ConnectBle_AccessToken.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_RemotePassiveRendezvous_CASEAuth.argtypes = [ c_void_p, c_char_p, c_char_p, c_uint32, c_uint16, c_uint16, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_RemotePassiveRendezvous_CASEAuth.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_RemotePassiveRendezvous_PASEAuth.argtypes = [ c_void_p, c_char_p, c_char_p, c_uint16, c_uint16, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_RemotePassiveRendezvous_PASEAuth.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_RemotePassiveRendezvous_NoAuth.argtypes = [ c_void_p, c_char_p, c_uint16, c_uint16, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_RemotePassiveRendezvous_NoAuth.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_ReconnectDevice.argtypes = [ c_void_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_ReconnectDevice.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_EnableConnectionMonitor.argtypes = [ c_void_p, c_uint16, c_uint16, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_EnableConnectionMonitor.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_DisableConnectionMonitor.argtypes = [ c_void_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_DisableConnectionMonitor.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_IdentifyDevice.argtypes = [ c_void_p, _IdentifyDeviceCompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_IdentifyDevice.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_PairToken.argtypes = [ c_void_p, c_void_p, c_uint32, _PairTokenCompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_PairToken.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_UnpairToken.argtypes = [ c_void_p, _UnpairTokenCompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_UnpairToken.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_ScanNetworks.argtypes = [ c_void_p, c_int, _NetworkScanCompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_ScanNetworks.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_GetNetworks.argtypes = [ c_void_p, c_int, _GetNetworksCompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_GetNetworks.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_GetCameraAuthData.argtypes = [ c_void_p, c_char_p, _GetCameraAuthDataCompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_GetCameraAuthData.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_AddNetwork.argtypes = [ c_void_p, POINTER(_NetworkInfoStruct), _AddNetworkCompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_AddNetwork.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_UpdateNetwork.argtypes = [ c_void_p, POINTER(_NetworkInfoStruct), _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_UpdateNetwork.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_RemoveNetwork.argtypes = [ c_void_p, c_uint32, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_RemoveNetwork.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_EnableNetwork.argtypes = [ c_void_p, c_uint32, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_EnableNetwork.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_DisableNetwork.argtypes = [ c_void_p, c_uint32, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_DisableNetwork.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_TestNetworkConnectivity.argtypes = [ c_void_p, c_uint32, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_TestNetworkConnectivity.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_GetRendezvousMode.argtypes = [ c_void_p, _GetRendezvousModeCompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_GetRendezvousMode.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_SetRendezvousMode.argtypes = [ c_void_p, c_uint16, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_SetRendezvousMode.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_GetLastNetworkProvisioningResult.argtypes = [ c_void_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_GetLastNetworkProvisioningResult.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_CreateFabric.argtypes = [ c_void_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_CreateFabric.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_LeaveFabric.argtypes = [ c_void_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_LeaveFabric.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_GetFabricConfig.argtypes = [ c_void_p, _GetFabricConfigCompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_GetFabricConfig.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_JoinExistingFabric.argtypes = [ c_void_p, c_void_p, c_uint32, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_JoinExistingFabric.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_Ping.argtypes = [ c_void_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_Ping.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_Hush.argtypes = [ c_void_p, c_uint32, c_uint32, c_uint16, c_void_p, c_uint16, _HushCompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_Hush.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_SetRendezvousAddress.argtypes = [ c_void_p, c_char_p ] |
| _dmLib.nl_Weave_DeviceManager_SetRendezvousAddress.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_SetConnectTimeout.argtypes = [ c_void_p, c_uint32 ] |
| _dmLib.nl_Weave_DeviceManager_SetConnectTimeout.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_SetAutoReconnect.argtypes = [ c_void_p, c_bool ] |
| _dmLib.nl_Weave_DeviceManager_SetAutoReconnect.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_SetRendezvousLinkLocal.argtypes = [ c_void_p, c_bool ] |
| _dmLib.nl_Weave_DeviceManager_SetRendezvousLinkLocal.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_RegisterServicePairAccount.argtypes = [ c_void_p, c_uint64, c_char_p, c_void_p, c_uint32, c_void_p, c_uint32, c_void_p, c_uint32, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_RegisterServicePairAccount.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_UpdateService.argtypes = [ c_void_p, c_uint64, c_void_p, c_uint32, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_UpdateService.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_UnregisterService.argtypes = [ c_void_p, c_uint64, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_UnregisterService.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_ArmFailSafe.argtypes = [ c_void_p, c_uint8, c_uint32, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_ArmFailSafe.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_DisarmFailSafe.argtypes = [ c_void_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_DisarmFailSafe.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_ResetConfig.argtypes = [ c_void_p, c_uint16, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_ResetConfig.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_ErrorToString.argtypes = [ c_uint32 ] |
| _dmLib.nl_Weave_DeviceManager_ErrorToString.restype = c_char_p |
| |
| _dmLib.nl_Weave_DeviceManager_StatusReportToString.argtypes = [ c_uint32, c_uint16 ] |
| _dmLib.nl_Weave_DeviceManager_StatusReportToString.restype = c_char_p |
| |
| _dmLib.nl_Weave_DeviceManager_GetLogFilter.argtypes = [ ] |
| _dmLib.nl_Weave_DeviceManager_GetLogFilter.restype = c_uint8 |
| |
| _dmLib.nl_Weave_DeviceManager_SetLogFilter.argtypes = [ c_uint8 ] |
| _dmLib.nl_Weave_DeviceManager_SetLogFilter.restype = None |
| |
| _dmLib.nl_Weave_DeviceManager_CloseEndpoints.argtypes = [ ] |
| _dmLib.nl_Weave_DeviceManager_CloseEndpoints.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_AlarmSourceToString.argtypes = [ c_uint8 ] |
| _dmLib.nl_Weave_DeviceManager_AlarmSourceToString.restype = c_char_p |
| |
| _dmLib.nl_Weave_DeviceManager_AlarmStateToString.argtypes = [ c_uint8 ] |
| _dmLib.nl_Weave_DeviceManager_AlarmStateToString.restype = c_char_p |
| |
| _dmLib.nl_Weave_DeviceManager_AlarmHushResultToString.argtypes = [ c_uint8 ] |
| _dmLib.nl_Weave_DeviceManager_AlarmHushResultToString.restype = c_char_p |
| |
| _dmLib.nl_Weave_DeviceManager_GetActiveLocale.argtypes = [ c_void_p, _GetActiveLocaleCompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_GetActiveLocale.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_GetAvailableLocales.argtypes = [ c_void_p, _GetAvailableLocalesCompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_GetAvailableLocales.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_SetActiveLocale.argtypes = [ c_void_p, c_char_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_SetActiveLocale.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_ThermostatGetEntryKey.argtypes = [ c_void_p, _ThermostatGetEntryKeyCompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_ThermostatGetEntryKey.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_ThermostatSystemTestStatus.argtypes = [ c_void_p, _ThermostatSystemTestStatusCompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_ThermostatSystemTestStatus.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_StartSystemTest.argtypes = [ c_void_p, c_uint32, c_uint32, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_StartSystemTest.restype = c_uint32 |
| |
| _dmLib.nl_Weave_DeviceManager_StopSystemTest.argtypes = [ c_void_p, _CompleteFunct, _ErrorFunct ] |
| _dmLib.nl_Weave_DeviceManager_StopSystemTest.restype = c_uint32 |
| |
| res = _dmLib.nl_Weave_DeviceManager_Init() |
| if (res != 0): |
| raise self._ErrorToException(res) |
| |
| def _CallDevMgr(self, callFunct): |
| # throw error if op in progress |
| self.callbackRes = None |
| self.completeEvent.clear() |
| with self.networkLock: |
| res = callFunct() |
| self.completeEvent.set() |
| return res |
| |
| def _CallDevMgrAsync(self, callFunct): |
| # throw error if op in progress |
| self.callbackRes = None |
| self.completeEvent.clear() |
| with self.networkLock: |
| res = callFunct() |
| |
| if (res != 0): |
| self.completeEvent.set() |
| raise self._ErrorToException(res) |
| while (not self.completeEvent.isSet()): |
| if self.blockingCB: |
| self.blockingCB() |
| |
| self.completeEvent.wait(0.05) |
| if (isinstance(self.callbackRes, DeviceManagerException)): |
| raise self.callbackRes |
| return self.callbackRes |
| |
| def _ErrorToException(self, err, devStatusPtr=None): |
| if (err == 4044 and devStatusPtr): |
| devStatus = devStatusPtr.contents |
| msg = _dmLib.nl_Weave_DeviceManager_StatusReportToString(devStatus.ProfileId, devStatus.StatusCode) |
| sysErrorCode = devStatus.SysErrorCode if (devStatus.SysErrorCode != 0) else None |
| if (sysErrorCode != None): |
| msg = msg + " (system err %d)" % (sysErrorCode) |
| return DeviceError(devStatus.ProfileId, devStatus.StatusCode, sysErrorCode, msg) |
| else: |
| return DeviceManagerError(err, _dmLib.nl_Weave_DeviceManager_ErrorToString(err)) |
| |
| |
| def NetworkTypeToString(val): |
| if (val == NetworkType_WiFi): |
| return "WiFi" |
| if (val == NetworkType_Thread): |
| return "Thread" |
| if (val != None): |
| return "UNKNOWN (" + str(val)+ ")" |
| return None |
| |
| def ParseNetworkType(val): |
| if isinstance(val, (int, long)): |
| return val |
| val = val.lower() |
| if (val == "wifi"): |
| return NetworkType_WiFi |
| if (val == "thread"): |
| return NetworkType_Thread |
| raise Exception("Invalid network type: " + str(val)) |
| |
| def WiFiModeToString(val): |
| if (val == WiFiMode_AdHoc): |
| return "AdHoc" |
| if (val == WiFiMode_Managed): |
| return "Managed" |
| if (val != None): |
| return "Unknown (" + str(val)+ ")" |
| return None |
| |
| def ParseWiFiMode(val): |
| if isinstance(val, (int, long)): |
| return val |
| val = val.lower() |
| if (val == "adhoc" or val == "ad-hoc"): |
| return WiFiMode_AdHoc |
| if (val == "managed"): |
| return WiFiMode_Managed |
| raise Exception("Invalid Wifi mode: " + str(val)) |
| |
| def WiFiRoleToString(val): |
| if (val == WiFiRole_Station): |
| return "Station" |
| if (val == WiFiRole_AccessPoint): |
| return "AccessPoint" |
| if (val != None): |
| return "Unknown (" + str(val)+ ")" |
| return None |
| |
| def ParseWiFiRole(val): |
| if isinstance(val, (int, long)): |
| return val |
| val = val.lower() |
| if (val == "station"): |
| return WiFiRole_Station |
| if (val == "accesspoint" or val == "access-point"): |
| return WiFiRole_AccessPoint |
| raise Exception("Invalid Wifi role: " + str(val)) |
| |
| def WiFiSecurityTypeToString(val): |
| if (val == WiFiSecurityType_None): |
| return "None" |
| if (val == WiFiSecurityType_WEP): |
| return "WEP" |
| if (val == WiFiSecurityType_WPAPersonal): |
| return "WPA" |
| if (val == WiFiSecurityType_WPA2Personal): |
| return "WPA2" |
| if (val == WiFiSecurityType_WPA2MixedPersonal): |
| return "WPA2Mixed" |
| if (val == WiFiSecurityType_WPAEnterprise): |
| return "WPAEnterprise" |
| if (val == WiFiSecurityType_WPA2Enterprise): |
| return "WPA2Enterprise" |
| if (val == WiFiSecurityType_WPA2MixedEnterprise): |
| return "WPA2MixedEnterprise" |
| if (val != None): |
| return "Unknown (" + str(val)+ ")" |
| return None |
| |
| def ParseSecurityType(val): |
| val = val.lower() |
| if (val == 'none'): |
| return WiFiSecurityType_None |
| if (val == 'wep'): |
| return WiFiSecurityType_WEP |
| if (val == 'wpa' or val == 'wpapersonal' or val == 'wpa-personal'): |
| return WiFiSecurityType_WPAPersonal |
| if (val == 'wpa2' or val == 'wpa2personal' or val == 'wpa2-personal'): |
| return WiFiSecurityType_WPA2Personal |
| if (val == 'wpa2mixed' or val == 'wpa2-mixed' or val == 'wpa2mixedpersonal' or val == 'wpa2-mixed-personal'): |
| return WiFiSecurityType_WPA2MixedPersonal |
| if (val == 'wpaenterprise' or val == 'wpa-enterprise'): |
| return WiFiSecurityType_WPAEnterprise |
| if (val == 'wpa2enterprise' or val == 'wpa2-enterprise'): |
| return WiFiSecurityType_WPA2Enterprise |
| if (val == 'wpa2mixedenterprise' or val == 'wpa2-mixed-enterprise'): |
| return WiFiSecurityType_WPA2MixedEnterprise |
| raise Exception("Invalid Wifi security type: " + str(val)) |
| |
| def DeviceFeatureToString(val): |
| if (val == DeviceFeature_HomeAlarmLinkCapable): |
| return "HomeAlarmLinkCapable" |
| if (val == DeviceFeature_LinePowered): |
| return "LinePowered" |
| return "0x%08X" % (val) |