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); } }
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); }