Files
HP_InHand_IG502/Pub_Sub/gateway/thingsboard/sub/aa-gateway-attributes.py
2024-10-04 18:56:11 -05:00

98 lines
3.6 KiB
Python

import json, time
from datetime import datetime as dt
from quickfaas.measure import recall, write
from quickfaas.remotebus import publish
from common.Logger import logger
def chunk_payload(payload, chunk_size=20, is_attributes_payload=False):
if is_attributes_payload:
# For attributes payload, chunk the controllers
controllers = list(payload.items())
for i in range(0, len(controllers), chunk_size):
yield dict(controllers[i:i + chunk_size])
else:
# For data payload, chunk the values within each controller
for controller, data in payload.items():
for entry in data:
ts = entry['ts']
values = entry['values']
chunked_values = list(values.items())
for i in range(0, len(chunked_values), chunk_size):
yield {
controller:[
{
"ts": ts,
"values": dict(chunked_values[i:i + chunk_size])}
]
}
def sync():
#get new values and send
now = round(dt.timestamp(dt.now()))*1000
topic = "v1/gateway/telemetry"
try:
data = recall()#json.loads(recall().decode("utf-8"))
except Exception as e:
logger.error(e)
logger.debug(data)
logger.info("SYNCING")
grouped_data = {}
try:
for controller in data:
ctrlName = " ".join(controller['name'].split("_"))
for measure in controller["measures"]:
if ctrlName not in grouped_data:
grouped_data[ctrlName] = {}
if measure["health"]:
if measure["name"] == "alarm_enable_cmd":
gatewayPayload = {"ts": now, "values": {measure["name"]: measure["value"]}}
grouped_data[ctrlName][measure["name"]] = measure["value"]
except Exception as e:
logger.error(e)
try:
payload = {}
for key, value in grouped_data.items():
if value:
payload[key] = [{"ts": now ,"values": value}]
publish("v1/devices/me/telemetry", json.dumps(gatewayPayload), qos=1,cloud_name="default")
for chunk in chunk_payload(payload=payload):
publish(topic, json.dumps(chunk), qos=1, cloud_name="default")
logger.info(json.dumps(chunk, indent=4))
time.sleep(2)
except Exception as e:
logger.error(e)
def writeplctag(value):
#value in the form {"measurement": <measurement_name>, "value": <value to write>}
try:
#value = json.loads(value.replace("'",'"'))
logger.debug(value)
#payload format: [{"name": "advvfdipp", "measures": [{"name": "manualfrequencysetpoint", "value": 49}]}]
message = [{"name": "AA_Transfer", "measures":[{"name":value["measurement"], "value": value["value"]}]}]
resp = write(message)
logger.debug("RETURN FROM WRITE: {}".format(resp))
return True
except Exception as e:
logger.debug(e)
return False
def receiveAttributes(topic, payload):
try:
logger.debug(topic)
logger.debug(json.loads(payload))
p = json.loads(payload)
for key, value in p.items():
try:
result = writeplctag({"measurement":key, "value":value})
logger.debug(result)
except Exception as e:
logger.error(e)
#logger.debug(command)
sync()
except Exception as e:
logger.debug(e)