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