public void Handle(string json)
        {
            Console.WriteLine("MOTION event handler invoked ...");
            try
            {
                var eventObj = JsonConvert.DeserializeObject <Event>(json);
                Console.WriteLine("[MotionEventHandler] Handling eventObj: " + eventObj);

                if (eventObj.category.ToLower() == "user_environment")
                {
                    // if we are dealing with a presence sensor
                    if (eventObj.content.name == "presence")
                    {
                        // see if it is a sensor activation
                        if (eventObj.content.val["alarm_motion"] != null && (bool)eventObj.content.val["alarm_motion"])
                        {
                            // retrieve the gateway and sensor URI from the source annotations
                            var gatewayURIPath = (string)eventObj.annotations.source["gateway"];
                            var deviceURIPath  = (string)eventObj.annotations.source["sensor"];

                            // make a call to the store API to get the user from the gateway
                            var userURIPath = storeAPI.GetUserOfGateway(gatewayURIPath);

                            if (userURIPath != null)
                            {
                                int userID = GetIdFromURI(userURIPath);
                                Tuple <string, string> userLocales = storeAPI.GetUserLocale(userURIPath, userID);

                                if (userLocales != null)
                                {
                                    // retrieve timestamp from annotations
                                    long timestamp = eventObj.annotations.timestamp;

                                    // get localized datetime
                                    TimeZoneInfo localTz     = TimeZoneInfo.FindSystemTimeZoneById(userLocales.Item2);
                                    DateTime     dtime       = UnixTimeStampToDateTime(timestamp, localTz);
                                    DateTime     currentTime = UnixTimeStampToDateTime((long)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds, localTz);

                                    // get morning limits
                                    Tuple <DateTime, DateTime> morningLimits = getMorningLimits(localTz);

                                    // check if current dtime is within limits
                                    if (dtime >= morningLimits.Item1 && currentTime >= morningLimits.Item1 && dtime <= morningLimits.Item2 && currentTime <= morningLimits.Item2)
                                    //if (dtime >= morningLimits.Item1 && dtime <= morningLimits.Item2)
                                    {
                                        if (lastActivationMap.ContainsKey(userURIPath))
                                        {
                                            long     lastTs = lastActivationMap[userURIPath];
                                            DateTime lastDt = UnixTimeStampToDateTime(lastTs, localTz);

                                            // if the lastDt is outside of the morning limits
                                            if (lastDt < morningLimits.Item1)
                                            {
                                                Console.WriteLine("[MotionEventHandler] Identified first activation of motion sensor in morning at : " + dtime.ToString());
                                                SendBPMeasurementNotification(userURIPath);
                                            }

                                            lastActivationMap[userURIPath] = timestamp;
                                        }
                                        else
                                        {
                                            // if this is the first activation ever within morning limits
                                            Console.WriteLine("[MotionEventHandler] First ever activation of motion sensor in morning at : " + dtime.ToString());
                                            SendBPMeasurementNotification(userURIPath);

                                            lastActivationMap[userURIPath] = timestamp;
                                        }
                                    }
                                    else
                                    {
                                        // just mark as latest activation
                                        Console.WriteLine("[MotionEventHandler] Motion event not within morning limits " + dtime.ToString());
                                        lastActivationMap[userURIPath] = timestamp;
                                    }
                                }
                                else
                                {
                                    Console.WriteLine("[MotionEventHandler] Insufficient locales information in enduser profile endpoint for user: "******"[MotionEventHandler] Skipping motion event handling since no user can be retrieved for gateway: " + gatewayURIPath);
                            }
                        }
                        else
                        {
                            Console.WriteLine("[MotionEventHandler] The motion sensor has not been triggered: " + eventObj.content.val["alarm_motion"]);
                        }
                    }
                }
            }
            catch (JsonException ex)
            {
                Console.WriteLine(ex);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }