98 lines
3.6 KiB
Python
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)
|
|
|
|
|