# <center><i class="fa fa-edit"></i> Edge SDK + Datahub Cont. </center> ###### tags: `Internship` :::info **Goal:** - [x] WISE-PaaS:上傳數據至DataHub - [x] WISE-PaaS Python EdgeSDK 飲水機數據模擬教學 **Resources:** [Dashboard access mongoDB from NTUST](https://hackmd.io/@eric248550/BkZpSMjc9) [2021 物聯網平台實習 (ET2702301)](https://hackmd.io/1vqhIDkqQKqF907HpneANw?view) [Management Portal](https://portal-mp-ensaas.education.wise-paas.com/console) [Dashboard Home](https://dashboard-ruiguang-ews.education.wise-paas.com/?orgId=1) [Week2 Edge SDK + Datahub](https://hackmd.io/@Mick-Lin/BJzCouW4K) ::: ### WISE-PaaS Python EdgeSDK 飲水機數據模擬教學 - tkinter for GUI - wise paas module ``` import datetime import time import tkinter from tkinter import ttk from tkinter import messagebox import string import random import threading from wisepaasdatahubedgesdk.EdgeAgent import EdgeAgent import wisepaasdatahubedgesdk.Common.Constants as constant from wisepaasdatahubedgesdk.Model.Edge import EdgeAgentOptions, MQTTOptions, DCCSOptions, EdgeData, EdgeTag, EdgeStatus, EdgeDeviceStatus, EdgeConfig, NodeConfig, DeviceConfig, AnalogTagConfig, DiscreteTagConfig, TextTagConfig from wisepaasdatahubedgesdk.Common.Utils import RepeatedTimer class App(): def __init__(self, master = None): self._edgeAgent = None self.timer = None self.master = master master.title('飲水機SDK') master.geometry('720x360') # create a tab control tabControl = ttk.Notebook(master) # create a tab dccsTab = ttk.Frame(tabControl, width = 200, height = 100) tabControl.add(dccsTab, text = 'DCCS') tabControl.grid(column = 0, row = 0, rowspan = 2, columnspan = 2, padx = 8, pady = 4, sticky = 'EWNS') # add tab content ttk.Label(dccsTab, text = 'API Url:').grid(column = 0, row = 0, sticky = 'EWNS') App.apiUrl = tkinter.StringVar() tkinter.Entry(dccsTab, textvariable = App.apiUrl, width = 10).grid(column = 1, row = 0, sticky = 'EWNS') ttk.Label(dccsTab, text = 'Credential Key:').grid(column = 0, row = 1, sticky = 'EWNS') App.credentialKey = tkinter.StringVar() tkinter.Entry(dccsTab, textvariable = App.credentialKey, width = 10).grid(column = 1, row = 1, sticky = 'EWNS') # create a tab mqttTab = ttk.Frame(tabControl, width = 200, height = 100) mqttTab.grid(column = 0, row = 0, padx = 8, pady = 4) tabControl.add(mqttTab, text = 'MQTT') tabControl.grid(column = 0, row = 0, rowspan = 2, columnspan = 2, padx = 8, pady = 4) # add tab content ttk.Label(mqttTab, text = 'HostName:').grid(column = 0, row = 0, sticky = 'EWNS') App.hostName = tkinter.StringVar() App.hostName.set('127.0.0.1') tkinter.Entry(mqttTab, textvariable = App.hostName, width = 10).grid(column = 1, row = 0, sticky = 'EWNS') ttk.Label(mqttTab, text = 'Port:').grid(column = 0, row = 1, sticky = 'EWNS') App.port = tkinter.IntVar() App.port.set(1883) tkinter.Entry(mqttTab, textvariable = App.port, width = 10).grid(column = 1, row = 1, sticky = 'EWNS') ttk.Label(mqttTab, text = 'Username:').grid(column = 0, row = 2, sticky = 'EWNS') App.userName = tkinter.StringVar() App.userName.set('') tkinter.Entry(mqttTab, textvariable = App.userName, width = 10).grid(column = 1, row = 2, sticky = 'EWNS') ttk.Label(mqttTab, text = 'Password:').grid(column = 0, row = 3, sticky = 'EWNS') App.password = tkinter.StringVar() App.password.set('') tkinter.Entry(mqttTab, textvariable = App.password, width = 10).grid(column = 1, row = 3, sticky = 'EWNS') # connect status App.status = tkinter.StringVar() App.status.set('Disconnected') statusLabel = tkinter.Label(master, textvariable = App.status, bg = '#C0C0C0') statusLabel.grid(column = 2, row = 0, columnspan = 2, sticky = 'EWNS') # function def clickedConnect(): try: if App.nodeId.get() == '': messagebox.showwarning("Warging", 'nodeId is necessary') return selectTab = tabControl.tab(tabControl.select(), 'text') edgeAgentOptions = EdgeAgentOptions(nodeId = App.nodeId.get()) if selectTab == 'MQTT': edgeAgentOptions.connectType = constant.ConnectType['MQTT'] mqttOptions = MQTTOptions(hostName = App.hostName.get(), port = App.port.get(), userName = App.userName.get(), password = App.password.get()) edgeAgentOptions.MQTT = mqttOptions elif selectTab == 'DCCS': edgeAgentOptions.connectType = constant.ConnectType['DCCS'] dccsOptions = DCCSOptions(apiUrl = App.apiUrl.get(), credentialKey = App.credentialKey.get()) edgeAgentOptions.DCCS = dccsOptions if self._edgeAgent is None: self._edgeAgent = EdgeAgent(edgeAgentOptions) self._edgeAgent.on_connected = on_connected self._edgeAgent.on_disconnected = on_disconnected self._edgeAgent.on_message = on_message self._edgeAgent.connect() except ValueError as error: messagebox.showwarning("Warging", str(error)) def on_connected(edgeAgent, isConnected): if isConnected: App.status.set('Connected') statusLabel.config(bg='#008000') def on_disconnected(edgeAgent, isDisconnected): if isDisconnected: App.status.set('Disconnected') statusLabel.config(bg='#C0C0C0') self._edgeAgent = None self.timer = None def on_message(edgeAgent, message): if message.type == constant.MessageType['ConfigAck']: response = 'Upload Config Result: {0}'.format(str(message.message.result)) messagebox.showwarning("Information", response) elif message.type == constant.MessageType['WriteValue']: message = message.message for device in message.deviceList: print("deviceId: {0}".format(device.id)) for tag in device.tagList: print("tagName: {0}, Value: {1}".format(tag.name, str(tag.value))) if device.id == "Device1" and tag.name == "DTag1": App.dTag1Value.set(tag.value) def clickedDisconnected(): if self._edgeAgent is None or not self._edgeAgent.isConnected: return self._edgeAgent.disconnect() def clickedSendData(): if self._edgeAgent is None or not self._edgeAgent.isConnected: messagebox.showwarning("Warging", 'edge not connected') return frequency = int(App.frequency.get()) if self.timer is None: self.timer = RepeatedTimer(frequency, __sendData) __sendData() def __sendData(): data = __generateData() self._edgeAgent.sendData(data) def clickedDeviceStatus(): if self._edgeAgent is None or not self._edgeAgent.isConnected: messagebox.showwarning("Warging", 'edge not connected') return status = __generateStatus() self._edgeAgent.sendDeviceStatus(status) def clickedUploadConfig(): if self._edgeAgent is None or not self._edgeAgent.isConnected: messagebox.showwarning("Warging", 'edge not connected') return config = __generateConfig() self._edgeAgent.uploadConfig(action = constant.ActionType['Create'], edgeConfig = config) def clickedUpdateConfig(): if self._edgeAgent is None or not self._edgeAgent.isConnected: messagebox.showwarning("Warging", 'edge not connected') return config = __generateConfig() self._edgeAgent.uploadConfig(action = constant.ActionType['Update'], edgeConfig = config) def clickedDeleteNode(): if self._edgeAgent is None or not self._edgeAgent.isConnected: messagebox.showwarning("Warging", 'edge not connected') return config = __generateDelteNodeConfig() self._edgeAgent.uploadConfig(action = constant.ActionType['Delete'], edgeConfig = config) def clickedDeleteDevice(): if self._edgeAgent is None or not self._edgeAgent.isConnected: messagebox.showwarning("Warging", 'edge not connected') return config = __generateDelteDeviceConfig() self._edgeAgent.uploadConfig(action = constant.ActionType['Delete'], edgeConfig = config) def clickedDeleteTag(): if self._edgeAgent is None or not self._edgeAgent.isConnected: messagebox.showwarning("Warging", 'edge not connected') return config = __generateDelteTagConfig() self._edgeAgent.uploadConfig(action = constant.ActionType['Delete'], edgeConfig = config) def __generateData(): edgeData = EdgeData() for i in range(1, int(App.deviceCount.get()) + 1): for j in range(1, int(App.consumptionCount.get()) + 1): deviceId = 'Device' + str(i) tagName = 'CTag' + str(j) value = random.uniform(0, 10) tag = EdgeTag(deviceId, tagName, value) edgeData.tagList.append(tag) for j in range(1, int(App.temperatureCount.get()) + 1): deviceId = 'Device' + str(i) tagName = 'TTag' + str(j) if j==1: value = random.randint(0,30) if j==2: value = random.randint(31,60) if j==3: value = random.randint(85,100) tag = EdgeTag(deviceId, tagName, value) edgeData.tagList.append(tag) for j in range(1, int(App.statusCount.get()) + 1): deviceId = 'Device' + str(i) tagName = 'STag' + str(j) value = int(random.uniform(0, 6)) tag = EdgeTag(deviceId, tagName, value) edgeData.tagList.append(tag) edgeData.timestamp = datetime.datetime.now() #edgeData.timestamp = datetime.datetime(2020,8,24,6,10,8) # you can defne the timestamp(local time) of data return edgeData def __generateStatus(): deviceStatus = EdgeDeviceStatus() for i in range(1, int(App.deviceCount.get()) + 1): deviceId = 'Device' + str(i) device = EdgeStatus(id = deviceId, status = constant.Status['Online']) deviceStatus.deviceList.append(device) return deviceStatus def __generateConfig(): config = EdgeConfig() nodeConfig = NodeConfig(nodeType = constant.EdgeType['Gateway']) config.node = nodeConfig for i in range(1, int(App.deviceCount.get()) + 1): deviceConfig = DeviceConfig(id = 'Device' + str(i), name = 'Device' + str(i), description = 'Dispenser' + str(i), deviceType = 'Smart Device', retentionPolicyName = '') for j in range(1, int(App.consumptionCount.get()) + 1): if j == 1: descpt = 'Cold Water Consumption' if j == 2: descpt = 'Warm Water Consumption' if j == 3: descpt = 'Hot Water Consumption' analog = AnalogTagConfig(name = 'CTag' + str(j), description = descpt, readOnly = False, arraySize = 0, spanHigh = 1000, spanLow = 0, engineerUnit = '', integerDisplayFormat = 4, fractionDisplayFormat = 2) deviceConfig.analogTagList.append(analog) for j in range(1, int(App.temperatureCount.get()) + 1): if j == 1: descpt = 'Cold Water Temperature' if j == 2: descpt = 'Warm Water Temperature' if j == 3: descpt = 'Hot Water Temperature' analog = AnalogTagConfig(name = 'TTag' + str(j), description = descpt, readOnly = False, arraySize = 0, spanHigh = 1000, spanLow = 0, engineerUnit = '', integerDisplayFormat = 4, fractionDisplayFormat = 2) deviceConfig.analogTagList.append(analog) for j in range(1, int(App.statusCount.get()) + 1): analog = AnalogTagConfig(name = 'STag' + str(j), description = 'Dispenser Status', readOnly = False, arraySize = 0, spanHigh = 1000, spanLow = 0, engineerUnit = '', integerDisplayFormat = 4, fractionDisplayFormat = 2) deviceConfig.analogTagList.append(analog) config.node.deviceList.append(deviceConfig) return config def __generateDelteNodeConfig(): config = EdgeConfig() nodeConfig = NodeConfig() config.node = nodeConfig return config def __generateDelteDeviceConfig(): config = EdgeConfig() nodeConfig = NodeConfig() config.node = nodeConfig for i in range(1, int(App.deviceCount.get()) + 1): deviceConfig = DeviceConfig(id = 'Device' + str(i)) config.node.deviceList.append(deviceConfig) return config def __generateDelteTagConfig(): config = EdgeConfig() nodeConfig = NodeConfig() config.node = nodeConfig for i in range(1, int(App.deviceCount.get()) + 1): deviceConfig = DeviceConfig(id = 'Device' + str(i)) for j in range(1, int(App.consumptionCount.get()) + 1): analog = AnalogTagConfig(name = 'CTag' + str(j)) deviceConfig.analogTagList.append(analog) for j in range(1, int(App.temperatureCount.get()) + 1): analog = AnalogTagConfig(name = 'TTag' + str(j)) deviceConfig.analogTagList.append(analog) for j in range(1, int(App.statusCount.get()) + 1): analog = AnalogTagConfig(name = 'STag' + str(j)) deviceConfig.analogTagList.append(analog) config.node.deviceList.append(deviceConfig) return config # input nodeFrame = tkinter.Frame(master) nodeFrame.grid(column = 0, row = 2, columnspan = 2, sticky = 'W') ttk.Label(nodeFrame, text = 'NodeId:').pack(side = tkinter.TOP) App.nodeId = tkinter.StringVar() tkinter.Entry(nodeFrame, textvariable = App.nodeId, width = 10).pack(side = tkinter.TOP) ''' wvFrame = tkinter.Frame(master) wvFrame.grid(column = 1, row = 2, columnspan = 2, sticky = 'W') ttk.Label(wvFrame, text = 'DTag1 Value:').pack(side = tkinter.TOP) App.dTag1Value = tkinter.IntVar() App.dTag1Value.set(1) ttk.Label(wvFrame, textvariable = App.dTag1Value).pack(side = tkinter.TOP) ''' deviceFrame = tkinter.Frame(master) deviceFrame.grid(column = 0, row = 3, columnspan = 2, sticky = 'W') ttk.Label(deviceFrame, text = 'Device Count:').pack(side = tkinter.TOP) App.deviceCount = tkinter.IntVar() App.deviceCount.set(1) tkinter.Entry(deviceFrame, textvariable = App.deviceCount, width = 10).pack(side = tkinter.TOP) consumptionFrame = tkinter.Frame(master) consumptionFrame.grid(column = 0, row = 4, sticky = 'EWNS') ttk.Label(consumptionFrame, text = 'Consumption Tag Count:').pack(side = tkinter.TOP) App.consumptionCount = tkinter.IntVar() App.consumptionCount.set(3) tkinter.Entry(consumptionFrame, textvariable = App.consumptionCount, width = 10).pack(side = tkinter.TOP) temperatureFrame = tkinter.Frame(master) temperatureFrame.grid(column = 1, row = 4, sticky = 'EWNS') ttk.Label(temperatureFrame, text = 'Temperature Tag Count:').pack(side = tkinter.TOP) App.temperatureCount = tkinter.IntVar() App.temperatureCount.set(3) tkinter.Entry(temperatureFrame, textvariable = App.temperatureCount, width = 10).pack(side = tkinter.TOP) statusFrame = tkinter.Frame(master) statusFrame.grid(column = 2, row = 4, sticky = 'EWNS') ttk.Label(statusFrame, text = 'Status Tag Count:').pack(side = tkinter.TOP) App.statusCount = tkinter.IntVar() App.statusCount.set(1) tkinter.Entry(statusFrame, textvariable = App.statusCount, width = 10).pack(side = tkinter.TOP) fraquencyFrame = tkinter.Frame(master) fraquencyFrame.grid(column = 3, row = 4, sticky = 'EWNS') ttk.Label(fraquencyFrame, text = 'Data Fredquency:').pack(side = tkinter.TOP) App.frequency = tkinter.IntVar() App.frequency.set(1) tkinter.Entry(fraquencyFrame, textvariable = App.frequency, width = 10).pack(side = tkinter.TOP) # button ttk.Button(master, text = 'Connect', command = clickedConnect).grid(column = 2, row = 1, sticky = 'EWNS') ttk.Button(master, text = 'Disconnect', command = clickedDisconnected).grid(column = 3, row = 1, sticky = 'EWNS') ttk.Button(master, text = 'Update Device Status', command = clickedDeviceStatus).grid(column = 2, row = 2, sticky = 'EWNS') ttk.Button(master, text = 'Send Data', command = clickedSendData).grid(column = 3, row = 2, sticky = 'EWNS') ttk.Button(master, text = 'Upload Config', command = clickedUploadConfig).grid(column = 4, row = 0, sticky = 'EWNS') ttk.Button(master, text = 'Update Config', command = clickedUpdateConfig).grid(column = 4, row = 1, sticky = 'EWNS') ttk.Button(master, text = 'Delete All Config', command = clickedDeleteNode).grid(column = 4, row = 2, sticky = 'EWNS') ttk.Button(master, text = 'Delete Devices', command = clickedDeleteDevice).grid(column = 4, row = 3, sticky = 'EWNS') ttk.Button(master, text = 'Delete Tag', command = clickedDeleteTag).grid(column = 4, row = 4, sticky = 'EWNS') root = tkinter.Tk() mainWindow = App(root) root.mainloop() # start GUI ```