Пример #1
0
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)
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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()
Пример #8
0
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()
Пример #9
0
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)
Пример #10
0
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"]}
Пример #11
0
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()
Пример #12
0
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()
Пример #13
0
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
Пример #14
0
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 "")
Пример #15
0
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)