private void CreateEventSources(List <ErrorCodeSetting> errorCodeSettings)
        {
            foreach (var codeSetting in errorCodeSettings)
            {
                var plc = string.IsNullOrEmpty(codeSetting.PlcName) ? plcProvider.GetHardware() : plcProvider.GetHardware(codeSetting.PlcName);
                plc.CreateNotification(codeSetting.ErrorCodeAddress)
                .FirstAsync()
                .Where(value => value != null)
                .Select(value => CreateEvent(value, codeSetting))
                .Do(SetActualEvent)
                .Subscribe()
                .AddDisposableTo(disposables)
                ;

                plc.CreateNotification(codeSetting.ErrorCodeAddress)
                .Skip(1)
                .DistinctUntilChanged()
                .Where(value => value != null)
                .Do(value => HandleNewErrorCode(value, codeSetting))
                .Subscribe()
                .AddDisposableTo(disposables)
                ;
            }

            lastEventSubject.AddDisposableTo(disposables);
            activeEventSubject.AddDisposableTo(disposables);
        }
        public bool Initialize()
        {
            try
            {
                Logger?.Information($"Connecting with Beckhoff at '{settings.AmsNetId}:{settings.Port}'...");

                InitializeBeckhoff();
            }
            catch (Exception e)
            {
                Logger?.Error(e, "Error while initializing beckhoff");
            }

            Observable.Interval(TimeSpan.FromSeconds(1))
            .Do(_ => CheckConnectionHealth())
            .Subscribe()
            .AddDisposableTo(Disposables);

            connectionStateSubject
            .DistinctUntilChanged()
            .Do(state => Logger?.Debug($"Connection state changed to '{state}'"))
            .Subscribe()
            .AddDisposableTo(Disposables);

            adsStateSubject
            .DistinctUntilChanged()
            .Do(state => Logger?.Debug($"Ads state changed to '{state}'"))
            .Do(UpdateSymbols)
            .Subscribe()
            .AddDisposableTo(Disposables);

            connectionStateSubject.AddDisposableTo(Disposables);
            adsStateSubject.AddDisposableTo(Disposables);
            symbolsSubject.AddDisposableTo(Disposables);

            return(true);
        }