From 59b410980ea715a962e5a24f36e41a77f0c50489 Mon Sep 17 00:00:00 2001 From: zhudhjen Date: Wed, 7 Aug 2024 12:31:26 -0700 Subject: [PATCH 1/5] Implement dashboard port from environment variable ESPHOME_DASHBOARD_PORT --- esphome/__main__.py | 2 +- esphome/dashboard/dashboard.py | 5 +++-- esphome/dashboard/settings.py | 3 +++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/esphome/__main__.py b/esphome/__main__.py index 5c197ff486..9fbb81a532 100644 --- a/esphome/__main__.py +++ b/esphome/__main__.py @@ -889,7 +889,7 @@ def parse_args(argv): "--port", help="The HTTP port to open connections on. Defaults to 6052.", type=int, - default=6052, + default=0, ) parser_dashboard.add_argument( "--address", diff --git a/esphome/dashboard/dashboard.py b/esphome/dashboard/dashboard.py index 9de2d39ce2..ded34887f5 100644 --- a/esphome/dashboard/dashboard.py +++ b/esphome/dashboard/dashboard.py @@ -137,9 +137,10 @@ async def async_start(args) -> None: await dashboard.async_setup() sock: socket.socket | None = args.socket address: str | None = args.address - port: int | None = args.port - start_web_server(make_app(args.verbose), sock, address, port, settings.config_dir) + start_web_server( + make_app(args.verbose), sock, address, settings.port, settings.config_dir + ) if args.open_ui: import webbrowser diff --git a/esphome/dashboard/settings.py b/esphome/dashboard/settings.py index 1f05abab4c..4f2e522524 100644 --- a/esphome/dashboard/settings.py +++ b/esphome/dashboard/settings.py @@ -19,6 +19,7 @@ class DashboardSettings: "password_hash", "username", "using_password", + "port", "on_ha_addon", "cookie_secret", "absolute_config_dir", @@ -31,6 +32,7 @@ class DashboardSettings: self.password_hash: str = "" self.username: str = "" self.using_password: bool = False + self.port: int = 6052 self.on_ha_addon: bool = False self.cookie_secret: str | None = None self.absolute_config_dir: Path | None = None @@ -45,6 +47,7 @@ class DashboardSettings: self.using_password = bool(password) if self.using_password: self.password_hash = password_hash(password) + self.port = args.port or os.getenv("ESPHOME_DASHBOARD_PORT") or 6052 self.config_dir = args.configuration self.absolute_config_dir = Path(self.config_dir).resolve() self.verbose = args.verbose From c2174a6408c907d2375df8c0e40ce21a3af2cfe6 Mon Sep 17 00:00:00 2001 From: zhudhjen Date: Wed, 7 Aug 2024 12:33:44 -0700 Subject: [PATCH 2/5] Add testing for setting port from env var and fix pylint --- tests/dashboard/test_web_server.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/dashboard/test_web_server.py b/tests/dashboard/test_web_server.py index a61850abf3..74b4c671c9 100644 --- a/tests/dashboard/test_web_server.py +++ b/tests/dashboard/test_web_server.py @@ -35,14 +35,14 @@ class DashboardTestHelper: return result -@pytest_asyncio.fixture() -async def dashboard() -> DashboardTestHelper: +@pytest_asyncio.fixture(name="dashboard") +async def fixture_dashboard() -> DashboardTestHelper: sock, port = bind_unused_port() args = Mock( ha_addon=True, configuration=get_fixture_path("conf"), - port=port, ) + os.environ["ESPHOME_DASHBOARD_PORT"] = str(port) DASHBOARD.settings.parse_args(args) app = web_server.make_app() http_server = HTTPServer(app) @@ -52,6 +52,7 @@ async def dashboard() -> DashboardTestHelper: assert DASHBOARD.settings.using_password is False assert DASHBOARD.settings.on_ha_addon is True assert DASHBOARD.settings.using_auth is False + assert DASHBOARD.settings.port is port task = asyncio.create_task(DASHBOARD.async_run()) client = AsyncHTTPClient() io_loop = IOLoop(make_current=False) From ca8d18552c62494e4fe3ef140169f1f12dc77d3b Mon Sep 17 00:00:00 2001 From: zhudhjen Date: Wed, 7 Aug 2024 13:05:39 -0700 Subject: [PATCH 3/5] Fix test by add default args of port --- tests/dashboard/test_web_server.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/dashboard/test_web_server.py b/tests/dashboard/test_web_server.py index 74b4c671c9..9cc2c8feb8 100644 --- a/tests/dashboard/test_web_server.py +++ b/tests/dashboard/test_web_server.py @@ -41,6 +41,7 @@ async def fixture_dashboard() -> DashboardTestHelper: args = Mock( ha_addon=True, configuration=get_fixture_path("conf"), + port=0, ) os.environ["ESPHOME_DASHBOARD_PORT"] = str(port) DASHBOARD.settings.parse_args(args) @@ -52,7 +53,7 @@ async def fixture_dashboard() -> DashboardTestHelper: assert DASHBOARD.settings.using_password is False assert DASHBOARD.settings.on_ha_addon is True assert DASHBOARD.settings.using_auth is False - assert DASHBOARD.settings.port is port + assert int(DASHBOARD.settings.port) == port task = asyncio.create_task(DASHBOARD.async_run()) client = AsyncHTTPClient() io_loop = IOLoop(make_current=False) From f80d13079b7bd013b1dd61683ca7536fb09de003 Mon Sep 17 00:00:00 2001 From: zhudhjen Date: Thu, 15 Aug 2024 11:34:43 -0700 Subject: [PATCH 4/5] Follow comment: reimplement with args default value --- esphome/__main__.py | 2 +- esphome/dashboard/dashboard.py | 5 ++--- esphome/dashboard/settings.py | 3 --- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/esphome/__main__.py b/esphome/__main__.py index 9fbb81a532..0c323af158 100644 --- a/esphome/__main__.py +++ b/esphome/__main__.py @@ -889,7 +889,7 @@ def parse_args(argv): "--port", help="The HTTP port to open connections on. Defaults to 6052.", type=int, - default=0, + default=os.environ.get("ESPHOME_DASHBOARD_PORT", 6052), ) parser_dashboard.add_argument( "--address", diff --git a/esphome/dashboard/dashboard.py b/esphome/dashboard/dashboard.py index ded34887f5..9de2d39ce2 100644 --- a/esphome/dashboard/dashboard.py +++ b/esphome/dashboard/dashboard.py @@ -137,10 +137,9 @@ async def async_start(args) -> None: await dashboard.async_setup() sock: socket.socket | None = args.socket address: str | None = args.address + port: int | None = args.port - start_web_server( - make_app(args.verbose), sock, address, settings.port, settings.config_dir - ) + start_web_server(make_app(args.verbose), sock, address, port, settings.config_dir) if args.open_ui: import webbrowser diff --git a/esphome/dashboard/settings.py b/esphome/dashboard/settings.py index 4f2e522524..1f05abab4c 100644 --- a/esphome/dashboard/settings.py +++ b/esphome/dashboard/settings.py @@ -19,7 +19,6 @@ class DashboardSettings: "password_hash", "username", "using_password", - "port", "on_ha_addon", "cookie_secret", "absolute_config_dir", @@ -32,7 +31,6 @@ class DashboardSettings: self.password_hash: str = "" self.username: str = "" self.using_password: bool = False - self.port: int = 6052 self.on_ha_addon: bool = False self.cookie_secret: str | None = None self.absolute_config_dir: Path | None = None @@ -47,7 +45,6 @@ class DashboardSettings: self.using_password = bool(password) if self.using_password: self.password_hash = password_hash(password) - self.port = args.port or os.getenv("ESPHOME_DASHBOARD_PORT") or 6052 self.config_dir = args.configuration self.absolute_config_dir = Path(self.config_dir).resolve() self.verbose = args.verbose From cd67a7cd396e2b69eaffe6047ddbc73724d47db5 Mon Sep 17 00:00:00 2001 From: zhudhjen Date: Thu, 15 Aug 2024 12:28:32 -0700 Subject: [PATCH 5/5] Update test --- tests/dashboard/test_web_server.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/dashboard/test_web_server.py b/tests/dashboard/test_web_server.py index 9cc2c8feb8..224fc4b823 100644 --- a/tests/dashboard/test_web_server.py +++ b/tests/dashboard/test_web_server.py @@ -41,7 +41,6 @@ async def fixture_dashboard() -> DashboardTestHelper: args = Mock( ha_addon=True, configuration=get_fixture_path("conf"), - port=0, ) os.environ["ESPHOME_DASHBOARD_PORT"] = str(port) DASHBOARD.settings.parse_args(args) @@ -53,7 +52,6 @@ async def fixture_dashboard() -> DashboardTestHelper: assert DASHBOARD.settings.using_password is False assert DASHBOARD.settings.on_ha_addon is True assert DASHBOARD.settings.using_auth is False - assert int(DASHBOARD.settings.port) == port task = asyncio.create_task(DASHBOARD.async_run()) client = AsyncHTTPClient() io_loop = IOLoop(make_current=False)