Sugar_Project_Public / Eversense4_API_2.py
BajiraoS1's picture
Upload 3 files
9688163 verified
from numpy import newaxis
import requests
import json
import time
import pandas as pd
import sys
import datetime
import pathlib
import os
import numpy as np
from Date_Manipulation import convertStrToDateTime
class NpEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
if isinstance(obj, np.floating):
return float(obj)
if isinstance(obj, np.ndarray):
return obj.tolist()
return super(NpEncoder, self).default(obj)
class Eversense4_API:
"""
Main class for Eversense4 Thingsboard REST API Driver.
"""
def __init__(self, host = 'https://eversense.forbesmarshall.com') -> None:
"""host = eversense4 thingsboard host url ... (format : http[s]://host)
"""
self.host = host
def login(self, username, password):
"""
This function will log into ES4 with provided credentials and return the token.
It will also save the token as object internal variable for further use
username : username
password : password
"""
loginUrl = self.host + '/api/auth/login'
loginData = {'username' : username,
'password' : password}
loginHeaders = {'Content-Type' : 'application/json',
'Accept': 'application/json'}
resp_login = requests.post(loginUrl, data = json.dumps(loginData), headers=loginHeaders)
resp = json.loads(resp_login.text)
token = resp['token']
self.token = token
return token
def searchDeviceByName(self, devName : str):
"""
This function returns object of device with provided name else false
"""
Url = self.host + f"/api/tenant/devices?deviceName={devName}"
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
resp = requests.get(Url, headers=Headers)
if resp.status_code == 404:
return False
else:
return resp.json()
def getDevicesOfType(self, deviceType):
"""
This function will return array of devices of provided device profile
deviceType : str : device profile
"""
Url = self.host + '/api/user/devices?type=' + deviceType + '&textSearch&sortProperty&sortOrder&pageSize=1000&page=0'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
resp = requests.get(Url, headers=Headers)
respData = json.loads(resp.text)
return respData
def getCustomerInfo(self, customerId):
"""
This function returns detailed dict of customer info of provided customer id
customerId : customer id
"""
Url = self.host + '/api/customer/'+ customerId +'/'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
resp = requests.get(Url, headers=Headers)
respData = json.loads(resp.text)
return respData
def getDeviceKeys(self, deviceId):
"""
This function returns list of telemetry keys sent by provided device id to ES4 server
deviceId : Device Id
"""
Url = self.host + '/api/plugins/telemetry/DEVICE/'+ deviceId +'/keys/timeseries'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
resp = requests.get(Url, headers=Headers)
respData = json.loads(resp.text)
return respData
def getDeviceAttrKeys(self, deviceId):
"""
This function returns list of attributes keys sent by provided device id to ES4 server
deviceId : Device Id
"""
Url = self.host + '/api/plugins/telemetry/DEVICE/'+ deviceId +'/keys/attributes'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
resp = requests.get(Url, headers=Headers)
respData = json.loads(resp.text)
return respData
def getEntityGroupCustomers(self, entityGroupId):
"""
This function returns list of customers under provided package Id
entityGroupId : package Id
"""
Url = self.host + '/api/entityGroup/'+ entityGroupId +'/customers?pageSize=500&page=0'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
resp = requests.get(Url, headers=Headers)
respData = json.loads(resp.text)
return respData
def getCustomerDevices(self, customerId):
"""
This function returns list of devices owned by provided customer id
customerId : customer id
"""
Url = self.host + '/api/customer/'+ customerId +'/devices?pageSize=500&page=0'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
resp = requests.get(Url, headers=Headers)
respData = json.loads(resp.text)
return respData
def getDeviceLatestTelemetary(self, deviceId, keys):
"""
This function returns map of latest data for provided deviceId and provided keys
deviceId : device id
keys : list of keys
"""
keys_param = ",".join(keys)
Url = self.host + '/api/plugins/telemetry/' + 'DEVICE' + '/' + deviceId + '/values/timeseries' + "?" + "keys=" + keys_param
# print(Url)
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getDeviceDataValues(self, deviceId, keys, startTS, endTS, interval, limit,cnt=0, halfData = {}):
"""
This function returns list of maps of latest data for provided deviceId and provided keys
deviceId : device id
keys : list of keys
startTS : millisecond epoch starting time
endTS : millisecond epoch ending time
interval : parmater needed by TB at times of aggragation, keep 60000 by default
limit : max number of records for each key to retrieve ... keep 500000 by default
cnt : for recursive purpose, stopping counter
halfData : for recursive purpose, in case data to retrieve is too heavy, function will try to divide and merge vertically (based on timestamps)
"""
keys_param = ",".join(keys)
Url = self.host + '/api/plugins/telemetry/' + 'DEVICE' + '/' + deviceId + '/values/timeseries' + "?" + "keys=" + keys_param + "&" + "startTs=" + str(startTS) + "&" + "endTs=" + str(endTS) + "&" + "interval=" + str(interval) + "&" + "agg=" + "NONE" + "&" + "limit=" + str(limit)
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
if(len(data.text) == 0 and cnt < 3):
# print("********************* CAUTION ... Calling again ______________________")
respDataJson1 = self.getDeviceDataValues(deviceId, keys, startTS, int((startTS + endTS) / 2), interval, limit,cnt+1)
respDataJson2 = self.getDeviceDataValues(deviceId, keys, int((startTS + endTS) / 2), endTS, interval, limit,cnt+1)
final_dictionary = {x: respDataJson1.get(x, []) + respDataJson2.get(x, [])
for x in set(respDataJson1).union(respDataJson2)}
return final_dictionary
else:
try:
respDataJson = json.loads(data.text)
except:
# Raise exception for devname from time to time
raise Exception("Unable to get data from {} to {} for device {}".format(startTS, endTS, deviceId))
respDataJson={}
return respDataJson
def getDeviceDataValuesNew(self, deviceId, keys, startTS, endTS, interval, limit, NUM_KEYS = 5):
"""
This function returns list of maps of latest data for provided deviceId and provided keys
deviceId : device id
keys : list of keys
startTS : millisecond epoch starting time
endTS : millisecond epoch ending time
interval : parmater needed by TB at times of aggragation, keep 60000 by default
limit : max number of records for each key to retrieve ... keep 500000 by default
NUM_KEYS : in case data to retrieve is too heavy, function will try to divide and merge horizontally (based on columns)
"""
df1 = pd.DataFrame({'ts' : []})
for i in range((len(keys) // NUM_KEYS) + 1):
# print(i*NUM_KEYS,(i + 1)*(NUM_KEYS))
if i == (len(keys) // NUM_KEYS):
values = self.getDeviceDataValues(deviceId, keys[i*NUM_KEYS:i*(NUM_KEYS) + (len(keys) % 10)], startTS, endTS, interval, limit)
print(keys[i*NUM_KEYS:i*(NUM_KEYS) + (len(keys) % 10)])
else:
values = self.getDeviceDataValues(deviceId, keys[i*NUM_KEYS:(i+1)*(NUM_KEYS)], startTS, endTS, interval, limit)
print(keys[i*NUM_KEYS:(i+1)*(NUM_KEYS)])
df = self.processData(values)
df1 = pd.merge(df1, df, how='outer', on='ts', suffixes=('', '_###_DeleteThis'))
for col in df1.columns:
if '###_DeleteThis' in col:
df1.drop(columns=col, inplace=True)
df1.set_index('Timestamp', drop = False, inplace = True)
return df1
def getAssetDataValues(self, deviceId, keys, startTS, endTS, interval, limit,cnt=0, halfData = {}):
"""
This function returns list of maps of latest data for asset with provided deviceId and provided keys
deviceId : device id
keys : list of keys
startTS : millisecond epoch starting time
endTS : millisecond epoch ending time
interval : parmater needed by TB at times of aggragation, keep 60000 by default
limit : max number of records for each key to retrieve ... keep 500000 by default
cnt : for recursive purpose, stopping counter
halfData : for recursive purpose, in case data to retrieve is too heavy, function will try to divide and merge vertically (based on timestamps)
"""
keys_param = ",".join(keys)
Url = self.host + '/api/plugins/telemetry/' + 'ASSET' + '/' + deviceId + '/values/timeseries' + "?" + "keys=" + keys_param + "&" + "startTs=" + str(startTS) + "&" + "endTs=" + str(endTS) + "&" + "interval=" + str(interval) + "&" + "agg=" + "NONE" + "&" + "limit=" + str(limit)
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
if(len(data.text) == 0 and cnt < 3):
# print("********************* CAUTION ... Calling again ______________________")
respDataJson1 = self.getAssetDataValues(deviceId, keys, startTS, int((startTS + endTS) / 2), interval, limit,cnt+1)
respDataJson2 = self.getAssetDataValues(deviceId, keys, int((startTS + endTS) / 2), endTS, interval, limit,cnt+1)
final_dictionary = {x: respDataJson1.get(x, []) + respDataJson2.get(x, [])
for x in set(respDataJson1).union(respDataJson2)}
return final_dictionary
else:
try:
respDataJson = json.loads(data.text)
except:
# Raise exception for devname from time to time
raise Exception("Unable to get data from {} to {} for device {}".format(startTS, endTS, deviceId))
respDataJson={}
return respDataJson
def getDeviceAttrValues(self, deviceId, keys):
"""
This function returns map of device server attributes for provided keys
deviceId : device id
keys : list of keys
"""
keys_param = ",".join(keys)
Url = self.host + '/api/plugins/telemetry/' + 'DEVICE' + '/' + deviceId + '/values/attributes' + "?" + "keys=" + keys_param
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
dataDict = {i['key'] : i['value'] for i in respDataJson}
return dataDict
def getAssetAttrValues(self, assetId, keys):
"""
This function returns map of asset server attributes for provided keys
assetId : asset id
keys : list of keys
"""
keys_param = ",".join(keys)
Url = self.host + '/api/plugins/telemetry/' + 'ASSET' + '/' + assetId + '/values/attributes' + "?" + "keys=" + keys_param
# print(Url)
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
dataDict = {i['key'] : i['value'] for i in respDataJson}
return dataDict
def getCustomerAttrValues(self, custId, keys):
"""
This function returns map of asset server attributes for provided keys
assetId : asset id
keys : list of keys
"""
keys_param = ",".join(keys)
#https://eversense.forbesmarshall.com/api/plugins/telemetry/CUSTOMER/784f394c-42b6-435a-983c-b7beff2784f9/values/attributes?keys=test
Url = self.host + '/api/plugins/telemetry/' + 'CUSTOMER' + '/' + custId + '/values/attributes' + "?" + "keys=" + keys_param
# print(Url)
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
dataDict = {i['key'] : i['value'] for i in respDataJson}
return dataDict
def processData(self, values):
"""
This function takes values array (list of dicts) as input and transforms it into a pandas dataframe for further use
Send output sent by getDeviceDataValues / getAssetDataValues to this function
values : output sent by above mentioned functions
"""
dfFinal = pd.DataFrame({'ts' : []})
for key in values.keys():
df2 = pd.DataFrame(values[key])
dfFinal = pd.merge(dfFinal, df2, how='outer')
dfFinal.rename({'value' : key}, axis=1, inplace=True)
dfFinal['Timestamp'] = dfFinal.apply(lambda row : datetime.datetime.fromtimestamp(row['ts'] / 1000), axis=1)
dfFinal.set_index('Timestamp', inplace=True, drop = False)
dfFinal.sort_index(ascending=True, inplace=True)
return dfFinal
def dumpDataToFile(self, deviceDataFrame, deviceName, customerName, fromTS, toTS,orignal_path):
"""
Not used
"""
currentTime = datetime.now()
date=currentTime.strftime("%d.%b.%Y")
new_path=deviceName+"/"+date
if not os.path.exists(new_path):
os.makedirs(new_path)
os.chdir(new_path)
fileName = deviceName + "_" +"("+ str(fromTS) + " to " + str(toTS)+")" + ".csv"
deviceDataFrame.to_csv(fileName, sep=';', index=False)
os.chdir(orignal_path)
def getCustomerDetails(self, customerId):
"""
This function returns details of provided customer id as a dictionary
"""
Url = self.host + '/api/customer/' + customerId
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getCustomerHierarchy(self):
"""
This funnction returns list of all entity groups which are customer groups
In short , it will return all packages in customer hierarchy
"""
Url = self.host + '/api/entityGroups/CUSTOMER'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getCustomerDevices(self, customerId):
"""
This function returns devices of customer with provided id
"""
Url = self.host + '/api/customer/' + customerId + '/devices?pageSize=500&page=0'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getCustomerAssets(self, customerId):
"""
This function returns assets of customer with provided id
"""
Url = self.host + '/api/customer/' + customerId + '/assets?pageSize=500&page=0'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getDeviceDetails(self, deviceId):
"""
This function returns details of device with provided id as a dictionary
"""
Url = self.host + '/api/device/' + deviceId
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getDeviceProfiles(self):
"""
This function returns list of all device profiles
"""
Url = self.host + '/api/device/types'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getDeviceCredentials(self, deviceId):
"""
This function returns the accessToken of device with provided id
"""
Url = self.host + '/api/device/' + deviceId + '/credentials'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def sendDeviceData(self, deviceId, dictToSend):
"""
This function will take device id as an input and send input dictToSend as JSON to it
"""
deviceCredentials = self.getDeviceCredentials(deviceId)
accessToken = deviceCredentials['credentialsId']
Url = self.host + "/api/v1/" + accessToken + "/telemetry"
Headers = {'Content-Type' : 'application/json',
# 'X-Authorization': 'Bearer ' + self.token
}
resp = requests.post(Url, data = json.dumps(dictToSend, cls = NpEncoder), headers=Headers)
def sendDeviceDataWithAccessToken(self, deviceAccessToken, dictToSend):
"""
This function will take device access token as an input and send input dictToSend as JSON to it
"""
Url = self.host + "/api/v1/" + deviceAccessToken + "/telemetry"
Headers = {'Content-Type' : 'application/json',
# 'X-Authorization': 'Bearer ' + self.token
}
resp = requests.post(Url, data = json.dumps(dictToSend, cls = NpEncoder), headers=Headers)
def sendAssetData(self, assetId, dictToSend):
"""
This function will take asset id as an input and send input dictToSend as JSON to it
"""
Url = self.host + "/api/plugins/telemetry/ASSET/" + assetId + "/timeseries/timeseries"
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token
}
resp = requests.post(Url, data = json.dumps(dictToSend, cls = NpEncoder), headers=Headers)
print(resp.text)
def getRelatedAssetToDevice(self, deviceId):
"""
This funciton returns asset that contains the device with provided id
"""
Url = self.host + "/api/relations?relationTypeGroup=COMMON&toId=" + deviceId + "&toType=DEVICE&fromType=ASSET"
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getRelatedDevicesToAsset(self, assetId):
"""
This funciton returns devices that are contained in the asset with provided id
"""
Url = self.host + "/api/relations?relationTypeGroup=COMMON&fromId=" + assetId + "&toType=DEVICE&fromType=ASSET"
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getRelatedDevicesToDevice(self, deviceId):
"""
This funciton returns devices that are contained in the device with provided id
"""
Url = self.host + "/api/relations?relationTypeGroup=COMMON&fromId=" + deviceId + "&toType=DEVICE&fromType=DEVICE"
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getRelatedAssetsToAsset(self, assetId):
"""
This funciton returns assets that are contained in the asset with provided id
"""
Url = self.host + "/api/relations?relationTypeGroup=COMMON&fromId=" + assetId + "&toType=ASSET&fromType=ASSET"
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getAssetInfo(self, assetId):
"""
This funciton returns asset info of asset with provided id as a dictionary
"""
Url = self.host + "/api/asset/" + assetId
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getUserDevices(self, numberOfDevices):
"""
This function returns array of devices which currnet user has access to
"""
Url = self.host + "/api/user/devices?pageSize=" + str(numberOfDevices) + "&page=0"
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getGatewayDevices(self, n):
"""
This function returns list of all gateway devices which current user has access to
"""
devices = self.getUserDevices(str(n))['data']
gws = list(filter(lambda x : x['additionalInfo']['gateway'] if x['additionalInfo'] is not None else False, devices))
return gws
def deleteEntityTimeseriesTelemetry(self, entityType, entityId, keys, startTS, endTS):
"""
This function is used to delete telemetry of provided entity, keys between startTS and endTS
"""
keysJoined = ','.join(keys)
Url = self.host + f'/api/plugins/telemetry/{entityType}/{entityId}/timeseries/delete?keys={keysJoined}&deleteAllDataForKeys=false&startTs={startTS}&endTs={endTS}&rewriteLatestIfDeleted=false'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.delete(Url, headers=Headers)
return data
def pullData(self, fromTime, toTime, packageName = 'All', customerName = None, deviceName = None, dateTimeFormat = '%Y-%m-%d %H:%M:%S', keys = None, deviceProfile = None):
"""
Generic pipeline function for pulling data.
fromTime : date with format as mentioned in `dateTimeFormat`
toTime : date with format as mentioned in `dateTimeFormat`
packageName : Package name in customer hierarchy
customerName : Name of customer to download data from
deviceName : Name of device
dateTimeFormat : as mentioned above
keys : list of tags
deviceProfile : deviceProfile to download data from
"""
retDict = {}
startTs = convertStrToDateTime(fromTime, formatStr=dateTimeFormat)
endTs = convertStrToDateTime(toTime, formatStr=dateTimeFormat)
if customerName is None and deviceName is None and deviceProfile is None:
custHier = self.getCustomerHierarchy()
packageObj = list(filter(lambda x : x['name'] == packageName, custHier))[0]
packageCustomers = self.getEntityGroupCustomers(entityGroupId=packageObj['id']['id'])['data']
for packageCustomer in packageCustomers:
customerId = packageCustomer['id']['id']
customerDevices = self.getCustomerDevices(customerId=customerId)['data']
for customerDevice in customerDevices:
deviceId = customerDevice['id']['id']
if keys is None:
deviceKeys = self.getDeviceKeys(deviceId=deviceId)
keys = deviceKeys
df = self.getDeviceDataValuesNew(deviceId = deviceId, keys= keys, interval=60000, limit=500000, startTS = startTs, endTS = endTs)
retDict[customerDevice['name']] = df
if deviceName is not None:
deviceList = []
if isinstance(deviceName, list):
devices = deviceName
else:
devices = [deviceName]
for device in devices:
searchResult = self.getDevicesByName(deviceName=device)['data']
deviceList.extend(searchResult)
for device in deviceList:
deviceId = device['id']['id']
if keys is None:
deviceKeys = self.getDeviceKeys(deviceId=deviceId)
keys = deviceKeys
df = self.getDeviceDataValuesNew(deviceId = deviceId, keys= keys, interval=60000, limit=500000, startTS = startTs, endTS = endTs)
retDict[device['name']] = df
if deviceProfile is not None:
devicesOfProfile = self.getDevicesOfType(deviceProfile)['data']
for device in devicesOfProfile:
deviceId = device['id']['id']
if keys is None:
deviceKeys = self.getDeviceKeys(deviceId=deviceId)
keys = deviceKeys
df = self.getDeviceDataValuesNew(deviceId = deviceId, keys= keys, interval=60000, limit=500000, startTS = startTs, endTS = endTs)
retDict[device['name']] = df
if customerName is not None:
customerList = []
if isinstance(customerName, list):
customers = customerName
else:
customers = [customerName]
for customer in customers:
searchResult = self.getCustomersByTitle(customerTitle = customer)
customerList.append(searchResult)
for packageCustomer in customerList:
customerId = packageCustomer['id']['id']
customerDevices = self.getCustomerDevices(customerId=customerId)['data']
for customerDevice in customerDevices:
deviceId = customerDevice['id']['id']
if keys is None:
deviceKeys = self.getDeviceKeys(deviceId=deviceId)
keys = deviceKeys
df = self.getDeviceDataValuesNew(deviceId = deviceId, keys= keys, interval=60000, limit=500000, startTS = startTs, endTS = endTs)
retDict[customerDevice['name']] = df
return retDict
def getDevicesByName(self, deviceName):
"""
This function returns list of devices which match given name as pattern
"""
Url = self.host + "/api/user/devices?pageSize=200&page=0&textSearch=" + deviceName
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getCustomersByTitle(self, customerTitle):
"""
This function returns list of customers which match given title as pattern
"""
Url = self.host + "/api/tenant/customers?customerTitle=" + customerTitle
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def createAlarm(self, alarmDict):
"""
This function creates alarm in tb dashboards
"""
Url = self.host + "/api/alarm"
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
resp = requests.post(Url, data = json.dumps(alarmDict, cls=NpEncoder), headers=Headers)
def getDevicesOf(self, packageName):
"""
This function will return list of devices under provided package name
packageName : str : pakage name under customer hierarchy (special function for codel ... generalized)
"""
custHier = self.getCustomerHierarchy()
Package_id = [item for item in custHier if item['name'] == packageName]
Package_id = Package_id[0]['id']['id']
codelCust = self.getEntityGroupCustomers(Package_id)
customers = map(lambda customerObj : {"id" : customerObj['id']['id'], "title" : customerObj['title']}, codelCust['data'])
deviceIdList = []
for customer in list(customers):
devices = self.getCustomerDevices(customer['id'])
deviceIds = map(lambda deviceObj : deviceObj['id']['id'], devices['data'])
deviceIdList.extend(devices['data'])
return(deviceIdList)
def setDeviceAttributes(self, deviceId, attributesDict, attrScope):
"""
This function will set attributes of 'deviceId' as specified in 'attributesDict' for the specified scope 'attrScope'
"""
Url = self.host + f"/api/plugins/telemetry/{deviceId}/{attrScope}"
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
resp = requests.post(Url, data = json.dumps(attributesDict, cls = NpEncoder), headers=Headers)
def deleteAlarms(self, alarmId):
"""
This function is used to delete alarm with mentioned alarmId
"""
Url = self.host + f'/api/alarm/{alarmId}'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.delete(Url, headers=Headers)
return data
def getEntityAlarms(self, entityType, entityId):
"""
This function is used to get alarms of specified entity
"""
Url = self.host + f"/api/alarm/{entityType}/{entityId}?pageSize=100000&page=0"
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
respDataJson = json.loads(data.text)
return respDataJson
def getEntityGroupEntities(self, entityGroupId):
"""
This function sends all entities in an entity group
"""
Url = self.host + f'/api/entityGroup/{entityGroupId}/entities?pageSize=200&page=0'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
return data.json()
def getAllCustomers(self, pageSize = 5000):
"""
This function sends all customers under the current user
"""
Url = self.host + f'/api/customerInfos/all?pageSize={pageSize}&page=0'
Headers = {'Content-Type' : 'application/json',
'X-Authorization': 'Bearer ' + self.token}
data = requests.get(Url, headers=Headers)
return data.json()