Message re modeling
This example uses different faxe nodes to remodel and extend a json message that is received via mqtt.
Input message
{
"ts": 1634657531710,
"data": {
"availablitiy": "NRDY",
"operatingState": "ON",
"operatingMode": "AUTO",
"alarmState": "NOAL",
"errorStates": [],
"Typ": "ATS",
"Id": 3179
}
}
Desired message
{
"ts": 1634657531710,
"data": {
"robot_state": "BUSY",
"order_state": {
"name": "NRDY",
"id": 1
},
"operating_state": {
"name": "ON",
"id": 0
},
"operating_mode": {
"name": "AUTO",
"id": 1
},
"alarm_state": {
"name": "NOAL",
"id": 0,
"errors": []
},
"Typ": "ATS",
"Id": 3179
}
}
Example
%% enum mappings
def alarm_state_map = '{"NOAL":0,"ERR":1}'
def opmode_map = '{"NOMO":0,"AUTO":1,"MANU":2}'
def opstate_map = '{"ON":0,"OFF":1}'
def order_state_map = '{"RDY":0,"NRDY":1,"OFF":2}'
def topic_out = 'msm/r1/grp/condition/robot_state'
def republish_timeout = 15s
def topic_in = 'msm/r1/grp/wms/RMST/v1'
def out =
|mqtt_subscribe()
.host('10.10.1.102')
.topic(topic_in)
.include_topic(false)
|rename()
.fields(
'data.alarmState',
'data.operatingMode',
'data.operatingState',
'data.errorStates',
'data.availablitiy'
)
.as_fields(
'data.alarm_state.name',
'data.operating_mode.name',
'data.operating_state.name',
'data.alarm_state.errors',
'data.order_state.name'
)
|eval(
lambda: map_get("data.alarm_state.name", alarm_state_map),
lambda: map_get("data.operating_mode.name", opmode_map),
lambda: map_get("data.operating_state.name", opstate_map),
lambda: map_get("data.order_state.name", order_state_map)
)
.as(
'data.alarm_state.id',
'data.operating_mode.id',
'data.operating_state.id',
'data.order_state.id'
)
|case(
lambda: "data.alarm_state.name" == 'ERR',
lambda: "data.operating_state.name" == 'ON' AND "data.operating_mode.name" == 'AUTO' AND "data.order_state.name" == 'NRDY',
lambda: "data.operating_state.name" == 'ON' AND "data.operating_mode.name" == 'AUTO' AND "data.order_state.name" == 'IDLE'
)
.values(
'ERROR',
'BUSY',
'IDLE'
)
.default('OFF')
.as('data.robot_state')
out
|mqtt_publish()
.topic(topic_out)