Llama: { "subject": "lamp", "action": "switch off", "time": "3:45", "location": "" }
Where there is an empty parameter the code will try to look back to the last recent commands for context (e.g. I may have just said "turn on the living room light"). If there's an issue it just asks for the missing info.
Translating the parameters from the json is done with good old fashion brute force (i.e. mostly regex).
It's still not 100% perfect but its faster and more accurate than the cloud assistants and private.