Lua code for our VIP alert
Contents
Add Lua code to our channel to print a message containing the word ALERT, for any HL7 messages with a VIP flag.
Are you wondering how print()
sends a message to the log? print()
shows it’s output it in the the live annotation block in the Translator editor, and re-directs to the log as an Informational message when a channel is running. For more advanced logging options check out the Iguana run-time functions iguana.logDebug()
, iguana.logInfo()
and iguana.logWarning()
.
To write the code that raises the alert we need a sample ADT message with a VIP.
Open the Translator editor for the Filter component of the Sender channel. Use the navigation control to import log data and search for lohan or VIP to find an ADT message with a VIP flag:
Now we can write the code:
Notice the Alert function? This is good practice as the same function can be reused for other Alerts.
We need to call this function from within main:
If you now
- Commit the milestone
- Stop the channel
- Requeue the data
- Run the channel
You should get an email like this:
Iguana Email Notification Source: Sender Log Type: Info Logged message: ---------------------------------------------------- ALERT: VIP: Lohan, Lynsay has arrived! ---------------------------------------------------- To view this log entry in Iguana's logs, go to: http://84.224.201.102:6543/log_browse?refid=20111024-964498
Note: if the log entry link does not work it means the Iguana server IP address has changed, and you need to update the Iguana Host Name for Email Links setting. See the Gotcha on the page about configuring email notification.
We can see the log message in the logs too:
And here is our final code:
require 'split' require 'zsegment' require 'diff' require 'hl7util' require 'dateparse' require 'stringutil' require 'clean_phone' require 'codemap' local function trace(a,b,c,d) return end function main(Data) local Orig = hl7.parse {vmd = 'transform.vmd', data = Data} if Orig:nodeName() == 'Catchall' then iguana.logInfo('Filtered '..Orig.MSH[9][1]..'^'..Orig.MSH[9][2]) return end local Out = hl7.message{vmd = 'transform.vmd', name = Orig:nodeName()} CheckForVIP(Orig) Out:mapTree(Orig) local Copy = zsegment.copyZSegments(Data, Out:S()) CheckTransform(Data:StripLastReturns(), Copy:StripLastReturns()) AlterMSH(Out.MSH) local PID = hl7util.findSegment(Out, FindPID) if PID then AlterPID(PID) end if Out:nodeName() == 'Lab' then AddNote(Out) end trace(Out) local Diff = diff.Compare(Orig:S(), Out:S(), 'transform.vmd') local DataOut = Out:S() DataOut = zsegment.copyZSegments(Data, DataOut) DataOut = DataOut:StripLastReturns() trace(DataOut) queue.push{data = DataOut} end function CheckForVIP(Msg) if Msg:nodeName() == 'ADT' then if Msg.PV1[16]:nodeValue() == 'VIP' then Alert("VIP: "..Msg.PID[5][1][1][1]..', '..Msg.PID[5][1][2]..' has arrived') end end end function Alert(Message) print('ALERT:n'..Message) end local NoteTemplate=[[ Clown. Good madonna, why mournest thou? Olivia. Good fool, for my brother's death. Clown. I think his soul is in hell, madonna. Olivia. I know his soul is in heaven, fool. Clown. The more fool, madonna, to mourn for your brother's soul being in heaven--Take away the fool, gentleman. ]] function AddNote(Out) local Lines = NoteTemplate:StripLastReturns():split('n') for i=1, #Lines do Out.NTE[i][1] = i Out.NTE[i][3][1] = Lines[i] end return Out end function FindPID(Segment) if Segment:nodeName() == 'PID' then return true end end SexMap = codemap.map({ M='Male', m='Male', F='Female', f='Female' }, 'unknown') function AlterPID(PID) local Date = dateparse.parse(PID[7]:nodeValue()) PID[7] = os.date("%Y%m%d", Date) PID[5][1][1][1] = PID[5][1][1][1]:nodeValue():capitalize() PID[5][1][2] = PID[5][1][2]:nodeValue():capitalize() PID[13][1][1] = PID[13][1][1]:CleanPhone() PID[8] = SexMap[PID[8]] trace(SexMap['any other value']) return PID end function AlterMSH(MSH) MSH[3][1] = 'Acme' MSH[4][1] = 'Lab' return MSH end function CheckTransform(Orig, Copy) if Orig ~= Copy then trace(Orig) trace(Copy) error('Copy of HL7 message does not match the original') end end function string.StripLastReturns(S) -- strip return(s) "r" & "n" from the end of a string local i = #S while S:byte(i) == 10 or S:byte(i) == 13 do i = i - 1 end return S:sub(1,i) end