initial
This commit is contained in:
BIN
Pub_Sub/.DS_Store
vendored
Normal file
BIN
Pub_Sub/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
Pub_Sub/abbflow/.DS_Store
vendored
Normal file
BIN
Pub_Sub/abbflow/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
Pub_Sub/abbflow/v1/.DS_Store
vendored
Normal file
BIN
Pub_Sub/abbflow/v1/.DS_Store
vendored
Normal file
Binary file not shown.
378
Pub_Sub/abbflow/v1/device_supervisor_abbflowv1.cfg
Normal file
378
Pub_Sub/abbflow/v1/device_supervisor_abbflowv1.cfg
Normal file
@@ -0,0 +1,378 @@
|
||||
{
|
||||
"controllers": [
|
||||
{
|
||||
"protocol": "Modbus-RTU",
|
||||
"name": "ABBFlow",
|
||||
"args": {
|
||||
"slaveAddr": 1,
|
||||
"int16Ord": "ab",
|
||||
"int32Ord": "abcd",
|
||||
"float32Ord": "abcd",
|
||||
"continuousAcquisition": 1,
|
||||
"maxContinuousNumber": 64
|
||||
},
|
||||
"endpoint": "rs232",
|
||||
"samplePeriod": 10,
|
||||
"expired": 10000
|
||||
}
|
||||
],
|
||||
"groups": [
|
||||
{
|
||||
"name": "default",
|
||||
"uploadInterval": 3600,
|
||||
"reference": 10
|
||||
}
|
||||
],
|
||||
"measures": [
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "volume_flow",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44003",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44003"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "today_volume",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44005",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44005"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "battery_voltage",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44001",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44001"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "differential_pressure",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44013",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44013"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "yesterday_volume",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44007",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44007"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "accumulated_volume",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44009",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44009"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "static_pressure",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44015",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44015"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "temperature",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44017",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44017"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "charger_voltage",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44019",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44019"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "last_calculation_period_volume",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44012",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44012"
|
||||
}
|
||||
],
|
||||
"alarms": [],
|
||||
"misc": {
|
||||
"maxAlarmRecordSz": 2000,
|
||||
"logLvl": "DEBUG",
|
||||
"coms": [
|
||||
{
|
||||
"name": "rs232",
|
||||
"baud": 9600,
|
||||
"bits": 8,
|
||||
"stopbits": 1,
|
||||
"parityChk": "n"
|
||||
},
|
||||
{
|
||||
"name": "rs485",
|
||||
"baud": 9600,
|
||||
"bits": 8,
|
||||
"stopbits": 1,
|
||||
"parityChk": "n"
|
||||
}
|
||||
]
|
||||
},
|
||||
"clouds": [
|
||||
{
|
||||
"cacheSize": 100,
|
||||
"enable": 1,
|
||||
"name": "default",
|
||||
"type": "Standard MQTT",
|
||||
"args": {
|
||||
"host": "mq194.imistaway.net",
|
||||
"port": 1883,
|
||||
"clientId": "abbflow-inhand-test",
|
||||
"auth": 1,
|
||||
"tls": 0,
|
||||
"cleanSession": 1,
|
||||
"mqttVersion": "v3.1.1",
|
||||
"keepalive": 60,
|
||||
"key": "",
|
||||
"cert": "",
|
||||
"rootCA": "",
|
||||
"verifyServer": 0,
|
||||
"verifyClient": 0,
|
||||
"username": "admin",
|
||||
"passwd": "columbus",
|
||||
"authType": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
"labels": [
|
||||
{
|
||||
"key": "SN",
|
||||
"value": "GF5022137006262"
|
||||
},
|
||||
{
|
||||
"key": "MAC",
|
||||
"value": "00:18:05:1a:e5:57"
|
||||
},
|
||||
{
|
||||
"key": "MAC_UPPER",
|
||||
"value": "00:18:05:1A:E5:57"
|
||||
}
|
||||
],
|
||||
"quickfaas": {
|
||||
"genericFuncs": [],
|
||||
"uploadFuncs": [
|
||||
{
|
||||
"name": "Mistaway",
|
||||
"trigger": "measure_event",
|
||||
"topic": "meshify/db/194/_/abbflow/",
|
||||
"qos": 1,
|
||||
"groups": [
|
||||
"default"
|
||||
],
|
||||
"funcName": "sendData",
|
||||
"script": "# Enter your python code.\nimport json\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nimport re, uuid\n\n\ndef sendData(message):\n logger.debug(message)\n mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))\n for measure in message[\"measures\"]:\n publish(__topic__ + mac + \":01:99/\" + measure[\"name\"], json.dumps([{\"value\": measure[\"value\"]}]), __qos__)\n #publish(__topic__, json.dumps({measure[\"name\"]: measure[\"value\"]}), __qos__)\n ",
|
||||
"msgType": 0,
|
||||
"cloudName": "default"
|
||||
}
|
||||
],
|
||||
"downloadFuncs": [
|
||||
{
|
||||
"name": "Commands",
|
||||
"topic": "meshify/sets/194/${MAC_UPPER}:01:99",
|
||||
"qos": 1,
|
||||
"funcName": "receiveCommand",
|
||||
"payload_type": "Plaintext",
|
||||
"script": "# Enter your python code.\nimport json\nfrom quickfaas.measure import recall\nfrom common.Logger import logger\n\ndef sync(mac, wizard_api):\n #get new values and send\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 for measure in controller[\"measures\"]:\n #publish measure\n topic = \"meshify/db/194/_/abbflow/\" + mac + \"/\" + measure[\"name\"]\n payload = [{\"value\": measure[\"value\"]}]\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n wizard_api.mqtt_publish(topic, json.dumps(payload))\n \ndef receiveCommand(topic, payload, wizard_api):\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)[0]\n command = p[\"payload\"][\"name\"].split(\".\")[1]\n commands = {\n \"sync\": sync\n }\n commands[command](p[\"mac\"].lower(), wizard_api)\n #logger.debug(command)\n ack(p[\"msgId\"], p[\"mac\"], p[\"payload\"][\"name\"].split(\".\")[1], p[\"payload\"][\"value\"], wizard_api)\n\ndef ack(msgid, mac, name, value, wizard_api):\n #logger.debug(mac)\n mac = \"\".join(mac.split(\":\")[:-2])\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"meshify/responses/\" + str(msgid), json.dumps([{\"value\": \"{} Success Setting: {} To: {}\".format(mac,name, value), \"msgid\": str(msgid)}]))",
|
||||
"msgType": 0,
|
||||
"cloudName": "default",
|
||||
"trigger": "command_event"
|
||||
}
|
||||
]
|
||||
},
|
||||
"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": []
|
||||
},
|
||||
"bindConfig": {
|
||||
"enable": 0,
|
||||
"bind": {
|
||||
"modelId": "",
|
||||
"modelName": "",
|
||||
"srcId": "",
|
||||
"srcName": "",
|
||||
"devId": "",
|
||||
"devName": ""
|
||||
},
|
||||
"varGroups": [],
|
||||
"variables": [],
|
||||
"alerts": []
|
||||
},
|
||||
"southMetadata": {},
|
||||
"bindMetadata": {
|
||||
"version": "",
|
||||
"timestamp": ""
|
||||
}
|
||||
}
|
||||
BIN
Pub_Sub/abbflow/v1/pub/.DS_Store
vendored
Normal file
BIN
Pub_Sub/abbflow/v1/pub/.DS_Store
vendored
Normal file
Binary file not shown.
14
Pub_Sub/abbflow/v1/pub/sendData.py
Normal file
14
Pub_Sub/abbflow/v1/pub/sendData.py
Normal file
@@ -0,0 +1,14 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from common.Logger import logger
|
||||
from quickfaas.remotebus import publish
|
||||
import re, uuid
|
||||
|
||||
|
||||
def sendData(message):
|
||||
logger.debug(message)
|
||||
mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))
|
||||
for measure in message["measures"]:
|
||||
publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps([{"value": measure["value"]}]), __qos__)
|
||||
#publish(__topic__, json.dumps({measure["name"]: measure["value"]}), __qos__)
|
||||
|
||||
41
Pub_Sub/abbflow/v1/sub/receiveCommand.py
Normal file
41
Pub_Sub/abbflow/v1/sub/receiveCommand.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from quickfaas.measure import recall
|
||||
from common.Logger import logger
|
||||
|
||||
def sync(mac, wizard_api):
|
||||
#get new values and send
|
||||
try:
|
||||
data = recall()#json.loads(recall().decode("utf-8"))
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
logger.info(data)
|
||||
for controller in data:
|
||||
for measure in controller["measures"]:
|
||||
#publish measure
|
||||
topic = "meshify/db/194/_/abbflow/" + mac + "/" + measure["name"]
|
||||
payload = [{"value": measure["value"]}]
|
||||
logger.debug("Sending on topic: {}".format(topic))
|
||||
logger.debug("Sending value: {}".format(payload))
|
||||
wizard_api.mqtt_publish(topic, json.dumps(payload))
|
||||
|
||||
def receiveCommand(topic, payload, wizard_api):
|
||||
logger.debug(topic)
|
||||
logger.debug(json.loads(payload))
|
||||
p = json.loads(payload)[0]
|
||||
command = p["payload"]["name"].split(".")[1]
|
||||
commands = {
|
||||
"sync": sync
|
||||
}
|
||||
commands[command](p["mac"].lower(), wizard_api)
|
||||
#logger.debug(command)
|
||||
ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api)
|
||||
|
||||
def ack(msgid, mac, name, value, wizard_api):
|
||||
#logger.debug(mac)
|
||||
mac = "".join(mac.split(":")[:-2])
|
||||
#logger.debug(msgid)
|
||||
#logger.debug(mac)
|
||||
#logger.debug(name)
|
||||
#logger.debug(value)
|
||||
wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}]))
|
||||
BIN
Pub_Sub/abbflow/v2/.DS_Store
vendored
Normal file
BIN
Pub_Sub/abbflow/v2/.DS_Store
vendored
Normal file
Binary file not shown.
378
Pub_Sub/abbflow/v2/device_supervisor_abbflowv2.cfg
Normal file
378
Pub_Sub/abbflow/v2/device_supervisor_abbflowv2.cfg
Normal file
@@ -0,0 +1,378 @@
|
||||
{
|
||||
"controllers": [
|
||||
{
|
||||
"protocol": "Modbus-RTU",
|
||||
"name": "ABBFlow",
|
||||
"args": {
|
||||
"slaveAddr": 1,
|
||||
"int16Ord": "ab",
|
||||
"int32Ord": "abcd",
|
||||
"float32Ord": "abcd",
|
||||
"continuousAcquisition": 1,
|
||||
"maxContinuousNumber": 64
|
||||
},
|
||||
"endpoint": "rs232",
|
||||
"samplePeriod": 10,
|
||||
"expired": 10000
|
||||
}
|
||||
],
|
||||
"groups": [
|
||||
{
|
||||
"name": "default",
|
||||
"uploadInterval": 3600,
|
||||
"reference": 10
|
||||
}
|
||||
],
|
||||
"measures": [
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "volume_flow",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44003",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44003"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "today_volume",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44005",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44005"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "battery_voltage",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44001",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44001"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "differential_pressure",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44013",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44013"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "yesterday_volume",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44007",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44007"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "accumulated_volume",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44009",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44009"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "static_pressure",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44015",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44015"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "temperature",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44017",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44017"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "charger_voltage",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44019",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44019"
|
||||
},
|
||||
{
|
||||
"ctrlName": "ABBFlow",
|
||||
"dataType": "FLOAT",
|
||||
"readWrite": "ro",
|
||||
"uploadType": "periodic",
|
||||
"group": "default",
|
||||
"decimal": 2,
|
||||
"name": "last_calculation_period_volume",
|
||||
"desc": "",
|
||||
"unit": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0",
|
||||
"regAddr": "44012",
|
||||
"maxValue": "",
|
||||
"minValue": "",
|
||||
"maxScaleValue": "",
|
||||
"minScaleValue": "",
|
||||
"addr": "44012"
|
||||
}
|
||||
],
|
||||
"alarms": [],
|
||||
"misc": {
|
||||
"maxAlarmRecordSz": 2000,
|
||||
"logLvl": "DEBUG",
|
||||
"coms": [
|
||||
{
|
||||
"name": "rs232",
|
||||
"baud": 9600,
|
||||
"bits": 8,
|
||||
"stopbits": 1,
|
||||
"parityChk": "n"
|
||||
},
|
||||
{
|
||||
"name": "rs485",
|
||||
"baud": 9600,
|
||||
"bits": 8,
|
||||
"stopbits": 1,
|
||||
"parityChk": "n"
|
||||
}
|
||||
]
|
||||
},
|
||||
"clouds": [
|
||||
{
|
||||
"cacheSize": 100,
|
||||
"enable": 1,
|
||||
"name": "default",
|
||||
"type": "Standard MQTT",
|
||||
"args": {
|
||||
"host": "mq194.imistaway.net",
|
||||
"port": 1883,
|
||||
"clientId": "abbflow-inhand-test",
|
||||
"auth": 1,
|
||||
"tls": 0,
|
||||
"cleanSession": 1,
|
||||
"mqttVersion": "v3.1.1",
|
||||
"keepalive": 60,
|
||||
"key": "",
|
||||
"cert": "",
|
||||
"rootCA": "",
|
||||
"verifyServer": 0,
|
||||
"verifyClient": 0,
|
||||
"username": "admin",
|
||||
"passwd": "columbus",
|
||||
"authType": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
"labels": [
|
||||
{
|
||||
"key": "SN",
|
||||
"value": "GF5022137006262"
|
||||
},
|
||||
{
|
||||
"key": "MAC",
|
||||
"value": "00:18:05:1a:e5:57"
|
||||
},
|
||||
{
|
||||
"key": "MAC_UPPER",
|
||||
"value": "00:18:05:1A:E5:57"
|
||||
}
|
||||
],
|
||||
"quickfaas": {
|
||||
"genericFuncs": [],
|
||||
"uploadFuncs": [
|
||||
{
|
||||
"name": "Mistaway",
|
||||
"trigger": "measure_event",
|
||||
"topic": "meshify/db/194/_/abbflow/",
|
||||
"qos": 1,
|
||||
"groups": [
|
||||
"default"
|
||||
],
|
||||
"funcName": "sendData",
|
||||
"script": "# Enter your python code.\nimport json\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nimport re, uuid\nfrom paho.mqtt import client\n\nlwtData = {\n \"init\":False,\n \"client\": client.Client(client_id=str(uuid.uuid4()), clean_session=True, userdata=None, protocol=client.MQTTv311, transport=\"tcp\")\n}\ndef lwt(mac):\n try:\n #if not lwtData[\"connected\"]:\n if not lwtData[\"init\"]:\n logger.info(\"INITIALIZING LWT CLIENT\")\n lwtData[\"client\"].username_pw_set(username=\"admin\", password=\"columbus\")\n lwtData[\"client\"].will_set(\"meshify/db/194/_/mainHP/\" + mac + \":00:00/connected\",json.dumps({\"value\":False}))\n lwtData[\"init\"] = True\n logger.info(\"Connecting to MQTT Broker for LWT purposes!!!!!!!\")\n lwtData[\"client\"].connect(\"mq194.imistaway.net\",1883, 600)\n #publish(\"meshify/db/194/_/mainHP/00:18:05:1a:e5:37:00:00/connected\", json.dumps({\"value\":True}), __qos__)\n lwtData[\"client\"].publish(\"meshify/db/194/_/mainHP/\" + mac + \":00:00/connected\", json.dumps({\"value\":True}))\n except Exception as e:\n logger.error(\"LWT DID NOT DO THE THING\")\n logger.error(e)\n\ndef sendData(message):\n logger.debug(message)\n mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))\n lwt(mac)\n for measure in message[\"measures\"]:\n publish(__topic__ + mac + \":01:99/\" + measure[\"name\"], json.dumps([{\"value\": measure[\"value\"]}]), __qos__)\n #publish(__topic__, json.dumps({measure[\"name\"]: measure[\"value\"]}), __qos__)\n ",
|
||||
"msgType": 0,
|
||||
"cloudName": "default"
|
||||
}
|
||||
],
|
||||
"downloadFuncs": [
|
||||
{
|
||||
"name": "Commands",
|
||||
"topic": "meshify/sets/194/${MAC_UPPER}:01:99",
|
||||
"qos": 1,
|
||||
"funcName": "receiveCommand",
|
||||
"payload_type": "Plaintext",
|
||||
"script": "# Enter your python code.\nimport json\nfrom quickfaas.measure import recall\nfrom common.Logger import logger\n\ndef sync(mac, wizard_api):\n #get new values and send\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 for measure in controller[\"measures\"]:\n #publish measure\n topic = \"meshify/db/194/_/abbflow/\" + mac + \"/\" + measure[\"name\"]\n payload = [{\"value\": measure[\"value\"]}]\n logger.debug(\"Sending on topic: {}\".format(topic))\n logger.debug(\"Sending value: {}\".format(payload))\n wizard_api.mqtt_publish(topic, json.dumps(payload))\n \ndef receiveCommand(topic, payload, wizard_api):\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)[0]\n command = p[\"payload\"][\"name\"].split(\".\")[1]\n commands = {\n \"sync\": sync\n }\n commands[command](p[\"mac\"].lower(), wizard_api)\n #logger.debug(command)\n ack(p[\"msgId\"], p[\"mac\"], p[\"payload\"][\"name\"].split(\".\")[1], p[\"payload\"][\"value\"], wizard_api)\n\ndef ack(msgid, mac, name, value, wizard_api):\n #logger.debug(mac)\n mac = \"\".join(mac.split(\":\")[:-2])\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"meshify/responses/\" + str(msgid), json.dumps([{\"value\": \"{} Success Setting: {} To: {}\".format(mac,name, value), \"msgid\": str(msgid)}]))",
|
||||
"msgType": 0,
|
||||
"cloudName": "default",
|
||||
"trigger": "command_event"
|
||||
}
|
||||
]
|
||||
},
|
||||
"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": []
|
||||
},
|
||||
"bindConfig": {
|
||||
"enable": 0,
|
||||
"bind": {
|
||||
"modelId": "",
|
||||
"modelName": "",
|
||||
"srcId": "",
|
||||
"srcName": "",
|
||||
"devId": "",
|
||||
"devName": ""
|
||||
},
|
||||
"varGroups": [],
|
||||
"variables": [],
|
||||
"alerts": []
|
||||
},
|
||||
"southMetadata": {},
|
||||
"bindMetadata": {
|
||||
"version": "",
|
||||
"timestamp": ""
|
||||
}
|
||||
}
|
||||
35
Pub_Sub/abbflow/v2/pub/sendData.py
Normal file
35
Pub_Sub/abbflow/v2/pub/sendData.py
Normal file
@@ -0,0 +1,35 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from common.Logger import logger
|
||||
from quickfaas.remotebus import publish
|
||||
import re, uuid
|
||||
from paho.mqtt import client
|
||||
|
||||
lwtData = {
|
||||
"init":False,
|
||||
"client": client.Client(client_id=str(uuid.uuid4()), clean_session=True, userdata=None, protocol=client.MQTTv311, transport="tcp")
|
||||
}
|
||||
def lwt(mac):
|
||||
try:
|
||||
#if not lwtData["connected"]:
|
||||
if not lwtData["init"]:
|
||||
logger.info("INITIALIZING LWT CLIENT")
|
||||
lwtData["client"].username_pw_set(username="admin", password="columbus")
|
||||
lwtData["client"].will_set("meshify/db/194/_/mainHP/" + mac + ":00:00/connected",json.dumps({"value":False}))
|
||||
lwtData["init"] = True
|
||||
logger.info("Connecting to MQTT Broker for LWT purposes!!!!!!!")
|
||||
lwtData["client"].connect("mq194.imistaway.net",1883, 600)
|
||||
#publish("meshify/db/194/_/mainHP/00:18:05:1a:e5:37:00:00/connected", json.dumps({"value":True}), __qos__)
|
||||
lwtData["client"].publish("meshify/db/194/_/mainHP/" + mac + ":00:00/connected", json.dumps({"value":True}))
|
||||
except Exception as e:
|
||||
logger.error("LWT DID NOT DO THE THING")
|
||||
logger.error(e)
|
||||
|
||||
def sendData(message):
|
||||
logger.debug(message)
|
||||
mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))
|
||||
lwt(mac)
|
||||
for measure in message["measures"]:
|
||||
publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps([{"value": measure["value"]}]), __qos__)
|
||||
#publish(__topic__, json.dumps({measure["name"]: measure["value"]}), __qos__)
|
||||
|
||||
41
Pub_Sub/abbflow/v2/sub/receiveCommand.py
Normal file
41
Pub_Sub/abbflow/v2/sub/receiveCommand.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from quickfaas.measure import recall
|
||||
from common.Logger import logger
|
||||
|
||||
def sync(mac, wizard_api):
|
||||
#get new values and send
|
||||
try:
|
||||
data = recall()#json.loads(recall().decode("utf-8"))
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
logger.info(data)
|
||||
for controller in data:
|
||||
for measure in controller["measures"]:
|
||||
#publish measure
|
||||
topic = "meshify/db/194/_/abbflow/" + mac + "/" + measure["name"]
|
||||
payload = [{"value": measure["value"]}]
|
||||
logger.debug("Sending on topic: {}".format(topic))
|
||||
logger.debug("Sending value: {}".format(payload))
|
||||
wizard_api.mqtt_publish(topic, json.dumps(payload))
|
||||
|
||||
def receiveCommand(topic, payload, wizard_api):
|
||||
logger.debug(topic)
|
||||
logger.debug(json.loads(payload))
|
||||
p = json.loads(payload)[0]
|
||||
command = p["payload"]["name"].split(".")[1]
|
||||
commands = {
|
||||
"sync": sync
|
||||
}
|
||||
commands[command](p["mac"].lower(), wizard_api)
|
||||
#logger.debug(command)
|
||||
ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api)
|
||||
|
||||
def ack(msgid, mac, name, value, wizard_api):
|
||||
#logger.debug(mac)
|
||||
mac = "".join(mac.split(":")[:-2])
|
||||
#logger.debug(msgid)
|
||||
#logger.debug(mac)
|
||||
#logger.debug(name)
|
||||
#logger.debug(value)
|
||||
wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}]))
|
||||
BIN
Pub_Sub/advvfdipp/.DS_Store
vendored
Normal file
BIN
Pub_Sub/advvfdipp/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
Pub_Sub/advvfdipp/v1/.DS_Store
vendored
Normal file
BIN
Pub_Sub/advvfdipp/v1/.DS_Store
vendored
Normal file
Binary file not shown.
1051
Pub_Sub/advvfdipp/v1/device_supervisor_advvfdippv1.cfg
Normal file
1051
Pub_Sub/advvfdipp/v1/device_supervisor_advvfdippv1.cfg
Normal file
File diff suppressed because one or more lines are too long
191
Pub_Sub/advvfdipp/v1/pub/sendData.py
Normal file
191
Pub_Sub/advvfdipp/v1/pub/sendData.py
Normal file
@@ -0,0 +1,191 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from common.Logger import logger
|
||||
from quickfaas.remotebus import publish
|
||||
import re, uuid
|
||||
|
||||
|
||||
def sendData(message):
|
||||
#logger.debug(message)
|
||||
mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))
|
||||
for measure in message["measures"]:
|
||||
try:
|
||||
logger.debug(measure)
|
||||
if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault"]:
|
||||
logger.debug("Converting DINT/BOOL to STRING")
|
||||
value = convert_int(measure["name"], measure["value"])
|
||||
logger.debug("Converted {} to {}".format(measure["value"], value))
|
||||
publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": value}), __qos__)
|
||||
else:
|
||||
publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": measure["value"]}), __qos__)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
#publish(__topic__, json.dumps({measure["name"]: measure["value"]}), __qos__)
|
||||
|
||||
def convert_int(plc_tag, value):
|
||||
well_status_codes = {
|
||||
0: "Running",
|
||||
1: "Pumped Off",
|
||||
2: "Alarmed",
|
||||
3: "Locked Out",
|
||||
4: "Stopped"
|
||||
}
|
||||
|
||||
pid_control_codes = {
|
||||
0: "Flow",
|
||||
1: "Fluid Level",
|
||||
2: "Tubing Pressure",
|
||||
3: "Manual"
|
||||
}
|
||||
|
||||
downhole_codes = {
|
||||
0: "OK",
|
||||
1: "Connecting",
|
||||
2: "Open Circuit",
|
||||
3: "Shorted",
|
||||
4: "Cannot Decode"
|
||||
}
|
||||
|
||||
permissive_codes = {
|
||||
0: "OK",
|
||||
1: "Flow",
|
||||
2: "Intake Pressure",
|
||||
3: "Intake Temperature",
|
||||
4: "Tubing Pressure",
|
||||
5: "VFD",
|
||||
6: "Fluid Level",
|
||||
7: "Min. Downtime"
|
||||
}
|
||||
|
||||
alarm_codes = {
|
||||
0: "OK",
|
||||
1: "Alarm"
|
||||
}
|
||||
|
||||
alarm_vfd_codes = {
|
||||
0: "OK",
|
||||
1: "Locked Out"
|
||||
}
|
||||
|
||||
vfd_fault_codes = {
|
||||
0: "No Fault",
|
||||
2: "Auxiliary Input",
|
||||
3: "Power Loss",
|
||||
4: "UnderVoltage",
|
||||
5: "OverVoltage",
|
||||
7: "Motor Overload",
|
||||
8: "Heatsink OverTemp",
|
||||
9: "Thermister OverTemp",
|
||||
10: "Dynamic Brake OverTemp",
|
||||
12: "Hardware OverCurrent",
|
||||
13: "Ground Fault",
|
||||
14: "Ground Warning",
|
||||
15: "Load Loss",
|
||||
17: "Input Phase Loss",
|
||||
18: "Motor PTC Trip",
|
||||
19: "Task Overrun",
|
||||
20: "Torque Prove Speed Band",
|
||||
21: "Output Phase Loss",
|
||||
24: "Decel Inhibit",
|
||||
25: "OverSpeed Limit",
|
||||
26: "Brake Slipped",
|
||||
27: "Torque Prove Conflict",
|
||||
28: "TP Encls Confict",
|
||||
29: "Analog In Loss",
|
||||
33: "Auto Restarts Exhausted",
|
||||
35: "IPM OverCurrent",
|
||||
36: "SW OverCurrent",
|
||||
38: "Phase U to Ground",
|
||||
39: "Phase V to Ground",
|
||||
40: "Phase W to Ground",
|
||||
41: "Phase UV Short",
|
||||
42: "Phase VW Short",
|
||||
43: "Phase WU Short",
|
||||
44: "Phase UNeg to Ground",
|
||||
45: "Phase VNeg to Ground",
|
||||
46: "Phase WNeg to Ground",
|
||||
48: "System Defaulted",
|
||||
49: "Drive Powerup",
|
||||
51: "Clear Fault Queue",
|
||||
55: "Control Board Overtemp",
|
||||
59: "Invalid Code",
|
||||
61: "Shear Pin 1",
|
||||
62: "Shear Pin 2",
|
||||
64: "Drive Overload",
|
||||
66: "OW Torque Level",
|
||||
67: "Pump Off",
|
||||
71: "Port 1 Adapter",
|
||||
72: "Port 2 Adapter",
|
||||
73: "Port 3 Adapter",
|
||||
74: "Port 4 Adapter",
|
||||
75: "Port 5 Adapter",
|
||||
76: "Port 6 Adapter",
|
||||
77: "IR Volts Range",
|
||||
78: "FluxAmps Ref Range",
|
||||
79: "Excessive Load",
|
||||
80: "AutoTune Aborted",
|
||||
81: "Port 1 DPI Loss",
|
||||
82: "Port 2 DPI Loss",
|
||||
83: "Port 3 DPI Loss",
|
||||
84: "Port 4 DPI Loss",
|
||||
85: "Port 5 DPI Loss",
|
||||
86: "Port 6 DPI Loss",
|
||||
87: "IXo Voltage Range",
|
||||
91: "Primary Velocity Feedback Loss",
|
||||
93: "Hardware Enable Check",
|
||||
94: "Alternate Velocity Feedback Loss",
|
||||
95: "Auxiliary Velocity Feedback Loss",
|
||||
96: "Position Feedback Loss",
|
||||
97: "Auto Tach Switch",
|
||||
100: "Parameter Checksum",
|
||||
101: "Power Down NVS Blank",
|
||||
102: "NVS Not Blank",
|
||||
103: "Power Down NVS Incompatible",
|
||||
104: "Power Board Checksum",
|
||||
106: "Incompat MCB-PB",
|
||||
107: "Replaced MCB-PB",
|
||||
108: "Analog Calibration Checksum",
|
||||
110: "Invalid Power Board Data",
|
||||
111: "Power Board Invalid ID",
|
||||
112: "Power Board App Min Version",
|
||||
113: "Tracking DataError",
|
||||
115: "Power Down Table Full",
|
||||
116: "Power Down Entry Too Large",
|
||||
117: "Power Down Data Checksum",
|
||||
118: "Power Board Power Down Checksum",
|
||||
124: "App ID Changed",
|
||||
125: "Using Backup App",
|
||||
134: "Start on Power Up",
|
||||
137: "External Precharge Error",
|
||||
138: "Precharge Open",
|
||||
141: "Autotune Enc Angle",
|
||||
142: "Autotune Speed Restricted",
|
||||
143: "Autotune Current Regulator",
|
||||
144: "Autotune Inertia",
|
||||
145: "Autotune Travel",
|
||||
13035: "Net IO Timeout",
|
||||
13037: "Net IO Timeout"
|
||||
|
||||
}
|
||||
|
||||
plc_tags = {
|
||||
"wellstatus": well_status_codes.get(value, "Invalid Code"),
|
||||
"pidcontrolmode": pid_control_codes.get(value, "Invalid Code"),
|
||||
"downholesensorstatus": downhole_codes.get(value, "Invalid Code"),
|
||||
"alarmflowrate": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmintakepressure": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmintaketemperature": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmtubingpressure": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmvfd": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"),
|
||||
"alarmfluidlevel": alarm_codes.get(value, "Invalid Code"),
|
||||
"runpermissive": permissive_codes.get(value, "Invalid Code"),
|
||||
"startpermissive": permissive_codes.get(value, "Invalid Code"),
|
||||
"last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"),
|
||||
"vfd_fault": vfd_fault_codes.get(value, "Invalid Code")
|
||||
}
|
||||
|
||||
return plc_tags.get(plc_tag, "Invalid Tag")
|
||||
|
||||
|
||||
50
Pub_Sub/advvfdipp/v1/sub/receiveCommand.py
Normal file
50
Pub_Sub/advvfdipp/v1/sub/receiveCommand.py
Normal file
@@ -0,0 +1,50 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from quickfaas.measure import recall
|
||||
from common.Logger import logger
|
||||
|
||||
def sync(mac,value, wizard_api):
|
||||
#get new values and send
|
||||
try:
|
||||
data = recall()#json.loads(recall().decode("utf-8"))
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
logger.info(data)
|
||||
for controller in data:
|
||||
for measure in controller["measures"]:
|
||||
#publish measure
|
||||
topic = "meshify/db/194/_/abbflow/" + mac + "/" + measure["name"]
|
||||
payload = [{"value": measure["value"]}]
|
||||
logger.debug("Sending on topic: {}".format(topic))
|
||||
logger.debug("Sending value: {}".format(payload))
|
||||
wizard_api.mqtt_publish(topic, json.dumps(payload))
|
||||
def writeplctag(mac, value, wizard_api):
|
||||
try:
|
||||
value = json.loads(value.replace("'",'"'))
|
||||
logger.debug(value)
|
||||
message = {"advvfdipp":{value["tag"]: value["val"]}}
|
||||
wizard_api.write_plc_values(message)
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
|
||||
def receiveCommand(topic, payload, wizard_api):
|
||||
logger.debug(topic)
|
||||
logger.debug(json.loads(payload))
|
||||
p = json.loads(payload)[0]
|
||||
command = p["payload"]["name"].split(".")[1]
|
||||
commands = {
|
||||
"sync": sync,
|
||||
"writeplctag": writeplctag,
|
||||
}
|
||||
commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api)
|
||||
#logger.debug(command)
|
||||
ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api)
|
||||
|
||||
def ack(msgid, mac, name, value, wizard_api):
|
||||
#logger.debug(mac)
|
||||
mac = "".join(mac.split(":")[:-2])
|
||||
#logger.debug(msgid)
|
||||
#logger.debug(mac)
|
||||
#logger.debug(name)
|
||||
#logger.debug(value)
|
||||
wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}]))
|
||||
BIN
Pub_Sub/advvfdipp/v2/.DS_Store
vendored
Normal file
BIN
Pub_Sub/advvfdipp/v2/.DS_Store
vendored
Normal file
Binary file not shown.
1051
Pub_Sub/advvfdipp/v2/device_supervisor_advvfdippv2.cfg
Normal file
1051
Pub_Sub/advvfdipp/v2/device_supervisor_advvfdippv2.cfg
Normal file
File diff suppressed because one or more lines are too long
211
Pub_Sub/advvfdipp/v2/pub/sendData.py
Normal file
211
Pub_Sub/advvfdipp/v2/pub/sendData.py
Normal file
@@ -0,0 +1,211 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from common.Logger import logger
|
||||
from quickfaas.remotebus import publish
|
||||
import re, uuid
|
||||
from paho.mqtt import client
|
||||
|
||||
lwtData = {
|
||||
"init":False,
|
||||
"client": client.Client(client_id=str(uuid.uuid4()), clean_session=True, userdata=None, protocol=client.MQTTv311, transport="tcp")
|
||||
}
|
||||
def lwt(mac):
|
||||
try:
|
||||
#if not lwtData["connected"]:
|
||||
if not lwtData["init"]:
|
||||
logger.info("INITIALIZING LWT CLIENT")
|
||||
lwtData["client"].username_pw_set(username="admin", password="columbus")
|
||||
lwtData["client"].will_set("meshify/db/194/_/mainHP/" + mac + ":00:00/connected",json.dumps({"value":False}))
|
||||
lwtData["init"] = True
|
||||
logger.info("Connecting to MQTT Broker for LWT purposes!!!!!!!")
|
||||
lwtData["client"].connect("mq194.imistaway.net",1883, 600)
|
||||
lwtData["client"].publish("meshify/db/194/_/mainHP/" + mac + ":00:00/connected", json.dumps({"value":True}))
|
||||
except Exception as e:
|
||||
logger.error("LWT DID NOT DO THE THING")
|
||||
logger.error(e)
|
||||
|
||||
def sendData(message):
|
||||
#logger.debug(message)
|
||||
mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))
|
||||
lwt(mac)
|
||||
for measure in message["measures"]:
|
||||
try:
|
||||
logger.debug(measure)
|
||||
if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault"]:
|
||||
logger.debug("Converting DINT/BOOL to STRING")
|
||||
value = convert_int(measure["name"], measure["value"])
|
||||
logger.debug("Converted {} to {}".format(measure["value"], value))
|
||||
publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": value}), __qos__)
|
||||
else:
|
||||
publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": measure["value"]}), __qos__)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
#publish(__topic__, json.dumps({measure["name"]: measure["value"]}), __qos__)
|
||||
|
||||
def convert_int(plc_tag, value):
|
||||
well_status_codes = {
|
||||
0: "Running",
|
||||
1: "Pumped Off",
|
||||
2: "Alarmed",
|
||||
3: "Locked Out",
|
||||
4: "Stopped"
|
||||
}
|
||||
|
||||
pid_control_codes = {
|
||||
0: "Flow",
|
||||
1: "Fluid Level",
|
||||
2: "Tubing Pressure",
|
||||
3: "Manual"
|
||||
}
|
||||
|
||||
downhole_codes = {
|
||||
0: "OK",
|
||||
1: "Connecting",
|
||||
2: "Open Circuit",
|
||||
3: "Shorted",
|
||||
4: "Cannot Decode"
|
||||
}
|
||||
|
||||
permissive_codes = {
|
||||
0: "OK",
|
||||
1: "Flow",
|
||||
2: "Intake Pressure",
|
||||
3: "Intake Temperature",
|
||||
4: "Tubing Pressure",
|
||||
5: "VFD",
|
||||
6: "Fluid Level",
|
||||
7: "Min. Downtime"
|
||||
}
|
||||
|
||||
alarm_codes = {
|
||||
0: "OK",
|
||||
1: "Alarm"
|
||||
}
|
||||
|
||||
alarm_vfd_codes = {
|
||||
0: "OK",
|
||||
1: "Locked Out"
|
||||
}
|
||||
|
||||
vfd_fault_codes = {
|
||||
0: "No Fault",
|
||||
2: "Auxiliary Input",
|
||||
3: "Power Loss",
|
||||
4: "UnderVoltage",
|
||||
5: "OverVoltage",
|
||||
7: "Motor Overload",
|
||||
8: "Heatsink OverTemp",
|
||||
9: "Thermister OverTemp",
|
||||
10: "Dynamic Brake OverTemp",
|
||||
12: "Hardware OverCurrent",
|
||||
13: "Ground Fault",
|
||||
14: "Ground Warning",
|
||||
15: "Load Loss",
|
||||
17: "Input Phase Loss",
|
||||
18: "Motor PTC Trip",
|
||||
19: "Task Overrun",
|
||||
20: "Torque Prove Speed Band",
|
||||
21: "Output Phase Loss",
|
||||
24: "Decel Inhibit",
|
||||
25: "OverSpeed Limit",
|
||||
26: "Brake Slipped",
|
||||
27: "Torque Prove Conflict",
|
||||
28: "TP Encls Confict",
|
||||
29: "Analog In Loss",
|
||||
33: "Auto Restarts Exhausted",
|
||||
35: "IPM OverCurrent",
|
||||
36: "SW OverCurrent",
|
||||
38: "Phase U to Ground",
|
||||
39: "Phase V to Ground",
|
||||
40: "Phase W to Ground",
|
||||
41: "Phase UV Short",
|
||||
42: "Phase VW Short",
|
||||
43: "Phase WU Short",
|
||||
44: "Phase UNeg to Ground",
|
||||
45: "Phase VNeg to Ground",
|
||||
46: "Phase WNeg to Ground",
|
||||
48: "System Defaulted",
|
||||
49: "Drive Powerup",
|
||||
51: "Clear Fault Queue",
|
||||
55: "Control Board Overtemp",
|
||||
59: "Invalid Code",
|
||||
61: "Shear Pin 1",
|
||||
62: "Shear Pin 2",
|
||||
64: "Drive Overload",
|
||||
66: "OW Torque Level",
|
||||
67: "Pump Off",
|
||||
71: "Port 1 Adapter",
|
||||
72: "Port 2 Adapter",
|
||||
73: "Port 3 Adapter",
|
||||
74: "Port 4 Adapter",
|
||||
75: "Port 5 Adapter",
|
||||
76: "Port 6 Adapter",
|
||||
77: "IR Volts Range",
|
||||
78: "FluxAmps Ref Range",
|
||||
79: "Excessive Load",
|
||||
80: "AutoTune Aborted",
|
||||
81: "Port 1 DPI Loss",
|
||||
82: "Port 2 DPI Loss",
|
||||
83: "Port 3 DPI Loss",
|
||||
84: "Port 4 DPI Loss",
|
||||
85: "Port 5 DPI Loss",
|
||||
86: "Port 6 DPI Loss",
|
||||
87: "IXo Voltage Range",
|
||||
91: "Primary Velocity Feedback Loss",
|
||||
93: "Hardware Enable Check",
|
||||
94: "Alternate Velocity Feedback Loss",
|
||||
95: "Auxiliary Velocity Feedback Loss",
|
||||
96: "Position Feedback Loss",
|
||||
97: "Auto Tach Switch",
|
||||
100: "Parameter Checksum",
|
||||
101: "Power Down NVS Blank",
|
||||
102: "NVS Not Blank",
|
||||
103: "Power Down NVS Incompatible",
|
||||
104: "Power Board Checksum",
|
||||
106: "Incompat MCB-PB",
|
||||
107: "Replaced MCB-PB",
|
||||
108: "Analog Calibration Checksum",
|
||||
110: "Invalid Power Board Data",
|
||||
111: "Power Board Invalid ID",
|
||||
112: "Power Board App Min Version",
|
||||
113: "Tracking DataError",
|
||||
115: "Power Down Table Full",
|
||||
116: "Power Down Entry Too Large",
|
||||
117: "Power Down Data Checksum",
|
||||
118: "Power Board Power Down Checksum",
|
||||
124: "App ID Changed",
|
||||
125: "Using Backup App",
|
||||
134: "Start on Power Up",
|
||||
137: "External Precharge Error",
|
||||
138: "Precharge Open",
|
||||
141: "Autotune Enc Angle",
|
||||
142: "Autotune Speed Restricted",
|
||||
143: "Autotune Current Regulator",
|
||||
144: "Autotune Inertia",
|
||||
145: "Autotune Travel",
|
||||
13035: "Net IO Timeout",
|
||||
13037: "Net IO Timeout"
|
||||
|
||||
}
|
||||
|
||||
plc_tags = {
|
||||
"wellstatus": well_status_codes.get(value, "Invalid Code"),
|
||||
"pidcontrolmode": pid_control_codes.get(value, "Invalid Code"),
|
||||
"downholesensorstatus": downhole_codes.get(value, "Invalid Code"),
|
||||
"alarmflowrate": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmintakepressure": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmintaketemperature": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmtubingpressure": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmvfd": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"),
|
||||
"alarmfluidlevel": alarm_codes.get(value, "Invalid Code"),
|
||||
"runpermissive": permissive_codes.get(value, "Invalid Code"),
|
||||
"startpermissive": permissive_codes.get(value, "Invalid Code"),
|
||||
"last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"),
|
||||
"vfd_fault": vfd_fault_codes.get(value, "Invalid Code")
|
||||
}
|
||||
|
||||
return plc_tags.get(plc_tag, "Invalid Tag")
|
||||
|
||||
|
||||
218
Pub_Sub/advvfdipp/v2/sub/receiveCommand.py
Normal file
218
Pub_Sub/advvfdipp/v2/sub/receiveCommand.py
Normal file
@@ -0,0 +1,218 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from quickfaas.measure import recall
|
||||
from common.Logger import logger
|
||||
|
||||
def sync(mac,value, wizard_api):
|
||||
#get new values and send
|
||||
try:
|
||||
data = recall()#json.loads(recall().decode("utf-8"))
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
logger.info(data)
|
||||
for controller in data:
|
||||
for measure in controller["measures"]:
|
||||
#publish measure
|
||||
topic = "meshify/db/194/_/advvfdipp/" + mac + "/" + measure["name"]
|
||||
if measure["name"] in ["wellstatus","pidcontrolmode","downholesensorstatus","alarmflowrate","alarmintakepressure","alarmintaketemperature","alarmtubingpressure","alarmvfd","alarmlockout","alarmfluidlevel","runpermissive","startpermissive","last_vfd_fault_code","vfd_fault"]:
|
||||
payload = [{"value": convert_int(measure["name"], measure["value"])}]
|
||||
else:
|
||||
payload = [{"value": measure["value"]}]
|
||||
logger.debug("Sending on topic: {}".format(topic))
|
||||
logger.debug("Sending value: {}".format(payload))
|
||||
wizard_api.mqtt_publish(topic, json.dumps(payload))
|
||||
def writeplctag(mac, value, wizard_api):
|
||||
try:
|
||||
value = json.loads(value.replace("'",'"'))
|
||||
logger.debug(value)
|
||||
message = {"advvfdipp":{value["tag"]: value["val"]}}
|
||||
wizard_api.write_plc_values(message)
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
|
||||
def receiveCommand(topic, payload, wizard_api):
|
||||
logger.debug(topic)
|
||||
logger.debug(json.loads(payload))
|
||||
p = json.loads(payload)[0]
|
||||
command = p["payload"]["name"].split(".")[1]
|
||||
commands = {
|
||||
"sync": sync,
|
||||
"writeplctag": writeplctag,
|
||||
}
|
||||
commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api)
|
||||
#logger.debug(command)
|
||||
ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api)
|
||||
|
||||
def ack(msgid, mac, name, value, wizard_api):
|
||||
#logger.debug(mac)
|
||||
mac = "".join(mac.split(":")[:-2])
|
||||
#logger.debug(msgid)
|
||||
#logger.debug(mac)
|
||||
#logger.debug(name)
|
||||
#logger.debug(value)
|
||||
wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}]))
|
||||
|
||||
def convert_int(plc_tag, value):
|
||||
well_status_codes = {
|
||||
0: "Running",
|
||||
1: "Pumped Off",
|
||||
2: "Alarmed",
|
||||
3: "Locked Out",
|
||||
4: "Stopped"
|
||||
}
|
||||
|
||||
pid_control_codes = {
|
||||
0: "Flow",
|
||||
1: "Fluid Level",
|
||||
2: "Tubing Pressure",
|
||||
3: "Manual"
|
||||
}
|
||||
|
||||
downhole_codes = {
|
||||
0: "OK",
|
||||
1: "Connecting",
|
||||
2: "Open Circuit",
|
||||
3: "Shorted",
|
||||
4: "Cannot Decode"
|
||||
}
|
||||
|
||||
permissive_codes = {
|
||||
0: "OK",
|
||||
1: "Flow",
|
||||
2: "Intake Pressure",
|
||||
3: "Intake Temperature",
|
||||
4: "Tubing Pressure",
|
||||
5: "VFD",
|
||||
6: "Fluid Level",
|
||||
7: "Min. Downtime"
|
||||
}
|
||||
|
||||
alarm_codes = {
|
||||
0: "OK",
|
||||
1: "Alarm"
|
||||
}
|
||||
|
||||
alarm_vfd_codes = {
|
||||
0: "OK",
|
||||
1: "Locked Out"
|
||||
}
|
||||
|
||||
vfd_fault_codes = {
|
||||
0: "No Fault",
|
||||
2: "Auxiliary Input",
|
||||
3: "Power Loss",
|
||||
4: "UnderVoltage",
|
||||
5: "OverVoltage",
|
||||
7: "Motor Overload",
|
||||
8: "Heatsink OverTemp",
|
||||
9: "Thermister OverTemp",
|
||||
10: "Dynamic Brake OverTemp",
|
||||
12: "Hardware OverCurrent",
|
||||
13: "Ground Fault",
|
||||
14: "Ground Warning",
|
||||
15: "Load Loss",
|
||||
17: "Input Phase Loss",
|
||||
18: "Motor PTC Trip",
|
||||
19: "Task Overrun",
|
||||
20: "Torque Prove Speed Band",
|
||||
21: "Output Phase Loss",
|
||||
24: "Decel Inhibit",
|
||||
25: "OverSpeed Limit",
|
||||
26: "Brake Slipped",
|
||||
27: "Torque Prove Conflict",
|
||||
28: "TP Encls Confict",
|
||||
29: "Analog In Loss",
|
||||
33: "Auto Restarts Exhausted",
|
||||
35: "IPM OverCurrent",
|
||||
36: "SW OverCurrent",
|
||||
38: "Phase U to Ground",
|
||||
39: "Phase V to Ground",
|
||||
40: "Phase W to Ground",
|
||||
41: "Phase UV Short",
|
||||
42: "Phase VW Short",
|
||||
43: "Phase WU Short",
|
||||
44: "Phase UNeg to Ground",
|
||||
45: "Phase VNeg to Ground",
|
||||
46: "Phase WNeg to Ground",
|
||||
48: "System Defaulted",
|
||||
49: "Drive Powerup",
|
||||
51: "Clear Fault Queue",
|
||||
55: "Control Board Overtemp",
|
||||
59: "Invalid Code",
|
||||
61: "Shear Pin 1",
|
||||
62: "Shear Pin 2",
|
||||
64: "Drive Overload",
|
||||
66: "OW Torque Level",
|
||||
67: "Pump Off",
|
||||
71: "Port 1 Adapter",
|
||||
72: "Port 2 Adapter",
|
||||
73: "Port 3 Adapter",
|
||||
74: "Port 4 Adapter",
|
||||
75: "Port 5 Adapter",
|
||||
76: "Port 6 Adapter",
|
||||
77: "IR Volts Range",
|
||||
78: "FluxAmps Ref Range",
|
||||
79: "Excessive Load",
|
||||
80: "AutoTune Aborted",
|
||||
81: "Port 1 DPI Loss",
|
||||
82: "Port 2 DPI Loss",
|
||||
83: "Port 3 DPI Loss",
|
||||
84: "Port 4 DPI Loss",
|
||||
85: "Port 5 DPI Loss",
|
||||
86: "Port 6 DPI Loss",
|
||||
87: "IXo Voltage Range",
|
||||
91: "Primary Velocity Feedback Loss",
|
||||
93: "Hardware Enable Check",
|
||||
94: "Alternate Velocity Feedback Loss",
|
||||
95: "Auxiliary Velocity Feedback Loss",
|
||||
96: "Position Feedback Loss",
|
||||
97: "Auto Tach Switch",
|
||||
100: "Parameter Checksum",
|
||||
101: "Power Down NVS Blank",
|
||||
102: "NVS Not Blank",
|
||||
103: "Power Down NVS Incompatible",
|
||||
104: "Power Board Checksum",
|
||||
106: "Incompat MCB-PB",
|
||||
107: "Replaced MCB-PB",
|
||||
108: "Analog Calibration Checksum",
|
||||
110: "Invalid Power Board Data",
|
||||
111: "Power Board Invalid ID",
|
||||
112: "Power Board App Min Version",
|
||||
113: "Tracking DataError",
|
||||
115: "Power Down Table Full",
|
||||
116: "Power Down Entry Too Large",
|
||||
117: "Power Down Data Checksum",
|
||||
118: "Power Board Power Down Checksum",
|
||||
124: "App ID Changed",
|
||||
125: "Using Backup App",
|
||||
134: "Start on Power Up",
|
||||
137: "External Precharge Error",
|
||||
138: "Precharge Open",
|
||||
141: "Autotune Enc Angle",
|
||||
142: "Autotune Speed Restricted",
|
||||
143: "Autotune Current Regulator",
|
||||
144: "Autotune Inertia",
|
||||
145: "Autotune Travel",
|
||||
13035: "Net IO Timeout",
|
||||
13037: "Net IO Timeout"
|
||||
|
||||
}
|
||||
|
||||
plc_tags = {
|
||||
"wellstatus": well_status_codes.get(value, "Invalid Code"),
|
||||
"pidcontrolmode": pid_control_codes.get(value, "Invalid Code"),
|
||||
"downholesensorstatus": downhole_codes.get(value, "Invalid Code"),
|
||||
"alarmflowrate": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmintakepressure": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmintaketemperature": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmtubingpressure": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmvfd": alarm_codes.get(value, "Invalid Code"),
|
||||
"alarmlockout": alarm_vfd_codes.get(value, "Invalid Code"),
|
||||
"alarmfluidlevel": alarm_codes.get(value, "Invalid Code"),
|
||||
"runpermissive": permissive_codes.get(value, "Invalid Code"),
|
||||
"startpermissive": permissive_codes.get(value, "Invalid Code"),
|
||||
"last_vfd_fault_code": vfd_fault_codes.get(value, "Invalid Code"),
|
||||
"vfd_fault": vfd_fault_codes.get(value, "Invalid Code")
|
||||
}
|
||||
|
||||
return plc_tags.get(plc_tag, "Invalid Tag")
|
||||
40
Pub_Sub/convert_config.py
Normal file
40
Pub_Sub/convert_config.py
Normal file
@@ -0,0 +1,40 @@
|
||||
import os
|
||||
import json
|
||||
|
||||
def get_config(path):
|
||||
with open(path, "r") as f:
|
||||
return json.load(f)
|
||||
|
||||
def get_config_pub(path):
|
||||
with open(path, "r") as f:
|
||||
codeString = json.load(f)
|
||||
return codeString["quickfaas"]["uploadFuncs"][0]["script"]
|
||||
|
||||
def get_config_sub(path):
|
||||
with open(path, "r") as f:
|
||||
codeString = json.load(f)
|
||||
return codeString["quickfaas"]["downloadFuncs"][0]["script"]
|
||||
|
||||
def code_to_string(path):
|
||||
with open(path, "r") as f:
|
||||
return f.read()
|
||||
|
||||
def write_code(path, codestr):
|
||||
with open(path, "w") as f:
|
||||
f.write(codestr)
|
||||
|
||||
def write_config(path, config, pub, sub):
|
||||
with open(path, "w") as f:
|
||||
config["quickfaas"]["uploadFuncs"][0]["script"] = pub
|
||||
config["quickfaas"]["downloadFuncs"][0]["script"] = sub
|
||||
json.dump(config, f, indent=4)
|
||||
|
||||
root = os.getcwd()
|
||||
devicetype = "rigpump"
|
||||
startversion = 3
|
||||
deviceconfig = "device_supervisor_" + devicetype +"v" + str(startversion) + ".cfg"
|
||||
|
||||
#write_code(root + "/" + devicetype + "/v" + str(startversion) + "/pub" + "/sendData.py", get_config_pub(root + "/" + devicetype + "/v" + str(startversion) + "/" + deviceconfig))
|
||||
#write_code(root + "/" + devicetype + "/v" + str(startversion) + "/sub" + "/receiveCommand.py", get_config_sub(root + "/" + devicetype + "/v" + str(startversion) + "/" + deviceconfig))
|
||||
|
||||
write_config(root + "/" + devicetype + "/v" + str(startversion + 1) + "/device_supervisor_" + devicetype + "v" + str(startversion + 1) + ".cfg", get_config(root + "/" + devicetype + "/v" + str(startversion) + "/device_supervisor_" + devicetype + "v" + str(startversion) + ".cfg"), code_to_string(root + "/" + devicetype + "/v" + str(startversion + 1) + "/pub" + "/sendData.py"), code_to_string(root + "/" + devicetype + "/v" + str(startversion + 1) + "/sub" + "/receiveCommand.py"))
|
||||
BIN
Pub_Sub/recycle_train/.DS_Store
vendored
Normal file
BIN
Pub_Sub/recycle_train/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
Pub_Sub/recycle_train/v1/.DS_Store
vendored
Normal file
BIN
Pub_Sub/recycle_train/v1/.DS_Store
vendored
Normal file
Binary file not shown.
786
Pub_Sub/recycle_train/v1/device_supervisor_recycle_trainv1.cfg
Normal file
786
Pub_Sub/recycle_train/v1/device_supervisor_recycle_trainv1.cfg
Normal file
@@ -0,0 +1,786 @@
|
||||
{
|
||||
"controllers": [
|
||||
{
|
||||
"protocol": "EtherNet/IP",
|
||||
"name": "recycle_train",
|
||||
"samplePeriod": 10,
|
||||
"expired": 10000,
|
||||
"endpoint": "192.168.1.10:44818",
|
||||
"args": {}
|
||||
}
|
||||
],
|
||||
"measures": [
|
||||
{
|
||||
"name": "clearwell_level",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rLIT_201",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "clearwell_pressure",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rPIT_201",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_disconnect",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "bDS041",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_running",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "bMA041",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_start",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "bMS041",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_faulted",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "bXA041",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_flow",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rFIT_201",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_speed_demand_percent",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rSC041",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_frequency",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rST041",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_speed_percent",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rST041pct",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "remote_comm",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "Alarm_Comm_Fail_Remote_Pod_1_Loss",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "remote_ast_0",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Remote_1_Data[0]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "remote_ast_1",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Remote_1_Data[1]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "remote_ast_2",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Remote_1_Data[2]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "remote_ast_3",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Remote_1_Data[3]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "remote_ast_4",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Remote_1_Data[4]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "remote_enabled",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "Remote_Pod_1_Enable",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "outlet_flow_eu_max",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_EU_Max",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "outlet_flow_eu_min",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_EU_Min",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_flow_rate_bpd",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_FR",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_flow_rate_gpm",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_FR_GPM",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_flow_pressure",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_PV",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_flow_life_net_bpd",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_TA",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_life_fwd_bpd",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_TB",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_life_rvs_bpd",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_TC",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_ready",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "bEffluentReady",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_shutdown",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "bShutdownEffluentPump",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_faulted",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "bXA042",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_speed_demand_percent",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rSC042",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_frequency",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rST042",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_speed_percent",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rST042pct",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_today_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Influent_Totalizer.Today_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_yesterday_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Influent_Totalizer.Yesterdays_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_month_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Influent_Totalizer.Monthlys_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_prevmonth_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Influent_Totalizer.PrevMonthlys_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_today_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Effluent_Totalizer.Today_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_yesterday_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Effluent_Totalizer.Yesterdays_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_month_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Effluent_Totalizer.Monthlys_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_prevmonth_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Effluent_Totalizer.PrevMonthlys_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "train_1_ast_level",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[0]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "train_2_ast_level",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[1]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "wtf_inlet_flow_rate",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[2]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "wtf_totalizer",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[3]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "wtf_today_totalizer",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[5]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "wtf_yesterday_totalizer",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[6]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "wtf_month_totalizer",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[7]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "wtf_prev_month_totalizer",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[8]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
}
|
||||
],
|
||||
"alarmLables": [
|
||||
"default"
|
||||
],
|
||||
"alarms": [],
|
||||
"groups": [
|
||||
{
|
||||
"name": "default",
|
||||
"uploadInterval": 600,
|
||||
"reference": 44
|
||||
}
|
||||
],
|
||||
"misc": {
|
||||
"maxAlarmRecordSz": 2000,
|
||||
"logLvl": "DEBUG",
|
||||
"coms": [
|
||||
{
|
||||
"name": "rs232",
|
||||
"baud": 9600,
|
||||
"bits": 8,
|
||||
"stopbits": 1,
|
||||
"parityChk": "n"
|
||||
},
|
||||
{
|
||||
"name": "rs485",
|
||||
"baud": 19200,
|
||||
"bits": 8,
|
||||
"stopbits": 1,
|
||||
"parityChk": "n"
|
||||
}
|
||||
]
|
||||
},
|
||||
"clouds": [
|
||||
{
|
||||
"cacheSize": 100,
|
||||
"enable": 1,
|
||||
"type": "Standard MQTT",
|
||||
"args": {
|
||||
"host": "mq194.imistaway.net",
|
||||
"port": 1883,
|
||||
"clientId": "sv-inhand-demo",
|
||||
"auth": 1,
|
||||
"tls": 0,
|
||||
"cleanSession": 1,
|
||||
"mqttVersion": "v3.1.1",
|
||||
"keepalive": 120,
|
||||
"key": "",
|
||||
"cert": "",
|
||||
"rootCA": "",
|
||||
"verifyServer": 0,
|
||||
"verifyClient": 0,
|
||||
"username": "admin",
|
||||
"passwd": "columbus",
|
||||
"authType": 1
|
||||
},
|
||||
"name": "default"
|
||||
}
|
||||
],
|
||||
"quickfaas": {
|
||||
"genericFuncs": [],
|
||||
"uploadFuncs": [
|
||||
{
|
||||
"name": "Send Data",
|
||||
"trigger": "measure_event",
|
||||
"topic": "meshify/db/194/_/recycle_train/",
|
||||
"qos": 1,
|
||||
"groups": [
|
||||
"default"
|
||||
],
|
||||
"funcName": "sendData",
|
||||
"script": "# Enter your python code.\nimport json\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nimport re, uuid\n\n\ndef sendData(message):\n #logger.debug(message)\n mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n publish(__topic__ + mac + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": measure[\"value\"]}), __qos__)\n except Exception as e:\n logger.error(e)\n \n #publish(__topic__, json.dumps({measure[\"name\"]: measure[\"value\"]}), __qos__)\n\n\n ",
|
||||
"cloudName": "default",
|
||||
"msgType": 0
|
||||
}
|
||||
],
|
||||
"downloadFuncs": [
|
||||
{
|
||||
"name": "Commands",
|
||||
"topic": "meshify/sets/194/${MAC_UPPER}:01:99",
|
||||
"qos": 1,
|
||||
"funcName": "receiveCommand",
|
||||
"payload_type": "Plaintext",
|
||||
"script": "# Enter your python code.\nimport json\nfrom quickfaas.measure import recall\nfrom common.Logger import logger\n\ndef sync(mac,value, wizard_api):\n #get new values and send\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 for measure in controller[\"measures\"]:\n #publish measure\n topic = \"meshify/db/194/_/rigpump/\" + mac + \"/\" + measure[\"name\"]\n payload = [{\"value\": measure[\"value\"]}]\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(mac, value, wizard_api):\n try:\n value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n message = {\"rigpump\":{value[\"tag\"]: value[\"val\"]}}\n wizard_api.write_plc_values(message)\n except Exception as e:\n logger.debug(e)\n \ndef receiveCommand(topic, payload, wizard_api):\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)[0]\n command = p[\"payload\"][\"name\"].split(\".\")[1]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n }\n commands[command](p[\"mac\"].lower(),p[\"payload\"][\"value\"], wizard_api)\n #logger.debug(command)\n ack(p[\"msgId\"], p[\"mac\"], p[\"payload\"][\"name\"].split(\".\")[1], p[\"payload\"][\"value\"], wizard_api)\n\ndef ack(msgid, mac, name, value, wizard_api):\n #logger.debug(mac)\n mac = \"\".join(mac.split(\":\")[:-2])\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"meshify/responses/\" + str(msgid), json.dumps([{\"value\": \"{} Success Setting: {} To: {}\".format(mac,name, value), \"msgid\": str(msgid)}]))",
|
||||
"msgType": 0,
|
||||
"trigger": "command_event",
|
||||
"cloudName": "default"
|
||||
}
|
||||
]
|
||||
},
|
||||
"labels": [
|
||||
{
|
||||
"key": "SN",
|
||||
"value": "GF5022137006251"
|
||||
},
|
||||
{
|
||||
"key": "MAC",
|
||||
"value": "00:18:05:1a:e5:36"
|
||||
},
|
||||
{
|
||||
"key": "MAC_UPPER",
|
||||
"value": "00:18:05:1A:E5:37"
|
||||
}
|
||||
],
|
||||
"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": []
|
||||
},
|
||||
"version": "2.2.1"
|
||||
}
|
||||
21
Pub_Sub/recycle_train/v1/pub/sendData.py
Normal file
21
Pub_Sub/recycle_train/v1/pub/sendData.py
Normal file
@@ -0,0 +1,21 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from common.Logger import logger
|
||||
from quickfaas.remotebus import publish
|
||||
import re, uuid
|
||||
|
||||
|
||||
def sendData(message):
|
||||
#logger.debug(message)
|
||||
mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))
|
||||
for measure in message["measures"]:
|
||||
try:
|
||||
logger.debug(measure)
|
||||
publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": measure["value"]}), __qos__)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
#publish(__topic__, json.dumps({measure["name"]: measure["value"]}), __qos__)
|
||||
|
||||
|
||||
|
||||
50
Pub_Sub/recycle_train/v1/sub/receiveCommand.py
Normal file
50
Pub_Sub/recycle_train/v1/sub/receiveCommand.py
Normal file
@@ -0,0 +1,50 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from quickfaas.measure import recall
|
||||
from common.Logger import logger
|
||||
|
||||
def sync(mac,value, wizard_api):
|
||||
#get new values and send
|
||||
try:
|
||||
data = recall()#json.loads(recall().decode("utf-8"))
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
logger.info(data)
|
||||
for controller in data:
|
||||
for measure in controller["measures"]:
|
||||
#publish measure
|
||||
topic = "meshify/db/194/_/rigpump/" + mac + "/" + measure["name"]
|
||||
payload = [{"value": measure["value"]}]
|
||||
logger.debug("Sending on topic: {}".format(topic))
|
||||
logger.debug("Sending value: {}".format(payload))
|
||||
wizard_api.mqtt_publish(topic, json.dumps(payload))
|
||||
def writeplctag(mac, value, wizard_api):
|
||||
try:
|
||||
value = json.loads(value.replace("'",'"'))
|
||||
logger.debug(value)
|
||||
message = {"rigpump":{value["tag"]: value["val"]}}
|
||||
wizard_api.write_plc_values(message)
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
|
||||
def receiveCommand(topic, payload, wizard_api):
|
||||
logger.debug(topic)
|
||||
logger.debug(json.loads(payload))
|
||||
p = json.loads(payload)[0]
|
||||
command = p["payload"]["name"].split(".")[1]
|
||||
commands = {
|
||||
"sync": sync,
|
||||
"writeplctag": writeplctag,
|
||||
}
|
||||
commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api)
|
||||
#logger.debug(command)
|
||||
ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api)
|
||||
|
||||
def ack(msgid, mac, name, value, wizard_api):
|
||||
#logger.debug(mac)
|
||||
mac = "".join(mac.split(":")[:-2])
|
||||
#logger.debug(msgid)
|
||||
#logger.debug(mac)
|
||||
#logger.debug(name)
|
||||
#logger.debug(value)
|
||||
wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}]))
|
||||
BIN
Pub_Sub/recycle_train/v2/.DS_Store
vendored
Normal file
BIN
Pub_Sub/recycle_train/v2/.DS_Store
vendored
Normal file
Binary file not shown.
786
Pub_Sub/recycle_train/v2/device_supervisor_recycle_trainv2.cfg
Normal file
786
Pub_Sub/recycle_train/v2/device_supervisor_recycle_trainv2.cfg
Normal file
@@ -0,0 +1,786 @@
|
||||
{
|
||||
"controllers": [
|
||||
{
|
||||
"protocol": "EtherNet/IP",
|
||||
"name": "recycle_train",
|
||||
"samplePeriod": 10,
|
||||
"expired": 10000,
|
||||
"endpoint": "192.168.1.10:44818",
|
||||
"args": {}
|
||||
}
|
||||
],
|
||||
"measures": [
|
||||
{
|
||||
"name": "clearwell_level",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rLIT_201",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "clearwell_pressure",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rPIT_201",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_disconnect",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "bDS041",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_running",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "bMA041",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_start",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "bMS041",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_faulted",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "bXA041",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_flow",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rFIT_201",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_speed_demand_percent",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rSC041",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_frequency",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rST041",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_speed_percent",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rST041pct",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "remote_comm",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "Alarm_Comm_Fail_Remote_Pod_1_Loss",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "remote_ast_0",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Remote_1_Data[0]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "remote_ast_1",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Remote_1_Data[1]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "remote_ast_2",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Remote_1_Data[2]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "remote_ast_3",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Remote_1_Data[3]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "remote_ast_4",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Remote_1_Data[4]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "remote_enabled",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "Remote_Pod_1_Enable",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "outlet_flow_eu_max",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_EU_Max",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "outlet_flow_eu_min",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_EU_Min",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_flow_rate_bpd",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_FR",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_flow_rate_gpm",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_FR_GPM",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_flow_pressure",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_PV",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_flow_life_net_bpd",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_TA",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_life_fwd_bpd",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_TB",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_life_rvs_bpd",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Outlet_Flow_Meter_TC",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_ready",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "bEffluentReady",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_shutdown",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "bShutdownEffluentPump",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_faulted",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "bXA042",
|
||||
"bitMap": 0,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_speed_demand_percent",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rSC042",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_frequency",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rST042",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_speed_percent",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "rST042pct",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_today_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Influent_Totalizer.Today_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_yesterday_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Influent_Totalizer.Yesterdays_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_month_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Influent_Totalizer.Monthlys_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "influent_prevmonth_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Influent_Totalizer.PrevMonthlys_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_today_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Effluent_Totalizer.Today_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_yesterday_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Effluent_Totalizer.Yesterdays_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_month_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Effluent_Totalizer.Monthlys_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "effluent_prevmonth_total",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Effluent_Totalizer.PrevMonthlys_TotalFlow",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "train_1_ast_level",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[0]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "train_2_ast_level",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[1]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "wtf_inlet_flow_rate",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[2]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "wtf_totalizer",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[3]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "wtf_today_totalizer",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[5]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "wtf_yesterday_totalizer",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[6]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "wtf_month_totalizer",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[7]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
},
|
||||
{
|
||||
"name": "wtf_prev_month_totalizer",
|
||||
"ctrlName": "recycle_train",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Pod_1_Data[8]",
|
||||
"decimal": 2,
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0
|
||||
}
|
||||
],
|
||||
"alarmLables": [
|
||||
"default"
|
||||
],
|
||||
"alarms": [],
|
||||
"groups": [
|
||||
{
|
||||
"name": "default",
|
||||
"uploadInterval": 600,
|
||||
"reference": 44
|
||||
}
|
||||
],
|
||||
"misc": {
|
||||
"maxAlarmRecordSz": 2000,
|
||||
"logLvl": "DEBUG",
|
||||
"coms": [
|
||||
{
|
||||
"name": "rs232",
|
||||
"baud": 9600,
|
||||
"bits": 8,
|
||||
"stopbits": 1,
|
||||
"parityChk": "n"
|
||||
},
|
||||
{
|
||||
"name": "rs485",
|
||||
"baud": 19200,
|
||||
"bits": 8,
|
||||
"stopbits": 1,
|
||||
"parityChk": "n"
|
||||
}
|
||||
]
|
||||
},
|
||||
"clouds": [
|
||||
{
|
||||
"cacheSize": 100,
|
||||
"enable": 1,
|
||||
"type": "Standard MQTT",
|
||||
"args": {
|
||||
"host": "mq194.imistaway.net",
|
||||
"port": 1883,
|
||||
"clientId": "sv-inhand-demo",
|
||||
"auth": 1,
|
||||
"tls": 0,
|
||||
"cleanSession": 1,
|
||||
"mqttVersion": "v3.1.1",
|
||||
"keepalive": 120,
|
||||
"key": "",
|
||||
"cert": "",
|
||||
"rootCA": "",
|
||||
"verifyServer": 0,
|
||||
"verifyClient": 0,
|
||||
"username": "admin",
|
||||
"passwd": "columbus",
|
||||
"authType": 1
|
||||
},
|
||||
"name": "default"
|
||||
}
|
||||
],
|
||||
"quickfaas": {
|
||||
"genericFuncs": [],
|
||||
"uploadFuncs": [
|
||||
{
|
||||
"name": "Send Data",
|
||||
"trigger": "measure_event",
|
||||
"topic": "meshify/db/194/_/recycle_train/",
|
||||
"qos": 1,
|
||||
"groups": [
|
||||
"default"
|
||||
],
|
||||
"funcName": "sendData",
|
||||
"script": "# Enter your python code.\nimport json\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nimport re, uuid\nfrom paho.mqtt import client\n\nlwtData = {\n \"init\":False,\n \"client\": client.Client(client_id=str(uuid.uuid4()), clean_session=True, userdata=None, protocol=client.MQTTv311, transport=\"tcp\")\n}\ndef lwt(mac):\n try:\n #if not lwtData[\"connected\"]:\n if not lwtData[\"init\"]:\n logger.info(\"INITIALIZING LWT CLIENT\")\n lwtData[\"client\"].username_pw_set(username=\"admin\", password=\"columbus\")\n lwtData[\"client\"].will_set(\"meshify/db/194/_/mainHP/\" + mac + \":00:00/connected\",json.dumps({\"value\":False}))\n lwtData[\"init\"] = True\n logger.info(\"Connecting to MQTT Broker for LWT purposes!!!!!!!\")\n lwtData[\"client\"].connect(\"mq194.imistaway.net\",1883, 600)\n lwtData[\"client\"].publish(\"meshify/db/194/_/mainHP/\" + mac + \":00:00/connected\", json.dumps({\"value\":True}))\n except Exception as e:\n logger.error(\"LWT DID NOT DO THE THING\")\n logger.error(e)\n\ndef sendData(message):\n #logger.debug(message)\n mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))\n lwt(mac)\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n publish(__topic__ + mac + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": measure[\"value\"]}), __qos__)\n except Exception as e:\n logger.error(e)\n \n #publish(__topic__, json.dumps({measure[\"name\"]: measure[\"value\"]}), __qos__)\n\n\n ",
|
||||
"cloudName": "default",
|
||||
"msgType": 0
|
||||
}
|
||||
],
|
||||
"downloadFuncs": [
|
||||
{
|
||||
"name": "Commands",
|
||||
"topic": "meshify/sets/194/${MAC_UPPER}:01:99",
|
||||
"qos": 1,
|
||||
"funcName": "receiveCommand",
|
||||
"payload_type": "Plaintext",
|
||||
"script": "# Enter your python code.\nimport json\nfrom quickfaas.measure import recall\nfrom common.Logger import logger\n\ndef sync(mac,value, wizard_api):\n #get new values and send\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 for measure in controller[\"measures\"]:\n #publish measure\n topic = \"meshify/db/194/_/rigpump/\" + mac + \"/\" + measure[\"name\"]\n payload = [{\"value\": measure[\"value\"]}]\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(mac, value, wizard_api):\n try:\n value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n message = {\"rigpump\":{value[\"tag\"]: value[\"val\"]}}\n wizard_api.write_plc_values(message)\n except Exception as e:\n logger.debug(e)\n \ndef receiveCommand(topic, payload, wizard_api):\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)[0]\n command = p[\"payload\"][\"name\"].split(\".\")[1]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n }\n commands[command](p[\"mac\"].lower(),p[\"payload\"][\"value\"], wizard_api)\n #logger.debug(command)\n ack(p[\"msgId\"], p[\"mac\"], p[\"payload\"][\"name\"].split(\".\")[1], p[\"payload\"][\"value\"], wizard_api)\n\ndef ack(msgid, mac, name, value, wizard_api):\n #logger.debug(mac)\n mac = \"\".join(mac.split(\":\")[:-2])\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"meshify/responses/\" + str(msgid), json.dumps([{\"value\": \"{} Success Setting: {} To: {}\".format(mac,name, value), \"msgid\": str(msgid)}]))",
|
||||
"msgType": 0,
|
||||
"trigger": "command_event",
|
||||
"cloudName": "default"
|
||||
}
|
||||
]
|
||||
},
|
||||
"labels": [
|
||||
{
|
||||
"key": "SN",
|
||||
"value": "GF5022137006251"
|
||||
},
|
||||
{
|
||||
"key": "MAC",
|
||||
"value": "00:18:05:1a:e5:36"
|
||||
},
|
||||
{
|
||||
"key": "MAC_UPPER",
|
||||
"value": "00:18:05:1A:E5:37"
|
||||
}
|
||||
],
|
||||
"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": []
|
||||
},
|
||||
"version": "2.2.1"
|
||||
}
|
||||
BIN
Pub_Sub/recycle_train/v2/pub/.DS_Store
vendored
Normal file
BIN
Pub_Sub/recycle_train/v2/pub/.DS_Store
vendored
Normal file
Binary file not shown.
41
Pub_Sub/recycle_train/v2/pub/sendData.py
Normal file
41
Pub_Sub/recycle_train/v2/pub/sendData.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from common.Logger import logger
|
||||
from quickfaas.remotebus import publish
|
||||
import re, uuid
|
||||
from paho.mqtt import client
|
||||
|
||||
lwtData = {
|
||||
"init":False,
|
||||
"client": client.Client(client_id=str(uuid.uuid4()), clean_session=True, userdata=None, protocol=client.MQTTv311, transport="tcp")
|
||||
}
|
||||
def lwt(mac):
|
||||
try:
|
||||
#if not lwtData["connected"]:
|
||||
if not lwtData["init"]:
|
||||
logger.info("INITIALIZING LWT CLIENT")
|
||||
lwtData["client"].username_pw_set(username="admin", password="columbus")
|
||||
lwtData["client"].will_set("meshify/db/194/_/mainHP/" + mac + ":00:00/connected",json.dumps({"value":False}))
|
||||
lwtData["init"] = True
|
||||
logger.info("Connecting to MQTT Broker for LWT purposes!!!!!!!")
|
||||
lwtData["client"].connect("mq194.imistaway.net",1883, 600)
|
||||
lwtData["client"].publish("meshify/db/194/_/mainHP/" + mac + ":00:00/connected", json.dumps({"value":True}))
|
||||
except Exception as e:
|
||||
logger.error("LWT DID NOT DO THE THING")
|
||||
logger.error(e)
|
||||
|
||||
def sendData(message):
|
||||
#logger.debug(message)
|
||||
mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))
|
||||
lwt(mac)
|
||||
for measure in message["measures"]:
|
||||
try:
|
||||
logger.debug(measure)
|
||||
publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": measure["value"]}), __qos__)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
#publish(__topic__, json.dumps({measure["name"]: measure["value"]}), __qos__)
|
||||
|
||||
|
||||
|
||||
50
Pub_Sub/recycle_train/v2/sub/receiveCommand.py
Normal file
50
Pub_Sub/recycle_train/v2/sub/receiveCommand.py
Normal file
@@ -0,0 +1,50 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from quickfaas.measure import recall
|
||||
from common.Logger import logger
|
||||
|
||||
def sync(mac,value, wizard_api):
|
||||
#get new values and send
|
||||
try:
|
||||
data = recall()#json.loads(recall().decode("utf-8"))
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
logger.info(data)
|
||||
for controller in data:
|
||||
for measure in controller["measures"]:
|
||||
#publish measure
|
||||
topic = "meshify/db/194/_/rigpump/" + mac + "/" + measure["name"]
|
||||
payload = [{"value": measure["value"]}]
|
||||
logger.debug("Sending on topic: {}".format(topic))
|
||||
logger.debug("Sending value: {}".format(payload))
|
||||
wizard_api.mqtt_publish(topic, json.dumps(payload))
|
||||
def writeplctag(mac, value, wizard_api):
|
||||
try:
|
||||
value = json.loads(value.replace("'",'"'))
|
||||
logger.debug(value)
|
||||
message = {"rigpump":{value["tag"]: value["val"]}}
|
||||
wizard_api.write_plc_values(message)
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
|
||||
def receiveCommand(topic, payload, wizard_api):
|
||||
logger.debug(topic)
|
||||
logger.debug(json.loads(payload))
|
||||
p = json.loads(payload)[0]
|
||||
command = p["payload"]["name"].split(".")[1]
|
||||
commands = {
|
||||
"sync": sync,
|
||||
"writeplctag": writeplctag,
|
||||
}
|
||||
commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api)
|
||||
#logger.debug(command)
|
||||
ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api)
|
||||
|
||||
def ack(msgid, mac, name, value, wizard_api):
|
||||
#logger.debug(mac)
|
||||
mac = "".join(mac.split(":")[:-2])
|
||||
#logger.debug(msgid)
|
||||
#logger.debug(mac)
|
||||
#logger.debug(name)
|
||||
#logger.debug(value)
|
||||
wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}]))
|
||||
BIN
Pub_Sub/rigpump/.DS_Store
vendored
Normal file
BIN
Pub_Sub/rigpump/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
Pub_Sub/rigpump/v3/.DS_Store
vendored
Normal file
BIN
Pub_Sub/rigpump/v3/.DS_Store
vendored
Normal file
Binary file not shown.
382
Pub_Sub/rigpump/v3/device_supervisor_rigpumpv3.cfg
Normal file
382
Pub_Sub/rigpump/v3/device_supervisor_rigpumpv3.cfg
Normal file
@@ -0,0 +1,382 @@
|
||||
{
|
||||
"controllers": [
|
||||
{
|
||||
"protocol": "EtherNet/IP",
|
||||
"name": "rigpump",
|
||||
"samplePeriod": 10,
|
||||
"expired": 10000,
|
||||
"endpoint": "192.168.1.10:44818",
|
||||
"args": {}
|
||||
}
|
||||
],
|
||||
"measures": [
|
||||
{
|
||||
"name": "vfd_current",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "VFD_OutCurrent",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "vfd_frequency",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "VFD_SpeedFdbk",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "discharge_pressure",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "val_DischargePressure",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "discharge_pressure_setpoint",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "cfg_PID_DischargePressureSP",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "vfd_frequency_setpoint",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "cfg_PID_ManualSP",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "flow_rate_setpoint",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "cfg_PID_FlowSP",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "auto_manual",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "INT",
|
||||
"addr": "mode_Auto",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "device_status",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "INT",
|
||||
"addr": "RigPump.State",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "auto_control_mode",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "INT",
|
||||
"addr": "controlMode",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "energy_today",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Energy_Total[0]",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "flow_rate",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "val_Flowmeter",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "energy_yesterday",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Energy_Total[1]",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "cmd_Start",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "cmd_Start",
|
||||
"readWrite": "rw",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"bitMap": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "cmd_Stop",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "cmd_Stop",
|
||||
"readWrite": "rw",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"bitMap": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
}
|
||||
],
|
||||
"alarmLables": [
|
||||
"default"
|
||||
],
|
||||
"alarms": [],
|
||||
"groups": [
|
||||
{
|
||||
"name": "default",
|
||||
"uploadInterval": 600,
|
||||
"reference": 44
|
||||
}
|
||||
],
|
||||
"misc": {
|
||||
"maxAlarmRecordSz": 2000,
|
||||
"logLvl": "DEBUG",
|
||||
"coms": [
|
||||
{
|
||||
"name": "rs232",
|
||||
"baud": 9600,
|
||||
"bits": 8,
|
||||
"stopbits": 1,
|
||||
"parityChk": "n"
|
||||
},
|
||||
{
|
||||
"name": "rs485",
|
||||
"baud": 19200,
|
||||
"bits": 8,
|
||||
"stopbits": 1,
|
||||
"parityChk": "n"
|
||||
}
|
||||
]
|
||||
},
|
||||
"clouds": [
|
||||
{
|
||||
"cacheSize": 100,
|
||||
"enable": 1,
|
||||
"type": "Standard MQTT",
|
||||
"args": {
|
||||
"host": "mq194.imistaway.net",
|
||||
"port": 1883,
|
||||
"clientId": "sv-inhand-demo",
|
||||
"auth": 1,
|
||||
"tls": 0,
|
||||
"cleanSession": 1,
|
||||
"mqttVersion": "v3.1.1",
|
||||
"keepalive": 120,
|
||||
"key": "",
|
||||
"cert": "",
|
||||
"rootCA": "",
|
||||
"verifyServer": 0,
|
||||
"verifyClient": 0,
|
||||
"username": "admin",
|
||||
"passwd": "columbus",
|
||||
"authType": 1
|
||||
},
|
||||
"name": "default"
|
||||
}
|
||||
],
|
||||
"quickfaas": {
|
||||
"genericFuncs": [],
|
||||
"uploadFuncs": [
|
||||
{
|
||||
"name": "Send Data",
|
||||
"trigger": "measure_event",
|
||||
"topic": "meshify/db/194/_/rigpump/",
|
||||
"qos": 1,
|
||||
"groups": [
|
||||
"default"
|
||||
],
|
||||
"funcName": "sendData",
|
||||
"script": "# Enter your python code.\nimport json\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nimport re, uuid\n\n\ndef sendData(message):\n #logger.debug(message)\n mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n if measure[\"name\"] in [\"auto_manual\", \"auto_control_mode\", \"device_status\"]:\n logger.debug(\"Converting DINT/BOOL to STRING\")\n value = convert_int(measure[\"name\"], measure[\"value\"])\n logger.debug(\"Converted {} to {}\".format(measure[\"value\"], value))\n publish(__topic__ + mac + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": value}), __qos__)\n else:\n publish(__topic__ + mac + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": measure[\"value\"]}), __qos__)\n except Exception as e:\n logger.error(e)\n \n #publish(__topic__, json.dumps({measure[\"name\"]: measure[\"value\"]}), __qos__)\n\ndef convert_int(plc_tag, value):\n auto_manual = {\n 0: \"Manual\",\n 1: \"Auto\"\n }\n\n auto_control_mode = {\n 0: \"Pressure\",\n 1: \"Flow\"\n }\n\n device_status = {\n 1: \"Running\",\n 64: \"Idle\",\n 128: \"Overpressure\",\n 1024: \"Faulted\"\n }\n\n p\n\n plc_tags = {\n \"auto_manual\": auto_manual.get(value, \"Invalid Code\"),\n \"auto_control_mode\": auto_control_mode.get(value, \"Invalid Code\"),\n \"device_status\": device_status.get(value, \"Invalid Code\"),\n }\n\n return plc_tags.get(plc_tag, \"Invalid Tag\")\n\n ",
|
||||
"cloudName": "default",
|
||||
"msgType": 0
|
||||
}
|
||||
],
|
||||
"downloadFuncs": [
|
||||
{
|
||||
"name": "Commands",
|
||||
"topic": "meshify/sets/194/${MAC_UPPER}:01:99",
|
||||
"qos": 1,
|
||||
"funcName": "receiveCommand",
|
||||
"payload_type": "Plaintext",
|
||||
"script": "# Enter your python code.\nimport json\nfrom quickfaas.measure import recall\nfrom common.Logger import logger\n\ndef sync(mac,value, wizard_api):\n #get new values and send\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 for measure in controller[\"measures\"]:\n #publish measure\n topic = \"meshify/db/194/_/rigpump/\" + mac + \"/\" + measure[\"name\"]\n payload = [{\"value\": measure[\"value\"]}]\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(mac, value, wizard_api):\n try:\n value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n message = {\"rigpump\":{value[\"tag\"]: value[\"val\"]}}\n wizard_api.write_plc_values(message)\n except Exception as e:\n logger.debug(e)\n \ndef receiveCommand(topic, payload, wizard_api):\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)[0]\n command = p[\"payload\"][\"name\"].split(\".\")[1]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n }\n commands[command](p[\"mac\"].lower(),p[\"payload\"][\"value\"], wizard_api)\n #logger.debug(command)\n ack(p[\"msgId\"], p[\"mac\"], p[\"payload\"][\"name\"].split(\".\")[1], p[\"payload\"][\"value\"], wizard_api)\n\ndef ack(msgid, mac, name, value, wizard_api):\n #logger.debug(mac)\n mac = \"\".join(mac.split(\":\")[:-2])\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"meshify/responses/\" + str(msgid), json.dumps([{\"value\": \"{} Success Setting: {} To: {}\".format(mac,name, value), \"msgid\": str(msgid)}]))",
|
||||
"msgType": 0,
|
||||
"trigger": "command_event",
|
||||
"cloudName": "default"
|
||||
}
|
||||
]
|
||||
},
|
||||
"labels": [
|
||||
{
|
||||
"key": "SN",
|
||||
"value": "GF5022137006251"
|
||||
},
|
||||
{
|
||||
"key": "MAC",
|
||||
"value": "00:18:05:1a:e5:36"
|
||||
},
|
||||
{
|
||||
"key": "MAC_UPPER",
|
||||
"value": "00:18:05:1A:E5:37"
|
||||
}
|
||||
],
|
||||
"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": []
|
||||
},
|
||||
"version": "2.2.1"
|
||||
}
|
||||
54
Pub_Sub/rigpump/v3/pub/sendData.py
Normal file
54
Pub_Sub/rigpump/v3/pub/sendData.py
Normal file
@@ -0,0 +1,54 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from common.Logger import logger
|
||||
from quickfaas.remotebus import publish
|
||||
import re, uuid
|
||||
|
||||
|
||||
def sendData(message):
|
||||
#logger.debug(message)
|
||||
mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))
|
||||
for measure in message["measures"]:
|
||||
try:
|
||||
logger.debug(measure)
|
||||
if measure["name"] in ["auto_manual", "auto_control_mode", "device_status"]:
|
||||
logger.debug("Converting DINT/BOOL to STRING")
|
||||
value = convert_int(measure["name"], measure["value"])
|
||||
logger.debug("Converted {} to {}".format(measure["value"], value))
|
||||
publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": value}), __qos__)
|
||||
else:
|
||||
publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": measure["value"]}), __qos__)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
#publish(__topic__, json.dumps({measure["name"]: measure["value"]}), __qos__)
|
||||
|
||||
def convert_int(plc_tag, value):
|
||||
auto_manual = {
|
||||
0: "Manual",
|
||||
1: "Auto"
|
||||
}
|
||||
|
||||
auto_control_mode = {
|
||||
0: "Pressure",
|
||||
1: "Flow"
|
||||
}
|
||||
|
||||
device_status = {
|
||||
1: "Running",
|
||||
64: "Idle",
|
||||
128: "Overpressure",
|
||||
1024: "Faulted"
|
||||
}
|
||||
|
||||
p
|
||||
|
||||
plc_tags = {
|
||||
"auto_manual": auto_manual.get(value, "Invalid Code"),
|
||||
"auto_control_mode": auto_control_mode.get(value, "Invalid Code"),
|
||||
"device_status": device_status.get(value, "Invalid Code"),
|
||||
}
|
||||
|
||||
return plc_tags.get(plc_tag, "Invalid Tag")
|
||||
|
||||
|
||||
50
Pub_Sub/rigpump/v3/sub/receiveCommand.py
Normal file
50
Pub_Sub/rigpump/v3/sub/receiveCommand.py
Normal file
@@ -0,0 +1,50 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from quickfaas.measure import recall
|
||||
from common.Logger import logger
|
||||
|
||||
def sync(mac,value, wizard_api):
|
||||
#get new values and send
|
||||
try:
|
||||
data = recall()#json.loads(recall().decode("utf-8"))
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
logger.info(data)
|
||||
for controller in data:
|
||||
for measure in controller["measures"]:
|
||||
#publish measure
|
||||
topic = "meshify/db/194/_/rigpump/" + mac + "/" + measure["name"]
|
||||
payload = [{"value": measure["value"]}]
|
||||
logger.debug("Sending on topic: {}".format(topic))
|
||||
logger.debug("Sending value: {}".format(payload))
|
||||
wizard_api.mqtt_publish(topic, json.dumps(payload))
|
||||
def writeplctag(mac, value, wizard_api):
|
||||
try:
|
||||
value = json.loads(value.replace("'",'"'))
|
||||
logger.debug(value)
|
||||
message = {"rigpump":{value["tag"]: value["val"]}}
|
||||
wizard_api.write_plc_values(message)
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
|
||||
def receiveCommand(topic, payload, wizard_api):
|
||||
logger.debug(topic)
|
||||
logger.debug(json.loads(payload))
|
||||
p = json.loads(payload)[0]
|
||||
command = p["payload"]["name"].split(".")[1]
|
||||
commands = {
|
||||
"sync": sync,
|
||||
"writeplctag": writeplctag,
|
||||
}
|
||||
commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api)
|
||||
#logger.debug(command)
|
||||
ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api)
|
||||
|
||||
def ack(msgid, mac, name, value, wizard_api):
|
||||
#logger.debug(mac)
|
||||
mac = "".join(mac.split(":")[:-2])
|
||||
#logger.debug(msgid)
|
||||
#logger.debug(mac)
|
||||
#logger.debug(name)
|
||||
#logger.debug(value)
|
||||
wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}]))
|
||||
BIN
Pub_Sub/rigpump/v4/.DS_Store
vendored
Normal file
BIN
Pub_Sub/rigpump/v4/.DS_Store
vendored
Normal file
Binary file not shown.
382
Pub_Sub/rigpump/v4/device_supervisor_rigpumpv4.cfg
Normal file
382
Pub_Sub/rigpump/v4/device_supervisor_rigpumpv4.cfg
Normal file
@@ -0,0 +1,382 @@
|
||||
{
|
||||
"controllers": [
|
||||
{
|
||||
"protocol": "EtherNet/IP",
|
||||
"name": "rigpump",
|
||||
"samplePeriod": 10,
|
||||
"expired": 10000,
|
||||
"endpoint": "192.168.1.10:44818",
|
||||
"args": {}
|
||||
}
|
||||
],
|
||||
"measures": [
|
||||
{
|
||||
"name": "vfd_current",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "VFD_OutCurrent",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "vfd_frequency",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "VFD_SpeedFdbk",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "discharge_pressure",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "val_DischargePressure",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "discharge_pressure_setpoint",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "cfg_PID_DischargePressureSP",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "vfd_frequency_setpoint",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "cfg_PID_ManualSP",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "flow_rate_setpoint",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "cfg_PID_FlowSP",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "auto_manual",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "INT",
|
||||
"addr": "mode_Auto",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "device_status",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "INT",
|
||||
"addr": "RigPump.State",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "auto_control_mode",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "INT",
|
||||
"addr": "controlMode",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "energy_today",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Energy_Total[0]",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "flow_rate",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "val_Flowmeter",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "energy_yesterday",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "FLOAT",
|
||||
"addr": "Energy_Total[1]",
|
||||
"readWrite": "ro",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"decimal": 2,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "cmd_Start",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "cmd_Start",
|
||||
"readWrite": "rw",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"bitMap": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
},
|
||||
{
|
||||
"name": "cmd_Stop",
|
||||
"ctrlName": "rigpump",
|
||||
"group": "default",
|
||||
"uploadType": "periodic",
|
||||
"dataType": "BIT",
|
||||
"addr": "cmd_Stop",
|
||||
"readWrite": "rw",
|
||||
"unit": "",
|
||||
"desc": "",
|
||||
"transformType": 0,
|
||||
"bitMap": 0,
|
||||
"gain": "1.0",
|
||||
"offset": "0.0"
|
||||
}
|
||||
],
|
||||
"alarmLables": [
|
||||
"default"
|
||||
],
|
||||
"alarms": [],
|
||||
"groups": [
|
||||
{
|
||||
"name": "default",
|
||||
"uploadInterval": 600,
|
||||
"reference": 44
|
||||
}
|
||||
],
|
||||
"misc": {
|
||||
"maxAlarmRecordSz": 2000,
|
||||
"logLvl": "DEBUG",
|
||||
"coms": [
|
||||
{
|
||||
"name": "rs232",
|
||||
"baud": 9600,
|
||||
"bits": 8,
|
||||
"stopbits": 1,
|
||||
"parityChk": "n"
|
||||
},
|
||||
{
|
||||
"name": "rs485",
|
||||
"baud": 19200,
|
||||
"bits": 8,
|
||||
"stopbits": 1,
|
||||
"parityChk": "n"
|
||||
}
|
||||
]
|
||||
},
|
||||
"clouds": [
|
||||
{
|
||||
"cacheSize": 100,
|
||||
"enable": 1,
|
||||
"type": "Standard MQTT",
|
||||
"args": {
|
||||
"host": "mq194.imistaway.net",
|
||||
"port": 1883,
|
||||
"clientId": "sv-inhand-demo",
|
||||
"auth": 1,
|
||||
"tls": 0,
|
||||
"cleanSession": 1,
|
||||
"mqttVersion": "v3.1.1",
|
||||
"keepalive": 120,
|
||||
"key": "",
|
||||
"cert": "",
|
||||
"rootCA": "",
|
||||
"verifyServer": 0,
|
||||
"verifyClient": 0,
|
||||
"username": "admin",
|
||||
"passwd": "columbus",
|
||||
"authType": 1
|
||||
},
|
||||
"name": "default"
|
||||
}
|
||||
],
|
||||
"quickfaas": {
|
||||
"genericFuncs": [],
|
||||
"uploadFuncs": [
|
||||
{
|
||||
"name": "Send Data",
|
||||
"trigger": "measure_event",
|
||||
"topic": "meshify/db/194/_/rigpump/",
|
||||
"qos": 1,
|
||||
"groups": [
|
||||
"default"
|
||||
],
|
||||
"funcName": "sendData",
|
||||
"script": "# Enter your python code.\nimport json\nfrom common.Logger import logger\nfrom quickfaas.remotebus import publish\nimport re, uuid\nfrom paho.mqtt import client\n\nlwtData = {\n \"init\":False,\n \"client\": client.Client(client_id=str(uuid.uuid4()), clean_session=True, userdata=None, protocol=client.MQTTv311, transport=\"tcp\")\n}\ndef lwt(mac):\n try:\n #if not lwtData[\"connected\"]:\n if not lwtData[\"init\"]:\n logger.info(\"INITIALIZING LWT CLIENT\")\n lwtData[\"client\"].username_pw_set(username=\"admin\", password=\"columbus\")\n lwtData[\"client\"].will_set(\"meshify/db/194/_/mainHP/\" + mac + \":00:00/connected\",json.dumps({\"value\":False}))\n lwtData[\"init\"] = True\n logger.info(\"Connecting to MQTT Broker for LWT purposes!!!!!!!\")\n lwtData[\"client\"].connect(\"mq194.imistaway.net\",1883, 600)\n lwtData[\"client\"].publish(\"meshify/db/194/_/mainHP/\" + mac + \":00:00/connected\", json.dumps({\"value\":True}))\n except Exception as e:\n logger.error(\"LWT DID NOT DO THE THING\")\n logger.error(e)\n\ndef sendData(message):\n #logger.debug(message)\n mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))\n lwt(mac)\n for measure in message[\"measures\"]:\n try:\n logger.debug(measure)\n if measure[\"name\"] in [\"auto_manual\", \"auto_control_mode\", \"device_status\"]:\n logger.debug(\"Converting DINT/BOOL to STRING\")\n value = convert_int(measure[\"name\"], measure[\"value\"])\n logger.debug(\"Converted {} to {}\".format(measure[\"value\"], value))\n publish(__topic__ + mac + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": value}), __qos__)\n else:\n publish(__topic__ + mac + \":01:99/\" + measure[\"name\"], json.dumps({\"value\": measure[\"value\"]}), __qos__)\n except Exception as e:\n logger.error(e)\n \n #publish(__topic__, json.dumps({measure[\"name\"]: measure[\"value\"]}), __qos__)\n\ndef convert_int(plc_tag, value):\n auto_manual = {\n 0: \"Manual\",\n 1: \"Auto\"\n }\n\n auto_control_mode = {\n 0: \"Pressure\",\n 1: \"Flow\"\n }\n\n device_status = {\n 1: \"Running\",\n 64: \"Idle\",\n 128: \"Overpressure\",\n 1024: \"Faulted\"\n }\n \n plc_tags = {\n \"auto_manual\": auto_manual.get(value, \"Invalid Code\"),\n \"auto_control_mode\": auto_control_mode.get(value, \"Invalid Code\"),\n \"device_status\": device_status.get(value, \"Invalid Code\"),\n }\n\n return plc_tags.get(plc_tag, \"Invalid Tag\")\n\n ",
|
||||
"cloudName": "default",
|
||||
"msgType": 0
|
||||
}
|
||||
],
|
||||
"downloadFuncs": [
|
||||
{
|
||||
"name": "Commands",
|
||||
"topic": "meshify/sets/194/${MAC_UPPER}:01:99",
|
||||
"qos": 1,
|
||||
"funcName": "receiveCommand",
|
||||
"payload_type": "Plaintext",
|
||||
"script": "# Enter your python code.\nimport json\nfrom quickfaas.measure import recall\nfrom common.Logger import logger\n\ndef sync(mac,value, wizard_api):\n #get new values and send\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 for measure in controller[\"measures\"]:\n #publish measure\n topic = \"meshify/db/194/_/rigpump/\" + mac + \"/\" + measure[\"name\"]\n if measure[\"name\"] in [\"auto_manual\", \"auto_control_mode\", \"device_status\"]:\n payload = [{\"value\": convert_int(measure[\"name\"], measure[\"value\"])}]\n else:\n payload = [{\"value\": measure[\"value\"]}]\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(mac, value, wizard_api):\n try:\n value = json.loads(value.replace(\"'\",'\"'))\n logger.debug(value)\n message = {\"rigpump\":{value[\"tag\"]: value[\"val\"]}}\n wizard_api.write_plc_values(message)\n except Exception as e:\n logger.debug(e)\n \ndef receiveCommand(topic, payload, wizard_api):\n logger.debug(topic)\n logger.debug(json.loads(payload))\n p = json.loads(payload)[0]\n command = p[\"payload\"][\"name\"].split(\".\")[1]\n commands = {\n \"sync\": sync,\n \"writeplctag\": writeplctag,\n }\n commands[command](p[\"mac\"].lower(),p[\"payload\"][\"value\"], wizard_api)\n #logger.debug(command)\n ack(p[\"msgId\"], p[\"mac\"], p[\"payload\"][\"name\"].split(\".\")[1], p[\"payload\"][\"value\"], wizard_api)\n\ndef ack(msgid, mac, name, value, wizard_api):\n #logger.debug(mac)\n mac = \"\".join(mac.split(\":\")[:-2])\n #logger.debug(msgid)\n #logger.debug(mac)\n #logger.debug(name)\n #logger.debug(value)\n wizard_api.mqtt_publish(\"meshify/responses/\" + str(msgid), json.dumps([{\"value\": \"{} Success Setting: {} To: {}\".format(mac,name, value), \"msgid\": str(msgid)}]))\n\ndef convert_int(plc_tag, value):\n auto_manual = {\n 0: \"Manual\",\n 1: \"Auto\"\n }\n\n auto_control_mode = {\n 0: \"Pressure\",\n 1: \"Flow\"\n }\n\n device_status = {\n 1: \"Running\",\n 64: \"Idle\",\n 128: \"Overpressure\",\n 1024: \"Faulted\"\n }\n\n plc_tags = {\n \"auto_manual\": auto_manual.get(value, \"Invalid Code\"),\n \"auto_control_mode\": auto_control_mode.get(value, \"Invalid Code\"),\n \"device_status\": device_status.get(value, \"Invalid Code\"),\n }\n\n return plc_tags.get(plc_tag, \"Invalid Tag\")",
|
||||
"msgType": 0,
|
||||
"trigger": "command_event",
|
||||
"cloudName": "default"
|
||||
}
|
||||
]
|
||||
},
|
||||
"labels": [
|
||||
{
|
||||
"key": "SN",
|
||||
"value": "GF5022137006251"
|
||||
},
|
||||
{
|
||||
"key": "MAC",
|
||||
"value": "00:18:05:1a:e5:36"
|
||||
},
|
||||
{
|
||||
"key": "MAC_UPPER",
|
||||
"value": "00:18:05:1A:E5:37"
|
||||
}
|
||||
],
|
||||
"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": []
|
||||
},
|
||||
"version": "2.2.1"
|
||||
}
|
||||
72
Pub_Sub/rigpump/v4/pub/sendData.py
Normal file
72
Pub_Sub/rigpump/v4/pub/sendData.py
Normal file
@@ -0,0 +1,72 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from common.Logger import logger
|
||||
from quickfaas.remotebus import publish
|
||||
import re, uuid
|
||||
from paho.mqtt import client
|
||||
|
||||
lwtData = {
|
||||
"init":False,
|
||||
"client": client.Client(client_id=str(uuid.uuid4()), clean_session=True, userdata=None, protocol=client.MQTTv311, transport="tcp")
|
||||
}
|
||||
def lwt(mac):
|
||||
try:
|
||||
#if not lwtData["connected"]:
|
||||
if not lwtData["init"]:
|
||||
logger.info("INITIALIZING LWT CLIENT")
|
||||
lwtData["client"].username_pw_set(username="admin", password="columbus")
|
||||
lwtData["client"].will_set("meshify/db/194/_/mainHP/" + mac + ":00:00/connected",json.dumps({"value":False}))
|
||||
lwtData["init"] = True
|
||||
logger.info("Connecting to MQTT Broker for LWT purposes!!!!!!!")
|
||||
lwtData["client"].connect("mq194.imistaway.net",1883, 600)
|
||||
lwtData["client"].publish("meshify/db/194/_/mainHP/" + mac + ":00:00/connected", json.dumps({"value":True}))
|
||||
except Exception as e:
|
||||
logger.error("LWT DID NOT DO THE THING")
|
||||
logger.error(e)
|
||||
|
||||
def sendData(message):
|
||||
#logger.debug(message)
|
||||
mac = ':'.join(re.findall('..', '%012x' % uuid.getnode()))
|
||||
lwt(mac)
|
||||
for measure in message["measures"]:
|
||||
try:
|
||||
logger.debug(measure)
|
||||
if measure["name"] in ["auto_manual", "auto_control_mode", "device_status"]:
|
||||
logger.debug("Converting DINT/BOOL to STRING")
|
||||
value = convert_int(measure["name"], measure["value"])
|
||||
logger.debug("Converted {} to {}".format(measure["value"], value))
|
||||
publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": value}), __qos__)
|
||||
else:
|
||||
publish(__topic__ + mac + ":01:99/" + measure["name"], json.dumps({"value": measure["value"]}), __qos__)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
#publish(__topic__, json.dumps({measure["name"]: measure["value"]}), __qos__)
|
||||
|
||||
def convert_int(plc_tag, value):
|
||||
auto_manual = {
|
||||
0: "Manual",
|
||||
1: "Auto"
|
||||
}
|
||||
|
||||
auto_control_mode = {
|
||||
0: "Pressure",
|
||||
1: "Flow"
|
||||
}
|
||||
|
||||
device_status = {
|
||||
1: "Running",
|
||||
64: "Idle",
|
||||
128: "Overpressure",
|
||||
1024: "Faulted"
|
||||
}
|
||||
|
||||
plc_tags = {
|
||||
"auto_manual": auto_manual.get(value, "Invalid Code"),
|
||||
"auto_control_mode": auto_control_mode.get(value, "Invalid Code"),
|
||||
"device_status": device_status.get(value, "Invalid Code"),
|
||||
}
|
||||
|
||||
return plc_tags.get(plc_tag, "Invalid Tag")
|
||||
|
||||
|
||||
79
Pub_Sub/rigpump/v4/sub/receiveCommand.py
Normal file
79
Pub_Sub/rigpump/v4/sub/receiveCommand.py
Normal file
@@ -0,0 +1,79 @@
|
||||
# Enter your python code.
|
||||
import json
|
||||
from quickfaas.measure import recall
|
||||
from common.Logger import logger
|
||||
|
||||
def sync(mac,value, wizard_api):
|
||||
#get new values and send
|
||||
try:
|
||||
data = recall()#json.loads(recall().decode("utf-8"))
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
logger.info(data)
|
||||
for controller in data:
|
||||
for measure in controller["measures"]:
|
||||
#publish measure
|
||||
topic = "meshify/db/194/_/rigpump/" + mac + "/" + measure["name"]
|
||||
if measure["name"] in ["auto_manual", "auto_control_mode", "device_status"]:
|
||||
payload = [{"value": convert_int(measure["name"], measure["value"])}]
|
||||
else:
|
||||
payload = [{"value": measure["value"]}]
|
||||
logger.debug("Sending on topic: {}".format(topic))
|
||||
logger.debug("Sending value: {}".format(payload))
|
||||
wizard_api.mqtt_publish(topic, json.dumps(payload))
|
||||
def writeplctag(mac, value, wizard_api):
|
||||
try:
|
||||
value = json.loads(value.replace("'",'"'))
|
||||
logger.debug(value)
|
||||
message = {"rigpump":{value["tag"]: value["val"]}}
|
||||
wizard_api.write_plc_values(message)
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
|
||||
def receiveCommand(topic, payload, wizard_api):
|
||||
logger.debug(topic)
|
||||
logger.debug(json.loads(payload))
|
||||
p = json.loads(payload)[0]
|
||||
command = p["payload"]["name"].split(".")[1]
|
||||
commands = {
|
||||
"sync": sync,
|
||||
"writeplctag": writeplctag,
|
||||
}
|
||||
commands[command](p["mac"].lower(),p["payload"]["value"], wizard_api)
|
||||
#logger.debug(command)
|
||||
ack(p["msgId"], p["mac"], p["payload"]["name"].split(".")[1], p["payload"]["value"], wizard_api)
|
||||
|
||||
def ack(msgid, mac, name, value, wizard_api):
|
||||
#logger.debug(mac)
|
||||
mac = "".join(mac.split(":")[:-2])
|
||||
#logger.debug(msgid)
|
||||
#logger.debug(mac)
|
||||
#logger.debug(name)
|
||||
#logger.debug(value)
|
||||
wizard_api.mqtt_publish("meshify/responses/" + str(msgid), json.dumps([{"value": "{} Success Setting: {} To: {}".format(mac,name, value), "msgid": str(msgid)}]))
|
||||
|
||||
def convert_int(plc_tag, value):
|
||||
auto_manual = {
|
||||
0: "Manual",
|
||||
1: "Auto"
|
||||
}
|
||||
|
||||
auto_control_mode = {
|
||||
0: "Pressure",
|
||||
1: "Flow"
|
||||
}
|
||||
|
||||
device_status = {
|
||||
1: "Running",
|
||||
64: "Idle",
|
||||
128: "Overpressure",
|
||||
1024: "Faulted"
|
||||
}
|
||||
|
||||
plc_tags = {
|
||||
"auto_manual": auto_manual.get(value, "Invalid Code"),
|
||||
"auto_control_mode": auto_control_mode.get(value, "Invalid Code"),
|
||||
"device_status": device_status.get(value, "Invalid Code"),
|
||||
}
|
||||
|
||||
return plc_tags.get(plc_tag, "Invalid Tag")
|
||||
Reference in New Issue
Block a user