Files
hp-billing-report/thingsBoardData.py
Nico Melone ff20059809 v1 finalized
2023-08-24 17:51:28 -05:00

131 lines
5.4 KiB
Python

#ThingsBoard data collection
from tb_rest_client.rest_client_ce import *
from tb_rest_client.rest import ApiException
import logging
logger = logging.getLogger('billing_reports')
logger.setLevel(logging.INFO)
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
logger.addHandler(ch)
def getDevices(rest_client, customers, page=0, pageSize=500):
thingsboard_data = {}
for c in customers.data:
cname = c.name
cid = c.id.id
if cname not in ["Test Company", "Amerus Safety Solutions"]:
#create new company if it doesn't exist
if cname not in thingsboard_data:
thingsboard_data[cname] = {}
#get devices of a company
devices = rest_client.get_customer_devices(customer_id=cid, page_size=pageSize, page=page)
#go through each device and store its data in the dict
for device in devices.data:
cellular_cost = 15
#fix naming to work with JSON/dict
if '"' in device.name:
deviceName = device.name.replace('"', 'in')
else:
deviceName = device.name
# Sort Device details
if cname == "Chuda Resources":
so = "Water Wells"
price = 75
billing_type = "Stand-Alone"
elif cname == "Henry Petroleum":
so = "Check Meters"
price = 50
billing_type = "Stand-Alone"
elif cname == "Faskens":
if device.type == "tankalarms":
so = "Tanks"
billing_type = "Stand-Alone"
price = 50
elif device.type in ["advvfdipp", "plcfreshwater"]:
so = "Water Wells"
billing_type = "Stand-Alone"
price = 50
elif device.type == "plcpond":
so = "Ponds"
billing_type = "Stand-Alone"
price = 50
else:
so = "HPSO-1"
billing_type = "Stand-Alone"
price = 50
elif cname == "Henry Resources":
if deviceName == "Pearl Central":
so = "Henry Resources"
price = 300
billing_type = "Stand-Alone-WiFi"
else:
so = "Henry Resources"
price = 275
billing_type = "Stand-Alone"
elif cname == "ConocoPhillips":
if device.type == "flowmeterskid":
so = "Portable Meter"
price = 50
billing_type = "Stand-Alone"
elif device.type == "plcfreshwater":
so = "Water Well"
price = 50
cellular_cost = 0
billing_type = "Networked"
elif device.type == "advvfdipp":
so = "Santa Rosa"
price = 50
billing_type = "Stand-Alone"
elif device.type == "Gateway":
so = "AP"
price = 0
billing_type = "AP-bundled"
elif device.type == "cpdualflowmeter":
so = "Pond/Flowmeter"
price = 50
billing_type = "Networked"
elif cname == "Saulsbury Ventures":
so = "Saulsbury Ventures"
price = 50
billing_type = "Stand-Alone"
else:
so = "HPSO-1"
price = 50
billing_type = "Stand-Alone"
#make a new Sales Order if it doesn't exist
if so not in thingsboard_data[cname]:
thingsboard_data[cname][so] = {}
#add device to Sales Order under Company
thingsboard_data[cname][so][deviceName] = {
"Sales Price": price,
"Platform Cost": 0,
"Platform": "ThingsBoard", # "thingsboard", "mistaway"
"Cellular Cost": cellular_cost,
"Billing Type": billing_type # "stand-alone", "AP", "AP-bundled", "networked", "stand-alone-wifi"
}
return thingsboard_data
def getThingsBoardData(url, username, password):
# Creating the REST client object with context manager to get auto token refresh
with RestClientCE(base_url=url) as rest_client:
try:
# Auth with credentials
rest_client.login(username=username, password=password)
# Get customers > get devices under a target customer > get keys for devices > get data for devices
customers = rest_client.get_customers(page_size="100", page="0")
thingsboard_data = getDevices(rest_client=rest_client, customers=customers)
return thingsboard_data
except ApiException as e:
logger.error(e)
return False