请选择 进入手机版 | 继续访问电脑版

『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 141|回复: 3

Visual Studio Code调试Home Assistant代码(Docker版)

[复制链接]

23

主题

302

帖子

1934

积分

论坛技术达人

积分
1934
金钱
1607
HASS币
110

活跃会员教程狂人

发表于 2019-9-10 21:13:12 | 显示全部楼层 |阅读模式
本帖最后由 cnk700i 于 2019-9-10 21:14 编辑

备注

  • 拷贝自博客,排版格式随缘,如有问题可看原文。。。
  • 不设置隐藏了,觉得有用帮忙顶一下让更多人看到~

正文




上次使用VS Code在WSL下实现了Home Assistant代码的调试,对Visual Studio Code的远程调试功能有了一定的了解,现在再回头看一开始就折腾的Docker远程调试,很多问题迎刃而解。

0.环境
  • Win10 + Docker Desktop 2.1.0.1
  • Ubuntu 18.04 + Docker CE 19.03.1
  • Visual Studio Code 1.38.0
    INFO:Windows需要Docker Desktop相关的工具提供支持。

1.方法简介
Docker容器环境开发调试,需要一台Linux主机提供容器,本地Windows使用VS Code远程到容器环境运行代码。与使用WSL开发调试相比,有一个好处就是代码在Linux主机上,可以在不同的终端主机通过VS Code远程登录开发调试。不过缺点就是本地代码是没法直接和远程环境同步,不像WSL所加载的代码目录在Windows上是可以直接访问修改的。
使用Docker容器环境开发调试,可以根据项目工程的devcontainer.json文件实现镜像构建、插件安装、运行参数设定等一系列过程实现自动部署容器开发环境;也可以将代码加载到已有的容器中去运行。前一种由于本人理解有限加上上手较难,有兴趣可以观看VS Code文档结合HA代码工程(Github上的项目带有配置文件)实践部署。这里只介绍后一种方法,目标是以最简单的方法实现调试Home Assistant代码。

2.Linux
docker安装过程省略。
  • 开启Docker开启远程访问。
    复制
    1
    vi /lib/systemd/system/docker.service

    复制
    1
    2
    3
    4
    # /lib/systemd/system/docker.service 文件
    # 修改ExecStart行
    ExecStart=/usr/bin/dockerd  -H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock
    #

    WARN:这里的端口号不是自定义端口,只能用2375或2376,另外2375是不加密不验证的端口,有安全方面的要求请启用2376端口并进行相应设置,具体方法自行搜索。
  • 调大用户监视文件数,详细说明可以看这里

    • 编辑配置文件
      复制
      1
      vi /etc/sysctl.conf

      复制
      1
      2
      3
      # /etc/sysctl.conf 文件
      # 末尾加入
      fs.inotify.max_user_watches = 81920

      INFO:默认数值是8192,最大是524,288。
      INFO:容器的参数和宿主机一致,只能在宿主机修改。
    • 使能配置。
      复制
      1
      sysctl -p

  • 创建测试环境容器,用使用官方的镜像即可,根据需要调整版本号。
    复制
    1
    2
    docker pull homeassistant/home-assistant:0.98.0
    docker run -it --name demo -p 8456:8123 homeassistant/home-assistant:0.98.0 /bin/sh -c "while sleep 1000; do :; done"

    INFO:也可以不设置端口映射,VS Code提供Remote-Containers: Forward Port from Container功能,分配到端口后可以在Windows通过localhost:[转发端口]访问。


2.Windows
Docker Desktop安装过程省略。
  • VS Code安装Docker插件、RemoteDevelopment插件。

                                   
    登录/注册后可看大图

                                   
    登录/注册后可看大图
  • 配置docker连接信息。

                                   
    登录/注册后可看大图

                                   
    登录/注册后可看大图
  • 连接容器,将会新建远程窗口,有两种方法。

    • 方法1:远程资源管理器中,选择容器->”Connect to Container”

                                     
      登录/注册后可看大图
    • 方法2:Docker插件中,容器窗->容器右键->”Attach Visual Studio Code”

                                     
      登录/注册后可看大图
    • 新窗口成功连接容器(左下角有变化)

                                     
      登录/注册后可看大图

  • 在容器中安装Python插件,代码调试需要。

                                   
    登录/注册后可看大图
  • 准备代码目录。

    • 打开主目录,因为官方镜像中程序代码位于/usr/src/homeassistant/homeassistant,可以直接使用/usr/src/homeassistant作为主目录而无需新建。

                                     
      登录/注册后可看大图
    • 保留homeassitant文件夹,删除其它非必要文件(可选)。

                                     
      登录/注册后可看大图
    • 新建config目录,作为HA配置目录。
      INFO:VS Code的文件资源管理中直接编辑即可,也支持拖拽上传下载的。
    • 新建debug.py,用于启动HA,内容如下:
      复制
      1
      2
      3
      4
      5
      from homeassistant import __main__ as hass_entry
      import sys

      if __name__ == "__main__":
          sys.exit(hass_entry.main())
    • 新建.vscode目录,.vscode目录下新建launch.json文件
      复制
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      //launch.json内容
      {
          // 使用 IntelliSense 了解相关属性。
          // 悬停以查看现有属性的描述。
          // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
          "version": "0.2.0",
          "configurations": [
              {
                  "name": "Home Assistant Debug",
                  "type": "python",
                  "request": "launch",
                  "program": "${workspaceRoot}/debug.py", //运行HA
                  "console": "integratedTerminal",
                  "args": ["-c", "config"], //指定配置文件
              }
          ]
      }
    • 最终目录结构如图。

                                     
      登录/注册后可看大图



3.调试
在远程窗口(连接到容器)下,菜单栏->调试->启动调试(快捷键F5)开始运行调试。如下图,可以看到能够正常追踪HA主程序断点以及自定义组件代码断点。

4.其它
  • 修改过的代码应及时备份到本地,以免删除容器丢失代码,也可以根据VS Code文档指引自动同步至本地。
  • 避免在断点停下来时候直接结束调试,这样进程不会退出无法释放端口,需要手工终止进程。
    复制
    1
    2
    3
    # VS Code新建终端
    ps -aux | grep python | grep config
    kill -9 [进程号]


5.小结
  • 远程调试不需要本地安装python运行环境,代码解析由远端的python运行;远程调试模式下远端会安装有VS Code服务程序,本地VS Code作为操作界面实现交互。
  • 得益于官方HA镜像的主程序代码没有在python安装目录,不需要另外下载代码包。另外不同版本的代码文件可以直接docker pull下来,初步使用下来比用WSL部署更方便。

评分

参与人数 1金钱 +20 收起 理由
neroxps + 20 终于不用靠 logger debug了

查看全部评分

博客 https://ljr.im
回复

使用道具 举报

2

主题

96

帖子

1522

积分

论坛技术达人

积分
1522
金钱
1421
HASS币
0
发表于 2019-9-11 13:53:07 | 显示全部楼层
如果直接用ptvsd和lz的有什么区别吗
https://www.home-assistant.io/components/ptvsd/
回复

使用道具 举报

12

主题

1007

帖子

3212

积分

论坛元老

Rank: 8Rank: 8

积分
3212
金钱
2205
HASS币
0
发表于 2019-9-11 14:56:17 | 显示全部楼层
高大上,小白用户发来感谢信
回复

使用道具 举报

23

主题

302

帖子

1934

积分

论坛技术达人

积分
1934
金钱
1607
HASS币
110

活跃会员教程狂人

 楼主| 发表于 2019-9-11 18:15:22 来自手机 | 显示全部楼层
本帖最后由 cnk700i 于 2019-9-12 00:18 编辑
blindlight 发表于 2019-9-11 13:53
如果直接用ptvsd和lz的有什么区别吗
https://www.home-assistant.io/components/ptvsd/

个人理解,ptvsd是python的一种远程调试方法,Remote Development插件好像实际上用的也是ptvsd,不过增加了一些管理功能。如果只用ptvsd组件,得本地代码有一份代码和远程一致,不像Remote Development可以直接编辑远程的代码。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2019-9-23 08:46 , Processed in 0.087946 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表