public void Start()
        {
            var lampDictionary = CreateFakeLamps();

            var motionEvents  = _scheduler.CreateColdObservable(_motionEvents.ToArray());
            var messageBroker = new FakeMessageBroker(motionEvents, lampDictionary);

            var checkTime    = _periodicCheckTime ?? TimeSpan.FromMilliseconds(1000);
            var timeDuration = _timeDuration ?? 20;

            var mapper = Bootstrap(messageBroker);
            var actor  = mapper.Map <ServiceDTO, LightAutomationServiceProxy>(_serviceConfig);

            _actorContext.Lamps        = lampDictionary;
            _actorContext.Scheduler    = _scheduler;
            _actorContext.MotionEvents = motionEvents;

            StartAndWait(actor);
        }
        Build()
        {
            var hallwayLampToilet     = new FakeMotionLamp(Detectors.hallwayDetectorToilet);
            var hallwayLampLivingRoom = new FakeMotionLamp(Detectors.hallwayDetectorLivingRoom);
            var toiletLamp            = new FakeMotionLamp(Detectors.toiletDetector);
            var livingRoomLamp        = new FakeMotionLamp(Detectors.livingRoomDetector);
            var bathroomLamp          = new FakeMotionLamp(Detectors.bathroomDetector);
            var badroomLamp           = new FakeMotionLamp(Detectors.badroomDetector);
            var kitchenLamp           = new FakeMotionLamp(Detectors.kitchenDetector);
            var balconyLamp           = new FakeMotionLamp(Detectors.balconyDetector);
            var staircaseLamp         = new FakeMotionLamp(Detectors.staircaseDetector);

            var lampDictionary = new Dictionary <string, FakeMotionLamp>
            {
                { Detectors.hallwayDetectorToilet, hallwayLampToilet },
                { Detectors.hallwayDetectorLivingRoom, hallwayLampLivingRoom },
                { Detectors.toiletDetector, toiletLamp },
                { Detectors.livingRoomDetector, livingRoomLamp },
                { Detectors.bathroomDetector, bathroomLamp },
                { Detectors.badroomDetector, badroomLamp },
                { Detectors.kitchenDetector, kitchenLamp },
                { Detectors.balconyDetector, balconyLamp },
                { Detectors.staircaseDetector, staircaseLamp }
            };

            _container = new Container();

            var config = new MapperConfiguration(p =>
            {
                p.CreateMap(typeof(ServiceDTO), typeof(LightAutomationServiceProxy)).ConstructUsingServiceLocator();
                p.CreateMap <AttachedPropertyDTO, AttachedProperty>();

                p.ShouldMapProperty = propInfo => (propInfo.CanWrite && propInfo.GetGetMethod(true).IsPublic) || propInfo.IsDefined(typeof(MapAttribute), false);
                p.ConstructServicesUsing(_container.GetInstance);
            });

            var mapper = config.CreateMapper();

            var scheduler           = new TestScheduler();
            var concurrencyProvider = new TestConcurrencyProvider(scheduler);
            var quartzScheduler     = Mock.Of <IScheduler>();
            var motionEvents        = scheduler.CreateColdObservable <MotionEnvelope>(_motionEvents.ToArray());
            var messageBroker       = new FakeMessageBroker(motionEvents, lampDictionary);

            var checkTime       = _periodicCheckTime ?? TimeSpan.FromMilliseconds(1000);
            var observableTimer = Mock.Of <IObservableTimer>();

            Mock.Get(observableTimer).Setup(x => x.GenerateTime(checkTime)).Returns(scheduler.CreateColdObservable(GenerateTestTime(TimeSpan.FromSeconds(_timeDuration), checkTime)));

            _container.RegisterInstance <IScheduler>(quartzScheduler);
            _container.RegisterInstance <IConcurrencyProvider>(concurrencyProvider);
            _container.RegisterInstance <ILogger <LightAutomationServiceProxy> >(new FakeLogger <LightAutomationServiceProxy>(scheduler));
            _container.RegisterInstance <IMessageBroker>(messageBroker);
            _container.RegisterInstance <IObservableTimer>(observableTimer);

            var areProperties = new Dictionary <string, string>();

            if (!string.IsNullOrWhiteSpace(_workingTime))
            {
                areProperties.Add(MotionProperties.WorkingTime, _workingTime);
            }

            var serviceDto = ConfigureRooms(lampDictionary, areProperties);

            if (_confusionResolutionTime.HasValue)
            {
                serviceDto.Properties.Add(MotionProperties.ConfusionResolutionTime, _confusionResolutionTime.ToString());
            }

            var props = Props.FromProducer(() => mapper.Map <ServiceDTO, LightAutomationServiceProxy>(serviceDto));

            _actorContext.PID = _actorContext.Context.SpawnNamed(props, "motionService");

            _actorContext.IsAlive();

            return
                (
                motionEvents,
                scheduler,
                lampDictionary
                );
        }