Python
You can download the following code examples cloud-examples-python.zip and import them to your development IDE.
Make sure to set your username and password as well as the appropriate proxy and the desired Bosch IoT Insights project before running the applications.
For the basic authentication, use the credentials of the API user. To create an API user, refer to Creating an API user or Creating an API user via API.
We recommend you to use preemptive authentication. That way, the basic authentication request is sent before the server returns an unauthorized response. Also refer to the Apache documentation.
Sending simple data
The following Python code example shows you how to send simple data like a string to the HTTP Data Recorder Service of the Bosch IoT Insights backend using Python code.
import base64from urllib.request import Request, ProxyHandler, build_openerINSIGHTS_USERNAME = '<username>'INSIGHTS_PASSWORD = '<password>'PROXIES = {'http': 'http://<username>:<password>@rb-proxy-de.bosch.com:8080', 'https': 'https://<username>:<password>@rb-proxy-de.bosch.com:8080'} # If you are inside your company network, a proxy authentication may be required. Otherwise, you can remove this from the example. This is an example for a Bosch internal proxy.insightsProject = 'demo'def basics_auth(username, password): """ Method which return a base 64 basic authentication :param username: your INSIGHTS username :param password: your password username :return: returns string """ credential = username + ':' + password encoded_credential = credential.encode('ascii') b_encoded_credential = base64.b64encode(encoded_credential) b_encoded_credential = b_encoded_credential.decode('ascii') b_auth = b_encoded_credential return 'Basic %s' % b_authdef make_request(server_url, post_data=None): """ Method which handel a request and return response as json :param server_url: the url for the request :param post_data: post data for Post method :return: content """ proxy = ProxyHandler(PROXIES) opener = build_opener(proxy) r = Request(server_url + insightsProject) insights_b_auth = basics_auth(INSIGHTS_USERNAME, INSIGHTS_PASSWORD) r.add_header('Authorization', insights_b_auth) r.add_header('Content-Type', 'application/json') r.add_header('Accept', 'application/json') r_data = post_data r.data = r_data handle = opener.open(r) content = handle.read().decode('utf8') return contentdef main(): try: # Server and the api service details server = 'https://bosch-iot-insights.com' serviceBaseUrl = '/data-recorder-service/' service = 'v2/' payload = "{Python:'Hello World'}" url = server + serviceBaseUrl + service # construction of the final url for the first POST request data = payload.encode("ascii") # encoding format is ascii for the initial POST request res = make_request(url, data) print(res) print('Data was send to Project:' + insightsProject) except IOError as e: print("Problem with the request..") print(e) print(e.read())if __name__ == '__main__': main()Sending a file
The following code example shows you how to send the content of a file to the HTTP Data Recorder Service of the Bosch IoT Insights backend using Python code.
import base64import requests# TODO: Please specify your technical user account (not SingleKey ID / CIAM)INSIGHTS_USERNAME = 'technicalUserName'INSIGHTS_PASSWORD = 'technicalUserPW'# TODO: Please specific your project id (Hint: can be taken from the url)insightsProject = 'youProjectName'# Server and the api service detailsserver = 'https://bosch-iot-insights.com'serviceBaseUrl = '/data-recorder-service/'service = 'v2/'def basics_auth(username, password): """ Method which return a base 64 basic authentication :param username: your IoT Insights username :param password: your IoT Insights password username :return: returns string """ credential = username + ':' + password encoded_credential = credential.encode('ascii') b_encoded_credential = base64.b64encode(encoded_credential) b_encoded_credential = b_encoded_credential.decode('ascii') b_auth = b_encoded_credential return 'Basic %s' % b_authdef make_request(file, metaData): b_cred = basics_auth(INSIGHTS_USERNAME, INSIGHTS_PASSWORD) url = server + serviceBaseUrl + service + insightsProject headers = {'Authorization': b_cred, 'X-Metadata': metaData} r = requests.post(url, headers=headers, files=file) return r.textdef main(): try: #Specify the path to the file that should be uploaded file = {'file': open('C:\\Path\\To\\Your\\File.txt', 'rb')} #Add your metaData parameters here as comma separated list of key-value pairs #This will be seen and useable in the input history of IoT Insights metaData = 'key=value' res = make_request(file, metaData) print(res) print('Data was send to Project:' + insightsProject) except IOError as e: print("Problem with the request..") print(e) print(e.read())if __name__ == '__main__': main()Synchronous query execution
This code example shows you how to execute a MongoDB aggregation query against a demo collection.
import base64import jsonfrom urllib.request import Request, ProxyHandler, build_openerINSIGHTS_USERNAME = '<username>'INSIGHTS_PASSWORD = '<password>'PROXIES = {'http': 'http://<username>:<password>@rb-proxy-de.bosch.com:8080', 'https': 'https://<username>:<password>@rb-proxy-de.bosch.com:8080'} # If you are inside your company network, a proxy authentication may be required. Otherwise, you can remove this from the example. This is an example for a Bosch internal proxy.insightsProject = 'demo'def basics_auth(username, password): """ Method which return a base 64 basic authentication :param username: your INSIGHTS username :param password: your password username :return: returns string """ credential = username + ':' + password encoded_credential = credential.encode('ascii') b_encoded_credential = base64.b64encode(encoded_credential) b_encoded_credential = b_encoded_credential.decode('ascii') b_auth = b_encoded_credential return 'Basic %s' % b_authdef make_request(server_url, method, post_data=None): """ Method which handel a request and return response as json :param server_url: the url for the request :param method: GET or POST method :param post_data: post data for Post method :return: returns json """ proxy = ProxyHandler(PROXIES) opener = build_opener(proxy) r = Request(server_url) insights_b_auth = basics_auth(INSIGHTS_USERNAME, INSIGHTS_PASSWORD) r.add_header('Authorization', insights_b_auth) r.add_header('Content-Type', 'application/json') r.add_header('Accept', 'application/json') r_data = post_data r.data = r_data handle = opener.open(r) content = handle.read().decode('utf8') response = json.loads(content) return responsedef main(): try: # Server and the api service details server = 'https://bosch-iot-insights.com' serviceBaseUrl = '/mongodb-query-service/v2/' + insightsProject service = '/execute-aggregation-query' query = ''' { "collection": "demo_processed_data", "query": [ {"$limit":1} ] } ''' url = server + serviceBaseUrl + service # construction of the final url for the first POST request data = query.encode("ascii") # encoding format is ascii for the initial POST request res = make_request(url, 'POST', data) print(res) except IOError as e: print("Problem with the request..") print(e)if __name__ == '__main__': main()Asynchronous query execution
The following code example shows you how to send an asynchronous MongoDB aggregation query and receive the result in Excel-sheet with Visual Basic.
Make sure to set your authorization credentials and if necessary the appropriate proxy settings.
import base64import csvimport jsonimport timefrom urllib.request import Request, ProxyHandler, build_openerINSIGHTS_USERNAME = '<username>'INSIGHTS_PASSWORD = '<password>'PROXIES = {'http': 'http://<username>:<password>@rb-proxy-de.bosch.com:8080', 'https': 'https://<username>:<password>@rb-proxy-de.bosch.com:8080'} # If you are inside your company network, a proxy authentication may be required. Otherwise, you can remove this from the example. This is an example for a Bosch internal proxy.insightsProject = 'demo'def basics_auth(username, password): """ Method which return a base 64 basic authentication :param username: your INSIGHTS username :param password: your password username :return: returns string """ credential = username + ':' + password encoded_credential = credential.encode('ascii') b_encoded_credential = base64.b64encode(encoded_credential) b_encoded_credential = b_encoded_credential.decode('ascii') b_auth = b_encoded_credential return 'Basic %s' % b_authdef make_request(server_url, method, post_data=None): """ Method which handel a request and return response as json :param server_url: the url for the request :param method: GET or POST method :param post_data: post data for Post method :return: returns json """ proxy = ProxyHandler(PROXIES) opener = build_opener(proxy) r = Request(server_url) insights_b_auth = basics_auth(INSIGHTS_USERNAME, INSIGHTS_PASSWORD) r.add_header('Authorization', insights_b_auth) r.add_header('Content-Type', 'application/json') r.add_header('Accept', 'application/json') if method == 'POST': r_data = post_data r.data = r_data r.get_method = lambda: 'POST' handle = opener.open(r) content = handle.read().decode('utf8') response = json.loads(content) return response elif method == 'GET': r.get_method = lambda: 'GET' handle = opener.open(r) content = handle.read().decode('utf8') response = json.loads(content) return response else: print('Method %s is available' % method)def main(): try: # Server and the api service details server = 'https://bosch-iot-insights.com' serviceBaseUrl = '/mongodb-query-service/v2/' + insightsProject service = '/submit-aggregation-query' query = ''' { "collection": "demo_processed_data", "query": [ {"$limit":10} ] } ''' url = server + serviceBaseUrl + service # construction of the final url for the first POST request data = query.encode("ascii") # encoding format is ascii for the initial POST request res = make_request(url, 'POST', data) post_id = res['queryId'] # retreive the ID of the POST request print('post id', post_id) # Construct the GET request for POLLING the server using the POST ID get_url = server + serviceBaseUrl + "/queries" + "/" + post_id print("get_url: ", get_url) res_temp = make_request(get_url, 'GET') status_temp = res_temp['status'] print('current status', status_temp) # POLLING the server in this loop till the status of the GET request is SUCCESSFUL while True: print('Entered inside loop') res_temp = make_request(get_url, 'GET') status_temp = res_temp['status'] if status_temp == 'SUCCESSFUL': break print('current status - INSIDE LOOP', status_temp) time.sleep(2) # If the status is SUCCESSFUL, we retrieve the results using the POST ID in the json format if status_temp == 'SUCCESSFUL': get_url_result = server + serviceBaseUrl + "/queries" + "/" + post_id + \ "/result?format=application%2Fjson" print("get_url_result: ", get_url_result) res_final = make_request(get_url_result, 'GET') # writing the JSON response to CSV file with open("vin_ccu_brake_events.csv", "w", newline='') as file: output = csv.writer(file) output.writerow(res_final[0].keys()) # header row for row in res_final: output.writerow(row.values()) print("-----------------------------final response--------------------------------") print(res_final) else: print("Error in data processing on the server: ", status_temp) except IOError as e: print("Problem with the request..") print(e) print(e.read())if __name__ == '__main__': main()