Added report generator for thingsboard

This commit is contained in:
Nico Melone
2024-07-31 14:02:59 -05:00
parent c45c5a926d
commit 6db3e90fc1
82 changed files with 17951 additions and 27 deletions

View File

@@ -0,0 +1,197 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"from tb_rest_client.rest_client_pe import *\n",
"from tb_rest_client.rest import ApiException\n",
"from tb_rest_client.api_client import *\n",
"import re, ast, json\n",
"from uuid import uuid4"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"url = \"https://www.enxlekkocloud.com\"\n",
"username = \"nico.a.melone@gmail.com\"\n",
"password = \"9EE#mqb*b6bXV9hJrPYGm&w3q5Y@3acumvvb5isQ\"\n",
"userIdToCopy = \"\"\n",
"entity_group_id=\"616d62f0-3300-11ef-9c57-29fbfd438c8b\"\n",
"default_dashboard = \"c157d8a0-32f9-11ef-9c57-29fbfd438c8b\""
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"data = [\n",
" \"Michael Montgomery - mmontgomery@apollopetro.com\",\n",
" \"Jerry Pourciau - jpourciau@apollopetro.com\",\n",
" \"Dimitri Menutis - dmenutis@apollopetro.com\",\n",
" \"Chris Jean - cjean@apollopetro.com\",\n",
" \"Josh Spence - jspence@apollopetro.com\"\n",
" ]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def checkUserExists(userEmail, rest_client):\n",
" resp = rest_client.get_user_users(page_size=100, page=0,text_search=userEmail)\n",
" resp = resp.to_dict()\n",
" if resp[\"total_elements\"] > 0:\n",
" return True\n",
" return False"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"def copyUser(userIdToCopy, rest_client):\n",
" resp = rest_client.get_user_by_id(userIdToCopy)\n",
" resp = resp.to_dict()\n",
" del resp[\"id\"]\n",
" del resp[\"tenant_id\"]\n",
" del resp[\"created_time\"]\n",
" return resp\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"def process_data(data,entity_group_id,default_dashboard):\n",
" result = []\n",
" for item in data:\n",
" parts = item.split(' - ')\n",
" first_last_name = parts[0].split()\n",
" first_name = first_last_name[0]\n",
" last_name = ' '.join(first_last_name[1:])\n",
" email = parts[1]\n",
" phone = ''\n",
" if len(parts) > 2:\n",
" phone = '+' + re.sub(r'\\D', '', parts[2])\n",
" \n",
" owner_id = {\n",
" \"id\": entity_group_id,\n",
" \"entity_type\": \"CUSTOMER\"\n",
" }\n",
" if default_dashboard:\n",
" additionalInfo = {\n",
" \"description\": \"\",\n",
" \"defaultDashboardId\": default_dashboard,\n",
" \"defaultDashboardFullscreen\": False,\n",
" \"homeDashboardId\": default_dashboard,\n",
" \"homeDashboardHideToolbar\": False,\n",
" \"userCredentialsEnabled\": True\n",
" }\n",
" else:\n",
" additionalInfo = {}\n",
" \n",
" result.append({\n",
" \"email\": email,\n",
" \"authority\": \"CUSTOMER_USER\",\n",
" \"firstName\": first_name,\n",
" \"lastName\": last_name,\n",
" \"phone\": phone,\n",
" \"additionalInfo\": additionalInfo,\n",
" \"ownerId\": owner_id\n",
" })\n",
" \n",
" return result"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"filtered_users = process_data(data, entity_group_id=entity_group_id,default_dashboard=default_dashboard)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"with RestClientPE(base_url=url) as rest_client:\n",
" try:\n",
" rest_client.login(username=username, password=password)\n",
" if userIdToCopy:\n",
" templateUser = copyUser(userIdToCopy=userIdToCopy, rest_client=rest_client)\n",
" templateUser[\"additionalInfo\"] = ast.literal_eval(templateUser['additional_info'].replace(\"'\", '\"'))\n",
" del templateUser[\"additional_info\"]\n",
" else:\n",
" templateUser = {\n",
" \"email\": \"user@example.com\",\n",
" \"authority\": \"CUSTOMER_USER\",\n",
" \"firstName\": \"John\",\n",
" \"lastName\": \"Doe\",\n",
" \"phone\": \"38012345123\",\n",
" \"additionalInfo\": {},\n",
" \"ownerId\": {\n",
" \"id\": \"efe3a0d0-bb6b-11ec-9326-ad8278896f52\",\n",
" \"entityType\": \"CUSTOMER\"\n",
" }\n",
" }\n",
" for user in filtered_users:\n",
" if not checkUserExists(user[\"email\"], rest_client=rest_client):\n",
" \n",
" \"\"\"\n",
" templateUser[\"email\"] = user[\"email\"]\n",
" templateUser[\"name\"] = user[\"email\"]\n",
" templateUser[\"firstName\"] = user[\"information\"][\"first\"]\n",
" templateUser[\"lastName\"] = user[\"information\"][\"last\"]\n",
" if user[\"phone\"]:\n",
" templateUser[\"phone\"] = \"+1\" + \"\".join(user[\"phone\"].split(\"-\"))\n",
" else:\n",
" templateUser[\"phone\"] = \"\"\n",
" \"\"\"\n",
" #print(json.dumps(user, indent=4))\n",
" rest_client.save_user(send_activation_mail=True, body=user, entity_group_id=entity_group_id)\n",
" except ApiException as e:\n",
" print(e)"
]
}
],
"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"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@@ -0,0 +1,91 @@
import json,uuid
# Load the existing JSON data from the file
path = "ek_chemical.json"
with open(path, 'r') as f:
data = json.load(f)
# Define the new keys to add as alarms
new_keys = {
"vfd_01_faulted_alm": {"severity": "CRITICAL", "alarmType": "VFD 01 Faulted Alarm"},
"vfd_01_status_alm": {"severity": "CRITICAL", "alarmType": "VFD 01 Status Alarm"},
"vfd_01_undervoltage_alm": {"severity": "CRITICAL", "alarmType": "VFD 01 Undervoltage Alarm"},
"vfd_02_faulted_alm": {"severity": "CRITICAL", "alarmType": "VFD 02 Faulted Alarm"},
"vfd_02_status_alm": {"severity": "CRITICAL", "alarmType": "VFD 02 Status Alarm"},
"vfd_02_undervoltage_alm": {"severity": "CRITICAL", "alarmType": "VFD 02 Undervoltage Alarm"}
}
def checkDuplicates(key, alarms):
if alarms:
for alarm in alarms:
if alarm["clearRule"]["condition"]["condition"][0]["key"]["key"] == key:
return False
return True
# Loop through the new keys and create a new alarm based on the existing ones
for key, value in new_keys.items():
if checkDuplicates(key, data["profileData"]["alarms"]):
id = str(uuid.uuid4())
createRules = {
value["severity"]: {
"condition": {
"condition": [
{
"key": {"type": "TIME_SERIES", "key": key},
"valueType": "BOOLEAN",
"value": None,
"predicate": {"type": "BOOLEAN", "operation": "EQUAL", "value": {"defaultValue": True, "userValue": None, "dynamicValue": None}}
}
],
"spec": {"type": "SIMPLE"}
},
"schedule": None,
"alarmDetails": "",
"dashboardId": None
}
}
clearRule = {
"condition": {
"condition": [
{
"key": {"type": "TIME_SERIES", "key": key},
"valueType": "BOOLEAN",
"value": None,
"predicate": {"type": "BOOLEAN", "operation": "EQUAL", "value": {"defaultValue": False, "userValue": None, "dynamicValue": None}}
}
],
"spec": {"type": "DURATION", "unit": "MINUTES", "predicate": {"defaultValue": 30, "userValue": None, "dynamicValue": None}}
},
"schedule": None,
"alarmDetails": None,
"dashboardId": None
}
propagate = False
propagateToOwner = False
propagateToOwnerHierarchy = False
propagateToTenant = False
propagateRelationTypes = None
# Create a new alarm with the updated createRules and clearRule
new_alarm = {
"id": id,
"alarmType": value["alarmType"],
"createRules": createRules,
"clearRule": clearRule,
"propagate": propagate,
"propagateToOwner": propagateToOwner,
"propagateToOwnerHierarchy": propagateToOwnerHierarchy,
"propagateToTenant": propagateToTenant,
"propagateRelationTypes": propagateRelationTypes
}
# Add the new alarm to the existing alarms array
if not data["profileData"]["alarms"]:
data["profileData"]["alarms"] = []
data["profileData"]["alarms"].append(new_alarm)
print(f"Added {value['severity']} alarm for {key}")
else:
print(f"Skipped {key}")
# Save the updated JSON data back to the file
with open(path, 'w') as f:
json.dump(data, f, indent=4)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
import csv
import simplekml
# Create a new KML document
kml = simplekml.Kml()
# Open the CSV file and read its contents
with open('inputcoords.csv', 'r') as csvfile:
reader = csv.reader(csvfile, delimiter=';')
next(reader) # Skip the header row
# Loop through each device in the CSV file
for row in reader:
name = row[0]
lat_tel = float(row[1]) if row[1] else None
lon_tel = float(row[2]) if row[2] else None
lat_att = float(row[3]) if row[3] else None
lon_att = float(row[4]) if row[4] else None
# Ignore devices with "Gateway" in the name
if "Gateway" in name or "Camera Trailer" in name:
continue
# Prefer latitude and longitude from "tel" columns if available
lat = lat_tel or lat_att
lon = lon_tel or lon_att
# If no coordinates are available, print a warning message
if not (lat and lon):
print(f"No coordinates for device: {name}")
continue
# Create a new placemark for the device
pnt = kml.newpoint(name=name, coords=[(lon, lat)])
# Save the KML document to a file (KMZ file)
kml.savekmz("devices_tb.kmz")

Binary file not shown.

View File

@@ -0,0 +1,483 @@
{
"name": "ek_chemical",
"description": "",
"image": null,
"type": "DEFAULT",
"transportType": "DEFAULT",
"provisionType": "DISABLED",
"defaultRuleChainId": {
"entityType": "RULE_CHAIN",
"id": "f773e6b0-fcf1-11ee-bef7-5131a0fcf1e6"
},
"defaultDashboardId": null,
"defaultQueueName": "Main",
"profileData": {
"configuration": {
"type": "DEFAULT"
},
"transportConfiguration": {
"type": "DEFAULT"
},
"provisionConfiguration": {
"type": "DISABLED",
"provisionDeviceSecret": null
},
"alarms": [
{
"id": "b630bd0c-7bd1-429b-ae11-b5d62317b22c",
"alarmType": "VFD 01 Faulted Alarm",
"createRules": {
"CRITICAL": {
"condition": {
"condition": [
{
"key": {
"type": "TIME_SERIES",
"key": "vfd_01_faulted_alm"
},
"valueType": "BOOLEAN",
"value": null,
"predicate": {
"type": "BOOLEAN",
"operation": "EQUAL",
"value": {
"defaultValue": true,
"userValue": null,
"dynamicValue": null
}
}
}
],
"spec": {
"type": "SIMPLE"
}
},
"schedule": null,
"alarmDetails": "",
"dashboardId": null
}
},
"clearRule": {
"condition": {
"condition": [
{
"key": {
"type": "TIME_SERIES",
"key": "vfd_01_faulted_alm"
},
"valueType": "BOOLEAN",
"value": null,
"predicate": {
"type": "BOOLEAN",
"operation": "EQUAL",
"value": {
"defaultValue": false,
"userValue": null,
"dynamicValue": null
}
}
}
],
"spec": {
"type": "DURATION",
"unit": "MINUTES",
"predicate": {
"defaultValue": 30,
"userValue": null,
"dynamicValue": null
}
}
},
"schedule": null,
"alarmDetails": null,
"dashboardId": null
},
"propagate": false,
"propagateToOwner": false,
"propagateToOwnerHierarchy": false,
"propagateToTenant": false,
"propagateRelationTypes": null
},
{
"id": "c1af9cd2-b66a-42a2-8927-3e3e632202d3",
"alarmType": "VFD 01 Status Alarm",
"createRules": {
"CRITICAL": {
"condition": {
"condition": [
{
"key": {
"type": "TIME_SERIES",
"key": "vfd_01_status_alm"
},
"valueType": "BOOLEAN",
"value": null,
"predicate": {
"type": "BOOLEAN",
"operation": "EQUAL",
"value": {
"defaultValue": true,
"userValue": null,
"dynamicValue": null
}
}
}
],
"spec": {
"type": "SIMPLE"
}
},
"schedule": null,
"alarmDetails": "",
"dashboardId": null
}
},
"clearRule": {
"condition": {
"condition": [
{
"key": {
"type": "TIME_SERIES",
"key": "vfd_01_status_alm"
},
"valueType": "BOOLEAN",
"value": null,
"predicate": {
"type": "BOOLEAN",
"operation": "EQUAL",
"value": {
"defaultValue": false,
"userValue": null,
"dynamicValue": null
}
}
}
],
"spec": {
"type": "DURATION",
"unit": "MINUTES",
"predicate": {
"defaultValue": 30,
"userValue": null,
"dynamicValue": null
}
}
},
"schedule": null,
"alarmDetails": null,
"dashboardId": null
},
"propagate": false,
"propagateToOwner": false,
"propagateToOwnerHierarchy": false,
"propagateToTenant": false,
"propagateRelationTypes": null
},
{
"id": "02423836-58c6-4a98-83dd-f54a32b9a03d",
"alarmType": "VFD 01 Undervoltage Alarm",
"createRules": {
"CRITICAL": {
"condition": {
"condition": [
{
"key": {
"type": "TIME_SERIES",
"key": "vfd_01_undervoltage_alm"
},
"valueType": "BOOLEAN",
"value": null,
"predicate": {
"type": "BOOLEAN",
"operation": "EQUAL",
"value": {
"defaultValue": true,
"userValue": null,
"dynamicValue": null
}
}
}
],
"spec": {
"type": "SIMPLE"
}
},
"schedule": null,
"alarmDetails": "",
"dashboardId": null
}
},
"clearRule": {
"condition": {
"condition": [
{
"key": {
"type": "TIME_SERIES",
"key": "vfd_01_undervoltage_alm"
},
"valueType": "BOOLEAN",
"value": null,
"predicate": {
"type": "BOOLEAN",
"operation": "EQUAL",
"value": {
"defaultValue": false,
"userValue": null,
"dynamicValue": null
}
}
}
],
"spec": {
"type": "DURATION",
"unit": "MINUTES",
"predicate": {
"defaultValue": 30,
"userValue": null,
"dynamicValue": null
}
}
},
"schedule": null,
"alarmDetails": null,
"dashboardId": null
},
"propagate": false,
"propagateToOwner": false,
"propagateToOwnerHierarchy": false,
"propagateToTenant": false,
"propagateRelationTypes": null
},
{
"id": "badde6a4-8aa2-45b4-9b45-25b47f6fe817",
"alarmType": "VFD 02 Faulted Alarm",
"createRules": {
"CRITICAL": {
"condition": {
"condition": [
{
"key": {
"type": "TIME_SERIES",
"key": "vfd_02_faulted_alm"
},
"valueType": "BOOLEAN",
"value": null,
"predicate": {
"type": "BOOLEAN",
"operation": "EQUAL",
"value": {
"defaultValue": true,
"userValue": null,
"dynamicValue": null
}
}
}
],
"spec": {
"type": "SIMPLE"
}
},
"schedule": null,
"alarmDetails": "",
"dashboardId": null
}
},
"clearRule": {
"condition": {
"condition": [
{
"key": {
"type": "TIME_SERIES",
"key": "vfd_02_faulted_alm"
},
"valueType": "BOOLEAN",
"value": null,
"predicate": {
"type": "BOOLEAN",
"operation": "EQUAL",
"value": {
"defaultValue": false,
"userValue": null,
"dynamicValue": null
}
}
}
],
"spec": {
"type": "DURATION",
"unit": "MINUTES",
"predicate": {
"defaultValue": 30,
"userValue": null,
"dynamicValue": null
}
}
},
"schedule": null,
"alarmDetails": null,
"dashboardId": null
},
"propagate": false,
"propagateToOwner": false,
"propagateToOwnerHierarchy": false,
"propagateToTenant": false,
"propagateRelationTypes": null
},
{
"id": "c6f5ceee-097b-4cdc-ab5b-f881700a6a07",
"alarmType": "VFD 02 Status Alarm",
"createRules": {
"CRITICAL": {
"condition": {
"condition": [
{
"key": {
"type": "TIME_SERIES",
"key": "vfd_02_status_alm"
},
"valueType": "BOOLEAN",
"value": null,
"predicate": {
"type": "BOOLEAN",
"operation": "EQUAL",
"value": {
"defaultValue": true,
"userValue": null,
"dynamicValue": null
}
}
}
],
"spec": {
"type": "SIMPLE"
}
},
"schedule": null,
"alarmDetails": "",
"dashboardId": null
}
},
"clearRule": {
"condition": {
"condition": [
{
"key": {
"type": "TIME_SERIES",
"key": "vfd_02_status_alm"
},
"valueType": "BOOLEAN",
"value": null,
"predicate": {
"type": "BOOLEAN",
"operation": "EQUAL",
"value": {
"defaultValue": false,
"userValue": null,
"dynamicValue": null
}
}
}
],
"spec": {
"type": "DURATION",
"unit": "MINUTES",
"predicate": {
"defaultValue": 30,
"userValue": null,
"dynamicValue": null
}
}
},
"schedule": null,
"alarmDetails": null,
"dashboardId": null
},
"propagate": false,
"propagateToOwner": false,
"propagateToOwnerHierarchy": false,
"propagateToTenant": false,
"propagateRelationTypes": null
},
{
"id": "0ad5d0ab-4f0a-48b3-9d0b-57919a475d84",
"alarmType": "VFD 02 Undervoltage Alarm",
"createRules": {
"CRITICAL": {
"condition": {
"condition": [
{
"key": {
"type": "TIME_SERIES",
"key": "vfd_02_undervoltage_alm"
},
"valueType": "BOOLEAN",
"value": null,
"predicate": {
"type": "BOOLEAN",
"operation": "EQUAL",
"value": {
"defaultValue": true,
"userValue": null,
"dynamicValue": null
}
}
}
],
"spec": {
"type": "SIMPLE"
}
},
"schedule": null,
"alarmDetails": "",
"dashboardId": null
}
},
"clearRule": {
"condition": {
"condition": [
{
"key": {
"type": "TIME_SERIES",
"key": "vfd_02_undervoltage_alm"
},
"valueType": "BOOLEAN",
"value": null,
"predicate": {
"type": "BOOLEAN",
"operation": "EQUAL",
"value": {
"defaultValue": false,
"userValue": null,
"dynamicValue": null
}
}
}
],
"spec": {
"type": "DURATION",
"unit": "MINUTES",
"predicate": {
"defaultValue": 30,
"userValue": null,
"dynamicValue": null
}
}
},
"schedule": null,
"alarmDetails": null,
"dashboardId": null
},
"propagate": false,
"propagateToOwner": false,
"propagateToOwnerHierarchy": false,
"propagateToTenant": false,
"propagateRelationTypes": null
}
]
},
"provisionDeviceKey": null,
"firmwareId": null,
"softwareId": null,
"defaultEdgeRuleChainId": null,
"default": false
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,307 @@
Name;latitude tel;longitude tel;latitude att;longitude att
"12"" Flow Meter";31.939630;-104.030778;;
1701 1;;;32.008171;-102.337949
1701 10;;;;
1701 11;;;32.007424;-102.347182
1701 12;;;;
1701 2;;;;
1701 9;;;32.007593;-102.346486
1701 Gateway;;;;
1701 Pond;;;32.007794;-102.339572
AA-101;;;32.014750;-102.220396
AA Pond;;;32.012669;-102.223246
AA Transfer;;;;
AdvVFDIPP #3;;;;
AL-101;;;32.287894;-102.353608
AL-901;;;32.274323;-102.368214
AS-11;;;32.074713;-102.180584
AT-101;;;32.055767;-102.191373
AU-3401;;;32.051447;-102.369505
Aurora 10;;;31.329965;-102.042210
Aurora 11;;;31.328801;-102.048474
Aurora 6;;;31.333529;-102.024099
Aurora 7;;;31.333874;-102.024464
Aurora 8;;;31.332901;-102.026872
Aurora 9;;;31.332249;-102.030431
AV-701;;;32.024790;-102.240240
AW-3401;;;32.091929;-102.241150
AW-901;;;32.069396;-102.245434
AW Battery;;;32.090579;-102.244011
Banay WW 18 #8;;;31.675614;-102.243897
Banay WW 7-2;;;31.677993;-102.252632
Barnett 19-2 WW;;;31.350333;-102.061960
Barnett 24-1;;;31.329354;-102.070197
Baylee Remote Booster;;;31.558139;-102.172528
BE-51;;;;
BE-601;;;32.056301;-102.277344
BE-71;;;32.038507;-102.263096
BE Pond;;;;
BI-31;;;32.034010;-102.323120
BJ-101;;;32.067810;-102.298672
BJ-701;;;32.073971;-102.272705
BK-1701;;;32.055834;-102.316510
BK-801;;;32.075204;-102.335508
BL-3201;;;32.050612;-102.341836
BL-3401;;;32.068716;-102.358516
BM-1501;;;32.134943;-102.267789
BN-2202;;;32.111258;-102.254015
BN-301;;;32.118530;-102.270160
BN Pond;;;32.112270;-102.257490
BP-201;;;32.131795;-102.294616
BP-601;;;32.128150;-102.308500
BP Battery;32.119443;-102.301507;32.119443;-102.301507
BP Compressor;;;;
BP Inlet;32.131920;-102.287505;;
BP Pond;;;32.132034;-102.288982
BQ-301;;;32.093284;-102.305847
BQ-41;;;32.114358;-102.299758
BV-101;;;32.178548;-102.281074
BV-4601;;;32.198494;-102.273250
BV-601;;;32.157367;-102.274653
BV-602;;;32.155210;-102.258540
BV Battery;31.965177;-102.123915;31.965177;-102.123915
BW-041;;;32.151020;-102.298150
BW-72;;;32.150861;-102.315472
BX-101;;;32.173490;-102.317370
BX-1601;;;32.168472;-102.334750
BX-901;;;32.185633;-102.313754
BX-902;;;32.176339;-102.300210
BY-501;;;32.209417;-102.304694
BZ-201;;;32.184045;-102.329931
BZ-202;;;32.197854;-102.324920
Caden WW #1;;;31.424971;-102.011564
Caden WW #2;;;31.426582;-102.004652
Caden WW #3;;;31.428291;-101.997159
Caden WW #4;;;31.429292;-101.992556
Caden WW #6;;;31.428559;-101.991219
Camera Trailer 100;31.142255;-103.147965;;
Camera Trailer 101;31.965302;-102.124730;;
Camera Trailer 102;32.313893;-102.367877;;
Camera Trailer 103;31.966095;-102.125094;;
Camera Trailer 104;31.966085;-102.125123;;
Camera Trailer 105;31.965380;-102.124730;;
Camera Trailer 106;31.966133;-102.125096;;
Camera Trailer 107;32.102407;-103.823707;;
Camera Trailer 108;31.968196;-102.126852;;
Camera Trailer 109;31.623276;-103.631850;;
Camera Trailer 110;32.153607;-102.272630;;
Camera Trailer 111;31.965916;-102.125094;;
Camera Trailer 112;31.965927;-102.125056;;
Camera Trailer 113;31.949004;-102.160070;;
Camera Trailer 114;31.965885;-102.125070;;
Camera Trailer 115;31.965828;-102.125046;;
Camera Trailer 116;32.109723;-103.541167;;
Camera Trailer 117;32.153028;-103.588695;;
Camera Trailer 118;32.066612;-103.782402;;
Camera Trailer 119;31.966031;-102.125101;;
Camera Trailer 120;32.304702;-101.872473;;
Camera Trailer 121;32.112238;-102.527553;;
Camera Trailer 122;32.208428;-102.360184;;
Camera Trailer 123;31.965646;-102.124758;;
Camera Trailer 125;31.965985;-102.125090;;
Camera Trailer 126;31.965331;-102.124706;;
Camera Trailer 127;31.966071;-102.125113;;
Camera Trailer 128;32.077878;-103.909418;;
Camera Trailer 129;31.965685;-102.124829;;
Camera Trailer 130;31.965685;-102.124842;;
Camera Trailer 200;32.207930;-103.876821;;
Camera Trailer 201;32.313567;-101.831447;;
Camera Trailer 202;32.313282;-101.823884;;
Camera Trailer 203;32.210359;-103.871380;;
Camera Trailer 204;32.015870;-101.826887;;
Camera Trailer 205;30.228071;-95.526871;;
Camera Trailer 206;32.178407;-102.280877;;
Camera Trailer 300;31.965136;-102.124625;;
Camera Trailer 301;31.965156;-102.124603;;
Camera Trailer 302;32.207931;-103.876112;;
Camera Trailer 303;31.965226;-102.124314;;
Camera Trailer 304;31.965134;-102.124679;;
Camera Trailer 305;32.210167;-103.872161;;
Camera Trailer 306;32.102767;-102.225360;;
Camera Trailer 307;32.304978;-101.873035;;
Camera Trailer 308;32.280076;-102.299571;;
Camera Trailer 309;32.150764;-102.272134;;
Camera Trailer 310;32.023837;-102.029614;;
Camera Trailer 311;32.312862;-101.831165;;
Camera Trailer 312;32.482383;-101.859808;;
Camera Trailer 313;32.471947;-101.935862;;
CF-1501;;;32.254407;-102.289776
CF-1601;;;32.253675;-102.321603
CF-2101;;;32.238472;-102.284806
CF-501;;;32.288194;-102.332453
CF-701;;;32.271506;-102.327233
CF-801;;;32.266433;-102.305903
CF Inlet;32.265871;-102.342135;;
CF Pond;;;32.265197;-102.341933
CG-1001;;;32.257922;-102.362356
CG-1101;;;32.240281;-102.357294
CG-601;;;32.253131;-102.342499
CG-701;;;32.269994;-102.347869
Chuda Flow Meter #1;;;32.487164;-101.870672
Chuda Flow Meter #2;;;32.486408;-101.865952
Chuda Flow Meter #3;;;32.484286;-101.867593
Chuda Flow Meter #4;;;32.487430;-101.862969
CI-1301;;;32.208100;-102.361340
CI-1302;;;32.222400;-102.350200
CI-401;;;32.216214;-102.330655
CI-501;;;32.236507;-102.337326
CJ-1801;;;32.243756;-102.305267
CJ-2201;;;32.226575;-102.313603
CrossBarRanch #3116 WS;;;32.105892;-102.195275
Davis Check Meter;;;30.385079;-100.398005
Dawn #2;;;31.427301;-102.119062
Dawn #3;;;31.423635;-102.121751
Dawn to Terri;;;31.426996;-102.118992
EKKO 1;;;;
FB-501;;;32.035592;-102.204997
Fee BM Battery;;;32.141825;-102.253097
Florence WW #1;;;31.389539;-101.977307
Florence WW #2;;;31.389809;-101.974169
Flow Meter 11;31.965532;-102.124231;;
Flow Meter 12;31.965514;-102.124253;;
Flow Meter 6;31.939516;-104.030772;;
Foundation Check Meter;;;30.401581;-100.807881
Francis Hill Check Meter;;;30.267756;-100.541178
Glasscock Check Meter;;;30.601340;-100.993300
Great Western Check Meter;;;30.429062;-100.802917
Headlee 3401 WS;31.969551;-102.297012;31.969551;-102.297012
"HP 10"" 60K #1";31.618667;-102.120201;;
"HP 12"" 40K #1 US";31.618745;-102.119999;;
"HP 12"" 40K #2";31.618721;-102.119852;;
"HP 12"" 40K #3";31.618723;-102.119812;;
"HP 12"" 60K #2";31.620732;-102.121136;;
"HP 12"" 60K #3";31.620829;-102.121155;;
"HP 8"" 40K #4 R";31.620769;-102.121099;;
HP Test Location;;;32.000000;-102.000000
HP Test Location 2;;;31.965225;-102.124103
Jessica WW #1;;;31.374467;-101.963489
Jessica WW #2;;;31.368209;-101.961262
Jessica WW #3;;;31.368043;-101.960620
Jessica WW #4;;;31.384569;-101.956347
Jessica WW #5;;;31.381946;-101.955482
Jessica WW #7;;;31.377569;-101.953845
Kate A1;;;31.346283;-102.086868
Kate A2;;;31.341675;-102.084076
Kate B1;;;31.335507;-102.081482
KD #2;;;31.474076;-102.197786
KD #4;;;31.479206;-102.201117
KD #5;;;31.474872;-102.209439
KD #7;;;31.479147;-102.216474
Kelsey Pit;;;31.516559;-102.166829
Laney A #2;;;31.356207;-102.052619
Laurie Gwen Transfer;;;31.425452;-101.987885
Laurie Gwen WW #1;;;31.414602;-101.998772
Lisa Water Transfer;;;31.420228;-101.968562
Lisa WW #1;;;31.419889;-101.975526
Lively Check Meter;;;30.401581;-100.807881
LUDEMAN #1;31.921785;-103.424975;;
"Mabee 16""";31.620073;-102.120593;;
Madeline WW #2;;;31.394942;-101.992428
Madelyn Kate #3 WW;;;31.390507;-101.986781
Mann Check Meter;;;30.228770;-100.379522
Mary 43 #1;;;31.481471;-102.199637
Mary 43 #2;;;31.457938;-102.197870
Mary 43 #3;;;31.477186;-102.186897
Mary 43 #5;;;31.474287;-102.187780
Monique #1;;;31.430164;-102.126619
Monique #2;;;31.426953;-102.126039
Monique #3;;;31.429928;-102.125681
Nancy Pit;;;31.513194;-102.230482
Office Water Management;;;;
P2P 2326;31.809850;-102.144562;;
P2P #3;31.620072;-102.120629;;
P2P CROSS L;31.617627;-102.148728;;
P2P HP ;31.618782;-102.119069;;
"Parks Inlet #1- 10""";31.816311;-102.138278;;
"Parks Inlet #2 - 10""";31.816290;-102.138280;;
"PARKS OUTLET - 10""";31.814745;-102.139394;;
Pond A;;;31.987505;-102.318024
Pond A Gateway;;;;
Power Plant Transfer;;;;
Rachel Gwen Transfer;;;31.393684;-101.961127
Ratliff Prod Well 27;;;31.987753;-102.344529
Ratliff Well 28;;;31.983872;-102.345029
Ratliff Well 29;;;31.983482;-102.344455
Ratliff Well 31;;;31.987715;-102.327278
Ratliff Well 36;;;;
Ratliff Well 38;;;;
Ratliff Well 42;;;31.964041;-102.332986
Ratliff Well 45;;;31.962430;-102.340150
Ratliff Well A 30;;;31.988380;-102.328844
Ratliff Well A 32;;;32.003628;-102.323035
Ratliff Well A 33;;;31.997734;-102.321101
Ratliff Well A 34;;;31.987116;-102.317512
Ratliff Well A 35;;;31.985142;-102.316897
Ratliff Well A 37;;;31.982706;-102.316073
Ratliff Well A 39;;;31.981049;-102.315328
Ratliff Well A 40;;;31.981164;-102.315928
Ratliff Well A 41;;;31.965060;-102.330468
Ratliff Well A 43;;;31.963629;-102.333210
Ratliff Well A 44;;;31.962098;-102.339928
Ratliff Well A 46;;;31.963278;-102.340511
Ratliff Well B 36;;;;
Rhonda Pit;;;31.567326;-102.285167
Rig Pump #03;31.809937;-101.762311;31.902849;-101.877387
Rig Pump #04;32.342715;-101.671300;32.320571;-101.695251
Rig Pump #06;32.015579;-101.826784;31.902959;-101.877407
Rig Pump #07;32.337589;-101.891645;31.867502;-101.819380
Rig Pump #08;32.008296;-101.840682;32.008296;-101.840682
Rig Pump #10;32.058536;-101.681551;32.210607;-101.630561
Rig Pump #11;31.848657;-101.766952;31.870703;-101.756014
Rig Pump #12;32.015573;-101.826779;31.872968;-101.752086
Rig Pump #13;32.457135;-101.783249;32.337629;-101.891645
S-601;;;32.219803;-102.280277
"Single 12""";31.860729;-102.303110;;
Sonya;;;31.750722;-102.046389
Stephanie 41 #2;;;31.507569;-102.173839
Stephanie 41 #3;;;31.505766;-102.181310
Terri #1;;;31.476535;-102.178382
Terri #2;;;31.481768;-102.180497
Terri #3;;;31.489832;-102.184831
Terri #4;;;31.490261;-102.183292
Terri #6;;;31.492807;-102.168766
Terri Pond;;;31.482556;-102.166806
Tessa Lyn;;;31.349740;-102.076933
TM1;;;31.498894;-102.205459
TM2;;;31.493274;-102.203603
TPRW Line;31.621735;-102.120537;;
Tree 13;;;32.001432;-102.360229
Tree 14;;;;
Tree 15;;;32.000017;-102.359792
Tree 16;;;;
Tree 17;;;;
Tree 18;;;;
Tree 19;;;;
Tree 20;;;;
Tree 21;;;31.996249;-102.358587
Tree 22;;;31.995313;-102.358832
Tree 23;;;31.994288;-102.357783
Tree 25;;;;
Tree 26;;;31.996235;-102.356192
Tree Gateway;;;;
Tree Pond;;;31.994993;-102.359162
"Triple 4""";31.860729;-102.303110;;
Trumann 1;;;31.335545;-102.006756
Trumann 2;;;31.335545;-102.006756
Trumann 3;;;31.341717;-102.007934
Trumann 4;;;31.343077;-102.010384
Trumann 5;;;31.348845;-102.008811
Valve Controller;;;32.178726;-102.280974
WC41-1;;;31.481766;-102.219535
WC41-2;;;31.480950;-102.223040
WC41-3;;;31.479859;-102.227972
Wess Hill Check Meter;;;30.496197;-100.877146
Windham 107-1;;;31.381876;-102.122542
Windham 107-2;;;31.380609;-102.122112
Windham 108-1;;;31.390889;-102.120610
Windham 108-10;;;31.389643;-102.122629
Windham 108-2;;;31.390139;-102.119854
Windham 108-3;;;31.390587;-102.126189
Windham 108-5;;;31.390815;-102.127345
Windham 108-6;;;31.391496;-102.129272
Windham 108-7;;;31.391321;-102.131313
Windham 108-8;;;31.386190;-102.127263
Windham 108-9;;;31.388959;-102.123217
Yvonne Transfer Pump 1;;;31.562778;-102.248611
Yvonne Transfer Pump 2;;;31.562778;-102.248611
Yvonne Transfer Pump 3;;;31.562778;-102.248611
1 Name latitude tel longitude tel latitude att longitude att
2 12" Flow Meter 31.939630 -104.030778
3 1701 1 32.008171 -102.337949
4 1701 10
5 1701 11 32.007424 -102.347182
6 1701 12
7 1701 2
8 1701 9 32.007593 -102.346486
9 1701 Gateway
10 1701 Pond 32.007794 -102.339572
11 AA-101 32.014750 -102.220396
12 AA Pond 32.012669 -102.223246
13 AA Transfer
14 AdvVFDIPP #3
15 AL-101 32.287894 -102.353608
16 AL-901 32.274323 -102.368214
17 AS-11 32.074713 -102.180584
18 AT-101 32.055767 -102.191373
19 AU-3401 32.051447 -102.369505
20 Aurora 10 31.329965 -102.042210
21 Aurora 11 31.328801 -102.048474
22 Aurora 6 31.333529 -102.024099
23 Aurora 7 31.333874 -102.024464
24 Aurora 8 31.332901 -102.026872
25 Aurora 9 31.332249 -102.030431
26 AV-701 32.024790 -102.240240
27 AW-3401 32.091929 -102.241150
28 AW-901 32.069396 -102.245434
29 AW Battery 32.090579 -102.244011
30 Banay WW 18 #8 31.675614 -102.243897
31 Banay WW 7-2 31.677993 -102.252632
32 Barnett 19-2 WW 31.350333 -102.061960
33 Barnett 24-1 31.329354 -102.070197
34 Baylee Remote Booster 31.558139 -102.172528
35 BE-51
36 BE-601 32.056301 -102.277344
37 BE-71 32.038507 -102.263096
38 BE Pond
39 BI-31 32.034010 -102.323120
40 BJ-101 32.067810 -102.298672
41 BJ-701 32.073971 -102.272705
42 BK-1701 32.055834 -102.316510
43 BK-801 32.075204 -102.335508
44 BL-3201 32.050612 -102.341836
45 BL-3401 32.068716 -102.358516
46 BM-1501 32.134943 -102.267789
47 BN-2202 32.111258 -102.254015
48 BN-301 32.118530 -102.270160
49 BN Pond 32.112270 -102.257490
50 BP-201 32.131795 -102.294616
51 BP-601 32.128150 -102.308500
52 BP Battery 32.119443 -102.301507 32.119443 -102.301507
53 BP Compressor
54 BP Inlet 32.131920 -102.287505
55 BP Pond 32.132034 -102.288982
56 BQ-301 32.093284 -102.305847
57 BQ-41 32.114358 -102.299758
58 BV-101 32.178548 -102.281074
59 BV-4601 32.198494 -102.273250
60 BV-601 32.157367 -102.274653
61 BV-602 32.155210 -102.258540
62 BV Battery 31.965177 -102.123915 31.965177 -102.123915
63 BW-041 32.151020 -102.298150
64 BW-72 32.150861 -102.315472
65 BX-101 32.173490 -102.317370
66 BX-1601 32.168472 -102.334750
67 BX-901 32.185633 -102.313754
68 BX-902 32.176339 -102.300210
69 BY-501 32.209417 -102.304694
70 BZ-201 32.184045 -102.329931
71 BZ-202 32.197854 -102.324920
72 Caden WW #1 31.424971 -102.011564
73 Caden WW #2 31.426582 -102.004652
74 Caden WW #3 31.428291 -101.997159
75 Caden WW #4 31.429292 -101.992556
76 Caden WW #6 31.428559 -101.991219
77 Camera Trailer 100 31.142255 -103.147965
78 Camera Trailer 101 31.965302 -102.124730
79 Camera Trailer 102 32.313893 -102.367877
80 Camera Trailer 103 31.966095 -102.125094
81 Camera Trailer 104 31.966085 -102.125123
82 Camera Trailer 105 31.965380 -102.124730
83 Camera Trailer 106 31.966133 -102.125096
84 Camera Trailer 107 32.102407 -103.823707
85 Camera Trailer 108 31.968196 -102.126852
86 Camera Trailer 109 31.623276 -103.631850
87 Camera Trailer 110 32.153607 -102.272630
88 Camera Trailer 111 31.965916 -102.125094
89 Camera Trailer 112 31.965927 -102.125056
90 Camera Trailer 113 31.949004 -102.160070
91 Camera Trailer 114 31.965885 -102.125070
92 Camera Trailer 115 31.965828 -102.125046
93 Camera Trailer 116 32.109723 -103.541167
94 Camera Trailer 117 32.153028 -103.588695
95 Camera Trailer 118 32.066612 -103.782402
96 Camera Trailer 119 31.966031 -102.125101
97 Camera Trailer 120 32.304702 -101.872473
98 Camera Trailer 121 32.112238 -102.527553
99 Camera Trailer 122 32.208428 -102.360184
100 Camera Trailer 123 31.965646 -102.124758
101 Camera Trailer 125 31.965985 -102.125090
102 Camera Trailer 126 31.965331 -102.124706
103 Camera Trailer 127 31.966071 -102.125113
104 Camera Trailer 128 32.077878 -103.909418
105 Camera Trailer 129 31.965685 -102.124829
106 Camera Trailer 130 31.965685 -102.124842
107 Camera Trailer 200 32.207930 -103.876821
108 Camera Trailer 201 32.313567 -101.831447
109 Camera Trailer 202 32.313282 -101.823884
110 Camera Trailer 203 32.210359 -103.871380
111 Camera Trailer 204 32.015870 -101.826887
112 Camera Trailer 205 30.228071 -95.526871
113 Camera Trailer 206 32.178407 -102.280877
114 Camera Trailer 300 31.965136 -102.124625
115 Camera Trailer 301 31.965156 -102.124603
116 Camera Trailer 302 32.207931 -103.876112
117 Camera Trailer 303 31.965226 -102.124314
118 Camera Trailer 304 31.965134 -102.124679
119 Camera Trailer 305 32.210167 -103.872161
120 Camera Trailer 306 32.102767 -102.225360
121 Camera Trailer 307 32.304978 -101.873035
122 Camera Trailer 308 32.280076 -102.299571
123 Camera Trailer 309 32.150764 -102.272134
124 Camera Trailer 310 32.023837 -102.029614
125 Camera Trailer 311 32.312862 -101.831165
126 Camera Trailer 312 32.482383 -101.859808
127 Camera Trailer 313 32.471947 -101.935862
128 CF-1501 32.254407 -102.289776
129 CF-1601 32.253675 -102.321603
130 CF-2101 32.238472 -102.284806
131 CF-501 32.288194 -102.332453
132 CF-701 32.271506 -102.327233
133 CF-801 32.266433 -102.305903
134 CF Inlet 32.265871 -102.342135
135 CF Pond 32.265197 -102.341933
136 CG-1001 32.257922 -102.362356
137 CG-1101 32.240281 -102.357294
138 CG-601 32.253131 -102.342499
139 CG-701 32.269994 -102.347869
140 Chuda Flow Meter #1 32.487164 -101.870672
141 Chuda Flow Meter #2 32.486408 -101.865952
142 Chuda Flow Meter #3 32.484286 -101.867593
143 Chuda Flow Meter #4 32.487430 -101.862969
144 CI-1301 32.208100 -102.361340
145 CI-1302 32.222400 -102.350200
146 CI-401 32.216214 -102.330655
147 CI-501 32.236507 -102.337326
148 CJ-1801 32.243756 -102.305267
149 CJ-2201 32.226575 -102.313603
150 CrossBarRanch #3116 WS 32.105892 -102.195275
151 Davis Check Meter 30.385079 -100.398005
152 Dawn #2 31.427301 -102.119062
153 Dawn #3 31.423635 -102.121751
154 Dawn to Terri 31.426996 -102.118992
155 EKKO 1
156 FB-501 32.035592 -102.204997
157 Fee BM Battery 32.141825 -102.253097
158 Florence WW #1 31.389539 -101.977307
159 Florence WW #2 31.389809 -101.974169
160 Flow Meter 11 31.965532 -102.124231
161 Flow Meter 12 31.965514 -102.124253
162 Flow Meter 6 31.939516 -104.030772
163 Foundation Check Meter 30.401581 -100.807881
164 Francis Hill Check Meter 30.267756 -100.541178
165 Glasscock Check Meter 30.601340 -100.993300
166 Great Western Check Meter 30.429062 -100.802917
167 Headlee 3401 WS 31.969551 -102.297012 31.969551 -102.297012
168 HP 10" 60K #1 31.618667 -102.120201
169 HP 12" 40K #1 US 31.618745 -102.119999
170 HP 12" 40K #2 31.618721 -102.119852
171 HP 12" 40K #3 31.618723 -102.119812
172 HP 12" 60K #2 31.620732 -102.121136
173 HP 12" 60K #3 31.620829 -102.121155
174 HP 8" 40K #4 R 31.620769 -102.121099
175 HP Test Location 32.000000 -102.000000
176 HP Test Location 2 31.965225 -102.124103
177 Jessica WW #1 31.374467 -101.963489
178 Jessica WW #2 31.368209 -101.961262
179 Jessica WW #3 31.368043 -101.960620
180 Jessica WW #4 31.384569 -101.956347
181 Jessica WW #5 31.381946 -101.955482
182 Jessica WW #7 31.377569 -101.953845
183 Kate A1 31.346283 -102.086868
184 Kate A2 31.341675 -102.084076
185 Kate B1 31.335507 -102.081482
186 KD #2 31.474076 -102.197786
187 KD #4 31.479206 -102.201117
188 KD #5 31.474872 -102.209439
189 KD #7 31.479147 -102.216474
190 Kelsey Pit 31.516559 -102.166829
191 Laney A #2 31.356207 -102.052619
192 Laurie Gwen Transfer 31.425452 -101.987885
193 Laurie Gwen WW #1 31.414602 -101.998772
194 Lisa Water Transfer 31.420228 -101.968562
195 Lisa WW #1 31.419889 -101.975526
196 Lively Check Meter 30.401581 -100.807881
197 LUDEMAN #1 31.921785 -103.424975
198 Mabee 16" 31.620073 -102.120593
199 Madeline WW #2 31.394942 -101.992428
200 Madelyn Kate #3 WW 31.390507 -101.986781
201 Mann Check Meter 30.228770 -100.379522
202 Mary 43 #1 31.481471 -102.199637
203 Mary 43 #2 31.457938 -102.197870
204 Mary 43 #3 31.477186 -102.186897
205 Mary 43 #5 31.474287 -102.187780
206 Monique #1 31.430164 -102.126619
207 Monique #2 31.426953 -102.126039
208 Monique #3 31.429928 -102.125681
209 Nancy Pit 31.513194 -102.230482
210 Office Water Management
211 P2P 2326 31.809850 -102.144562
212 P2P #3 31.620072 -102.120629
213 P2P CROSS L 31.617627 -102.148728
214 P2P HP 31.618782 -102.119069
215 Parks Inlet #1- 10" 31.816311 -102.138278
216 Parks Inlet #2 - 10" 31.816290 -102.138280
217 PARKS OUTLET - 10" 31.814745 -102.139394
218 Pond A 31.987505 -102.318024
219 Pond A Gateway
220 Power Plant Transfer
221 Rachel Gwen Transfer 31.393684 -101.961127
222 Ratliff Prod Well 27 31.987753 -102.344529
223 Ratliff Well 28 31.983872 -102.345029
224 Ratliff Well 29 31.983482 -102.344455
225 Ratliff Well 31 31.987715 -102.327278
226 Ratliff Well 36
227 Ratliff Well 38
228 Ratliff Well 42 31.964041 -102.332986
229 Ratliff Well 45 31.962430 -102.340150
230 Ratliff Well A 30 31.988380 -102.328844
231 Ratliff Well A 32 32.003628 -102.323035
232 Ratliff Well A 33 31.997734 -102.321101
233 Ratliff Well A 34 31.987116 -102.317512
234 Ratliff Well A 35 31.985142 -102.316897
235 Ratliff Well A 37 31.982706 -102.316073
236 Ratliff Well A 39 31.981049 -102.315328
237 Ratliff Well A 40 31.981164 -102.315928
238 Ratliff Well A 41 31.965060 -102.330468
239 Ratliff Well A 43 31.963629 -102.333210
240 Ratliff Well A 44 31.962098 -102.339928
241 Ratliff Well A 46 31.963278 -102.340511
242 Ratliff Well B 36
243 Rhonda Pit 31.567326 -102.285167
244 Rig Pump #03 31.809937 -101.762311 31.902849 -101.877387
245 Rig Pump #04 32.342715 -101.671300 32.320571 -101.695251
246 Rig Pump #06 32.015579 -101.826784 31.902959 -101.877407
247 Rig Pump #07 32.337589 -101.891645 31.867502 -101.819380
248 Rig Pump #08 32.008296 -101.840682 32.008296 -101.840682
249 Rig Pump #10 32.058536 -101.681551 32.210607 -101.630561
250 Rig Pump #11 31.848657 -101.766952 31.870703 -101.756014
251 Rig Pump #12 32.015573 -101.826779 31.872968 -101.752086
252 Rig Pump #13 32.457135 -101.783249 32.337629 -101.891645
253 S-601 32.219803 -102.280277
254 Single 12" 31.860729 -102.303110
255 Sonya 31.750722 -102.046389
256 Stephanie 41 #2 31.507569 -102.173839
257 Stephanie 41 #3 31.505766 -102.181310
258 Terri #1 31.476535 -102.178382
259 Terri #2 31.481768 -102.180497
260 Terri #3 31.489832 -102.184831
261 Terri #4 31.490261 -102.183292
262 Terri #6 31.492807 -102.168766
263 Terri Pond 31.482556 -102.166806
264 Tessa Lyn 31.349740 -102.076933
265 TM1 31.498894 -102.205459
266 TM2 31.493274 -102.203603
267 TPRW Line 31.621735 -102.120537
268 Tree 13 32.001432 -102.360229
269 Tree 14
270 Tree 15 32.000017 -102.359792
271 Tree 16
272 Tree 17
273 Tree 18
274 Tree 19
275 Tree 20
276 Tree 21 31.996249 -102.358587
277 Tree 22 31.995313 -102.358832
278 Tree 23 31.994288 -102.357783
279 Tree 25
280 Tree 26 31.996235 -102.356192
281 Tree Gateway
282 Tree Pond 31.994993 -102.359162
283 Triple 4" 31.860729 -102.303110
284 Trumann 1 31.335545 -102.006756
285 Trumann 2 31.335545 -102.006756
286 Trumann 3 31.341717 -102.007934
287 Trumann 4 31.343077 -102.010384
288 Trumann 5 31.348845 -102.008811
289 Valve Controller 32.178726 -102.280974
290 WC41-1 31.481766 -102.219535
291 WC41-2 31.480950 -102.223040
292 WC41-3 31.479859 -102.227972
293 Wess Hill Check Meter 30.496197 -100.877146
294 Windham 107-1 31.381876 -102.122542
295 Windham 107-2 31.380609 -102.122112
296 Windham 108-1 31.390889 -102.120610
297 Windham 108-10 31.389643 -102.122629
298 Windham 108-2 31.390139 -102.119854
299 Windham 108-3 31.390587 -102.126189
300 Windham 108-5 31.390815 -102.127345
301 Windham 108-6 31.391496 -102.129272
302 Windham 108-7 31.391321 -102.131313
303 Windham 108-8 31.386190 -102.127263
304 Windham 108-9 31.388959 -102.123217
305 Yvonne Transfer Pump 1 31.562778 -102.248611
306 Yvonne Transfer Pump 2 31.562778 -102.248611
307 Yvonne Transfer Pump 3 31.562778 -102.248611

View File

@@ -0,0 +1,18 @@
var mqtt = require('mqtt');
var client = mqtt.connect('mqtt://localhost',{
username: process.env.TOKEN
});
client.on('connect', function () {
console.log('connected');
client.subscribe('v1/devices/me/rpc/request/+')
client.subscribe('v1/devices/me/attributes')
});
client.on('message', function (topic, message) {
console.log('request.topic: ' + topic);
console.log('request.body: ' + message.toString());
var requestId = topic.slice('v1/devices/me/rpc/request/'.length);
//client acts as an echo service
client.publish('v1/devices/me/rpc/response/' + requestId, message);
});

457
Code Snippets/package-lock.json generated Normal file
View File

@@ -0,0 +1,457 @@
{
"name": "Code Snippets",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"dependencies": {
"mqtt": "^5.7.3"
}
},
"node_modules/@babel/runtime": {
"version": "7.24.7",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz",
"integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@types/node": {
"version": "20.14.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz",
"integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==",
"dependencies": {
"undici-types": "~5.26.4"
}
},
"node_modules/@types/readable-stream": {
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.14.tgz",
"integrity": "sha512-xZn/AuUbCMShGsqH/ehZtGDwQtbx00M9rZ2ENLe4tOjFZ/JFeWMhEZkk2fEe1jAUqqEAURIkFJ7Az/go8mM1/w==",
"dependencies": {
"@types/node": "*",
"safe-buffer": "~5.1.1"
}
},
"node_modules/@types/ws": {
"version": "8.5.10",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz",
"integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
"dependencies": {
"event-target-shim": "^5.0.0"
},
"engines": {
"node": ">=6.5"
}
},
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/bl": {
"version": "6.0.13",
"resolved": "https://registry.npmjs.org/bl/-/bl-6.0.13.tgz",
"integrity": "sha512-tMncAcpsyjZgAVbVFupVIaB2xud13xxT59fdHkuszY2jdZkqIWfpQdmII1fOe3kOGAz0mNLTIHEm+KxpYsQKKg==",
"dependencies": {
"@types/readable-stream": "^4.0.0",
"buffer": "^6.0.3",
"inherits": "^2.0.4",
"readable-stream": "^4.2.0"
}
},
"node_modules/buffer": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
"integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.2.1"
}
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
},
"node_modules/commist": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/commist/-/commist-3.2.0.tgz",
"integrity": "sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw=="
},
"node_modules/concat-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
"integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
"engines": [
"node >= 6.0"
],
"dependencies": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^3.0.2",
"typedarray": "^0.0.6"
}
},
"node_modules/concat-stream/node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/debug": {
"version": "4.3.5",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
"integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/event-target-shim": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
"engines": {
"node": ">=6"
}
},
"node_modules/events": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
"engines": {
"node": ">=0.8.x"
}
},
"node_modules/fast-unique-numbers": {
"version": "8.0.13",
"resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-8.0.13.tgz",
"integrity": "sha512-7OnTFAVPefgw2eBJ1xj2PGGR9FwYzSUso9decayHgCDX4sJkHLdcsYTytTg+tYv+wKF3U8gJuSBz2jJpQV4u/g==",
"dependencies": {
"@babel/runtime": "^7.23.8",
"tslib": "^2.6.2"
},
"engines": {
"node": ">=16.1.0"
}
},
"node_modules/help-me": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz",
"integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg=="
},
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/js-sdsl": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
"integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/js-sdsl"
}
},
"node_modules/lru-cache": {
"version": "10.3.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz",
"integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==",
"engines": {
"node": "14 || >=16.14"
}
},
"node_modules/minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/mqtt": {
"version": "5.7.3",
"resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.7.3.tgz",
"integrity": "sha512-v+5la6Q6zjl0AWsI7ICDA/K3hclkNj7CMa0khMugCC+LKPLrQF+sSQb/9ckezZLMvcBC1tXhRzqmcagQoDl9fQ==",
"dependencies": {
"@types/readable-stream": "^4.0.5",
"@types/ws": "^8.5.9",
"commist": "^3.2.0",
"concat-stream": "^2.0.0",
"debug": "^4.3.4",
"help-me": "^5.0.0",
"lru-cache": "^10.0.1",
"minimist": "^1.2.8",
"mqtt": "^5.2.0",
"mqtt-packet": "^9.0.0",
"number-allocator": "^1.0.14",
"readable-stream": "^4.4.2",
"reinterval": "^1.1.0",
"rfdc": "^1.3.0",
"split2": "^4.2.0",
"worker-timers": "^7.1.4",
"ws": "^8.17.1"
},
"bin": {
"mqtt": "build/bin/mqtt.js",
"mqtt_pub": "build/bin/pub.js",
"mqtt_sub": "build/bin/sub.js"
},
"engines": {
"node": ">=16.0.0"
}
},
"node_modules/mqtt-packet": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-9.0.0.tgz",
"integrity": "sha512-8v+HkX+fwbodsWAZIZTI074XIoxVBOmPeggQuDFCGg1SqNcC+uoRMWu7J6QlJPqIUIJXmjNYYHxBBLr1Y/Df4w==",
"dependencies": {
"bl": "^6.0.8",
"debug": "^4.3.4",
"process-nextick-args": "^2.0.1"
}
},
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/number-allocator": {
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz",
"integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==",
"dependencies": {
"debug": "^4.3.1",
"js-sdsl": "4.3.0"
}
},
"node_modules/process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
"integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
"engines": {
"node": ">= 0.6.0"
}
},
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"node_modules/readable-stream": {
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz",
"integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==",
"dependencies": {
"abort-controller": "^3.0.0",
"buffer": "^6.0.3",
"events": "^3.3.0",
"process": "^0.11.10",
"string_decoder": "^1.3.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/regenerator-runtime": {
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
},
"node_modules/reinterval": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz",
"integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ=="
},
"node_modules/rfdc": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
"integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="
},
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"node_modules/split2": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
"integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
"engines": {
"node": ">= 10.x"
}
},
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/string_decoder/node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/tslib": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
"integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="
},
"node_modules/typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
},
"node_modules/undici-types": {
"version": "5.26.5",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
"node_modules/worker-timers": {
"version": "7.1.8",
"resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-7.1.8.tgz",
"integrity": "sha512-R54psRKYVLuzff7c1OTFcq/4Hue5Vlz4bFtNEIarpSiCYhpifHU3aIQI29S84o1j87ePCYqbmEJPqwBTf+3sfw==",
"dependencies": {
"@babel/runtime": "^7.24.5",
"tslib": "^2.6.2",
"worker-timers-broker": "^6.1.8",
"worker-timers-worker": "^7.0.71"
}
},
"node_modules/worker-timers-broker": {
"version": "6.1.8",
"resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-6.1.8.tgz",
"integrity": "sha512-FUCJu9jlK3A8WqLTKXM9E6kAmI/dR1vAJ8dHYLMisLNB/n3GuaFIjJ7pn16ZcD1zCOf7P6H62lWIEBi+yz/zQQ==",
"dependencies": {
"@babel/runtime": "^7.24.5",
"fast-unique-numbers": "^8.0.13",
"tslib": "^2.6.2",
"worker-timers-worker": "^7.0.71"
}
},
"node_modules/worker-timers-worker": {
"version": "7.0.71",
"resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-7.0.71.tgz",
"integrity": "sha512-ks/5YKwZsto1c2vmljroppOKCivB/ma97g9y77MAAz2TBBjPPgpoOiS1qYQKIgvGTr2QYPT3XhJWIB6Rj2MVPQ==",
"dependencies": {
"@babel/runtime": "^7.24.5",
"tslib": "^2.6.2"
}
},
"node_modules/ws": {
"version": "8.18.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
"integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
}
}
}

View File

@@ -0,0 +1,5 @@
{
"dependencies": {
"mqtt": "^5.7.3"
}
}