def update_device_bunch(device_data=None): valid_auth_code() data = device_data or get_post_json_data() bunch = data.get("bunch") sn = data.get("sn") if sn is None: throw(_("Request fields not found. fields: sn")) dev = IOTDevice.get_device_doc(sn) if not dev: throw(_("Device is not found. SN:{0}").format(sn)) if bunch == "": bunch = None if IOTHDBSettings.is_default_bunch_enabled() and not bunch: bunch = IOTHDBSettings.get_default_bunch() if dev.bunch == bunch: return __generate_hdb(dev) if not frappe.get_value("IOT Device Bunch", bunch, "name"): throw(_("Device Bunch Code {0} is not valid!").format(bunch)) org_bunch = dev.bunch dev.update_bunch(bunch) frappe.enqueue('iot.hdb_api.on_device_bunch_update', device=dev, org_bunch=org_bunch) return __generate_hdb(dev)
def valid_auth_code(auth_code=None): auth_code = auth_code or frappe.get_request_header("HDB-AuthorizationCode") if not auth_code: throw(_("HDB-AuthorizationCode is required in HTTP Header!")) frappe.logger(__name__).debug( _("HDB-AuthorizationCode as {0}").format(auth_code)) code = IOTHDBSettings.get_authorization_code() if auth_code != code: throw(_("Authorization Code is incorrect!")) #frappe.session.user = IOTHDBSettings.get_on_behalf() form_dict = frappe.local.form_dict frappe.set_user(IOTHDBSettings.get_on_behalf()) frappe.local.form_dict = form_dict
def iot_device_data(sn=None, vsn=None): sn = sn or frappe.form_dict.get('sn') vsn = vsn or sn doc = frappe.get_doc('IOT Device', sn) doc.has_permission("read") if vsn != sn: if vsn not in iot_device_tree(sn): return "" cfg = iot_device_cfg(sn, vsn) if not cfg: return "" client = redis.Redis.from_url(IOTHDBSettings.get_redis_server() + "/2") hs = client.hgetall(vsn) data = {} if cfg.has_key("nodes"): nodes = cfg.get("nodes") for node in nodes: tags = node.get("tags") for tag in tags: name = node.get("name")+"."+tag.get('name') data[name] = {"PV": hs.get(name + ".PV"), "TM": hs.get(name + ".TM"), "Q": hs.get(name + ".Q"), "DESC": tag.get("desc"), } if cfg.has_key("tags"): tags = cfg.get("tags") for tag in tags: name = tag.get('name') data[name] = {"PV": hs.get(name + ".PV"), "TM": hs.get(name + ".TM"), "Q": hs.get(name + ".Q"), "DESC": tag.get("desc"), } return data
def iot_device_his_data(sn=None, vsn=None, fields=None, condition=None): vsn = vsn or sn fields = fields or "*" doc = frappe.get_doc('IOT Device', sn) doc.has_permission("read") if vsn != sn: if vsn not in iot_device_tree(sn): return 401 inf_server = IOTHDBSettings.get_influxdb_server() if not inf_server: frappe.logger(__name__).error("InfluxDB Configuration missing in IOTHDBSettings") return 500 query = 'SELECT ' + fields + ' FROM "' + vsn + '"' if condition: query = query + " WHERE " + condition else: query = query + " LIMIT 1000" domain = frappe.get_value("Cloud Company", doc.company, "domain") r = requests.session().get(inf_server + "/query", params={"q": query, "db": domain}, timeout=10) if r.status_code == 200: return r.json()["results"] or r.json() return r.text
def add_device(device_data=None): valid_auth_code() device = device_data or get_post_json_data() sn = device.get("sn") if not sn: throw(_("Request fields not found. fields: sn")) if IOTDevice.check_sn_exists(sn): # TODO: Check for bunch code when device is existing. return IOTDevice.get_device_doc(sn) device.update({"doctype": "IOT Device"}) doc = frappe.get_doc(device).insert().as_dict() url = IOTHDBSettings.get_callback_url() if url: """ Fire callback data """ user_list = IOTDevice.find_owners_by_bunch(device.get("bunch")) frappe.enqueue('iot.hdb_api.fire_callback', cb_url=url + "/api/datachanged", cb_data={ 'cmd': 'add_device', 'sn': sn, 'users': user_list }) return doc
def iot_device_data_array(sn=None, vsn=None): sn = sn or frappe.form_dict.get('sn') vsn = vsn or sn doc = frappe.get_doc('IOT Device', sn) doc.has_permission("read") if vsn != sn: if vsn not in iot_device_tree(sn): return "" cfg = iot_device_cfg(sn, vsn) if not cfg: return "" client = redis.Redis.from_url(IOTHDBSettings.get_redis_server() + "/2") hs = client.hgetall(vsn) data = [] if cfg.has_key("nodes"): nodes = cfg.get("nodes") for node in nodes: tags = node.get("tags") for tag in tags: name = tag.get('name') tt = hs.get(name + ".TM") timestr = '' if tt: timestr = str( convert_utc_to_user_timezone( datetime.datetime.utcfromtimestamp( int(int(tt) / 1000))).replace(tzinfo=None)) data.append({ "NAME": name, "PV": hs.get(name + ".PV"), # "TM": hs.get(name + ".TM"), "TM": timestr, "Q": hs.get(name + ".Q"), "DESC": tag.get("desc"), }) if cfg.has_key("tags"): tags = cfg.get("tags") for tag in tags: name = tag.get('name') tt = hs.get(name + ".TM") timestr = '' if tt: timestr = str( convert_utc_to_user_timezone( datetime.datetime.utcfromtimestamp(int( int(tt) / 1000))).replace(tzinfo=None)) data.append({ "NAME": name, "PV": hs.get(name + ".PV"), # "TM": hs.get(name + ".TM"), "TM": timestr, "Q": hs.get(name + ".Q"), "DESC": tag.get("desc"), }) return data
def iot_device_cfg(sn=None): sn = sn or frappe.form_dict.get('sn') doc = frappe.get_doc('IOT Device', sn) doc.has_permission("read") session = requests.session() url = IOTHDBSettings.get_data_url() + "/rtdb/boxcfg" params = {"sn": doc.sn} r = session.get(url, params=params) if r: return r.json()
def iot_device_data_hdb(sn=None): # valid_auth_code() sn = sn or frappe.form_dict.get('sn') doc = frappe.get_doc('IOT Device', sn) session = requests.session() url = IOTHDBSettings.get_data_url() + "/rtdb/boxdata" params = {"sn": doc.sn} r = session.get(url, params=params) if r: return r.json()
def add_device(device_data=None): valid_auth_code() device = device_data or get_post_json_data() sn = device.get("sn") if IOTHDBSettings.is_default_bunch_enabled() and not device.get("bunch"): device["bunch"] = IOTHDBSettings.get_default_bunch() if not sn: throw(_("Request fields not found. fields: sn")) if IOTDevice.check_sn_exists(sn): return IOTDevice.get_device_doc(sn) device.update({"doctype": "IOT Device"}) bunch = device.get("bunch") if not frappe.get_value("IOT Device Bunch", bunch, "name"): throw(_("Device Bunch Code {0} is not valid!").format(bunch)) dev = frappe.get_doc(device).insert() frappe.enqueue('iot.hdb_api.on_device_bunch_update', device=dev) return __generate_hdb(dev)
def iot_device_write(): ctrl = _dict(get_post_json_data()) doc = frappe.get_doc('IOT Device', ctrl.sn) doc.has_permission("read") cmd = { "sn": ctrl.vsn, "tag": ctrl.tag, "nrsp": ctrl.nrsp, "vt": ctrl.vt, "val": ctrl.val, "pris": ctrl.pris or uuid.uuid1() } client = redis.Redis.from_url(IOTHDBSettings.get_redis_server()) r = client.publish("ziotagwrites", json.dumps({"cmds": [cmd], "ver": 0})) return {"result": r, "uuid": cmd["pris"]}
def taghisdata(sn=None, vsn=None, fields=None, condition=None): vsn = vsn or sn fields = fields or "*" doc = frappe.get_doc('IOT Device', sn) doc.has_permission("read") inf_server = IOTHDBSettings.get_influxdb_server() if not inf_server: frappe.logger(__name__).error("InfluxDB Configuration missing in IOTHDBSettings") return 500 query = 'SELECT ' + fields + ' FROM "' + vsn + '"' if condition: query = query + " WHERE " + condition else: query = query + " LIMIT 1000" domain = frappe.get_value("Cloud Company", doc.company, "domain") r = requests.session().get(inf_server + "/query", params={"q": query, "db": domain}, timeout=10) if r.status_code == 200: try: res = r.json()["results"][0]['series'][0]['values'] taghis = [] for i in range(0, len(res)): hisvalue = {} #print('*********', res[i][0]) try: utc_time = datetime.datetime.strptime(res[i][0], UTC_FORMAT1) except Exception as err: pass try: utc_time = datetime.datetime.strptime(res[i][0], UTC_FORMAT2) except Exception as err: pass #local_time = utc2local(utc_time).strftime("%Y-%m-%d %H:%M:%S") local_time = str(convert_utc_to_user_timezone(utc_time).replace(tzinfo=None)) #print('#######', local_time) if res[i][2] == '1': hisvalue = {'name': res[i][1], 'value': res[i][4], 'time': local_time, 'quality': 0} elif res[i][2] == '2': hisvalue = {'name': res[i][1], 'value': res[i][3], 'time': local_time, 'quality': 0} taghis.append(hisvalue) #print(taghis) return taghis except Exception as err: return r.json()
def iot_device_ctrl(ctrl=None): ctrl = ctrl or get_post_json_data() cmds = [] for cmd in ctrl: doc = frappe.get_doc('IOT Device', cmd.sn) doc.has_permission("write") cmds.append({ "boxname": doc.dev_name, "boxsn": cmd.sn, "ctrl": cmd.ctrl, "tag": cmd.tag, "uflg": cmd.uflg, "val": cmd.val, "vt": cmd.vt }) url = IOTHDBSettings.get_data_url() + "/iocmd" session = requests.session() r = session.post(url, json={"cmds": cmds}) if r: return r.json()
def update_device_bunch(device_data=None): valid_auth_code() data = device_data or get_post_json_data() bunch = data.get("bunch") sn = data.get("sn") if sn is None: throw(_("Request fields not found. fields: sn")) dev = IOTDevice.get_device_doc(sn) if not dev: throw(_("Device is not found. SN:{0}").format(sn)) if bunch == "": bunch = None if dev.bunch == bunch: return dev org_bunch = dev.bunch dev.update_bunch(bunch) url = IOTHDBSettings.get_callback_url() if url: """ Fire callback data """ org_user_list = IOTDevice.find_owners_by_bunch(org_bunch) user_list = IOTDevice.find_owners_by_bunch(bunch) frappe.enqueue('iot.hdb_api.fire_callback', cb_url=url + "/api/datachanged", cb_data={ 'cmd': 'update_device', 'sn': sn, 'add_users': user_list, 'del_users': org_user_list }) return dev
def iot_device_cfg(sn=None, vsn=None): sn = sn or frappe.form_dict.get('sn') doc = frappe.get_doc('IOT Device', sn) doc.has_permission("read") client = redis.Redis.from_url(IOTHDBSettings.get_redis_server() + "/0") return json.loads(client.get(vsn or sn) or "")
def iot_device_tree(sn=None): sn = sn or frappe.form_dict.get('sn') doc = frappe.get_doc('IOT Device', sn) doc.has_permission("read") client = redis.Redis.from_url(IOTHDBSettings.get_redis_server() + "/1") return client.lrange(sn, 0, -1)