Example #1
0
        private IDisposable BindObserver(
            IMqttMessageBus target,
            TEntity entity,
            TEntityDefinition entityDefinition,
            MqttQualityOfServiceLevel?qualityOfServiceLevel,
            bool retainMessages)
        => GetStateChangeDetector(entity)
        .Subscribe(
            state =>
        {
            var payload = GetStateMessagePayload(entityDefinition, entity);

            var messageBuilder = new MqttApplicationMessageBuilder()
                                 .WithTopic(entityDefinition.StateTopic)
                                 .WithPayload(payload)
                                 .WithRetainFlag(retainMessages);

            if (qualityOfServiceLevel.HasValue)
            {
                messageBuilder = messageBuilder.WithQualityOfServiceLevel(qualityOfServiceLevel.Value);
            }

            var message = messageBuilder.Build();

            if (message.Payload != null)
            {
                target.PublishMessage(message);
            }
        }
            );
        public void BindAll(IMqttApplicationProvider mqttApplicationProvider, IMqttMessageBus mqttMessageBus, bool sendDiscovery = true)
        {
            MqttApplicationProvider = mqttApplicationProvider ?? throw new ArgumentNullException(nameof(mqttApplicationProvider));
            MqttMessageBus          = mqttMessageBus ?? throw new ArgumentNullException(nameof(mqttMessageBus));

            foreach (var entityConfiguration in _entityConfigurations)
            {
                entityConfiguration.Bind(mqttMessageBus, sendDiscovery);
            }
        }
        public void BindAll(IMqttApplicationProvider mqttApplicationProvider, IMqttMessageBus mqttMessageBus, bool sendDiscovery = true)
        {
            MqttApplicationProvider = mqttApplicationProvider ?? throw new ArgumentNullException(nameof(mqttApplicationProvider));
            MqttMessageBus          = mqttMessageBus ?? throw new ArgumentNullException(nameof(mqttMessageBus));

            foreach (var entityBindingManager in _entityBindingManagers)
            {
                entityBindingManager.BindAll(mqttApplicationProvider, mqttMessageBus, sendDiscovery);
            }

            MqttApplicationProvider.Rebuild();
        }
 public HomeAssistantOutboundMqttDispatcher(
     IManagedMqttClient managedMqttClient,
     IMqttApplicationProvider mqttApplicationProvider,
     IMqttEntityControlPanel mqttEntityControlPanel,
     IMqttMessageBus messageBus
     )
 {
     ManagedMqttClient       = managedMqttClient;
     MqttApplicationProvider = mqttApplicationProvider;
     MqttEntityControlPanel  = mqttEntityControlPanel;
     MessageBus = messageBus;
 }
        public virtual void Bind(IMqttMessageBus messageBus, bool sendDiscovery = true)
        {
            if (MessageBus != null)
            {
                throw new InvalidOperationException($"{nameof(Bind)} can only be called once");
            }

            MessageBus = messageBus ?? throw new ArgumentNullException(nameof(messageBus));

            if (sendDiscovery)
            {
                MessageBus.PublishMessage(EntityConfiguration.DiscoveryMessage);
            }
        }
Example #6
0
 public IDisposable Bind(
     IMqttMessageBus target,
     TEntity entity,
     TEntityDefinition entityDefinition,
     MqttQualityOfServiceLevel?qualityOfServiceLevel,
     bool retainMessages
     ) =>
 BindObserver(
     target,
     entity,
     entityDefinition,
     qualityOfServiceLevel,
     retainMessages
     );
        public override void Bind(IMqttMessageBus messageBus, bool sendDiscovery = true)
        {
            foreach (var stateChangeHandler in EntityConfiguration.StateChangeHandlers)
            {
                SubscriptionsByDiscoveryTopic.Add(
                    EntityConfiguration.DiscoveryTopic,
                    stateChangeHandler.Bind(
                        messageBus,
                        EntityConfiguration.Entity,
                        EntityConfiguration.EntityDefinition,
                        EntityConfiguration.StateMessageQualityOfServiceLevel,
                        EntityConfiguration.RetainStateMessages
                        )
                    );
            }

            base.Bind(messageBus, sendDiscovery);
        }