added EKKO report
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -15,36 +15,33 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"url = \"https://www.enxlekkocloud.com\"\n",
|
||||
"username = \"nico.a.melone@gmail.com\"\n",
|
||||
"password = \"9EE#mqb*b6bXV9hJrPYGm&w3q5Y@3acumvvb5isQ\"\n",
|
||||
"url = \"https://hp.henrypump.cloud\"\n",
|
||||
"username = \"nmelone@henry-pump.com\"\n",
|
||||
"password = \"gzU6$26v42mU%3jDzTJf\"\n",
|
||||
"userIdToCopy = \"\"\n",
|
||||
"entity_group_id=\"616d62f0-3300-11ef-9c57-29fbfd438c8b\"\n",
|
||||
"default_dashboard = \"c157d8a0-32f9-11ef-9c57-29fbfd438c8b\""
|
||||
"entity_group_id=\"b7a04da0-54d8-11ef-8d66-9bbb0351be2a\"\n",
|
||||
"default_dashboard = \"a8ce80b0-54ee-11ef-aa15-a127638e3a77\""
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"execution_count": 3,
|
||||
"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",
|
||||
" \"Taylor Schafer - taylor@aermotorwindmill.com - 3257167602\",\n",
|
||||
" \"Conner Scrivner - conner@aermotorwindmill.com - 4329349131\"\n",
|
||||
" ]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -58,7 +55,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -73,7 +70,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -87,7 +84,7 @@
|
||||
" email = parts[1]\n",
|
||||
" phone = ''\n",
|
||||
" if len(parts) > 2:\n",
|
||||
" phone = '+' + re.sub(r'\\D', '', parts[2])\n",
|
||||
" phone = '+1' + re.sub(r'\\D', '', parts[2])\n",
|
||||
" \n",
|
||||
" owner_id = {\n",
|
||||
" \"id\": entity_group_id,\n",
|
||||
@@ -120,7 +117,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -129,7 +126,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
|
||||
74
Code Snippets/filterMistawayPerCustomerDevices.ipynb
Normal file
74
Code Snippets/filterMistawayPerCustomerDevices.ipynb
Normal file
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import json\n",
|
||||
"\n",
|
||||
"device = {}\n",
|
||||
"with open(\"/Users/nico/Documents/GitHub/Mistaway API/deviceMaps/deviceMap2024-08-29.json\", \"r\") as f:\n",
|
||||
" devices = json.load(f)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"\n",
|
||||
"customer_devices = {}\n",
|
||||
"for key, value in devices.items():\n",
|
||||
" if value[\"customer\"] == \"CrownQuest\":\n",
|
||||
" value[\"customer\"] = \"OxyRock\"\n",
|
||||
" customer_devices[key] = value\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"customer_devices = {}\n",
|
||||
"for key, value in devices.items():\n",
|
||||
" customer_devices[key[:-6]] = value[\"deviceName\"]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"\n",
|
||||
"with open(\"/Users/nico/Documents/GitHub/Mistaway API/deviceMaps/deviceMap2024-08-29-device.json\", \"w+\") as f:\n",
|
||||
" json.dump(customer_devices, f, indent=4)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "aws",
|
||||
"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.11.9"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
131
Code Snippets/provisioningExample.py
Normal file
131
Code Snippets/provisioningExample.py
Normal file
@@ -0,0 +1,131 @@
|
||||
from paho.mqtt.client import Client
|
||||
from json import dumps, loads
|
||||
|
||||
RESULT_CODES = {
|
||||
1: "incorrect protocol version",
|
||||
2: "invalid client identifier",
|
||||
3: "server unavailable",
|
||||
4: "bad username or password",
|
||||
5: "not authorised",
|
||||
}
|
||||
|
||||
|
||||
|
||||
def collect_required_data():
|
||||
config = {}
|
||||
print("\n\n", "="*80, sep="")
|
||||
print(" "*10, "\033[1m\033[94mThingsBoard device provisioning with basic authorization example script.\033[0m", sep="")
|
||||
print("="*80, "\n\n", sep="")
|
||||
host = input("Please write your ThingsBoard \033[93mhost\033[0m or leave it blank to use default (thingsboard.cloud): ")
|
||||
config["host"] = host if host else "mqtt.thingsboard.cloud"
|
||||
port = input("Please write your ThingsBoard \033[93mport\033[0m or leave it blank to use default (1883): ")
|
||||
config["port"] = int(port) if port else 1883
|
||||
config["provision_device_key"] = input("Please write \033[93mprovision device key\033[0m: ")
|
||||
config["provision_device_secret"] = input("Please write \033[93mprovision device secret\033[0m: ")
|
||||
device_name = input("Please write \033[93mdevice name\033[0m or leave it blank to generate: ")
|
||||
if device_name:
|
||||
config["device_name"] = device_name
|
||||
print("\n", "="*80, "\n", sep="")
|
||||
return config
|
||||
|
||||
|
||||
class ProvisionClient(Client):
|
||||
PROVISION_REQUEST_TOPIC = "/provision/request"
|
||||
PROVISION_RESPONSE_TOPIC = "/provision/response"
|
||||
|
||||
def __init__(self, host, port, provision_request):
|
||||
super().__init__()
|
||||
self._host = host
|
||||
self._port = port
|
||||
self._username = "provision"
|
||||
self.on_connect = self.__on_connect
|
||||
self.on_message = self.__on_message
|
||||
self.__provision_request = provision_request
|
||||
|
||||
def __on_connect(self, client, userdata, flags, rc): # Callback for connect
|
||||
if rc == 0:
|
||||
print("[Provisioning client] Connected to ThingsBoard ")
|
||||
client.subscribe(self.PROVISION_RESPONSE_TOPIC) # Subscribe to provisioning response topic
|
||||
provision_request = dumps(self.__provision_request)
|
||||
print("[Provisioning client] Sending provisioning request %s" % provision_request)
|
||||
client.publish(self.PROVISION_REQUEST_TOPIC, provision_request) # Publishing provisioning request topic
|
||||
else:
|
||||
print("[Provisioning client] Cannot connect to ThingsBoard!, result: %s" % RESULT_CODES[rc])
|
||||
|
||||
def __on_message(self, client, userdata, msg):
|
||||
decoded_payload = msg.payload.decode("UTF-8")
|
||||
print("[Provisioning client] Received data from ThingsBoard: %s" % decoded_payload)
|
||||
decoded_message = loads(decoded_payload)
|
||||
provision_device_status = decoded_message.get("status")
|
||||
if provision_device_status == "SUCCESS":
|
||||
self.__save_credentials(decoded_message["credentialsValue"])
|
||||
else:
|
||||
print("[Provisioning client] Provisioning was unsuccessful with status %s and message: %s" % (provision_device_status, decoded_message["errorMsg"]))
|
||||
self.disconnect()
|
||||
|
||||
def provision(self):
|
||||
print("[Provisioning client] Connecting to ThingsBoard (provisioning client)")
|
||||
self.__clean_credentials()
|
||||
self.connect(self._host, self._port, 60)
|
||||
self.loop_forever()
|
||||
|
||||
def get_new_client(self):
|
||||
client_credentials = self.__get_credentials()
|
||||
new_client = None
|
||||
if client_credentials:
|
||||
new_client = Client()
|
||||
new_client.username_pw_set(client_credentials)
|
||||
print("[Provisioning client] Read credentials from file.")
|
||||
else:
|
||||
print("[Provisioning client] Cannot read credentials from file!")
|
||||
return new_client
|
||||
|
||||
@staticmethod
|
||||
def __get_credentials():
|
||||
new_credentials = None
|
||||
try:
|
||||
with open("credentials", "r") as credentials_file:
|
||||
new_credentials = credentials_file.read()
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return new_credentials
|
||||
|
||||
@staticmethod
|
||||
def __save_credentials(credentials):
|
||||
with open("credentials", "w") as credentials_file:
|
||||
credentials_file.write(credentials)
|
||||
|
||||
@staticmethod
|
||||
def __clean_credentials():
|
||||
open("credentials", "w").close()
|
||||
|
||||
|
||||
def on_tb_connected(client, userdata, flags, rc): # Callback for connect with received credentials
|
||||
if rc == 0:
|
||||
print("[ThingsBoard client] Connected to ThingsBoard with credentials: %s" % client._username.decode())
|
||||
else:
|
||||
print("[ThingsBoard client] Cannot connect to ThingsBoard!, result: %s" % RESULT_CODES[rc])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
config = collect_required_data()
|
||||
|
||||
THINGSBOARD_HOST = config["host"] # ThingsBoard instance host
|
||||
THINGSBOARD_PORT = config["port"] # ThingsBoard instance MQTT port
|
||||
|
||||
PROVISION_REQUEST = {"provisionDeviceKey": config["provision_device_key"], # Provision device key, replace this value with your value from device profile.
|
||||
"provisionDeviceSecret": config["provision_device_secret"], # Provision device secret, replace this value with your value from device profile.
|
||||
}
|
||||
if config.get("device_name") is not None:
|
||||
PROVISION_REQUEST["deviceName"] = config["device_name"]
|
||||
provision_client = ProvisionClient(THINGSBOARD_HOST, THINGSBOARD_PORT, PROVISION_REQUEST)
|
||||
provision_client.provision() # Request provisioned data
|
||||
tb_client = provision_client.get_new_client() # Getting client with provisioned data
|
||||
if tb_client:
|
||||
tb_client.on_connect = on_tb_connected # Setting callback for connect
|
||||
tb_client.connect(THINGSBOARD_HOST, THINGSBOARD_PORT, 60)
|
||||
tb_client.loop_forever() # Starting infinity loop
|
||||
else:
|
||||
print("Client was not created!")
|
||||
|
||||
Reference in New Issue
Block a user