/// <summary>
        /// Creates and/or updates the node for the Device. Nodes are somewhat virtual in Homie, you can create them at any time when build your Device tree, as long as <see cref="Initialize(PublishToTopicDelegate, SubscribeToTopicDelegate)"/> is not called yet.
        /// </summary>
        public void UpdateNodeInfo(string nodeId, string friendlyName, string type)
        {
            if (DeviceFactory.ValidateTopicLevel(nodeId, out var validationMessage) == false)
            {
                throw new ArgumentException(validationMessage, nameof(nodeId));
            }

            // Trying to find if that's an existing node.
            NodeInfo nodeToUpdate = null;

            for (var i = 0; i < _nodes.Count; i++)
            {
                var currentNode = (NodeInfo)_nodes[i];
                if (currentNode.Id == nodeId)
                {
                    nodeToUpdate = currentNode;
                }
            }

            // If not found - add new. Otherwise - update.
            if (nodeToUpdate == null)
            {
                nodeToUpdate = new NodeInfo()
                {
                    Id = nodeId, Name = friendlyName, Type = type
                };
                _nodes.Add(nodeToUpdate);
            }
            else
            {
                nodeToUpdate.Name = friendlyName;
                nodeToUpdate.Type = type;
            }
        }
        /// <summary>
        /// Creates a host color property.
        /// </summary>
        public HostColorProperty CreateHostColorProperty(PropertyType propertyType, string nodeId, string propertyId, string friendlyName, ColorFormat colorFormat = ColorFormat.Rgb)
        {
            if (DeviceFactory.ValidateTopicLevel(nodeId, out var validationMessage) == false)
            {
                throw new ArgumentException(validationMessage, nameof(nodeId));
            }
            if (DeviceFactory.ValidateTopicLevel(propertyId, out var validationMessage2) == false)
            {
                throw new ArgumentException(validationMessage2, nameof(nodeId));
            }

            UpdateNodePropertyMap(nodeId, propertyId);

            var createdProperty = new HostColorProperty(propertyType, $"{nodeId}/{propertyId}", friendlyName, colorFormat, "");

            _properties.Add(createdProperty);

            return(createdProperty);
        }
        /// <summary>
        /// Creates a host text property.
        /// </summary>
        public HostTextProperty CreateHostTextProperty(PropertyType propertyType, string nodeId, string propertyId, string friendlyName, string initialValue = "", string unit = "")
        {
            if (DeviceFactory.ValidateTopicLevel(nodeId, out var validationMessage) == false)
            {
                throw new ArgumentException(validationMessage, nameof(nodeId));
            }
            if (DeviceFactory.ValidateTopicLevel(propertyId, out var validationMessage2) == false)
            {
                throw new ArgumentException(validationMessage2, nameof(nodeId));
            }

            UpdateNodePropertyMap(nodeId, propertyId);

            var createdProperty = new HostTextProperty(propertyType, $"{nodeId}/{propertyId}", friendlyName, initialValue, "", unit);

            _properties.Add(createdProperty);

            return(createdProperty);
        }