updated with config saving
This commit is contained in:
322
Pub_Sub/valvecontroller/thingsboard/v1/valvecontroller_tb_v1.cfg
Normal file
322
Pub_Sub/valvecontroller/thingsboard/v1/valvecontroller_tb_v1.cfg
Normal file
@@ -0,0 +1,322 @@
|
||||
{
|
||||
"controllers": [
|
||||
{
|
||||
"protocol": "EtherNet/IP",
|
||||
"name": "valvecontroller",
|
||||
"args": {},
|
||||
"samplePeriod": 2,
|
||||
"expired": 10000,
|
||||
"endpoint": "192.168.1.12:44818"
|
||||
}
|
||||
],
|
||||
"measures": [
|
||||
{
|
||||
"ctrlName": "valvecontroller",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Open_Setpoint",
|
||||
"readWrite": "rw",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 1,
|
||||
"name": "open_spt",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": ""
|
||||
},
|
||||
{
|
||||
"ctrlName": "valvecontroller",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Close_Setpoint",
|
||||
"readWrite": "rw",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 1,
|
||||
"name": "close_spt",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": ""
|
||||
},
|
||||
{
|
||||
"ctrlName": "valvecontroller",
|
||||
"dataType": "BIT",
|
||||
"addr": "Open_Valve_Cmd",
|
||||
"readWrite": "rw",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"name": "open_cmd",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"decimal": 2
|
||||
},
|
||||
{
|
||||
"ctrlName": "valvecontroller",
|
||||
"dataType": "BIT",
|
||||
"addr": "Close_Valve_Cmd",
|
||||
"readWrite": "rw",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"name": "close_cmd",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"decimal": 2
|
||||
},
|
||||
{
|
||||
"ctrlName": "valvecontroller",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Scaled_Tank_Lev",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 1,
|
||||
"name": "tank_level",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": ""
|
||||
},
|
||||
{
|
||||
"ctrlName": "valvecontroller",
|
||||
"dataType": "BIT",
|
||||
"addr": "Valve_Open_Status",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"name": "valve_open_status",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"decimal": 2
|
||||
},
|
||||
{
|
||||
"ctrlName": "valvecontroller",
|
||||
"dataType": "BIT",
|
||||
"addr": "Valve_Closed_Status",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"name": "valve_close_status",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"decimal": 2
|
||||
},
|
||||
{
|
||||
"ctrlName": "valvecontroller",
|
||||
"dataType": "BIT",
|
||||
"addr": "Valve_Fail",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"name": "valve_failure",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"decimal": 2
|
||||
}
|
||||
],
|
||||
"alarmLables": [
|
||||
"default"
|
||||
],
|
||||
"alarms": [],
|
||||
"groups": [
|
||||
{
|
||||
"name": "default",
|
||||
"uploadInterval": 600,
|
||||
"reference": 8
|
||||
}
|
||||
],
|
||||
"misc": {
|
||||
"maxAlarmRecordSz": 2000,
|
||||
"logLvl": "INFO",
|
||||
"coms": [
|
||||
{
|
||||
"name": "rs232",
|
||||
"baud": 9600,
|
||||
"bits": 8,
|
||||
"stopbits": 1,
|
||||
"parityChk": "n"
|
||||
},
|
||||
{
|
||||
"name": "rs485",
|
||||
"baud": 9600,
|
||||
"bits": 8,
|
||||
"stopbits": 1,
|
||||
"parityChk": "n"
|
||||
}
|
||||
]
|
||||
},
|
||||
"clouds": [
|
||||
{
|
||||
"cacheSize": 10000,
|
||||
"enable": 1,
|
||||
"name": "default",
|
||||
"type": "Standard MQTT",
|
||||
"args": {
|
||||
"host": "thingsboard.cloud",
|
||||
"port": 1883,
|
||||
"clientId": "valve-controller",
|
||||
"auth": 1,
|
||||
"tls": 0,
|
||||
"cleanSession": 0,
|
||||
"mqttVersion": "v3.1.1",
|
||||
"keepalive": 60,
|
||||
"key": "",
|
||||
"cert": "",
|
||||
"rootCA": "",
|
||||
"verifyServer": 0,
|
||||
"verifyClient": 0,
|
||||
"username": "faskensmqtt",
|
||||
"passwd": "faskensmqtt@1903",
|
||||
"authType": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
"quickfaas": {
|
||||
"genericFuncs": [],
|
||||
"uploadFuncs": [
|
||||
{
|
||||
"qos": 1,
|
||||
"funcName": "sendData",
|
||||
"script": "# Enter your python code.\nimport json\nimport time\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\n\ndef sendData(message):\n logger.debug(message)\n #publish(__topic__, json.dumps(message), __qos__)\n try:\n payload = {\"ts\": int(time.time()*1000), \"values\": {}}\n valve_open = 0\n valve_close = 0\n for measure in message[\"measures\"]:\n if measure[\"name\"] in [\"valve_failure\"]:\n value = convert_int(measure[\"name\"], measure[\"value\"])\n payload[\"values\"][measure[\"name\"]] = value\n elif measure[\"name\"] == \"valve_open_status\":\n valve_open = measure[\"value\"]\n elif measure[\"name\"] == \"valve_close_status\":\n valve_close = measure[\"value\"]\n elif \"_cmd\" in measure[\"name\"]:\n pass\n else:\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n if valve_open:\n payload[\"values\"][\"valve_status\"] = 1\n elif valve_close:\n payload[\"values\"][\"valve_status\"] = 0\n else:\n payload[\"values\"][\"valve_status\"] = -1\n publish(__topic__, json.dumps(payload), __qos__)\n except Exception as e:\n logger.error(e)\n\n\ndef convert_int(name, value):\n valve_failure = {\n 0: \"OK\",\n 1: \"Failure\"\n }\n\n names = {\n \"valve_failure\": valve_failure.get(value, \"Invalid Code\")\n }\n return names.get(name, \"Invalid Name\")",
|
||||
"name": "sendData",
|
||||
"trigger": "measure_event",
|
||||
"topic": "v1/devices/me/telemetry",
|
||||
"cloudName": "default",
|
||||
"groups": [
|
||||
"default"
|
||||
],
|
||||
"msgType": 0
|
||||
}
|
||||
],
|
||||
"downloadFuncs": [
|
||||
{
|
||||
"name": "Commands",
|
||||
"topic": "v1/devices/me/rpc/request/+",
|
||||
"qos": 1,
|
||||
"funcName": "receiveCommand",
|
||||
"payload_type": "Plaintext",
|
||||
"script": "# Enter your python code.\nimport json\nimport time\nfrom quickfaas.measure import recall\nfrom common.Logger import logger\n\ndef sync(wizard_api):\n #get new values and send\n payload = {}\n topic = \"v1/devices/me/telemetry\"\n try:\n data = recall()#json.loads(recall().decode(\"utf-8\"))\n except Exception as e:\n logger.error(e)\n logger.info(data)\n for controller in data:\n payload = {\"ts\": int(time.time()*1000), \"values\": {}}\n valve_open = 0\n valve_close = 0\n for measure in message[\"measures\"]:\n if measure[\"name\"] in [\"valve_failure\"]:\n value = convert_int(measure[\"name\"], measure[\"value\"])\n payload[\"values\"][measure[\"name\"]] = value\n elif measure[\"name\"] == \"valve_open_status\":\n valve_open = measure[\"value\"]\n elif measure[\"name\"] == \"valve_close_status\":\n valve_close = measure[\"value\"]\n elif \"_cmd\" in measure[\"name\"]:\n pass\n else:\n payload[\"values\"][measure[\"name\"]] = measure[\"value\"]\n if valve_open:\n payload[\"values\"][\"valve_status\"] = \"Open\"\n elif valve_close:\n payload[\"values\"][\"valve_status\"] = \"Closed\"\n else:\n payload[\"values\"][\"valve_status\"] = \"Unknown\"\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n wizard_api.mqtt_publish(topic, json.dumps(payload))\ndef writeplctag(value, wizard_api):\n try:\n #value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n message = {\"valvecontroller\":{value[\"measurement\"]: value[\"value\"]}}\n resp = wizard_api.write_plc_values(message)\n #logger.debug(\"RETURN FROM WRITE: {}\".format(resp))\n return True\n except Exception as e:\n logger.debug(e)\n return False\n \ndef receiveCommand(topic, payload, wizard_api):\n try:\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)\n command = p[\"method\"]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n } \n if command == \"setPLCTag\":\n result = commands[\"writeplctag\"](p[\"params\"],wizard_api)\n elif command == \"changeSetpoint\":\n try:\n params_type = {\"measurement\": \"pidcontrolmode\", \"value\": p[\"params\"][\"setpointType\"]}\n if params_type[\"value\"]:\n commands[\"writeplctag\"](params_type, wizard_api)\n time.sleep(2)\n except:\n pass\n try:\n modes = {0: \"flowsetpoint\", 1: \"fluidlevelsetpoint\", 2: \"tubingpressuresetpoint\", 3: \"manualfrequencysetpoint\"}\n params_value = {\"value\": p[\"params\"][\"setpointValue\"]}\n if params_value[\"value\"]:\n params_value[\"measurement\"] = modes[getMode()]\n commands[\"writeplctag\"](params_value, wizard_api)\n except Exception as e:\n logger.debug(\"DID NOT WRITE SETPOINT\")\n logger.debug(e)\n \n #logger.debug(command)\n ack(topic.split(\"/\")[-1], wizard_api)\n time.sleep(5)\n sync(wizard_api)\n except Exception as e:\n logger.debug(e)\n \n\ndef ack(msgid, wizard_api):\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"v1/devices/me/rpc/response/\" + str(msgid), json.dumps({\"msg\": {\"time\": time.time()}, \"metadata\": \"\", \"msgType\": \"\"}))\n\ndef getMode():\n try:\n data = recall()\n for controller in data:\n for measure in controller[\"measures\"]:\n if measure[\"name\"] == \"pidcontrolmode\":\n return measure[\"value\"]\n except:\n return None\n\ndef convert_int(name, value):\n valve_failure = {\n 0: \"OK\",\n 1: \"Failure\"\n }\n\n names = {\n \"valve_failure\": valve_failure.get(value, \"Invalid Code\")\n }\n return names.get(name, \"Invalid Name\")\n",
|
||||
"msgType": 0,
|
||||
"cloudName": "default",
|
||||
"trigger": "command_event"
|
||||
}
|
||||
]
|
||||
},
|
||||
"labels": [
|
||||
{
|
||||
"key": "SN",
|
||||
"value": "GF5022215013070"
|
||||
},
|
||||
{
|
||||
"key": "MAC",
|
||||
"value": "00:18:05:1f:8d:4c"
|
||||
}
|
||||
],
|
||||
"modbusSlave": {
|
||||
"enable": 0,
|
||||
"protocol": "Modbus-TCP",
|
||||
"port": 502,
|
||||
"slaveAddr": 1,
|
||||
"int16Ord": "ab",
|
||||
"int32Ord": "abcd",
|
||||
"float32Ord": "abcd",
|
||||
"maxConnection": 5,
|
||||
"mapping_table": []
|
||||
},
|
||||
"iec104Server": {
|
||||
"enable": 0,
|
||||
"cotSize": 2,
|
||||
"port": 2404,
|
||||
"serverList": [
|
||||
{
|
||||
"asduAddr": 1
|
||||
}
|
||||
],
|
||||
"kValue": 12,
|
||||
"wValue": 8,
|
||||
"t0": 15,
|
||||
"t1": 15,
|
||||
"t2": 10,
|
||||
"t3": 20,
|
||||
"maximumLink": 5,
|
||||
"timeSet": 1,
|
||||
"byteOrder": "abcd",
|
||||
"mapping_table": []
|
||||
},
|
||||
"opcuaServer": {
|
||||
"enable": 0,
|
||||
"port": 4840,
|
||||
"maximumLink": 5,
|
||||
"securityMode": 0,
|
||||
"identifierType": "String",
|
||||
"mapping_table": []
|
||||
},
|
||||
"southMetadata": {},
|
||||
"bindMetadata": {
|
||||
"version": "",
|
||||
"timestamp": ""
|
||||
},
|
||||
"bindConfig": {
|
||||
"enable": 0,
|
||||
"bind": {
|
||||
"modelId": "",
|
||||
"modelName": "",
|
||||
"srcId": "",
|
||||
"srcName": "",
|
||||
"devId": "",
|
||||
"devName": ""
|
||||
},
|
||||
"varGroups": [],
|
||||
"variables": [],
|
||||
"alerts": []
|
||||
}
|
||||
}
|
||||
161
Pub_Sub/valvecontroller/thingsboard/v2/pub/sendData.py
Normal file
161
Pub_Sub/valvecontroller/thingsboard/v2/pub/sendData.py
Normal file
@@ -0,0 +1,161 @@
|
||||
# Enter your python code.
|
||||
import json, os
|
||||
from datetime import datetime as dt
|
||||
from common.Logger import logger
|
||||
from quickfaas.remotebus import publish
|
||||
from quickfaas.global_dict import get as get_params
|
||||
from quickfaas.global_dict import _set_global_args
|
||||
|
||||
def reboot():
|
||||
#basic = Basic()
|
||||
logger.info("!" * 10 + "REBOOTING DEVICE" + "!"*10)
|
||||
r = os.popen("kill -s SIGHUP `cat /var/run/python/supervisord.pid`").read()
|
||||
logger.info(f"REBOOT : {r}")
|
||||
|
||||
def checkFileExist(filename):
|
||||
path = "/var/user/files"
|
||||
if not os.path.exists(path):
|
||||
logger.info("no folder making files folder in var/user")
|
||||
os.makedirs(path)
|
||||
with open(path + "/" + filename, "a") as f:
|
||||
json.dump({}, f)
|
||||
if not os.path.exists(path + "/" + filename):
|
||||
logger.info("no creds file making creds file")
|
||||
with open(path + "/" + filename, "a") as f:
|
||||
json.dump({}, f)
|
||||
|
||||
def convertDStoJSON(ds):
|
||||
j = dict()
|
||||
for x in ds:
|
||||
j[x["key"]] = x["value"]
|
||||
return j
|
||||
|
||||
def convertJSONtoDS(j):
|
||||
d = []
|
||||
for key in j.keys():
|
||||
d.append({"key": key, "value": j[key]})
|
||||
return d
|
||||
|
||||
def checkCredentialConfig():
|
||||
logger.info("CHECKING CONFIG")
|
||||
cfgpath = "/var/user/cfg/device_supervisor/device_supervisor.cfg"
|
||||
credspath = "/var/user/files/creds.json"
|
||||
cfg = dict()
|
||||
with open(cfgpath, "r") as f:
|
||||
cfg = json.load(f)
|
||||
clouds = cfg.get("clouds")
|
||||
logger.info(clouds)
|
||||
#if not configured then try to configure from stored values
|
||||
if clouds[0]["args"]["clientId"] == "unknown" or clouds[0]["args"]["username"] == "unknown" or not clouds[0]["args"]["passwd"] or clouds[0]["args"]["passwd"] == "unknown":
|
||||
checkFileExist("creds.json")
|
||||
with open(credspath, "r") as c:
|
||||
creds = json.load(c)
|
||||
if creds:
|
||||
logger.info("updating config with stored data")
|
||||
clouds[0]["args"]["clientId"] = creds["clientId"]
|
||||
clouds[0]["args"]["username"] = creds["userName"]
|
||||
clouds[0]["args"]["passwd"] = creds["password"]
|
||||
cfg["clouds"] = clouds
|
||||
cfg = checkParameterConfig(cfg)
|
||||
with open(cfgpath, "w", encoding='utf-8') as n:
|
||||
json.dump(cfg, n, indent=1, ensure_ascii=False)
|
||||
reboot()
|
||||
else:
|
||||
#assuming clouds is filled out, if data is different then assume someone typed in something new and store it, if creds is empty fill with clouds' data
|
||||
checkFileExist("creds.json")
|
||||
with open(credspath, "r") as c:
|
||||
logger.info("updating stored file with new data")
|
||||
cfg = checkParameterConfig(cfg)
|
||||
with open(cfgpath, "w", encoding='utf-8') as n:
|
||||
json.dump(cfg, n, indent=1, ensure_ascii=False)
|
||||
creds = json.load(c)
|
||||
if creds:
|
||||
if creds["clientId"] != clouds[0]["args"]["clientId"]:
|
||||
creds["clientId"] = clouds[0]["args"]["clientId"]
|
||||
if creds["userName"] != clouds[0]["args"]["username"]:
|
||||
creds["userName"] = clouds[0]["args"]["username"]
|
||||
if creds["password"] != clouds[0]["args"]["passwd"]:
|
||||
creds["password"] = clouds[0]["args"]["passwd"]
|
||||
else:
|
||||
creds["clientId"] = clouds[0]["args"]["clientId"]
|
||||
creds["userName"] = clouds[0]["args"]["username"]
|
||||
creds["password"] = clouds[0]["args"]["passwd"]
|
||||
with open(credspath, "w") as cw:
|
||||
json.dump(creds,cw)
|
||||
|
||||
def checkParameterConfig(cfg):
|
||||
logger.info("Checking Parameters!!!!")
|
||||
paramspath = "/var/user/files/params.json"
|
||||
cfgparams = convertDStoJSON(cfg.get("labels"))
|
||||
#check stored values
|
||||
checkFileExist("params.json")
|
||||
with open(paramspath, "r") as f:
|
||||
logger.info("Opened param storage file")
|
||||
params = json.load(f)
|
||||
if params:
|
||||
if cfgparams != params:
|
||||
#go through each param
|
||||
#if not "unknown" and cfg and params aren't the same take from cfg likely updated manually
|
||||
#if key in cfg but not in params copy to params
|
||||
logger.info("equalizing params between cfg and stored")
|
||||
for key in cfgparams.keys():
|
||||
try:
|
||||
if cfgparams[key] != params[key] and cfgparams[key] != "unknown":
|
||||
params[key] = cfgparams[key]
|
||||
except:
|
||||
params[key] = cfgparams[key]
|
||||
cfg["labels"] = convertJSONtoDS(params)
|
||||
_set_global_args(convertJSONtoDS(params))
|
||||
with open(paramspath, "w") as p:
|
||||
json.dump(params, p)
|
||||
else:
|
||||
with open(paramspath, "w") as p:
|
||||
logger.info("initializing param file with params in memory")
|
||||
json.dump(convertDStoJSON(get_params()), p)
|
||||
cfg["labels"] = get_params()
|
||||
|
||||
return cfg
|
||||
|
||||
def sendData(message):
|
||||
logger.debug(message)
|
||||
try:
|
||||
checkCredentialConfig()
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
try:
|
||||
payload = {"ts": (round(dt.timestamp(dt.now())/600)*600)*1000, "values": {}}
|
||||
valve_open = 0
|
||||
valve_close = 0
|
||||
for measure in message["measures"]:
|
||||
if measure["name"] in ["valve_failure"]:
|
||||
value = convert_int(measure["name"], measure["value"])
|
||||
payload["values"][measure["name"]] = value
|
||||
elif measure["name"] == "valve_open_status":
|
||||
valve_open = measure["value"]
|
||||
elif measure["name"] == "valve_close_status":
|
||||
valve_close = measure["value"]
|
||||
elif "_cmd" in measure["name"]:
|
||||
pass
|
||||
else:
|
||||
payload["values"][measure["name"]] = measure["value"]
|
||||
if valve_open:
|
||||
payload["values"]["valve_status"] = 1
|
||||
elif valve_close:
|
||||
payload["values"]["valve_status"] = 0
|
||||
else:
|
||||
payload["values"]["valve_status"] = -1
|
||||
publish(__topic__, json.dumps(payload), __qos__)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
|
||||
def convert_int(name, value):
|
||||
valve_failure = {
|
||||
0: "OK",
|
||||
1: "Failure"
|
||||
}
|
||||
|
||||
names = {
|
||||
"valve_failure": valve_failure.get(value, "Invalid Code")
|
||||
}
|
||||
return names.get(name, "Invalid Name")
|
||||
104
Pub_Sub/valvecontroller/thingsboard/v2/sub/receiveCommand.py
Normal file
104
Pub_Sub/valvecontroller/thingsboard/v2/sub/receiveCommand.py
Normal file
@@ -0,0 +1,104 @@
|
||||
import json, time
|
||||
from quickfaas.measure import recall, write
|
||||
from quickfaas.remotebus import publish
|
||||
from common.Logger import logger
|
||||
|
||||
def sync():
|
||||
#get new values and send
|
||||
payload = {}
|
||||
topic = "v1/devices/me/telemetry"
|
||||
try:
|
||||
data = recall()#json.loads(recall().decode("utf-8"))
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
logger.info(data)
|
||||
for controller in data:
|
||||
payload = {"ts": int(time.time()*1000), "values": {}}
|
||||
valve_open = 0
|
||||
valve_close = 0
|
||||
for measure in controller["measures"]:
|
||||
if measure["name"] in ["valve_failure"]:
|
||||
value = convert_int(measure["name"], measure["value"])
|
||||
payload["values"][measure["name"]] = value
|
||||
elif measure["name"] == "valve_open_status":
|
||||
valve_open = measure["value"]
|
||||
elif measure["name"] == "valve_close_status":
|
||||
valve_close = measure["value"]
|
||||
elif "_cmd" in measure["name"]:
|
||||
pass
|
||||
else:
|
||||
payload["values"][measure["name"]] = measure["value"]
|
||||
if valve_open:
|
||||
payload["values"]["valve_status"] = "Open"
|
||||
elif valve_close:
|
||||
payload["values"]["valve_status"] = "Closed"
|
||||
else:
|
||||
payload["values"]["valve_status"] = "Unknown"
|
||||
logger.debug("Sending on topic: {}".format(topic))
|
||||
logger.debug("Sending value: {}".format(payload))
|
||||
publish(topic, json.dumps(payload))
|
||||
def writeplctag(value):
|
||||
try:
|
||||
#value = json.loads(value.replace("'",'"'))
|
||||
logger.debug(value)
|
||||
message = [{"name": "valvecontroller", "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 receiveCommand(topic, payload):
|
||||
try:
|
||||
logger.debug(topic)
|
||||
logger.debug(json.loads(payload))
|
||||
p = json.loads(payload)
|
||||
command = p["method"]
|
||||
commands = {
|
||||
"sync": sync,
|
||||
"writeplctag": writeplctag,
|
||||
}
|
||||
if command == "setPLCTag":
|
||||
try:
|
||||
result = commands["writeplctag"](p["params"])
|
||||
logger.debug(result)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
|
||||
#logger.debug(command)
|
||||
ack(topic.split("/")[-1])
|
||||
time.sleep(5)
|
||||
sync()
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
|
||||
|
||||
def ack(msgid):
|
||||
#logger.debug(msgid)
|
||||
#logger.debug(mac)
|
||||
#logger.debug(name)
|
||||
#logger.debug(value)
|
||||
publish("v1/devices/me/rpc/response/" + str(msgid), json.dumps({"msg": {"time": time.time()}, "metadata": "", "msgType": ""}))
|
||||
|
||||
def getMode():
|
||||
try:
|
||||
data = recall()
|
||||
for controller in data:
|
||||
for measure in controller["measures"]:
|
||||
if measure["name"] == "pidcontrolmode":
|
||||
return measure["value"]
|
||||
except:
|
||||
return None
|
||||
|
||||
def convert_int(name, value):
|
||||
valve_failure = {
|
||||
0: "OK",
|
||||
1: "Failure"
|
||||
}
|
||||
|
||||
names = {
|
||||
"valve_failure": valve_failure.get(value, "Invalid Code")
|
||||
}
|
||||
return names.get(name, "Invalid Name")
|
||||
322
Pub_Sub/valvecontroller/thingsboard/v2/valvecontroller_tb_v2.cfg
Normal file
322
Pub_Sub/valvecontroller/thingsboard/v2/valvecontroller_tb_v2.cfg
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user