def getBinary(binaryID, name): logger.info('Getting binary in c8y') url = "https://%s/inventory/binaries/%s" % (auth.get().tenant, binaryID) logger.debug('Requesting the following url: ' + str(url)) response = requests.request("GET", url, headers=auth.get().headers, data=auth.get().payload) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 200: logger.info('Managed object exists in C8Y') try: file = './binary/' + str(name) with open(file, "wb") as code: code.write(response.content) except Exception as e: logger.error('Writing to disc failed due to: ' + str(e)) logger.debug('File written') logger.debug('Returning True') return True else: logger.error('Receiving following status code %s' % (str(response.status_code))) raise Exception
def getInternalID(externalID): try: logger.info( 'Checking against indentity service what is internalID in C8Y') url = "https://%s/identity/externalIds/c8y_Serial/%s" % ( auth.get().tenant, externalID) response = requests.request("GET", url, headers=auth.get().headers, data=auth.get().payload) logger.debug('Response from request: ' + str(response.text)) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 200: logger.info('Managed object exists in C8Y') json_data = json.loads(response.text) internalID = json_data['managedObject']['id'] logger.info("The interalID for " + str(externalID) + " is " + str(internalID)) logger.debug('Returning the internalID') return internalID else: logger.warning('Response from request: ' + str(response.text)) logger.warning('Got response with status_code: ' + str(response.status_code)) return False except Exception as e: logger.error('The following error occured: %s' % (str(e))) return False
def main(): try: logger.debug( 'Setting prefix within MQTT broker for machine from config file') logger.debug( 'Initialising MQTT client with loaded credentials for listener') logger.info(utils.settings.basics()['deviceID']) client = mqtt.Client(client_id=utils.settings.basics()['deviceID']) logger.info('MQTT client with loaded credentials was initialised') client.username_pw_set(username=auth.get().MqttUser, password=auth.get().MqttPwd) logger.info('Listening for callback on s/ds') client.message_callback_add('s/ds', on_message_msgs) client.message_callback_add('s/dc/c8y_ThinEdge', on_message_msgs) logger.info('Connecting to MQTT Broker') client.connect(auth.get().tenant, 1883, 60) topics = [("s/ds", 0), ("s/dc/c8y_ThinEdge", 0)] client.subscribe(topics) logger.info('Start Loop forever and listening') client.loop_forever() except Exception as e: logger.error('The following error occured: ' + str(e)) client.stop_loop() logger.warning('Loop forever stopped, disconnecting') client.disconnect() logger.debug('disconnected')
def createExternalID(deviceID, internalID, type): logger.info('Create an external id for an existing managed object') try: url = "https://%s/identity/globalIds/%s/externalIds" % ( auth.get().tenant, internalID) payload = "{\n\t\"externalId\": \"%s\",\n \"type\": \"%s\"\n}" % ( deviceID, type) response = requests.request("POST", url, headers=auth.get().headers, data=payload) logger.debug('Response from request: ' + str(response.text)) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 200 or response.status_code == 201: logger.info('Serial nummer entered') logger.debug('Receiving the following response %s' % (str(response.text))) return True else: logger.warning('Response from request: ' + str(response.text)) logger.warning('Got response with status_code: ' + str(response.status_code)) return False except Exception as e: logger.error('The following error occured: %s' % (str(e)))
def createEdgeDevice(externalID): try: logger.info('Checking for managed object in c8y with external ID %s' + externalID) url = "https://%s/inventory/managedObjects"%(auth.get().tenant) with open('./config/device.txt') as f: payload = f.read() payload = json.loads(payload) payload['name'] = "Gateway_%s"%(externalID) response = requests.request("POST", url, headers=auth.get().headers, data = json.dumps(payload)) logger.debug('Requesting the following url: ' + str(url)) logger.debug('Response from request: ' + str(response.text)) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 200 or 201: logger.info('Device created') json_data = json.loads(response.text) API.identity.createExternalID(utils.settings.basics()[ 'deviceID'], json_data['id'], "c8y_Serial") logger.debug('Returning the managed Object') return True else: logger.warning('Response from request: ' + str(response.text)) logger.warning('Got response with status_code: ' + str(response.status_code)) return False except Exception as e: logger.error('The following error occured: %s' % (str(e)))
def createSmartRestTemplate(): try: url = "https://%s/inventory/managedObjects" % (auth.get().tenant) with open('./config/smartRestTemplate.json') as f: payload = f.read() payload = json.loads(payload) response = requests.request("POST", url, headers=auth.get().headers, data=json.dumps(payload)) logger.debug('Requesting the following url: ' + str(url)) logger.debug('Response from request: ' + str(response.text)) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 200 or response.status_code == 201: logger.info('Device created') json_data = json.loads(response.text) API.identity.createExternalID("c8y_ThinEdge", json_data['id'], "c8y_SmartRest2DeviceIdentifier") logger.debug('Returning the managed Object') return True else: logger.warning('Response from request: ' + str(response.text)) logger.warning('Got response with status_code: ' + str(response.status_code)) return False except Exception as e: logger.error('The following error occured: %s' % (str(e)))
def getExternalID(internalID): logger.info( 'Checking against indentity service what are the externalID´s for the device ID in C8Y' ) url = "https://%s/identity/globalIds/%s/externalIds" % (auth.get().tenant, internalID) response = requests.request("GET", url, headers=auth.get().headers, data=auth.get().payload) logger.debug('Response from request: ' + str(response.text)) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 200: json_data = json.loads(response.text) if json_data['externalIds']: logger.info('Managed object exists in C8Y') externalID = {} for i in json_data: externalID[json_data['externalIds'][i]['type']] = json_data[ 'externalIds'][i]['externalId'] logger.info("The externalID´s for " + str(internalID) + "are " + str(externalID)) logger.debug('Returning the externalID') return externalID else: logger.warning('Managed object does not exist in C8Y') else: logger.error('Receiving following status code %s' % (str(response.status_code))) raise Exception
def getPendingOperations(internalID): try: url = "https://%s/devicecontrol/operations?status=PENDING&deviceId=%s" % ( auth.get().tenant, internalID) response = requests.request("GET", url, headers=auth.get().headers, data=auth.get().payload) logger.info('Response from request: ' + str(response.text)) logger.info('Response from request with code : ' + str(response.status_code)) if response.status_code == 200: logger.info('Valid request') json_data = json.loads(response.text) logger.debug('Json response: %s' % (str(json_data))) logger.info('Checking if operations is not empty') if not json_data['operations']: logger.debug('Operations is empty, returns False') return False logger.info('Operation is not empty') logger.debug('Looping through operations') for operation in json_data['operations']: logger.debug('Current item: %s' % (str(operation))) operationsHandlerThread = threading.Thread( target=deviceControl.operationsHandler.start, kwargs=dict(internalID=auth.get().internalID, operation=operation), daemon=True) operationsHandlerThread.start() else: logger.warning('Got response with status_code: ' + str(response.status_code)) return False except Exception as e: logger.error('The following error occured: %s' % (str(e)))
def setOperationMode(operationID, status, text=''): try: mode = status url = "https://%s/devicecontrol/operations/%s" % (auth.get().tenant, operationID) if mode == 'EXECUTING' or 'SUCCESSFUL' or 'FAILED': logger.info('Operation ' + str(mode)) data = {} data['status'] = str(status) if mode == 'FAILED': data['failureReason'] = str(text) response = requests.request("PUT", url, headers=auth.get().headers, data=json.dumps(data)) else: logger.error('Mode not known') return False logger.info('Response from request with code : ' + str(response.status_code)) if response.status_code == 200: logger.info('Operation successfully set to Executing') return True else: logger.error('Operation not successfully set to Executing') return False except Exception as e: logger.error('The following error occured: %s' % (str(e)))
def updateManageObject(internalID, payload): logger.info('Update of managed Object') url = "https://%s/inventory/managedObjects/%s"%(auth.get().tenant, internalID) response = requests.request("PUT", url, headers=auth.get().headers, data = payload) logger.debug('Response from request: ' + str(response.text)) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 200: logger.info('Managed object updated in C8Y') return True else: logger.warning('Managed object not updated in C8Y') raise Exception
def getSpezificManagedObject(internalID): logger.info('Checking for managed object in c8y') url = "https://%s/inventory/managedObjects/%s"%(auth.get().tenant, internalID) logger.debug('Requesting the following url: ' + str(url)) response = requests.request("GET", url, headers=auth.get().headers, data = auth.get().payload) logger.debug('Response from request: ' + str(response.text)) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 200: logger.info('Managed object exists in C8Y') json_data = json.loads(response.text) return json_data else: logger.error('Receiving following status code %s'%(str(response.status_code))) raise Exception
def updateManageObject(internalID, payload): logger.info('Update of managed Object') try: url = "https://%s/inventory/managedObjects/%s"%(auth.get().tenant, internalID) response = requests.request("PUT", url, headers=auth.get().headers, data = payload) logger.debug('Response from request: ' + str(response.text)) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 200 or response.status_code == 201: logger.info('Managed object updated in C8Y') return True else: logger.warning('Managed object not updated in C8Y') return False except Exception as e: logger.error('The following error occured: %s' % (str(e)))
def checkSmartRestTemplateExists(): try: logger.info('Checking against indentity service') url = "https://%s/identity/externalIds/c8y_SmartRest2DeviceIdentifier/c8y_ThinEdge" % ( auth.get().tenant) response = requests.request("GET", url, headers=auth.get().headers) logger.debug('Response from request: ' + str(response.text)) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 404: logger.info('SmartRule does not exist in C8Y') createSmartRestTemplate() else: logger.debug('Skippung because SmartRest Template exist') except Exception as e: logger.error('The following error occured: %s' % (str(e)))
def event(topic, payload): message = {} message['type'] = "c8y_PLC_Data" message['source'] = {"id": str(auth.get().internalID)} message['time'] = datetime.datetime.strptime( str(datetime.datetime.utcnow()), '%Y-%m-%d %H:%M:%S.%f').isoformat() + "Z" try: print(payload) list = payload.decode('utf-8').replace("\"", "").split(',') print(list) if "Schichtdickensensor" in topic: series = {} series["Qualitaet"] = {"value": float(list[0])} series["Schichtdicke"] = {"value": float(list[1])} series["Inkrementalgeber"] = {"value": float(list[2])} message[str(topic)] = series logger.info(json.dumps(message)) API.measurement.createMeasurement(json.dumps(message)) elif "Laserscanner" in topic: series = {} measurement = {} series["Drahtseite kurz"] = {"value": list[0]} series["Drahtseite lang"] = {"value": list[1]} series["Drahtposition 1"] = {"value": list[2]} series["Drahtposition 2"] = {"value": list[3]} series["Inkrementalgeber"] = {"value": list[4]} measurement[str(topic)] = series API.measurement.createMeasurement(json.dumps(message)) else: raise ValueError except ValueError as e: return logger.error('Not valid json or valid structure') except Exception as e: logger.error('The following error occured: ' + str(e))
def createMeasurement(payload): logger.info('Creating measurements in c8y') try: url = "https://%s/measurement/measurements"%(auth.get().tenant) response = requests.request("POST", url, headers=auth.get().headers, data = payload) logger.debug('Sending data to the following url: ' + str(url)) logger.debug('Response from request: ' + str(response.text)) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 200 or 201: logger.info('Measurment send') return True else: logger.warning('Response from request: ' + str(response.text)) logger.warning('Got response with status_code: ' + str(response.status_code)) except Exception as e: logger.error('The following error occured: %s' % (str(e)))
def triggerPendingOPerations(): try: threadEvent = threading.Thread( target=API.operations.getPendingOperations, kwargs=dict(internalID=str(auth.get().internalID)), daemon=True) threadEvent.start() except Exception as e: logger.error('The following error occured: ' + str(e))
def createMeasurement(payload): logger.debug('Creating measurements in c8y') url = "https://%s/measurement/measurements" % (auth.get().tenant) response = requests.request("POST", url, headers=auth.get().headers, data=payload) logger.debug('Sending data to the following url: ' + str(url)) logger.debug('Response from request: ' + str(response.text)) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 200 or 201: logger.debug('Measurment send') return True else: logger.error('Receiving following status code %s' % (str(response.status_code))) raise Exception
def getEventsFromManagedObject(internalID, pageSize=2500, days=0, currentPage=1): logger.info('Checking for events of managed object in c8y') try: if days != 0: dateFrom = date.today() dateTo = date.today() - timedelta(days) url = "https://%s/event/events?pageSize=%s&source=%s&dateFrom=%s&dateTo=%s¤tPage=%s&withTotalPages=True" % ( auth.get().tenant, pageSize, internalID, dateFrom, dateTo, currentPage, ) else: url = "https://%s/event/events?pageSize=%s&source=%s¤tPage=%s&withTotalPages=True" % ( auth.get().tenant, pageSize, internalID, currentPage, ) logger.debug('Requesting the following url: ' + str(url)) response = requests.request("GET", url, headers=auth.get().headers, data=auth.get().payload) logger.debug('Response from request: ' + str(response.text)) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 200: logger.info('Received events') json_data = json.loads(response.text) logger.debug('Receiving the following response %s' % (str(response.text))) return json_data else: logger.warning('Response from request: ' + str(response.text)) logger.warning('Got response with status_code: ' + str(response.status_code)) except Exception as e: logger.error('The following error occured: %s' % (str(e)))
def start(operation, operationID): try: API.operations.setOperationMode(operationID, 'EXECUTING') configEvent = {} configEvent['c8y_Configuration'] = operation['c8y_Configuration'] logger.debug('Created the following config: %s' % (str(configEvent))) API.inventory.updateManageObject(auth.get().internalID, json.dumps(configEvent)) except Exception as e: logger.error('The following error occured: %s' % (str(e)))
def getEvents(pageSize=2500, days=0, currentPage=1): logger.info('Checking for events in c8y') if days != 0: dateFrom = date.today() dateTo = date.today() - timedelta(days) url = "https://%s/event/events?pageSize=%s&dateFrom=%s&dateTo=%s¤tPage=%s&withTotalPages=True"%(auth.get().tenant, pageSize, dateFrom, dateTo, currentPage, ) else: url = "https://%s/event/events?pageSize=%s¤tPage=%s&withTotalPages=True"%(auth.get().tenant, pageSize, currentPage, ) logger.debug('Requesting the following url: ' + str(url)) response = requests.request("GET", url, headers=auth.get().headers, data = auth.get().payload) logger.debug('Response from request: ' + str(response.text)) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 200: logger.info('Received events') json_data = json.loads(response.text) return json_data else: logger.error('Receiving following status code %s'%(str(response.status_code))) raise Exception
def setOperationMode(operationID, status): mode = status url = "https://%s/devicecontrol/operations/%s" % (auth.get().tenant, operationID) if mode == 'EXECUTING' or 'SUCCESSFUL' or 'FAILED': logger.info('Operation ' + str(mode)) response = requests.request("PUT", url, headers=auth.get().headers, data='''{ "status": "''' + str(status) + '''"}''') else: logger.error('Mode not known') raise Exception logger.info('Response from request with code : ' + str(response.status_code)) if response.status_code == 200: logger.info('Operation successfully set to Executing') return True else: logger.error('Operation not successfully set to Executing') raise Exception
def createExternalID(deviceID, internalID): logger.info('Create an external id for an existing managed object') url = "https://%s/identity/globalIds/%s/externalIds" % (auth.get().tenant, internalID) payload = "{\n\t\"externalId\": \"%s\",\n \"type\": \"c8y_Serial\"\n}" % ( deviceID) response = requests.request("POST", url, headers=auth.get().headers, data=payload) logger.debug('Response from request: ' + str(response.text)) logger.debug('Response from request with code : ' + str(response.status_code)) if response.status_code == 200: logger.info('Serial nummer entered') json_data = json.loads(response.text) logger.debug('Receiving the following response %s' % (str(response.text))) return True else: logger.error('Receiving following status code %s' % (str(response.status_code))) return False
def device(): device = {} try: managedDeviceObject = API.inventory.getSpezificManagedObject( auth.get().internalID)['c8y_Configuration']['config'].replace( '\n', '').split(';') for counter, value in enumerate(managedDeviceObject): if len(value) > 0: device[str(value.split('=')[0])] = value.split('=')[1] else: pass return device except Exception as e: logger.error('The following error occured: %s' % (str(e))) return device
def getCPUStats(): payload = {} try: payload['source'] = {"id": str(auth.get().internalID)} payload['type'] = "c8y_ThinEdge_Device_Stats" payload['time'] = datetime.datetime.strptime( str(datetime.datetime.utcnow()), '%Y-%m-%d %H:%M:%S.%f').isoformat() + "Z" cpu = {} cpu['load'] = {'value': psutil.cpu_percent(0)} payload['CPU'] = cpu return payload except Exception as e: logger.error('The following error occured: %s' % (str(e))) return payload
def start(): logger.info('Checking for credentials') if not path.exists('./config/credentials.key'): logger.info('No credentials found, starting registration') deviceRegistration.registrationProcess.start() logger.info('Credentials available') logger.info('Starting checking of existing device') if API.identity.getInternalID( utils.settings.basics()['deviceID']) is False: logger.info('No device found in c8y, starting edge device creation.') deviceRegistration.newDeviceRegistration.createEdgeDevice( utils.settings.basics()['deviceID']) auth.get().internalID = API.identity.getInternalID( utils.settings.basics()['deviceID']) utils.settings.device() deviceControl.smartRest.checkSmartRestTemplateExists() logger.info('Finishing start sequency')
def getDiskStats(): payload = {} try: payload['source'] = {"id": str(auth.get().internalID)} payload['type'] = "c8y_ThinEdge_Device_Stats" payload['time'] = datetime.datetime.strptime( str(datetime.datetime.utcnow()), '%Y-%m-%d %H:%M:%S.%f').isoformat() + "Z" disk = {} disk['total'] = {'value': psutil.disk_usage('/').total} disk['used'] = {'value': psutil.disk_usage('/').used} disk['free'] = {'value': psutil.disk_usage('/').free} disk['percent'] = {'value': psutil.disk_usage('/').percent} payload['Disk'] = disk return payload except Exception as e: logger.error('The following error occured: %s' % (str(e))) return payload
def getMemoryStats(): payload = {} try: payload['source'] = {"id": str(auth.get().internalID)} payload['type'] = "c8y_ThinEdge_Device_Stats" payload['time'] = datetime.datetime.strptime( str(datetime.datetime.utcnow()), '%Y-%m-%d %H:%M:%S.%f').isoformat() + "Z" memory = {} memory['free'] = {"value": psutil.virtual_memory().free} memory['used'] = {"value": psutil.virtual_memory().used} memory['total'] = {"value": psutil.virtual_memory().total} memory['percent'] = {"value": psutil.virtual_memory().percent} payload['Virtual Memory'] = memory return payload except Exception as e: logger.error('The following error occured: %s' % (str(e))) return payload
def operationClassification(operation, operationID): try: if 'c8y_Restart' in str(operation): logger.info('Found c8y_Restart operation') time.sleep(randint(0,2)) API.operations.setOperationMode(operationID, 'EXECUTING') time.sleep(randint(0,5)) choice=random.choice(['SUCCESSFUL','FAILED']) API.operations.setOperationMode(operationID, choice) elif 'c8y_Configuration' in str(operation): logger.info('Found c8y_Configuration operation') try: deviceControl.configurationUpdate.start(operation, operationID) API.operations.setOperationMode(operationID, 'SUCCESSFUL') except Exception as e: logger.error('The following error occured: %s'%(str(e))) API.operations.setOperationMode(operationID, 'FAILED') elif 'c8y_Software' in str(operation): logger.info('Found c8y_Software operation') time.sleep(randint(0,2)) API.operations.setOperationMode(operationID, 'EXECUTING') time.sleep(randint(0,5)) choice=random.choice(['SUCCESSFUL','FAILED']) logger.debug('Choice is %s'%(str(choice))) API.operations.setOperationMode(operationID, choice) elif 'c8y_Firmware' in str(operation): logger.info('Found c8y_Firmware operation') time.sleep(randint(0,2)) API.operations.setOperationMode(operationID, 'EXECUTING') time.sleep(randint(0,5)) choice=random.choice(['SUCCESSFUL','FAILED']) logger.debug('Choice is %s'%(str(choice))) API.operations.setOperationMode(operationID, choice) elif 'c8y_Command' in str(operation): logger.info('Found c8y_Command operation') API.operations.setOperationMode(operationID, 'EXECUTING') time.sleep(randint(0,5)) choice=random.choice(['SUCCESSFUL','FAILED']) API.operations.setOperationMode(operationID, choice) elif 'c8y_RemoteAccessConnect' in str(operation): logger.info('Found c8y_RemoteAccessConnect operation') API.operations.setOperationMode(operationID, 'EXECUTING') connect = operation['c8y_RemoteAccessConnect'] device_proxy = DeviceProxy(connect['hostname'], connect['port'], None, connect['connectionKey'], auth.get().tenantInstance, auth.get().tenantID, utils.settings.credentials()['c8yUser'],utils.settings.credentials()['c8yPassword'], None) try: device_proxy.connect() API.operations.setOperationMode(operationID, 'SUCCESSFUL') except Exception as e: logger.error('The following error occured: %s'%(str(e))) API.operations.setOperationMode(operationID, 'FAILED') else: logger.warning('Unknown operation type') except Exception as e: logger.error('The following error occured: ' + str(e))
def start(): auth.get().internalID = API.identity.getInternalID(utils.settings.basics()['deviceID']) logger.info('Finishing start sequency')