497 lines
89 KiB
Plaintext
497 lines
89 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import lattice\n",
|
|
"import logging\n",
|
|
"import json\n",
|
|
"\n",
|
|
"logger = logging.getLogger('billing_reports')\n",
|
|
"logger.setLevel(logging.INFO)\n",
|
|
"\n",
|
|
"fh = logging.FileHandler('/Users/nico/Documents/Github/hp-billing-report/billing.log')\n",
|
|
"fh.setLevel(logging.INFO)\n",
|
|
"\n",
|
|
"ch = logging.StreamHandler()\n",
|
|
"ch.setLevel(logging.ERROR)\n",
|
|
"\n",
|
|
"formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')\n",
|
|
"fh.setFormatter(formatter)\n",
|
|
"ch.setFormatter(formatter)\n",
|
|
"\n",
|
|
"logger.addHandler(fh)\n",
|
|
"logger.addHandler(ch)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"#Mistaway data collection\n",
|
|
"from datetime import datetime as dt\n",
|
|
"\n",
|
|
"json_file_output = False\n",
|
|
"console_output = False"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"nodes = lattice.getNodes()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Find a value for a given key in a given dictionary\n",
|
|
"def _findItem(obj, key):\n",
|
|
" if key in obj: return obj[key] \n",
|
|
" for k, v in obj.items():\n",
|
|
" if isinstance(v,dict):\n",
|
|
" item = _findItem(v, key)\n",
|
|
" if item is not None:\n",
|
|
" return item"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# recursively go through folders to build folder structure\n",
|
|
"def putFolder(folder, fs):\n",
|
|
" try:\n",
|
|
" if not folder[\"id\"] == folder[\"parentFolderId\"]:\n",
|
|
" parent = _findItem(fs, folder[\"parentFolderId\"])\n",
|
|
" parent[folder[\"id\"]] = folder\n",
|
|
" putFolder(parent,fs)\n",
|
|
" else:\n",
|
|
" fs[folder[\"id\"]] = folder\n",
|
|
" return fs\n",
|
|
" except Exception as e:\n",
|
|
" logger.error(f\"Exception in putFolder: {e}\")\n",
|
|
" "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"2023-08-16 16:19:34,115 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,117 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,118 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,118 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,119 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,119 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,120 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,121 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,122 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,123 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,124 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,124 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,125 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,126 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,126 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,127 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,128 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,128 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,129 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,129 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,130 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,131 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,131 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,132 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,133 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,134 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,134 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,135 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,135 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,136 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,136 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,137 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,138 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,138 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,139 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,139 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,140 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,140 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,141 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,141 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,142 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,142 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,143 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,144 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,144 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,145 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,145 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,146 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,147 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,149 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,149 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,150 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,151 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,151 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,152 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,152 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,153 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,153 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,154 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,155 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,155 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,156 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,157 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,157 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,158 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,159 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,160 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,160 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,162 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,165 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,165 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,166 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,167 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,168 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,169 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,174 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,175 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,175 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,176 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,176 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,177 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,178 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,178 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,179 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,179 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n",
|
|
"2023-08-16 16:19:34,180 - billing_reports - ERROR - Exception in putFolder: 'NoneType' object does not support item assignment\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Go through every folder and build a proper folder structure\n",
|
|
"# Output to JSON file\n",
|
|
"folders = lattice.getFolders()\n",
|
|
"foldermap = {}\n",
|
|
"#print(json.dumps(folders, indent=4))\n",
|
|
"for folder in folders:\n",
|
|
" logger.debug(folder)\n",
|
|
" putFolder(folder,foldermap)\n",
|
|
"if console_output:\n",
|
|
" print(json.dumps(foldermap, indent=4))\n",
|
|
"if json_file_output:\n",
|
|
" with open(\"./folderMap\" + str(dt.date(dt.now())) +\".json\", \"w\") as f:\n",
|
|
" json.dump(foldermap, f, indent=4)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Go through every node and collect unique device id (MAC)\n",
|
|
"# Output to JSON file\n",
|
|
"foldersTracker = []\n",
|
|
"vanityMap = {}\n",
|
|
"for node in nodes:\n",
|
|
" if not node[\"uniqueId\"][-6:] in [\":00:00\", \":00:30\"]:\n",
|
|
" if not node[\"folderId\"] in foldersTracker:\n",
|
|
" foldersTracker.append(node[\"folderId\"])\n",
|
|
" folder = _findItem(foldermap, node[\"folderId\"])\n",
|
|
" if folder:\n",
|
|
" deviceName = folder[\"name\"]\n",
|
|
" latitude = folder[\"location\"][\"lat\"]\n",
|
|
" longitude = folder[\"location\"][\"lng\"]\n",
|
|
" pfolder = _findItem(foldermap, folder[\"parentFolderId\"])\n",
|
|
" ppfolder = _findItem(foldermap, pfolder[\"parentFolderId\"])\n",
|
|
" customer = ppfolder[\"name\"]\n",
|
|
" vanityMap[node[\"uniqueId\"]] = {\"deviceName\": deviceName, \"customer\": customer, \"latitude\": latitude, \"longitude\": longitude}\n",
|
|
" else:\n",
|
|
" logger.info(\"Folder does not exist: \" + str(node[\"folderId\"]))\n",
|
|
" else:\n",
|
|
" logger.info(\"Folder already in list: \" + str(node[\"folderId\"]))\n",
|
|
"#print(vanityMap)\n",
|
|
"if json_file_output:\n",
|
|
" with open(\"./deviceMap\" + str(dt.date(dt.now())) +\".json\", \"w\") as f:\n",
|
|
" json.dump(vanityMap, f, indent=4)\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"'\\nData to be collected:\\n {\\n \"customer\":{\\n \"sales_order\": {\\n \"billable_item_1\": {\\n \"sales_price\": 75,\\n \"platform_cost\": 10,\\n \"platform\": \"thingsboard\", # \"thingsboard\", \"mistaway\"\\n \"cellular_cost\": 15,\\n \"billing_type\": \"stand-alone\" # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\\n },\\n \"billable_item_2:{...},\\n ...\\n },\\n \"sales_order_2\":{...}\\n },\\n \"customer_2\":{...}\\n }\\n'"
|
|
]
|
|
},
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"\"\"\"\n",
|
|
"Data to be collected:\n",
|
|
" {\n",
|
|
" \"customer\":{\n",
|
|
" \"sales_order\": {\n",
|
|
" \"billable_item_1\": {\n",
|
|
" \"sales_price\": 75,\n",
|
|
" \"platform_cost\": 10,\n",
|
|
" \"platform\": \"thingsboard\", # \"thingsboard\", \"mistaway\"\n",
|
|
" \"cellular_cost\": 15,\n",
|
|
" \"billing_type\": \"stand-alone\" # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\n",
|
|
" },\n",
|
|
" \"billable_item_2:{...},\n",
|
|
" ...\n",
|
|
" },\n",
|
|
" \"sales_order_2\":{...}\n",
|
|
" },\n",
|
|
" \"customer_2\":{...}\n",
|
|
" }\n",
|
|
"\"\"\""
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 23,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"mistaway_data = {}\n",
|
|
"for key, value in vanityMap.items():\n",
|
|
" customer = value[\"customer\"]\n",
|
|
" device = value[\"deviceName\"]\n",
|
|
" if not device in [\"Melinda 252\"]:\n",
|
|
" if customer not in mistaway_data:\n",
|
|
" mistaway_data[customer] = {f\"HPSO-1\": {}}\n",
|
|
" mistaway_data[customer][\"HPSO-1\"][device] = {\n",
|
|
" \"Sales Price\": 75,\n",
|
|
" \"Platform Cost\": 10,\n",
|
|
" \"Platform\": \"Mistaway\", # \"thingsboard\", \"mistaway\"\n",
|
|
" \"Cellular Cost\": 15,\n",
|
|
" \"Billing Type\": \"Stand-Alone\" # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\n",
|
|
" }\n",
|
|
" \n",
|
|
" \n",
|
|
" "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"#ThingsBoard data collection\n",
|
|
"from tb_rest_client.rest_client_ce import *\n",
|
|
"from tb_rest_client.rest import ApiException"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# ThingsBoard REST API URL\n",
|
|
"url = \"https://hp.henrypump.cloud\"\n",
|
|
"# Default Tenant Administrator credentials\n",
|
|
"username = \"henry.pump.automation@gmail.com\"\n",
|
|
"password = \"Henry Pump @ 2022\""
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 19,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def getDevices(rest_client, customers, page=0, pageSize=500):\n",
|
|
" thingsboard_data = {}\n",
|
|
" for c in customers.data:\n",
|
|
" cname = c.name\n",
|
|
" cid = c.id.id\n",
|
|
" if cname != \"Test Company\":\n",
|
|
" if cname not in thingsboard_data:\n",
|
|
" thingsboard_data[cname] = {f\"HPSO-1\": {}}\n",
|
|
" devices = rest_client.get_customer_devices(customer_id=cid, page_size=pageSize, page=page)\n",
|
|
" for device in devices.data:\n",
|
|
" if '\"' in device.name:\n",
|
|
" deviceName = device.name.replace('\"', 'in')\n",
|
|
" else:\n",
|
|
" deviceName = device.name\n",
|
|
" thingsboard_data[cname][\"HPSO-1\"][deviceName] = {\n",
|
|
" \"Sales Price\": 75,\n",
|
|
" \"Platform Cost\": 0,\n",
|
|
" \"Platform\": \"ThingsBoard\", # \"thingsboard\", \"mistaway\"\n",
|
|
" \"Cellular Cost\": 15,\n",
|
|
" \"Billing Type\": \"Stand-Alone\" # \"stand-alone\", \"AP\", \"AP-bundled\", \"networked\", \"stand-alone-wifi\"\n",
|
|
" }\n",
|
|
" return thingsboard_data"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"def getThingsBoardData(url, username, password):\n",
|
|
" # Creating the REST client object with context manager to get auto token refresh\n",
|
|
" with RestClientCE(base_url=url) as rest_client:\n",
|
|
" try:\n",
|
|
" # Auth with credentials\n",
|
|
" rest_client.login(username=username, password=password)\n",
|
|
" # Get customers > get devices under a target customer > get keys for devices > get data for devices\n",
|
|
" customers = rest_client.get_customers(page_size=\"100\", page=\"0\")\n",
|
|
" thingsboard_data = getDevices(rest_client=rest_client, customers=customers)\n",
|
|
" return thingsboard_data\n",
|
|
" except ApiException as e:\n",
|
|
" logger.error(e)\n",
|
|
" return False"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 20,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"thingsboard_data = getThingsBoardData(url, username,password)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 24,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"#Mixing data from Mistaway and ThingsBoard\n",
|
|
"excel_data = {}\n",
|
|
"excel_data.update(mistaway_data)\n",
|
|
"for customer in thingsboard_data.keys():\n",
|
|
" if customer in excel_data:\n",
|
|
" for so in thingsboard_data[customer].keys():\n",
|
|
" if so in excel_data[customer]:\n",
|
|
" excel_data[customer][so].update(thingsboard_data[customer][so])\n",
|
|
" else:\n",
|
|
" excel_data[customer].update(thingsboard_data[customer])\n",
|
|
" else:\n",
|
|
" excel_data[customer] = thingsboard_data[customer]\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 16,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"{'CrownQuest': {'HPSO-1': {'Nail Ranch 37 SR 2-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wrage 21 SR 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wrage 28 SR 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 40 WS 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 1 WS 1-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 1 WS 1-10B': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 4 WS 1-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 34 WS 10-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CQ Wrage Ranch 32 SR 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 10-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson Ranch 34 SR 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 2 SR 3-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 38 SR 2-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 25 SR 2-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 28 SR 3-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 38 SR 1-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 3 SR 3-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 28 SR 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 28 SR 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Guitar 22 SR 3-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson Ranch 33 SR 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson Ranch 35 SR 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson Ranch 1 SR 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Limequest Transfer Lite': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'S. Wilkinson Transfer Lite': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 2 SR 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton Transfer Lite': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'South Wilkinson Transfer #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson Ranch 37 SR 2-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 40 WS 1-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 32 WS 2-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 32 WS 3-10C': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 40 WS 6-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 40 WS 1-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 40 WS 1-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 32 WS 3-10A': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 9-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 10-3A': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 10-3B': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 10-1B': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 6-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 32 WS 3-10B': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 9-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 6-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 2-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 8-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 7-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 4-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 23 WS 5-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 23 WS 8-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 23 WS 6-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 23 WS 6-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 34 WS 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 34 WS 1-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 23 WS 5-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 23 WS 5-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 23 WS 5-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 1-9B': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 2-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 1-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 1 WS 9-4B': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'ToolBox South': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 7-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 34 WS 1-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 3-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free Transfer Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 5-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 5-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 6-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 7-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 4-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 8-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 1-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 2-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 10-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 3-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 2-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 1-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 3-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 3-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 5-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 10-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 4-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 2-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson Ranch 39 SR 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 1-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 8-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 1-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 10 WS 3-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wrage 33 SR 3-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'N. Wilkinson Transfer Lite': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 10-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 9-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 1 WS 2-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 ws 10-1A': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 1-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 1 WS 1-10A': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Horton 34 WS 1-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 ws 3-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 6-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 40 SR 2-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 7-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 12 SR 1-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 6-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 6 SR 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 1 WS 2-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 34 WS 10-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 2-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Free 40 WS 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'ToolBox North': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 33 WS 10-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nail Ranch 37 SR 3-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 8-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 37 WS 5-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LLL 6 SR 1-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 1-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wilkinson 39 WS 2-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'LimeQuest 5 WS 10-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #11': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rig Pump #12': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Summit Petroleum': {'HPSO-1': {'Bowling WW 4-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 7-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 5-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Bowling WW 37-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 504': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Florence WW #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Florence WW #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Madelyn Kate #3 WW': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Jessica WW #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 107-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 107-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Windham 108-9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Jessica WW #7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Carmanita WW 12-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Carmanita WW 12-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay North Frac Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay South Frac Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay South Inlet': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Carmanita WW 12-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 8-5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 8-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 6-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Carmanita WW 12-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Caden WW #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Caden WW #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Caden WW #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Caden WW #4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Lisa WW #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Madeline WW #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Caden WW #6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Laurie Gwen WW #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Jessica WW #4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Jessica WW #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Jessica WW #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Denali East Frac Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 8-4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Jessica WW #5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Map Rock Transfer Pump Monitor': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay North Pit Inlet #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay North Pit Outlet #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Yvonne Frac Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Denali Frac Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Cindy #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Cindy #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Cindy #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Lindsey #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Elizabeth 1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Railway 12-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Railway 12-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Elizabeth B1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Elizabeth B2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rhonda 1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Sec 46 #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Cynthia 1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nancy #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nancy #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rhonda Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Jitterbug 28-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Reagan #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Aurora 7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Aurora 8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Aurora 9': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Aurora 10': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Aurora 11': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Aurora 6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'RebJean #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri #6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'RobJane #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'RobJane #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'RebJean #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'RobJane #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Kelsey #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Stephanie 41 #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Kelsey #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Stephanie 41 #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'RobJane #4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri #4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Mary 43 #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Mary 43 #5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Mary 43 #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Mary 43 #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'KD #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'KD #4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'KD #7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'KD #5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Bobbie #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Bobbie #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Elizabeth A1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Patty #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Rhonda 2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri Transfer Pump Monitor': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Trumann 1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Trumann 3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Trumann 4': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Trumann 5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Trumann 2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Patty #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Kate A1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Kate A2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Kate B1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tessa Lyn': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Patty #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Smith #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Smith #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Dorcus': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Monique #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Monique #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Monique #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Dawn #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Dawn #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Yvonne Transfer Pump 3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Yvonne Transfer Pump 2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Yvonne Transfer Pump 1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Bobbie #3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Kelsey Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #5': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 5-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 8-3': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 806 North': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 806 South': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #8': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Denali East Inlet': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Lindsey #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Lindsey #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Denali East Transfer Pump Monitor': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Map Rock Transfer Pump Monitor #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri Frac Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Dawn Frac Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Barnett 19-2 WW': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Laney A #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Barnett 24-1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Nancy Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 18 #6': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 6-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW #7': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Banay WW 7-2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Penny North': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Penny South': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Terri Pit Inlet': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Baylee Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Keegan Faudree Water': {'HPSO-1': {'Faudree Frac Pit Pump #1': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Faudree Frac Pit Pump #2': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Faudree West Tank Transfer': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Faudree East Transfer': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Henry Resources': {'HPSO-1': {'Melinda 252': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Gwendolyn SWD Transfer Station': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Benners North': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Avery Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Lisa Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'RankinBaker SWD': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wynn Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Sadie Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Benners Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Denise Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Emma Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Hollis Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Meredith Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'John J Bush Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Joshua Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Gwendolyn 23': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Noel Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Gwendolyn 24': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Gila S2': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Pearl Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Benedum Central': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Wishbone Water': {'HPSO-1': {'Wishbone Water #27 SR': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wishbone Water Well #14 SR': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wishbone/SM Booster Station': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Patriot Resources': {'HPSO-1': {'Transfer Addax Pit': {'Sales Price': 75, 'Platform Cost': 10, 'Platform': 'Mistaway', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Saulsbury Ventures': {'HPSO-1': {'Power Plant Transfer': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Triple 4in': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'InHand-Demo': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Dove Lease Checkmeter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Single 12in': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Chuda Resources': {'HPSO-1': {'Chuda Flow Meter #1': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Chuda Flow Meter #4': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Chuda Flow Meter #2': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Chuda Flow Meter #3': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Faskens': {'HPSO-1': {'BV-602': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BZ-201': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AU-3401': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BP Pond': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BL-3201': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BW-72': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AW Battery': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BZ-202': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BN Pond': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BE-71': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CI-401': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BJ-701': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BI-31': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BE-601': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BP-201': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AA-101': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AV-701': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'FB-501': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BQ-41': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BX-101': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BN-2202': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Fee BM Battery': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BP Battery': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BK-1701': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BQ-301': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Valve Controller': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BV-601': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AW-901': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CG-701': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AS-11': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BL-3401': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BE-51': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BW-041': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CG-601': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BM-1501': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BX-901': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CI-501': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AT-101': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BX-902': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AW-3401': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BN-301': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BV Battery': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'S-601': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CF Pond': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BY-501': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BK-801': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CI-1301': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BP-601': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'CF-1501': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BV-101': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'BJ-101': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'AA Pond': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Amerus Safety Solutions': {'HPSO-1': {'Camera Trailer 107': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 200': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 129': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 202': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 206': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 201': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 102': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 110': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 203': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 204': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 116': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 101': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 127': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 109': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 128': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 112': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 114': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 120': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 119': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 103': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 100': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 205': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 105': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 106': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 126': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 111': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 115': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 117': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 122': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 113': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 104': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 108': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 123': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Camera Trailer 130': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Henry Petroleum': {'HPSO-1': {'Davis Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Great Western Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Francis Hill Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Foundation Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Wess Hill Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Lively Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Glasscock Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Mann Check Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'Test Company': {'HPSO-1': {'HP Test Location 2': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'HP Test Location': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}, 'ConocoPhillips': {'HPSO-1': {'CRMWD': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well 42': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 35': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well 36': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 41': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 39': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 37': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well B 36': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well 45': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 34': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 43': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 46': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well 38': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 40': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 44': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Prod Well 27': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 30': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well 29': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well 31': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well 28': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Pond A Gateway': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Headlee 3401 WS in3 Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Purity-B': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'HP Inlet - 10in': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 33': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Ratliff Well A 32': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree Gateway': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'HP Outlet - 8in': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Parks Inlet #2 - 10in': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Yukon A': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Parks Inlet #1- 10in': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Pond A': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Purity-A': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Yukon B': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, '12in Flow Meter': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Parks Outlet - 6in': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 22': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 14': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree Pond': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 17': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 26': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 13': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 21': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 20': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 19': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 25': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 15': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 16': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 18': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}, 'Tree 23': {'Sales Price': 75, 'Platform Cost': 0, 'Platform': 'ThingsBoard', 'Cellular Cost': 15, 'Billing Type': 'Stand-Alone'}}}}\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(excel_data)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 17,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"#Build report from data"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 25,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import xlsxwriter\n",
|
|
"import pandas as pd\n",
|
|
"\n",
|
|
"# Create a new Excel writer object\n",
|
|
"with pd.ExcelWriter(\"output.xlsx\", engine=\"xlsxwriter\") as writer:\n",
|
|
"\n",
|
|
" # Loop through customers\n",
|
|
" for customer, orders in excel_data.items():\n",
|
|
" \n",
|
|
" rows = []\n",
|
|
"\n",
|
|
" # Loop through each sales order for the customer\n",
|
|
" for order, items in orders.items():\n",
|
|
" for item, details in items.items():\n",
|
|
" row = {\n",
|
|
" \"Sales Order\": order,\n",
|
|
" \"Location\": item\n",
|
|
" }\n",
|
|
" row.update(details)\n",
|
|
" rows.append(row)\n",
|
|
" \n",
|
|
" # Convert the data to a DataFrame\n",
|
|
" df = pd.DataFrame(rows)\n",
|
|
" \n",
|
|
" # Sort by sales order\n",
|
|
" df = df.sort_values(by=\"Sales Order\")\n",
|
|
" \n",
|
|
" # Write to a specific sheet in the Excel file\n",
|
|
" df.to_excel(writer, sheet_name=customer, index=False)\n",
|
|
"\n",
|
|
" for column in df:\n",
|
|
" column_length = max(df[column].astype(str).map(len).max(), len(column))\n",
|
|
" col_idx = df.columns.get_loc(column)\n",
|
|
" writer.sheets[customer].set_column(col_idx, col_idx, column_length)\n",
|
|
" "
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "thingsboard",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.10.5"
|
|
},
|
|
"orig_nbformat": 4
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|