F12 Home Assistant
- Area
- F — Extensibility
- Audience
- operator
- Kind
- feature
- Status
- accepted
- Maturity
- built
- Labels
- extensibility, observability, household, web
The feature in the specification · Read at
Requirements
The integration MUST reach a stack only through sdk-python and only with an integration key, and MUST NOT ask for, accept or store the operator password.
- locked by
- 0.18.0 met
- recorded done
- integration-home-assistantcustom_components/lemonfiber/connection.pytests/test_architecture.py::test_the_stack_is_reached_through_sdk_python_alonetests/test_architecture.py::test_no_password_is_asked_for_or_exchanged
- cited by
- integration-home-assistant@9af5206693integration-home-assistant@b1895ad8dcintegration-home-assistant@5dac39142fintegration-home-assistant@3c2fc33b76integration-home-assistant@1b52264b80integration-home-assistant@9c69c3d05aintegration-home-assistant@b762e8c32fintegration-home-assistant@d7f0baa7e3
Setup MUST take the stack's address, a key and its certificate pin, MUST verify all three against the stack before creating an entry, and MUST name whichever failed.
- locked by
- 0.18.0 met
- recorded done
- integration-home-assistantcustom_components/lemonfiber/config_flow.pytests/test_config_flow.py::test_a_stack_is_added_once_the_address_key_and_pin_are_answered_fortests/test_config_flow.py::test_a_failure_names_the_field_to_change_and_the_form_can_be_answered_againtests/test_config_flow.py::test_a_members_key_is_added_beside_the_stacks_own_as_theirs
- cited by
- integration-home-assistant@4a38e9965cintegration-home-assistant@d7f0baa7e3
A refused key MUST start Home Assistant's reauthentication flow, and the address and pin MUST be changeable without removing the entry.
- locked by
- 0.18.0 met
- recorded done
- integration-home-assistantcustom_components/lemonfiber/config_flow.pytests/test_config_flow.py::test_a_refused_key_is_replaced_by_asking_for_a_new_one_onlytests/test_config_flow.py::test_the_address_and_pin_move_without_removing_the_entrytests/test_config_flow.py::test_the_address_cannot_move_onto_another_stacktests/test_config_flow.py::test_a_new_key_must_reach_the_stack_the_entry_was_added_for
- cited by
- integration-home-assistant@4a38e9965cintegration-home-assistant@d7f0baa7e3
The integration MUST create entities only for what its key's scope admits. A member key MUST yield no technical entity.
- locked by
- 0.18.0 met
- recorded done
- integration-home-assistantcustom_components/lemonfiber/__init__.pytests/test_init.py::test_a_members_key_yields_no_technical_entity_and_follows_their_own_streamtests/test_controls.py::test_a_read_key_gets_no_control
- cited by
- integration-home-assistant@ba93c7db14integration-home-assistant@392bf56cf3integration-home-assistant@d7f0baa7e3
With a read or act key, the integration MUST provide stack health, doctor findings by severity, disk free per mount, active streams, the download queue and its speed, whether the VPN is up, and updates available.
- locked by
- 0.18.0 met
- recorded done
- integration-home-assistantcustom_components/lemonfiber/sensor.pycustom_components/lemonfiber/binary_sensor.pycustom_components/lemonfiber/update.pytests/test_entities.py::test_a_healthy_stack_shows_its_figurestests/test_entities.py::test_the_findings_are_counted_by_severity_and_say_what_happenedtests/test_active_streams.py::test_it_counts_the_sessions_and_says_who_is_watching_whattests/test_update.py::test_a_service_off_its_pin_has_an_update
- cited by
- integration-home-assistant@4a38e9965cintegration-home-assistant@fb83d81427integration-home-assistant@d7f0baa7e3
Each alert MUST be fired as a Home Assistant event at onset and at resolution, carrying what happened, what it means and what to do, and never a credential.
- locked by
- 0.18.0 met
- recorded done
- integration-home-assistantcustom_components/lemonfiber/alerts.pycustom_components/lemonfiber/event.pytests/test_alerts.py::test_an_alert_is_fired_at_onset_and_at_resolution_with_what_to_dotests/test_alerts.py::test_an_alert_names_nothing_the_entry_holdstests/test_alerts.py::test_the_alerts_entity_shows_the_last_alert_and_which_way_it_went
- cited by
- integration-home-assistant@671f893049
State MUST follow the event stream. A value gathered before a gap MUST be shown as unavailable until the stream resumes, and MUST NOT be shown as current.
- locked by
- 0.18.0 met
- recorded done
- integration-home-assistantcustom_components/lemonfiber/coordinator.pytests/test_coordinator.py::test_a_gap_shows_every_stream_built_entity_unavailable_until_the_stream_says_it_again
- cited by
- integration-home-assistant@ba93c7db14integration-home-assistant@ece53fa312integration-home-assistant@d7f0baa7e3
With an act key, the integration MUST provide restart-service and run-doctor buttons, update entities that apply a stack update, and a pause/resume downloads switch, and no control for an action the contract does not list as callable by a key. Each control MUST report the outcome of the job it started.
- locked by
- 0.18.0 met
- recorded done
- integration-home-assistantcustom_components/lemonfiber/button.pycustom_components/lemonfiber/update.pycustom_components/lemonfiber/switch.pycustom_components/lemonfiber/jobs.pytests/test_controls.py::test_a_service_is_restarted_alone_and_the_restart_followedtests/test_controls.py::test_running_the_doctor_follows_its_job_and_reads_the_findings_againtests/test_update.py::test_installing_a_service_agrees_to_its_step_and_reads_the_versions_againtests/test_update.py::test_installing_the_stack_names_no_servicetests/test_controls.py::test_a_call_whose_offer_has_moved_is_refused_in_the_stacks_wordstests/test_controls.py::test_the_downloads_switch_shows_what_the_clients_saytests/test_controls.py::test_toggling_rehearses_then_asks_with_the_offer_and_waits_for_the_clients_to_say_sotests/test_controls.py::test_a_control_whose_action_is_switched_off_is_not_created
- cited by
- integration-home-assistant@4a38e9965cintegration-home-assistant@671f893049integration-home-assistant@392bf56cf3
With a member:<account> key, the integration MUST provide that member's requests by state and what they are playing, in the household's words.
- locked by
- 0.18.0 met
- recorded done
- integration-home-assistantcustom_components/lemonfiber/member.pycustom_components/lemonfiber/media_player.pycustom_components/lemonfiber/sensor.pytests/test_member.py::test_their_requests_are_counted_by_state_and_named_where_they_have_a_titletests/test_member.py::test_what_they_are_playing_is_shown_without_a_controltests/test_member.py::test_after_a_gap_each_is_unavailable_until_the_stream_says_it_again
- cited by
- integration-home-assistant@4a38e9965cintegration-home-assistant@ba93c7db14
Diagnostics MUST withhold the key, the address and the pin.
Every string the integration shows MUST be translated, in English and Dutch at least.
- locked by
- 0.18.0 met
- recorded done
- integration-home-assistantcustom_components/lemonfiber/translations/en.jsoncustom_components/lemonfiber/translations/nl.jsontests/test_translations.py::test_every_string_is_translated_with_the_same_placeholders
- cited by
- integration-home-assistant@ece53fa312integration-home-assistant@392bf56cf3integration-home-assistant@fb83d81427integration-home-assistant@d7f0baa7e3
The integration MUST meet every rule of Home Assistant's integration quality scale up to and including Platinum.
The integration MUST be installable as a HACS custom repository from this organisation, and MUST NOT require any change to Home Assistant itself.
Setup MUST accept a key link (C10-R18) in place of the address, key and pin: it MUST collect the key once over the TLS the link's fingerprint verifies (C10-R20), keep only what the reply carries, and name the reason when the claim is refused.
- locked by
- 0.19.0 open
- recorded done
- integration-home-assistantcustom_components/lemonfiber/connection.pycustom_components/lemonfiber/config_flow.pytests/test_key_link.py::test_a_key_link_collects_its_key_once_and_keeps_only_what_the_reply_carriestests/test_key_link.py::test_a_claim_goes_nowhere_but_the_certificate_the_link_pinstests/test_key_link.py::test_a_claim_the_stack_turns_away_says_why_in_the_stacks_words