* Add new integration for WMS WebControl pro using local API
Warema recently released a new local API for their WMS hub
called "WebControl pro". This integration makes use of the
new local API via a new dedicated Python library pywmspro.
For now this integration only supports awnings as covers.
But pywmspro is device-agnostic to ease future extensions.
* Incorporated review feedback from joostlek
Thanks a lot!
* Incorporated more review feedback from joostlek
Thanks a lot!
* Incorporated more review feedback from joostlek
Thanks a lot!
* Fix
* Follow-up fix
* Improve handling of DHCP discovery
* Further test improvements suggested by joostlek, thanks!
---------
Co-authored-by: Joostlek <joostlek@outlook.com>
* Initial commit
* Second commit - with some coverage but errors abount
* Updated testing coverage
* Should be just about ready for PR
* Adding some error handling for wonky acocunts
* Adding USD hardcoded as this is all that is currently supported i believe
* updating snapshots
* updating entity descrition a little
* Addign cashflow in
* adding aggregate sensors
* tweak icons
* refactor some type stuff as well as initialize the pr comment addressing process
* remove empty fields from manifest
* Update homeassistant/components/monarchmoney/sensor.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* move stuff
* get logging out of try block
* get logging out of try block
* using Subscription ID as stored in config entry for unique id soon
* new unique id
* giving cashflow a better unique id
* Moving subscription id stuff into setup of coordinator
* Update homeassistant/components/monarchmoney/config_flow.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* ruff ruff
* ruff ruff
* split ot value and balance sensors... need to go tos leep
* removed icons
* Moved summary into a data class
* efficenty increase
* Update homeassistant/components/monarchmoney/coordinator.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Update homeassistant/components/monarchmoney/coordinator.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Update homeassistant/components/monarchmoney/coordinator.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Update homeassistant/components/monarchmoney/entity.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* refactor continues
* removed a comment
* forgot to add a little bit of info
* updated snapshot
* Updates to monarch money using the new typed/wrapper setup
* backing lib update
* fixing manifest
* fixing manifest
* fixing manifest
* Version 0.2.0
* fixing some types
* more type fixes
* cleanup and bump
* no check
* i think i got it all
* the last thing
* update domain name
* i dont know what is in this commit
* The Great Renaming
* Moving to dict style accounting - as per request
* updating backing deps
* Update homeassistant/components/monarch_money/entity.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Update tests/components/monarch_money/test_config_flow.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Update tests/components/monarch_money/test_config_flow.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Update tests/components/monarch_money/test_config_flow.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Update homeassistant/components/monarch_money/sensor.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* some changes
* fixing capitalizaton
* test test test
* Adding dupe test
* addressing pr stuff
* forgot snapshot
* Fix
* Fix
* Update homeassistant/components/monarch_money/sensor.py
---------
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Add empty weheat integration
* Add first sensor to weheat integration
* Add weheat entity to provide device information
* Fixed automatic selection for a single heat pump
* Replaced integration specific package and removed status sensor
* Update const.py
* Add reauthentication support for weheat integration
* Add test cases for the config flow of the weheat integration
* Changed API and OATH url to weheat production environment
* Add empty weheat integration
* Add first sensor to weheat integration
* Add weheat entity to provide device information
* Fixed automatic selection for a single heat pump
* Replaced integration specific package and removed status sensor
* Add reauthentication support for weheat integration
* Update const.py
* Add test cases for the config flow of the weheat integration
* Changed API and OATH url to weheat production environment
* Resolved merge conflict after adding weheat package
* Apply suggestions from code review
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Added translation keys, more type info and version bump the weheat package
* Adding native property value for weheat sensor
* Removed reauth, added weheat sensor description and changed discovery of heat pumps
* Added unique ID of user to entity
* Replaced string by constants, added test case for duplicate unique id
* Removed duplicate constant
* Added offline scope
* Removed re-auth related code
* Simplified oath implementation
* Cleanup tests for weheat integration
* Added oath scope to tests
---------
Co-authored-by: kjell-van-straaten <kjell.van.straaten@wefabricate.com>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Initial version
* Baseline release
* Refactor based on first PR feedback
* Refactoring based on second PR feedback
* Initial version
* Baseline release
* Refactor based on first PR feedback
* Refactoring based on second PR feedback
* Refactoring based on PR feedback
* Refactoring based on PR feedback
* Remove extra attribute soil type
Soil type isn't really a sensor, but more like a configuration entity.
Move soil type to a different PR to keep this PR simpler.
* Refactor SensoterraSensor to a named tuple
* Implement feedback on PR
* Remove .coveragerc
* Add async_set_unique_id to config flow
* Small fix based on feedback
* Add test form unique_id
* Fix
* Fix
---------
Co-authored-by: Joostlek <joostlek@outlook.com>
* Google Cloud can now be setup from the UI
* mypy
* Add BaseGoogleCloudProvider
* Allow clearing options in the UI
* Address feedback
* Don't translate Google Cloud title
* mypy
* Revert strict typing changes
* Address comments
* Add Lektrico Integration
* Make the changes proposed by Lash-L: new coordinator.py, new entity.py; use: translation_key, last_update_sucess, PlatformNotReady; remove: global variables
* Replace FlowResult with ConfigFlowResult and add tests.
* Remove unused lines.
* Remove Options from condif_flow
* Fix ruff and mypy.
* Fix CODEOWNERS.
* Run python3 -m script.hassfest.
* Correct rebase mistake.
* Make modifications suggested by emontnemery.
* Add pytest fixtures.
* Remove meaningless patches.
* Update .coveragerc
* Replace CONF_FRIENDLY_NAME with CONF_NAME.
* Remove underscores.
* Update tests.
* Update test file with is and no config_entries. .
* Set serial_number in DeviceInfo and add return type of the async_update_data to DataUpdateCoordinator.
* Use suggested_unit_of_measurement for KILO_WATT and replace Any in value_fn (sensor file).
* Add device class duration to charging_time sensor.
* Change raising PlatformNotReady to raising IntegrationError.
* Test the unique id of the entry.
* Rename PF Lx with Power factor Lx and remove PF from strings.json.
* Remove comment.
* Make state and limit reason sensors to be enum sensors.
* Use result variable to check unique_id in test.
* Remove CONF_NAME from entry and __init__ from LektricoFlowHandler.
* Remove session parameter from LektricoDeviceDataUpdateCoordinator.
* Use config_entry: ConfigEntry in coordinator.
* Replace Connected,NeedAuth with Waiting for Authentication.
* Use lektricowifi 0.0.29.
* Use lektricowifi 0.0.39
* Use lektricowifi 0.0.40
* Use lektricowifi 0.0.41
* Replace hass.data with entry.runtime_data
* Delete .coveragerc
* Restructure the user step
* Fix tests
* Add returned value of _async_update_data to class DataUpdateCoordinator
* Use hw_version at DeviceInfo
* Remove a variable
* Use StateType
* Replace friendly_name with device_name
* Use sentence case in translation strings
* Uncomment and fix test_discovered_zeroconf
* Add type LektricoConfigEntry
* Remove commented code
* Remove the type of coordinator in sensor async_setup_entry
* Make zeroconf test end in ABORT, not FORM
* Remove all async_block_till_done from tests
* End test_user_setup_device_offline with CREATE_ENTRY
* Patch the full Device
* Add snapshot tests
* Overwrite the type LektricoSensorEntityDescription outside of the constructor
* Test separate already_configured for zeroconf
---------
Co-authored-by: mihaela.tarjoianu <mihaela.tarjoianu@scada.ro>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
* Deako integration using pydeako
* fix: address feedback
- make unit tests more e2e
- use runtime_data to store connection
* fix: address feedback part 2
- added better type safety for Deako config entries
- refactored the config flow tests to use a conftest mock instead of directly patching
- removed pytest.mark.asyncio test decorators
* fix: address feedback pt 3
- simplify config entry type
- add test for single_instance_allowed
- remove light.py get_state(), only used once, no need to be separate function
* fix: ruff format
* Update homeassistant/components/deako/__init__.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
---------
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Initial SMLIGHT integration
Signed-off-by: Tim Lunn <tl@smlight.tech>
* Generated content
Signed-off-by: Tim Lunn <tl@smlight.tech>
* Cleanup LOGGING
* Use runtime data
* Call super first
* coordinator instance attributes
* Move coordinatorEntity and attr to base class
* cleanup sensors
* update strings to use sentence case
* Improve reauth flow on incorrect credentials
* Use fixture for config_flow tests and test to completion
* Split uptime hndling into a new uptime sensor entity
* Drop server side events and internet callback
will bring this back with binary sensor Platform
* consolidate coordinator setup
* entity always include connections
* get_hostname tweak
* Add tests for init, coordinator and sensor
* Use custom type SmConfigEntry
* update sensor snapshot
* Drop reauth flow for later PR
* Use _async_setup for initial setup
* drop internet to be set later
* sensor fixes
* config flow re
* typing fixes
* Bump pysmlight dependency to 0.0.12
* dont trigger invalid auth message when first loading auth step
* Merge uptime sensors back into main sensor class
* clarify uptime handling
* Apply suggestions from code review
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* address review comments
* pass host as parameter to the dataCoordinator
* drop uptime sensors for a later PR
* update sensor test snapshot
* move coordinator unique_id to _async_setup
* fix CI
* Apply suggestions from code review
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* drop invalid_auth test tag
* use snapshot_platform, update fixtures
* Finish all tests with abort or create entry
* drop coordinator tests and remove hostname support
* add test for update failure on connection error
* use freezer for update_failed test
* fix pysmlight imports
---------
Signed-off-by: Tim Lunn <tl@smlight.tech>
Co-authored-by: Tim Lunn <tim@feathertop.org>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Add support for Fujitsu HVAC devices
* Add the entity code to .coveragerc
* Only include code that can fail in the try/except block
Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>
* Remove empty keys from manifest
* Remove VERSION as it's already the default
* Remve the get_devices function and use asyncio.gather to parallelize dev updates
* Move initial step to a function
* Let KeyError bubble up. If we are passed an invalid mode it's probably worth raising an exception.
* Await the gather
* Use the async version of the refresh_auth call
* Use the serial number as unique id
* Use HA constant for precision
* Use dev instead of self._dev
* Move to property decorated methods
* Remove bidict dependency
* Setup one config entry for our api credentials instead of per device
* Remove bidict from requirements
* Signout and remove our api object on unload
* Use app credentials from ayla_iot_unofficial
* Use entry_id as a key to store our API object
* Delete unused code
* Create reverse mappings from forward mapping instead of hardcoding them
* Clean up the property methods
* Only import part of config_entries we are using
* Implement suggested changes
* Fix tests to use new API consts
* Add support for reauth
* Use a coordinator instead of doing per-entity refresh
* Auto is equivalent to HEAT_COOL not AUTO
* Add ON and OFF to list of supported features
* Use the mock_setup_entry fixture for the reauth tests
* Parametrize testing of config flow exceptions
* Only wrap fallable code in try/except
* Add tests for coordinator
* Use self.coordinator_context instead of self._dev.device_serial_number
* Move timeout to ayla_iot_unofficial
* Add description for is_europe field
* Bump version of ayla-iot-unofficial
* Remove turn_on/turn_off warning
* Move coordinator creating to __init__
* Add the type of coordinator to the CoordiatorEntity
* Update docstring for FujitsuHVACDevice constructor
* Fix missed self._dev to dev
* Abort instead of showing the form again with an error when usernames are different
* Remove useless argument
* Fix tests
* Implement some suggestions
* Use a device property the maps to the coordinator data
* Fix api sign out when unloading the entry
* Address comments
* Fix device lookup
* Move API sign in to coordinator setup
* Get rid of FujitsuHVACConfigData
* Fix async_setup_entry signature
* Fix mock_ayla_api
* Cleanup common errors
* Add test to check that re adding the same account fails
* Also patch new_ayla_api in __init__.py
* Create a fixture to generate test devices
* Add a setup_integration function that does the setup for a mock config entry
* Rework unit tests for the coordinator
* Fix typos
* Use hass session
* Rework reauth config flow to only modify password
* Update name to be more use-friendly
* Fix wrong type for entry in async_unload_entry
* Let TimeoutError bubble up as teh base class handles it
* Make the mock ayla api return some devices by default
* Move test to test_climate.py
* Move tests to test_init.py
* Remove reauth flow
* Remove useless mock setup
* Make our mock devices look real
* Fix tests
* Rename fujitsu_hvac to fujitsu_fglair and rename the integration to FGLair
* Add the Fujitsu brand
* Add a helper function to generate an entity_id from a device
* Use entity_id to remove hardcoded entity ids
* Add a test to increase code coverage
---------
Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
Co-authored-by: Joostlek <joostlek@outlook.com>
* test storage save and load
* fix bug exposed by test
* refactor test
* add JSON for test account/location
* create helpers to load JSON
* refactor test
* baseline refactor
* tweak
* update requiremenst
* rationalise code
* remove conditional in test
* refactor test
* mypy fix
* tweak tests
* working test
* working test 4
* working test 5
* add typed dicts
* working dtms
* lint
* fix dtm asserts
* doc strings
* list
* tweak conditional
* tweak test data sets to extend coverage
* leverage conftest.py for subsequent tests
* revert test storage
* revert part two
* rename symbols
* remove anachronism
* stop unwanted DNS lookup
* Clean up type ignores
* Format
---------
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* Add ElevenLabs text-to-speech integration
* Remove commented out code
* Use model_id instead of model_name for elevenlabs api
* Apply suggestions from code review
Co-authored-by: Sid <27780930+autinerd@users.noreply.github.com>
* Use async client instead of sync
* Add ElevenLabs code owner
* Apply suggestions from code review
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
* Set entity title to voice
* Rename to elevenlabs
* Apply suggestions from code review
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
* Allow multiple voices and options flow
* Sort default voice at beginning
* Rework config flow to include default model and reloading on options flow
* Add error to strings
* Add ElevenLabsData and suggestions from code review
* Shorten options and config flow
* Fix comments
* Fix comments
* Add wip
* Fix
* Cleanup
* Bump elevenlabs version
* Add data description
* Fix
---------
Co-authored-by: Sid <27780930+autinerd@users.noreply.github.com>
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
Co-authored-by: Michael Hansen <mike@rhasspy.org>
Co-authored-by: Joostlek <joostlek@outlook.com>
Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
* Add Pinecil integration
* Refactor with new library
* Add tests for config flow, remove unused code
* requested changes
* update requirements
* Move some sensor values to diagnostics, add tests for sensors
* User service uuid in discovery
* fix manufacturer name
* Bump pynecil to version 0.2.0
* Rename integration to IronOS
* Recreate snapshot
* Update strings
* type checking
* Update snapshot
* Add async_setup to coordinator
* Show device id with serial number
* Added missing boost to operation mode states
* remove super call
* Refactor
* tests
* Add an integration for Bryant Evolution HVAC systems.
* Update newly created tests so that they pass.
* Improve compliance with home assistant guidelines.
* Added tests
* remove xxx
* Minor test cleanups
* Add a test for reading HVAC actions.
* Update homeassistant/components/bryant_evolution/__init__.py
Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>
* Update homeassistant/components/bryant_evolution/climate.py
Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>
* Update homeassistant/components/bryant_evolution/climate.py
Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>
* Update homeassistant/components/bryant_evolution/climate.py
Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>
* Update homeassistant/components/bryant_evolution/climate.py
Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>
* Update homeassistant/components/bryant_evolution/climate.py
Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>
* Update homeassistant/components/bryant_evolution/config_flow.py
Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>
* Address reviewer comments.
* Address additional reviewer comments.
* Use translation for exception error messages.
* Simplify config flow.
* Continue addressing comments
* Use mocking rather than DI to provide a for-test client in tests.
* Fix a failure in test_config_flow.py
* Track host->filename in strings.json.
* Use config entry ID for climate entity unique id
* Guard against fan mode returning None in async_update.
* Move unavailable-client check from climate.py to init.py.
* Improve test coverage
* Bump evolutionhttp version
* Address comments
* update comment
* only have one _can_reach_device fn
* Auto-detect which systems and zones are attached.
* Add support for reconfiguration
* Fix a few review comments
* Introduce multiple devices
* Track evolutionhttp library change that returns additional per-zone information during enumeration
* Move construction of devices to init
* Avoid triplicate writing
* rework tests to use mocks
* Correct attribute name to unbreak test
* Pull magic tuple of system-zone into a constant
* Address some test comments
* Create test_init.py
* simplify test_reconfigure
* Replace disable_auto_entity_update with mocks.
* Update tests/components/bryant_evolution/test_climate.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Update tests/components/bryant_evolution/test_climate.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Update tests/components/bryant_evolution/test_config_flow.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Update homeassistant/components/bryant_evolution/config_flow.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Update tests/components/bryant_evolution/test_config_flow.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Update tests/components/bryant_evolution/test_config_flow.py
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* fix test errors
* do not access runtime_data in tests
* use snapshot_platform and type fixtures
---------
Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Initial import 0.0.2
* Fixes to URL, and removed commits
* Initial import 0.0.2
* Fixes to URL, and removed commits
* Added first test for iotty
* First release
* Reviewers request #1
- Removed clutter
- Added support for new naming convention for IottySmartSwitch entity
* Removed commmented code
* Some modifications
* Modified REST EP for iotty CloudApi
* Initial import 0.0.2
* Fixes to URL, and removed commits
* Added first test for iotty
* First release
* Rebased and resolved conflicts
* Reviewers request #1
- Removed clutter
- Added support for new naming convention for IottySmartSwitch entity
* Removed commmented code
* Some modifications
* Modified REST EP for iotty CloudApi
* Removed empty entries in manifest.json
* Added test_config_flow
* Fix as requested by @edenhaus
* Added test_init
* Removed comments, added one assert
* Added TEST_CONFIG_FLOW
* Added test for STORE_ENTITY
* Increased code coverage
* Full coverage for api.py
* Added tests for switch component
* Converted INFO logs onto DEBUG logs
* Removed .gitignore from commits
* Modifications to SWITCH.PY
* Initial import 0.0.2
* Fixes to URL, and removed commits
* Added first test for iotty
* First release
* Rebased and resolved conflicts
* Fixed conflicts
* Reviewers request #1
- Removed clutter
- Added support for new naming convention for IottySmartSwitch entity
* Removed commmented code
* Some modifications
* Modified REST EP for iotty CloudApi
* Removed empty entries in manifest.json
* Added test_config_flow
* Some modifications
* Fix as requested by @edenhaus
* Added test_init
* Removed comments, added one assert
* Added TEST_CONFIG_FLOW
* Added test for STORE_ENTITY
* Increased code coverage
* Full coverage for api.py
* Added tests for switch component
* Converted INFO logs onto DEBUG logs
* Removed .gitignore from commits
* Modifications to SWITCH.PY
* Fixed tests for SWITCH
* First working implementation of Coordinator
* Increased code coverage
* Full code coverage
* Missing a line in testing
* Update homeassistant/components/iotty/__init__.py
Co-authored-by: Robert Resch <robert@resch.dev>
* Update homeassistant/components/iotty/__init__.py
Co-authored-by: Robert Resch <robert@resch.dev>
* Modified coordinator as per request by edenhaus
* use coordinator entities for switches
* move platforms to constants
* fix whitespace with ruff-format
* correct iotty entry in application_credentials list
* minor style improvements
* refactor function name
* handle new and deleted devices
* improve code for adding devices after first initialization
* use typed config entry instead of adding known devices to hass.data
* improve iotty entity removal
* test listeners update cycle
* handle iotty as devices and not only as entities
* fix test typing for mock config entry
* test with fewer mocks for an integration test style opposed to the previous unit test style
* remove useless tests and add more integration style tests
* check if device_to_remove is None
* integration style tests for turning switches on and off
* remove redundant coordinator tests
* check device status after issuing command in tests
* remove unused fixtures
* add strict typing for iotty
* additional asserts and named snapshots in tests
* fix mypy issues after enabling strict typing
* upgrade iottycloud version to 0.1.3
* move coordinator to runtime_data
* remove entity name
* fix typing issues
* coding style fixes
* improve tests coding style and assertion targets
* test edge cases when apis are not working
* improve tests comments and assertions
---------
Co-authored-by: Robert Resch <robert@resch.dev>
Co-authored-by: Shapour Nemati <shapour.nemati@iotty.com>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
Co-authored-by: shapournemati-iotty <130070037+shapournemati-iotty@users.noreply.github.com>
* Add Israel Rail integration
* israel_rail tests
* israel_rail tests
* 1. use entry.runtime
2. DataConnection - data class
3. remove unique id from coordinator
4. use EntityDescription
* add a list of stations in user form
* 1. extend ConfigEntry
2. remove unused pop
3. use IsraelRailSensorEntityDescription to have only one kind of Sensor
4. add test for already configured
5. use snapshot in test
* change user step description
* 1. ConfigEntry[IsraelRailDataUpdateCoordinator]
2. remove redundant attributes
3. use snapshot_platform helper
* remove attr
* remove attr
* move test to test_init.py
* Fix
* Fix
* Fix
* Fix
* fix timezone
* fix
* fix
---------
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
* Init Autarco integration
* Add integration code with tests
* Update every 5 minutes
* Process all feedback from Joost
* Bump lib to v2.0.0
* Add more then one site if present
* Fix issue with entity translation
* Update the test for sensor entities
* Fix round two based on feedback from Joost
* Add autarco to strict typing
* Update tests/components/autarco/test_config_flow.py
* Update tests/components/autarco/test_config_flow.py
---------
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>