private String ReplaceTokens(SimulatorInstance instance, MessageTransmissionPlan plan, String input)
        {
            var msg = plan.Message.Value;

            if (String.IsNullOrEmpty(input))
            {
                return(String.Empty);
            }

            foreach (var attr in msg.DynamicAttributes)
            {
                var instanceValue = plan.Values.Where(atr => atr.Attribute.Id == attr.Id).FirstOrDefault();
                if (instanceValue == null || String.IsNullOrEmpty(instanceValue.Value))
                {
                    input = input.Replace($"~{attr.Key}~", attr.DefaultValue);
                }
                else
                {
                    if (instanceValue.Value.StartsWith("~random-int"))
                    {
                        input = RandomizeInt(input, instanceValue.Value, attr.Key);
                    }
                    else if (instanceValue.Value.StartsWith("~random-float"))
                    {
                        input = RandomizeFloat(input, instanceValue.Value, attr.Key);
                    }
                    else
                    {
                        input = input.Replace($"~{attr.Key}~", instanceValue.Value);
                    }
                }
            }

            input = input.Replace($"~deviceid~", String.IsNullOrEmpty(instance.DeviceId) ? _simulator.DeviceId : instance.DeviceId);
            input = input.Replace($"~datetime~", DateTime.Now.ToString());
            input = input.Replace($"~username~", _simulator.UserName);
            input = input.Replace($"~password~", _simulator.Password);
            input = input.Replace($"~accesskey~", _simulator.AccessKey);
            input = input.Replace($"~password~", _simulator.Password);
            input = input.Replace($"~datetimeiso8601~", DateTime.UtcNow.ToJSONString());

            input = RandomizeInt(input, input);
            input = RandomizeFloat(input, input);


            if (msg.AppendCR)
            {
                input += "\r";
            }

            if (msg.AppendLF)
            {
                input += "\n";
            }

            return(input);
        }
        public SimulatorRuntime(ISimulatorRuntimeServices runtimeService, INotificationPublisher notificationPublisher, IAdminLogger adminLogger, LagoVista.IoT.Simulator.Admin.Models.SimulatorInstance instance)
        {
            _runtimeService = runtimeService;
            _instance       = instance;

            _notificationPublisher = notificationPublisher;
            _connected             = DateTime.UtcNow;
            _lastAccess            = _connected;

            _simulator = instance.Simulator.Value;

            _adminLogger = adminLogger;

            InstanceId = Guid.NewGuid().ToId();

            SetState("default");
        }