public async Task <ActionResult <IEnumerable <HotelTag> > > AddHotelTag(
            [FromQuery] HotelKey hotelKey,
            [FromBody] HotelTag hotelTag)
        {
            hotelTag.SetHotelKey(hotelKey);
            if (await _hotelTagStore.CheckExistanceAsync(hotelTag.GetKey()))
            {
                return(ValidationProblem(
                           title: "Resource already exists",
                           detail: string.Format(
                               "{0} at {1},{2},{3},{4} already exists",
                               hotelTag.Tag,
                               hotelTag.HotelChain,
                               hotelTag.CountryCode,
                               hotelTag.Town,
                               hotelTag.Suburb)
                           ));
            }
            await _hotelTagStore.CreateAsync(hotelTag);

            return(CreatedAtAction(
                       nameof(GetHotelTagDetails),
                       hotelTag.GetKey(),
                       hotelTag));
        }
Ejemplo n.º 2
0
        public async Task DeleteHotelUserAsync(HotelKey hotelKey, int hotelUserId)
        {
            using SqlConnection connection = new SqlConnection(_connectionString);
            await connection.OpenAsync();

            await connection.ExecuteAsync(
                "HotelUser_Drop_tr",
                new { HotelUserId = hotelUserId, hotelKey.HotelChain, hotelKey.CountryCode, hotelKey.Town, hotelKey.Suburb },
                commandType : CommandType.StoredProcedure);
        }
Ejemplo n.º 3
0
        public async Task <IActionResult> DeleteHotel([FromQuery] HotelKey hotelKey)
        {
            if (!await _hotelStore.CheckExistanceAsync(hotelKey))
            {
                return(NotFound());
            }
            await _hotelStore.DeleteAsync(hotelKey);

            return(NoContent());
        }
Ejemplo n.º 4
0
        public async Task <ActionResult <Hotel> > EditHotel([FromQuery] HotelKey hotelKey, [FromBody] Hotel hotel)
        {
            if (!await _hotelStore.CheckExistanceAsync(hotelKey))
            {
                return(NotFound());
            }
            await _hotelStore.UpdateAsync(hotelKey, hotel);

            return(Ok(hotel));
        }
Ejemplo n.º 5
0
        public async Task <ActionResult <Hotel> > GetHotelDetails([FromQuery] HotelKey hotelKey)
        {
            Hotel result = await _hotelStore.FindDetailsAsync(hotelKey);

            if (result != null)
            {
                return(Ok(result));
            }
            return(NotFound());
        }
Ejemplo n.º 6
0
        public async Task DeleteAsync(HotelKey hotelKey)
        {
            using SqlConnection connection = new SqlConnection(_connectionString);
            await connection.OpenAsync();

            await connection.ExecuteAsync(
                "Hotel_Drop_tr",
                hotelKey,
                commandType : CommandType.StoredProcedure);
        }
Ejemplo n.º 7
0
        public async Task <ActionResult <ApplicationUser> > GetHotelUserDetails([FromQuery] HotelKey hotelKey, int personId)
        {
            ApplicationUser result = await _hotelUserStore.FindHotelUserDetailsAsync(hotelKey, personId);

            if (result != null)
            {
                return(Ok(result));
            }
            return(NotFound());
        }
Ejemplo n.º 8
0
        public async Task <IActionResult> RegisterMonitor([FromBody] MonitorRegistration monitorRegistration)
        {
            HotelKey hotelKey = ParseHotelKeyFromClaims(User);

            monitorRegistration.Manufacturer = "Espressif";
            monitorRegistration.Model        = "ESP32";
            monitorRegistration.SWVersion    = "0.0.1";
            monitorRegistration.SWUpdateDtm  = DateTime.UtcNow;

            await _monitorStore.CreateAsync(hotelKey, monitorRegistration);

            return(Ok(hotelKey));
        }
Ejemplo n.º 9
0
        private HotelKey ParseHotelKeyFromClaims(ClaimsPrincipal principal)
        {
            string hotelClaim       = principal.FindFirst(RoomMonitorConstants.ClaimTypes.Hotel).Value;
            var    serializeOptions = new JsonSerializerOptions
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
            };
            HotelKey hotelKey = JsonSerializer.Deserialize <HotelKey>(
                hotelClaim,
                serializeOptions);

            return(hotelKey);
        }
Ejemplo n.º 10
0
        public async Task <ActionResult <ApplicationUser> > AddHotelUser([FromQuery] HotelKey hotelKey, [FromBody] UserInvitation userInvitation)
        {
            if (userInvitation.Role == RoomMonitorConstants.UserRoles.SystemAdmin)
            {
                return(Forbid());
            }

            // Hotel Admins can only invite Hotel Employees
            if (this.User.IsInRole(RoomMonitorConstants.UserRoles.HotelAdmin) && userInvitation.Role != RoomMonitorConstants.UserRoles.HotelEmployee)
            {
                return(Forbid());
            }

            var user = new ApplicationUser
            {
                Email       = userInvitation.Email,
                Role        = userInvitation.Role,
                HotelChain  = hotelKey.HotelChain,
                CountryCode = hotelKey.CountryCode,
                Town        = hotelKey.Town,
                Suburb      = hotelKey.Suburb
            };
            IdentityResult result = await _userManager.CreateAsync(user);

            if (result.Succeeded)
            {
                string code = await _userManager.GeneratePasswordResetTokenAsync(user);

                // Using protocol param will force creation of an absolut url. We
                // don't want to send a relative URL by e-mail.
                var callbackUrl = Url.Action("Activate",
                                             "Account",
                                             new { userId = user.PersonId, code },
                                             protocol: Request.Scheme);

                await _emailSender.SendInvitationMail(user.Email, callbackUrl);

                return(CreatedAtAction(
                           nameof(GetHotelUserDetails),
                           new { personId = user.PersonId, hotelKey.HotelChain, hotelKey.CountryCode, hotelKey.Town, hotelKey.Suburb },
                           user));
            }
            else
            {
                ModelState.AddModelError(nameof(UserInvitation.Email), "Email already taken.");
                return(ValidationProblem(
                           title: "Duplicate Email",
                           detail: String.Format("Email '{0}' is already taken.", userInvitation.Email)
                           ));
            }
        }
Ejemplo n.º 11
0
        public async Task <IEnumerable <Room> > FindAllByHotelAsync(HotelKey hotelKey)
        {
            using SqlConnection connection = new SqlConnection(_connectionString);
            var lookup = new Dictionary <Tuple <string, string>, Room>();

            await connection.OpenAsync();

            var result = await connection.QueryAsync <Room, dynamic, Room>(
                @"  SELECT 
                         r.*, r.Room as Name, t.Tag 
                    FROM 
                        Room r
                    LEFT JOIN 
                        RoomTag t
                    ON 
                        r.HotelChain = t.HotelChain AND
                        r.CountryCode = t.CountryCode AND
                        r.Town = t.Town AND
                        r.Suburb = t.Suburb AND
                        r.RoomType = t.RoomType AND
                        r.Room = t.Room
                    WHERE 
                        r.HotelChain = @HotelChain AND 
                        r.CountryCode = @CountryCode AND
                        r.Town = @Town AND
                        r.Suburb = @Suburb",
                (r, t) =>
            {
                var key = Tuple.Create(r.RoomType, r.Name);
                if (!lookup.TryGetValue(key, out Room room))
                {
                    lookup.Add(key, room = r);
                }
                if (room.Tags == null)
                {
                    room.Tags = new List <string>();
                }
                if (t != null && t.Tag != null)
                {
                    room.Tags.Add(t.Tag);
                }
                return(room);
            },
                hotelKey,
                splitOn : "Tag"
                );

            return(lookup.Values);
        }
Ejemplo n.º 12
0
        public async Task <Hotel> FindDetailsAsync(HotelKey hotelKey)
        {
            using SqlConnection connection = new SqlConnection(_connectionString);
            await connection.OpenAsync();

            var result = await connection.QuerySingleOrDefaultAsync <Hotel>(
                @"SELECT * FROM Hotel WHERE 
                    HotelChain = @HotelChain AND 
                    CountryCode = @CountryCode AND
                    Town = @Town AND
                    Suburb = @Suburb",
                hotelKey
                );

            return(result);
        }
Ejemplo n.º 13
0
        public async Task <IEnumerable <HotelTag> > FindAllByHotelAsync(HotelKey hotelKey)
        {
            using SqlConnection connection = new SqlConnection(_connectionString);
            await connection.OpenAsync();

            var result = await connection.QueryAsync <HotelTag>(
                @"  SELECT *
                    FROM HotelTag
                    WHERE
                        HotelChain = @HotelChain AND 
                        CountryCode = @CountryCode AND
                        Town = @Town AND
                        Suburb = @Suburb",
                hotelKey
                );

            return(result);
        }
Ejemplo n.º 14
0
        public async Task <ApplicationUser> FindHotelUserDetailsAsync(HotelKey hotelKey, int hotelUserId)
        {
            using SqlConnection connection = new SqlConnection(_connectionString);
            await connection.OpenAsync();

            var result = await connection.QuerySingleOrDefaultAsync <ApplicationUser>(
                @"SELECT *, PersonType.PersonType AS Role FROM Person 
                            INNER JOIN PersonType ON Person.PersonTypeCode = PersonType.PersonTypeCode
                            INNER JOIN HotelUser ON PersonId = HotelUserId
                            WHERE PersonId = @HotelUserId AND
                                HotelChain = @HotelChain AND 
                                CountryCode = @CountryCode AND
                                Town = @Town AND
                                Suburb = @Suburb",
                new { HotelUserId = hotelUserId, hotelKey.HotelChain, hotelKey.CountryCode, hotelKey.Town, hotelKey.Suburb }
                );

            return(result);
        }
Ejemplo n.º 15
0
        public async Task <bool> CheckExistanceAsync(HotelKey hotelKey)
        {
            using SqlConnection connection = new SqlConnection(_connectionString);
            await connection.OpenAsync();

            var result = await connection.ExecuteScalarAsync(
                @"SELECT 1 FROM Hotel WHERE 
                    HotelChain = @HotelChain AND 
                    CountryCode = @CountryCode AND
                    Town = @Town AND
                    Suburb = @Suburb",
                hotelKey
                );

            if (result != null)
            {
                return(true);
            }
            return(false);
        }
Ejemplo n.º 16
0
        public async Task <IActionResult> DeleteHotelUser([FromQuery] HotelKey hotelKey, [FromRoute] int personId)
        {
            ApplicationUser userToDelete = await _userManager.FindByIdAsync(personId.ToString());

            if (userToDelete == null)
            {
                return(NotFound());
            }

            // Hotel Admins can only delete Hotel Employees
            if (User.IsInRole(RoomMonitorConstants.UserRoles.HotelAdmin) &&
                userToDelete.Role != RoomMonitorConstants.UserRoles.HotelEmployee)
            {
                return(Forbid());
            }

            await _hotelUserStore.DeleteHotelUserAsync(hotelKey, personId);

            return(NoContent());
        }
Ejemplo n.º 17
0
        public async Task UpdateAsync(HotelKey hotelKey, Hotel hotel)
        {
            using SqlConnection connection = new SqlConnection(_connectionString);
            await connection.OpenAsync();

            await connection.ExecuteAsync(
                "Hotel_Modify_tr",
                new
            {
                hotelKey.HotelChain,
                hotelKey.CountryCode,
                hotelKey.Town,
                hotelKey.Suburb,
                NewHotelChain  = hotel.HotelChain,
                NewCountryCode = hotel.CountryCode,
                NewTown        = hotel.Town,
                NewSuburb      = hotel.Suburb,
                NewNumStar     = hotel.NumStar
            },
                commandType : CommandType.StoredProcedure);
        }
Ejemplo n.º 18
0
        public async Task AddMonitorLogAsync(HotelKey hotelKey, string MACAddress, MonitorLog monitorLog)
        {
            using SqlConnection connection = new SqlConnection(_connectionString);
            await connection.OpenAsync();

            await connection.ExecuteAsync(
                "MonitorLog_Add_tr",
                new
            {
                hotelKey.HotelChain,
                hotelKey.CountryCode,
                hotelKey.Town,
                hotelKey.Suburb,
                MACAddress,
                monitorLog.LogDtm,
                monitorLog.BatteryLevel,
                monitorLog.ConnFail,
                monitorLog.PostFail,
                monitorLog.Rssi
            },
                commandType : CommandType.StoredProcedure);
        }
Ejemplo n.º 19
0
        public async Task CreateAsync(HotelKey hotelKey, MonitorRegistration monitorRegistration)
        {
            using SqlConnection connection = new SqlConnection(_connectionString);
            await connection.OpenAsync();

            await connection.ExecuteAsync(
                "Monitor_Register_tr",
                new
            {
                hotelKey.HotelChain,
                hotelKey.CountryCode,
                hotelKey.Town,
                hotelKey.Suburb,
                monitorRegistration.MACAddress,
                monitorRegistration.ConfigurationType,
                monitorRegistration.Manufacturer,
                monitorRegistration.Model,
                monitorRegistration.SWVersion,
                monitorRegistration.SWUpdateDtm
            },
                commandType : CommandType.StoredProcedure);
        }
Ejemplo n.º 20
0
        public async Task <ActionResult <Room> > AddRoom([FromQuery] HotelKey hotelKey, [FromBody] Room room)
        {
            room.SetHotelKey(hotelKey);
            if (await _roomStore.CheckExistanceAsync(room.GetKey()))
            {
                return(ValidationProblem(
                           title: "Resource already exists",
                           detail: string.Format(
                               "{0} '{1}' at {2},{3},{4},{5} already exists",
                               room.RoomType,
                               room.Name,
                               room.HotelChain,
                               room.CountryCode,
                               room.Town,
                               room.Suburb)
                           ));
            }
            await _roomStore.CreateAsync(room);

            return(CreatedAtAction(
                       nameof(GetRoomDetails),
                       room.GetKey(),
                       room));
        }
        public async Task <ActionResult <IEnumerable <HotelTag> > > GetTagsByHotel([FromQuery] HotelKey hotelKey)
        {
            IEnumerable <HotelTag> result = await _hotelTagStore.FindAllByHotelAsync(hotelKey);

            return(Ok(result));
        }
Ejemplo n.º 22
0
        public async Task <ActionResult <IEnumerable <MonitorRoomAlternateKey> > > GetMonitorHistoryByHotel([FromQuery] HotelKey hotelKey)
        {
            IEnumerable <MonitorRoomAlternateKey> result = await _monitorStore.FindMonitorHistoryByHotelAsync(hotelKey);

            return(Ok(result));
        }
Ejemplo n.º 23
0
        public async Task <ActionResult <IEnumerable <ApplicationUser> > > GetHotelUsersByHotel([FromQuery] HotelKey hotelKey)
        {
            IEnumerable <ApplicationUser> result = await _hotelUserStore.FindHotelUsersByHotelAsync(hotelKey);

            return(Ok(result));
        }
Ejemplo n.º 24
0
        public async Task <IActionResult> HandleMonitorRecord([FromBody] MonitorRecord monitorRecord)
        {
            HotelKey hotelKey = ParseHotelKeyFromClaims(User);

            MonitorKey monitorKey = new MonitorKey
            {
                HotelChain  = hotelKey.HotelChain,
                CountryCode = hotelKey.CountryCode,
                Town        = hotelKey.Town,
                Suburb      = hotelKey.Suburb,
                MACAddress  = monitorRecord.MACAddress
            };


            monitorRecord.Logs.ForEach(async log =>
            {
                try
                {
                    await _monitorStore.AddMonitorLogAsync(
                        hotelKey,
                        monitorRecord.MACAddress,
                        log);
                }
                catch (SqlException ex)
                {
                    StringBuilder errorMessages = new StringBuilder();
                    for (int i = 0; i < ex.Errors.Count; i++)
                    {
                        errorMessages.Append("Index #" + i + "\n" +
                                             "Message: " + ex.Errors[i].Message + "\n" +
                                             "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                                             "Source: " + ex.Errors[i].Source + "\n" +
                                             "Procedure: " + ex.Errors[i].Procedure + "\n");
                    }
                    Console.WriteLine(errorMessages.ToString());
                }
            });



            MonitorRoom monitorRoom = await _monitorStore.FindMonitorRoomDetailsAsync(monitorKey);

            if (monitorRoom != null)
            {
                monitorRecord.Readings.ForEach(async reading =>
                {
                    try
                    {
                        await _monitorStore.AddMonitorReadingAsync(
                            monitorRoom,
                            reading);
                    }
                    catch (SqlException ex)
                    {
                        StringBuilder errorMessages = new StringBuilder();
                        for (int i = 0; i < ex.Errors.Count; i++)
                        {
                            errorMessages.Append("Index #" + i + "\n" +
                                                 "Message: " + ex.Errors[i].Message + "\n" +
                                                 "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                                                 "Source: " + ex.Errors[i].Source + "\n" +
                                                 "Procedure: " + ex.Errors[i].Procedure + "\n");
                        }
                        Console.WriteLine(errorMessages.ToString());
                    }
                });
            }

            return(StatusCode(StatusCodes.Status201Created));
        }
Ejemplo n.º 25
0
        public async Task <ActionResult <IEnumerable <Room> > > GetRoomsByHotel([FromQuery] HotelKey hotelKey)
        {
            IEnumerable <Room> result = await _roomStore.FindAllByHotelAsync(hotelKey);

            return(Ok(result));
        }
Ejemplo n.º 26
0
        public async Task <ActionResult <IEnumerable <MonitorUnassigned> > > GetMonitorUnassignedByHotel([FromQuery] HotelKey hotelKey)
        {
            IEnumerable <MonitorUnassigned> result = await _monitorStore.FindAllMonitorUnassignedByHotelAsync(hotelKey);

            return(Ok(result));
        }
Ejemplo n.º 27
0
        public async Task <IEnumerable <ApplicationUser> > FindHotelUsersByHotelAsync(HotelKey hotelKey)
        {
            using SqlConnection connection = new SqlConnection(_connectionString);
            await connection.OpenAsync();

            var result = await connection.QueryAsync <ApplicationUser>(
                @"SELECT *, PersonType.PersonType AS Role FROM Person 
                            INNER JOIN PersonType ON Person.PersonTypeCode = PersonType.PersonTypeCode
                            INNER JOIN HotelUser ON PersonId = HotelUserId
                            WHERE HotelChain = @HotelChain AND 
                                CountryCode = @CountryCode AND
                                Town = @Town AND
                                Suburb = @Suburb",
                hotelKey
                );

            return(result);
        }
Ejemplo n.º 28
0
        public async Task <IEnumerable <MonitorRoomAlternateKey> > FindMonitorHistoryByHotelAsync(HotelKey hotelKey)
        {
            using SqlConnection connection = new SqlConnection(_connectionString);
            await connection.OpenAsync();

            var result = await connection.QueryAsync <MonitorRoomAlternateKey>(
                @"SELECT DISTINCT HotelChain, CountryCode, Town, Suburb, RoomType, Room, Monitor
                    FROM Reading
                    WHERE HotelChain = @HotelChain
                    AND CountryCode = @CountryCode
                    AND Town = @Town
                    AND Suburb = @Suburb",
                hotelKey
                );

            return(result);
        }
        public async Task <ActionResult <HotelData> > GetHotelReadings([FromQuery] HotelKey hotelKey)
        {
            var result = await _sensorDataStore.FindReadingsByHotelAsync(hotelKey);

            return(Ok(result));
        }
Ejemplo n.º 30
0
        public async Task <IEnumerable <HotelData> > FindReadingsAsync(MonitorRoomAlternateKey monitorRoomAltKey)
        {
            using SqlConnection connection = new SqlConnection(_connectionString);
            await connection.OpenAsync();

            List <HotelData> result = new List <HotelData>();

            var measureData = await connection.QueryAsync <HotelData, RoomData, MonitorData, ApplicationMeasureData, SensorMeasureData, HotelData>(
                @"  SELECT  HotelChain, 
                            CountryCode, 
                            Town, 
                            Suburb, 
                            RoomType, 
                            Room, 
                            Monitor, 
                            ApplicationMeasure AS Application, 
                            ReadingDtm, 
                            [Value]
                    FROM ReadingMeasure
                    WHERE HotelChain = @HotelChain
                        AND CountryCode = @CountryCode
                        AND Town = @Town
                        AND Suburb = @Suburb
                        AND Room = @Room
                        AND RoomType = @RoomType
                        AND Monitor = @Monitor
                    ORDER BY ReadingDtm",
                (hotel, room, monitor, application, sensorData) =>
            {
                HotelKey hotelKey = new HotelKey
                {
                    HotelChain  = hotel.HotelChain,
                    CountryCode = hotel.CountryCode,
                    Town        = hotel.Town,
                    Suburb      = hotel.Suburb
                };

                HotelData hotelData = result.FirstOrDefault(h => h.HotelChain == hotel.HotelChain && h.CountryCode == hotel.CountryCode && h.Town == hotel.Town && h.Suburb == hotel.Suburb);
                if (hotelData == null)
                {
                    result.Add(hotel);
                    hotelData          = hotel;
                    hotelData.RoomData = new List <RoomData>();
                }
                RoomData roomData = hotelData.RoomData.FirstOrDefault(r => r.RoomType == room.RoomType && r.Room == room.Room);
                if (roomData == null)
                {
                    hotelData.RoomData.Add(room);
                    roomData             = room;
                    roomData.MonitorData = new List <MonitorData>();
                }
                MonitorData monitorData = roomData.MonitorData.FirstOrDefault(m => m.Monitor == monitor.Monitor);
                if (monitorData == null)
                {
                    roomData.MonitorData.Add(monitor);
                    monitorData = monitor;
                    monitorData.ApplicationMeasureData = new List <ApplicationMeasureData>();
                    monitorData.ApplicationSwitchData  = new List <ApplicationSwitchData>();
                }
                ApplicationMeasureData applicationMeasureData = monitorData.ApplicationMeasureData.FirstOrDefault(a => a.Application == application.Application);
                if (applicationMeasureData == null)
                {
                    monitorData.ApplicationMeasureData.Add(application);
                    applicationMeasureData            = application;
                    applicationMeasureData.SensorData = new List <SensorMeasureData>();
                }
                applicationMeasureData.SensorData.Add(sensorData);

                return(hotelData);
            },
                monitorRoomAltKey,
                splitOn : "HotelChain, RoomType, Monitor, Application, ReadingDtm"
                );

            var switchData = await connection.QueryAsync <HotelData, RoomData, MonitorData, ApplicationSwitchData, SensorSwitchData, HotelData>(
                @"  SELECT  HotelChain, 
                            CountryCode, 
                            Town, 
                            Suburb, 
                            RoomType, 
                            Room, 
                            Monitor, 
                            ApplicationSwitch AS Application, 
                            ReadingDtm, 
                            [Value]
                    FROM ReadingSwitch
                    WHERE HotelChain = @HotelChain
                        AND CountryCode = @CountryCode
                        AND Town = @Town
                        AND Suburb = @Suburb
                        AND Room = @Room
                        AND RoomType = @RoomType
                        AND Monitor = @Monitor
                    ORDER BY ReadingDtm",
                (hotel, room, monitor, application, sensorData) =>
            {
                HotelKey hotelKey = new HotelKey
                {
                    HotelChain  = hotel.HotelChain,
                    CountryCode = hotel.CountryCode,
                    Town        = hotel.Town,
                    Suburb      = hotel.Suburb
                };

                HotelData hotelData = result.FirstOrDefault(h => h.HotelChain == hotel.HotelChain && h.CountryCode == hotel.CountryCode && h.Town == hotel.Town && h.Suburb == hotel.Suburb);
                if (hotelData == null)
                {
                    result.Add(hotel);
                    hotelData          = hotel;
                    hotelData.RoomData = new List <RoomData>();
                }
                RoomData roomData = hotelData.RoomData.FirstOrDefault(r => r.RoomType == room.RoomType && r.Room == room.Room);
                if (roomData == null)
                {
                    hotelData.RoomData.Add(room);
                    roomData             = room;
                    roomData.MonitorData = new List <MonitorData>();
                }
                MonitorData monitorData = roomData.MonitorData.FirstOrDefault(m => m.Monitor == monitor.Monitor);
                if (monitorData == null)
                {
                    roomData.MonitorData.Add(monitor);
                    monitorData = monitor;
                    monitorData.ApplicationMeasureData = new List <ApplicationMeasureData>();
                    monitorData.ApplicationSwitchData  = new List <ApplicationSwitchData>();
                }
                ApplicationSwitchData applicationSwitchData = monitorData.ApplicationSwitchData.FirstOrDefault(a => a.Application == application.Application);
                if (applicationSwitchData == null)
                {
                    monitorData.ApplicationSwitchData.Add(application);
                    applicationSwitchData            = application;
                    applicationSwitchData.SensorData = new List <SensorSwitchData>();
                }
                applicationSwitchData.SensorData.Add(sensorData);

                return(hotelData);
            },
                monitorRoomAltKey,
                splitOn : "HotelChain, RoomType, Monitor, Application, ReadingDtm"
                );

            return(result);
        }