8000 Set state for MQTT entities to 'unavailable' when no connection to broker by definitio · Pull Request #36479 · home-assistant/core · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Set state for MQTT entities to 'unavailable' when no connection to broker #36479

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged

Conversation

definitio
Copy link
Contributor
@definitio definitio commented Jun 5, 2020

Proposed change

Make MQTT entities change state to 'unavailable' when Home Assistant isn't connected to the MQTT broker.

Type of change

  • Dependency upgrade
  • Bugfix (non-breaking change which fixes an issue)
  • New integration (thank you!)
  • New feature (which adds functionality to an existing integration)
  • Breaking change (fix/feature causing existing functionality to break)
  • Code quality improvements to existing code or addition of tests

Example entry for configuration.yaml:

# Example configuration.yaml

Additional information

  • This PR fixes or closes issue: fixes #
  • This PR is related to issue:
  • Link to documentation pull request:

Checklist

  • The code change is tested and works locally.
  • Local tests pass. Your PR cannot be merged unless tests pass
  • There is no commented out code in this PR.
  • I have followed the development checklist
  • The code has been formatted using Black (black --fast homeassistant tests)
  • Tests have been added to verify that the new code works.

If user exposed functionality or configuration variables are added/changed:

If the code communicates with devices, web services, or third-party tools:

  • The manifest file has all fields filled out correctly.
    Updated and included derived files by running: python3 -m script.hassfest.
  • New or updated dependencies have been added to requirements_all.txt.
    Updated by running python3 -m script.gen_requirements_all.
  • Untested files have been added to .coveragerc.

The integration reached or maintains the following Integration Quality Scale:

  • No score or internal
  • 🥈 Silver
  • 🥇 Gold
  • 🏆 Platinum

@emontnemery
Copy link
Contributor

@MartinHjelmare I'm not sure about the polling, do you think it would be better to emit events when MQTT connection status is changed, and have the MQTT availability mixin subscribe to that event?

@definitio can you please add tests + fix the tests which now fail?

@MartinHjelmare
Copy link
Member

Can we use the paho on_disconnect callback to set the availability entity state?

@emontnemery
Copy link
Contributor

@MartinHjelmare Yes, that's what I meant:
Emit events from here:

def _mqtt_on_connect(self, _mqttc, _userdata, _flags, result_code: int) -> None:

And here:
def _mqtt_on_disconnect(self, _mqttc, _userdata, result_code: int) -> None:

And subscribe to those events here:

class MqttAvailability(Entity):

@MartinHjelmare
Copy link
Member

We can use the dispatch helper to communicate to entities.

@emontnemery
Copy link
Contributor
emontnemery commented Jun 5, 2020

Sure, so something like this.

In MqttAvailability:

    def __init__(self, config: dict) -> None:
        async_dispatcher_connect(
            hass, MQTT_CONNECTED, async_mqtt_connected
        )

    def async_mqtt_connected(state):
        self.async_write_ha_state()

And in the connection callbacks:

    dispatcher_send(
            hass, MQTT_CONNECTED, connected
    )

@MartinHjelmare
Copy link
Member

Will the paho callback be called in sync or async context?

We only need coroutines if we need to await something inside.

@emontnemery
Copy link
Contributor

The paho callbacks are called from the paho client's worker thread's context.

@emontnemery
Copy link
Contributor

@definitio can you try to rewrite to remove the polling, something like #36479 (comment)

@definitio
Copy link
Contributor Author
definitio commented Jun 6, 2020 via email

@MartinHjelmare
Copy link
Member
MartinHjelmare commented Jun 6, 2020

Make sure to decorate async callbacks in home assistant with @callback imported from core.py, ie async_mqtt_connected.

Copy link
Member
@MartinHjelmare MartinHjelmare left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good!

@emontnemery emontnemery merged commit ad5101c into home-assistant:dev Jun 7, 2020
@emontnemery
Copy link
Contributor
emontnemery commented Jun 7, 2020

@definitio this is great! I updated the PR description a bit to reflect the final implementation.

Copy link
Contributor
emontnemery commented Jul 8, 2020

@laca75tn The problem you're reporting should be understood and corrected. However, a merged PR is not the right place to report issues. Please create a new issue for your problem.

Edit: The problem as you describe it should be fixed by #37420 which was merged in 0.112.0. Which version did you upgrade to where you saw this problem?

@laca75tn
Copy link
laca75tn commented Jul 8, 2020

@laca75tn The problem you're reporting should be understood and corrected. However, a merged PR is not the right place to report issues. Please create a new issue for your problem.

Edit: The problem as you describe it should be fixed by #37420 which was merged in 0.112.0. Which version did you upgrade to where you saw this problem?

Sorry, my first time submitting an issue. Thanks for your patience

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants
0