コード例 #1
0
        public object ExecuteTool(string uid, [FromBody] IDictionary parameters = null)
        {
            if (uid == null)
            {
                throw new ArgumentNullException(nameof(uid));
            }

            if (parameters == null)
            {
                parameters = new PythonDictionary();
            }

            Package package;

            try
            {
                package = _packageManagerService.LoadPackage(PackageUid.Parse(uid));
            }
            catch (WirehomePackageNotFoundException)
            {
                HttpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
                return(null);
            }

            try
            {
                var scriptHost = _pythonScriptHostFactoryService.CreateScriptHost(null);
                scriptHost.Compile(package.Script);
                return(scriptHost.InvokeFunction("main", parameters));
            }
            catch (Exception exception)
            {
                return(new ExceptionPythonModel(exception).ConvertToPythonDictionary());
            }
        }
コード例 #2
0
        ServiceInstance CreateServiceInstance(string id, ServiceConfiguration configuration)
        {
            var packageUid = new PackageUid(id, configuration.Version);
            var package    = _repositoryService.LoadPackage(packageUid);

            var scriptHost = _pythonScriptHostFactoryService.CreateScriptHost();

            scriptHost.Compile(package.Script);

            var context = new PythonDictionary
            {
                ["service_id"]      = id,
                ["service_version"] = configuration.Version,
                ["service_uid"]     = new PackageUid(id, configuration.Version).ToString()
            };

            scriptHost.AddToWirehomeWrapper("context", context);

            var serviceInstance = new ServiceInstance(id, configuration, scriptHost);

            if (configuration.Variables != null)
            {
                foreach (var variable in configuration.Variables)
                {
                    serviceInstance.SetVariable(variable.Key, variable.Value);
                }
            }

            return(serviceInstance);
        }
コード例 #3
0
        private AutomationInstance CreateAutomation(string uid, AutomationConfiguration configuration, WirehomeDictionary settings)
        {
            var package    = _packageManagerService.LoadPackage(configuration.Logic.Uid);
            var scriptHost = _pythonScriptHostFactoryService.CreateScriptHost(_logger, new AutomationPythonProxy(uid, this));

            scriptHost.Compile(package.Script);

            var context = new WirehomeDictionary
            {
                ["automation_uid"] = uid,
                ["logic_id"]       = configuration.Logic.Uid.Id,
                ["logic_version"]  = configuration.Logic.Uid.Version
            };

            // TODO: Remove scope as soon as all automations are migrated.
            scriptHost.SetVariable("scope", context);
            scriptHost.SetVariable("context", context);

            foreach (var variable in configuration.Logic.Variables)
            {
                scriptHost.SetVariable(variable.Key, variable.Value);
            }

            var automation = new AutomationInstance(uid, scriptHost);

            foreach (var setting in settings)
            {
                automation.Settings[setting.Key] = setting.Value;
            }

            return(automation);
        }
コード例 #4
0
        private ServiceInstance CreateServiceInstance(string id, ServiceConfiguration configuration)
        {
            var packageUid = new PackageUid(id, configuration.Version);
            var package    = _repositoryService.LoadPackage(packageUid);

            var scriptHost = _pythonScriptHostFactoryService.CreateScriptHost(_logger);

            scriptHost.Compile(package.Script);

            var serviceInstance = new ServiceInstance(id, configuration, scriptHost);

            if (configuration.Variables != null)
            {
                foreach (var variable in configuration.Variables)
                {
                    serviceInstance.SetVariable(variable.Key, variable.Value);
                }
            }

            return(serviceInstance);
        }
コード例 #5
0
        public void InitializeComponent(Component component, ComponentConfiguration configuration)
        {
            if (component == null)
            {
                throw new ArgumentNullException(nameof(component));
            }
            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            var context = new WirehomeDictionary
            {
                ["component_uid"] = component.Uid
            };

            var adapterPackage = _packageManagerService.LoadPackage(configuration.Logic.Adapter.Uid);

            var adapter = new ScriptComponentAdapter(_pythonScriptHostFactoryService, _componentRegistryService, _scriptComponentAdapterLogger);

            adapter.Compile(component.Uid, adapterPackage.Script);

            if (configuration.Logic.Adapter.Variables != null)
            {
                foreach (var parameter in configuration.Logic.Adapter.Variables)
                {
                    adapter.SetVariable(parameter.Key, parameter.Value);
                }
            }

            context["adapter_uid"]     = adapterPackage.Uid.ToString();
            context["adapter_id"]      = adapterPackage.Uid.Id;
            context["adapter_version"] = adapterPackage.Uid.Version;

            if (string.IsNullOrEmpty(configuration.Logic.Uid?.Id))
            {
                component.SetLogic(new EmptyLogic(adapter));
            }
            else
            {
                var logicPackage = _packageManagerService.LoadPackage(configuration.Logic.Uid);

                var logic = new ScriptComponentLogic(_pythonScriptHostFactoryService, _componentRegistryService, _scriptComponentLogicLogger);
                adapter.MessagePublishedCallback      = message => logic.ProcessAdapterMessage(message);
                logic.AdapterMessagePublishedCallback = message => adapter.ProcessMessage(message);

                logic.Compile(component.Uid, logicPackage.Script);

                if (configuration.Logic.Variables != null)
                {
                    foreach (var parameter in configuration.Logic.Variables)
                    {
                        logic.SetVariable(parameter.Key, parameter.Value);
                    }
                }

                context["logic_uid"]     = logicPackage.Uid.ToString();
                context["logic_id"]      = logicPackage.Uid.Id;
                context["logic_version"] = logicPackage.Uid.Version;

                // TODO: Remove "scope" as soon as it is migrated.
                logic.SetVariable("scope", context);
                logic.SetVariable("context", context);
                logic.AddToWirehomeWrapper("context", context);

                component.SetLogic(logic);
            }

            // TODO: Remove "scope" as soon as it is migrated.
            adapter.SetVariable("scope", context);
            adapter.SetVariable("context", context);
            adapter.AddToWirehomeWrapper("context", context);
        }
コード例 #6
0
        private void SetupComponentBasedOnPackages(Component component, ComponentConfiguration configuration, IDictionary <object, object> context)
        {
            Package                adapterPackage = null;
            IComponentAdapter      adapter;
            ScriptComponentAdapter scriptAdapter = null;

            if (configuration.Logic?.Adapter?.Uid != null)
            {
                adapterPackage = _packageManagerService.LoadPackage(configuration.Logic.Adapter.Uid);

                scriptAdapter = new ScriptComponentAdapter(_pythonScriptHostFactoryService, _componentRegistryService, _scriptComponentAdapterLogger);
                scriptAdapter.Compile(component.Uid, adapterPackage.Script);

                if (configuration.Logic.Adapter.Variables != null)
                {
                    foreach (var parameter in configuration.Logic.Adapter.Variables)
                    {
                        scriptAdapter.SetVariable(parameter.Key, parameter.Value);
                    }
                }

                adapter = scriptAdapter;
            }
            else
            {
                adapter = new EmptyComponentAdapter();
            }

            context["adapter_uid"]     = adapterPackage?.Uid?.ToString();
            context["adapter_id"]      = adapterPackage?.Uid?.Id;
            context["adapter_version"] = adapterPackage?.Uid?.Version;

            if (string.IsNullOrEmpty(configuration.Logic?.Uid?.Id))
            {
                component.SetLogic(new EmptyComponentLogic(adapter));
            }
            else
            {
                var logicPackage = _packageManagerService.LoadPackage(configuration.Logic.Uid);

                var logic = new ScriptComponentLogic(_pythonScriptHostFactoryService, _componentRegistryService, _scriptComponentLogicLogger);
                adapter.MessagePublishedCallback      = message => logic.ProcessAdapterMessage(message);
                logic.AdapterMessagePublishedCallback = message => adapter.ProcessMessage(message);

                logic.Compile(component.Uid, logicPackage.Script);

                if (configuration.Logic.Variables != null)
                {
                    foreach (var parameter in configuration.Logic.Variables)
                    {
                        logic.SetVariable(parameter.Key, parameter.Value);
                    }
                }

                context["logic_uid"]     = logicPackage.Uid.ToString();
                context["logic_id"]      = logicPackage.Uid.Id;
                context["logic_version"] = logicPackage.Uid.Version;

                logic.AddToWirehomeWrapper("context", context);

                component.SetLogic(logic);
            }

            scriptAdapter?.AddToWirehomeWrapper("context", context);
        }