19个文件已删除
35个文件已添加
5 文件已重命名
15个文件已修改
| New file |
| | |
| | | ## 从备份文件文件中恢复 |
| | | |
| | | |
| | | |
| | | HomeAssistant支持从备份文件串恢复已配置好的HomeAssistant |
| | | |
| | |  |
| New file |
| | |
| | | ### 初始化配置HomeAssistant |
| | | |
| | | #### 首次打开HomeAssistant |
| | | |
| | | 首次打开HomeAssistant通过,路由器为其分配的IP地址加端口号即可进行HomeAssistant. |
| | | |
| | | 格式如下: |
| | | |
| | | ``` |
| | | http://Ip:Port |
| | | 如:http://192.168.3.2:8123 |
| | | 基中:8123为其默认的端口后,当然,系统初始化成功后,可以改. |
| | | ``` |
| | | |
| | | 如下图所示: |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416174015324.png" style="zoom:67%;" /> |
| | | |
| | | 点击"创建我智能家家居"按进行下一步 |
| | | |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416174141899.png" style="zoom:67%;" /> |
| | | |
| | | 在这里我们输入姓名,用户名,密码,确认密码 |
| | | 这里我们使用统一的信息 |
| | | |
| | | ``` |
| | | 姓名:岱特智能 |
| | | 用户名:dtuser |
| | | 密码:****** |
| | | 确认密码:***** |
| | | ``` |
| | | |
| | | **注意:上述密码为了安全,没有显示,请咨询系统管理员获取真正的密码.** |
| | | |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416174647992.png" style="zoom:67%;" /> |
| | | |
| | | 点击"创建帐户", |
| | | |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416174907500.png" style="zoom:67%;" /> |
| | | |
| | | 这一步,会要求你输入位置,输入城市点获取,如果取下到会报错.没关系,直接下一步即可,系统配置完成后,还可更改. |
| | | |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416175039994.png" style="zoom:67%;" /> |
| | | |
| | | 这一步是要求,你输下所属的国家与地区,它会自动判断出来,国家,直接点下一步即可. |
| | | |
| | | 此时,它可能还会弹出一个对话框框,帮你检测位置 ,点确定即可 |
| | | |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/1744797155585.png" style="zoom: 67%;" /> |
| | | |
| | | 如果不想让其检测,直接点取消即可,因为其检测折可能很慢,所以,直接点取消,选择中国即可. |
| | | |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416180125174.png" style="zoom:67%;" /> |
| | | |
| | | 这里的几项,全部不用选,直接下一步 |
| | | |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416180225320.png" style="zoom:67%;" /> |
| | | |
| | | 这一步,系统会自动扫描局域网中的能直接入的设备.直接点击完成, |
| | | |
| | | 然后,系统会转到如下界面 |
| | | |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416180400766.png" style="zoom:67%;" /> |
| | | |
| | | 可能要持续一阵,等待其完成即可. |
| | | |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416180639029.png" style="zoom:67%;" /> |
| | | |
| | | 开始第一次,可能很慢 |
| | | |
| | | 首次完成如下显示 |
| | | |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416180715339.png" style="zoom:67%;" /> |
| | | |
| | | #### 更新必要的组件 |
| | | |
| | | 首次登录,可能会显示更新,如此时显示 |
| | | |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416181146547.png" style="zoom:67%;" /> |
| | | |
| | | 提示更新Home Assistnat Operating System Update,点击如下按钮,以弹出的对话框中,点更新按钮 |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416181323600.png" style="zoom:67%;" /> |
| | | |
| | | 如下图所示,系统将会,进行更新 |
| | | |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416181455221.png" style="zoom:67%;" /> |
| | | |
| | | 注意,这个操作,一般是从两个地方获取更新包,一是github一个是docker的仓库,所以,**要保持科学上网的畅通**。这个过程 ,估计要几分钟,需要耐心等等,也有可能会更新失败,然后,再次更新。 |
| | | |
| | | 更新时,如果网络有问题可能会出在日志 中报出如下错误 |
| | | |
| | | ``` |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.439 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.440 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.440 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.440 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | [09:26:17] INFO: Home Assistant Core finish process exit code 0 |
| | | [09:26:17] INFO: Home Assistant Core service shutdown |
| | | s6-rc: info: service legacy-services successfully stopped |
| | | s6-rc: info: service legacy-cont-init: stopping |
| | | s6-rc: info: service legacy-cont-init successfully stopped |
| | | s6-rc: info: service fix-attrs: stopping |
| | | s6-rc: info: service fix-attrs successfully stopped |
| | | s6-rc: info: service s6rc-oneshot-runner: stopping |
| | | s6-rc: info: service s6rc-oneshot-runner successfully stopped |
| | | s6-rc: info: service s6rc-oneshot-runner: starting |
| | | s6-rc: info: service s6rc-oneshot-runner successfully started |
| | | s6-rc: info: service fix-attrs: starting |
| | | s6-rc: info: service fix-attrs successfully started |
| | | s6-rc: info: service legacy-cont-init: starting |
| | | s6-rc: info: service legacy-cont-init successfully started |
| | | s6-rc: info: service legacy-services: starting |
| | | services-up: info: copying legacy longrun home-assistant (no readiness notification) |
| | | s6-rc: info: service legacy-services successfully started |
| | | 2025-04-16 17:28:26.876 ERROR (MainThread) [homeassistant.components.homeassistant_alerts.coordinator] Timeout fetching homeassistant_alerts data |
| | | 2025-04-16 17:51:56.276 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain hassio.update |
| | | 2025-04-16 17:51:56.278 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain cloud.tts |
| | | 2025-04-16 17:51:56.278 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain mobile_app.notify |
| | | 2025-04-16 17:51:56.278 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain backup.sensor |
| | | 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain energy.sensor |
| | | 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain sun.sensor |
| | | 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain homeassistant.scene |
| | | 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain hassio.binary_sensor |
| | | 2025-04-16 17:51:56.280 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain hassio.sensor |
| | | ``` |
| | | |
| | | 上述错误多是由于网络问题引起的,要去检是科学上网是否还正常. |
| | | |
| | | 更完完成后,再次启动后,会显示没有可用的更新 |
| | | |
| | |  |
| | | |
| | | |
| | | |
| | | #### 配置-通用 |
| | | |
| | | 点击,开始,通用 |
| | | |
| | |  |
| | | |
| | | 更改名称为:岱特智能 |
| | | 其它的不变 |
| | | |
| | |  |
| | | |
| | | #### 配置-网络-主机名 |
| | | |
| | |  |
| | | |
| | | 把主机名配置成为局域网中唯一的,实际让就是计算机名,因为同一局域网中,计算机名,不允许相同 |
| | | |
| | | #### 配置-设置-加载项 |
| | | |
| | | 加载项中有许多必装组件,需要一一安装,首次进入时,可能会显示如下页面 |
| | | |
| | |  |
| | | |
| | | 点击下角的"加载项商店" |
| | | |
| | |  |
| | | |
| | | |
| | | |
| | | ##### 安装File editor |
| | | |
| | |  |
| | | |
| | | |
| | | |
| | | File editor 是一个用于修改HA的配置文件的集成工具,属必装项,点击安装 |
| | | |
| | |  |
| | | |
| | | 点击安装,系统会在后台自动安装此插件, |
| | |  |
| | | |
| | | 安装完成后,会自动重启 |
| | | |
| | | 有时也会提示安装失败 |
| | | |
| | |  |
| | | |
| | | 这种经查看日志 多为网强行问题无法访问.docker.io,这是因为科学上风的原因,重点排查网络,安装成功后,再次进入会显示如下界面 |
| | | |
| | |  |
| | | |
| | | 勾选,开机启动,自动恢复,显示于侧边栏 |
| | | |
| | |  |
| | | |
| | | 点击启动,或重启,将会在侧边栏看到此图标,点击打开网页界面 |
| | | |
| | |  |
| | | |
| | | 能看到如下界面,说明安装成功 |
| | | |
| | |  |
| | | |
| | | 此时加载项中,就多出了File editor选项 |
| | | |
| | |  |
| | | |
| | | ##### 安装Samba share插件 |
| | | |
| | | Samba share插件是一个提供共享目录的方式允行其它计算机用这种方式查看编辑ha的文件的组件. |
| | | |
| | |  |
| | | |
| | | 点击安装 |
| | | |
| | |  |
| | | |
| | | 安装失败时,会有如下提下提示 |
| | | |
| | |  |
| | | |
| | |  |
| | | |
| | | 打开自动恢复 |
| | | |
| | |  |
| | | |
| | | 接下来我们需要到配置选项中 |
| | | |
| | |  |
| | | |
| | | 此处我们设置如下信息 |
| | | |
| | | ``` |
| | | Username:dtuser |
| | | Password:***** # 此处请咨询管理员 |
| | | Workgroup:WORKGROUP # 保持不变 |
| | | ``` |
| | | |
| | | 更改完成后,有如下配置 |
| | | |
| | |  |
| | | |
| | | 配置 完成后,点击启动 |
| | | |
| | |  |
| | | |
| | | 启动成功后,会出下图显示 |
| | | |
| | |  |
| | | |
| | | 此时,如果,与HA在同一局域网,我们可以使用如下方式查看HA的文件目录 |
| | | |
| | | 在地址栏输入\\HA的IP |
| | | |
| | |  |
| | | |
| | | 输入预设的用户名与密码,即可查看,编辑HA的各种文件。 |
| | | |
| | |  |
| | | |
| | | ##### 安装Terminal & SSH |
| | | |
| | | Terminal & SSH 插件为HA提供了在web端使用控制台终端功能,及开启了ssh服务,使之可以远程使用SSH访问HA终端。 |
| | | |
| | | 在搜索中输入Terminal & SSH |
| | | |
| | | 结果有可能显示 |
| | | |
| | |  |
| | | |
| | | 搜索不到,这时,可能是因为仓库没有配置,还是使用的默认的仓库,我们可以增加一下仓库,如下: |
| | | |
| | | ``` |
| | | https://github.com/AlexxIT/hassio-addons |
| | | ``` |
| | | |
| | |  |
| | | |
| | | 点击右上解的三个点,选中仓库 |
| | | |
| | |  |
| | | |
| | | 在弹出折对话框中输入,我们记录的仓库地址,然后点添加 |
| | | |
| | |  |
| | | |
| | | 完成后,点击关闭. |
| | | |
| | | 然后,点击返回,重新搜索 |
| | | |
| | |  |
| | | |
| | | 这次找到了Advance SSH & Web Terminal |
| | | |
| | |  |
| | | |
| | | 点击安装,打开如下页面 |
| | | |
| | |  |
| | | |
| | | 点击安装,有时会安装失败, |
| | | |
| | | 失败后,需再次安装,同时检查日志中提到的哪个网址无法访问 ,把其加科学上网的代理名单中. |
| | | |
| | |  |
| | | |
| | |  |
| | | |
| | | 安装完成后,就变成如下 |
| | | |
| | |  |
| | | |
| | | 开启自动恢得,显示侧边栏 |
| | | |
| | |  |
| | | |
| | | 接下来,我们配置ssh的登录信息,如下 |
| | | |
| | |  |
| | | |
| | | 相关信息如下: |
| | | |
| | | ``` |
| | | username:dtuser |
| | | passsword:**** # 此处需要咨询管理员 |
| | | ``` |
| | | |
| | | 其它配置选项如下,注意选项,选错了ssh可能启不起来,sftp关闭,zsh关闭.compatibility_mode要开启 |
| | | |
| | |  |
| | | |
| | | 然后,点击启动按钮 |
| | | |
| | |  |
| | | |
| | | 启动后如下 |
| | | |
| | |  |
| | | |
| | | 我们可以通过两个地方进入 |
| | | |
| | | |
| | | |
| | |  |
| | | |
| | | 在日志 端能看到 ssh已启动成功 |
| | | |
| | | ``` |
| | | s6-rc: info: service base-addon-banner successfully started |
| | | s6-rc: info: service fix-attrs: starting |
| | | s6-rc: info: service base-addon-log-level: starting |
| | | s6-rc: info: service fix-attrs successfully started |
| | | s6-rc: info: service base-addon-log-level successfully started |
| | | s6-rc: info: service legacy-cont-init: starting |
| | | s6-rc: info: service legacy-cont-init successfully started |
| | | s6-rc: info: service init-ssh: starting |
| | | s6-rc: info: service init-mysql: starting |
| | | s6-rc: info: service init-mosquitto: starting |
| | | s6-rc: info: service init-docker: starting |
| | | s6-rc: info: service init-docker successfully started |
| | | s6-rc: info: service init-mysql successfully started |
| | | s6-rc: info: service init-mosquitto successfully started |
| | | [14:51:05] WARNING: |
| | | [14:51:05] WARNING: Logging in with a SSH password is security wise, a bad idea! |
| | | [14:51:05] WARNING: Please, consider using a public/private key pair. |
| | | [14:51:05] WARNING: What is this? https://kb.iu.edu/d/aews |
| | | [14:51:05] WARNING: |
| | | [14:51:05] NOTICE: RSA host key missing, generating one... |
| | | Generating public/private rsa key pair. |
| | | Your identification has been saved in /data/ssh_host_rsa_key |
| | | Your public key has been saved in /data/ssh_host_rsa_key.pub |
| | | The key fingerprint is: |
| | | SHA256:+9pEl2QvyUqsu4B3gnPjhL/Ab71iBIDjWRdYvgZeg0c root@a0d7b954-ssh |
| | | The key's randomart image is: |
| | | +---[RSA 3072]----+ |
| | | | . oE. | |
| | | |o .o+. | |
| | | |..o+.= o | |
| | | | o. = o . + + | |
| | | | . + S + * . | |
| | | | ..+. = o . | |
| | | | B.B.+ o | |
| | | | X+=.= | |
| | | | o=o=+o | |
| | | +----[SHA256]-----+ |
| | | [14:51:08] NOTICE: ED25519 host key missing, generating one... |
| | | Generating public/private ed25519 key pair. |
| | | Your identification has been saved in /data/ssh_host_ed25519_key |
| | | Your public key has been saved in /data/ssh_host_ed25519_key.pub |
| | | The key fingerprint is: |
| | | SHA256:MgbUsAJ+23skjVTwD0pWVRBCmZ0BjU3jwV/99gGnNVc root@a0d7b954-ssh |
| | | The key's randomart image is: |
| | | +--[ED25519 256]--+ |
| | | |. o+o*%O*. . E| |
| | | |.. . .=+o*o o =.| |
| | | | ...o+ o .. . = +| |
| | | | ..*.+ o . . .o| |
| | | | . =+oS. .o| |
| | | | .+o .| |
| | | | . . | |
| | | | . | |
| | | | | |
| | | +----[SHA256]-----+ |
| | | s6-rc: info: service init-ssh successfully started |
| | | s6-rc: info: service init-user: starting |
| | | [14:51:08] NOTICE: Session sharing has been disabled! |
| | | s6-rc: info: service init-user successfully started |
| | | s6-rc: info: service ttyd: starting |
| | | s6-rc: info: service sshd: starting |
| | | s6-rc: info: service sshd successfully started |
| | | s6-rc: info: service ttyd successfully started |
| | | s6-rc: info: service legacy-services: starting |
| | | [14:51:09] INFO: Starting the ttyd daemon... |
| | | [14:51:09] INFO: Starting the SSH daemon... |
| | | s6-rc: info: service legacy-services successfully started |
| | | Server listening on 0.0.0.0 port 22. |
| | | Server listening on :: port 22. |
| | | ``` |
| | | |
| | | 配置成功后,可以通过如下命令来测试是否可以远程SSH连入 |
| | | |
| | |  |
| | | |
| | | 输入yes后会要求 输入密码,验证正确后,会进入看到如个图,就说明ssh已正常的开启成功了 |
| | | |
| | |  |
| | | |
| | | 以下界面是在ha中看到的内置的ssh |
| | | |
| | |  |
| | | |
| | | 其它,当访问一些系统操作无权限时,可以关闭保护开关 |
| | | |
| | |  |
| | | |
| | | ##### 安装Mosquitto broker |
| | | |
| | | Mosquitto broker是一个重要的插件,其提供的MQTT 服务为公司大多数数设备折集成,mqtt通信通道,所以,此为必装插件。 |
| | | |
| | |  |
| | | |
| | | 点击安装 |
| | | |
| | |  |
| | | |
| | | 看到如下界面,说明安装成功, |
| | |  |
| | | |
| | | 接下来是配置mqtt |
| | | |
| | | ###### 开启自动恢复 |
| | | |
| | |  |
| | | |
| | | ###### 配置mqtt的用户名密码及定制配置 |
| | | |
| | |  |
| | | |
| | | ``` |
| | | username:dtuser |
| | | password:****** #此处的密码请咨询管理员 |
| | | ``` |
| | | |
| | | 配置完成后,启动mqtt服务 |
| | | |
| | |  |
| | | |
| | | 日志中显示如下信息,说明成功 |
| | | |
| | | ``` |
| | | s6-rc: info: service s6rc-oneshot-runner: starting |
| | | s6-rc: info: service s6rc-oneshot-runner successfully started |
| | | s6-rc: info: service fix-attrs: starting |
| | | s6-rc: info: service fix-attrs successfully started |
| | | s6-rc: info: service legacy-cont-init: starting |
| | | cont-init: info: running /etc/cont-init.d/mosquitto.sh |
| | | [16:33:27] INFO: Setting up user dtuser |
| | | [16:33:28] INFO: SSL is not enabled |
| | | cont-init: info: /etc/cont-init.d/mosquitto.sh exited 0 |
| | | cont-init: info: running /etc/cont-init.d/nginx.sh |
| | | cont-init: info: /etc/cont-init.d/nginx.sh exited 0 |
| | | s6-rc: info: service legacy-cont-init successfully started |
| | | s6-rc: info: service legacy-services: starting |
| | | services-up: info: copying legacy longrun mosquitto (no readiness notification) |
| | | services-up: info: copying legacy longrun nginx (no readiness notification) |
| | | [16:33:29] INFO: Starting NGINX for authentication handling... |
| | | s6-rc: info: service legacy-services successfully started |
| | | [16:33:29] INFO: Starting mosquitto MQTT broker... |
| | | 2025-04-17 16:33:29: Warning: Mosquitto should not be run as root/administrator. |
| | | 2025-04-17 16:33:29: mosquitto version 2.0.20 starting |
| | | 2025-04-17 16:33:29: Config loaded from /etc/mosquitto/mosquitto.conf. |
| | | 2025-04-17 16:33:29: Loading plugin: /usr/share/mosquitto/go-auth.so |
| | | 2025-04-17 16:33:29: ├── Username/password checking enabled. |
| | | 2025-04-17 16:33:29: ├── TLS-PSK checking enabled. |
| | | 2025-04-17 16:33:29: └── Extended authentication not enabled. |
| | | 2025-04-17 16:33:29: Opening ipv4 listen socket on port 1883. |
| | | 2025-04-17 16:33:29: Opening ipv6 listen socket on port 1883. |
| | | 2025-04-17 16:33:29: Opening websockets listen socket on port 1884. |
| | | 2025-04-17 16:33:29: mosquitto version 2.0.20 running |
| | | 2025-04-17 16:33:29: New connection from ::1:56336 on port 1883. |
| | | 2025-04-17 16:33:29: Client <unknown> disconnected due to protocol error. |
| | | [16:33:30] INFO: Successfully send discovery information to Home Assistant. |
| | | [16:33:31] INFO: Successfully send service information to the Supervisor. |
| | | ``` |
| | | |
| | | 当消息,提示发现设备时,点击,弹出的消息中,点check it out,然后,看到已发现mqtt,点击添加 |
| | | |
| | |  |
| | | |
| | | 然后,点击完成 |
| | | |
| | |  |
| | | |
| | | 然后就会在设置-设备与服务-集成中,显示Mqtt,以后,所有增加的MQTT类设备,都会显示在这个类别中。 |
| | | |
| | |  |
| | | |
| | | ##### 安装Node-RED插件 |
| | | |
| | | Node-Red插件是我们集中各种设备的重要消息处理转换插件,属必装插件. |
| | | |
| | | 在加载项中,搜索nod显示如下 |
| | | |
| | |  |
| | | |
| | | 点击,进入详细页面 |
| | | |
| | |  |
| | | |
| | | 点击安装 |
| | | |
| | |  |
| | | |
| | | 如果安装出错,多半是科学上网的问题, |
| | | |
| | | 如现如下页面,说明安装成功 |
| | | |
| | |  |
| | | |
| | | 开启自动恢复,关闭侧边栏 |
| | | |
| | |  |
| | | |
| | | 配置nod-red |
| | | |
| | |  |
| | | |
| | | |
| | | |
| | | 此处的配置信息为 |
| | | |
| | | ``` |
| | | username:admin |
| | | password:**** #此处的密码,请向管理员获取 |
| | | ### 默认情况下关闭ssl |
| | | ``` |
| | | |
| | | 然后启动node-red |
| | | |
| | |  |
| | | |
| | | 点击打开web-页面如下 |
| | | |
| | |  |
| | | |
| | | |
| | | |
| | | ##### 利用 Docker 安装 PostgreSQL |
| | | |
| | | 虽然 Home Assistant OS 本身不允许直接访问系统底层,但它内置了 Docker 支持,因此可以直接运行 PostgreSQL 的 Docker 容器。 |
| | | |
| | | ###### **步骤** |
| | | |
| | | 1. **确保您有 SSH 访问权限** |
| | | |
| | | - 安装 Home Assistant 的 SSH & Web Terminal Add-on(高级模式)。 |
| | | - 开启 SSH 访问,具体步骤如下: |
| | | 1. 前往 **Supervisor > Add-on Store**。 |
| | | 2. 搜索并安装 **SSH & Web Terminal**(官方插件)。 |
| | | 3. 配置 SSH 插件,确保 `protected` 设置为 `false`,然后启动它。 |
| | | |
| | | 2. **运行 PostgreSQL 容器** |
| | | |
| | | - 在 SSH 或 Web Terminal 中运行以下命令: |
| | | |
| | | ``` |
| | | BASHdocker run -d \ |
| | | --name=postgresql \ |
| | | -e POSTGRES_USER=homeassistant \ |
| | | -e POSTGRES_PASSWORD=yourpassword \ |
| | | -e POSTGRES_DB=homeassistant \ |
| | | -v /mnt/data/supervisor/postgresql:/var/lib/postgresql/data \ |
| | | -p 5432:5432 \ |
| | | postgres |
| | | ``` |
| | | |
| | | - 替换 `yourpassword` 为您想要设置的数据库密码。 |
| | | - 数据库名称为 `homeassistant`,用户名为 `homeassistant`。 |
| | | - 数据将存储在 `/mnt/data/supervisor/postgresql`,确保数据在重启后不会丢失。 |
| New file |
| | |
| | | ## 配置网络 |
| | | |
| | | 公司使用的X86小工控机,大多有多个网卡,一般一个无线网卡,两个有线网卡.多数情况下,我们可能是使用的WIFI网络,这样比较方便,有时为了HA提供的服务折稳定性,我们尽量使用LAN线网络,避免无线网信号质量的问题。所以就涉及到配网的问题。 |
| | | |
| | | HomeAssistant的网络配置,在系统没有安装成功之前,不能通过web进入网页界面时,配置网络只能通过自带网络配置命令来进行. |
| | | |
| | | #### 熟悉网络配置命令 |
| | | |
| | | HomeAssistant Cli 提供了默信折network配置命令如下: |
| | | |
| | | ``` |
| | | ha netWork |
| | | Useage: |
| | | ha network [command] |
| | | Examples: |
| | | ha network info |
| | | ha network interface options |
| | | Available Commands: |
| | | info Shows information about the host network |
| | | reload Reload Network information the host |
| | | scan Scan for Access Points on a wireless interface. |
| | | update Update settings of a network interface |
| | | vlan Create a new VLAN on an ethernet interface |
| | | Flags: |
| | | -h, --help help for network |
| | | Global Flags: |
| | | --api-token string Home Assistant Supervisor API token |
| | | --config string Optional config file (default is $HOME/.homeassistant.yaml) |
| | | --endpoint string Endpoint for Home Assistant Supervisor (default is'supervisor') |
| | | --log-level string Log level (defaults to Warn) |
| | | --no-progress Disable the progress spinner |
| | | --raw-json Output raw JSON from the API |
| | | Use "ha network [command] --help" for more information about a command. |
| | | ``` |
| | | |
| | | 这个ha network命令,大约如下几个功能 |
| | | |
| | | - info 显示网络配置信息 |
| | | - reload 重新加载网络 |
| | | - scan 扫描网络 |
| | | - update 配置网络 |
| | | |
| | | 我们在使用这个命令时,可以使用其简写,比如省去前面的ha,还可以省去后面的work |
| | | 比如,我们想查看网络配置信息,可以用如下命令来进行 |
| | | |
| | | ``` |
| | | net info |
| | | ``` |
| | | |
| | | 这条命令就会把所有的网络配置信息全部显示出来,只是如果网卡较多,我们没有法在一屏全部阅读完,所以这就引发另一个问题.netwrok所有的子命令,后面都是可以或必须跟着操作对像来进行的,具体的就是,操作或显示哪个网卡接口.一般情况下是如下型式 |
| | | ``` |
| | | net [command] [interface] |
| | | 即 |
| | | net [子命令] [网卡名称] |
| | | ``` |
| | | |
| | | 那么如何查看网卡名称呢,在haos 的cli控制台界面,任意时间,同时按下 ***ctrl+c*** 后,ha的界面返回到待机界面,如下图所示. |
| | | |
| | |  |
| | | |
| | | 图中共显示了三个网卡接口: |
| | | |
| | | - wlp3s0 这个是无线网卡接口的名称,一般情况下w字符打头的我为无线网卡 |
| | | - enp2s0 这个对应小主机上就是LNA1,有线网卡1的名称 |
| | | - enp4s0 这个对应小主机上就是LNA2,有线网卡1的名称 |
| | | |
| | | 查看到了这三个网卡名称,我们就可以对网卡进行查看信息配置等. |
| | | |
| | | 对有初装的HAOS还有准备进行Udate的小主机,最好,就是在路由器端*默认提供科学上网* ,否则在新安装折初始化那里就会被永远卡住,无法安装成功,如果是自动更新,那么将会更新失败. |
| | | |
| | | #### 配置网络 |
| | | |
| | | 一般情况下,对于enp2s0,enp4s0,如果路由器端提供了自动获取IP地址功能,则无需配置,网线插入即可使用。 |
| | | |
| | | 但是对于比较复杂的网络则需要配置,同样,如果想使用wifi网络,也需要配置 . |
| | | |
| | | 配置网络的命令如下: |
| | | |
| | | ``` |
| | | ha > net update |
| | | Usage: |
| | | ha network update [interface] [flags] |
| | | Aliases: |
| | | update, set, up |
| | | Examples: |
| | | ha network update eth0 --ipv4-method auto --ipv6-method disabled |
| | | Flags: |
| | | -e, --disabled Disable interface |
| | | -h, --help help for update |
| | | --ipv4-address stringArray IPv4 address for the interface in the 192.168.1.5/24 |
| | | --ipv4-gateway string The IPv4 gateway the interface should use |
| | | --ipv4-method string Method on IPv4: static|auto|disabled |
| | | --ipv4-nameserver stringArray IPv4 address of upstream DNS servers. Use multiple times for multiple servers. |
| | | --ipv6-address stringArray IPv6 address for the interface in the 2001:0db8:85a3:0000:0000:8a2e:0370:7334/64 |
| | | --ipv6-gateway string The IPv6 gateway the interface should use |
| | | --ipv6-method string Method on IPv6: static|auto|disabled |
| | | --ipv6-nameserver stringArray IPv6 address for upstream DNS servers. Use multiple times for multiple servers. |
| | | --wifi-auth string Used authentication: open, wep, wpa-psk |
| | | --wifi-mode string Wifi mode: infrastructure, adhoc, mesh or ap |
| | | --wifi-psk string Shared authentication key for wep or wpa |
| | | --wifi-ssid string SSID for wifi connection |
| | | Global Flags: |
| | | --api-token string Home Assistant Supervisor API token |
| | | --config string Optional config file (default is $HOME/.homeassistant.yaml) |
| | | --endpoint string Endpoint for Home Assistant Supervisor (default is `supervisor`) |
| | | --log-level string Log level (defaults to Warn) |
| | | --no-progress Disable the progress spinner |
| | | --raw-json Output raw JSON from the API |
| | | |
| | | ``` |
| | | |
| | | 这条命令ha network update [interface] [flags],提供了很多功能,它可以配置wif网络,可以对指定的网卡配置ip4/6的IP地址,网关,是否启用等.因此可以在实际工作中灵活使用. |
| | | 具体用法简译如下 |
| | | |
| | | ``` |
| | | ha > net update |
| | | Usage: |
| | | ha network update [interface] [flags] |
| | | Aliases: |
| | | update, set, up |
| | | Examples: |
| | | ha network update eth0 --ipv4-method auto --ipv6-method disabled |
| | | Flags: |
| | | -e, --disabled 禁用接口 |
| | | -h, --help 显示更新的帮助信息 |
| | | --ipv4-address stringArray 接口的 IPv4 地址,例如 192.168.1.5/24 |
| | | --ipv4-gateway string 接口使用的 IPv4 网关 |
| | | --ipv4-method string IPv4 方法: static|auto|disabled |
| | | --ipv4-nameserver stringArray 上游 DNS 服务器的 IPv4 地址,可多次使用以指定多个服务器 |
| | | --ipv6-address stringArray 接口的 IPv6 地址,例如 2001:0db8:85a3:0000:0000:8a2e:0370:7334/64 |
| | | --ipv6-gateway string 接口使用的 IPv6 网关 |
| | | --ipv6-method string IPv6 方法: static|auto|disabled |
| | | --ipv6-nameserver stringArray 上游 DNS 服务器的 IPv6 地址,可多次使用以指定多个服务器 |
| | | --wifi-auth string 使用的认证方式: open, wep, wpa-psk |
| | | --wifi-mode string WiFi 模式: infrastructure, adhoc, mesh 或 ap |
| | | --wifi-psk string WEP 或 WPA 的共享认证密钥 |
| | | --wifi-ssid string WiFi 连接的 SSID |
| | | |
| | | Global Flags: |
| | | --api-token string Home Assistant Supervisor API 令牌 |
| | | --config string 可选的配置文件路径(默认值为 $HOME/.homeassistant.yaml) |
| | | --endpoint string Home Assistant Supervisor 的端点(默认值为 `supervisor`) |
| | | --log-level string 日志级别(默认值为 Warn) |
| | | --no-progress 禁用进度条 |
| | | --raw-json 以原始 JSON 格式输出 API 数据 |
| | | |
| | | FATA[0000] Error while executing rootCmd: accepts 1 arg(s), received 0 |
| | | |
| | | ``` |
| | | |
| | | 下面,我们就以配置wifi联接到网络为例说明一下: |
| | | |
| | | 比如我们默认的WIFI热点如下: |
| | | |
| | | ``` |
| | | wifi info: |
| | | ssid:DT_IoT_GateWay |
| | | passWord:HnczjTyrb0 |
| | | ``` |
| | | |
| | | 那根据我们上文查看到的无线网卡的名称:**wlp3s0** |
| | | |
| | | 我们使用如下配置命令,来让haos小工控机联上wifi网络: |
| | | |
| | | ``` |
| | | ha network update wlp3s0 --wifi-auth wpa-psk --wifi-psk "HmczjTYrb0" --wifi-mode infrastructure --wifi-ssid "DT_IoT_GateWay" --ipv4-method auto --ipv6-method disabled |
| | | ``` |
| | | |
| | | 这条命令解释如下: |
| | | |
| | | - 指定wifi的密码方式为:wpa-psk (--wifi-auth wpa-psk). |
| | | - 指定wif的密码为:HnczjTyrb0 (--wifi-psk "HmczjYrb0"). |
| | | - 指定网卡接口模式为:infrastructure 即常规模式 (--wifi-mode infrastructure). |
| | | - 指定要联接的网络SSID:DT_IoT_GateWay (--wifi-ssid "DT_IoT_GateWay"). |
| | | - 指定IP地址获取方式(静态、自动、禁用):自动 ( --ipv4-method auto). |
| | | - 指定是否禁用IpV6:禁用 (--ipv6-method disabled) |
| | | |
| | | 如下图所示,我们成功的使用这条指令,配置好了wifi网络: |
| | | |
| | |  |
| | | |
| | | 如下所示,配网成功后,路由器已自动为其分配好了ip地址: |
| | | |
| | |  |
| | | |
| | | 此时,我们在浏览器中输入网址[http://192.168.3.2:8123](http://192.168.3.2:8123) 即可进入haos的web页面. |
| | | |
| | | 下图是无线网卡与有线网卡同时启用的情况,可以看到,两个网卡都被正确的分配到了IP地址: |
| | | |
| | |  |
| | | |
| | | #### 在系统安装好初始化完成后配置网络 |
| | | |
| | | 系统初始化完成后,仍然可以调整配置网络, |
| | | |
| | | 设置-系统-网络 中配置网络接口可以进行网络配置 |
| | | |
| | |  |
| | | |
| | | 在这里你可以看到我们的三块网卡,wlp3s0,enp2s0,enp4s0,可在此处配置,每个网卡的IP,子网,网关,DNS等,也可以配置wi-fi热点. |
| | | |
| | |
| | | ### 使用教程 |
| | | ### 使用教程 |
| | | |
| | | #### 基础配置 |
| | | |
| | | - [配置网络](netconfig/netconfig.md) |
| | | - [初始化配置](initConfig/initConfig.md) |
| | | |
| | | #### 必装插件或组件 |
| | | |
| | | - [HACS](initConfig/installHacs.md) |
| | | - |
| | |
| | | # 关于我们 |
| | | |
| | | ### 岱特智能科技(上海)有限公司 |
| | | |
| | | - 单位地址 :上海市杨浦区国泰路127弄1号三层(集中登记地) |
| | | - 单位电话:021-54720326 |
| | | |
| | | |
| | | ### 数据流动之处,效率自然发生。 |
| | | |
| | | DATA代表感知、连接与智能。在繁杂的医疗数据中,一场数字化革命正在发生,我们守护的不止是数据,更是患者的每一分钟。岱特智能–让每一台设备成为智慧医疗的神经元。 |
| | | |
| | | ##### 25年医疗信息化深耕者,团队自2000年起持续探索信息化在医疗场景的深度应用 |
| | | |
| | | - 最佳实践:服务全球超过600+医疗机构,续约率超97% |
| | | |
| | | - 全球服务:独立的英/日/马来语版本,适配当地临床路径 |
| | | |
| | | - 构建标准:主导制定多项标准,「血液透析软件技术要求」 |
| | | |
| | | - 数据主权:即使终止合作,仍然保证用户不受限制的访问 |
| | | |
| | | ### 回归本质 |
| | | |
| | | 不是用技术替代人,而是让而是让人从重复劳动中解放,回归医疗服务的本质。 |
| | | |
| | | ### 知识反哺 |
| | | |
| | | 基层医院案例自动沉淀为三甲优化策略,识别科室工作流差异,生成定制方案。 |
| | | |
| | | ##### 开放生态 |
| | | |
| | | 开放API,集成100+第三方解决方案,共建医疗数据交互标准。 |
| | | |
| | | ## 为您构建可生长的技术生态和可持续的业务 |
| | | |
| | | 像搭积木般自由扩展,破除”数字化=高投入,从基础物联到AI决策,分阶段建设避免一次性过载投入。不是推翻重建系统,而是让现有资产持续产生指数级价值——这才是医疗数字化的终极使命。 |
| | |
| | | |
| | | 这种方法的操作方法是: |
| | | |
| | | 1. 先下载安装ubuntu24.04操作系统 |
| | | 1. 先下载[ubuntu24.04操作系统桌面版 ]([Ubuntu 24.04 LTS | Ubuntu](https://ubuntu.com/blog/tag/ubuntu-24-04-lts)),保存为ubuntu24.04-desktip-amd.iso。 |
| | | |
| | | 2. 在虚拟机或物理机中安装此ubuntu24.04操作系统.(临时使用) |
| | | 2. 在虚拟机或物理机中安装此ubuntu24.04操作系统.(临时使用)。 |
| | | 这个过程 ,请参考其它教程。 |
| | | |
| | | 3. 使用ubuntu24.04制作linux启动U盘ubuntu live |
| | | 3. 使用ubuntu24.04制作linux启动U盘ubuntu live。 |
| | | 安装完成后,把下载的ubuntu24.04-desktip-amd.iso放到新安装的Ubuntu操作系统下折任意目录,如,放到这个目录. |
| | | 然后,找到ubuntu自带的启动盘制作工具,如图所示 |
| | |  |
| | | c运行启动盘创建器,如下先择刚刚放置的ubuntu24.04-desktip-amd.iso作为源镜像,然后把要制作启动盘的U盘插入USB口,然后,选 择作为要使用的磁盘,当然可以提前插入U盘。然后点击制作启动盘。在弹出的确认框中,点击是,然后输出当前的用户对应的密码,确认,系统将会自动开启把ubuntu live 启动引导盘信息, 写入U盘,提示完成时,点退出,弹出如下提示,说明启动U盘制作成功了。 |
| | | |
| | | 4. 使用启动U盘ubuntu live引导x86小工控机. |
| | | 把U盘插入入X86小工控机并确保[正确配置了Bios](configX86Bios.md) |
| | | 启动后,按F11其它主机可能有所不同(可以查主板说明书,或咨询主板厂家),选择以U盘引导。 |
| | | 公司的小工控机,是启动时,按F11不放,进入系统引导菜单,根据U盘的不同,U盘引导盘中的系统类别不同,显示的内容略有不同,如下图所示 |
| | |  |
| | |  |
| | | |
| | | |
| | | 5. 进入try模式(不安装). |
| | | |
| | | 当系统启动时,请确保选择“Try or Install Ubuntu". |
| | |  |
| | | 系统启会启动U盘中的Ubuntu live系统, |
| | |  |
| | |  |
| | | 在这个过程中, |
| | |  |
| | | 会有几个选项要选择如下图所示, |
| | |  |
| | |  |
| | | 选择语言 |
| | |  |
| | | 此处直接下一步 |
| | |  |
| | | 此处可以直接使用网络连接可以选直接连接,也可以选择wifi当然,wifi南要配置热点. |
| | |  |
| | | 同时,在这个过程中,要保持网络畅通(***一定要能正常访问Google及HomeAssistant官网**),能正常的访问并下载HomeAssistantOS的镜像. |
| | | |
| | | 6. 在try模式中,下载ha安方镜像 |
| | | 进入Ubuntu Live系统后,打开浏览器,访问HomeAssistant的[官方文档]([Generic x86-64 - Home Assistant](https://www.home-assistant.io/installation/generic-x86-64)), |
| | |  |
| | | 进入HomeAssistant官网,点\击菜单Installstatiion,进入安装说明 |
| | |  |
| | | 找到GenericX86-84,并打开这个在页面 |
| | |  |
| | | 找到页面中的镜像下载地址如下图 |
| | |  |
| | | 下载[HomeAssistOs-x86-64镜像](https://github.com/home-assistant/operating-system/releases/download/15.1/haos_generic-x86-64-15.1.img.xz) |
| | | 开始下载后,如下图所示 |
| | |  |
| | | 下载过程中如下图所示 |
| | |  |
| | | 下载完成后 |
| | |  |
| | | 文件保存在/home/Downloads/hos_Generic-86-64-15.1.img.xz |
| | | |
| | | |
| | | |
| | | 7. 使用ubuntu live的自带的磁盘恢复工具写入镜像到硬盘. |
| | | 在Ubuntu Live的系统中,找到显示应用程序(一般在左上角或右下角), |
| | | |
| | | - 搜索并找到Disks应用程序,并打开Disks应用程序. |
| | | |
| | |  |
| | | |
| | | - 在左侧列表中找到并选择你的目标磁盘(一般为你要安装HAOS的硬盘) |
| | | |
| | |  |
| | | |
| | | - 点击右上角的菜单图标(三个点),选择“恢复磁盘镜像” |
| | | |
| | |  |
| | | |
| | | - 浏览并选择你下载的HAOS镜像文件。 |
| | | |
| | |  |
| | | 点击,并浏览到下载的文件 hos_Generic-86-64-15.1.img.xz |
| | |  |
| | | |
| | | - 确认目标磁盘,并开始镜像恢复过程。 |
| | | 确认标硬盘正确后,继续 |
| | |  |
| | | 提示确认时点击 Restore |
| | |  |
| | | 提示授权时,点击 Authenticate |
| | |  |
| | | 确定后,就会开始把镜像文件写入硬盘 |
| | | 请注意,这个过程一将会,清除硬盘上原有的数据,请确保已备份重要数据. |
| | |  |
| | | 写入完成后,如下图所示 |
| | |  |
| | | 此时,就已经成功的把HA镜像写入到硬和肋中了 |
| | | |
| | | 8. 移除U盘 |
| | | 一旦Home Assistant操作系统安装完成,关闭系统。 |
| | | 当Ubuntu关闭后,移除USB闪存驱动器(Ubuntu会通知您可以安全移除)。 |
| | | |
| | | 9. 重启系统 |
| | | 9. 重启系统. |
| | | 现在,您的Home Assistant服务器已经设置完毕,您可以开始使用它。 |
| | | |
| | | |
| | | |
| | | 10. 进入HA cli界面 |
| | | |
| | |  |
| | | |
| | | - |
| | | 系统启动成功后,如下图所示 |
| | |  |
| | | 通过浏览器,输入控制台提示的IP加端口[http://192.168.3:8123](http://192.168.3:8123)即可进入图型化界面,如下 |
| | |  |
| New file |
| | |
| | | # Windows PE 下写入 HA 镜像 |
| | | |
| | | windows Pe下写入硬盘镜像的主要思路是使用Roadkilnet开发的Rodakill's Disk Image工具把HA的镜像写入硬盘. |
| | | |
| | | #### 下载Disk Image |
| | | |
| | | [DiskImage的官方下载地址为]([Roadkil.Net - Roadkil's Disk Image Program Download](https://roadkil.net/program.php?ProgramID=12&Action=NewOSID&DownloadVersion=12&Installer=NO)),如果官网下载地址失效,[可以点击我们自已的下地链接试下](http://datacdn.data-it.tech/GuoWangShangBao/setup/DiskImage_1_6_WinAll%20.exe) |
| | | |
| | | ``` |
| | | https://roadkil.net/program.php?ProgramID=12&Action=NewOSID&DownloadVersion=12&Installer=NO |
| | | ``` |
| | | |
| | | 进入网站的下载页面,如下,选择windows8 10 or 11和Stand Alone Version版本,然后点击下载 |
| | | |
| | |  |
| | | |
| | | |
| | | |
| | | 下载完成后,得到如下DiskImage_1_6_WinAll .exe文件 ,保存好,后面需要保存么U盘。 |
| | | |
| | | #### 制作WindowsPE引导U盘 |
| | | |
| | | windows的PE制作工具有很多,比如老毛桃,大白菜,等,但这些大多会有值入广告等,用于安装windows系统会有许多垃圾软件,这里推荐使用"[微PE工具箱]([微PE工具箱 - 下载](https://www.wepe.com.cn/download.html))",下载安装程序如下: |
| | | |
| | |  |
| | | |
| | | 运行WePev2.3.exe |
| | | |
| | |  |
| | | |
| | | 点击右下角的安装到U盘图标 |
| | | |
| | |  |
| | | |
| | | 选择正确的产,并配好卷标,点击立即安装到U盘, |
| | | |
| | |  |
| | | |
| | | 提示开始制作U盘 |
| | | |
| | |  |
| | | |
| | | 稍等片刻 |
| | | |
| | |  |
| | | |
| | | 系统提示制作完成 |
| | | |
| | |  |
| | | |
| | | #### 下载并解压HAOS镜像到U盘 |
| | | |
| | | 点击访问[Ha-os-GenerricX86-64页面]([Generic x86-64 - Home Assistant](https://www.home-assistant.io/installation/generic-x86-64)),找到下镜像的下载链接 |
| | | |
| | |  |
| | | |
| | | [也可以直接使用如下链接](https://github.com/home-assistant/operating-system/releases/download/15.1/haos_generic-x86-64-15.1.img.xz)下载,但尽量还是按上述方法下载,保证每次下载的都是官网最新的版本. |
| | | |
| | | 下载完成后如下 |
| | | |
| | |  |
| | | |
| | | 解压这个文件 |
| | | |
| | |  |
| | | |
| | | 得到haos_generic-x86-64-15.1.img,把这个文件复制到U盘中任意目录 |
| | | |
| | | 比如,我放到了如下目录 |
| | | |
| | |  |
| | | |
| | | #### 把之前下载好的Disk Image放入U盘 |
| | | |
| | |  |
| | | |
| | | 至此WINpe引导U盘就制作好了。 |
| | | |
| | | 用此U盘引导小工控机,注意意要正确的配置BIOS,及要用正确的改变启动顺序的方法如F11常按, |
| | | |
| | |  |
| | | |
| | | 引导成功白带 ,直入PE启动界面,选 第一项默认,继续 |
| | | |
| | |  |
| | | |
| | | 稍候会进入PE系统 |
| | | |
| | |  |
| | | |
| | | 找到并启动diskImage写盘工具 |
| | | |
| | |  |
| | | |
| | | 点YES继续 |
| | | |
| | |  |
| | | |
| | | 选 择下载好的HAOS的安装镜像img文件 |
| | | |
| | |  |
| | | |
| | | 提示数据有丢失风险时,点是 |
| | | |
| | |  |
| | | |
| | | 注意在写入之前,一定要确认是硬盘而非U盘,一般为physical disk 0 |
| | | |
| | |  |
| | | |
| | | 写入完成后会提示写入成功 |
| | | |
| | |  |
| | | |
| | | #### 重新启动进入HA cli界面 |
| | | 系统启动成功后,如下图所示 |
| | |  |
| | | 通过浏览器,输入控制台提示的IP加端口[http://192.168.3:8123](http://192.168.3:8123)即可进入图型化界面,如下 |
| | |  |
| | | |
| New file |
| | |
| | | #### 通用设置 |
| | | |
| | | 要启动Home Assistant操作系统,BIOS需要启用UEFI启动模式并禁用安全启动。 |
| | | |
| | | 以下截图来自第七代英特尔NUC系统。您的系统上的BIOS菜单可能看起来不同,但选项应该仍然存在并具有类似的名称。 |
| | | |
| | | 1. 要进入BIOS,请启动您的x86-64硬件并反复按下F2键(在某些系统上,这可能是Del、F1或F10键)。 |
| | | |
| | |  |
| | | |
| | | 2. 确保启用了UEFI启动模式。 |
| | | |
| | |  |
| | | |
| | | 3. 禁用安全启动。 |
| | | |
| | |  |
| | | |
| | | 4. 保存更改并退出。 |
| | | |
| | | BIOS配置现已完成。 |
| | | |
| | | |
| | | #### 公司小工控机(1900)配置 |
| | | |
| | | 公司的小工控机进入Bios的方式,是开机时,按DEL键,进入如下界面 |
| | | |
| | |  |
| | | 进入Bios后,要调OS Selection,默认为windows7需要调整为Linux如下图 |
| | |  |
| | | 然后保存,退出 |
| | |  |
| | | 提示保存时,选择YES |
| | |  |
| | |
| | | |
| | | 此种方法的好处是,不用拆除硬盘,直接在小工控机上就能实现操作. |
| | | |
| | | #### 基于windows操作系统写入镜像. |
| | | #### 基于[windows操作系统写入镜像.](WinPeInstall.md) |
| | | |
| | | 官方在介绍这种方法是让用户把小工控机的硬盘拆下,装入用户自已的电脑中,并用balenaEtcher写盘工具将镜像写入小工控的机的硬盘后,再把小工控机机的硬盘装入小工控机.这方法方便快捷,但是需要拆机,有需要的用户可以到官方介绍页面[Geneic x86-64](https://www.home-assistant.io/installation/generic-x86-64)去看具体操作方法. |
| | | |
| | |
| | | site_name: DT-HA
|
| | | repo_url: http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git
|
| | | site_author: 岱特智能科技(上海)有限公司
|
| | | copyright: |
| | | # theme: mkdocs
|
| | | # theme: readthedocs
|
| | | theme:
|
| | | # name: material
|
| | | name: readthedocs
|
| | | # name: bootstrap
|
| | | name: windmill
|
| | | # name: windmill
|
| | | # name: gitbook
|
| | | nav:
|
| | | - 首页: index.md
|
| | | - 关于: about.md
|
| | | - 使用教程:
|
| | | - 安装: install-guide/installHa.md
|
| | | - 使用: Usages/usage.md
|
| | | - 使用: |
| | | - 使用概述: Usages/usage.md
|
| | | - 配置网络: Usages/netconfig/netconfig.md
|
| | | - 系统初始化配置: Usages/initConfig/initConfig.md
|
| | | extra:
|
| | | social:
|
| | | - icon: fontawesome/brands/github
|
| | |
| | | - admonition
|
| | | - codehilite:
|
| | | guess_lang: false
|
| | | - toc:
|
| | | permalink: True
|
| | | - footnotes
|
| | | - markdown_checklist.extension
|
| | |
|
| | |
|
| | | plugins:
|
| | | - search
|
| | |
| | | <!DOCTYPE html> |
| | | <html lang="en"> |
| | | <html class="writer-html5" lang="en" > |
| | | <head> |
| | | |
| | | |
| | | <meta charset="utf-8"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| | | |
| | | |
| | | |
| | | <link rel="shortcut icon" href="./img/favicon.ico"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="author" content="岱特智能科技(上海)有限公司" /> |
| | | <link rel="shortcut icon" href="/img/favicon.ico" /> |
| | | <title>DT-HA</title> |
| | | <link href="./css/bootstrap-3.3.7.min.css" rel="stylesheet"> |
| | | <link href="./css/font-awesome-4.7.0.css" rel="stylesheet"> |
| | | <link href="./css/base.css" rel="stylesheet"> |
| | | <link rel="stylesheet" href="./css/highlight.css"> |
| | | <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> |
| | | <!--[if lt IE 9]> |
| | | <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> |
| | | <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> |
| | | <![endif]--> |
| | | |
| | | <script src="./js/jquery-3.2.1.min.js"></script> |
| | | <script src="./js/bootstrap-3.3.7.min.js"></script> |
| | | <script src="./js/highlight.pack.js"></script> |
| | | <link rel="stylesheet" href="/css/theme.css" /> |
| | | <link rel="stylesheet" href="/css/theme_extra.css" /> |
| | | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" /> |
| | | |
| | | <base target="_top"> |
| | | <script> |
| | | var base_url = '.'; |
| | | var is_top_frame = false; |
| | | var page_toc = null; |
| | | |
| | | </script> |
| | | <script src="./js/base.js"></script> |
| | | <!--[if lt IE 9]> |
| | | <script src="/js/html5shiv.min.js"></script> |
| | | <![endif]--> |
| | | <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
| | | <script>hljs.highlightAll();</script> |
| | | </head> |
| | | |
| | | <body> |
| | | <script> |
| | | if (is_top_frame) { $('body').addClass('wm-top-page'); } |
| | | </script> |
| | | <body class="wy-body-for-nav" role="document"> |
| | | |
| | | |
| | | |
| | | <div class="container-fluid wm-page-content"> |
| | | <a name="_top"></a> |
| | | |
| | | |
| | | |
| | | <h2 style="text-align: center">404</h2> |
| | | <h1 style="text-align: center">Page not found</h1> |
| | | |
| | | |
| | | |
| | | <br> |
| | | |
| | | |
| | | <br> |
| | | <div class="wy-grid-for-nav"> |
| | | <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> |
| | | <div class="wy-side-scroll"> |
| | | <div class="wy-side-nav-search"> |
| | | <a href="/." class="icon icon-home"> DT-HA |
| | | </a><div role="search"> |
| | | <form id ="rtd-search-form" class="wy-form" action="//search.html" method="get"> |
| | | <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" title="Type search term here" /> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | |
| | | <footer class="container-fluid wm-page-content"> |
| | | <p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a> using <a href="https://github.com/gristlabs/mkdocs-windmill">Windmill</a> theme by Grist Labs.</p> |
| | | <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="/.">首页</a> |
| | | </li> |
| | | </ul> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="/about/">关于</a> |
| | | </li> |
| | | </ul> |
| | | <p class="caption"><span class="caption-text">使用教程</span></p> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="/install-guide/installHa/">安装</a> |
| | | </li> |
| | | <li class="toctree-l1"><a class="reference internal" >使用</a> |
| | | <ul> |
| | | <li class="toctree-l2"><a class="reference internal" href="/Usages/usage/">使用概述</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="/Usages/netconfig/netconfig/">配置网络</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="/Usages/initConfig/initConfig/">系统初始化配置</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </nav> |
| | | |
| | | <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| | | <nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu"> |
| | | <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| | | <a href="/.">DT-HA</a> |
| | | |
| | | </nav> |
| | | <div class="wy-nav-content"> |
| | | <div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation"> |
| | | <ul class="wy-breadcrumbs"> |
| | | <li><a href="/." class="icon icon-home" aria-label="Docs"></a></li> |
| | | <li class="wy-breadcrumbs-aside"> |
| | | </li> |
| | | </ul> |
| | | <hr/> |
| | | </div> |
| | | <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| | | <div class="section" itemprop="articleBody"> |
| | | |
| | | |
| | | <h1 id="404-page-not-found">404</h1> |
| | | |
| | | <p><strong>Page not found</strong></p> |
| | | |
| | | |
| | | </div> |
| | | </div><footer> |
| | | |
| | | <hr/> |
| | | |
| | | <div role="contentinfo"> |
| | | <!-- Copyright etc --> |
| | | </div> |
| | | |
| | | Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| | | </footer> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | </section> |
| | | |
| | | </div> |
| | | |
| | | <div class="rst-versions" role="note" aria-label="Versions"> |
| | | <span class="rst-current-version" data-toggle="rst-current-version"> |
| | | |
| | | <span> |
| | | <a href="http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git" class="fa fa-code-fork" style="color: #fcfcfc"> Dh</a> |
| | | </span> |
| | | |
| | | |
| | | |
| | | </span> |
| | | </div> |
| | | <script src="/js/jquery-3.6.0.min.js"></script> |
| | | <script>var base_url = "/";</script> |
| | | <script src="/js/theme_extra.js"></script> |
| | | <script src="/js/theme.js"></script> |
| | | <script src="/search/main.js"></script> |
| | | <script> |
| | | jQuery(function () { |
| | | SphinxRtdTheme.Navigation.enable(true); |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| | | </html> |
| New file |
| | |
| | | <!DOCTYPE html> |
| | | <html class="writer-html5" lang="en" > |
| | | <head> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="author" content="岱特智能科技(上海)有限公司" /> |
| | | <link rel="shortcut icon" href="../../../img/favicon.ico" /> |
| | | <title>BackupToFile - DT-HA</title> |
| | | <link rel="stylesheet" href="../../../css/theme.css" /> |
| | | <link rel="stylesheet" href="../../../css/theme_extra.css" /> |
| | | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" /> |
| | | |
| | | <script> |
| | | // Current page data |
| | | var mkdocs_page_name = "BackupToFile"; |
| | | var mkdocs_page_input_path = "Usages\\backupAndRestore\\BackupToFile.md"; |
| | | var mkdocs_page_url = null; |
| | | </script> |
| | | |
| | | <!--[if lt IE 9]> |
| | | <script src="../../../js/html5shiv.min.js"></script> |
| | | <![endif]--> |
| | | <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
| | | <script>hljs.highlightAll();</script> |
| | | </head> |
| | | |
| | | <body class="wy-body-for-nav" role="document"> |
| | | |
| | | <div class="wy-grid-for-nav"> |
| | | <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> |
| | | <div class="wy-side-scroll"> |
| | | <div class="wy-side-nav-search"> |
| | | <a href="../../.." class="icon icon-home"> DT-HA |
| | | </a><div role="search"> |
| | | <form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get"> |
| | | <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" title="Type search term here" /> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../..">首页</a> |
| | | </li> |
| | | </ul> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../../about/">关于</a> |
| | | </li> |
| | | </ul> |
| | | <p class="caption"><span class="caption-text">使用教程</span></p> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../../install-guide/installHa/">安装</a> |
| | | </li> |
| | | <li class="toctree-l1"><a class="reference internal" >使用</a> |
| | | <ul> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../usage/">使用概述</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../netconfig/netconfig/">配置网络</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../initConfig/initConfig/">系统初始化配置</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </nav> |
| | | |
| | | <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| | | <nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu"> |
| | | <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| | | <a href="../../..">DT-HA</a> |
| | | |
| | | </nav> |
| | | <div class="wy-nav-content"> |
| | | <div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation"> |
| | | <ul class="wy-breadcrumbs"> |
| | | <li><a href="../../.." class="icon icon-home" aria-label="Docs"></a></li> |
| | | <li class="breadcrumb-item active">BackupToFile</li> |
| | | <li class="wy-breadcrumbs-aside"> |
| | | </li> |
| | | </ul> |
| | | <hr/> |
| | | </div> |
| | | <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| | | <div class="section" itemprop="articleBody"> |
| | | |
| | | <h2 id="_1">备份到文件<a class="headerlink" href="#_1" title="Permanent link">¶</a></h2> |
| | | |
| | | </div> |
| | | </div><footer> |
| | | |
| | | <hr/> |
| | | |
| | | <div role="contentinfo"> |
| | | <!-- Copyright etc --> |
| | | </div> |
| | | |
| | | Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| | | </footer> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | </section> |
| | | |
| | | </div> |
| | | |
| | | <div class="rst-versions" role="note" aria-label="Versions"> |
| | | <span class="rst-current-version" data-toggle="rst-current-version"> |
| | | |
| | | <span> |
| | | <a href="http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git" class="fa fa-code-fork" style="color: #fcfcfc"> Dh</a> |
| | | </span> |
| | | |
| | | |
| | | |
| | | </span> |
| | | </div> |
| | | <script src="../../../js/jquery-3.6.0.min.js"></script> |
| | | <script>var base_url = "../../..";</script> |
| | | <script src="../../../js/theme_extra.js"></script> |
| | | <script src="../../../js/theme.js"></script> |
| | | <script src="../../../search/main.js"></script> |
| | | <script> |
| | | jQuery(function () { |
| | | SphinxRtdTheme.Navigation.enable(true); |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| New file |
| | |
| | | <!DOCTYPE html> |
| | | <html class="writer-html5" lang="en" > |
| | | <head> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="author" content="岱特智能科技(上海)有限公司" /> |
| | | <link rel="shortcut icon" href="../../../img/favicon.ico" /> |
| | | <title>RestoreFromFile - DT-HA</title> |
| | | <link rel="stylesheet" href="../../../css/theme.css" /> |
| | | <link rel="stylesheet" href="../../../css/theme_extra.css" /> |
| | | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" /> |
| | | |
| | | <script> |
| | | // Current page data |
| | | var mkdocs_page_name = "RestoreFromFile"; |
| | | var mkdocs_page_input_path = "Usages\\backupAndRestore\\RestoreFromFile.md"; |
| | | var mkdocs_page_url = null; |
| | | </script> |
| | | |
| | | <!--[if lt IE 9]> |
| | | <script src="../../../js/html5shiv.min.js"></script> |
| | | <![endif]--> |
| | | <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
| | | <script>hljs.highlightAll();</script> |
| | | </head> |
| | | |
| | | <body class="wy-body-for-nav" role="document"> |
| | | |
| | | <div class="wy-grid-for-nav"> |
| | | <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> |
| | | <div class="wy-side-scroll"> |
| | | <div class="wy-side-nav-search"> |
| | | <a href="../../.." class="icon icon-home"> DT-HA |
| | | </a><div role="search"> |
| | | <form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get"> |
| | | <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" title="Type search term here" /> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../..">首页</a> |
| | | </li> |
| | | </ul> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../../about/">关于</a> |
| | | </li> |
| | | </ul> |
| | | <p class="caption"><span class="caption-text">使用教程</span></p> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../../install-guide/installHa/">安装</a> |
| | | </li> |
| | | <li class="toctree-l1"><a class="reference internal" >使用</a> |
| | | <ul> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../usage/">使用概述</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../netconfig/netconfig/">配置网络</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../initConfig/initConfig/">系统初始化配置</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </nav> |
| | | |
| | | <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| | | <nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu"> |
| | | <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| | | <a href="../../..">DT-HA</a> |
| | | |
| | | </nav> |
| | | <div class="wy-nav-content"> |
| | | <div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation"> |
| | | <ul class="wy-breadcrumbs"> |
| | | <li><a href="../../.." class="icon icon-home" aria-label="Docs"></a></li> |
| | | <li class="breadcrumb-item active">RestoreFromFile</li> |
| | | <li class="wy-breadcrumbs-aside"> |
| | | </li> |
| | | </ul> |
| | | <hr/> |
| | | </div> |
| | | <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| | | <div class="section" itemprop="articleBody"> |
| | | |
| | | <h2 id="_1">从备份文件文件中恢复<a class="headerlink" href="#_1" title="Permanent link">¶</a></h2> |
| | | <p>HomeAssistant支持从备份文件串恢复已配置好的HomeAssistant</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250416170818893.png" /></p> |
| | | |
| | | </div> |
| | | </div><footer> |
| | | |
| | | <hr/> |
| | | |
| | | <div role="contentinfo"> |
| | | <!-- Copyright etc --> |
| | | </div> |
| | | |
| | | Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| | | </footer> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | </section> |
| | | |
| | | </div> |
| | | |
| | | <div class="rst-versions" role="note" aria-label="Versions"> |
| | | <span class="rst-current-version" data-toggle="rst-current-version"> |
| | | |
| | | <span> |
| | | <a href="http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git" class="fa fa-code-fork" style="color: #fcfcfc"> Dh</a> |
| | | </span> |
| | | |
| | | |
| | | |
| | | </span> |
| | | </div> |
| | | <script src="../../../js/jquery-3.6.0.min.js"></script> |
| | | <script>var base_url = "../../..";</script> |
| | | <script src="../../../js/theme_extra.js"></script> |
| | | <script src="../../../js/theme.js"></script> |
| | | <script src="../../../search/main.js"></script> |
| | | <script> |
| | | jQuery(function () { |
| | | SphinxRtdTheme.Navigation.enable(true); |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| New file |
| | |
| | | <!DOCTYPE html> |
| | | <html class="writer-html5" lang="en" > |
| | | <head> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="author" content="岱特智能科技(上海)有限公司" /> |
| | | <link rel="shortcut icon" href="../../../img/favicon.ico" /> |
| | | <title>系统初始化配置 - DT-HA</title> |
| | | <link rel="stylesheet" href="../../../css/theme.css" /> |
| | | <link rel="stylesheet" href="../../../css/theme_extra.css" /> |
| | | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" /> |
| | | |
| | | <script> |
| | | // Current page data |
| | | var mkdocs_page_name = "\u7cfb\u7edf\u521d\u59cb\u5316\u914d\u7f6e"; |
| | | var mkdocs_page_input_path = "Usages\\initConfig\\initConfig.md"; |
| | | var mkdocs_page_url = null; |
| | | </script> |
| | | |
| | | <!--[if lt IE 9]> |
| | | <script src="../../../js/html5shiv.min.js"></script> |
| | | <![endif]--> |
| | | <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
| | | <script>hljs.highlightAll();</script> |
| | | </head> |
| | | |
| | | <body class="wy-body-for-nav" role="document"> |
| | | |
| | | <div class="wy-grid-for-nav"> |
| | | <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> |
| | | <div class="wy-side-scroll"> |
| | | <div class="wy-side-nav-search"> |
| | | <a href="../../.." class="icon icon-home"> DT-HA |
| | | </a><div role="search"> |
| | | <form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get"> |
| | | <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" title="Type search term here" /> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../..">首页</a> |
| | | </li> |
| | | </ul> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../../about/">关于</a> |
| | | </li> |
| | | </ul> |
| | | <p class="caption"><span class="caption-text">使用教程</span></p> |
| | | <ul class="current"> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../../install-guide/installHa/">安装</a> |
| | | </li> |
| | | <li class="toctree-l1 current"><a class="reference internal current" >使用</a> |
| | | <ul class="current"> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../usage/">使用概述</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../netconfig/netconfig/">配置网络</a> |
| | | </li> |
| | | <li class="toctree-l2 current"><a class="reference internal current" href="#">系统初始化配置</a> |
| | | <ul class="current"> |
| | | <li class="toctree-l3"><a class="reference internal" href="#homeassistant_1">首次打开HomeAssistant</a> |
| | | </li> |
| | | <li class="toctree-l3"><a class="reference internal" href="#_1">更新必要的组件</a> |
| | | </li> |
| | | <li class="toctree-l3"><a class="reference internal" href="#-">配置-通用</a> |
| | | </li> |
| | | <li class="toctree-l3"><a class="reference internal" href="#-_1">配置-设置-加载项</a> |
| | | <ul> |
| | | <li class="toctree-l4"><a class="reference internal" href="#file-editor">安装File editor</a> |
| | | </li> |
| | | <li class="toctree-l4"><a class="reference internal" href="#samba-share">安装Samba share插件</a> |
| | | </li> |
| | | <li class="toctree-l4"><a class="reference internal" href="#terminal-ssh">安装Terminal & SSH</a> |
| | | </li> |
| | | <li class="toctree-l4"><a class="reference internal" href="#mosquitto-broker">安装Mosquitto broker</a> |
| | | </li> |
| | | <li class="toctree-l4"><a class="reference internal" href="#node-red">安装Node-RED插件</a> |
| | | </li> |
| | | <li class="toctree-l4"><a class="reference internal" href="#docker-postgresql">利用 Docker 安装 PostgreSQL</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </nav> |
| | | |
| | | <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| | | <nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu"> |
| | | <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| | | <a href="../../..">DT-HA</a> |
| | | |
| | | </nav> |
| | | <div class="wy-nav-content"> |
| | | <div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation"> |
| | | <ul class="wy-breadcrumbs"> |
| | | <li><a href="../../.." class="icon icon-home" aria-label="Docs"></a></li> |
| | | <li class="breadcrumb-item">使用教程</li> |
| | | <li class="breadcrumb-item">使用</li> |
| | | <li class="breadcrumb-item active">系统初始化配置</li> |
| | | <li class="wy-breadcrumbs-aside"> |
| | | </li> |
| | | </ul> |
| | | <hr/> |
| | | </div> |
| | | <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| | | <div class="section" itemprop="articleBody"> |
| | | |
| | | <h3 id="homeassistant">初始化配置HomeAssistant<a class="headerlink" href="#homeassistant" title="Permanent link">¶</a></h3> |
| | | <h4 id="homeassistant_1">首次打开HomeAssistant<a class="headerlink" href="#homeassistant_1" title="Permanent link">¶</a></h4> |
| | | <p>首次打开HomeAssistant通过,路由器为其分配的IP地址加端口号即可进行HomeAssistant.</p> |
| | | <p>格式如下:</p> |
| | | <div class="codehilite"><pre><span></span><code>http://Ip:Port |
| | | 如:http://192.168.3.2:8123 |
| | | 基中:8123为其默认的端口后,当然,系统初始化成功后,可以改. |
| | | </code></pre></div> |
| | | |
| | | <p>如下图所示: |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416174015324.png" style="zoom:67%;" /></p> |
| | | <p>点击"创建我智能家家居"按进行下一步</p> |
| | | <p><img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416174141899.png" style="zoom:67%;" /></p> |
| | | <p>在这里我们输入姓名,用户名,密码,确认密码 |
| | | 这里我们使用统一的信息</p> |
| | | <div class="codehilite"><pre><span></span><code>姓名:岱特智能 |
| | | 用户名:dtuser |
| | | 密码:****** |
| | | 确认密码:***** |
| | | </code></pre></div> |
| | | |
| | | <p><strong>注意:上述密码为了安全,没有显示,请咨询系统管理员获取真正的密码.</strong></p> |
| | | <p><img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416174647992.png" style="zoom:67%;" /></p> |
| | | <p>点击"创建帐户",</p> |
| | | <p><img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416174907500.png" style="zoom:67%;" /></p> |
| | | <p>这一步,会要求你输入位置,输入城市点获取,如果取下到会报错.没关系,直接下一步即可,系统配置完成后,还可更改.</p> |
| | | <p><img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416175039994.png" style="zoom:67%;" /></p> |
| | | <p>这一步是要求,你输下所属的国家与地区,它会自动判断出来,国家,直接点下一步即可.</p> |
| | | <p>此时,它可能还会弹出一个对话框框,帮你检测位置 ,点确定即可</p> |
| | | <p><img src="https://dhcdn.leon056.com/bpfStudy/docs/1744797155585.png" style="zoom: 67%;" /></p> |
| | | <p>如果不想让其检测,直接点取消即可,因为其检测折可能很慢,所以,直接点取消,选择中国即可.</p> |
| | | <p><img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416180125174.png" style="zoom:67%;" /></p> |
| | | <p>这里的几项,全部不用选,直接下一步</p> |
| | | <p><img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416180225320.png" style="zoom:67%;" /></p> |
| | | <p>这一步,系统会自动扫描局域网中的能直接入的设备.直接点击完成,</p> |
| | | <p>然后,系统会转到如下界面</p> |
| | | <p><img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416180400766.png" style="zoom:67%;" /></p> |
| | | <p>可能要持续一阵,等待其完成即可.</p> |
| | | <p><img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416180639029.png" style="zoom:67%;" /></p> |
| | | <p>开始第一次,可能很慢</p> |
| | | <p>首次完成如下显示</p> |
| | | <p><img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416180715339.png" style="zoom:67%;" /></p> |
| | | <h4 id="_1">更新必要的组件<a class="headerlink" href="#_1" title="Permanent link">¶</a></h4> |
| | | <p>首次登录,可能会显示更新,如此时显示</p> |
| | | <p><img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416181146547.png" style="zoom:67%;" /></p> |
| | | <p>提示更新Home Assistnat Operating System Update,点击如下按钮,以弹出的对话框中,点更新按钮 |
| | | <img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416181323600.png" style="zoom:67%;" /></p> |
| | | <p>如下图所示,系统将会,进行更新</p> |
| | | <p><img src="https://dhcdn.leon056.com/bpfStudy/docs/20250416181455221.png" style="zoom:67%;" /></p> |
| | | <p>注意,这个操作,一般是从两个地方获取更新包,一是github一个是docker的仓库,所以,<strong>要保持科学上网的畅通</strong>。这个过程 ,估计要几分钟,需要耐心等等,也有可能会更新失败,然后,再次更新。</p> |
| | | <p>更新时,如果网络有问题可能会出在日志 中报出如下错误</p> |
| | | <div class="codehilite"><pre><span></span><code>aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.439 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.440 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.440 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | 2025-04-16 17:26:15.440 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) |
| | | aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') |
| | | [09:26:17] INFO: Home Assistant Core finish process exit code 0 |
| | | [09:26:17] INFO: Home Assistant Core service shutdown |
| | | s6-rc: info: service legacy-services successfully stopped |
| | | s6-rc: info: service legacy-cont-init: stopping |
| | | s6-rc: info: service legacy-cont-init successfully stopped |
| | | s6-rc: info: service fix-attrs: stopping |
| | | s6-rc: info: service fix-attrs successfully stopped |
| | | s6-rc: info: service s6rc-oneshot-runner: stopping |
| | | s6-rc: info: service s6rc-oneshot-runner successfully stopped |
| | | s6-rc: info: service s6rc-oneshot-runner: starting |
| | | s6-rc: info: service s6rc-oneshot-runner successfully started |
| | | s6-rc: info: service fix-attrs: starting |
| | | s6-rc: info: service fix-attrs successfully started |
| | | s6-rc: info: service legacy-cont-init: starting |
| | | s6-rc: info: service legacy-cont-init successfully started |
| | | s6-rc: info: service legacy-services: starting |
| | | services-up: info: copying legacy longrun home-assistant (no readiness notification) |
| | | s6-rc: info: service legacy-services successfully started |
| | | 2025-04-16 17:28:26.876 ERROR (MainThread) [homeassistant.components.homeassistant_alerts.coordinator] Timeout fetching homeassistant_alerts data |
| | | 2025-04-16 17:51:56.276 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain hassio.update |
| | | 2025-04-16 17:51:56.278 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain cloud.tts |
| | | 2025-04-16 17:51:56.278 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain mobile_app.notify |
| | | 2025-04-16 17:51:56.278 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain backup.sensor |
| | | 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain energy.sensor |
| | | 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain sun.sensor |
| | | 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain homeassistant.scene |
| | | 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain hassio.binary_sensor |
| | | 2025-04-16 17:51:56.280 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain hassio.sensor |
| | | </code></pre></div> |
| | | |
| | | <p>上述错误多是由于网络问题引起的,要去检是科学上网是否还正常.</p> |
| | | <p>更完完成后,再次启动后,会显示没有可用的更新</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417092912822.png" /></p> |
| | | <h4 id="-">配置-通用<a class="headerlink" href="#-" title="Permanent link">¶</a></h4> |
| | | <p>点击,开始,通用</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250416183224006.png" /></p> |
| | | <p>更改名称为:岱特智能 |
| | | 其它的不变</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250416183309109.png" /></p> |
| | | <p>#### 配置-网络-主机名</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417094434315.png" /></p> |
| | | <p>把主机名配置成为局域网中唯一的,实际让就是计算机名,因为同一局域网中,计算机名,不允许相同</p> |
| | | <h4 id="-_1">配置-设置-加载项<a class="headerlink" href="#-_1" title="Permanent link">¶</a></h4> |
| | | <p>加载项中有许多必装组件,需要一一安装,首次进入时,可能会显示如下页面</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417102735914.png" /></p> |
| | | <p>点击下角的"加载项商店"</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/image-20250417103041576.png" /></p> |
| | | <h5 id="file-editor">安装File editor<a class="headerlink" href="#file-editor" title="Permanent link">¶</a></h5> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/image-20250417103159193.png" /></p> |
| | | <p>File editor 是一个用于修改HA的配置文件的集成工具,属必装项,点击安装</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417103608598.png" /></p> |
| | | <p>点击安装,系统会在后台自动安装此插件, |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417104146679.png" /></p> |
| | | <p>安装完成后,会自动重启</p> |
| | | <p>有时也会提示安装失败</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417105230073.png" /></p> |
| | | <p>这种经查看日志 多为网强行问题无法访问.docker.io,这是因为科学上风的原因,重点排查网络,安装成功后,再次进入会显示如下界面</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417105547700.png" /></p> |
| | | <p>勾选,开机启动,自动恢复,显示于侧边栏</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417105644468.png" /></p> |
| | | <p>点击启动,或重启,将会在侧边栏看到此图标,点击打开网页界面</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417105820902.png" /></p> |
| | | <p>能看到如下界面,说明安装成功</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417105918681.png" /></p> |
| | | <p>此时加载项中,就多出了File editor选项</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417105949676.png" /></p> |
| | | <h5 id="samba-share">安装Samba share插件<a class="headerlink" href="#samba-share" title="Permanent link">¶</a></h5> |
| | | <p>Samba share插件是一个提供共享目录的方式允行其它计算机用这种方式查看编辑ha的文件的组件.</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417111104287.png" /></p> |
| | | <p>点击安装</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417111140693.png" /></p> |
| | | <p>安装失败时,会有如下提下提示</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417111731068.png" /></p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417111959381.png" /></p> |
| | | <p>打开自动恢复</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417112429893.png" /></p> |
| | | <p>接下来我们需要到配置选项中</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417112959837.png" /></p> |
| | | <p>此处我们设置如下信息</p> |
| | | <div class="codehilite"><pre><span></span><code>Username:dtuser |
| | | Password:***** # 此处请咨询管理员 |
| | | Workgroup:WORKGROUP # 保持不变 |
| | | </code></pre></div> |
| | | |
| | | <p>更改完成后,有如下配置</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417113757884.png" /></p> |
| | | <p>配置 完成后,点击启动</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417113840938.png" /></p> |
| | | <p>启动成功后,会出下图显示</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417114018464.png" /></p> |
| | | <p>此时,如果,与HA在同一局域网,我们可以使用如下方式查看HA的文件目录</p> |
| | | <p>在地址栏输入\HA的IP </p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417114610432.png" /></p> |
| | | <p>输入预设的用户名与密码,即可查看,编辑HA的各种文件。</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417114720695.png" /></p> |
| | | <h5 id="terminal-ssh">安装Terminal & SSH<a class="headerlink" href="#terminal-ssh" title="Permanent link">¶</a></h5> |
| | | <p>Terminal & SSH 插件为HA提供了在web端使用控制台终端功能,及开启了ssh服务,使之可以远程使用SSH访问HA终端。</p> |
| | | <p>在搜索中输入Terminal & SSH </p> |
| | | <p>结果有可能显示</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417115643048.png" /></p> |
| | | <p>搜索不到,这时,可能是因为仓库没有配置,还是使用的默认的仓库,我们可以增加一下仓库,如下:</p> |
| | | <div class="codehilite"><pre><span></span><code>https://github.com/AlexxIT/hassio-addons |
| | | </code></pre></div> |
| | | |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417115838631.png" /></p> |
| | | <p>点击右上解的三个点,选中仓库</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417115914947.png" /></p> |
| | | <p>在弹出折对话框中输入,我们记录的仓库地址,然后点添加</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417120018086.png" /></p> |
| | | <p>完成后,点击关闭.</p> |
| | | <p>然后,点击返回,重新搜索</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417120233117.png" /></p> |
| | | <p>这次找到了Advance SSH & Web Terminal</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417120233117.png" /></p> |
| | | <p>点击安装,打开如下页面</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417120802786.png" /></p> |
| | | <p>点击安装,有时会安装失败,</p> |
| | | <p>失败后,需再次安装,同时检查日志中提到的哪个网址无法访问 ,把其加科学上网的代理名单中.</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417122414637.png" /></p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417122910533.png" /></p> |
| | | <p>安装完成后,就变成如下</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417141712061.png" /></p> |
| | | <p>开启自动恢得,显示侧边栏</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417141740843.png" /></p> |
| | | <p>接下来,我们配置ssh的登录信息,如下</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417143151994.png" /></p> |
| | | <p>相关信息如下:</p> |
| | | <div class="codehilite"><pre><span></span><code>username:dtuser |
| | | passsword:**** # 此处需要咨询管理员 |
| | | </code></pre></div> |
| | | |
| | | <p>其它配置选项如下,注意选项,选错了ssh可能启不起来,sftp关闭,zsh关闭.compatibility_mode要开启</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417160113415.png" /></p> |
| | | <p>然后,点击启动按钮</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417143931697.png" /></p> |
| | | <p>启动后如下</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417143953506.png" /></p> |
| | | <p>我们可以通过两个地方进入</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/image-20250417144032876.png" /></p> |
| | | <p>在日志 端能看到 ssh已启动成功</p> |
| | | <div class="codehilite"><pre><span></span><code>s6-rc: info: service base-addon-banner successfully started |
| | | s6-rc: info: service fix-attrs: starting |
| | | s6-rc: info: service base-addon-log-level: starting |
| | | s6-rc: info: service fix-attrs successfully started |
| | | s6-rc: info: service base-addon-log-level successfully started |
| | | s6-rc: info: service legacy-cont-init: starting |
| | | s6-rc: info: service legacy-cont-init successfully started |
| | | s6-rc: info: service init-ssh: starting |
| | | s6-rc: info: service init-mysql: starting |
| | | s6-rc: info: service init-mosquitto: starting |
| | | s6-rc: info: service init-docker: starting |
| | | s6-rc: info: service init-docker successfully started |
| | | s6-rc: info: service init-mysql successfully started |
| | | s6-rc: info: service init-mosquitto successfully started |
| | | [14:51:05] WARNING: |
| | | [14:51:05] WARNING: Logging in with a SSH password is security wise, a bad idea! |
| | | [14:51:05] WARNING: Please, consider using a public/private key pair. |
| | | [14:51:05] WARNING: What is this? https://kb.iu.edu/d/aews |
| | | [14:51:05] WARNING: |
| | | [14:51:05] NOTICE: RSA host key missing, generating one... |
| | | Generating public/private rsa key pair. |
| | | Your identification has been saved in /data/ssh_host_rsa_key |
| | | Your public key has been saved in /data/ssh_host_rsa_key.pub |
| | | The key fingerprint is: |
| | | SHA256:+9pEl2QvyUqsu4B3gnPjhL/Ab71iBIDjWRdYvgZeg0c root@a0d7b954-ssh |
| | | The key's randomart image is: |
| | | +---[RSA 3072]----+ |
| | | | . oE. | |
| | | |o .o+. | |
| | | |..o+.= o | |
| | | | o. = o . + + | |
| | | | . + S + * . | |
| | | | ..+. = o . | |
| | | | B.B.+ o | |
| | | | X+=.= | |
| | | | o=o=+o | |
| | | +----[SHA256]-----+ |
| | | [14:51:08] NOTICE: ED25519 host key missing, generating one... |
| | | Generating public/private ed25519 key pair. |
| | | Your identification has been saved in /data/ssh_host_ed25519_key |
| | | Your public key has been saved in /data/ssh_host_ed25519_key.pub |
| | | The key fingerprint is: |
| | | SHA256:MgbUsAJ+23skjVTwD0pWVRBCmZ0BjU3jwV/99gGnNVc root@a0d7b954-ssh |
| | | The key's randomart image is: |
| | | +--[ED25519 256]--+ |
| | | |. o+o*%O*. . E| |
| | | |.. . .=+o*o o =.| |
| | | | ...o+ o .. . = +| |
| | | | ..*.+ o . . .o| |
| | | | . =+oS. .o| |
| | | | .+o .| |
| | | | . . | |
| | | | . | |
| | | | | |
| | | +----[SHA256]-----+ |
| | | s6-rc: info: service init-ssh successfully started |
| | | s6-rc: info: service init-user: starting |
| | | [14:51:08] NOTICE: Session sharing has been disabled! |
| | | s6-rc: info: service init-user successfully started |
| | | s6-rc: info: service ttyd: starting |
| | | s6-rc: info: service sshd: starting |
| | | s6-rc: info: service sshd successfully started |
| | | s6-rc: info: service ttyd successfully started |
| | | s6-rc: info: service legacy-services: starting |
| | | [14:51:09] INFO: Starting the ttyd daemon... |
| | | [14:51:09] INFO: Starting the SSH daemon... |
| | | s6-rc: info: service legacy-services successfully started |
| | | Server listening on 0.0.0.0 port 22. |
| | | Server listening on :: port 22. |
| | | </code></pre></div> |
| | | |
| | | <p>配置成功后,可以通过如下命令来测试是否可以远程SSH连入</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417150734570.png" /></p> |
| | | <p>输入yes后会要求 输入密码,验证正确后,会进入看到如个图,就说明ssh已正常的开启成功了</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417155921995.png" /></p> |
| | | <p>以下界面是在ha中看到的内置的ssh</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417160212333.png" /></p> |
| | | <p>其它,当访问一些系统操作无权限时,可以关闭保护开关</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417171751950.png" /></p> |
| | | <h5 id="mosquitto-broker">安装Mosquitto broker<a class="headerlink" href="#mosquitto-broker" title="Permanent link">¶</a></h5> |
| | | <p>Mosquitto broker是一个重要的插件,其提供的MQTT 服务为公司大多数数设备折集成,mqtt通信通道,所以,此为必装插件。</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417160954518.png" /></p> |
| | | <p>点击安装</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417161858614.png" /></p> |
| | | <p>看到如下界面,说明安装成功, |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417162347432.png" /></p> |
| | | <p>接下来是配置mqtt</p> |
| | | <h6 id="_2">开启自动恢复<a class="headerlink" href="#_2" title="Permanent link">¶</a></h6> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417162755148.png" /></p> |
| | | <h6 id="mqtt">配置mqtt的用户名密码及定制配置<a class="headerlink" href="#mqtt" title="Permanent link">¶</a></h6> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417165820612.png" /></p> |
| | | <div class="codehilite"><pre><span></span><code>username:dtuser |
| | | password:****** #此处的密码请咨询管理员 |
| | | </code></pre></div> |
| | | |
| | | <p>配置完成后,启动mqtt服务</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417163342388.png" /></p> |
| | | <p>日志中显示如下信息,说明成功</p> |
| | | <div class="codehilite"><pre><span></span><code>s6-rc: info: service s6rc-oneshot-runner: starting |
| | | s6-rc: info: service s6rc-oneshot-runner successfully started |
| | | s6-rc: info: service fix-attrs: starting |
| | | s6-rc: info: service fix-attrs successfully started |
| | | s6-rc: info: service legacy-cont-init: starting |
| | | cont-init: info: running /etc/cont-init.d/mosquitto.sh |
| | | [16:33:27] INFO: Setting up user dtuser |
| | | [16:33:28] INFO: SSL is not enabled |
| | | cont-init: info: /etc/cont-init.d/mosquitto.sh exited 0 |
| | | cont-init: info: running /etc/cont-init.d/nginx.sh |
| | | cont-init: info: /etc/cont-init.d/nginx.sh exited 0 |
| | | s6-rc: info: service legacy-cont-init successfully started |
| | | s6-rc: info: service legacy-services: starting |
| | | services-up: info: copying legacy longrun mosquitto (no readiness notification) |
| | | services-up: info: copying legacy longrun nginx (no readiness notification) |
| | | [16:33:29] INFO: Starting NGINX for authentication handling... |
| | | s6-rc: info: service legacy-services successfully started |
| | | [16:33:29] INFO: Starting mosquitto MQTT broker... |
| | | 2025-04-17 16:33:29: Warning: Mosquitto should not be run as root/administrator. |
| | | 2025-04-17 16:33:29: mosquitto version 2.0.20 starting |
| | | 2025-04-17 16:33:29: Config loaded from /etc/mosquitto/mosquitto.conf. |
| | | 2025-04-17 16:33:29: Loading plugin: /usr/share/mosquitto/go-auth.so |
| | | 2025-04-17 16:33:29: ├── Username/password checking enabled. |
| | | 2025-04-17 16:33:29: ├── TLS-PSK checking enabled. |
| | | 2025-04-17 16:33:29: └── Extended authentication not enabled. |
| | | 2025-04-17 16:33:29: Opening ipv4 listen socket on port 1883. |
| | | 2025-04-17 16:33:29: Opening ipv6 listen socket on port 1883. |
| | | 2025-04-17 16:33:29: Opening websockets listen socket on port 1884. |
| | | 2025-04-17 16:33:29: mosquitto version 2.0.20 running |
| | | 2025-04-17 16:33:29: New connection from ::1:56336 on port 1883. |
| | | 2025-04-17 16:33:29: Client <unknown> disconnected due to protocol error. |
| | | [16:33:30] INFO: Successfully send discovery information to Home Assistant. |
| | | [16:33:31] INFO: Successfully send service information to the Supervisor. |
| | | </code></pre></div> |
| | | |
| | | <p>当消息,提示发现设备时,点击,弹出的消息中,点check it out,然后,看到已发现mqtt,点击添加</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417163617741.png" /></p> |
| | | <p>然后,点击完成</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417163633687.png" /></p> |
| | | <p>然后就会在设置-设备与服务-集成中,显示Mqtt,以后,所有增加的MQTT类设备,都会显示在这个类别中。</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417163705382.png" /></p> |
| | | <h5 id="node-red">安装Node-RED插件<a class="headerlink" href="#node-red" title="Permanent link">¶</a></h5> |
| | | <p>Node-Red插件是我们集中各种设备的重要消息处理转换插件,属必装插件.</p> |
| | | <p>在加载项中,搜索nod显示如下</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417164340639.png" /></p> |
| | | <p>点击,进入详细页面</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417164440484.png" /></p> |
| | | <p>点击安装</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417164711564.png" /></p> |
| | | <p>如果安装出错,多半是科学上网的问题,</p> |
| | | <p>如现如下页面,说明安装成功</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/image-20250417165013539.png" /></p> |
| | | <p>开启自动恢复,关闭侧边栏</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/image-20250417165048899.png" /></p> |
| | | <p>配置nod-red</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417170501565.png" /></p> |
| | | <p>此处的配置信息为</p> |
| | | <div class="codehilite"><pre><span></span><code>username:admin |
| | | password:**** #此处的密码,请向管理员获取 |
| | | ### 默认情况下关闭ssl |
| | | </code></pre></div> |
| | | |
| | | <p>然后启动node-red</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417170754947.png" /></p> |
| | | <p>点击打开web-页面如下</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417170638780.png" /></p> |
| | | <h5 id="docker-postgresql">利用 Docker 安装 PostgreSQL<a class="headerlink" href="#docker-postgresql" title="Permanent link">¶</a></h5> |
| | | <p>虽然 Home Assistant OS 本身不允许直接访问系统底层,但它内置了 Docker 支持,因此可以直接运行 PostgreSQL 的 Docker 容器。</p> |
| | | <h6 id="_3"><strong>步骤</strong><a class="headerlink" href="#_3" title="Permanent link">¶</a></h6> |
| | | <ol> |
| | | <li> |
| | | <p><strong>确保您有 SSH 访问权限</strong></p> |
| | | </li> |
| | | <li> |
| | | <p>安装 Home Assistant 的 SSH & Web Terminal Add-on(高级模式)。</p> |
| | | </li> |
| | | <li> |
| | | <p>开启 SSH 访问,具体步骤如下:</p> |
| | | <ol> |
| | | <li>前往 <strong>Supervisor > Add-on Store</strong>。</li> |
| | | <li>搜索并安装 <strong>SSH & Web Terminal</strong>(官方插件)。</li> |
| | | <li>配置 SSH 插件,确保 <code>protected</code> 设置为 <code>false</code>,然后启动它。</li> |
| | | </ol> |
| | | </li> |
| | | <li> |
| | | <p><strong>运行 PostgreSQL 容器</strong></p> |
| | | </li> |
| | | <li> |
| | | <p>在 SSH 或 Web Terminal 中运行以下命令:</p> |
| | | <p><code>BASHdocker run -d \ |
| | | --name=postgresql \ |
| | | -e POSTGRES_USER=homeassistant \ |
| | | -e POSTGRES_PASSWORD=yourpassword \ |
| | | -e POSTGRES_DB=homeassistant \ |
| | | -v /mnt/data/supervisor/postgresql:/var/lib/postgresql/data \ |
| | | -p 5432:5432 \ |
| | | postgres</code></p> |
| | | <ul> |
| | | <li>替换 <code>yourpassword</code> 为您想要设置的数据库密码。</li> |
| | | <li>数据库名称为 <code>homeassistant</code>,用户名为 <code>homeassistant</code>。</li> |
| | | <li>数据将存储在 <code>/mnt/data/supervisor/postgresql</code>,确保数据在重启后不会丢失。</li> |
| | | </ul> |
| | | </li> |
| | | </ol> |
| | | |
| | | </div> |
| | | </div><footer> |
| | | <div class="rst-footer-buttons" role="navigation" aria-label="Footer Navigation"> |
| | | <a href="../../netconfig/netconfig/" class="btn btn-neutral float-left" title="配置网络"><span class="icon icon-circle-arrow-left"></span> Previous</a> |
| | | </div> |
| | | |
| | | <hr/> |
| | | |
| | | <div role="contentinfo"> |
| | | <!-- Copyright etc --> |
| | | </div> |
| | | |
| | | Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| | | </footer> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | </section> |
| | | |
| | | </div> |
| | | |
| | | <div class="rst-versions" role="note" aria-label="Versions"> |
| | | <span class="rst-current-version" data-toggle="rst-current-version"> |
| | | |
| | | <span> |
| | | <a href="http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git" class="fa fa-code-fork" style="color: #fcfcfc"> Dh</a> |
| | | </span> |
| | | |
| | | |
| | | <span><a href="../../netconfig/netconfig/" style="color: #fcfcfc">« Previous</a></span> |
| | | |
| | | |
| | | </span> |
| | | </div> |
| | | <script src="../../../js/jquery-3.6.0.min.js"></script> |
| | | <script>var base_url = "../../..";</script> |
| | | <script src="../../../js/theme_extra.js"></script> |
| | | <script src="../../../js/theme.js"></script> |
| | | <script src="../../../search/main.js"></script> |
| | | <script> |
| | | jQuery(function () { |
| | | SphinxRtdTheme.Navigation.enable(true); |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| New file |
| | |
| | | <!DOCTYPE html> |
| | | <html class="writer-html5" lang="en" > |
| | | <head> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="author" content="岱特智能科技(上海)有限公司" /> |
| | | <link rel="shortcut icon" href="../../../img/favicon.ico" /> |
| | | <title>installHacs - DT-HA</title> |
| | | <link rel="stylesheet" href="../../../css/theme.css" /> |
| | | <link rel="stylesheet" href="../../../css/theme_extra.css" /> |
| | | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" /> |
| | | |
| | | <script> |
| | | // Current page data |
| | | var mkdocs_page_name = "installHacs"; |
| | | var mkdocs_page_input_path = "Usages\\initConfig\\installHacs.md"; |
| | | var mkdocs_page_url = null; |
| | | </script> |
| | | |
| | | <!--[if lt IE 9]> |
| | | <script src="../../../js/html5shiv.min.js"></script> |
| | | <![endif]--> |
| | | <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
| | | <script>hljs.highlightAll();</script> |
| | | </head> |
| | | |
| | | <body class="wy-body-for-nav" role="document"> |
| | | |
| | | <div class="wy-grid-for-nav"> |
| | | <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> |
| | | <div class="wy-side-scroll"> |
| | | <div class="wy-side-nav-search"> |
| | | <a href="../../.." class="icon icon-home"> DT-HA |
| | | </a><div role="search"> |
| | | <form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get"> |
| | | <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" title="Type search term here" /> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../..">首页</a> |
| | | </li> |
| | | </ul> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../../about/">关于</a> |
| | | </li> |
| | | </ul> |
| | | <p class="caption"><span class="caption-text">使用教程</span></p> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../../install-guide/installHa/">安装</a> |
| | | </li> |
| | | <li class="toctree-l1"><a class="reference internal" >使用</a> |
| | | <ul> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../usage/">使用概述</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../netconfig/netconfig/">配置网络</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../initConfig/">系统初始化配置</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </nav> |
| | | |
| | | <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| | | <nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu"> |
| | | <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| | | <a href="../../..">DT-HA</a> |
| | | |
| | | </nav> |
| | | <div class="wy-nav-content"> |
| | | <div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation"> |
| | | <ul class="wy-breadcrumbs"> |
| | | <li><a href="../../.." class="icon icon-home" aria-label="Docs"></a></li> |
| | | <li class="breadcrumb-item active">installHacs</li> |
| | | <li class="wy-breadcrumbs-aside"> |
| | | </li> |
| | | </ul> |
| | | <hr/> |
| | | </div> |
| | | <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| | | <div class="section" itemprop="articleBody"> |
| | | |
| | | |
| | | |
| | | </div> |
| | | </div><footer> |
| | | |
| | | <hr/> |
| | | |
| | | <div role="contentinfo"> |
| | | <!-- Copyright etc --> |
| | | </div> |
| | | |
| | | Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| | | </footer> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | </section> |
| | | |
| | | </div> |
| | | |
| | | <div class="rst-versions" role="note" aria-label="Versions"> |
| | | <span class="rst-current-version" data-toggle="rst-current-version"> |
| | | |
| | | <span> |
| | | <a href="http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git" class="fa fa-code-fork" style="color: #fcfcfc"> Dh</a> |
| | | </span> |
| | | |
| | | |
| | | |
| | | </span> |
| | | </div> |
| | | <script src="../../../js/jquery-3.6.0.min.js"></script> |
| | | <script>var base_url = "../../..";</script> |
| | | <script src="../../../js/theme_extra.js"></script> |
| | | <script src="../../../js/theme.js"></script> |
| | | <script src="../../../search/main.js"></script> |
| | | <script> |
| | | jQuery(function () { |
| | | SphinxRtdTheme.Navigation.enable(true); |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| New file |
| | |
| | | <!DOCTYPE html> |
| | | <html class="writer-html5" lang="en" > |
| | | <head> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="author" content="岱特智能科技(上海)有限公司" /> |
| | | <link rel="shortcut icon" href="../../../img/favicon.ico" /> |
| | | <title>配置网络 - DT-HA</title> |
| | | <link rel="stylesheet" href="../../../css/theme.css" /> |
| | | <link rel="stylesheet" href="../../../css/theme_extra.css" /> |
| | | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" /> |
| | | |
| | | <script> |
| | | // Current page data |
| | | var mkdocs_page_name = "\u914d\u7f6e\u7f51\u7edc"; |
| | | var mkdocs_page_input_path = "Usages\\netconfig\\netconfig.md"; |
| | | var mkdocs_page_url = null; |
| | | </script> |
| | | |
| | | <!--[if lt IE 9]> |
| | | <script src="../../../js/html5shiv.min.js"></script> |
| | | <![endif]--> |
| | | <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
| | | <script>hljs.highlightAll();</script> |
| | | </head> |
| | | |
| | | <body class="wy-body-for-nav" role="document"> |
| | | |
| | | <div class="wy-grid-for-nav"> |
| | | <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> |
| | | <div class="wy-side-scroll"> |
| | | <div class="wy-side-nav-search"> |
| | | <a href="../../.." class="icon icon-home"> DT-HA |
| | | </a><div role="search"> |
| | | <form id ="rtd-search-form" class="wy-form" action="../../../search.html" method="get"> |
| | | <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" title="Type search term here" /> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../..">首页</a> |
| | | </li> |
| | | </ul> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../../about/">关于</a> |
| | | </li> |
| | | </ul> |
| | | <p class="caption"><span class="caption-text">使用教程</span></p> |
| | | <ul class="current"> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../../install-guide/installHa/">安装</a> |
| | | </li> |
| | | <li class="toctree-l1 current"><a class="reference internal current" >使用</a> |
| | | <ul class="current"> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../usage/">使用概述</a> |
| | | </li> |
| | | <li class="toctree-l2 current"><a class="reference internal current" href="#">配置网络</a> |
| | | <ul class="current"> |
| | | <li class="toctree-l3"><a class="reference internal" href="#_2">熟悉网络配置命令</a> |
| | | </li> |
| | | <li class="toctree-l3"><a class="reference internal" href="#_3">配置网络</a> |
| | | </li> |
| | | <li class="toctree-l3"><a class="reference internal" href="#_4">在系统安装好初始化完成后配置网络</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../initConfig/initConfig/">系统初始化配置</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </nav> |
| | | |
| | | <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| | | <nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu"> |
| | | <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| | | <a href="../../..">DT-HA</a> |
| | | |
| | | </nav> |
| | | <div class="wy-nav-content"> |
| | | <div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation"> |
| | | <ul class="wy-breadcrumbs"> |
| | | <li><a href="../../.." class="icon icon-home" aria-label="Docs"></a></li> |
| | | <li class="breadcrumb-item">使用教程</li> |
| | | <li class="breadcrumb-item">使用</li> |
| | | <li class="breadcrumb-item active">配置网络</li> |
| | | <li class="wy-breadcrumbs-aside"> |
| | | </li> |
| | | </ul> |
| | | <hr/> |
| | | </div> |
| | | <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| | | <div class="section" itemprop="articleBody"> |
| | | |
| | | <h2 id="_1">配置网络<a class="headerlink" href="#_1" title="Permanent link">¶</a></h2> |
| | | <p>公司使用的X86小工控机,大多有多个网卡,一般一个无线网卡,两个有线网卡.多数情况下,我们可能是使用的WIFI网络,这样比较方便,有时为了HA提供的服务折稳定性,我们尽量使用LAN线网络,避免无线网信号质量的问题。所以就涉及到配网的问题。</p> |
| | | <p>HomeAssistant的网络配置,在系统没有安装成功之前,不能通过web进入网页界面时,配置网络只能通过自带网络配置命令来进行.</p> |
| | | <h4 id="_2">熟悉网络配置命令<a class="headerlink" href="#_2" title="Permanent link">¶</a></h4> |
| | | <p>HomeAssistant Cli 提供了默信折network配置命令如下:</p> |
| | | <div class="codehilite"><pre><span></span><code>ha netWork |
| | | Useage: |
| | | ha network [command] |
| | | Examples: |
| | | ha network info |
| | | ha network interface options |
| | | Available Commands: |
| | | info Shows information about the host network |
| | | reload Reload Network information the host |
| | | scan Scan for Access Points on a wireless interface. |
| | | update Update settings of a network interface |
| | | vlan Create a new VLAN on an ethernet interface |
| | | Flags: |
| | | -h, --help help for network |
| | | Global Flags: |
| | | --api-token string Home Assistant Supervisor API token |
| | | --config string Optional config file (default is $HOME/.homeassistant.yaml) |
| | | --endpoint string Endpoint for Home Assistant Supervisor (default is'supervisor') |
| | | --log-level string Log level (defaults to Warn) |
| | | --no-progress Disable the progress spinner |
| | | --raw-json Output raw JSON from the API |
| | | Use "ha network [command] --help" for more information about a command. |
| | | </code></pre></div> |
| | | |
| | | <p>这个ha network命令,大约如下几个功能</p> |
| | | <ul> |
| | | <li>info 显示网络配置信息</li> |
| | | <li>reload 重新加载网络</li> |
| | | <li>scan 扫描网络</li> |
| | | <li>update 配置网络</li> |
| | | </ul> |
| | | <p>我们在使用这个命令时,可以使用其简写,比如省去前面的ha,还可以省去后面的work |
| | | 比如,我们想查看网络配置信息,可以用如下命令来进行</p> |
| | | <div class="codehilite"><pre><span></span><code>net info |
| | | </code></pre></div> |
| | | |
| | | <p>这条命令就会把所有的网络配置信息全部显示出来,只是如果网卡较多,我们没有法在一屏全部阅读完,所以这就引发另一个问题.netwrok所有的子命令,后面都是可以或必须跟着操作对像来进行的,具体的就是,操作或显示哪个网卡接口.一般情况下是如下型式</p> |
| | | <div class="codehilite"><pre><span></span><code>net [command] [interface] |
| | | 即 |
| | | net [子命令] [网卡名称] |
| | | </code></pre></div> |
| | | |
| | | <p>那么如何查看网卡名称呢,在haos 的cli控制台界面,任意时间,同时按下 <strong><em>ctrl+c</em></strong> 后,ha的界面返回到待机界面,如下图所示.</p> |
| | | <p><img alt="网卡接口待机图" src="https://dhcdn.leon056.com/bpfStudy/docs/20250416112808034.png" /></p> |
| | | <p>图中共显示了三个网卡接口:</p> |
| | | <ul> |
| | | <li>wlp3s0 这个是无线网卡接口的名称,一般情况下w字符打头的我为无线网卡</li> |
| | | <li>enp2s0 这个对应小主机上就是LNA1,有线网卡1的名称</li> |
| | | <li>enp4s0 这个对应小主机上就是LNA2,有线网卡1的名称</li> |
| | | </ul> |
| | | <p>查看到了这三个网卡名称,我们就可以对网卡进行查看信息配置等.</p> |
| | | <p>对有初装的HAOS还有准备进行Udate的小主机,最好,就是在路由器端<em>默认提供科学上网</em> ,否则在新安装折初始化那里就会被永远卡住,无法安装成功,如果是自动更新,那么将会更新失败.</p> |
| | | <h4 id="_3">配置网络<a class="headerlink" href="#_3" title="Permanent link">¶</a></h4> |
| | | <p>一般情况下,对于enp2s0,enp4s0,如果路由器端提供了自动获取IP地址功能,则无需配置,网线插入即可使用。</p> |
| | | <p>但是对于比较复杂的网络则需要配置,同样,如果想使用wifi网络,也需要配置 .</p> |
| | | <p>配置网络的命令如下:</p> |
| | | <div class="codehilite"><pre><span></span><code>ha > net update |
| | | Usage: |
| | | ha network update [interface] [flags] |
| | | Aliases: |
| | | update, set, up |
| | | Examples: |
| | | ha network update eth0 --ipv4-method auto --ipv6-method disabled |
| | | Flags: |
| | | -e, --disabled Disable interface |
| | | -h, --help help for update |
| | | --ipv4-address stringArray IPv4 address for the interface in the 192.168.1.5/24 |
| | | --ipv4-gateway string The IPv4 gateway the interface should use |
| | | --ipv4-method string Method on IPv4: static|auto|disabled |
| | | --ipv4-nameserver stringArray IPv4 address of upstream DNS servers. Use multiple times for multiple servers. |
| | | --ipv6-address stringArray IPv6 address for the interface in the 2001:0db8:85a3:0000:0000:8a2e:0370:7334/64 |
| | | --ipv6-gateway string The IPv6 gateway the interface should use |
| | | --ipv6-method string Method on IPv6: static|auto|disabled |
| | | --ipv6-nameserver stringArray IPv6 address for upstream DNS servers. Use multiple times for multiple servers. |
| | | --wifi-auth string Used authentication: open, wep, wpa-psk |
| | | --wifi-mode string Wifi mode: infrastructure, adhoc, mesh or ap |
| | | --wifi-psk string Shared authentication key for wep or wpa |
| | | --wifi-ssid string SSID for wifi connection |
| | | Global Flags: |
| | | --api-token string Home Assistant Supervisor API token |
| | | --config string Optional config file (default is $HOME/.homeassistant.yaml) |
| | | --endpoint string Endpoint for Home Assistant Supervisor (default is `supervisor`) |
| | | --log-level string Log level (defaults to Warn) |
| | | --no-progress Disable the progress spinner |
| | | --raw-json Output raw JSON from the API |
| | | </code></pre></div> |
| | | |
| | | <p>这条命令ha network update [interface] [flags],提供了很多功能,它可以配置wif网络,可以对指定的网卡配置ip4/6的IP地址,网关,是否启用等.因此可以在实际工作中灵活使用. |
| | | 具体用法简译如下</p> |
| | | <div class="codehilite"><pre><span></span><code>ha > net update |
| | | Usage: |
| | | ha network update [interface] [flags] |
| | | Aliases: |
| | | update, set, up |
| | | Examples: |
| | | ha network update eth0 --ipv4-method auto --ipv6-method disabled |
| | | Flags: |
| | | -e, --disabled 禁用接口 |
| | | -h, --help 显示更新的帮助信息 |
| | | --ipv4-address stringArray 接口的 IPv4 地址,例如 192.168.1.5/24 |
| | | --ipv4-gateway string 接口使用的 IPv4 网关 |
| | | --ipv4-method string IPv4 方法: static|auto|disabled |
| | | --ipv4-nameserver stringArray 上游 DNS 服务器的 IPv4 地址,可多次使用以指定多个服务器 |
| | | --ipv6-address stringArray 接口的 IPv6 地址,例如 2001:0db8:85a3:0000:0000:8a2e:0370:7334/64 |
| | | --ipv6-gateway string 接口使用的 IPv6 网关 |
| | | --ipv6-method string IPv6 方法: static|auto|disabled |
| | | --ipv6-nameserver stringArray 上游 DNS 服务器的 IPv6 地址,可多次使用以指定多个服务器 |
| | | --wifi-auth string 使用的认证方式: open, wep, wpa-psk |
| | | --wifi-mode string WiFi 模式: infrastructure, adhoc, mesh 或 ap |
| | | --wifi-psk string WEP 或 WPA 的共享认证密钥 |
| | | --wifi-ssid string WiFi 连接的 SSID |
| | | |
| | | Global Flags: |
| | | --api-token string Home Assistant Supervisor API 令牌 |
| | | --config string 可选的配置文件路径(默认值为 $HOME/.homeassistant.yaml) |
| | | --endpoint string Home Assistant Supervisor 的端点(默认值为 `supervisor`) |
| | | --log-level string 日志级别(默认值为 Warn) |
| | | --no-progress 禁用进度条 |
| | | --raw-json 以原始 JSON 格式输出 API 数据 |
| | | |
| | | FATA[0000] Error while executing rootCmd: accepts 1 arg(s), received 0 |
| | | </code></pre></div> |
| | | |
| | | <p>下面,我们就以配置wifi联接到网络为例说明一下:</p> |
| | | <p>比如我们默认的WIFI热点如下:</p> |
| | | <div class="codehilite"><pre><span></span><code>wifi info: |
| | | ssid:DT_IoT_GateWay |
| | | passWord:HnczjTyrb0 |
| | | </code></pre></div> |
| | | |
| | | <p>那根据我们上文查看到的无线网卡的名称:<strong>wlp3s0</strong> </p> |
| | | <p>我们使用如下配置命令,来让haos小工控机联上wifi网络:</p> |
| | | <div class="codehilite"><pre><span></span><code>ha network update wlp3s0 --wifi-auth wpa-psk --wifi-psk "HmczjTYrb0" --wifi-mode infrastructure --wifi-ssid "DT_IoT_GateWay" --ipv4-method auto --ipv6-method disabled |
| | | </code></pre></div> |
| | | |
| | | <p>这条命令解释如下:</p> |
| | | <ul> |
| | | <li>指定wifi的密码方式为:wpa-psk (--wifi-auth wpa-psk).</li> |
| | | <li>指定wif的密码为:HnczjTyrb0 (--wifi-psk "HmczjYrb0").</li> |
| | | <li>指定网卡接口模式为:infrastructure 即常规模式 (--wifi-mode infrastructure).</li> |
| | | <li>指定要联接的网络SSID:DT_IoT_GateWay (--wifi-ssid "DT_IoT_GateWay").</li> |
| | | <li>指定IP地址获取方式(静态、自动、禁用):自动 ( --ipv4-method auto).</li> |
| | | <li>指定是否禁用IpV6:禁用 (--ipv6-method disabled)</li> |
| | | </ul> |
| | | <p>如下图所示,我们成功的使用这条指令,配置好了wifi网络:</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250416115724085.png" /></p> |
| | | <p>如下所示,配网成功后,路由器已自动为其分配好了ip地址:</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250416115834649.png" /></p> |
| | | <p>此时,我们在浏览器中输入网址<a href="http://192.168.3.2:8123">http://192.168.3.2:8123</a> 即可进入haos的web页面.</p> |
| | | <p>下图是无线网卡与有线网卡同时启用的情况,可以看到,两个网卡都被正确的分配到了IP地址:</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250416120009156.png" /></p> |
| | | <h4 id="_4">在系统安装好初始化完成后配置网络<a class="headerlink" href="#_4" title="Permanent link">¶</a></h4> |
| | | <p>系统初始化完成后,仍然可以调整配置网络,</p> |
| | | <p>设置-系统-网络 中配置网络接口可以进行网络配置</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250417101928366.png" /></p> |
| | | <p>在这里你可以看到我们的三块网卡,wlp3s0,enp2s0,enp4s0,可在此处配置,每个网卡的IP,子网,网关,DNS等,也可以配置wi-fi热点.</p> |
| | | |
| | | </div> |
| | | </div><footer> |
| | | <div class="rst-footer-buttons" role="navigation" aria-label="Footer Navigation"> |
| | | <a href="../../usage/" class="btn btn-neutral float-left" title="使用概述"><span class="icon icon-circle-arrow-left"></span> Previous</a> |
| | | <a href="../../initConfig/initConfig/" class="btn btn-neutral float-right" title="系统初始化配置">Next <span class="icon icon-circle-arrow-right"></span></a> |
| | | </div> |
| | | |
| | | <hr/> |
| | | |
| | | <div role="contentinfo"> |
| | | <!-- Copyright etc --> |
| | | </div> |
| | | |
| | | Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| | | </footer> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | </section> |
| | | |
| | | </div> |
| | | |
| | | <div class="rst-versions" role="note" aria-label="Versions"> |
| | | <span class="rst-current-version" data-toggle="rst-current-version"> |
| | | |
| | | <span> |
| | | <a href="http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git" class="fa fa-code-fork" style="color: #fcfcfc"> Dh</a> |
| | | </span> |
| | | |
| | | |
| | | <span><a href="../../usage/" style="color: #fcfcfc">« Previous</a></span> |
| | | |
| | | |
| | | <span><a href="../../initConfig/initConfig/" style="color: #fcfcfc">Next »</a></span> |
| | | |
| | | </span> |
| | | </div> |
| | | <script src="../../../js/jquery-3.6.0.min.js"></script> |
| | | <script>var base_url = "../../..";</script> |
| | | <script src="../../../js/theme_extra.js"></script> |
| | | <script src="../../../js/theme.js"></script> |
| | | <script src="../../../search/main.js"></script> |
| | | <script> |
| | | jQuery(function () { |
| | | SphinxRtdTheme.Navigation.enable(true); |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="en"> |
| | | <html class="writer-html5" lang="en" > |
| | | <head> |
| | | |
| | | |
| | | <meta charset="utf-8"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="author" content="岱特智能科技(上海)有限公司" /> |
| | | <link rel="shortcut icon" href="../../img/favicon.ico" /> |
| | | <title>使用概述 - DT-HA</title> |
| | | <link rel="stylesheet" href="../../css/theme.css" /> |
| | | <link rel="stylesheet" href="../../css/theme_extra.css" /> |
| | | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" /> |
| | | |
| | | <script> |
| | | // Current page data |
| | | var mkdocs_page_name = "\u4f7f\u7528\u6982\u8ff0"; |
| | | var mkdocs_page_input_path = "Usages\\usage.md"; |
| | | var mkdocs_page_url = null; |
| | | </script> |
| | | |
| | | |
| | | <link rel="shortcut icon" href="../../img/favicon.ico"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> |
| | | <title>使用 - DT-HA</title> |
| | | <link href="../../css/bootstrap-3.3.7.min.css" rel="stylesheet"> |
| | | <link href="../../css/font-awesome-4.7.0.css" rel="stylesheet"> |
| | | <link href="../../css/base.css" rel="stylesheet"> |
| | | <link rel="stylesheet" href="../../css/highlight.css"> |
| | | <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> |
| | | <!--[if lt IE 9]> |
| | | <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> |
| | | <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> |
| | | <script src="../../js/html5shiv.min.js"></script> |
| | | <![endif]--> |
| | | |
| | | <script src="../../js/jquery-3.2.1.min.js"></script> |
| | | <script src="../../js/bootstrap-3.3.7.min.js"></script> |
| | | <script src="../../js/highlight.pack.js"></script> |
| | | |
| | | <base target="_top"> |
| | | <script> |
| | | var base_url = '../..'; |
| | | var is_top_frame = false; |
| | | |
| | | var pageToc = [ |
| | | {title: "\u4f7f\u7528\u6559\u7a0b", url: "#_top", children: [ |
| | | ]}, |
| | | ]; |
| | | |
| | | </script> |
| | | <script src="../../js/base.js"></script> |
| | | <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
| | | <script>hljs.highlightAll();</script> |
| | | </head> |
| | | |
| | | <body> |
| | | <script> |
| | | if (is_top_frame) { $('body').addClass('wm-top-page'); } |
| | | </script> |
| | | <body class="wy-body-for-nav" role="document"> |
| | | |
| | | |
| | | |
| | | <div class="container-fluid wm-page-content"> |
| | | <a name="_top"></a> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <div class="row wm-article-nav-buttons" role="navigation" aria-label="navigation"> |
| | | |
| | | <div class="wm-article-nav"> |
| | | <a href="../../install-guide/installHa/" class="btn btn-xs btn-default pull-left"> |
| | | <i class="fa fa-chevron-left" aria-hidden="true"></i> |
| | | Previous</a><a href="../../install-guide/installHa/" class="btn btn-xs btn-link"> |
| | | 安装 |
| | | </a> |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | |
| | | |
| | | <h3 id="_1">使用教程</h3> |
| | | |
| | | <br> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <div class="row wm-article-nav-buttons" role="navigation" aria-label="navigation"> |
| | | |
| | | <div class="wm-article-nav"> |
| | | <a href="../../install-guide/installHa/" class="btn btn-xs btn-default pull-left"> |
| | | <i class="fa fa-chevron-left" aria-hidden="true"></i> |
| | | Previous</a><a href="../../install-guide/installHa/" class="btn btn-xs btn-link"> |
| | | 安装 |
| | | </a> |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | <br> |
| | | <div class="wy-grid-for-nav"> |
| | | <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> |
| | | <div class="wy-side-scroll"> |
| | | <div class="wy-side-nav-search"> |
| | | <a href="../.." class="icon icon-home"> DT-HA |
| | | </a><div role="search"> |
| | | <form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get"> |
| | | <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" title="Type search term here" /> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | |
| | | <footer class="container-fluid wm-page-content"> |
| | | <p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a> using <a href="https://github.com/gristlabs/mkdocs-windmill">Windmill</a> theme by Grist Labs.</p> |
| | | <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../..">首页</a> |
| | | </li> |
| | | </ul> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../about/">关于</a> |
| | | </li> |
| | | </ul> |
| | | <p class="caption"><span class="caption-text">使用教程</span></p> |
| | | <ul class="current"> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../install-guide/installHa/">安装</a> |
| | | </li> |
| | | <li class="toctree-l1 current"><a class="reference internal current" >使用</a> |
| | | <ul class="current"> |
| | | <li class="toctree-l2 current"><a class="reference internal current" href="#">使用概述</a> |
| | | <ul class="current"> |
| | | <li class="toctree-l3"><a class="reference internal" href="#_2">基础配置</a> |
| | | </li> |
| | | <li class="toctree-l3"><a class="reference internal" href="#_3">必装插件或组件</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../netconfig/netconfig/">配置网络</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../initConfig/initConfig/">系统初始化配置</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </nav> |
| | | |
| | | <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| | | <nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu"> |
| | | <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| | | <a href="../..">DT-HA</a> |
| | | |
| | | </nav> |
| | | <div class="wy-nav-content"> |
| | | <div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation"> |
| | | <ul class="wy-breadcrumbs"> |
| | | <li><a href="../.." class="icon icon-home" aria-label="Docs"></a></li> |
| | | <li class="breadcrumb-item">使用教程</li> |
| | | <li class="breadcrumb-item">使用</li> |
| | | <li class="breadcrumb-item active">使用概述</li> |
| | | <li class="wy-breadcrumbs-aside"> |
| | | </li> |
| | | </ul> |
| | | <hr/> |
| | | </div> |
| | | <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| | | <div class="section" itemprop="articleBody"> |
| | | |
| | | <h3 id="_1">使用教程<a class="headerlink" href="#_1" title="Permanent link">¶</a></h3> |
| | | <h4 id="_2">基础配置<a class="headerlink" href="#_2" title="Permanent link">¶</a></h4> |
| | | <ul> |
| | | <li><a href="../netconfig/netconfig/">配置网络</a></li> |
| | | <li><a href="../initConfig/initConfig/">初始化配置</a></li> |
| | | </ul> |
| | | <h4 id="_3">必装插件或组件<a class="headerlink" href="#_3" title="Permanent link">¶</a></h4> |
| | | <h2 id="-hacs">- <a href="../initConfig/installHacs/">HACS</a><a class="headerlink" href="#-hacs" title="Permanent link">¶</a></h2> |
| | | |
| | | </div> |
| | | </div><footer> |
| | | <div class="rst-footer-buttons" role="navigation" aria-label="Footer Navigation"> |
| | | <a href="../../install-guide/installHa/" class="btn btn-neutral float-left" title="安装"><span class="icon icon-circle-arrow-left"></span> Previous</a> |
| | | <a href="../netconfig/netconfig/" class="btn btn-neutral float-right" title="配置网络">Next <span class="icon icon-circle-arrow-right"></span></a> |
| | | </div> |
| | | |
| | | <hr/> |
| | | |
| | | <div role="contentinfo"> |
| | | <!-- Copyright etc --> |
| | | </div> |
| | | |
| | | Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| | | </footer> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | </section> |
| | | |
| | | </div> |
| | | |
| | | <div class="rst-versions" role="note" aria-label="Versions"> |
| | | <span class="rst-current-version" data-toggle="rst-current-version"> |
| | | |
| | | <span> |
| | | <a href="http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git" class="fa fa-code-fork" style="color: #fcfcfc"> Dh</a> |
| | | </span> |
| | | |
| | | |
| | | <span><a href="../../install-guide/installHa/" style="color: #fcfcfc">« Previous</a></span> |
| | | |
| | | |
| | | <span><a href="../netconfig/netconfig/" style="color: #fcfcfc">Next »</a></span> |
| | | |
| | | </span> |
| | | </div> |
| | | <script src="../../js/jquery-3.6.0.min.js"></script> |
| | | <script>var base_url = "../..";</script> |
| | | <script src="../../js/theme_extra.js"></script> |
| | | <script src="../../js/theme.js"></script> |
| | | <script src="../../search/main.js"></script> |
| | | <script> |
| | | jQuery(function () { |
| | | SphinxRtdTheme.Navigation.enable(true); |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| | | </html> |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="en"> |
| | | <html class="writer-html5" lang="en" > |
| | | <head> |
| | | |
| | | |
| | | <meta charset="utf-8"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| | | |
| | | |
| | | |
| | | <link rel="shortcut icon" href="../img/favicon.ico"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="author" content="岱特智能科技(上海)有限公司" /> |
| | | <link rel="shortcut icon" href="../img/favicon.ico" /> |
| | | <title>关于 - DT-HA</title> |
| | | <link href="../css/bootstrap-3.3.7.min.css" rel="stylesheet"> |
| | | <link href="../css/font-awesome-4.7.0.css" rel="stylesheet"> |
| | | <link href="../css/base.css" rel="stylesheet"> |
| | | <link rel="stylesheet" href="../css/highlight.css"> |
| | | <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> |
| | | <!--[if lt IE 9]> |
| | | <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> |
| | | <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> |
| | | <![endif]--> |
| | | |
| | | <script src="../js/jquery-3.2.1.min.js"></script> |
| | | <script src="../js/bootstrap-3.3.7.min.js"></script> |
| | | <script src="../js/highlight.pack.js"></script> |
| | | <link rel="stylesheet" href="../css/theme.css" /> |
| | | <link rel="stylesheet" href="../css/theme_extra.css" /> |
| | | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" /> |
| | | |
| | | <base target="_top"> |
| | | <script> |
| | | var base_url = '..'; |
| | | var is_top_frame = false; |
| | | |
| | | var pageToc = [ |
| | | {title: "\u5173\u4e8e\u6211\u4eec", url: "#_top", children: [ |
| | | {title: "\u5cb1\u7279\u667a\u80fd\u79d1\u6280\uff08\u4e0a\u6d77\uff09\u6709\u9650\u516c\u53f8", url: "#_2" }, |
| | | ]}, |
| | | ]; |
| | | |
| | | </script> |
| | | <script src="../js/base.js"></script> |
| | | <script> |
| | | // Current page data |
| | | var mkdocs_page_name = "\u5173\u4e8e"; |
| | | var mkdocs_page_input_path = "about.md"; |
| | | var mkdocs_page_url = null; |
| | | </script> |
| | | |
| | | <!--[if lt IE 9]> |
| | | <script src="../js/html5shiv.min.js"></script> |
| | | <![endif]--> |
| | | <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
| | | <script>hljs.highlightAll();</script> |
| | | </head> |
| | | |
| | | <body> |
| | | <script> |
| | | if (is_top_frame) { $('body').addClass('wm-top-page'); } |
| | | </script> |
| | | <body class="wy-body-for-nav" role="document"> |
| | | |
| | | |
| | | |
| | | <div class="container-fluid wm-page-content"> |
| | | <a name="_top"></a> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <div class="row wm-article-nav-buttons" role="navigation" aria-label="navigation"> |
| | | |
| | | <div class="wm-article-nav pull-right"> |
| | | <a href="../install-guide/installHa/" class="btn btn-xs btn-default pull-right"> |
| | | Next |
| | | <i class="fa fa-chevron-right" aria-hidden="true"></i> |
| | | </a> |
| | | <a href="../install-guide/installHa/" class="btn btn-xs btn-link"> |
| | | 安装 |
| | | </a> |
| | | </div> |
| | | |
| | | <div class="wm-article-nav"> |
| | | <a href=".." class="btn btn-xs btn-default pull-left"> |
| | | <i class="fa fa-chevron-left" aria-hidden="true"></i> |
| | | Previous</a><a href=".." class="btn btn-xs btn-link"> |
| | | 首页 |
| | | </a> |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | |
| | | |
| | | <h1 id="_1">关于我们</h1> |
| | | <h3 id="_2">岱特智能科技(上海)有限公司</h3> |
| | | <ul> |
| | | <li>单位地址 :上海市杨浦区国泰路127弄1号三层(集中登记地)</li> |
| | | <li>单位电话:021-54720326</li> |
| | | </ul> |
| | | |
| | | <br> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <div class="row wm-article-nav-buttons" role="navigation" aria-label="navigation"> |
| | | |
| | | <div class="wm-article-nav pull-right"> |
| | | <a href="../install-guide/installHa/" class="btn btn-xs btn-default pull-right"> |
| | | Next |
| | | <i class="fa fa-chevron-right" aria-hidden="true"></i> |
| | | </a> |
| | | <a href="../install-guide/installHa/" class="btn btn-xs btn-link"> |
| | | 安装 |
| | | </a> |
| | | </div> |
| | | |
| | | <div class="wm-article-nav"> |
| | | <a href=".." class="btn btn-xs btn-default pull-left"> |
| | | <i class="fa fa-chevron-left" aria-hidden="true"></i> |
| | | Previous</a><a href=".." class="btn btn-xs btn-link"> |
| | | 首页 |
| | | </a> |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | <br> |
| | | <div class="wy-grid-for-nav"> |
| | | <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> |
| | | <div class="wy-side-scroll"> |
| | | <div class="wy-side-nav-search"> |
| | | <a href=".." class="icon icon-home"> DT-HA |
| | | </a><div role="search"> |
| | | <form id ="rtd-search-form" class="wy-form" action="../search.html" method="get"> |
| | | <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" title="Type search term here" /> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | |
| | | <footer class="container-fluid wm-page-content"> |
| | | <p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a> using <a href="https://github.com/gristlabs/mkdocs-windmill">Windmill</a> theme by Grist Labs.</p> |
| | | <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="..">首页</a> |
| | | </li> |
| | | </ul> |
| | | <ul class="current"> |
| | | <li class="toctree-l1 current"><a class="reference internal current" href="#">关于</a> |
| | | <ul class="current"> |
| | | <li class="toctree-l2"><a class="reference internal" href="#_2">岱特智能科技(上海)有限公司</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="#_3">数据流动之处,效率自然发生。</a> |
| | | <ul> |
| | | <li class="toctree-l3"><a class="reference internal" href="#252000">25年医疗信息化深耕者,团队自2000年起持续探索信息化在医疗场景的深度应用</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="#_4">回归本质</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="#_5">知识反哺</a> |
| | | <ul> |
| | | <li class="toctree-l3"><a class="reference internal" href="#_6">开放生态</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="#_7">为您构建可生长的技术生态和可持续的业务</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | <p class="caption"><span class="caption-text">使用教程</span></p> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../install-guide/installHa/">安装</a> |
| | | </li> |
| | | <li class="toctree-l1"><a class="reference internal" >使用</a> |
| | | <ul> |
| | | <li class="toctree-l2"><a class="reference internal" href="../Usages/usage/">使用概述</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../Usages/netconfig/netconfig/">配置网络</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../Usages/initConfig/initConfig/">系统初始化配置</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </nav> |
| | | |
| | | <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| | | <nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu"> |
| | | <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| | | <a href="..">DT-HA</a> |
| | | |
| | | </nav> |
| | | <div class="wy-nav-content"> |
| | | <div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation"> |
| | | <ul class="wy-breadcrumbs"> |
| | | <li><a href=".." class="icon icon-home" aria-label="Docs"></a></li> |
| | | <li class="breadcrumb-item active">关于</li> |
| | | <li class="wy-breadcrumbs-aside"> |
| | | </li> |
| | | </ul> |
| | | <hr/> |
| | | </div> |
| | | <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| | | <div class="section" itemprop="articleBody"> |
| | | |
| | | <h1 id="_1">关于我们<a class="headerlink" href="#_1" title="Permanent link">¶</a></h1> |
| | | <h3 id="_2">岱特智能科技(上海)有限公司<a class="headerlink" href="#_2" title="Permanent link">¶</a></h3> |
| | | <h3 id="_3">数据流动之处,效率自然发生。<a class="headerlink" href="#_3" title="Permanent link">¶</a></h3> |
| | | <p>DATA代表感知、连接与智能。在繁杂的医疗数据中,一场数字化革命正在发生,我们守护的不止是数据,更是患者的每一分钟。岱特智能–让每一台设备成为智慧医疗的神经元。</p> |
| | | <h5 id="252000">25年医疗信息化深耕者,团队自2000年起持续探索信息化在医疗场景的深度应用<a class="headerlink" href="#252000" title="Permanent link">¶</a></h5> |
| | | <ul> |
| | | <li> |
| | | <p>最佳实践:服务全球超过600+医疗机构,续约率超97%</p> |
| | | </li> |
| | | <li> |
| | | <p>全球服务:独立的英/日/马来语版本,适配当地临床路径</p> |
| | | </li> |
| | | <li> |
| | | <p>构建标准:主导制定多项标准,「血液透析软件技术要求」</p> |
| | | </li> |
| | | <li> |
| | | <p>数据主权:即使终止合作,仍然保证用户不受限制的访问</p> |
| | | </li> |
| | | </ul> |
| | | <h3 id="_4">回归本质<a class="headerlink" href="#_4" title="Permanent link">¶</a></h3> |
| | | <p>不是用技术替代人,而是让而是让人从重复劳动中解放,回归医疗服务的本质。</p> |
| | | <h3 id="_5">知识反哺<a class="headerlink" href="#_5" title="Permanent link">¶</a></h3> |
| | | <p>基层医院案例自动沉淀为三甲优化策略,识别科室工作流差异,生成定制方案。</p> |
| | | <h5 id="_6">开放生态<a class="headerlink" href="#_6" title="Permanent link">¶</a></h5> |
| | | <p>开放API,集成100+第三方解决方案,共建医疗数据交互标准。</p> |
| | | <h2 id="_7">为您构建可生长的技术生态和可持续的业务<a class="headerlink" href="#_7" title="Permanent link">¶</a></h2> |
| | | <p>像搭积木般自由扩展,破除”数字化=高投入,从基础物联到AI决策,分阶段建设避免一次性过载投入。不是推翻重建系统,而是让现有资产持续产生指数级价值——这才是医疗数字化的终极使命。</p> |
| | | |
| | | </div> |
| | | </div><footer> |
| | | <div class="rst-footer-buttons" role="navigation" aria-label="Footer Navigation"> |
| | | <a href=".." class="btn btn-neutral float-left" title="首页"><span class="icon icon-circle-arrow-left"></span> Previous</a> |
| | | <a href="../install-guide/installHa/" class="btn btn-neutral float-right" title="安装">Next <span class="icon icon-circle-arrow-right"></span></a> |
| | | </div> |
| | | |
| | | <hr/> |
| | | |
| | | <div role="contentinfo"> |
| | | <!-- Copyright etc --> |
| | | </div> |
| | | |
| | | Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| | | </footer> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | </section> |
| | | |
| | | </div> |
| | | |
| | | <div class="rst-versions" role="note" aria-label="Versions"> |
| | | <span class="rst-current-version" data-toggle="rst-current-version"> |
| | | |
| | | <span> |
| | | <a href="http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git" class="fa fa-code-fork" style="color: #fcfcfc"> Dh</a> |
| | | </span> |
| | | |
| | | |
| | | <span><a href=".." style="color: #fcfcfc">« Previous</a></span> |
| | | |
| | | |
| | | <span><a href="../install-guide/installHa/" style="color: #fcfcfc">Next »</a></span> |
| | | |
| | | </span> |
| | | </div> |
| | | <script src="../js/jquery-3.6.0.min.js"></script> |
| | | <script>var base_url = "..";</script> |
| | | <script src="../js/theme_extra.js"></script> |
| | | <script src="../js/theme.js"></script> |
| | | <script src="../search/main.js"></script> |
| | | <script> |
| | | jQuery(function () { |
| | | SphinxRtdTheme.Navigation.enable(true); |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| | | </html> |
| New file |
| | |
| | | /* |
| | | * This file is copied from the upstream ReadTheDocs Sphinx |
| | | * theme. To aid upgradability this file should *not* be edited. |
| | | * modifications we need should be included in theme_extra.css. |
| | | * |
| | | * https://github.com/readthedocs/sphinx_rtd_theme |
| | | */ |
| | | |
| | | /* sphinx_rtd_theme version 1.2.0 | MIT license */ |
| | | html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! |
| | | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome |
| | | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) |
| | | */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} |
| New file |
| | |
| | | /* |
| | | * Wrap inline code samples otherwise they shoot of the side and |
| | | * can't be read at all. |
| | | * |
| | | * https://github.com/mkdocs/mkdocs/issues/313 |
| | | * https://github.com/mkdocs/mkdocs/issues/233 |
| | | * https://github.com/mkdocs/mkdocs/issues/834 |
| | | */ |
| | | .rst-content code { |
| | | white-space: pre-wrap; |
| | | word-wrap: break-word; |
| | | padding: 2px 5px; |
| | | } |
| | | |
| | | /** |
| | | * Make code blocks display as blocks and give them the appropriate |
| | | * font size and padding. |
| | | * |
| | | * https://github.com/mkdocs/mkdocs/issues/855 |
| | | * https://github.com/mkdocs/mkdocs/issues/834 |
| | | * https://github.com/mkdocs/mkdocs/issues/233 |
| | | */ |
| | | .rst-content pre code { |
| | | white-space: pre; |
| | | word-wrap: normal; |
| | | display: block; |
| | | padding: 12px; |
| | | font-size: 12px; |
| | | } |
| | | |
| | | /** |
| | | * Fix code colors |
| | | * |
| | | * https://github.com/mkdocs/mkdocs/issues/2027 |
| | | */ |
| | | .rst-content code { |
| | | color: #E74C3C; |
| | | } |
| | | |
| | | .rst-content pre code { |
| | | color: #000; |
| | | background: #f8f8f8; |
| | | } |
| | | |
| | | /* |
| | | * Fix link colors when the link text is inline code. |
| | | * |
| | | * https://github.com/mkdocs/mkdocs/issues/718 |
| | | */ |
| | | a code { |
| | | color: #2980B9; |
| | | } |
| | | a:hover code { |
| | | color: #3091d1; |
| | | } |
| | | a:visited code { |
| | | color: #9B59B6; |
| | | } |
| | | |
| | | /* |
| | | * The CSS classes from highlight.js seem to clash with the |
| | | * ReadTheDocs theme causing some code to be incorrectly made |
| | | * bold and italic. |
| | | * |
| | | * https://github.com/mkdocs/mkdocs/issues/411 |
| | | */ |
| | | pre .cs, pre .c { |
| | | font-weight: inherit; |
| | | font-style: inherit; |
| | | } |
| | | |
| | | /* |
| | | * Fix some issues with the theme and non-highlighted code |
| | | * samples. Without and highlighting styles attached the |
| | | * formatting is broken. |
| | | * |
| | | * https://github.com/mkdocs/mkdocs/issues/319 |
| | | */ |
| | | .rst-content .no-highlight { |
| | | display: block; |
| | | padding: 0.5em; |
| | | color: #333; |
| | | } |
| | | |
| | | |
| | | /* |
| | | * Additions specific to the search functionality provided by MkDocs |
| | | */ |
| | | |
| | | .search-results { |
| | | margin-top: 23px; |
| | | } |
| | | |
| | | .search-results article { |
| | | border-top: 1px solid #E1E4E5; |
| | | padding-top: 24px; |
| | | } |
| | | |
| | | .search-results article:first-child { |
| | | border-top: none; |
| | | } |
| | | |
| | | form .search-query { |
| | | width: 100%; |
| | | border-radius: 50px; |
| | | padding: 6px 12px; |
| | | border-color: #D1D4D5; |
| | | } |
| | | |
| | | /* |
| | | * Improve inline code blocks within admonitions. |
| | | * |
| | | * https://github.com/mkdocs/mkdocs/issues/656 |
| | | */ |
| | | .rst-content .admonition code { |
| | | color: #404040; |
| | | border: 1px solid #c7c9cb; |
| | | border: 1px solid rgba(0, 0, 0, 0.2); |
| | | background: #f8fbfd; |
| | | background: rgba(255, 255, 255, 0.7); |
| | | } |
| | | |
| | | /* |
| | | * Account for wide tables which go off the side. |
| | | * Override borders to avoid weirdness on narrow tables. |
| | | * |
| | | * https://github.com/mkdocs/mkdocs/issues/834 |
| | | * https://github.com/mkdocs/mkdocs/pull/1034 |
| | | */ |
| | | .rst-content .section .docutils { |
| | | width: 100%; |
| | | overflow: auto; |
| | | display: block; |
| | | border: none; |
| | | } |
| | | |
| | | td, th { |
| | | border: 1px solid #e1e4e5 !important; |
| | | border-collapse: collapse; |
| | | } |
| | | |
| | | /* |
| | | * Without the following amendments, the navigation in the theme will be |
| | | * slightly cut off. This is due to the fact that the .wy-nav-side has a |
| | | * padding-bottom of 2em, which must not necessarily align with the font-size of |
| | | * 90 % on the .rst-current-version container, combined with the padding of 12px |
| | | * above and below. These amendments fix this in two steps: First, make sure the |
| | | * .rst-current-version container has a fixed height of 40px, achieved using |
| | | * line-height, and then applying a padding-bottom of 40px to this container. In |
| | | * a second step, the items within that container are re-aligned using flexbox. |
| | | * |
| | | * https://github.com/mkdocs/mkdocs/issues/2012 |
| | | */ |
| | | .wy-nav-side { |
| | | padding-bottom: 40px; |
| | | } |
| | | |
| | | /* For section-index only */ |
| | | .wy-menu-vertical .current-section p { |
| | | background-color: #e3e3e3; |
| | | color: #404040; |
| | | } |
| | | |
| | | /* |
| | | * The second step of above amendment: Here we make sure the items are aligned |
| | | * correctly within the .rst-current-version container. Using flexbox, we |
| | | * achieve it in such a way that it will look like the following: |
| | | * |
| | | * [No repo_name] |
| | | * Next >> // On the first page |
| | | * << Previous Next >> // On all subsequent pages |
| | | * |
| | | * [With repo_name] |
| | | * <repo_name> Next >> // On the first page |
| | | * <repo_name> << Previous Next >> // On all subsequent pages |
| | | * |
| | | * https://github.com/mkdocs/mkdocs/issues/2012 |
| | | */ |
| | | .rst-versions .rst-current-version { |
| | | padding: 0 12px; |
| | | display: flex; |
| | | font-size: initial; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | line-height: 40px; |
| | | } |
| | | |
| | | /* |
| | | * Please note that this amendment also involves removing certain inline-styles |
| | | * from the file ./mkdocs/themes/readthedocs/versions.html. |
| | | * |
| | | * https://github.com/mkdocs/mkdocs/issues/2012 |
| | | */ |
| | | .rst-current-version span { |
| | | flex: 1; |
| | | text-align: center; |
| | | } |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="en"> |
| | | <html class="writer-html5" lang="en" > |
| | | <head> |
| | | |
| | | |
| | | <meta charset="utf-8"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| | | <meta name="description" content="None"> |
| | | |
| | | |
| | | <link rel="shortcut icon" href="./img/favicon.ico"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="description" content="None" /><meta name="author" content="岱特智能科技(上海)有限公司" /> |
| | | <link rel="shortcut icon" href="img/favicon.ico" /> |
| | | <title>DT-HA</title> |
| | | <link href="./css/bootstrap-3.3.7.min.css" rel="stylesheet"> |
| | | <link href="./css/font-awesome-4.7.0.css" rel="stylesheet"> |
| | | <link href="./css/base.css" rel="stylesheet"> |
| | | <link rel="stylesheet" href="./css/highlight.css"> |
| | | <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> |
| | | <link rel="stylesheet" href="css/theme.css" /> |
| | | <link rel="stylesheet" href="css/theme_extra.css" /> |
| | | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" /> |
| | | |
| | | <script> |
| | | // Current page data |
| | | var mkdocs_page_name = "\u9996\u9875"; |
| | | var mkdocs_page_input_path = "index.md"; |
| | | var mkdocs_page_url = null; |
| | | </script> |
| | | |
| | | <!--[if lt IE 9]> |
| | | <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> |
| | | <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> |
| | | <script src="js/html5shiv.min.js"></script> |
| | | <![endif]--> |
| | | |
| | | <script src="./js/jquery-3.2.1.min.js"></script> |
| | | <script src="./js/bootstrap-3.3.7.min.js"></script> |
| | | <script src="./js/highlight.pack.js"></script> |
| | | |
| | | <script src="./js/elasticlunr.min.js"></script> |
| | | |
| | | <base target="_top"> |
| | | <script> |
| | | var base_url = '.'; |
| | | var is_top_frame = (window === window.parent); |
| | | |
| | | var pageToc = [ |
| | | {title: "HomeAssistant\u672c\u5730\u90e8\u7f72\u53ca\u88c5\u8c03\u8bd5\u8bf4\u660e", url: "#_top", children: [ |
| | | ]}, |
| | | ]; |
| | | |
| | | </script> |
| | | <script src="./js/base.js"></script> |
| | | <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
| | | <script>hljs.highlightAll();</script> |
| | | </head> |
| | | |
| | | <body> |
| | | <script> |
| | | if (is_top_frame) { $('body').addClass('wm-top-page'); } |
| | | </script> |
| | | <body class="wy-body-for-nav" role="document"> |
| | | |
| | | <nav class="navbar wm-page-top-frame"> |
| | | <div class="container-fluid wm-top-container"> |
| | | |
| | | <div class="wm-top-tool pull-right wm-vcenter"> |
| | | <form class="dropdown wm-vcentered" id="wm-search-form" action="./search.html"> |
| | | |
| | | <button id="wm-search-show" class="btn btn-sm btn-default" type="submit" |
| | | ><i class="fa fa-search" aria-hidden="true"></i></button> |
| | | |
| | | <div class="input-group input-group-sm wm-top-search"> |
| | | <input type="text" name="q" class="form-control" id="mkdocs-search-query" placeholder="Search" autocomplete="off"> |
| | | <span class="input-group-btn" role="search"> |
| | | |
| | | <button class="btn btn-default dropdown-toggle collapse" data-toggle="dropdown" type="button"><span class="caret"></span></button> |
| | | <ul id="mkdocs-search-results" class="dropdown-menu dropdown-menu-right"></ul> |
| | | <button id="wm-search-go" class="btn btn-default" type="submit"><i class="fa fa-search" aria-hidden="true"></i></button> |
| | | </span> |
| | | </div> |
| | | </form> |
| | | </div> |
| | | |
| | | |
| | | <div class="wm-top-tool wm-vcenter pull-right wm-small-left"> |
| | | <button id="wm-toc-button" type="button" class="btn btn-sm btn-default wm-vcentered"><i class="fa fa-th-list" aria-hidden="true"></i></button> |
| | | </div> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <a href="" class="wm-top-brand wm-top-link wm-vcenter"> |
| | | |
| | | <div class="wm-top-title"> |
| | | DT-HA<br> |
| | | |
| | | <div class="wy-grid-for-nav"> |
| | | <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> |
| | | <div class="wy-side-scroll"> |
| | | <div class="wy-side-nav-search"> |
| | | <a href="." class="icon icon-home"> DT-HA |
| | | </a><div role="search"> |
| | | <form id ="rtd-search-form" class="wy-form" action="./search.html" method="get"> |
| | | <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" title="Type search term here" /> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | </a> |
| | | </div> |
| | | </nav> |
| | | |
| | | <div id="main-content" class="wm-page-top-frame"> |
| | | |
| | | <nav class="wm-toc-pane"> |
| | | |
| | | <ul class="wm-toctree"> |
| | | <li class="wm-toc-li wm-toc-lev1 "><a href="" class="wm-article-link wm-toc-text">首页</a> |
| | | </li> |
| | | <li class="wm-toc-li wm-toc-lev1 "><a href="about/" class="wm-article-link wm-toc-text">关于</a> |
| | | </li> |
| | | <li class="wm-toc-li wm-toc-lev1 wm-toc-opener"><span class="wm-toc-text">使用教程</span> |
| | | </li> |
| | | <li class="wm-toc-li-nested collapse"> |
| | | <ul class="wm-toctree"> |
| | | <li class="wm-toc-li wm-toc-lev2 "><a href="install-guide/installHa/" class="wm-article-link wm-toc-text">安装</a> |
| | | </li> |
| | | <li class="wm-toc-li wm-toc-lev2 "><a href="Usages/usage/" class="wm-article-link wm-toc-text">使用</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | |
| | | </ul> |
| | | </nav> |
| | | |
| | | <div class="wm-content-pane"> |
| | | <iframe class="wm-article" name="article"></iframe> |
| | | <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
| | | <ul class="current"> |
| | | <li class="toctree-l1 current"><a class="reference internal current" href="#">首页</a> |
| | | <ul class="current"> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="about/">关于</a> |
| | | </li> |
| | | </ul> |
| | | <p class="caption"><span class="caption-text">使用教程</span></p> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="install-guide/installHa/">安装</a> |
| | | </li> |
| | | <li class="toctree-l1"><a class="reference internal" >使用</a> |
| | | <ul> |
| | | <li class="toctree-l2"><a class="reference internal" href="Usages/usage/">使用概述</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="Usages/netconfig/netconfig/">配置网络</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="Usages/initConfig/initConfig/">系统初始化配置</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </nav> |
| | | |
| | | <div class="container-fluid wm-page-content"> |
| | | <a name="_top"></a> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <div class="row wm-article-nav-buttons" role="navigation" aria-label="navigation"> |
| | | |
| | | <div class="wm-article-nav pull-right"> |
| | | <a href="about/" class="btn btn-xs btn-default pull-right"> |
| | | Next |
| | | <i class="fa fa-chevron-right" aria-hidden="true"></i> |
| | | </a> |
| | | <a href="about/" class="btn btn-xs btn-link"> |
| | | 关于 |
| | | </a> |
| | | </div> |
| | | |
| | | </div> |
| | | |
| | | |
| | | |
| | | <h1 id="homeassistant">HomeAssistant本地部署及装调试说明</h1> |
| | | <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| | | <nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu"> |
| | | <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| | | <a href=".">DT-HA</a> |
| | | |
| | | </nav> |
| | | <div class="wy-nav-content"> |
| | | <div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation"> |
| | | <ul class="wy-breadcrumbs"> |
| | | <li><a href="." class="icon icon-home" aria-label="Docs"></a></li> |
| | | <li class="breadcrumb-item active">首页</li> |
| | | <li class="wy-breadcrumbs-aside"> |
| | | </li> |
| | | </ul> |
| | | <hr/> |
| | | </div> |
| | | <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| | | <div class="section" itemprop="articleBody"> |
| | | |
| | | <h1 id="homeassistant">HomeAssistant本地部署及装调试说明<a class="headerlink" href="#homeassistant" title="Permanent link">¶</a></h1> |
| | | <ul> |
| | | <li><a href="README.md">简要说明</a></li> |
| | | <li><a href="install-guide/installHa/">安装HomeAssistant</a></li> |
| | | <li><a href="install-guide/LinuxInstall/">linux 下安装</a></li> |
| | | </ul> |
| | | |
| | | <br> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <div class="row wm-article-nav-buttons" role="navigation" aria-label="navigation"> |
| | | |
| | | <div class="wm-article-nav pull-right"> |
| | | <a href="about/" class="btn btn-xs btn-default pull-right"> |
| | | Next |
| | | <i class="fa fa-chevron-right" aria-hidden="true"></i> |
| | | </a> |
| | | <a href="about/" class="btn btn-xs btn-link"> |
| | | 关于 |
| | | </a> |
| | | |
| | | </div> |
| | | </div><footer> |
| | | <div class="rst-footer-buttons" role="navigation" aria-label="Footer Navigation"> |
| | | <a href="about/" class="btn btn-neutral float-right" title="关于">Next <span class="icon icon-circle-arrow-right"></span></a> |
| | | </div> |
| | | |
| | | |
| | | <hr/> |
| | | |
| | | <div role="contentinfo"> |
| | | <!-- Copyright etc --> |
| | | </div> |
| | | |
| | | <br> |
| | | </div> |
| | | |
| | | <footer class="container-fluid wm-page-content"> |
| | | <p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a> using <a href="https://github.com/gristlabs/mkdocs-windmill">Windmill</a> theme by Grist Labs.</p> |
| | | Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| | | </footer> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | </section> |
| | | |
| | | </div> |
| | | |
| | | <div class="rst-versions" role="note" aria-label="Versions"> |
| | | <span class="rst-current-version" data-toggle="rst-current-version"> |
| | | |
| | | <span> |
| | | <a href="http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git" class="fa fa-code-fork" style="color: #fcfcfc"> Dh</a> |
| | | </span> |
| | | |
| | | |
| | | |
| | | <span><a href="about/" style="color: #fcfcfc">Next »</a></span> |
| | | |
| | | </span> |
| | | </div> |
| | | <script src="js/jquery-3.6.0.min.js"></script> |
| | | <script>var base_url = ".";</script> |
| | | <script src="js/theme_extra.js"></script> |
| | | <script src="js/theme.js"></script> |
| | | <script src="search/main.js"></script> |
| | | <script> |
| | | jQuery(function () { |
| | | SphinxRtdTheme.Navigation.enable(true); |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| | | |
| | | <!-- |
| | | MkDocs version : 1.6.1 |
| | | Build Date UTC : 2025-04-14 23:09:25.483883+00:00 |
| | | --> |
| | | Build Date UTC : 2025-04-17 09:26:03.818002+00:00 |
| | | --> |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="en"> |
| | | <html class="writer-html5" lang="en" > |
| | | <head> |
| | | |
| | | |
| | | <meta charset="utf-8"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| | | |
| | | |
| | | |
| | | <link rel="shortcut icon" href="../../img/favicon.ico"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="author" content="岱特智能科技(上海)有限公司" /> |
| | | <link rel="shortcut icon" href="../../img/favicon.ico" /> |
| | | <title>基于linux操作系统写入镜像 - DT-HA</title> |
| | | <link href="../../css/bootstrap-3.3.7.min.css" rel="stylesheet"> |
| | | <link href="../../css/font-awesome-4.7.0.css" rel="stylesheet"> |
| | | <link href="../../css/base.css" rel="stylesheet"> |
| | | <link rel="stylesheet" href="../../css/highlight.css"> |
| | | <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> |
| | | <!--[if lt IE 9]> |
| | | <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> |
| | | <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> |
| | | <![endif]--> |
| | | |
| | | <script src="../../js/jquery-3.2.1.min.js"></script> |
| | | <script src="../../js/bootstrap-3.3.7.min.js"></script> |
| | | <script src="../../js/highlight.pack.js"></script> |
| | | <link rel="stylesheet" href="../../css/theme.css" /> |
| | | <link rel="stylesheet" href="../../css/theme_extra.css" /> |
| | | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" /> |
| | | |
| | | <base target="_top"> |
| | | <script> |
| | | var base_url = '../..'; |
| | | var is_top_frame = false; |
| | | |
| | | var pageToc = [ |
| | | {title: "\u57fa\u4e8elinux\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf", url: "#_top", children: [ |
| | | ]}, |
| | | ]; |
| | | |
| | | </script> |
| | | <script src="../../js/base.js"></script> |
| | | <script> |
| | | // Current page data |
| | | var mkdocs_page_name = "\u57fa\u4e8elinux\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf"; |
| | | var mkdocs_page_input_path = "install-guide\\LinuxInstall.md"; |
| | | var mkdocs_page_url = null; |
| | | </script> |
| | | |
| | | <!--[if lt IE 9]> |
| | | <script src="../../js/html5shiv.min.js"></script> |
| | | <![endif]--> |
| | | <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
| | | <script>hljs.highlightAll();</script> |
| | | </head> |
| | | |
| | | <body> |
| | | <script> |
| | | if (is_top_frame) { $('body').addClass('wm-top-page'); } |
| | | </script> |
| | | <body class="wy-body-for-nav" role="document"> |
| | | |
| | | <div class="wy-grid-for-nav"> |
| | | <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> |
| | | <div class="wy-side-scroll"> |
| | | <div class="wy-side-nav-search"> |
| | | <a href="../.." class="icon icon-home"> DT-HA |
| | | </a><div role="search"> |
| | | <form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get"> |
| | | <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" title="Type search term here" /> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../..">首页</a> |
| | | </li> |
| | | </ul> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../about/">关于</a> |
| | | </li> |
| | | </ul> |
| | | <p class="caption"><span class="caption-text">使用教程</span></p> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../installHa/">安装</a> |
| | | </li> |
| | | <li class="toctree-l1"><a class="reference internal" >使用</a> |
| | | <ul> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../Usages/usage/">使用概述</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../Usages/netconfig/netconfig/">配置网络</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../Usages/initConfig/initConfig/">系统初始化配置</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </nav> |
| | | |
| | | <div class="container-fluid wm-page-content"> |
| | | <a name="_top"></a> |
| | | |
| | | |
| | | |
| | | |
| | | <h1 id="linux">基于linux操作系统写入镜像</h1> |
| | | <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| | | <nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu"> |
| | | <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| | | <a href="../..">DT-HA</a> |
| | | |
| | | </nav> |
| | | <div class="wy-nav-content"> |
| | | <div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation"> |
| | | <ul class="wy-breadcrumbs"> |
| | | <li><a href="../.." class="icon icon-home" aria-label="Docs"></a></li> |
| | | <li class="breadcrumb-item active">基于linux操作系统写入镜像</li> |
| | | <li class="wy-breadcrumbs-aside"> |
| | | </li> |
| | | </ul> |
| | | <hr/> |
| | | </div> |
| | | <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| | | <div class="section" itemprop="articleBody"> |
| | | |
| | | <h1 id="linux">基于linux操作系统写入镜像<a class="headerlink" href="#linux" title="Permanent link">¶</a></h1> |
| | | <p>这种方法的操作方法是:</p> |
| | | <ol> |
| | | <li> |
| | | <p>先下载安装ubuntu24.04操作系统</p> |
| | | <p>先下载<a href="[Ubuntu 24.04 LTS | Ubuntu](https://ubuntu.com/blog/tag/ubuntu-24-04-lts)">ubuntu24.04操作系统桌面版 </a>,保存为ubuntu24.04-desktip-amd.iso。</p> |
| | | </li> |
| | | <li> |
| | | <p>在虚拟机或物理机中安装此ubuntu24.04操作系统.(临时使用)</p> |
| | | <p>在虚拟机或物理机中安装此ubuntu24.04操作系统.(临时使用)。 |
| | | 这个过程 ,请参考其它教程。</p> |
| | | </li> |
| | | <li> |
| | | <p>使用ubuntu24.04制作linux启动U盘ubuntu live</p> |
| | | <p>使用ubuntu24.04制作linux启动U盘ubuntu live。 |
| | | 安装完成后,把下载的ubuntu24.04-desktip-amd.iso放到新安装的Ubuntu操作系统下折任意目录,如,放到<img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415115326293.png" />这个目录. |
| | | 然后,找到ubuntu自带的启动盘制作工具,如图所示 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415115524417.png" /> |
| | | c运行启动盘创建器,如下<img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415115636897.png" />先择刚刚放置的ubuntu24.04-desktip-amd.iso作为源镜像,然后把要制作启动盘的U盘插入USB口,然后,选 择作为要使用的磁盘,当然可以提前插入U盘。然后点击制作启动盘。<img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415120121457.png" />在弹出的确认框中,点击是,<img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415120228840.png" />然后输出当前的用户对应的密码,确认,<img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415120334270.png" />系统将会自动开启把ubuntu live 启动引导盘信息, 写入U盘,<img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415120433378.png" />提示完成时,点退出,弹出如下提示<img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415120549530.png" />,说明启动U盘制作成功了。</p> |
| | | </li> |
| | | <li> |
| | | <p>使用启动U盘ubuntu live引导x86小工控机.</p> |
| | | <p>使用启动U盘ubuntu live引导x86小工控机. |
| | | 把U盘插入入X86小工控机并确保<a href="../configX86Bios/">正确配置了Bios</a> |
| | | 启动后,按F11其它主机可能有所不同(可以查主板说明书,或咨询主板厂家),选择以U盘引导。 |
| | | 公司的小工控机,是启动时,按F11不放,进入系统引导菜单,根据U盘的不同,U盘引导盘中的系统类别不同,显示的内容略有不同,如下图所示 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415164226590.png" /> |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415164846478.png" /></p> |
| | | </li> |
| | | <li> |
| | | <p>进入try模式(不安装).</p> |
| | | </li> |
| | | <li> |
| | | <p>在try模式中,下载ha安方镜像</p> |
| | | </li> |
| | | <li> |
| | | <p>使用ubuntu live的自带的磁盘恢复工具写入镜像到硬盘.</p> |
| | | </li> |
| | | <li> |
| | | <p>移除U盘</p> |
| | | </li> |
| | | <li> |
| | | <p>重启系统</p> |
| | | </li> |
| | | <li> |
| | | <p>进入HA cli界面</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250413122126133.png" /></p> |
| | | </li> |
| | | <li></li> |
| | | </ol> |
| | | <p>当系统启动时,请确保选择“Try or Install Ubuntu". |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415165056020.png" /> |
| | | 系统启会启动U盘中的Ubuntu live系统, |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415165157990.png" /> |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415165224449.png" /> |
| | | 在这个过程中, |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415165300118.png" /> |
| | | 会有几个选项要选择如下图所示, |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415165443100.png" /> |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415165615127.png" /> |
| | | 选择语言 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415165928941.png" /> |
| | | 此处直接下一步 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415170033803.png" /> |
| | | 此处可以直接使用网络连接可以选直接连接,也可以选择wifi当然,wifi南要配置热点. |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415170144416.png" /> <br /> |
| | | 同时,在这个过程中,要保持网络畅通(<strong>*一定要能正常访问Google及HomeAssistant官网</strong>),能正常的访问并下载HomeAssistantOS的镜像.</p> |
| | | <ol> |
| | | <li> |
| | | <p>在try模式中,下载ha安方镜像 |
| | | 进入Ubuntu Live系统后,打开浏览器,访问HomeAssistant的<a href="[Generic x86-64 - Home Assistant](https://www.home-assistant.io/installation/generic-x86-64)">官方文档</a>, |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415172730291.png" /> |
| | | 进入HomeAssistant官网,点\击菜单Installstatiion,进入安装说明 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415172923864.png" /> |
| | | 找到GenericX86-84,并打开这个在页面 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415173208549.png" /> |
| | | 找到页面中的镜像下载地址如下图 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415173417557.png" /> |
| | | 下载<a href="https://github.com/home-assistant/operating-system/releases/download/15.1/haos_generic-x86-64-15.1.img.xz">HomeAssistOs-x86-64镜像</a> |
| | | 开始下载后,如下图所示 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415173521070.png" /> |
| | | 下载过程中如下图所示 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415173554499.png" /> |
| | | 下载完成后 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415173648350.png" /> |
| | | 文件保存在/home/Downloads/hos_Generic-86-64-15.1.img.xz</p> |
| | | </li> |
| | | <li> |
| | | <p>使用ubuntu live的自带的磁盘恢复工具写入镜像到硬盘. |
| | | 在Ubuntu Live的系统中,找到显示应用程序(一般在左上角或右下角),</p> |
| | | </li> |
| | | <li> |
| | | <p>搜索并找到Disks应用程序,并打开Disks应用程序.</p> |
| | | </li> |
| | | </ol> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415173844012.png" /></p> |
| | | <ul> |
| | | <li>在左侧列表中找到并选择你的目标磁盘(一般为你要安装HAOS的硬盘)</li> |
| | | </ul> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415173928538.png" /></p> |
| | | <ul> |
| | | <li>点击右上角的菜单图标(三个点),选择“恢复磁盘镜像”</li> |
| | | </ul> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415174008445.png" /></p> |
| | | <ul> |
| | | <li>浏览并选择你下载的HAOS镜像文件。</li> |
| | | </ul> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415174039892.png" /> |
| | | 点击,并浏览到下载的文件 hos_Generic-86-64-15.1.img.xz |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415174131066.png" /></p> |
| | | <ul> |
| | | <li> |
| | | <p>确认目标磁盘,并开始镜像恢复过程。 |
| | | 确认标硬盘正确后,继续 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415174303609.png" /> |
| | | 提示确认时点击 Restore |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415174329079.png" /> |
| | | 提示授权时,点击 Authenticate |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415174427654.png" /> |
| | | 确定后,就会开始把镜像文件写入硬盘 |
| | | 请注意,这个过程一将会,清除硬盘上原有的数据,请确保已备份重要数据. |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415174644799.png" /> |
| | | 写入完成后,如下图所示 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415174732112.png" /> |
| | | 此时,就已经成功的把HA镜像写入到硬和肋中了</p> |
| | | </li> |
| | | <li> |
| | | <p>移除U盘 |
| | | 一旦Home Assistant操作系统安装完成,关闭系统。 |
| | | 当Ubuntu关闭后,移除USB闪存驱动器(Ubuntu会通知您可以安全移除)。</p> |
| | | </li> |
| | | <li> |
| | | <p>重启系统. |
| | | 现在,您的Home Assistant服务器已经设置完毕,您可以开始使用它。</p> |
| | | </li> |
| | | <li> |
| | | <p>进入HA cli界面 |
| | | 系统启动成功后,如下图所示 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415175051168.png" /> |
| | | 通过浏览器,输入控制台提示的IP加端口<a href="http://192.168.3:8123">http://192.168.3:8123</a>即可进入图型化界面,如下 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250413122126133.png" /></p> |
| | | </li> |
| | | </ul> |
| | | |
| | | </div> |
| | | </div><footer> |
| | | |
| | | <br> |
| | | |
| | | <hr/> |
| | | |
| | | <br> |
| | | </div> |
| | | <div role="contentinfo"> |
| | | <!-- Copyright etc --> |
| | | </div> |
| | | |
| | | <footer class="container-fluid wm-page-content"> |
| | | <p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a> using <a href="https://github.com/gristlabs/mkdocs-windmill">Windmill</a> theme by Grist Labs.</p> |
| | | Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| | | </footer> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | </section> |
| | | |
| | | </div> |
| | | |
| | | <div class="rst-versions" role="note" aria-label="Versions"> |
| | | <span class="rst-current-version" data-toggle="rst-current-version"> |
| | | |
| | | <span> |
| | | <a href="http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git" class="fa fa-code-fork" style="color: #fcfcfc"> Dh</a> |
| | | </span> |
| | | |
| | | |
| | | |
| | | </span> |
| | | </div> |
| | | <script src="../../js/jquery-3.6.0.min.js"></script> |
| | | <script>var base_url = "../..";</script> |
| | | <script src="../../js/theme_extra.js"></script> |
| | | <script src="../../js/theme.js"></script> |
| | | <script src="../../search/main.js"></script> |
| | | <script> |
| | | jQuery(function () { |
| | | SphinxRtdTheme.Navigation.enable(true); |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| | | </html> |
| New file |
| | |
| | | <!DOCTYPE html> |
| | | <html class="writer-html5" lang="en" > |
| | | <head> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="author" content="岱特智能科技(上海)有限公司" /> |
| | | <link rel="shortcut icon" href="../../img/favicon.ico" /> |
| | | <title>Windows PE 下写入 HA 镜像 - DT-HA</title> |
| | | <link rel="stylesheet" href="../../css/theme.css" /> |
| | | <link rel="stylesheet" href="../../css/theme_extra.css" /> |
| | | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" /> |
| | | |
| | | <script> |
| | | // Current page data |
| | | var mkdocs_page_name = "Windows PE \u4e0b\u5199\u5165 HA \u955c\u50cf"; |
| | | var mkdocs_page_input_path = "install-guide\\WinPeInstall.md"; |
| | | var mkdocs_page_url = null; |
| | | </script> |
| | | |
| | | <!--[if lt IE 9]> |
| | | <script src="../../js/html5shiv.min.js"></script> |
| | | <![endif]--> |
| | | <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
| | | <script>hljs.highlightAll();</script> |
| | | </head> |
| | | |
| | | <body class="wy-body-for-nav" role="document"> |
| | | |
| | | <div class="wy-grid-for-nav"> |
| | | <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> |
| | | <div class="wy-side-scroll"> |
| | | <div class="wy-side-nav-search"> |
| | | <a href="../.." class="icon icon-home"> DT-HA |
| | | </a><div role="search"> |
| | | <form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get"> |
| | | <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" title="Type search term here" /> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../..">首页</a> |
| | | </li> |
| | | </ul> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../about/">关于</a> |
| | | </li> |
| | | </ul> |
| | | <p class="caption"><span class="caption-text">使用教程</span></p> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../installHa/">安装</a> |
| | | </li> |
| | | <li class="toctree-l1"><a class="reference internal" >使用</a> |
| | | <ul> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../Usages/usage/">使用概述</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../Usages/netconfig/netconfig/">配置网络</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../Usages/initConfig/initConfig/">系统初始化配置</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </nav> |
| | | |
| | | <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| | | <nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu"> |
| | | <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| | | <a href="../..">DT-HA</a> |
| | | |
| | | </nav> |
| | | <div class="wy-nav-content"> |
| | | <div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation"> |
| | | <ul class="wy-breadcrumbs"> |
| | | <li><a href="../.." class="icon icon-home" aria-label="Docs"></a></li> |
| | | <li class="breadcrumb-item active">Windows PE 下写入 HA 镜像</li> |
| | | <li class="wy-breadcrumbs-aside"> |
| | | </li> |
| | | </ul> |
| | | <hr/> |
| | | </div> |
| | | <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| | | <div class="section" itemprop="articleBody"> |
| | | |
| | | <h1 id="windows-pe-ha">Windows PE 下写入 HA 镜像<a class="headerlink" href="#windows-pe-ha" title="Permanent link">¶</a></h1> |
| | | <p>windows Pe下写入硬盘镜像的主要思路是使用Roadkilnet开发的Rodakill's Disk Image工具把HA的镜像写入硬盘.</p> |
| | | <h4 id="disk-image">下载Disk Image<a class="headerlink" href="#disk-image" title="Permanent link">¶</a></h4> |
| | | <p><a href="[Roadkil.Net - Roadkil's Disk Image Program Download](https://roadkil.net/program.php?ProgramID=12&Action=NewOSID&DownloadVersion=12&Installer=NO)),如果官网下载地址失效,[可以点击我们自已的下地链接试下](http://datacdn.data-it.tech/GuoWangShangBao/setup/DiskImage_1_6_WinAll%20.ex">DiskImage的官方下载地址为</a>)</p> |
| | | <div class="codehilite"><pre><span></span><code>https://roadkil.net/program.php?ProgramID=12&Action=NewOSID&DownloadVersion=12&Installer=NO |
| | | </code></pre></div> |
| | | |
| | | <p>进入网站的下载页面,如下,选择windows8 10 or 11和Stand Alone Version版本,然后点击下载</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415181632154.png" /></p> |
| | | <p>下载完成后,得到如下DiskImage_1_6_WinAll .exe文件 ,保存好,后面需要保存么U盘。</p> |
| | | <h4 id="windowspeu">制作WindowsPE引导U盘<a class="headerlink" href="#windowspeu" title="Permanent link">¶</a></h4> |
| | | <p>windows的PE制作工具有很多,比如老毛桃,大白菜,等,但这些大多会有值入广告等,用于安装windows系统会有许多垃圾软件,这里推荐使用"<a href="[微PE工具箱 - 下载](https://www.wepe.com.cn/download.html)">微PE工具箱</a>",下载安装程序如下:</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415182711568.png" /></p> |
| | | <p>运行WePev2.3.exe</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415182756329.png" /></p> |
| | | <p>点击右下角的安装到U盘图标</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415182849829.png" /></p> |
| | | <p>选择正确的产,并配好卷标,点击立即安装到U盘,</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415183016859.png" /></p> |
| | | <p>提示开始制作U盘</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415183050407.png" /></p> |
| | | <p>稍等片刻</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415183116317.png" /></p> |
| | | <p>系统提示制作完成</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415183155152.png" /></p> |
| | | <h4 id="haosu">下载并解压HAOS镜像到U盘<a class="headerlink" href="#haosu" title="Permanent link">¶</a></h4> |
| | | <p>点击访问<a href="[Generic x86-64 - Home Assistant](https://www.home-assistant.io/installation/generic-x86-64)">Ha-os-GenerricX86-64页面</a>,找到下镜像的下载链接</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415183356122.png" /></p> |
| | | <p><a href="https://github.com/home-assistant/operating-system/releases/download/15.1/haos_generic-x86-64-15.1.img.xz">也可以直接使用如下链接</a>下载,但尽量还是按上述方法下载,保证每次下载的都是官网最新的版本.</p> |
| | | <p>下载完成后如下</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415183633153.png" /></p> |
| | | <p>解压这个文件</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415183743491.png" /></p> |
| | | <p>得到haos_generic-x86-64-15.1.img,把这个文件复制到U盘中任意目录</p> |
| | | <p>比如,我放到了如下目录</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415183858444.png" /></p> |
| | | <h4 id="disk-imageu">把之前下载好的Disk Image放入U盘<a class="headerlink" href="#disk-imageu" title="Permanent link">¶</a></h4> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415184012136.png" /></p> |
| | | <p>至此WINpe引导U盘就制作好了。</p> |
| | | <p>用此U盘引导小工控机,注意意要正确的配置BIOS,及要用正确的改变启动顺序的方法如F11常按,</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415184245262.png" /></p> |
| | | <p>引导成功白带 ,直入PE启动界面,选 第一项默认,继续</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415184336699.png" /></p> |
| | | <p>稍候会进入PE系统</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415184420784.png" /></p> |
| | | <p>找到并启动diskImage写盘工具</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415184510181.png" /></p> |
| | | <p>点YES继续</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415184548983.png" /></p> |
| | | <p>选 择下载好的HAOS的安装镜像img文件</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415184624836.png" /></p> |
| | | <p>提示数据有丢失风险时,点是</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415184728891.png" /></p> |
| | | <p>注意在写入之前,一定要确认是硬盘而非U盘,一般为physical disk 0</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415184845536.png" /></p> |
| | | <p>写入完成后会提示写入成功</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415184918814.png" /></p> |
| | | <h4 id="ha-cli">重新启动进入HA cli界面<a class="headerlink" href="#ha-cli" title="Permanent link">¶</a></h4> |
| | | <p>系统启动成功后,如下图所示 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415175051168.png" /> |
| | | 通过浏览器,输入控制台提示的IP加端口<a href="http://192.168.3:8123">http://192.168.3:8123</a>即可进入图型化界面,如下 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250413122126133.png" /></p> |
| | | |
| | | </div> |
| | | </div><footer> |
| | | |
| | | <hr/> |
| | | |
| | | <div role="contentinfo"> |
| | | <!-- Copyright etc --> |
| | | </div> |
| | | |
| | | Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| | | </footer> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | </section> |
| | | |
| | | </div> |
| | | |
| | | <div class="rst-versions" role="note" aria-label="Versions"> |
| | | <span class="rst-current-version" data-toggle="rst-current-version"> |
| | | |
| | | <span> |
| | | <a href="http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git" class="fa fa-code-fork" style="color: #fcfcfc"> Dh</a> |
| | | </span> |
| | | |
| | | |
| | | |
| | | </span> |
| | | </div> |
| | | <script src="../../js/jquery-3.6.0.min.js"></script> |
| | | <script>var base_url = "../..";</script> |
| | | <script src="../../js/theme_extra.js"></script> |
| | | <script src="../../js/theme.js"></script> |
| | | <script src="../../search/main.js"></script> |
| | | <script> |
| | | jQuery(function () { |
| | | SphinxRtdTheme.Navigation.enable(true); |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| New file |
| | |
| | | <!DOCTYPE html> |
| | | <html class="writer-html5" lang="en" > |
| | | <head> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="author" content="岱特智能科技(上海)有限公司" /> |
| | | <link rel="shortcut icon" href="../../img/favicon.ico" /> |
| | | <title>configX86Bios - DT-HA</title> |
| | | <link rel="stylesheet" href="../../css/theme.css" /> |
| | | <link rel="stylesheet" href="../../css/theme_extra.css" /> |
| | | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" /> |
| | | |
| | | <script> |
| | | // Current page data |
| | | var mkdocs_page_name = "configX86Bios"; |
| | | var mkdocs_page_input_path = "install-guide\\configX86Bios.md"; |
| | | var mkdocs_page_url = null; |
| | | </script> |
| | | |
| | | <!--[if lt IE 9]> |
| | | <script src="../../js/html5shiv.min.js"></script> |
| | | <![endif]--> |
| | | <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
| | | <script>hljs.highlightAll();</script> |
| | | </head> |
| | | |
| | | <body class="wy-body-for-nav" role="document"> |
| | | |
| | | <div class="wy-grid-for-nav"> |
| | | <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> |
| | | <div class="wy-side-scroll"> |
| | | <div class="wy-side-nav-search"> |
| | | <a href="../.." class="icon icon-home"> DT-HA |
| | | </a><div role="search"> |
| | | <form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get"> |
| | | <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" title="Type search term here" /> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../..">首页</a> |
| | | </li> |
| | | </ul> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../about/">关于</a> |
| | | </li> |
| | | </ul> |
| | | <p class="caption"><span class="caption-text">使用教程</span></p> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../installHa/">安装</a> |
| | | </li> |
| | | <li class="toctree-l1"><a class="reference internal" >使用</a> |
| | | <ul> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../Usages/usage/">使用概述</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../Usages/netconfig/netconfig/">配置网络</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../Usages/initConfig/initConfig/">系统初始化配置</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </nav> |
| | | |
| | | <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| | | <nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu"> |
| | | <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| | | <a href="../..">DT-HA</a> |
| | | |
| | | </nav> |
| | | <div class="wy-nav-content"> |
| | | <div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation"> |
| | | <ul class="wy-breadcrumbs"> |
| | | <li><a href="../.." class="icon icon-home" aria-label="Docs"></a></li> |
| | | <li class="breadcrumb-item active">configX86Bios</li> |
| | | <li class="wy-breadcrumbs-aside"> |
| | | </li> |
| | | </ul> |
| | | <hr/> |
| | | </div> |
| | | <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| | | <div class="section" itemprop="articleBody"> |
| | | |
| | | <h4 id="_1">通用设置<a class="headerlink" href="#_1" title="Permanent link">¶</a></h4> |
| | | <p>要启动Home Assistant操作系统,BIOS需要启用UEFI启动模式并禁用安全启动。</p> |
| | | <p>以下截图来自第七代英特尔NUC系统。您的系统上的BIOS菜单可能看起来不同,但选项应该仍然存在并具有类似的名称。</p> |
| | | <ol> |
| | | <li>要进入BIOS,请启动您的x86-64硬件并反复按下F2键(在某些系统上,这可能是Del、F1或F10键)。</li> |
| | | </ol> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415122225002.png" /></p> |
| | | <ol> |
| | | <li>确保启用了UEFI启动模式。</li> |
| | | </ol> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415122250698.png" /></p> |
| | | <ol> |
| | | <li>禁用安全启动。</li> |
| | | </ol> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415122316891.png" /></p> |
| | | <ol> |
| | | <li>保存更改并退出。</li> |
| | | </ol> |
| | | <p>BIOS配置现已完成。</p> |
| | | <h4 id="1900">公司小工控机(1900)配置<a class="headerlink" href="#1900" title="Permanent link">¶</a></h4> |
| | | <p>公司的小工控机进入Bios的方式,是开机时,按DEL键,进入如下界面</p> |
| | | <p><img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415155947379.png" /> |
| | | 进入Bios后,要调OS Selection,默认为windows7需要调整为Linux如下图 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415160159592.png" /> |
| | | 然后保存,退出 |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415160343254.png" /> |
| | | 提示保存时,选择YES |
| | | <img alt="" src="https://dhcdn.leon056.com/bpfStudy/docs/20250415160418095.png" /></p> |
| | | |
| | | </div> |
| | | </div><footer> |
| | | |
| | | <hr/> |
| | | |
| | | <div role="contentinfo"> |
| | | <!-- Copyright etc --> |
| | | </div> |
| | | |
| | | Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| | | </footer> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | </section> |
| | | |
| | | </div> |
| | | |
| | | <div class="rst-versions" role="note" aria-label="Versions"> |
| | | <span class="rst-current-version" data-toggle="rst-current-version"> |
| | | |
| | | <span> |
| | | <a href="http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git" class="fa fa-code-fork" style="color: #fcfcfc"> Dh</a> |
| | | </span> |
| | | |
| | | |
| | | |
| | | </span> |
| | | </div> |
| | | <script src="../../js/jquery-3.6.0.min.js"></script> |
| | | <script>var base_url = "../..";</script> |
| | | <script src="../../js/theme_extra.js"></script> |
| | | <script src="../../js/theme.js"></script> |
| | | <script src="../../search/main.js"></script> |
| | | <script> |
| | | jQuery(function () { |
| | | SphinxRtdTheme.Navigation.enable(true); |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="en"> |
| | | <html class="writer-html5" lang="en" > |
| | | <head> |
| | | |
| | | |
| | | <meta charset="utf-8"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| | | |
| | | |
| | | |
| | | <link rel="shortcut icon" href="../../img/favicon.ico"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="author" content="岱特智能科技(上海)有限公司" /> |
| | | <link rel="shortcut icon" href="../../img/favicon.ico" /> |
| | | <title>安装 - DT-HA</title> |
| | | <link href="../../css/bootstrap-3.3.7.min.css" rel="stylesheet"> |
| | | <link href="../../css/font-awesome-4.7.0.css" rel="stylesheet"> |
| | | <link href="../../css/base.css" rel="stylesheet"> |
| | | <link rel="stylesheet" href="../../css/highlight.css"> |
| | | <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> |
| | | <!--[if lt IE 9]> |
| | | <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> |
| | | <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> |
| | | <![endif]--> |
| | | |
| | | <script src="../../js/jquery-3.2.1.min.js"></script> |
| | | <script src="../../js/bootstrap-3.3.7.min.js"></script> |
| | | <script src="../../js/highlight.pack.js"></script> |
| | | <link rel="stylesheet" href="../../css/theme.css" /> |
| | | <link rel="stylesheet" href="../../css/theme_extra.css" /> |
| | | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" /> |
| | | |
| | | <base target="_top"> |
| | | <script> |
| | | var base_url = '../..'; |
| | | var is_top_frame = false; |
| | | |
| | | var pageToc = [ |
| | | {title: "\u5b89\u88c5HomeAssistant", url: "#_top", children: [ |
| | | {title: "HAOS\u5b89\u88c5", url: "#haos" }, |
| | | ]}, |
| | | ]; |
| | | |
| | | </script> |
| | | <script src="../../js/base.js"></script> |
| | | <script> |
| | | // Current page data |
| | | var mkdocs_page_name = "\u5b89\u88c5"; |
| | | var mkdocs_page_input_path = "install-guide\\installHa.md"; |
| | | var mkdocs_page_url = null; |
| | | </script> |
| | | |
| | | <!--[if lt IE 9]> |
| | | <script src="../../js/html5shiv.min.js"></script> |
| | | <![endif]--> |
| | | <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
| | | <script>hljs.highlightAll();</script> |
| | | </head> |
| | | |
| | | <body> |
| | | <script> |
| | | if (is_top_frame) { $('body').addClass('wm-top-page'); } |
| | | </script> |
| | | <body class="wy-body-for-nav" role="document"> |
| | | |
| | | <div class="wy-grid-for-nav"> |
| | | <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> |
| | | <div class="wy-side-scroll"> |
| | | <div class="wy-side-nav-search"> |
| | | <a href="../.." class="icon icon-home"> DT-HA |
| | | </a><div role="search"> |
| | | <form id ="rtd-search-form" class="wy-form" action="../../search.html" method="get"> |
| | | <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" title="Type search term here" /> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | |
| | | |
| | | <div class="container-fluid wm-page-content"> |
| | | <a name="_top"></a> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <div class="row wm-article-nav-buttons" role="navigation" aria-label="navigation"> |
| | | |
| | | <div class="wm-article-nav pull-right"> |
| | | <a href="../../Usages/usage/" class="btn btn-xs btn-default pull-right"> |
| | | Next |
| | | <i class="fa fa-chevron-right" aria-hidden="true"></i> |
| | | </a> |
| | | <a href="../../Usages/usage/" class="btn btn-xs btn-link"> |
| | | 使用 |
| | | </a> |
| | | <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../..">首页</a> |
| | | </li> |
| | | </ul> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="../../about/">关于</a> |
| | | </li> |
| | | </ul> |
| | | <p class="caption"><span class="caption-text">使用教程</span></p> |
| | | <ul class="current"> |
| | | <li class="toctree-l1 current"><a class="reference internal current" href="#">安装</a> |
| | | <ul class="current"> |
| | | <li class="toctree-l2"><a class="reference internal" href="#haos">HAOS安装</a> |
| | | <ul> |
| | | <li class="toctree-l3"><a class="reference internal" href="#x86pc">安装在X86PC硬盘上</a> |
| | | <ul> |
| | | <li class="toctree-l4"><a class="reference internal" href="#linux">基于linux操作系统写入镜像</a> |
| | | </li> |
| | | <li class="toctree-l4"><a class="reference internal" href="#windows">基于windows操作系统写入镜像.</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | <li class="toctree-l1"><a class="reference internal" >使用</a> |
| | | <ul> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../Usages/usage/">使用概述</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../Usages/netconfig/netconfig/">配置网络</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="../../Usages/initConfig/initConfig/">系统初始化配置</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="wm-article-nav"> |
| | | <a href="../../about/" class="btn btn-xs btn-default pull-left"> |
| | | <i class="fa fa-chevron-left" aria-hidden="true"></i> |
| | | Previous</a><a href="../../about/" class="btn btn-xs btn-link"> |
| | | 关于 |
| | | </a> |
| | | </div> |
| | | |
| | | </div> |
| | | </nav> |
| | | |
| | | |
| | | |
| | | <h1 id="homeassistant">安装HomeAssistant</h1> |
| | | <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| | | <nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu"> |
| | | <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| | | <a href="../..">DT-HA</a> |
| | | |
| | | </nav> |
| | | <div class="wy-nav-content"> |
| | | <div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation"> |
| | | <ul class="wy-breadcrumbs"> |
| | | <li><a href="../.." class="icon icon-home" aria-label="Docs"></a></li> |
| | | <li class="breadcrumb-item">使用教程</li> |
| | | <li class="breadcrumb-item active">安装</li> |
| | | <li class="wy-breadcrumbs-aside"> |
| | | </li> |
| | | </ul> |
| | | <hr/> |
| | | </div> |
| | | <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| | | <div class="section" itemprop="articleBody"> |
| | | |
| | | <h1 id="homeassistant">安装HomeAssistant<a class="headerlink" href="#homeassistant" title="Permanent link">¶</a></h1> |
| | | <p>HomeAssistant的安装有多种方式与方法,最常用折有硬备直接安装,docker安装虚拟机安装等.</p> |
| | | <p>下面我们就以硬盘安装HAOS为例介绍基于x86硬件的基础上安装HAOS,基它的安装方式,后续会介绍.</p> |
| | | <h2 id="haos">HAOS安装</h2> |
| | | <h3 id="x86pc">安装在X86PC硬盘上</h3> |
| | | <h2 id="haos">HAOS安装<a class="headerlink" href="#haos" title="Permanent link">¶</a></h2> |
| | | <h3 id="x86pc">安装在X86PC硬盘上<a class="headerlink" href="#x86pc" title="Permanent link">¶</a></h3> |
| | | <p>haos要安装在硬盘上,总体思路是,先到HA的官网下载haos的官方镜像文件 ,一般为.gz或.gz.xz等格式,然后再用写盘工具,直接把这个镜像写入硬盘.</p> |
| | | <p>将镜像文件写入硬盘上约有两种方法:</p> |
| | | <ul> |
| | |
| | | <p>在windows平台上写入镜像</p> |
| | | </li> |
| | | </ul> |
| | | <h4 id="linux"><a href="../LinuxInstall/"> 基于linux操作系统写入镜像</a></h4> |
| | | <h4 id="linux"><a href="../LinuxInstall/"> 基于linux操作系统写入镜像</a><a class="headerlink" href="#linux" title="Permanent link">¶</a></h4> |
| | | <p>这种方法的操作方法是:</p> |
| | | <ol> |
| | | <li> |
| | |
| | | </li> |
| | | </ol> |
| | | <p>此种方法的好处是,不用拆除硬盘,直接在小工控机上就能实现操作.</p> |
| | | <h4 id="windows">基于windows操作系统写入镜像.</h4> |
| | | <h4 id="windows">基于<a href="../WinPeInstall/">windows操作系统写入镜像.</a><a class="headerlink" href="#windows" title="Permanent link">¶</a></h4> |
| | | <p>官方在介绍这种方法是让用户把小工控机的硬盘拆下,装入用户自已的电脑中,并用balenaEtcher写盘工具将镜像写入小工控的机的硬盘后,再把小工控机机的硬盘装入小工控机.这方法方便快捷,但是需要拆机,有需要的用户可以到官方介绍页面<a href="https://www.home-assistant.io/installation/generic-x86-64">Geneic x86-64</a>去看具体操作方法.</p> |
| | | <p>我们常用的方法如下:</p> |
| | | <ol> |
| | |
| | | <p>重启进入HA ClI.</p> |
| | | </li> |
| | | </ol> |
| | | |
| | | <br> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <div class="row wm-article-nav-buttons" role="navigation" aria-label="navigation"> |
| | | |
| | | <div class="wm-article-nav pull-right"> |
| | | <a href="../../Usages/usage/" class="btn btn-xs btn-default pull-right"> |
| | | Next |
| | | <i class="fa fa-chevron-right" aria-hidden="true"></i> |
| | | </a> |
| | | <a href="../../Usages/usage/" class="btn btn-xs btn-link"> |
| | | 使用 |
| | | </a> |
| | | |
| | | </div> |
| | | </div><footer> |
| | | <div class="rst-footer-buttons" role="navigation" aria-label="Footer Navigation"> |
| | | <a href="../../about/" class="btn btn-neutral float-left" title="关于"><span class="icon icon-circle-arrow-left"></span> Previous</a> |
| | | <a href="../../Usages/usage/" class="btn btn-neutral float-right" title="使用概述">Next <span class="icon icon-circle-arrow-right"></span></a> |
| | | </div> |
| | | |
| | | <div class="wm-article-nav"> |
| | | <a href="../../about/" class="btn btn-xs btn-default pull-left"> |
| | | <i class="fa fa-chevron-left" aria-hidden="true"></i> |
| | | Previous</a><a href="../../about/" class="btn btn-xs btn-link"> |
| | | 关于 |
| | | </a> |
| | | </div> |
| | | |
| | | |
| | | <hr/> |
| | | |
| | | <div role="contentinfo"> |
| | | <!-- Copyright etc --> |
| | | </div> |
| | | |
| | | <br> |
| | | </div> |
| | | |
| | | <footer class="container-fluid wm-page-content"> |
| | | <p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a> using <a href="https://github.com/gristlabs/mkdocs-windmill">Windmill</a> theme by Grist Labs.</p> |
| | | Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| | | </footer> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | </section> |
| | | |
| | | </div> |
| | | |
| | | <div class="rst-versions" role="note" aria-label="Versions"> |
| | | <span class="rst-current-version" data-toggle="rst-current-version"> |
| | | |
| | | <span> |
| | | <a href="http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git" class="fa fa-code-fork" style="color: #fcfcfc"> Dh</a> |
| | | </span> |
| | | |
| | | |
| | | <span><a href="../../about/" style="color: #fcfcfc">« Previous</a></span> |
| | | |
| | | |
| | | <span><a href="../../Usages/usage/" style="color: #fcfcfc">Next »</a></span> |
| | | |
| | | </span> |
| | | </div> |
| | | <script src="../../js/jquery-3.6.0.min.js"></script> |
| | | <script>var base_url = "../..";</script> |
| | | <script src="../../js/theme_extra.js"></script> |
| | | <script src="../../js/theme.js"></script> |
| | | <script src="../../search/main.js"></script> |
| | | <script> |
| | | jQuery(function () { |
| | | SphinxRtdTheme.Navigation.enable(true); |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| | | </html> |
| New file |
| | |
| | | /** |
| | | * @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed |
| | | */ |
| | | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); |
| New file |
| | |
| | | /*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ |
| | | !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S}); |
| New file |
| | |
| | | /* sphinx_rtd_theme version 1.0.0 | MIT license */ |
| | | !function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("<div class='wy-table-responsive'></div>"),n("table.docutils.footnote").wrap("<div class='wy-table-responsive footnote'></div>"),n("table.docutils.citation").wrap("<div class='wy-table-responsive citation'></div>"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n('<button class="toctree-expand" title="Open/close menu"></button>'),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t<e.length&&!window.requestAnimationFrame;++t)window.requestAnimationFrame=window[e[t]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[t]+"CancelAnimationFrame"]||window[e[t]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,t){var i=(new Date).getTime(),o=Math.max(0,16-(i-n)),r=window.setTimeout((function(){e(i+o)}),o);return n=i+o,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(n){clearTimeout(n)})}()}).call(window)},function(n,e){n.exports=jQuery},function(n,e,t){}]); |
| New file |
| | |
| | | /* |
| | | * Assign 'docutils' class to tables so styling and |
| | | * JavaScript behavior is applied. |
| | | * |
| | | * https://github.com/mkdocs/mkdocs/issues/2028 |
| | | */ |
| | | |
| | | $('div.rst-content table').addClass('docutils'); |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="en"> |
| | | <html class="writer-html5" lang="en" > |
| | | <head> |
| | | |
| | | |
| | | <meta charset="utf-8"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| | | |
| | | |
| | | |
| | | <link rel="shortcut icon" href="./img/favicon.ico"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="author" content="岱特智能科技(上海)有限公司" /> |
| | | <link rel="shortcut icon" href="./img/favicon.ico" /> |
| | | <title>DT-HA</title> |
| | | <link href="./css/bootstrap-3.3.7.min.css" rel="stylesheet"> |
| | | <link href="./css/font-awesome-4.7.0.css" rel="stylesheet"> |
| | | <link href="./css/base.css" rel="stylesheet"> |
| | | <link rel="stylesheet" href="./css/highlight.css"> |
| | | <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> |
| | | <!--[if lt IE 9]> |
| | | <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> |
| | | <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> |
| | | <![endif]--> |
| | | |
| | | <script src="./js/jquery-3.2.1.min.js"></script> |
| | | <script src="./js/bootstrap-3.3.7.min.js"></script> |
| | | <script src="./js/highlight.pack.js"></script> |
| | | <link rel="stylesheet" href="./css/theme.css" /> |
| | | <link rel="stylesheet" href="./css/theme_extra.css" /> |
| | | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" /> |
| | | |
| | | <base target="_top"> |
| | | <script> |
| | | var base_url = '.'; |
| | | var is_top_frame = false; |
| | | var page_toc = null; |
| | | |
| | | </script> |
| | | <script src="./js/base.js"></script> |
| | | <!--[if lt IE 9]> |
| | | <script src="./js/html5shiv.min.js"></script> |
| | | <![endif]--> |
| | | <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script> |
| | | <script>hljs.highlightAll();</script> |
| | | </head> |
| | | |
| | | <body> |
| | | <script> |
| | | if (is_top_frame) { $('body').addClass('wm-top-page'); } |
| | | </script> |
| | | <body class="wy-body-for-nav" role="document"> |
| | | |
| | | <div class="wy-grid-for-nav"> |
| | | <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav"> |
| | | <div class="wy-side-scroll"> |
| | | <div class="wy-side-nav-search"> |
| | | <a href="./." class="icon icon-home"> DT-HA |
| | | </a><div role="search"> |
| | | <form id ="rtd-search-form" class="wy-form" action="./search.html" method="get"> |
| | | <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" title="Type search term here" /> |
| | | </form> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="./.">首页</a> |
| | | </li> |
| | | </ul> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="./about/">关于</a> |
| | | </li> |
| | | </ul> |
| | | <p class="caption"><span class="caption-text">使用教程</span></p> |
| | | <ul> |
| | | <li class="toctree-l1"><a class="reference internal" href="./install-guide/installHa/">安装</a> |
| | | </li> |
| | | <li class="toctree-l1"><a class="reference internal" >使用</a> |
| | | <ul> |
| | | <li class="toctree-l2"><a class="reference internal" href="./Usages/usage/">使用概述</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="./Usages/netconfig/netconfig/">配置网络</a> |
| | | </li> |
| | | <li class="toctree-l2"><a class="reference internal" href="./Usages/initConfig/initConfig/">系统初始化配置</a> |
| | | </li> |
| | | </ul> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </div> |
| | | </nav> |
| | | |
| | | <div class="container-fluid wm-page-content"> |
| | | <a name="_top"></a> |
| | | |
| | | <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| | | <nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu"> |
| | | <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| | | <a href="./.">DT-HA</a> |
| | | |
| | | </nav> |
| | | <div class="wy-nav-content"> |
| | | <div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation"> |
| | | <ul class="wy-breadcrumbs"> |
| | | <li><a href="./." class="icon icon-home" aria-label="Docs"></a></li> |
| | | <li class="wy-breadcrumbs-aside"> |
| | | </li> |
| | | </ul> |
| | | <hr/> |
| | | </div> |
| | | <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| | | <div class="section" itemprop="articleBody"> |
| | | |
| | | |
| | | <h1 id="search">Search Results</h1> |
| | | |
| | | <ul id="mkdocs-search-results" class="wm-search-page"> |
| | | <form id="content_search" action="search.html"> |
| | | <span role="status" aria-live="polite" class="ui-helper-hidden-accessible"></span> |
| | | <input name="q" id="mkdocs-search-query" type="text" class="search_input search-query ui-autocomplete-input" placeholder="Search the Docs" aria-label="Search the Docs" autocomplete="off" autofocus title="Type search term here"> |
| | | </form> |
| | | |
| | | <div id="mkdocs-search-results" class="search-results" data-no-results-text="No results found"> |
| | | Searching... |
| | | </ul> |
| | | |
| | | <script> |
| | | window.top.doSearch({ |
| | | resultsElem: $('#mkdocs-search-results'), |
| | | query: getParam('q'), |
| | | snippetLen: 200, |
| | | limit: 0 |
| | | }); |
| | | </script> |
| | | </div> |
| | | |
| | | |
| | | <br> |
| | | |
| | | </div> |
| | | </div><footer> |
| | | |
| | | <br> |
| | | </div> |
| | | <hr/> |
| | | |
| | | <footer class="container-fluid wm-page-content"> |
| | | <p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a> using <a href="https://github.com/gristlabs/mkdocs-windmill">Windmill</a> theme by Grist Labs.</p> |
| | | <div role="contentinfo"> |
| | | <!-- Copyright etc --> |
| | | </div> |
| | | |
| | | Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| | | </footer> |
| | | |
| | | </div> |
| | | </div> |
| | | |
| | | </section> |
| | | |
| | | </div> |
| | | |
| | | <div class="rst-versions" role="note" aria-label="Versions"> |
| | | <span class="rst-current-version" data-toggle="rst-current-version"> |
| | | |
| | | <span> |
| | | <a href="http://dh.leon056.com:7499/r/Embedded/HomeAssistantPtoject.git" class="fa fa-code-fork" style="color: #fcfcfc"> Dh</a> |
| | | </span> |
| | | |
| | | |
| | | |
| | | </span> |
| | | </div> |
| | | <script src="./js/jquery-3.6.0.min.js"></script> |
| | | <script>var base_url = ".";</script> |
| | | <script src="./js/theme_extra.js"></script> |
| | | <script src="./js/theme.js"></script> |
| | | <script src="./search/main.js"></script> |
| | | <script> |
| | | jQuery(function () { |
| | | SphinxRtdTheme.Navigation.enable(true); |
| | | }); |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| | | </html> |
| New file |
| | |
| | | /** |
| | | * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 |
| | | * Copyright (C) 2020 Oliver Nightingale |
| | | * @license MIT |
| | | */ |
| | | |
| | | ;(function(){ |
| | | |
| | | /** |
| | | * A convenience function for configuring and constructing |
| | | * a new lunr Index. |
| | | * |
| | | * A lunr.Builder instance is created and the pipeline setup |
| | | * with a trimmer, stop word filter and stemmer. |
| | | * |
| | | * This builder object is yielded to the configuration function |
| | | * that is passed as a parameter, allowing the list of fields |
| | | * and other builder parameters to be customised. |
| | | * |
| | | * All documents _must_ be added within the passed config function. |
| | | * |
| | | * @example |
| | | * var idx = lunr(function () { |
| | | * this.field('title') |
| | | * this.field('body') |
| | | * this.ref('id') |
| | | * |
| | | * documents.forEach(function (doc) { |
| | | * this.add(doc) |
| | | * }, this) |
| | | * }) |
| | | * |
| | | * @see {@link lunr.Builder} |
| | | * @see {@link lunr.Pipeline} |
| | | * @see {@link lunr.trimmer} |
| | | * @see {@link lunr.stopWordFilter} |
| | | * @see {@link lunr.stemmer} |
| | | * @namespace {function} lunr |
| | | */ |
| | | var lunr = function (config) { |
| | | var builder = new lunr.Builder |
| | | |
| | | builder.pipeline.add( |
| | | lunr.trimmer, |
| | | lunr.stopWordFilter, |
| | | lunr.stemmer |
| | | ) |
| | | |
| | | builder.searchPipeline.add( |
| | | lunr.stemmer |
| | | ) |
| | | |
| | | config.call(builder, builder) |
| | | return builder.build() |
| | | } |
| | | |
| | | lunr.version = "2.3.9" |
| | | /*! |
| | | * lunr.utils |
| | | * Copyright (C) 2020 Oliver Nightingale |
| | | */ |
| | | |
| | | /** |
| | | * A namespace containing utils for the rest of the lunr library |
| | | * @namespace lunr.utils |
| | | */ |
| | | lunr.utils = {} |
| | | |
| | | /** |
| | | * Print a warning message to the console. |
| | | * |
| | | * @param {String} message The message to be printed. |
| | | * @memberOf lunr.utils |
| | | * @function |
| | | */ |
| | | lunr.utils.warn = (function (global) { |
| | | /* eslint-disable no-console */ |
| | | return function (message) { |
| | | if (global.console && console.warn) { |
| | | console.warn(message) |
| | | } |
| | | } |
| | | /* eslint-enable no-console */ |
| | | })(this) |
| | | |
| | | /** |
| | | * Convert an object to a string. |
| | | * |
| | | * In the case of `null` and `undefined` the function returns |
| | | * the empty string, in all other cases the result of calling |
| | | * `toString` on the passed object is returned. |
| | | * |
| | | * @param {Any} obj The object to convert to a string. |
| | | * @return {String} string representation of the passed object. |
| | | * @memberOf lunr.utils |
| | | */ |
| | | lunr.utils.asString = function (obj) { |
| | | if (obj === void 0 || obj === null) { |
| | | return "" |
| | | } else { |
| | | return obj.toString() |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Clones an object. |
| | | * |
| | | * Will create a copy of an existing object such that any mutations |
| | | * on the copy cannot affect the original. |
| | | * |
| | | * Only shallow objects are supported, passing a nested object to this |
| | | * function will cause a TypeError. |
| | | * |
| | | * Objects with primitives, and arrays of primitives are supported. |
| | | * |
| | | * @param {Object} obj The object to clone. |
| | | * @return {Object} a clone of the passed object. |
| | | * @throws {TypeError} when a nested object is passed. |
| | | * @memberOf Utils |
| | | */ |
| | | lunr.utils.clone = function (obj) { |
| | | if (obj === null || obj === undefined) { |
| | | return obj |
| | | } |
| | | |
| | | var clone = Object.create(null), |
| | | keys = Object.keys(obj) |
| | | |
| | | for (var i = 0; i < keys.length; i++) { |
| | | var key = keys[i], |
| | | val = obj[key] |
| | | |
| | | if (Array.isArray(val)) { |
| | | clone[key] = val.slice() |
| | | continue |
| | | } |
| | | |
| | | if (typeof val === 'string' || |
| | | typeof val === 'number' || |
| | | typeof val === 'boolean') { |
| | | clone[key] = val |
| | | continue |
| | | } |
| | | |
| | | throw new TypeError("clone is not deep and does not support nested objects") |
| | | } |
| | | |
| | | return clone |
| | | } |
| | | lunr.FieldRef = function (docRef, fieldName, stringValue) { |
| | | this.docRef = docRef |
| | | this.fieldName = fieldName |
| | | this._stringValue = stringValue |
| | | } |
| | | |
| | | lunr.FieldRef.joiner = "/" |
| | | |
| | | lunr.FieldRef.fromString = function (s) { |
| | | var n = s.indexOf(lunr.FieldRef.joiner) |
| | | |
| | | if (n === -1) { |
| | | throw "malformed field ref string" |
| | | } |
| | | |
| | | var fieldRef = s.slice(0, n), |
| | | docRef = s.slice(n + 1) |
| | | |
| | | return new lunr.FieldRef (docRef, fieldRef, s) |
| | | } |
| | | |
| | | lunr.FieldRef.prototype.toString = function () { |
| | | if (this._stringValue == undefined) { |
| | | this._stringValue = this.fieldName + lunr.FieldRef.joiner + this.docRef |
| | | } |
| | | |
| | | return this._stringValue |
| | | } |
| | | /*! |
| | | * lunr.Set |
| | | * Copyright (C) 2020 Oliver Nightingale |
| | | */ |
| | | |
| | | /** |
| | | * A lunr set. |
| | | * |
| | | * @constructor |
| | | */ |
| | | lunr.Set = function (elements) { |
| | | this.elements = Object.create(null) |
| | | |
| | | if (elements) { |
| | | this.length = elements.length |
| | | |
| | | for (var i = 0; i < this.length; i++) { |
| | | this.elements[elements[i]] = true |
| | | } |
| | | } else { |
| | | this.length = 0 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * A complete set that contains all elements. |
| | | * |
| | | * @static |
| | | * @readonly |
| | | * @type {lunr.Set} |
| | | */ |
| | | lunr.Set.complete = { |
| | | intersect: function (other) { |
| | | return other |
| | | }, |
| | | |
| | | union: function () { |
| | | return this |
| | | }, |
| | | |
| | | contains: function () { |
| | | return true |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * An empty set that contains no elements. |
| | | * |
| | | * @static |
| | | * @readonly |
| | | * @type {lunr.Set} |
| | | */ |
| | | lunr.Set.empty = { |
| | | intersect: function () { |
| | | return this |
| | | }, |
| | | |
| | | union: function (other) { |
| | | return other |
| | | }, |
| | | |
| | | contains: function () { |
| | | return false |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Returns true if this set contains the specified object. |
| | | * |
| | | * @param {object} object - Object whose presence in this set is to be tested. |
| | | * @returns {boolean} - True if this set contains the specified object. |
| | | */ |
| | | lunr.Set.prototype.contains = function (object) { |
| | | return !!this.elements[object] |
| | | } |
| | | |
| | | /** |
| | | * Returns a new set containing only the elements that are present in both |
| | | * this set and the specified set. |
| | | * |
| | | * @param {lunr.Set} other - set to intersect with this set. |
| | | * @returns {lunr.Set} a new set that is the intersection of this and the specified set. |
| | | */ |
| | | |
| | | lunr.Set.prototype.intersect = function (other) { |
| | | var a, b, elements, intersection = [] |
| | | |
| | | if (other === lunr.Set.complete) { |
| | | return this |
| | | } |
| | | |
| | | if (other === lunr.Set.empty) { |
| | | return other |
| | | } |
| | | |
| | | if (this.length < other.length) { |
| | | a = this |
| | | b = other |
| | | } else { |
| | | a = other |
| | | b = this |
| | | } |
| | | |
| | | elements = Object.keys(a.elements) |
| | | |
| | | for (var i = 0; i < elements.length; i++) { |
| | | var element = elements[i] |
| | | if (element in b.elements) { |
| | | intersection.push(element) |
| | | } |
| | | } |
| | | |
| | | return new lunr.Set (intersection) |
| | | } |
| | | |
| | | /** |
| | | * Returns a new set combining the elements of this and the specified set. |
| | | * |
| | | * @param {lunr.Set} other - set to union with this set. |
| | | * @return {lunr.Set} a new set that is the union of this and the specified set. |
| | | */ |
| | | |
| | | lunr.Set.prototype.union = function (other) { |
| | | if (other === lunr.Set.complete) { |
| | | return lunr.Set.complete |
| | | } |
| | | |
| | | if (other === lunr.Set.empty) { |
| | | return this |
| | | } |
| | | |
| | | return new lunr.Set(Object.keys(this.elements).concat(Object.keys(other.elements))) |
| | | } |
| | | /** |
| | | * A function to calculate the inverse document frequency for |
| | | * a posting. This is shared between the builder and the index |
| | | * |
| | | * @private |
| | | * @param {object} posting - The posting for a given term |
| | | * @param {number} documentCount - The total number of documents. |
| | | */ |
| | | lunr.idf = function (posting, documentCount) { |
| | | var documentsWithTerm = 0 |
| | | |
| | | for (var fieldName in posting) { |
| | | if (fieldName == '_index') continue // Ignore the term index, its not a field |
| | | documentsWithTerm += Object.keys(posting[fieldName]).length |
| | | } |
| | | |
| | | var x = (documentCount - documentsWithTerm + 0.5) / (documentsWithTerm + 0.5) |
| | | |
| | | return Math.log(1 + Math.abs(x)) |
| | | } |
| | | |
| | | /** |
| | | * A token wraps a string representation of a token |
| | | * as it is passed through the text processing pipeline. |
| | | * |
| | | * @constructor |
| | | * @param {string} [str=''] - The string token being wrapped. |
| | | * @param {object} [metadata={}] - Metadata associated with this token. |
| | | */ |
| | | lunr.Token = function (str, metadata) { |
| | | this.str = str || "" |
| | | this.metadata = metadata || {} |
| | | } |
| | | |
| | | /** |
| | | * Returns the token string that is being wrapped by this object. |
| | | * |
| | | * @returns {string} |
| | | */ |
| | | lunr.Token.prototype.toString = function () { |
| | | return this.str |
| | | } |
| | | |
| | | /** |
| | | * A token update function is used when updating or optionally |
| | | * when cloning a token. |
| | | * |
| | | * @callback lunr.Token~updateFunction |
| | | * @param {string} str - The string representation of the token. |
| | | * @param {Object} metadata - All metadata associated with this token. |
| | | */ |
| | | |
| | | /** |
| | | * Applies the given function to the wrapped string token. |
| | | * |
| | | * @example |
| | | * token.update(function (str, metadata) { |
| | | * return str.toUpperCase() |
| | | * }) |
| | | * |
| | | * @param {lunr.Token~updateFunction} fn - A function to apply to the token string. |
| | | * @returns {lunr.Token} |
| | | */ |
| | | lunr.Token.prototype.update = function (fn) { |
| | | this.str = fn(this.str, this.metadata) |
| | | return this |
| | | } |
| | | |
| | | /** |
| | | * Creates a clone of this token. Optionally a function can be |
| | | * applied to the cloned token. |
| | | * |
| | | * @param {lunr.Token~updateFunction} [fn] - An optional function to apply to the cloned token. |
| | | * @returns {lunr.Token} |
| | | */ |
| | | lunr.Token.prototype.clone = function (fn) { |
| | | fn = fn || function (s) { return s } |
| | | return new lunr.Token (fn(this.str, this.metadata), this.metadata) |
| | | } |
| | | /*! |
| | | * lunr.tokenizer |
| | | * Copyright (C) 2020 Oliver Nightingale |
| | | */ |
| | | |
| | | /** |
| | | * A function for splitting a string into tokens ready to be inserted into |
| | | * the search index. Uses `lunr.tokenizer.separator` to split strings, change |
| | | * the value of this property to change how strings are split into tokens. |
| | | * |
| | | * This tokenizer will convert its parameter to a string by calling `toString` and |
| | | * then will split this string on the character in `lunr.tokenizer.separator`. |
| | | * Arrays will have their elements converted to strings and wrapped in a lunr.Token. |
| | | * |
| | | * Optional metadata can be passed to the tokenizer, this metadata will be cloned and |
| | | * added as metadata to every token that is created from the object to be tokenized. |
| | | * |
| | | * @static |
| | | * @param {?(string|object|object[])} obj - The object to convert into tokens |
| | | * @param {?object} metadata - Optional metadata to associate with every token |
| | | * @returns {lunr.Token[]} |
| | | * @see {@link lunr.Pipeline} |
| | | */ |
| | | lunr.tokenizer = function (obj, metadata) { |
| | | if (obj == null || obj == undefined) { |
| | | return [] |
| | | } |
| | | |
| | | if (Array.isArray(obj)) { |
| | | return obj.map(function (t) { |
| | | return new lunr.Token( |
| | | lunr.utils.asString(t).toLowerCase(), |
| | | lunr.utils.clone(metadata) |
| | | ) |
| | | }) |
| | | } |
| | | |
| | | var str = obj.toString().toLowerCase(), |
| | | len = str.length, |
| | | tokens = [] |
| | | |
| | | for (var sliceEnd = 0, sliceStart = 0; sliceEnd <= len; sliceEnd++) { |
| | | var char = str.charAt(sliceEnd), |
| | | sliceLength = sliceEnd - sliceStart |
| | | |
| | | if ((char.match(lunr.tokenizer.separator) || sliceEnd == len)) { |
| | | |
| | | if (sliceLength > 0) { |
| | | var tokenMetadata = lunr.utils.clone(metadata) || {} |
| | | tokenMetadata["position"] = [sliceStart, sliceLength] |
| | | tokenMetadata["index"] = tokens.length |
| | | |
| | | tokens.push( |
| | | new lunr.Token ( |
| | | str.slice(sliceStart, sliceEnd), |
| | | tokenMetadata |
| | | ) |
| | | ) |
| | | } |
| | | |
| | | sliceStart = sliceEnd + 1 |
| | | } |
| | | |
| | | } |
| | | |
| | | return tokens |
| | | } |
| | | |
| | | /** |
| | | * The separator used to split a string into tokens. Override this property to change the behaviour of |
| | | * `lunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens. |
| | | * |
| | | * @static |
| | | * @see lunr.tokenizer |
| | | */ |
| | | lunr.tokenizer.separator = /[\s\-]+/ |
| | | /*! |
| | | * lunr.Pipeline |
| | | * Copyright (C) 2020 Oliver Nightingale |
| | | */ |
| | | |
| | | /** |
| | | * lunr.Pipelines maintain an ordered list of functions to be applied to all |
| | | * tokens in documents entering the search index and queries being ran against |
| | | * the index. |
| | | * |
| | | * An instance of lunr.Index created with the lunr shortcut will contain a |
| | | * pipeline with a stop word filter and an English language stemmer. Extra |
| | | * functions can be added before or after either of these functions or these |
| | | * default functions can be removed. |
| | | * |
| | | * When run the pipeline will call each function in turn, passing a token, the |
| | | * index of that token in the original list of all tokens and finally a list of |
| | | * all the original tokens. |
| | | * |
| | | * The output of functions in the pipeline will be passed to the next function |
| | | * in the pipeline. To exclude a token from entering the index the function |
| | | * should return undefined, the rest of the pipeline will not be called with |
| | | * this token. |
| | | * |
| | | * For serialisation of pipelines to work, all functions used in an instance of |
| | | * a pipeline should be registered with lunr.Pipeline. Registered functions can |
| | | * then be loaded. If trying to load a serialised pipeline that uses functions |
| | | * that are not registered an error will be thrown. |
| | | * |
| | | * If not planning on serialising the pipeline then registering pipeline functions |
| | | * is not necessary. |
| | | * |
| | | * @constructor |
| | | */ |
| | | lunr.Pipeline = function () { |
| | | this._stack = [] |
| | | } |
| | | |
| | | lunr.Pipeline.registeredFunctions = Object.create(null) |
| | | |
| | | /** |
| | | * A pipeline function maps lunr.Token to lunr.Token. A lunr.Token contains the token |
| | | * string as well as all known metadata. A pipeline function can mutate the token string |
| | | * or mutate (or add) metadata for a given token. |
| | | * |
| | | * A pipeline function can indicate that the passed token should be discarded by returning |
| | | * null, undefined or an empty string. This token will not be passed to any downstream pipeline |
| | | * functions and will not be added to the index. |
| | | * |
| | | * Multiple tokens can be returned by returning an array of tokens. Each token will be passed |
| | | * to any downstream pipeline functions and all will returned tokens will be added to the index. |
| | | * |
| | | * Any number of pipeline functions may be chained together using a lunr.Pipeline. |
| | | * |
| | | * @interface lunr.PipelineFunction |
| | | * @param {lunr.Token} token - A token from the document being processed. |
| | | * @param {number} i - The index of this token in the complete list of tokens for this document/field. |
| | | * @param {lunr.Token[]} tokens - All tokens for this document/field. |
| | | * @returns {(?lunr.Token|lunr.Token[])} |
| | | */ |
| | | |
| | | /** |
| | | * Register a function with the pipeline. |
| | | * |
| | | * Functions that are used in the pipeline should be registered if the pipeline |
| | | * needs to be serialised, or a serialised pipeline needs to be loaded. |
| | | * |
| | | * Registering a function does not add it to a pipeline, functions must still be |
| | | * added to instances of the pipeline for them to be used when running a pipeline. |
| | | * |
| | | * @param {lunr.PipelineFunction} fn - The function to check for. |
| | | * @param {String} label - The label to register this function with |
| | | */ |
| | | lunr.Pipeline.registerFunction = function (fn, label) { |
| | | if (label in this.registeredFunctions) { |
| | | lunr.utils.warn('Overwriting existing registered function: ' + label) |
| | | } |
| | | |
| | | fn.label = label |
| | | lunr.Pipeline.registeredFunctions[fn.label] = fn |
| | | } |
| | | |
| | | /** |
| | | * Warns if the function is not registered as a Pipeline function. |
| | | * |
| | | * @param {lunr.PipelineFunction} fn - The function to check for. |
| | | * @private |
| | | */ |
| | | lunr.Pipeline.warnIfFunctionNotRegistered = function (fn) { |
| | | var isRegistered = fn.label && (fn.label in this.registeredFunctions) |
| | | |
| | | if (!isRegistered) { |
| | | lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\n', fn) |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Loads a previously serialised pipeline. |
| | | * |
| | | * All functions to be loaded must already be registered with lunr.Pipeline. |
| | | * If any function from the serialised data has not been registered then an |
| | | * error will be thrown. |
| | | * |
| | | * @param {Object} serialised - The serialised pipeline to load. |
| | | * @returns {lunr.Pipeline} |
| | | */ |
| | | lunr.Pipeline.load = function (serialised) { |
| | | var pipeline = new lunr.Pipeline |
| | | |
| | | serialised.forEach(function (fnName) { |
| | | var fn = lunr.Pipeline.registeredFunctions[fnName] |
| | | |
| | | if (fn) { |
| | | pipeline.add(fn) |
| | | } else { |
| | | throw new Error('Cannot load unregistered function: ' + fnName) |
| | | } |
| | | }) |
| | | |
| | | return pipeline |
| | | } |
| | | |
| | | /** |
| | | * Adds new functions to the end of the pipeline. |
| | | * |
| | | * Logs a warning if the function has not been registered. |
| | | * |
| | | * @param {lunr.PipelineFunction[]} functions - Any number of functions to add to the pipeline. |
| | | */ |
| | | lunr.Pipeline.prototype.add = function () { |
| | | var fns = Array.prototype.slice.call(arguments) |
| | | |
| | | fns.forEach(function (fn) { |
| | | lunr.Pipeline.warnIfFunctionNotRegistered(fn) |
| | | this._stack.push(fn) |
| | | }, this) |
| | | } |
| | | |
| | | /** |
| | | * Adds a single function after a function that already exists in the |
| | | * pipeline. |
| | | * |
| | | * Logs a warning if the function has not been registered. |
| | | * |
| | | * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline. |
| | | * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline. |
| | | */ |
| | | lunr.Pipeline.prototype.after = function (existingFn, newFn) { |
| | | lunr.Pipeline.warnIfFunctionNotRegistered(newFn) |
| | | |
| | | var pos = this._stack.indexOf(existingFn) |
| | | if (pos == -1) { |
| | | throw new Error('Cannot find existingFn') |
| | | } |
| | | |
| | | pos = pos + 1 |
| | | this._stack.splice(pos, 0, newFn) |
| | | } |
| | | |
| | | /** |
| | | * Adds a single function before a function that already exists in the |
| | | * pipeline. |
| | | * |
| | | * Logs a warning if the function has not been registered. |
| | | * |
| | | * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline. |
| | | * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline. |
| | | */ |
| | | lunr.Pipeline.prototype.before = function (existingFn, newFn) { |
| | | lunr.Pipeline.warnIfFunctionNotRegistered(newFn) |
| | | |
| | | var pos = this._stack.indexOf(existingFn) |
| | | if (pos == -1) { |
| | | throw new Error('Cannot find existingFn') |
| | | } |
| | | |
| | | this._stack.splice(pos, 0, newFn) |
| | | } |
| | | |
| | | /** |
| | | * Removes a function from the pipeline. |
| | | * |
| | | * @param {lunr.PipelineFunction} fn The function to remove from the pipeline. |
| | | */ |
| | | lunr.Pipeline.prototype.remove = function (fn) { |
| | | var pos = this._stack.indexOf(fn) |
| | | if (pos == -1) { |
| | | return |
| | | } |
| | | |
| | | this._stack.splice(pos, 1) |
| | | } |
| | | |
| | | /** |
| | | * Runs the current list of functions that make up the pipeline against the |
| | | * passed tokens. |
| | | * |
| | | * @param {Array} tokens The tokens to run through the pipeline. |
| | | * @returns {Array} |
| | | */ |
| | | lunr.Pipeline.prototype.run = function (tokens) { |
| | | var stackLength = this._stack.length |
| | | |
| | | for (var i = 0; i < stackLength; i++) { |
| | | var fn = this._stack[i] |
| | | var memo = [] |
| | | |
| | | for (var j = 0; j < tokens.length; j++) { |
| | | var result = fn(tokens[j], j, tokens) |
| | | |
| | | if (result === null || result === void 0 || result === '') continue |
| | | |
| | | if (Array.isArray(result)) { |
| | | for (var k = 0; k < result.length; k++) { |
| | | memo.push(result[k]) |
| | | } |
| | | } else { |
| | | memo.push(result) |
| | | } |
| | | } |
| | | |
| | | tokens = memo |
| | | } |
| | | |
| | | return tokens |
| | | } |
| | | |
| | | /** |
| | | * Convenience method for passing a string through a pipeline and getting |
| | | * strings out. This method takes care of wrapping the passed string in a |
| | | * token and mapping the resulting tokens back to strings. |
| | | * |
| | | * @param {string} str - The string to pass through the pipeline. |
| | | * @param {?object} metadata - Optional metadata to associate with the token |
| | | * passed to the pipeline. |
| | | * @returns {string[]} |
| | | */ |
| | | lunr.Pipeline.prototype.runString = function (str, metadata) { |
| | | var token = new lunr.Token (str, metadata) |
| | | |
| | | return this.run([token]).map(function (t) { |
| | | return t.toString() |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * Resets the pipeline by removing any existing processors. |
| | | * |
| | | */ |
| | | lunr.Pipeline.prototype.reset = function () { |
| | | this._stack = [] |
| | | } |
| | | |
| | | /** |
| | | * Returns a representation of the pipeline ready for serialisation. |
| | | * |
| | | * Logs a warning if the function has not been registered. |
| | | * |
| | | * @returns {Array} |
| | | */ |
| | | lunr.Pipeline.prototype.toJSON = function () { |
| | | return this._stack.map(function (fn) { |
| | | lunr.Pipeline.warnIfFunctionNotRegistered(fn) |
| | | |
| | | return fn.label |
| | | }) |
| | | } |
| | | /*! |
| | | * lunr.Vector |
| | | * Copyright (C) 2020 Oliver Nightingale |
| | | */ |
| | | |
| | | /** |
| | | * A vector is used to construct the vector space of documents and queries. These |
| | | * vectors support operations to determine the similarity between two documents or |
| | | * a document and a query. |
| | | * |
| | | * Normally no parameters are required for initializing a vector, but in the case of |
| | | * loading a previously dumped vector the raw elements can be provided to the constructor. |
| | | * |
| | | * For performance reasons vectors are implemented with a flat array, where an elements |
| | | * index is immediately followed by its value. E.g. [index, value, index, value]. This |
| | | * allows the underlying array to be as sparse as possible and still offer decent |
| | | * performance when being used for vector calculations. |
| | | * |
| | | * @constructor |
| | | * @param {Number[]} [elements] - The flat list of element index and element value pairs. |
| | | */ |
| | | lunr.Vector = function (elements) { |
| | | this._magnitude = 0 |
| | | this.elements = elements || [] |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Calculates the position within the vector to insert a given index. |
| | | * |
| | | * This is used internally by insert and upsert. If there are duplicate indexes then |
| | | * the position is returned as if the value for that index were to be updated, but it |
| | | * is the callers responsibility to check whether there is a duplicate at that index |
| | | * |
| | | * @param {Number} insertIdx - The index at which the element should be inserted. |
| | | * @returns {Number} |
| | | */ |
| | | lunr.Vector.prototype.positionForIndex = function (index) { |
| | | // For an empty vector the tuple can be inserted at the beginning |
| | | if (this.elements.length == 0) { |
| | | return 0 |
| | | } |
| | | |
| | | var start = 0, |
| | | end = this.elements.length / 2, |
| | | sliceLength = end - start, |
| | | pivotPoint = Math.floor(sliceLength / 2), |
| | | pivotIndex = this.elements[pivotPoint * 2] |
| | | |
| | | while (sliceLength > 1) { |
| | | if (pivotIndex < index) { |
| | | start = pivotPoint |
| | | } |
| | | |
| | | if (pivotIndex > index) { |
| | | end = pivotPoint |
| | | } |
| | | |
| | | if (pivotIndex == index) { |
| | | break |
| | | } |
| | | |
| | | sliceLength = end - start |
| | | pivotPoint = start + Math.floor(sliceLength / 2) |
| | | pivotIndex = this.elements[pivotPoint * 2] |
| | | } |
| | | |
| | | if (pivotIndex == index) { |
| | | return pivotPoint * 2 |
| | | } |
| | | |
| | | if (pivotIndex > index) { |
| | | return pivotPoint * 2 |
| | | } |
| | | |
| | | if (pivotIndex < index) { |
| | | return (pivotPoint + 1) * 2 |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Inserts an element at an index within the vector. |
| | | * |
| | | * Does not allow duplicates, will throw an error if there is already an entry |
| | | * for this index. |
| | | * |
| | | * @param {Number} insertIdx - The index at which the element should be inserted. |
| | | * @param {Number} val - The value to be inserted into the vector. |
| | | */ |
| | | lunr.Vector.prototype.insert = function (insertIdx, val) { |
| | | this.upsert(insertIdx, val, function () { |
| | | throw "duplicate index" |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * Inserts or updates an existing index within the vector. |
| | | * |
| | | * @param {Number} insertIdx - The index at which the element should be inserted. |
| | | * @param {Number} val - The value to be inserted into the vector. |
| | | * @param {function} fn - A function that is called for updates, the existing value and the |
| | | * requested value are passed as arguments |
| | | */ |
| | | lunr.Vector.prototype.upsert = function (insertIdx, val, fn) { |
| | | this._magnitude = 0 |
| | | var position = this.positionForIndex(insertIdx) |
| | | |
| | | if (this.elements[position] == insertIdx) { |
| | | this.elements[position + 1] = fn(this.elements[position + 1], val) |
| | | } else { |
| | | this.elements.splice(position, 0, insertIdx, val) |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Calculates the magnitude of this vector. |
| | | * |
| | | * @returns {Number} |
| | | */ |
| | | lunr.Vector.prototype.magnitude = function () { |
| | | if (this._magnitude) return this._magnitude |
| | | |
| | | var sumOfSquares = 0, |
| | | elementsLength = this.elements.length |
| | | |
| | | for (var i = 1; i < elementsLength; i += 2) { |
| | | var val = this.elements[i] |
| | | sumOfSquares += val * val |
| | | } |
| | | |
| | | return this._magnitude = Math.sqrt(sumOfSquares) |
| | | } |
| | | |
| | | /** |
| | | * Calculates the dot product of this vector and another vector. |
| | | * |
| | | * @param {lunr.Vector} otherVector - The vector to compute the dot product with. |
| | | * @returns {Number} |
| | | */ |
| | | lunr.Vector.prototype.dot = function (otherVector) { |
| | | var dotProduct = 0, |
| | | a = this.elements, b = otherVector.elements, |
| | | aLen = a.length, bLen = b.length, |
| | | aVal = 0, bVal = 0, |
| | | i = 0, j = 0 |
| | | |
| | | while (i < aLen && j < bLen) { |
| | | aVal = a[i], bVal = b[j] |
| | | if (aVal < bVal) { |
| | | i += 2 |
| | | } else if (aVal > bVal) { |
| | | j += 2 |
| | | } else if (aVal == bVal) { |
| | | dotProduct += a[i + 1] * b[j + 1] |
| | | i += 2 |
| | | j += 2 |
| | | } |
| | | } |
| | | |
| | | return dotProduct |
| | | } |
| | | |
| | | /** |
| | | * Calculates the similarity between this vector and another vector. |
| | | * |
| | | * @param {lunr.Vector} otherVector - The other vector to calculate the |
| | | * similarity with. |
| | | * @returns {Number} |
| | | */ |
| | | lunr.Vector.prototype.similarity = function (otherVector) { |
| | | return this.dot(otherVector) / this.magnitude() || 0 |
| | | } |
| | | |
| | | /** |
| | | * Converts the vector to an array of the elements within the vector. |
| | | * |
| | | * @returns {Number[]} |
| | | */ |
| | | lunr.Vector.prototype.toArray = function () { |
| | | var output = new Array (this.elements.length / 2) |
| | | |
| | | for (var i = 1, j = 0; i < this.elements.length; i += 2, j++) { |
| | | output[j] = this.elements[i] |
| | | } |
| | | |
| | | return output |
| | | } |
| | | |
| | | /** |
| | | * A JSON serializable representation of the vector. |
| | | * |
| | | * @returns {Number[]} |
| | | */ |
| | | lunr.Vector.prototype.toJSON = function () { |
| | | return this.elements |
| | | } |
| | | /* eslint-disable */ |
| | | /*! |
| | | * lunr.stemmer |
| | | * Copyright (C) 2020 Oliver Nightingale |
| | | * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt |
| | | */ |
| | | |
| | | /** |
| | | * lunr.stemmer is an english language stemmer, this is a JavaScript |
| | | * implementation of the PorterStemmer taken from http://tartarus.org/~martin |
| | | * |
| | | * @static |
| | | * @implements {lunr.PipelineFunction} |
| | | * @param {lunr.Token} token - The string to stem |
| | | * @returns {lunr.Token} |
| | | * @see {@link lunr.Pipeline} |
| | | * @function |
| | | */ |
| | | lunr.stemmer = (function(){ |
| | | var step2list = { |
| | | "ational" : "ate", |
| | | "tional" : "tion", |
| | | "enci" : "ence", |
| | | "anci" : "ance", |
| | | "izer" : "ize", |
| | | "bli" : "ble", |
| | | "alli" : "al", |
| | | "entli" : "ent", |
| | | "eli" : "e", |
| | | "ousli" : "ous", |
| | | "ization" : "ize", |
| | | "ation" : "ate", |
| | | "ator" : "ate", |
| | | "alism" : "al", |
| | | "iveness" : "ive", |
| | | "fulness" : "ful", |
| | | "ousness" : "ous", |
| | | "aliti" : "al", |
| | | "iviti" : "ive", |
| | | "biliti" : "ble", |
| | | "logi" : "log" |
| | | }, |
| | | |
| | | step3list = { |
| | | "icate" : "ic", |
| | | "ative" : "", |
| | | "alize" : "al", |
| | | "iciti" : "ic", |
| | | "ical" : "ic", |
| | | "ful" : "", |
| | | "ness" : "" |
| | | }, |
| | | |
| | | c = "[^aeiou]", // consonant |
| | | v = "[aeiouy]", // vowel |
| | | C = c + "[^aeiouy]*", // consonant sequence |
| | | V = v + "[aeiou]*", // vowel sequence |
| | | |
| | | mgr0 = "^(" + C + ")?" + V + C, // [C]VC... is m>0 |
| | | meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$", // [C]VC[V] is m=1 |
| | | mgr1 = "^(" + C + ")?" + V + C + V + C, // [C]VCVC... is m>1 |
| | | s_v = "^(" + C + ")?" + v; // vowel in stem |
| | | |
| | | var re_mgr0 = new RegExp(mgr0); |
| | | var re_mgr1 = new RegExp(mgr1); |
| | | var re_meq1 = new RegExp(meq1); |
| | | var re_s_v = new RegExp(s_v); |
| | | |
| | | var re_1a = /^(.+?)(ss|i)es$/; |
| | | var re2_1a = /^(.+?)([^s])s$/; |
| | | var re_1b = /^(.+?)eed$/; |
| | | var re2_1b = /^(.+?)(ed|ing)$/; |
| | | var re_1b_2 = /.$/; |
| | | var re2_1b_2 = /(at|bl|iz)$/; |
| | | var re3_1b_2 = new RegExp("([^aeiouylsz])\\1$"); |
| | | var re4_1b_2 = new RegExp("^" + C + v + "[^aeiouwxy]$"); |
| | | |
| | | var re_1c = /^(.+?[^aeiou])y$/; |
| | | var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; |
| | | |
| | | var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; |
| | | |
| | | var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; |
| | | var re2_4 = /^(.+?)(s|t)(ion)$/; |
| | | |
| | | var re_5 = /^(.+?)e$/; |
| | | var re_5_1 = /ll$/; |
| | | var re3_5 = new RegExp("^" + C + v + "[^aeiouwxy]$"); |
| | | |
| | | var porterStemmer = function porterStemmer(w) { |
| | | var stem, |
| | | suffix, |
| | | firstch, |
| | | re, |
| | | re2, |
| | | re3, |
| | | re4; |
| | | |
| | | if (w.length < 3) { return w; } |
| | | |
| | | firstch = w.substr(0,1); |
| | | if (firstch == "y") { |
| | | w = firstch.toUpperCase() + w.substr(1); |
| | | } |
| | | |
| | | // Step 1a |
| | | re = re_1a |
| | | re2 = re2_1a; |
| | | |
| | | if (re.test(w)) { w = w.replace(re,"$1$2"); } |
| | | else if (re2.test(w)) { w = w.replace(re2,"$1$2"); } |
| | | |
| | | // Step 1b |
| | | re = re_1b; |
| | | re2 = re2_1b; |
| | | if (re.test(w)) { |
| | | var fp = re.exec(w); |
| | | re = re_mgr0; |
| | | if (re.test(fp[1])) { |
| | | re = re_1b_2; |
| | | w = w.replace(re,""); |
| | | } |
| | | } else if (re2.test(w)) { |
| | | var fp = re2.exec(w); |
| | | stem = fp[1]; |
| | | re2 = re_s_v; |
| | | if (re2.test(stem)) { |
| | | w = stem; |
| | | re2 = re2_1b_2; |
| | | re3 = re3_1b_2; |
| | | re4 = re4_1b_2; |
| | | if (re2.test(w)) { w = w + "e"; } |
| | | else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,""); } |
| | | else if (re4.test(w)) { w = w + "e"; } |
| | | } |
| | | } |
| | | |
| | | // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say) |
| | | re = re_1c; |
| | | if (re.test(w)) { |
| | | var fp = re.exec(w); |
| | | stem = fp[1]; |
| | | w = stem + "i"; |
| | | } |
| | | |
| | | // Step 2 |
| | | re = re_2; |
| | | if (re.test(w)) { |
| | | var fp = re.exec(w); |
| | | stem = fp[1]; |
| | | suffix = fp[2]; |
| | | re = re_mgr0; |
| | | if (re.test(stem)) { |
| | | w = stem + step2list[suffix]; |
| | | } |
| | | } |
| | | |
| | | // Step 3 |
| | | re = re_3; |
| | | if (re.test(w)) { |
| | | var fp = re.exec(w); |
| | | stem = fp[1]; |
| | | suffix = fp[2]; |
| | | re = re_mgr0; |
| | | if (re.test(stem)) { |
| | | w = stem + step3list[suffix]; |
| | | } |
| | | } |
| | | |
| | | // Step 4 |
| | | re = re_4; |
| | | re2 = re2_4; |
| | | if (re.test(w)) { |
| | | var fp = re.exec(w); |
| | | stem = fp[1]; |
| | | re = re_mgr1; |
| | | if (re.test(stem)) { |
| | | w = stem; |
| | | } |
| | | } else if (re2.test(w)) { |
| | | var fp = re2.exec(w); |
| | | stem = fp[1] + fp[2]; |
| | | re2 = re_mgr1; |
| | | if (re2.test(stem)) { |
| | | w = stem; |
| | | } |
| | | } |
| | | |
| | | // Step 5 |
| | | re = re_5; |
| | | if (re.test(w)) { |
| | | var fp = re.exec(w); |
| | | stem = fp[1]; |
| | | re = re_mgr1; |
| | | re2 = re_meq1; |
| | | re3 = re3_5; |
| | | if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) { |
| | | w = stem; |
| | | } |
| | | } |
| | | |
| | | re = re_5_1; |
| | | re2 = re_mgr1; |
| | | if (re.test(w) && re2.test(w)) { |
| | | re = re_1b_2; |
| | | w = w.replace(re,""); |
| | | } |
| | | |
| | | // and turn initial Y back to y |
| | | |
| | | if (firstch == "y") { |
| | | w = firstch.toLowerCase() + w.substr(1); |
| | | } |
| | | |
| | | return w; |
| | | }; |
| | | |
| | | return function (token) { |
| | | return token.update(porterStemmer); |
| | | } |
| | | })(); |
| | | |
| | | lunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer') |
| | | /*! |
| | | * lunr.stopWordFilter |
| | | * Copyright (C) 2020 Oliver Nightingale |
| | | */ |
| | | |
| | | /** |
| | | * lunr.generateStopWordFilter builds a stopWordFilter function from the provided |
| | | * list of stop words. |
| | | * |
| | | * The built in lunr.stopWordFilter is built using this generator and can be used |
| | | * to generate custom stopWordFilters for applications or non English languages. |
| | | * |
| | | * @function |
| | | * @param {Array} token The token to pass through the filter |
| | | * @returns {lunr.PipelineFunction} |
| | | * @see lunr.Pipeline |
| | | * @see lunr.stopWordFilter |
| | | */ |
| | | lunr.generateStopWordFilter = function (stopWords) { |
| | | var words = stopWords.reduce(function (memo, stopWord) { |
| | | memo[stopWord] = stopWord |
| | | return memo |
| | | }, {}) |
| | | |
| | | return function (token) { |
| | | if (token && words[token.toString()] !== token.toString()) return token |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * lunr.stopWordFilter is an English language stop word list filter, any words |
| | | * contained in the list will not be passed through the filter. |
| | | * |
| | | * This is intended to be used in the Pipeline. If the token does not pass the |
| | | * filter then undefined will be returned. |
| | | * |
| | | * @function |
| | | * @implements {lunr.PipelineFunction} |
| | | * @params {lunr.Token} token - A token to check for being a stop word. |
| | | * @returns {lunr.Token} |
| | | * @see {@link lunr.Pipeline} |
| | | */ |
| | | lunr.stopWordFilter = lunr.generateStopWordFilter([ |
| | | 'a', |
| | | 'able', |
| | | 'about', |
| | | 'across', |
| | | 'after', |
| | | 'all', |
| | | 'almost', |
| | | 'also', |
| | | 'am', |
| | | 'among', |
| | | 'an', |
| | | 'and', |
| | | 'any', |
| | | 'are', |
| | | 'as', |
| | | 'at', |
| | | 'be', |
| | | 'because', |
| | | 'been', |
| | | 'but', |
| | | 'by', |
| | | 'can', |
| | | 'cannot', |
| | | 'could', |
| | | 'dear', |
| | | 'did', |
| | | 'do', |
| | | 'does', |
| | | 'either', |
| | | 'else', |
| | | 'ever', |
| | | 'every', |
| | | 'for', |
| | | 'from', |
| | | 'get', |
| | | 'got', |
| | | 'had', |
| | | 'has', |
| | | 'have', |
| | | 'he', |
| | | 'her', |
| | | 'hers', |
| | | 'him', |
| | | 'his', |
| | | 'how', |
| | | 'however', |
| | | 'i', |
| | | 'if', |
| | | 'in', |
| | | 'into', |
| | | 'is', |
| | | 'it', |
| | | 'its', |
| | | 'just', |
| | | 'least', |
| | | 'let', |
| | | 'like', |
| | | 'likely', |
| | | 'may', |
| | | 'me', |
| | | 'might', |
| | | 'most', |
| | | 'must', |
| | | 'my', |
| | | 'neither', |
| | | 'no', |
| | | 'nor', |
| | | 'not', |
| | | 'of', |
| | | 'off', |
| | | 'often', |
| | | 'on', |
| | | 'only', |
| | | 'or', |
| | | 'other', |
| | | 'our', |
| | | 'own', |
| | | 'rather', |
| | | 'said', |
| | | 'say', |
| | | 'says', |
| | | 'she', |
| | | 'should', |
| | | 'since', |
| | | 'so', |
| | | 'some', |
| | | 'than', |
| | | 'that', |
| | | 'the', |
| | | 'their', |
| | | 'them', |
| | | 'then', |
| | | 'there', |
| | | 'these', |
| | | 'they', |
| | | 'this', |
| | | 'tis', |
| | | 'to', |
| | | 'too', |
| | | 'twas', |
| | | 'us', |
| | | 'wants', |
| | | 'was', |
| | | 'we', |
| | | 'were', |
| | | 'what', |
| | | 'when', |
| | | 'where', |
| | | 'which', |
| | | 'while', |
| | | 'who', |
| | | 'whom', |
| | | 'why', |
| | | 'will', |
| | | 'with', |
| | | 'would', |
| | | 'yet', |
| | | 'you', |
| | | 'your' |
| | | ]) |
| | | |
| | | lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter') |
| | | /*! |
| | | * lunr.trimmer |
| | | * Copyright (C) 2020 Oliver Nightingale |
| | | */ |
| | | |
| | | /** |
| | | * lunr.trimmer is a pipeline function for trimming non word |
| | | * characters from the beginning and end of tokens before they |
| | | * enter the index. |
| | | * |
| | | * This implementation may not work correctly for non latin |
| | | * characters and should either be removed or adapted for use |
| | | * with languages with non-latin characters. |
| | | * |
| | | * @static |
| | | * @implements {lunr.PipelineFunction} |
| | | * @param {lunr.Token} token The token to pass through the filter |
| | | * @returns {lunr.Token} |
| | | * @see lunr.Pipeline |
| | | */ |
| | | lunr.trimmer = function (token) { |
| | | return token.update(function (s) { |
| | | return s.replace(/^\W+/, '').replace(/\W+$/, '') |
| | | }) |
| | | } |
| | | |
| | | lunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer') |
| | | /*! |
| | | * lunr.TokenSet |
| | | * Copyright (C) 2020 Oliver Nightingale |
| | | */ |
| | | |
| | | /** |
| | | * A token set is used to store the unique list of all tokens |
| | | * within an index. Token sets are also used to represent an |
| | | * incoming query to the index, this query token set and index |
| | | * token set are then intersected to find which tokens to look |
| | | * up in the inverted index. |
| | | * |
| | | * A token set can hold multiple tokens, as in the case of the |
| | | * index token set, or it can hold a single token as in the |
| | | * case of a simple query token set. |
| | | * |
| | | * Additionally token sets are used to perform wildcard matching. |
| | | * Leading, contained and trailing wildcards are supported, and |
| | | * from this edit distance matching can also be provided. |
| | | * |
| | | * Token sets are implemented as a minimal finite state automata, |
| | | * where both common prefixes and suffixes are shared between tokens. |
| | | * This helps to reduce the space used for storing the token set. |
| | | * |
| | | * @constructor |
| | | */ |
| | | lunr.TokenSet = function () { |
| | | this.final = false |
| | | this.edges = {} |
| | | this.id = lunr.TokenSet._nextId |
| | | lunr.TokenSet._nextId += 1 |
| | | } |
| | | |
| | | /** |
| | | * Keeps track of the next, auto increment, identifier to assign |
| | | * to a new tokenSet. |
| | | * |
| | | * TokenSets require a unique identifier to be correctly minimised. |
| | | * |
| | | * @private |
| | | */ |
| | | lunr.TokenSet._nextId = 1 |
| | | |
| | | /** |
| | | * Creates a TokenSet instance from the given sorted array of words. |
| | | * |
| | | * @param {String[]} arr - A sorted array of strings to create the set from. |
| | | * @returns {lunr.TokenSet} |
| | | * @throws Will throw an error if the input array is not sorted. |
| | | */ |
| | | lunr.TokenSet.fromArray = function (arr) { |
| | | var builder = new lunr.TokenSet.Builder |
| | | |
| | | for (var i = 0, len = arr.length; i < len; i++) { |
| | | builder.insert(arr[i]) |
| | | } |
| | | |
| | | builder.finish() |
| | | return builder.root |
| | | } |
| | | |
| | | /** |
| | | * Creates a token set from a query clause. |
| | | * |
| | | * @private |
| | | * @param {Object} clause - A single clause from lunr.Query. |
| | | * @param {string} clause.term - The query clause term. |
| | | * @param {number} [clause.editDistance] - The optional edit distance for the term. |
| | | * @returns {lunr.TokenSet} |
| | | */ |
| | | lunr.TokenSet.fromClause = function (clause) { |
| | | if ('editDistance' in clause) { |
| | | return lunr.TokenSet.fromFuzzyString(clause.term, clause.editDistance) |
| | | } else { |
| | | return lunr.TokenSet.fromString(clause.term) |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Creates a token set representing a single string with a specified |
| | | * edit distance. |
| | | * |
| | | * Insertions, deletions, substitutions and transpositions are each |
| | | * treated as an edit distance of 1. |
| | | * |
| | | * Increasing the allowed edit distance will have a dramatic impact |
| | | * on the performance of both creating and intersecting these TokenSets. |
| | | * It is advised to keep the edit distance less than 3. |
| | | * |
| | | * @param {string} str - The string to create the token set from. |
| | | * @param {number} editDistance - The allowed edit distance to match. |
| | | * @returns {lunr.Vector} |
| | | */ |
| | | lunr.TokenSet.fromFuzzyString = function (str, editDistance) { |
| | | var root = new lunr.TokenSet |
| | | |
| | | var stack = [{ |
| | | node: root, |
| | | editsRemaining: editDistance, |
| | | str: str |
| | | }] |
| | | |
| | | while (stack.length) { |
| | | var frame = stack.pop() |
| | | |
| | | // no edit |
| | | if (frame.str.length > 0) { |
| | | var char = frame.str.charAt(0), |
| | | noEditNode |
| | | |
| | | if (char in frame.node.edges) { |
| | | noEditNode = frame.node.edges[char] |
| | | } else { |
| | | noEditNode = new lunr.TokenSet |
| | | frame.node.edges[char] = noEditNode |
| | | } |
| | | |
| | | if (frame.str.length == 1) { |
| | | noEditNode.final = true |
| | | } |
| | | |
| | | stack.push({ |
| | | node: noEditNode, |
| | | editsRemaining: frame.editsRemaining, |
| | | str: frame.str.slice(1) |
| | | }) |
| | | } |
| | | |
| | | if (frame.editsRemaining == 0) { |
| | | continue |
| | | } |
| | | |
| | | // insertion |
| | | if ("*" in frame.node.edges) { |
| | | var insertionNode = frame.node.edges["*"] |
| | | } else { |
| | | var insertionNode = new lunr.TokenSet |
| | | frame.node.edges["*"] = insertionNode |
| | | } |
| | | |
| | | if (frame.str.length == 0) { |
| | | insertionNode.final = true |
| | | } |
| | | |
| | | stack.push({ |
| | | node: insertionNode, |
| | | editsRemaining: frame.editsRemaining - 1, |
| | | str: frame.str |
| | | }) |
| | | |
| | | // deletion |
| | | // can only do a deletion if we have enough edits remaining |
| | | // and if there are characters left to delete in the string |
| | | if (frame.str.length > 1) { |
| | | stack.push({ |
| | | node: frame.node, |
| | | editsRemaining: frame.editsRemaining - 1, |
| | | str: frame.str.slice(1) |
| | | }) |
| | | } |
| | | |
| | | // deletion |
| | | // just removing the last character from the str |
| | | if (frame.str.length == 1) { |
| | | frame.node.final = true |
| | | } |
| | | |
| | | // substitution |
| | | // can only do a substitution if we have enough edits remaining |
| | | // and if there are characters left to substitute |
| | | if (frame.str.length >= 1) { |
| | | if ("*" in frame.node.edges) { |
| | | var substitutionNode = frame.node.edges["*"] |
| | | } else { |
| | | var substitutionNode = new lunr.TokenSet |
| | | frame.node.edges["*"] = substitutionNode |
| | | } |
| | | |
| | | if (frame.str.length == 1) { |
| | | substitutionNode.final = true |
| | | } |
| | | |
| | | stack.push({ |
| | | node: substitutionNode, |
| | | editsRemaining: frame.editsRemaining - 1, |
| | | str: frame.str.slice(1) |
| | | }) |
| | | } |
| | | |
| | | // transposition |
| | | // can only do a transposition if there are edits remaining |
| | | // and there are enough characters to transpose |
| | | if (frame.str.length > 1) { |
| | | var charA = frame.str.charAt(0), |
| | | charB = frame.str.charAt(1), |
| | | transposeNode |
| | | |
| | | if (charB in frame.node.edges) { |
| | | transposeNode = frame.node.edges[charB] |
| | | } else { |
| | | transposeNode = new lunr.TokenSet |
| | | frame.node.edges[charB] = transposeNode |
| | | } |
| | | |
| | | if (frame.str.length == 1) { |
| | | transposeNode.final = true |
| | | } |
| | | |
| | | stack.push({ |
| | | node: transposeNode, |
| | | editsRemaining: frame.editsRemaining - 1, |
| | | str: charA + frame.str.slice(2) |
| | | }) |
| | | } |
| | | } |
| | | |
| | | return root |
| | | } |
| | | |
| | | /** |
| | | * Creates a TokenSet from a string. |
| | | * |
| | | * The string may contain one or more wildcard characters (*) |
| | | * that will allow wildcard matching when intersecting with |
| | | * another TokenSet. |
| | | * |
| | | * @param {string} str - The string to create a TokenSet from. |
| | | * @returns {lunr.TokenSet} |
| | | */ |
| | | lunr.TokenSet.fromString = function (str) { |
| | | var node = new lunr.TokenSet, |
| | | root = node |
| | | |
| | | /* |
| | | * Iterates through all characters within the passed string |
| | | * appending a node for each character. |
| | | * |
| | | * When a wildcard character is found then a self |
| | | * referencing edge is introduced to continually match |
| | | * any number of any characters. |
| | | */ |
| | | for (var i = 0, len = str.length; i < len; i++) { |
| | | var char = str[i], |
| | | final = (i == len - 1) |
| | | |
| | | if (char == "*") { |
| | | node.edges[char] = node |
| | | node.final = final |
| | | |
| | | } else { |
| | | var next = new lunr.TokenSet |
| | | next.final = final |
| | | |
| | | node.edges[char] = next |
| | | node = next |
| | | } |
| | | } |
| | | |
| | | return root |
| | | } |
| | | |
| | | /** |
| | | * Converts this TokenSet into an array of strings |
| | | * contained within the TokenSet. |
| | | * |
| | | * This is not intended to be used on a TokenSet that |
| | | * contains wildcards, in these cases the results are |
| | | * undefined and are likely to cause an infinite loop. |
| | | * |
| | | * @returns {string[]} |
| | | */ |
| | | lunr.TokenSet.prototype.toArray = function () { |
| | | var words = [] |
| | | |
| | | var stack = [{ |
| | | prefix: "", |
| | | node: this |
| | | }] |
| | | |
| | | while (stack.length) { |
| | | var frame = stack.pop(), |
| | | edges = Object.keys(frame.node.edges), |
| | | len = edges.length |
| | | |
| | | if (frame.node.final) { |
| | | /* In Safari, at this point the prefix is sometimes corrupted, see: |
| | | * https://github.com/olivernn/lunr.js/issues/279 Calling any |
| | | * String.prototype method forces Safari to "cast" this string to what |
| | | * it's supposed to be, fixing the bug. */ |
| | | frame.prefix.charAt(0) |
| | | words.push(frame.prefix) |
| | | } |
| | | |
| | | for (var i = 0; i < len; i++) { |
| | | var edge = edges[i] |
| | | |
| | | stack.push({ |
| | | prefix: frame.prefix.concat(edge), |
| | | node: frame.node.edges[edge] |
| | | }) |
| | | } |
| | | } |
| | | |
| | | return words |
| | | } |
| | | |
| | | /** |
| | | * Generates a string representation of a TokenSet. |
| | | * |
| | | * This is intended to allow TokenSets to be used as keys |
| | | * in objects, largely to aid the construction and minimisation |
| | | * of a TokenSet. As such it is not designed to be a human |
| | | * friendly representation of the TokenSet. |
| | | * |
| | | * @returns {string} |
| | | */ |
| | | lunr.TokenSet.prototype.toString = function () { |
| | | // NOTE: Using Object.keys here as this.edges is very likely |
| | | // to enter 'hash-mode' with many keys being added |
| | | // |
| | | // avoiding a for-in loop here as it leads to the function |
| | | // being de-optimised (at least in V8). From some simple |
| | | // benchmarks the performance is comparable, but allowing |
| | | // V8 to optimize may mean easy performance wins in the future. |
| | | |
| | | if (this._str) { |
| | | return this._str |
| | | } |
| | | |
| | | var str = this.final ? '1' : '0', |
| | | labels = Object.keys(this.edges).sort(), |
| | | len = labels.length |
| | | |
| | | for (var i = 0; i < len; i++) { |
| | | var label = labels[i], |
| | | node = this.edges[label] |
| | | |
| | | str = str + label + node.id |
| | | } |
| | | |
| | | return str |
| | | } |
| | | |
| | | /** |
| | | * Returns a new TokenSet that is the intersection of |
| | | * this TokenSet and the passed TokenSet. |
| | | * |
| | | * This intersection will take into account any wildcards |
| | | * contained within the TokenSet. |
| | | * |
| | | * @param {lunr.TokenSet} b - An other TokenSet to intersect with. |
| | | * @returns {lunr.TokenSet} |
| | | */ |
| | | lunr.TokenSet.prototype.intersect = function (b) { |
| | | var output = new lunr.TokenSet, |
| | | frame = undefined |
| | | |
| | | var stack = [{ |
| | | qNode: b, |
| | | output: output, |
| | | node: this |
| | | }] |
| | | |
| | | while (stack.length) { |
| | | frame = stack.pop() |
| | | |
| | | // NOTE: As with the #toString method, we are using |
| | | // Object.keys and a for loop instead of a for-in loop |
| | | // as both of these objects enter 'hash' mode, causing |
| | | // the function to be de-optimised in V8 |
| | | var qEdges = Object.keys(frame.qNode.edges), |
| | | qLen = qEdges.length, |
| | | nEdges = Object.keys(frame.node.edges), |
| | | nLen = nEdges.length |
| | | |
| | | for (var q = 0; q < qLen; q++) { |
| | | var qEdge = qEdges[q] |
| | | |
| | | for (var n = 0; n < nLen; n++) { |
| | | var nEdge = nEdges[n] |
| | | |
| | | if (nEdge == qEdge || qEdge == '*') { |
| | | var node = frame.node.edges[nEdge], |
| | | qNode = frame.qNode.edges[qEdge], |
| | | final = node.final && qNode.final, |
| | | next = undefined |
| | | |
| | | if (nEdge in frame.output.edges) { |
| | | // an edge already exists for this character |
| | | // no need to create a new node, just set the finality |
| | | // bit unless this node is already final |
| | | next = frame.output.edges[nEdge] |
| | | next.final = next.final || final |
| | | |
| | | } else { |
| | | // no edge exists yet, must create one |
| | | // set the finality bit and insert it |
| | | // into the output |
| | | next = new lunr.TokenSet |
| | | next.final = final |
| | | frame.output.edges[nEdge] = next |
| | | } |
| | | |
| | | stack.push({ |
| | | qNode: qNode, |
| | | output: next, |
| | | node: node |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | return output |
| | | } |
| | | lunr.TokenSet.Builder = function () { |
| | | this.previousWord = "" |
| | | this.root = new lunr.TokenSet |
| | | this.uncheckedNodes = [] |
| | | this.minimizedNodes = {} |
| | | } |
| | | |
| | | lunr.TokenSet.Builder.prototype.insert = function (word) { |
| | | var node, |
| | | commonPrefix = 0 |
| | | |
| | | if (word < this.previousWord) { |
| | | throw new Error ("Out of order word insertion") |
| | | } |
| | | |
| | | for (var i = 0; i < word.length && i < this.previousWord.length; i++) { |
| | | if (word[i] != this.previousWord[i]) break |
| | | commonPrefix++ |
| | | } |
| | | |
| | | this.minimize(commonPrefix) |
| | | |
| | | if (this.uncheckedNodes.length == 0) { |
| | | node = this.root |
| | | } else { |
| | | node = this.uncheckedNodes[this.uncheckedNodes.length - 1].child |
| | | } |
| | | |
| | | for (var i = commonPrefix; i < word.length; i++) { |
| | | var nextNode = new lunr.TokenSet, |
| | | char = word[i] |
| | | |
| | | node.edges[char] = nextNode |
| | | |
| | | this.uncheckedNodes.push({ |
| | | parent: node, |
| | | char: char, |
| | | child: nextNode |
| | | }) |
| | | |
| | | node = nextNode |
| | | } |
| | | |
| | | node.final = true |
| | | this.previousWord = word |
| | | } |
| | | |
| | | lunr.TokenSet.Builder.prototype.finish = function () { |
| | | this.minimize(0) |
| | | } |
| | | |
| | | lunr.TokenSet.Builder.prototype.minimize = function (downTo) { |
| | | for (var i = this.uncheckedNodes.length - 1; i >= downTo; i--) { |
| | | var node = this.uncheckedNodes[i], |
| | | childKey = node.child.toString() |
| | | |
| | | if (childKey in this.minimizedNodes) { |
| | | node.parent.edges[node.char] = this.minimizedNodes[childKey] |
| | | } else { |
| | | // Cache the key for this node since |
| | | // we know it can't change anymore |
| | | node.child._str = childKey |
| | | |
| | | this.minimizedNodes[childKey] = node.child |
| | | } |
| | | |
| | | this.uncheckedNodes.pop() |
| | | } |
| | | } |
| | | /*! |
| | | * lunr.Index |
| | | * Copyright (C) 2020 Oliver Nightingale |
| | | */ |
| | | |
| | | /** |
| | | * An index contains the built index of all documents and provides a query interface |
| | | * to the index. |
| | | * |
| | | * Usually instances of lunr.Index will not be created using this constructor, instead |
| | | * lunr.Builder should be used to construct new indexes, or lunr.Index.load should be |
| | | * used to load previously built and serialized indexes. |
| | | * |
| | | * @constructor |
| | | * @param {Object} attrs - The attributes of the built search index. |
| | | * @param {Object} attrs.invertedIndex - An index of term/field to document reference. |
| | | * @param {Object<string, lunr.Vector>} attrs.fieldVectors - Field vectors |
| | | * @param {lunr.TokenSet} attrs.tokenSet - An set of all corpus tokens. |
| | | * @param {string[]} attrs.fields - The names of indexed document fields. |
| | | * @param {lunr.Pipeline} attrs.pipeline - The pipeline to use for search terms. |
| | | */ |
| | | lunr.Index = function (attrs) { |
| | | this.invertedIndex = attrs.invertedIndex |
| | | this.fieldVectors = attrs.fieldVectors |
| | | this.tokenSet = attrs.tokenSet |
| | | this.fields = attrs.fields |
| | | this.pipeline = attrs.pipeline |
| | | } |
| | | |
| | | /** |
| | | * A result contains details of a document matching a search query. |
| | | * @typedef {Object} lunr.Index~Result |
| | | * @property {string} ref - The reference of the document this result represents. |
| | | * @property {number} score - A number between 0 and 1 representing how similar this document is to the query. |
| | | * @property {lunr.MatchData} matchData - Contains metadata about this match including which term(s) caused the match. |
| | | */ |
| | | |
| | | /** |
| | | * Although lunr provides the ability to create queries using lunr.Query, it also provides a simple |
| | | * query language which itself is parsed into an instance of lunr.Query. |
| | | * |
| | | * For programmatically building queries it is advised to directly use lunr.Query, the query language |
| | | * is best used for human entered text rather than program generated text. |
| | | * |
| | | * At its simplest queries can just be a single term, e.g. `hello`, multiple terms are also supported |
| | | * and will be combined with OR, e.g `hello world` will match documents that contain either 'hello' |
| | | * or 'world', though those that contain both will rank higher in the results. |
| | | * |
| | | * Wildcards can be included in terms to match one or more unspecified characters, these wildcards can |
| | | * be inserted anywhere within the term, and more than one wildcard can exist in a single term. Adding |
| | | * wildcards will increase the number of documents that will be found but can also have a negative |
| | | * impact on query performance, especially with wildcards at the beginning of a term. |
| | | * |
| | | * Terms can be restricted to specific fields, e.g. `title:hello`, only documents with the term |
| | | * hello in the title field will match this query. Using a field not present in the index will lead |
| | | * to an error being thrown. |
| | | * |
| | | * Modifiers can also be added to terms, lunr supports edit distance and boost modifiers on terms. A term |
| | | * boost will make documents matching that term score higher, e.g. `foo^5`. Edit distance is also supported |
| | | * to provide fuzzy matching, e.g. 'hello~2' will match documents with hello with an edit distance of 2. |
| | | * Avoid large values for edit distance to improve query performance. |
| | | * |
| | | * Each term also supports a presence modifier. By default a term's presence in document is optional, however |
| | | * this can be changed to either required or prohibited. For a term's presence to be required in a document the |
| | | * term should be prefixed with a '+', e.g. `+foo bar` is a search for documents that must contain 'foo' and |
| | | * optionally contain 'bar'. Conversely a leading '-' sets the terms presence to prohibited, i.e. it must not |
| | | * appear in a document, e.g. `-foo bar` is a search for documents that do not contain 'foo' but may contain 'bar'. |
| | | * |
| | | * To escape special characters the backslash character '\' can be used, this allows searches to include |
| | | * characters that would normally be considered modifiers, e.g. `foo\~2` will search for a term "foo~2" instead |
| | | * of attempting to apply a boost of 2 to the search term "foo". |
| | | * |
| | | * @typedef {string} lunr.Index~QueryString |
| | | * @example <caption>Simple single term query</caption> |
| | | * hello |
| | | * @example <caption>Multiple term query</caption> |
| | | * hello world |
| | | * @example <caption>term scoped to a field</caption> |
| | | * title:hello |
| | | * @example <caption>term with a boost of 10</caption> |
| | | * hello^10 |
| | | * @example <caption>term with an edit distance of 2</caption> |
| | | * hello~2 |
| | | * @example <caption>terms with presence modifiers</caption> |
| | | * -foo +bar baz |
| | | */ |
| | | |
| | | /** |
| | | * Performs a search against the index using lunr query syntax. |
| | | * |
| | | * Results will be returned sorted by their score, the most relevant results |
| | | * will be returned first. For details on how the score is calculated, please see |
| | | * the {@link https://lunrjs.com/guides/searching.html#scoring|guide}. |
| | | * |
| | | * For more programmatic querying use lunr.Index#query. |
| | | * |
| | | * @param {lunr.Index~QueryString} queryString - A string containing a lunr query. |
| | | * @throws {lunr.QueryParseError} If the passed query string cannot be parsed. |
| | | * @returns {lunr.Index~Result[]} |
| | | */ |
| | | lunr.Index.prototype.search = function (queryString) { |
| | | return this.query(function (query) { |
| | | var parser = new lunr.QueryParser(queryString, query) |
| | | parser.parse() |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * A query builder callback provides a query object to be used to express |
| | | * the query to perform on the index. |
| | | * |
| | | * @callback lunr.Index~queryBuilder |
| | | * @param {lunr.Query} query - The query object to build up. |
| | | * @this lunr.Query |
| | | */ |
| | | |
| | | /** |
| | | * Performs a query against the index using the yielded lunr.Query object. |
| | | * |
| | | * If performing programmatic queries against the index, this method is preferred |
| | | * over lunr.Index#search so as to avoid the additional query parsing overhead. |
| | | * |
| | | * A query object is yielded to the supplied function which should be used to |
| | | * express the query to be run against the index. |
| | | * |
| | | * Note that although this function takes a callback parameter it is _not_ an |
| | | * asynchronous operation, the callback is just yielded a query object to be |
| | | * customized. |
| | | * |
| | | * @param {lunr.Index~queryBuilder} fn - A function that is used to build the query. |
| | | * @returns {lunr.Index~Result[]} |
| | | */ |
| | | lunr.Index.prototype.query = function (fn) { |
| | | // for each query clause |
| | | // * process terms |
| | | // * expand terms from token set |
| | | // * find matching documents and metadata |
| | | // * get document vectors |
| | | // * score documents |
| | | |
| | | var query = new lunr.Query(this.fields), |
| | | matchingFields = Object.create(null), |
| | | queryVectors = Object.create(null), |
| | | termFieldCache = Object.create(null), |
| | | requiredMatches = Object.create(null), |
| | | prohibitedMatches = Object.create(null) |
| | | |
| | | /* |
| | | * To support field level boosts a query vector is created per |
| | | * field. An empty vector is eagerly created to support negated |
| | | * queries. |
| | | */ |
| | | for (var i = 0; i < this.fields.length; i++) { |
| | | queryVectors[this.fields[i]] = new lunr.Vector |
| | | } |
| | | |
| | | fn.call(query, query) |
| | | |
| | | for (var i = 0; i < query.clauses.length; i++) { |
| | | /* |
| | | * Unless the pipeline has been disabled for this term, which is |
| | | * the case for terms with wildcards, we need to pass the clause |
| | | * term through the search pipeline. A pipeline returns an array |
| | | * of processed terms. Pipeline functions may expand the passed |
| | | * term, which means we may end up performing multiple index lookups |
| | | * for a single query term. |
| | | */ |
| | | var clause = query.clauses[i], |
| | | terms = null, |
| | | clauseMatches = lunr.Set.empty |
| | | |
| | | if (clause.usePipeline) { |
| | | terms = this.pipeline.runString(clause.term, { |
| | | fields: clause.fields |
| | | }) |
| | | } else { |
| | | terms = [clause.term] |
| | | } |
| | | |
| | | for (var m = 0; m < terms.length; m++) { |
| | | var term = terms[m] |
| | | |
| | | /* |
| | | * Each term returned from the pipeline needs to use the same query |
| | | * clause object, e.g. the same boost and or edit distance. The |
| | | * simplest way to do this is to re-use the clause object but mutate |
| | | * its term property. |
| | | */ |
| | | clause.term = term |
| | | |
| | | /* |
| | | * From the term in the clause we create a token set which will then |
| | | * be used to intersect the indexes token set to get a list of terms |
| | | * to lookup in the inverted index |
| | | */ |
| | | var termTokenSet = lunr.TokenSet.fromClause(clause), |
| | | expandedTerms = this.tokenSet.intersect(termTokenSet).toArray() |
| | | |
| | | /* |
| | | * If a term marked as required does not exist in the tokenSet it is |
| | | * impossible for the search to return any matches. We set all the field |
| | | * scoped required matches set to empty and stop examining any further |
| | | * clauses. |
| | | */ |
| | | if (expandedTerms.length === 0 && clause.presence === lunr.Query.presence.REQUIRED) { |
| | | for (var k = 0; k < clause.fields.length; k++) { |
| | | var field = clause.fields[k] |
| | | requiredMatches[field] = lunr.Set.empty |
| | | } |
| | | |
| | | break |
| | | } |
| | | |
| | | for (var j = 0; j < expandedTerms.length; j++) { |
| | | /* |
| | | * For each term get the posting and termIndex, this is required for |
| | | * building the query vector. |
| | | */ |
| | | var expandedTerm = expandedTerms[j], |
| | | posting = this.invertedIndex[expandedTerm], |
| | | termIndex = posting._index |
| | | |
| | | for (var k = 0; k < clause.fields.length; k++) { |
| | | /* |
| | | * For each field that this query term is scoped by (by default |
| | | * all fields are in scope) we need to get all the document refs |
| | | * that have this term in that field. |
| | | * |
| | | * The posting is the entry in the invertedIndex for the matching |
| | | * term from above. |
| | | */ |
| | | var field = clause.fields[k], |
| | | fieldPosting = posting[field], |
| | | matchingDocumentRefs = Object.keys(fieldPosting), |
| | | termField = expandedTerm + "/" + field, |
| | | matchingDocumentsSet = new lunr.Set(matchingDocumentRefs) |
| | | |
| | | /* |
| | | * if the presence of this term is required ensure that the matching |
| | | * documents are added to the set of required matches for this clause. |
| | | * |
| | | */ |
| | | if (clause.presence == lunr.Query.presence.REQUIRED) { |
| | | clauseMatches = clauseMatches.union(matchingDocumentsSet) |
| | | |
| | | if (requiredMatches[field] === undefined) { |
| | | requiredMatches[field] = lunr.Set.complete |
| | | } |
| | | } |
| | | |
| | | /* |
| | | * if the presence of this term is prohibited ensure that the matching |
| | | * documents are added to the set of prohibited matches for this field, |
| | | * creating that set if it does not yet exist. |
| | | */ |
| | | if (clause.presence == lunr.Query.presence.PROHIBITED) { |
| | | if (prohibitedMatches[field] === undefined) { |
| | | prohibitedMatches[field] = lunr.Set.empty |
| | | } |
| | | |
| | | prohibitedMatches[field] = prohibitedMatches[field].union(matchingDocumentsSet) |
| | | |
| | | /* |
| | | * Prohibited matches should not be part of the query vector used for |
| | | * similarity scoring and no metadata should be extracted so we continue |
| | | * to the next field |
| | | */ |
| | | continue |
| | | } |
| | | |
| | | /* |
| | | * The query field vector is populated using the termIndex found for |
| | | * the term and a unit value with the appropriate boost applied. |
| | | * Using upsert because there could already be an entry in the vector |
| | | * for the term we are working with. In that case we just add the scores |
| | | * together. |
| | | */ |
| | | queryVectors[field].upsert(termIndex, clause.boost, function (a, b) { return a + b }) |
| | | |
| | | /** |
| | | * If we've already seen this term, field combo then we've already collected |
| | | * the matching documents and metadata, no need to go through all that again |
| | | */ |
| | | if (termFieldCache[termField]) { |
| | | continue |
| | | } |
| | | |
| | | for (var l = 0; l < matchingDocumentRefs.length; l++) { |
| | | /* |
| | | * All metadata for this term/field/document triple |
| | | * are then extracted and collected into an instance |
| | | * of lunr.MatchData ready to be returned in the query |
| | | * results |
| | | */ |
| | | var matchingDocumentRef = matchingDocumentRefs[l], |
| | | matchingFieldRef = new lunr.FieldRef (matchingDocumentRef, field), |
| | | metadata = fieldPosting[matchingDocumentRef], |
| | | fieldMatch |
| | | |
| | | if ((fieldMatch = matchingFields[matchingFieldRef]) === undefined) { |
| | | matchingFields[matchingFieldRef] = new lunr.MatchData (expandedTerm, field, metadata) |
| | | } else { |
| | | fieldMatch.add(expandedTerm, field, metadata) |
| | | } |
| | | |
| | | } |
| | | |
| | | termFieldCache[termField] = true |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * If the presence was required we need to update the requiredMatches field sets. |
| | | * We do this after all fields for the term have collected their matches because |
| | | * the clause terms presence is required in _any_ of the fields not _all_ of the |
| | | * fields. |
| | | */ |
| | | if (clause.presence === lunr.Query.presence.REQUIRED) { |
| | | for (var k = 0; k < clause.fields.length; k++) { |
| | | var field = clause.fields[k] |
| | | requiredMatches[field] = requiredMatches[field].intersect(clauseMatches) |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Need to combine the field scoped required and prohibited |
| | | * matching documents into a global set of required and prohibited |
| | | * matches |
| | | */ |
| | | var allRequiredMatches = lunr.Set.complete, |
| | | allProhibitedMatches = lunr.Set.empty |
| | | |
| | | for (var i = 0; i < this.fields.length; i++) { |
| | | var field = this.fields[i] |
| | | |
| | | if (requiredMatches[field]) { |
| | | allRequiredMatches = allRequiredMatches.intersect(requiredMatches[field]) |
| | | } |
| | | |
| | | if (prohibitedMatches[field]) { |
| | | allProhibitedMatches = allProhibitedMatches.union(prohibitedMatches[field]) |
| | | } |
| | | } |
| | | |
| | | var matchingFieldRefs = Object.keys(matchingFields), |
| | | results = [], |
| | | matches = Object.create(null) |
| | | |
| | | /* |
| | | * If the query is negated (contains only prohibited terms) |
| | | * we need to get _all_ fieldRefs currently existing in the |
| | | * index. This is only done when we know that the query is |
| | | * entirely prohibited terms to avoid any cost of getting all |
| | | * fieldRefs unnecessarily. |
| | | * |
| | | * Additionally, blank MatchData must be created to correctly |
| | | * populate the results. |
| | | */ |
| | | if (query.isNegated()) { |
| | | matchingFieldRefs = Object.keys(this.fieldVectors) |
| | | |
| | | for (var i = 0; i < matchingFieldRefs.length; i++) { |
| | | var matchingFieldRef = matchingFieldRefs[i] |
| | | var fieldRef = lunr.FieldRef.fromString(matchingFieldRef) |
| | | matchingFields[matchingFieldRef] = new lunr.MatchData |
| | | } |
| | | } |
| | | |
| | | for (var i = 0; i < matchingFieldRefs.length; i++) { |
| | | /* |
| | | * Currently we have document fields that match the query, but we |
| | | * need to return documents. The matchData and scores are combined |
| | | * from multiple fields belonging to the same document. |
| | | * |
| | | * Scores are calculated by field, using the query vectors created |
| | | * above, and combined into a final document score using addition. |
| | | */ |
| | | var fieldRef = lunr.FieldRef.fromString(matchingFieldRefs[i]), |
| | | docRef = fieldRef.docRef |
| | | |
| | | if (!allRequiredMatches.contains(docRef)) { |
| | | continue |
| | | } |
| | | |
| | | if (allProhibitedMatches.contains(docRef)) { |
| | | continue |
| | | } |
| | | |
| | | var fieldVector = this.fieldVectors[fieldRef], |
| | | score = queryVectors[fieldRef.fieldName].similarity(fieldVector), |
| | | docMatch |
| | | |
| | | if ((docMatch = matches[docRef]) !== undefined) { |
| | | docMatch.score += score |
| | | docMatch.matchData.combine(matchingFields[fieldRef]) |
| | | } else { |
| | | var match = { |
| | | ref: docRef, |
| | | score: score, |
| | | matchData: matchingFields[fieldRef] |
| | | } |
| | | matches[docRef] = match |
| | | results.push(match) |
| | | } |
| | | } |
| | | |
| | | /* |
| | | * Sort the results objects by score, highest first. |
| | | */ |
| | | return results.sort(function (a, b) { |
| | | return b.score - a.score |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * Prepares the index for JSON serialization. |
| | | * |
| | | * The schema for this JSON blob will be described in a |
| | | * separate JSON schema file. |
| | | * |
| | | * @returns {Object} |
| | | */ |
| | | lunr.Index.prototype.toJSON = function () { |
| | | var invertedIndex = Object.keys(this.invertedIndex) |
| | | .sort() |
| | | .map(function (term) { |
| | | return [term, this.invertedIndex[term]] |
| | | }, this) |
| | | |
| | | var fieldVectors = Object.keys(this.fieldVectors) |
| | | .map(function (ref) { |
| | | return [ref, this.fieldVectors[ref].toJSON()] |
| | | }, this) |
| | | |
| | | return { |
| | | version: lunr.version, |
| | | fields: this.fields, |
| | | fieldVectors: fieldVectors, |
| | | invertedIndex: invertedIndex, |
| | | pipeline: this.pipeline.toJSON() |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Loads a previously serialized lunr.Index |
| | | * |
| | | * @param {Object} serializedIndex - A previously serialized lunr.Index |
| | | * @returns {lunr.Index} |
| | | */ |
| | | lunr.Index.load = function (serializedIndex) { |
| | | var attrs = {}, |
| | | fieldVectors = {}, |
| | | serializedVectors = serializedIndex.fieldVectors, |
| | | invertedIndex = Object.create(null), |
| | | serializedInvertedIndex = serializedIndex.invertedIndex, |
| | | tokenSetBuilder = new lunr.TokenSet.Builder, |
| | | pipeline = lunr.Pipeline.load(serializedIndex.pipeline) |
| | | |
| | | if (serializedIndex.version != lunr.version) { |
| | | lunr.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + lunr.version + "' does not match serialized index '" + serializedIndex.version + "'") |
| | | } |
| | | |
| | | for (var i = 0; i < serializedVectors.length; i++) { |
| | | var tuple = serializedVectors[i], |
| | | ref = tuple[0], |
| | | elements = tuple[1] |
| | | |
| | | fieldVectors[ref] = new lunr.Vector(elements) |
| | | } |
| | | |
| | | for (var i = 0; i < serializedInvertedIndex.length; i++) { |
| | | var tuple = serializedInvertedIndex[i], |
| | | term = tuple[0], |
| | | posting = tuple[1] |
| | | |
| | | tokenSetBuilder.insert(term) |
| | | invertedIndex[term] = posting |
| | | } |
| | | |
| | | tokenSetBuilder.finish() |
| | | |
| | | attrs.fields = serializedIndex.fields |
| | | |
| | | attrs.fieldVectors = fieldVectors |
| | | attrs.invertedIndex = invertedIndex |
| | | attrs.tokenSet = tokenSetBuilder.root |
| | | attrs.pipeline = pipeline |
| | | |
| | | return new lunr.Index(attrs) |
| | | } |
| | | /*! |
| | | * lunr.Builder |
| | | * Copyright (C) 2020 Oliver Nightingale |
| | | */ |
| | | |
| | | /** |
| | | * lunr.Builder performs indexing on a set of documents and |
| | | * returns instances of lunr.Index ready for querying. |
| | | * |
| | | * All configuration of the index is done via the builder, the |
| | | * fields to index, the document reference, the text processing |
| | | * pipeline and document scoring parameters are all set on the |
| | | * builder before indexing. |
| | | * |
| | | * @constructor |
| | | * @property {string} _ref - Internal reference to the document reference field. |
| | | * @property {string[]} _fields - Internal reference to the document fields to index. |
| | | * @property {object} invertedIndex - The inverted index maps terms to document fields. |
| | | * @property {object} documentTermFrequencies - Keeps track of document term frequencies. |
| | | * @property {object} documentLengths - Keeps track of the length of documents added to the index. |
| | | * @property {lunr.tokenizer} tokenizer - Function for splitting strings into tokens for indexing. |
| | | * @property {lunr.Pipeline} pipeline - The pipeline performs text processing on tokens before indexing. |
| | | * @property {lunr.Pipeline} searchPipeline - A pipeline for processing search terms before querying the index. |
| | | * @property {number} documentCount - Keeps track of the total number of documents indexed. |
| | | * @property {number} _b - A parameter to control field length normalization, setting this to 0 disabled normalization, 1 fully normalizes field lengths, the default value is 0.75. |
| | | * @property {number} _k1 - A parameter to control how quickly an increase in term frequency results in term frequency saturation, the default value is 1.2. |
| | | * @property {number} termIndex - A counter incremented for each unique term, used to identify a terms position in the vector space. |
| | | * @property {array} metadataWhitelist - A list of metadata keys that have been whitelisted for entry in the index. |
| | | */ |
| | | lunr.Builder = function () { |
| | | this._ref = "id" |
| | | this._fields = Object.create(null) |
| | | this._documents = Object.create(null) |
| | | this.invertedIndex = Object.create(null) |
| | | this.fieldTermFrequencies = {} |
| | | this.fieldLengths = {} |
| | | this.tokenizer = lunr.tokenizer |
| | | this.pipeline = new lunr.Pipeline |
| | | this.searchPipeline = new lunr.Pipeline |
| | | this.documentCount = 0 |
| | | this._b = 0.75 |
| | | this._k1 = 1.2 |
| | | this.termIndex = 0 |
| | | this.metadataWhitelist = [] |
| | | } |
| | | |
| | | /** |
| | | * Sets the document field used as the document reference. Every document must have this field. |
| | | * The type of this field in the document should be a string, if it is not a string it will be |
| | | * coerced into a string by calling toString. |
| | | * |
| | | * The default ref is 'id'. |
| | | * |
| | | * The ref should _not_ be changed during indexing, it should be set before any documents are |
| | | * added to the index. Changing it during indexing can lead to inconsistent results. |
| | | * |
| | | * @param {string} ref - The name of the reference field in the document. |
| | | */ |
| | | lunr.Builder.prototype.ref = function (ref) { |
| | | this._ref = ref |
| | | } |
| | | |
| | | /** |
| | | * A function that is used to extract a field from a document. |
| | | * |
| | | * Lunr expects a field to be at the top level of a document, if however the field |
| | | * is deeply nested within a document an extractor function can be used to extract |
| | | * the right field for indexing. |
| | | * |
| | | * @callback fieldExtractor |
| | | * @param {object} doc - The document being added to the index. |
| | | * @returns {?(string|object|object[])} obj - The object that will be indexed for this field. |
| | | * @example <caption>Extracting a nested field</caption> |
| | | * function (doc) { return doc.nested.field } |
| | | */ |
| | | |
| | | /** |
| | | * Adds a field to the list of document fields that will be indexed. Every document being |
| | | * indexed should have this field. Null values for this field in indexed documents will |
| | | * not cause errors but will limit the chance of that document being retrieved by searches. |
| | | * |
| | | * All fields should be added before adding documents to the index. Adding fields after |
| | | * a document has been indexed will have no effect on already indexed documents. |
| | | * |
| | | * Fields can be boosted at build time. This allows terms within that field to have more |
| | | * importance when ranking search results. Use a field boost to specify that matches within |
| | | * one field are more important than other fields. |
| | | * |
| | | * @param {string} fieldName - The name of a field to index in all documents. |
| | | * @param {object} attributes - Optional attributes associated with this field. |
| | | * @param {number} [attributes.boost=1] - Boost applied to all terms within this field. |
| | | * @param {fieldExtractor} [attributes.extractor] - Function to extract a field from a document. |
| | | * @throws {RangeError} fieldName cannot contain unsupported characters '/' |
| | | */ |
| | | lunr.Builder.prototype.field = function (fieldName, attributes) { |
| | | if (/\//.test(fieldName)) { |
| | | throw new RangeError ("Field '" + fieldName + "' contains illegal character '/'") |
| | | } |
| | | |
| | | this._fields[fieldName] = attributes || {} |
| | | } |
| | | |
| | | /** |
| | | * A parameter to tune the amount of field length normalisation that is applied when |
| | | * calculating relevance scores. A value of 0 will completely disable any normalisation |
| | | * and a value of 1 will fully normalise field lengths. The default is 0.75. Values of b |
| | | * will be clamped to the range 0 - 1. |
| | | * |
| | | * @param {number} number - The value to set for this tuning parameter. |
| | | */ |
| | | lunr.Builder.prototype.b = function (number) { |
| | | if (number < 0) { |
| | | this._b = 0 |
| | | } else if (number > 1) { |
| | | this._b = 1 |
| | | } else { |
| | | this._b = number |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * A parameter that controls the speed at which a rise in term frequency results in term |
| | | * frequency saturation. The default value is 1.2. Setting this to a higher value will give |
| | | * slower saturation levels, a lower value will result in quicker saturation. |
| | | * |
| | | * @param {number} number - The value to set for this tuning parameter. |
| | | */ |
| | | lunr.Builder.prototype.k1 = function (number) { |
| | | this._k1 = number |
| | | } |
| | | |
| | | /** |
| | | * Adds a document to the index. |
| | | * |
| | | * Before adding fields to the index the index should have been fully setup, with the document |
| | | * ref and all fields to index already having been specified. |
| | | * |
| | | * The document must have a field name as specified by the ref (by default this is 'id') and |
| | | * it should have all fields defined for indexing, though null or undefined values will not |
| | | * cause errors. |
| | | * |
| | | * Entire documents can be boosted at build time. Applying a boost to a document indicates that |
| | | * this document should rank higher in search results than other documents. |
| | | * |
| | | * @param {object} doc - The document to add to the index. |
| | | * @param {object} attributes - Optional attributes associated with this document. |
| | | * @param {number} [attributes.boost=1] - Boost applied to all terms within this document. |
| | | */ |
| | | lunr.Builder.prototype.add = function (doc, attributes) { |
| | | var docRef = doc[this._ref], |
| | | fields = Object.keys(this._fields) |
| | | |
| | | this._documents[docRef] = attributes || {} |
| | | this.documentCount += 1 |
| | | |
| | | for (var i = 0; i < fields.length; i++) { |
| | | var fieldName = fields[i], |
| | | extractor = this._fields[fieldName].extractor, |
| | | field = extractor ? extractor(doc) : doc[fieldName], |
| | | tokens = this.tokenizer(field, { |
| | | fields: [fieldName] |
| | | }), |
| | | terms = this.pipeline.run(tokens), |
| | | fieldRef = new lunr.FieldRef (docRef, fieldName), |
| | | fieldTerms = Object.create(null) |
| | | |
| | | this.fieldTermFrequencies[fieldRef] = fieldTerms |
| | | this.fieldLengths[fieldRef] = 0 |
| | | |
| | | // store the length of this field for this document |
| | | this.fieldLengths[fieldRef] += terms.length |
| | | |
| | | // calculate term frequencies for this field |
| | | for (var j = 0; j < terms.length; j++) { |
| | | var term = terms[j] |
| | | |
| | | if (fieldTerms[term] == undefined) { |
| | | fieldTerms[term] = 0 |
| | | } |
| | | |
| | | fieldTerms[term] += 1 |
| | | |
| | | // add to inverted index |
| | | // create an initial posting if one doesn't exist |
| | | if (this.invertedIndex[term] == undefined) { |
| | | var posting = Object.create(null) |
| | | posting["_index"] = this.termIndex |
| | | this.termIndex += 1 |
| | | |
| | | for (var k = 0; k < fields.length; k++) { |
| | | posting[fields[k]] = Object.create(null) |
| | | } |
| | | |
| | | this.invertedIndex[term] = posting |
| | | } |
| | | |
| | | // add an entry for this term/fieldName/docRef to the invertedIndex |
| | | if (this.invertedIndex[term][fieldName][docRef] == undefined) { |
| | | this.invertedIndex[term][fieldName][docRef] = Object.create(null) |
| | | } |
| | | |
| | | // store all whitelisted metadata about this token in the |
| | | // inverted index |
| | | for (var l = 0; l < this.metadataWhitelist.length; l++) { |
| | | var metadataKey = this.metadataWhitelist[l], |
| | | metadata = term.metadata[metadataKey] |
| | | |
| | | if (this.invertedIndex[term][fieldName][docRef][metadataKey] == undefined) { |
| | | this.invertedIndex[term][fieldName][docRef][metadataKey] = [] |
| | | } |
| | | |
| | | this.invertedIndex[term][fieldName][docRef][metadataKey].push(metadata) |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Calculates the average document length for this index |
| | | * |
| | | * @private |
| | | */ |
| | | lunr.Builder.prototype.calculateAverageFieldLengths = function () { |
| | | |
| | | var fieldRefs = Object.keys(this.fieldLengths), |
| | | numberOfFields = fieldRefs.length, |
| | | accumulator = {}, |
| | | documentsWithField = {} |
| | | |
| | | for (var i = 0; i < numberOfFields; i++) { |
| | | var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]), |
| | | field = fieldRef.fieldName |
| | | |
| | | documentsWithField[field] || (documentsWithField[field] = 0) |
| | | documentsWithField[field] += 1 |
| | | |
| | | accumulator[field] || (accumulator[field] = 0) |
| | | accumulator[field] += this.fieldLengths[fieldRef] |
| | | } |
| | | |
| | | var fields = Object.keys(this._fields) |
| | | |
| | | for (var i = 0; i < fields.length; i++) { |
| | | var fieldName = fields[i] |
| | | accumulator[fieldName] = accumulator[fieldName] / documentsWithField[fieldName] |
| | | } |
| | | |
| | | this.averageFieldLength = accumulator |
| | | } |
| | | |
| | | /** |
| | | * Builds a vector space model of every document using lunr.Vector |
| | | * |
| | | * @private |
| | | */ |
| | | lunr.Builder.prototype.createFieldVectors = function () { |
| | | var fieldVectors = {}, |
| | | fieldRefs = Object.keys(this.fieldTermFrequencies), |
| | | fieldRefsLength = fieldRefs.length, |
| | | termIdfCache = Object.create(null) |
| | | |
| | | for (var i = 0; i < fieldRefsLength; i++) { |
| | | var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]), |
| | | fieldName = fieldRef.fieldName, |
| | | fieldLength = this.fieldLengths[fieldRef], |
| | | fieldVector = new lunr.Vector, |
| | | termFrequencies = this.fieldTermFrequencies[fieldRef], |
| | | terms = Object.keys(termFrequencies), |
| | | termsLength = terms.length |
| | | |
| | | |
| | | var fieldBoost = this._fields[fieldName].boost || 1, |
| | | docBoost = this._documents[fieldRef.docRef].boost || 1 |
| | | |
| | | for (var j = 0; j < termsLength; j++) { |
| | | var term = terms[j], |
| | | tf = termFrequencies[term], |
| | | termIndex = this.invertedIndex[term]._index, |
| | | idf, score, scoreWithPrecision |
| | | |
| | | if (termIdfCache[term] === undefined) { |
| | | idf = lunr.idf(this.invertedIndex[term], this.documentCount) |
| | | termIdfCache[term] = idf |
| | | } else { |
| | | idf = termIdfCache[term] |
| | | } |
| | | |
| | | score = idf * ((this._k1 + 1) * tf) / (this._k1 * (1 - this._b + this._b * (fieldLength / this.averageFieldLength[fieldName])) + tf) |
| | | score *= fieldBoost |
| | | score *= docBoost |
| | | scoreWithPrecision = Math.round(score * 1000) / 1000 |
| | | // Converts 1.23456789 to 1.234. |
| | | // Reducing the precision so that the vectors take up less |
| | | // space when serialised. Doing it now so that they behave |
| | | // the same before and after serialisation. Also, this is |
| | | // the fastest approach to reducing a number's precision in |
| | | // JavaScript. |
| | | |
| | | fieldVector.insert(termIndex, scoreWithPrecision) |
| | | } |
| | | |
| | | fieldVectors[fieldRef] = fieldVector |
| | | } |
| | | |
| | | this.fieldVectors = fieldVectors |
| | | } |
| | | |
| | | /** |
| | | * Creates a token set of all tokens in the index using lunr.TokenSet |
| | | * |
| | | * @private |
| | | */ |
| | | lunr.Builder.prototype.createTokenSet = function () { |
| | | this.tokenSet = lunr.TokenSet.fromArray( |
| | | Object.keys(this.invertedIndex).sort() |
| | | ) |
| | | } |
| | | |
| | | /** |
| | | * Builds the index, creating an instance of lunr.Index. |
| | | * |
| | | * This completes the indexing process and should only be called |
| | | * once all documents have been added to the index. |
| | | * |
| | | * @returns {lunr.Index} |
| | | */ |
| | | lunr.Builder.prototype.build = function () { |
| | | this.calculateAverageFieldLengths() |
| | | this.createFieldVectors() |
| | | this.createTokenSet() |
| | | |
| | | return new lunr.Index({ |
| | | invertedIndex: this.invertedIndex, |
| | | fieldVectors: this.fieldVectors, |
| | | tokenSet: this.tokenSet, |
| | | fields: Object.keys(this._fields), |
| | | pipeline: this.searchPipeline |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * Applies a plugin to the index builder. |
| | | * |
| | | * A plugin is a function that is called with the index builder as its context. |
| | | * Plugins can be used to customise or extend the behaviour of the index |
| | | * in some way. A plugin is just a function, that encapsulated the custom |
| | | * behaviour that should be applied when building the index. |
| | | * |
| | | * The plugin function will be called with the index builder as its argument, additional |
| | | * arguments can also be passed when calling use. The function will be called |
| | | * with the index builder as its context. |
| | | * |
| | | * @param {Function} plugin The plugin to apply. |
| | | */ |
| | | lunr.Builder.prototype.use = function (fn) { |
| | | var args = Array.prototype.slice.call(arguments, 1) |
| | | args.unshift(this) |
| | | fn.apply(this, args) |
| | | } |
| | | /** |
| | | * Contains and collects metadata about a matching document. |
| | | * A single instance of lunr.MatchData is returned as part of every |
| | | * lunr.Index~Result. |
| | | * |
| | | * @constructor |
| | | * @param {string} term - The term this match data is associated with |
| | | * @param {string} field - The field in which the term was found |
| | | * @param {object} metadata - The metadata recorded about this term in this field |
| | | * @property {object} metadata - A cloned collection of metadata associated with this document. |
| | | * @see {@link lunr.Index~Result} |
| | | */ |
| | | lunr.MatchData = function (term, field, metadata) { |
| | | var clonedMetadata = Object.create(null), |
| | | metadataKeys = Object.keys(metadata || {}) |
| | | |
| | | // Cloning the metadata to prevent the original |
| | | // being mutated during match data combination. |
| | | // Metadata is kept in an array within the inverted |
| | | // index so cloning the data can be done with |
| | | // Array#slice |
| | | for (var i = 0; i < metadataKeys.length; i++) { |
| | | var key = metadataKeys[i] |
| | | clonedMetadata[key] = metadata[key].slice() |
| | | } |
| | | |
| | | this.metadata = Object.create(null) |
| | | |
| | | if (term !== undefined) { |
| | | this.metadata[term] = Object.create(null) |
| | | this.metadata[term][field] = clonedMetadata |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * An instance of lunr.MatchData will be created for every term that matches a |
| | | * document. However only one instance is required in a lunr.Index~Result. This |
| | | * method combines metadata from another instance of lunr.MatchData with this |
| | | * objects metadata. |
| | | * |
| | | * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one. |
| | | * @see {@link lunr.Index~Result} |
| | | */ |
| | | lunr.MatchData.prototype.combine = function (otherMatchData) { |
| | | var terms = Object.keys(otherMatchData.metadata) |
| | | |
| | | for (var i = 0; i < terms.length; i++) { |
| | | var term = terms[i], |
| | | fields = Object.keys(otherMatchData.metadata[term]) |
| | | |
| | | if (this.metadata[term] == undefined) { |
| | | this.metadata[term] = Object.create(null) |
| | | } |
| | | |
| | | for (var j = 0; j < fields.length; j++) { |
| | | var field = fields[j], |
| | | keys = Object.keys(otherMatchData.metadata[term][field]) |
| | | |
| | | if (this.metadata[term][field] == undefined) { |
| | | this.metadata[term][field] = Object.create(null) |
| | | } |
| | | |
| | | for (var k = 0; k < keys.length; k++) { |
| | | var key = keys[k] |
| | | |
| | | if (this.metadata[term][field][key] == undefined) { |
| | | this.metadata[term][field][key] = otherMatchData.metadata[term][field][key] |
| | | } else { |
| | | this.metadata[term][field][key] = this.metadata[term][field][key].concat(otherMatchData.metadata[term][field][key]) |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Add metadata for a term/field pair to this instance of match data. |
| | | * |
| | | * @param {string} term - The term this match data is associated with |
| | | * @param {string} field - The field in which the term was found |
| | | * @param {object} metadata - The metadata recorded about this term in this field |
| | | */ |
| | | lunr.MatchData.prototype.add = function (term, field, metadata) { |
| | | if (!(term in this.metadata)) { |
| | | this.metadata[term] = Object.create(null) |
| | | this.metadata[term][field] = metadata |
| | | return |
| | | } |
| | | |
| | | if (!(field in this.metadata[term])) { |
| | | this.metadata[term][field] = metadata |
| | | return |
| | | } |
| | | |
| | | var metadataKeys = Object.keys(metadata) |
| | | |
| | | for (var i = 0; i < metadataKeys.length; i++) { |
| | | var key = metadataKeys[i] |
| | | |
| | | if (key in this.metadata[term][field]) { |
| | | this.metadata[term][field][key] = this.metadata[term][field][key].concat(metadata[key]) |
| | | } else { |
| | | this.metadata[term][field][key] = metadata[key] |
| | | } |
| | | } |
| | | } |
| | | /** |
| | | * A lunr.Query provides a programmatic way of defining queries to be performed |
| | | * against a {@link lunr.Index}. |
| | | * |
| | | * Prefer constructing a lunr.Query using the {@link lunr.Index#query} method |
| | | * so the query object is pre-initialized with the right index fields. |
| | | * |
| | | * @constructor |
| | | * @property {lunr.Query~Clause[]} clauses - An array of query clauses. |
| | | * @property {string[]} allFields - An array of all available fields in a lunr.Index. |
| | | */ |
| | | lunr.Query = function (allFields) { |
| | | this.clauses = [] |
| | | this.allFields = allFields |
| | | } |
| | | |
| | | /** |
| | | * Constants for indicating what kind of automatic wildcard insertion will be used when constructing a query clause. |
| | | * |
| | | * This allows wildcards to be added to the beginning and end of a term without having to manually do any string |
| | | * concatenation. |
| | | * |
| | | * The wildcard constants can be bitwise combined to select both leading and trailing wildcards. |
| | | * |
| | | * @constant |
| | | * @default |
| | | * @property {number} wildcard.NONE - The term will have no wildcards inserted, this is the default behaviour |
| | | * @property {number} wildcard.LEADING - Prepend the term with a wildcard, unless a leading wildcard already exists |
| | | * @property {number} wildcard.TRAILING - Append a wildcard to the term, unless a trailing wildcard already exists |
| | | * @see lunr.Query~Clause |
| | | * @see lunr.Query#clause |
| | | * @see lunr.Query#term |
| | | * @example <caption>query term with trailing wildcard</caption> |
| | | * query.term('foo', { wildcard: lunr.Query.wildcard.TRAILING }) |
| | | * @example <caption>query term with leading and trailing wildcard</caption> |
| | | * query.term('foo', { |
| | | * wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING |
| | | * }) |
| | | */ |
| | | |
| | | lunr.Query.wildcard = new String ("*") |
| | | lunr.Query.wildcard.NONE = 0 |
| | | lunr.Query.wildcard.LEADING = 1 |
| | | lunr.Query.wildcard.TRAILING = 2 |
| | | |
| | | /** |
| | | * Constants for indicating what kind of presence a term must have in matching documents. |
| | | * |
| | | * @constant |
| | | * @enum {number} |
| | | * @see lunr.Query~Clause |
| | | * @see lunr.Query#clause |
| | | * @see lunr.Query#term |
| | | * @example <caption>query term with required presence</caption> |
| | | * query.term('foo', { presence: lunr.Query.presence.REQUIRED }) |
| | | */ |
| | | lunr.Query.presence = { |
| | | /** |
| | | * Term's presence in a document is optional, this is the default value. |
| | | */ |
| | | OPTIONAL: 1, |
| | | |
| | | /** |
| | | * Term's presence in a document is required, documents that do not contain |
| | | * this term will not be returned. |
| | | */ |
| | | REQUIRED: 2, |
| | | |
| | | /** |
| | | * Term's presence in a document is prohibited, documents that do contain |
| | | * this term will not be returned. |
| | | */ |
| | | PROHIBITED: 3 |
| | | } |
| | | |
| | | /** |
| | | * A single clause in a {@link lunr.Query} contains a term and details on how to |
| | | * match that term against a {@link lunr.Index}. |
| | | * |
| | | * @typedef {Object} lunr.Query~Clause |
| | | * @property {string[]} fields - The fields in an index this clause should be matched against. |
| | | * @property {number} [boost=1] - Any boost that should be applied when matching this clause. |
| | | * @property {number} [editDistance] - Whether the term should have fuzzy matching applied, and how fuzzy the match should be. |
| | | * @property {boolean} [usePipeline] - Whether the term should be passed through the search pipeline. |
| | | * @property {number} [wildcard=lunr.Query.wildcard.NONE] - Whether the term should have wildcards appended or prepended. |
| | | * @property {number} [presence=lunr.Query.presence.OPTIONAL] - The terms presence in any matching documents. |
| | | */ |
| | | |
| | | /** |
| | | * Adds a {@link lunr.Query~Clause} to this query. |
| | | * |
| | | * Unless the clause contains the fields to be matched all fields will be matched. In addition |
| | | * a default boost of 1 is applied to the clause. |
| | | * |
| | | * @param {lunr.Query~Clause} clause - The clause to add to this query. |
| | | * @see lunr.Query~Clause |
| | | * @returns {lunr.Query} |
| | | */ |
| | | lunr.Query.prototype.clause = function (clause) { |
| | | if (!('fields' in clause)) { |
| | | clause.fields = this.allFields |
| | | } |
| | | |
| | | if (!('boost' in clause)) { |
| | | clause.boost = 1 |
| | | } |
| | | |
| | | if (!('usePipeline' in clause)) { |
| | | clause.usePipeline = true |
| | | } |
| | | |
| | | if (!('wildcard' in clause)) { |
| | | clause.wildcard = lunr.Query.wildcard.NONE |
| | | } |
| | | |
| | | if ((clause.wildcard & lunr.Query.wildcard.LEADING) && (clause.term.charAt(0) != lunr.Query.wildcard)) { |
| | | clause.term = "*" + clause.term |
| | | } |
| | | |
| | | if ((clause.wildcard & lunr.Query.wildcard.TRAILING) && (clause.term.slice(-1) != lunr.Query.wildcard)) { |
| | | clause.term = "" + clause.term + "*" |
| | | } |
| | | |
| | | if (!('presence' in clause)) { |
| | | clause.presence = lunr.Query.presence.OPTIONAL |
| | | } |
| | | |
| | | this.clauses.push(clause) |
| | | |
| | | return this |
| | | } |
| | | |
| | | /** |
| | | * A negated query is one in which every clause has a presence of |
| | | * prohibited. These queries require some special processing to return |
| | | * the expected results. |
| | | * |
| | | * @returns boolean |
| | | */ |
| | | lunr.Query.prototype.isNegated = function () { |
| | | for (var i = 0; i < this.clauses.length; i++) { |
| | | if (this.clauses[i].presence != lunr.Query.presence.PROHIBITED) { |
| | | return false |
| | | } |
| | | } |
| | | |
| | | return true |
| | | } |
| | | |
| | | /** |
| | | * Adds a term to the current query, under the covers this will create a {@link lunr.Query~Clause} |
| | | * to the list of clauses that make up this query. |
| | | * |
| | | * The term is used as is, i.e. no tokenization will be performed by this method. Instead conversion |
| | | * to a token or token-like string should be done before calling this method. |
| | | * |
| | | * The term will be converted to a string by calling `toString`. Multiple terms can be passed as an |
| | | * array, each term in the array will share the same options. |
| | | * |
| | | * @param {object|object[]} term - The term(s) to add to the query. |
| | | * @param {object} [options] - Any additional properties to add to the query clause. |
| | | * @returns {lunr.Query} |
| | | * @see lunr.Query#clause |
| | | * @see lunr.Query~Clause |
| | | * @example <caption>adding a single term to a query</caption> |
| | | * query.term("foo") |
| | | * @example <caption>adding a single term to a query and specifying search fields, term boost and automatic trailing wildcard</caption> |
| | | * query.term("foo", { |
| | | * fields: ["title"], |
| | | * boost: 10, |
| | | * wildcard: lunr.Query.wildcard.TRAILING |
| | | * }) |
| | | * @example <caption>using lunr.tokenizer to convert a string to tokens before using them as terms</caption> |
| | | * query.term(lunr.tokenizer("foo bar")) |
| | | */ |
| | | lunr.Query.prototype.term = function (term, options) { |
| | | if (Array.isArray(term)) { |
| | | term.forEach(function (t) { this.term(t, lunr.utils.clone(options)) }, this) |
| | | return this |
| | | } |
| | | |
| | | var clause = options || {} |
| | | clause.term = term.toString() |
| | | |
| | | this.clause(clause) |
| | | |
| | | return this |
| | | } |
| | | lunr.QueryParseError = function (message, start, end) { |
| | | this.name = "QueryParseError" |
| | | this.message = message |
| | | this.start = start |
| | | this.end = end |
| | | } |
| | | |
| | | lunr.QueryParseError.prototype = new Error |
| | | lunr.QueryLexer = function (str) { |
| | | this.lexemes = [] |
| | | this.str = str |
| | | this.length = str.length |
| | | this.pos = 0 |
| | | this.start = 0 |
| | | this.escapeCharPositions = [] |
| | | } |
| | | |
| | | lunr.QueryLexer.prototype.run = function () { |
| | | var state = lunr.QueryLexer.lexText |
| | | |
| | | while (state) { |
| | | state = state(this) |
| | | } |
| | | } |
| | | |
| | | lunr.QueryLexer.prototype.sliceString = function () { |
| | | var subSlices = [], |
| | | sliceStart = this.start, |
| | | sliceEnd = this.pos |
| | | |
| | | for (var i = 0; i < this.escapeCharPositions.length; i++) { |
| | | sliceEnd = this.escapeCharPositions[i] |
| | | subSlices.push(this.str.slice(sliceStart, sliceEnd)) |
| | | sliceStart = sliceEnd + 1 |
| | | } |
| | | |
| | | subSlices.push(this.str.slice(sliceStart, this.pos)) |
| | | this.escapeCharPositions.length = 0 |
| | | |
| | | return subSlices.join('') |
| | | } |
| | | |
| | | lunr.QueryLexer.prototype.emit = function (type) { |
| | | this.lexemes.push({ |
| | | type: type, |
| | | str: this.sliceString(), |
| | | start: this.start, |
| | | end: this.pos |
| | | }) |
| | | |
| | | this.start = this.pos |
| | | } |
| | | |
| | | lunr.QueryLexer.prototype.escapeCharacter = function () { |
| | | this.escapeCharPositions.push(this.pos - 1) |
| | | this.pos += 1 |
| | | } |
| | | |
| | | lunr.QueryLexer.prototype.next = function () { |
| | | if (this.pos >= this.length) { |
| | | return lunr.QueryLexer.EOS |
| | | } |
| | | |
| | | var char = this.str.charAt(this.pos) |
| | | this.pos += 1 |
| | | return char |
| | | } |
| | | |
| | | lunr.QueryLexer.prototype.width = function () { |
| | | return this.pos - this.start |
| | | } |
| | | |
| | | lunr.QueryLexer.prototype.ignore = function () { |
| | | if (this.start == this.pos) { |
| | | this.pos += 1 |
| | | } |
| | | |
| | | this.start = this.pos |
| | | } |
| | | |
| | | lunr.QueryLexer.prototype.backup = function () { |
| | | this.pos -= 1 |
| | | } |
| | | |
| | | lunr.QueryLexer.prototype.acceptDigitRun = function () { |
| | | var char, charCode |
| | | |
| | | do { |
| | | char = this.next() |
| | | charCode = char.charCodeAt(0) |
| | | } while (charCode > 47 && charCode < 58) |
| | | |
| | | if (char != lunr.QueryLexer.EOS) { |
| | | this.backup() |
| | | } |
| | | } |
| | | |
| | | lunr.QueryLexer.prototype.more = function () { |
| | | return this.pos < this.length |
| | | } |
| | | |
| | | lunr.QueryLexer.EOS = 'EOS' |
| | | lunr.QueryLexer.FIELD = 'FIELD' |
| | | lunr.QueryLexer.TERM = 'TERM' |
| | | lunr.QueryLexer.EDIT_DISTANCE = 'EDIT_DISTANCE' |
| | | lunr.QueryLexer.BOOST = 'BOOST' |
| | | lunr.QueryLexer.PRESENCE = 'PRESENCE' |
| | | |
| | | lunr.QueryLexer.lexField = function (lexer) { |
| | | lexer.backup() |
| | | lexer.emit(lunr.QueryLexer.FIELD) |
| | | lexer.ignore() |
| | | return lunr.QueryLexer.lexText |
| | | } |
| | | |
| | | lunr.QueryLexer.lexTerm = function (lexer) { |
| | | if (lexer.width() > 1) { |
| | | lexer.backup() |
| | | lexer.emit(lunr.QueryLexer.TERM) |
| | | } |
| | | |
| | | lexer.ignore() |
| | | |
| | | if (lexer.more()) { |
| | | return lunr.QueryLexer.lexText |
| | | } |
| | | } |
| | | |
| | | lunr.QueryLexer.lexEditDistance = function (lexer) { |
| | | lexer.ignore() |
| | | lexer.acceptDigitRun() |
| | | lexer.emit(lunr.QueryLexer.EDIT_DISTANCE) |
| | | return lunr.QueryLexer.lexText |
| | | } |
| | | |
| | | lunr.QueryLexer.lexBoost = function (lexer) { |
| | | lexer.ignore() |
| | | lexer.acceptDigitRun() |
| | | lexer.emit(lunr.QueryLexer.BOOST) |
| | | return lunr.QueryLexer.lexText |
| | | } |
| | | |
| | | lunr.QueryLexer.lexEOS = function (lexer) { |
| | | if (lexer.width() > 0) { |
| | | lexer.emit(lunr.QueryLexer.TERM) |
| | | } |
| | | } |
| | | |
| | | // This matches the separator used when tokenising fields |
| | | // within a document. These should match otherwise it is |
| | | // not possible to search for some tokens within a document. |
| | | // |
| | | // It is possible for the user to change the separator on the |
| | | // tokenizer so it _might_ clash with any other of the special |
| | | // characters already used within the search string, e.g. :. |
| | | // |
| | | // This means that it is possible to change the separator in |
| | | // such a way that makes some words unsearchable using a search |
| | | // string. |
| | | lunr.QueryLexer.termSeparator = lunr.tokenizer.separator |
| | | |
| | | lunr.QueryLexer.lexText = function (lexer) { |
| | | while (true) { |
| | | var char = lexer.next() |
| | | |
| | | if (char == lunr.QueryLexer.EOS) { |
| | | return lunr.QueryLexer.lexEOS |
| | | } |
| | | |
| | | // Escape character is '\' |
| | | if (char.charCodeAt(0) == 92) { |
| | | lexer.escapeCharacter() |
| | | continue |
| | | } |
| | | |
| | | if (char == ":") { |
| | | return lunr.QueryLexer.lexField |
| | | } |
| | | |
| | | if (char == "~") { |
| | | lexer.backup() |
| | | if (lexer.width() > 0) { |
| | | lexer.emit(lunr.QueryLexer.TERM) |
| | | } |
| | | return lunr.QueryLexer.lexEditDistance |
| | | } |
| | | |
| | | if (char == "^") { |
| | | lexer.backup() |
| | | if (lexer.width() > 0) { |
| | | lexer.emit(lunr.QueryLexer.TERM) |
| | | } |
| | | return lunr.QueryLexer.lexBoost |
| | | } |
| | | |
| | | // "+" indicates term presence is required |
| | | // checking for length to ensure that only |
| | | // leading "+" are considered |
| | | if (char == "+" && lexer.width() === 1) { |
| | | lexer.emit(lunr.QueryLexer.PRESENCE) |
| | | return lunr.QueryLexer.lexText |
| | | } |
| | | |
| | | // "-" indicates term presence is prohibited |
| | | // checking for length to ensure that only |
| | | // leading "-" are considered |
| | | if (char == "-" && lexer.width() === 1) { |
| | | lexer.emit(lunr.QueryLexer.PRESENCE) |
| | | return lunr.QueryLexer.lexText |
| | | } |
| | | |
| | | if (char.match(lunr.QueryLexer.termSeparator)) { |
| | | return lunr.QueryLexer.lexTerm |
| | | } |
| | | } |
| | | } |
| | | |
| | | lunr.QueryParser = function (str, query) { |
| | | this.lexer = new lunr.QueryLexer (str) |
| | | this.query = query |
| | | this.currentClause = {} |
| | | this.lexemeIdx = 0 |
| | | } |
| | | |
| | | lunr.QueryParser.prototype.parse = function () { |
| | | this.lexer.run() |
| | | this.lexemes = this.lexer.lexemes |
| | | |
| | | var state = lunr.QueryParser.parseClause |
| | | |
| | | while (state) { |
| | | state = state(this) |
| | | } |
| | | |
| | | return this.query |
| | | } |
| | | |
| | | lunr.QueryParser.prototype.peekLexeme = function () { |
| | | return this.lexemes[this.lexemeIdx] |
| | | } |
| | | |
| | | lunr.QueryParser.prototype.consumeLexeme = function () { |
| | | var lexeme = this.peekLexeme() |
| | | this.lexemeIdx += 1 |
| | | return lexeme |
| | | } |
| | | |
| | | lunr.QueryParser.prototype.nextClause = function () { |
| | | var completedClause = this.currentClause |
| | | this.query.clause(completedClause) |
| | | this.currentClause = {} |
| | | } |
| | | |
| | | lunr.QueryParser.parseClause = function (parser) { |
| | | var lexeme = parser.peekLexeme() |
| | | |
| | | if (lexeme == undefined) { |
| | | return |
| | | } |
| | | |
| | | switch (lexeme.type) { |
| | | case lunr.QueryLexer.PRESENCE: |
| | | return lunr.QueryParser.parsePresence |
| | | case lunr.QueryLexer.FIELD: |
| | | return lunr.QueryParser.parseField |
| | | case lunr.QueryLexer.TERM: |
| | | return lunr.QueryParser.parseTerm |
| | | default: |
| | | var errorMessage = "expected either a field or a term, found " + lexeme.type |
| | | |
| | | if (lexeme.str.length >= 1) { |
| | | errorMessage += " with value '" + lexeme.str + "'" |
| | | } |
| | | |
| | | throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) |
| | | } |
| | | } |
| | | |
| | | lunr.QueryParser.parsePresence = function (parser) { |
| | | var lexeme = parser.consumeLexeme() |
| | | |
| | | if (lexeme == undefined) { |
| | | return |
| | | } |
| | | |
| | | switch (lexeme.str) { |
| | | case "-": |
| | | parser.currentClause.presence = lunr.Query.presence.PROHIBITED |
| | | break |
| | | case "+": |
| | | parser.currentClause.presence = lunr.Query.presence.REQUIRED |
| | | break |
| | | default: |
| | | var errorMessage = "unrecognised presence operator'" + lexeme.str + "'" |
| | | throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) |
| | | } |
| | | |
| | | var nextLexeme = parser.peekLexeme() |
| | | |
| | | if (nextLexeme == undefined) { |
| | | var errorMessage = "expecting term or field, found nothing" |
| | | throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) |
| | | } |
| | | |
| | | switch (nextLexeme.type) { |
| | | case lunr.QueryLexer.FIELD: |
| | | return lunr.QueryParser.parseField |
| | | case lunr.QueryLexer.TERM: |
| | | return lunr.QueryParser.parseTerm |
| | | default: |
| | | var errorMessage = "expecting term or field, found '" + nextLexeme.type + "'" |
| | | throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) |
| | | } |
| | | } |
| | | |
| | | lunr.QueryParser.parseField = function (parser) { |
| | | var lexeme = parser.consumeLexeme() |
| | | |
| | | if (lexeme == undefined) { |
| | | return |
| | | } |
| | | |
| | | if (parser.query.allFields.indexOf(lexeme.str) == -1) { |
| | | var possibleFields = parser.query.allFields.map(function (f) { return "'" + f + "'" }).join(', '), |
| | | errorMessage = "unrecognised field '" + lexeme.str + "', possible fields: " + possibleFields |
| | | |
| | | throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) |
| | | } |
| | | |
| | | parser.currentClause.fields = [lexeme.str] |
| | | |
| | | var nextLexeme = parser.peekLexeme() |
| | | |
| | | if (nextLexeme == undefined) { |
| | | var errorMessage = "expecting term, found nothing" |
| | | throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) |
| | | } |
| | | |
| | | switch (nextLexeme.type) { |
| | | case lunr.QueryLexer.TERM: |
| | | return lunr.QueryParser.parseTerm |
| | | default: |
| | | var errorMessage = "expecting term, found '" + nextLexeme.type + "'" |
| | | throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) |
| | | } |
| | | } |
| | | |
| | | lunr.QueryParser.parseTerm = function (parser) { |
| | | var lexeme = parser.consumeLexeme() |
| | | |
| | | if (lexeme == undefined) { |
| | | return |
| | | } |
| | | |
| | | parser.currentClause.term = lexeme.str.toLowerCase() |
| | | |
| | | if (lexeme.str.indexOf("*") != -1) { |
| | | parser.currentClause.usePipeline = false |
| | | } |
| | | |
| | | var nextLexeme = parser.peekLexeme() |
| | | |
| | | if (nextLexeme == undefined) { |
| | | parser.nextClause() |
| | | return |
| | | } |
| | | |
| | | switch (nextLexeme.type) { |
| | | case lunr.QueryLexer.TERM: |
| | | parser.nextClause() |
| | | return lunr.QueryParser.parseTerm |
| | | case lunr.QueryLexer.FIELD: |
| | | parser.nextClause() |
| | | return lunr.QueryParser.parseField |
| | | case lunr.QueryLexer.EDIT_DISTANCE: |
| | | return lunr.QueryParser.parseEditDistance |
| | | case lunr.QueryLexer.BOOST: |
| | | return lunr.QueryParser.parseBoost |
| | | case lunr.QueryLexer.PRESENCE: |
| | | parser.nextClause() |
| | | return lunr.QueryParser.parsePresence |
| | | default: |
| | | var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" |
| | | throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) |
| | | } |
| | | } |
| | | |
| | | lunr.QueryParser.parseEditDistance = function (parser) { |
| | | var lexeme = parser.consumeLexeme() |
| | | |
| | | if (lexeme == undefined) { |
| | | return |
| | | } |
| | | |
| | | var editDistance = parseInt(lexeme.str, 10) |
| | | |
| | | if (isNaN(editDistance)) { |
| | | var errorMessage = "edit distance must be numeric" |
| | | throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) |
| | | } |
| | | |
| | | parser.currentClause.editDistance = editDistance |
| | | |
| | | var nextLexeme = parser.peekLexeme() |
| | | |
| | | if (nextLexeme == undefined) { |
| | | parser.nextClause() |
| | | return |
| | | } |
| | | |
| | | switch (nextLexeme.type) { |
| | | case lunr.QueryLexer.TERM: |
| | | parser.nextClause() |
| | | return lunr.QueryParser.parseTerm |
| | | case lunr.QueryLexer.FIELD: |
| | | parser.nextClause() |
| | | return lunr.QueryParser.parseField |
| | | case lunr.QueryLexer.EDIT_DISTANCE: |
| | | return lunr.QueryParser.parseEditDistance |
| | | case lunr.QueryLexer.BOOST: |
| | | return lunr.QueryParser.parseBoost |
| | | case lunr.QueryLexer.PRESENCE: |
| | | parser.nextClause() |
| | | return lunr.QueryParser.parsePresence |
| | | default: |
| | | var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" |
| | | throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) |
| | | } |
| | | } |
| | | |
| | | lunr.QueryParser.parseBoost = function (parser) { |
| | | var lexeme = parser.consumeLexeme() |
| | | |
| | | if (lexeme == undefined) { |
| | | return |
| | | } |
| | | |
| | | var boost = parseInt(lexeme.str, 10) |
| | | |
| | | if (isNaN(boost)) { |
| | | var errorMessage = "boost must be numeric" |
| | | throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) |
| | | } |
| | | |
| | | parser.currentClause.boost = boost |
| | | |
| | | var nextLexeme = parser.peekLexeme() |
| | | |
| | | if (nextLexeme == undefined) { |
| | | parser.nextClause() |
| | | return |
| | | } |
| | | |
| | | switch (nextLexeme.type) { |
| | | case lunr.QueryLexer.TERM: |
| | | parser.nextClause() |
| | | return lunr.QueryParser.parseTerm |
| | | case lunr.QueryLexer.FIELD: |
| | | parser.nextClause() |
| | | return lunr.QueryParser.parseField |
| | | case lunr.QueryLexer.EDIT_DISTANCE: |
| | | return lunr.QueryParser.parseEditDistance |
| | | case lunr.QueryLexer.BOOST: |
| | | return lunr.QueryParser.parseBoost |
| | | case lunr.QueryLexer.PRESENCE: |
| | | parser.nextClause() |
| | | return lunr.QueryParser.parsePresence |
| | | default: |
| | | var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" |
| | | throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * export the module via AMD, CommonJS or as a browser global |
| | | * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js |
| | | */ |
| | | ;(function (root, factory) { |
| | | if (typeof define === 'function' && define.amd) { |
| | | // AMD. Register as an anonymous module. |
| | | define(factory) |
| | | } else if (typeof exports === 'object') { |
| | | /** |
| | | * Node. Does not work with strict CommonJS, but |
| | | * only CommonJS-like environments that support module.exports, |
| | | * like Node. |
| | | */ |
| | | module.exports = factory() |
| | | } else { |
| | | // Browser globals (root is window) |
| | | root.lunr = factory() |
| | | } |
| | | }(this, function () { |
| | | /** |
| | | * Just return a value to define the module export. |
| | | * This example returns an object, but the module |
| | | * can return a function as the exported value. |
| | | */ |
| | | return lunr |
| | | })) |
| | | })(); |
| New file |
| | |
| | | function getSearchTermFromLocation() { |
| | | var sPageURL = window.location.search.substring(1); |
| | | var sURLVariables = sPageURL.split('&'); |
| | | for (var i = 0; i < sURLVariables.length; i++) { |
| | | var sParameterName = sURLVariables[i].split('='); |
| | | if (sParameterName[0] == 'q') { |
| | | return decodeURIComponent(sParameterName[1].replace(/\+/g, '%20')); |
| | | } |
| | | } |
| | | } |
| | | |
| | | function joinUrl (base, path) { |
| | | if (path.substring(0, 1) === "/") { |
| | | // path starts with `/`. Thus it is absolute. |
| | | return path; |
| | | } |
| | | if (base.substring(base.length-1) === "/") { |
| | | // base ends with `/` |
| | | return base + path; |
| | | } |
| | | return base + "/" + path; |
| | | } |
| | | |
| | | function escapeHtml (value) { |
| | | return value.replace(/&/g, '&') |
| | | .replace(/"/g, '"') |
| | | .replace(/</g, '<') |
| | | .replace(/>/g, '>'); |
| | | } |
| | | |
| | | function formatResult (location, title, summary) { |
| | | return '<article><h3><a href="' + joinUrl(base_url, location) + '">'+ escapeHtml(title) + '</a></h3><p>' + escapeHtml(summary) +'</p></article>'; |
| | | } |
| | | |
| | | function displayResults (results) { |
| | | var search_results = document.getElementById("mkdocs-search-results"); |
| | | while (search_results.firstChild) { |
| | | search_results.removeChild(search_results.firstChild); |
| | | } |
| | | if (results.length > 0){ |
| | | for (var i=0; i < results.length; i++){ |
| | | var result = results[i]; |
| | | var html = formatResult(result.location, result.title, result.summary); |
| | | search_results.insertAdjacentHTML('beforeend', html); |
| | | } |
| | | } else { |
| | | var noResultsText = search_results.getAttribute('data-no-results-text'); |
| | | if (!noResultsText) { |
| | | noResultsText = "No results found"; |
| | | } |
| | | search_results.insertAdjacentHTML('beforeend', '<p>' + noResultsText + '</p>'); |
| | | } |
| | | } |
| | | |
| | | function doSearch () { |
| | | var query = document.getElementById('mkdocs-search-query').value; |
| | | if (query.length > min_search_length) { |
| | | if (!window.Worker) { |
| | | displayResults(search(query)); |
| | | } else { |
| | | searchWorker.postMessage({query: query}); |
| | | } |
| | | } else { |
| | | // Clear results for short queries |
| | | displayResults([]); |
| | | } |
| | | } |
| | | |
| | | function initSearch () { |
| | | var search_input = document.getElementById('mkdocs-search-query'); |
| | | if (search_input) { |
| | | search_input.addEventListener("keyup", doSearch); |
| | | } |
| | | var term = getSearchTermFromLocation(); |
| | | if (term) { |
| | | search_input.value = term; |
| | | doSearch(); |
| | | } |
| | | } |
| | | |
| | | function onWorkerMessage (e) { |
| | | if (e.data.allowSearch) { |
| | | initSearch(); |
| | | } else if (e.data.results) { |
| | | var results = e.data.results; |
| | | displayResults(results); |
| | | } else if (e.data.config) { |
| | | min_search_length = e.data.config.min_search_length-1; |
| | | } |
| | | } |
| | | |
| | | if (!window.Worker) { |
| | | console.log('Web Worker API not supported'); |
| | | // load index in main thread |
| | | $.getScript(joinUrl(base_url, "search/worker.js")).done(function () { |
| | | console.log('Loaded worker'); |
| | | init(); |
| | | window.postMessage = function (msg) { |
| | | onWorkerMessage({data: msg}); |
| | | }; |
| | | }).fail(function (jqxhr, settings, exception) { |
| | | console.error('Could not load worker.js'); |
| | | }); |
| | | } else { |
| | | // Wrap search in a web worker |
| | | var searchWorker = new Worker(joinUrl(base_url, "search/worker.js")); |
| | | searchWorker.postMessage({init: true}); |
| | | searchWorker.onmessage = onWorkerMessage; |
| | | } |
| | |
| | | {"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"HomeAssistant\u672c\u5730\u90e8\u7f72\u53ca\u88c5\u8c03\u8bd5\u8bf4\u660e \u7b80\u8981\u8bf4\u660e \u5b89\u88c5HomeAssistant linux \u4e0b\u5b89\u88c5","title":"\u9996\u9875"},{"location":"#homeassistant","text":"\u7b80\u8981\u8bf4\u660e \u5b89\u88c5HomeAssistant linux \u4e0b\u5b89\u88c5","title":"HomeAssistant\u672c\u5730\u90e8\u7f72\u53ca\u88c5\u8c03\u8bd5\u8bf4\u660e"},{"location":"about/","text":"\u5173\u4e8e\u6211\u4eec \u5cb1\u7279\u667a\u80fd\u79d1\u6280\uff08\u4e0a\u6d77\uff09\u6709\u9650\u516c\u53f8 \u5355\u4f4d\u5730\u5740 :\u4e0a\u6d77\u5e02\u6768\u6d66\u533a\u56fd\u6cf0\u8def127\u5f041\u53f7\u4e09\u5c42\uff08\u96c6\u4e2d\u767b\u8bb0\u5730\uff09 \u5355\u4f4d\u7535\u8bdd:021-54720326","title":"\u5173\u4e8e"},{"location":"about/#_1","text":"","title":"\u5173\u4e8e\u6211\u4eec"},{"location":"about/#_2","text":"\u5355\u4f4d\u5730\u5740 :\u4e0a\u6d77\u5e02\u6768\u6d66\u533a\u56fd\u6cf0\u8def127\u5f041\u53f7\u4e09\u5c42\uff08\u96c6\u4e2d\u767b\u8bb0\u5730\uff09 \u5355\u4f4d\u7535\u8bdd:021-54720326","title":"\u5cb1\u7279\u667a\u80fd\u79d1\u6280\uff08\u4e0a\u6d77\uff09\u6709\u9650\u516c\u53f8"},{"location":"Usages/usage/","text":"\u4f7f\u7528\u6559\u7a0b","title":"\u4f7f\u7528"},{"location":"Usages/usage/#_1","text":"","title":"\u4f7f\u7528\u6559\u7a0b"},{"location":"install-guide/LinuxInstall/","text":"\u57fa\u4e8elinux\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf \u8fd9\u79cd\u65b9\u6cd5\u7684\u64cd\u4f5c\u65b9\u6cd5\u662f: \u5148\u4e0b\u8f7d\u5b89\u88c5ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf \u5728\u865a\u62df\u673a\u6216\u7269\u7406\u673a\u4e2d\u5b89\u88c5\u6b64ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf.(\u4e34\u65f6\u4f7f\u7528) \u4f7f\u7528ubuntu24.04\u5236\u4f5clinux\u542f\u52a8U\u76d8ubuntu live \u4f7f\u7528\u542f\u52a8U\u76d8ubuntu live\u5f15\u5bfcx86\u5c0f\u5de5\u63a7\u673a. \u8fdb\u5165try\u6a21\u5f0f(\u4e0d\u5b89\u88c5). \u5728try\u6a21\u5f0f\u4e2d,\u4e0b\u8f7dha\u5b89\u65b9\u955c\u50cf \u4f7f\u7528ubuntu live\u7684\u81ea\u5e26\u7684\u78c1\u76d8\u6062\u590d\u5de5\u5177\u5199\u5165\u955c\u50cf\u5230\u786c\u76d8. \u79fb\u9664U\u76d8 \u91cd\u542f\u7cfb\u7edf \u8fdb\u5165HA cli\u754c\u9762","title":"\u57fa\u4e8elinux\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf"},{"location":"install-guide/LinuxInstall/#linux","text":"\u8fd9\u79cd\u65b9\u6cd5\u7684\u64cd\u4f5c\u65b9\u6cd5\u662f: \u5148\u4e0b\u8f7d\u5b89\u88c5ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf \u5728\u865a\u62df\u673a\u6216\u7269\u7406\u673a\u4e2d\u5b89\u88c5\u6b64ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf.(\u4e34\u65f6\u4f7f\u7528) \u4f7f\u7528ubuntu24.04\u5236\u4f5clinux\u542f\u52a8U\u76d8ubuntu live \u4f7f\u7528\u542f\u52a8U\u76d8ubuntu live\u5f15\u5bfcx86\u5c0f\u5de5\u63a7\u673a. \u8fdb\u5165try\u6a21\u5f0f(\u4e0d\u5b89\u88c5). \u5728try\u6a21\u5f0f\u4e2d,\u4e0b\u8f7dha\u5b89\u65b9\u955c\u50cf \u4f7f\u7528ubuntu live\u7684\u81ea\u5e26\u7684\u78c1\u76d8\u6062\u590d\u5de5\u5177\u5199\u5165\u955c\u50cf\u5230\u786c\u76d8. \u79fb\u9664U\u76d8 \u91cd\u542f\u7cfb\u7edf \u8fdb\u5165HA cli\u754c\u9762","title":"\u57fa\u4e8elinux\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf"},{"location":"install-guide/installHa/","text":"\u5b89\u88c5HomeAssistant HomeAssistant\u7684\u5b89\u88c5\u6709\u591a\u79cd\u65b9\u5f0f\u4e0e\u65b9\u6cd5,\u6700\u5e38\u7528\u6298\u6709\u786c\u5907\u76f4\u63a5\u5b89\u88c5,docker\u5b89\u88c5\u865a\u62df\u673a\u5b89\u88c5\u7b49. \u4e0b\u9762\u6211\u4eec\u5c31\u4ee5\u786c\u76d8\u5b89\u88c5HAOS\u4e3a\u4f8b\u4ecb\u7ecd\u57fa\u4e8ex86\u786c\u4ef6\u7684\u57fa\u7840\u4e0a\u5b89\u88c5HAOS,\u57fa\u5b83\u7684\u5b89\u88c5\u65b9\u5f0f,\u540e\u7eed\u4f1a\u4ecb\u7ecd. HAOS\u5b89\u88c5 \u5b89\u88c5\u5728X86PC\u786c\u76d8\u4e0a haos\u8981\u5b89\u88c5\u5728\u786c\u76d8\u4e0a,\u603b\u4f53\u601d\u8def\u662f,\u5148\u5230HA\u7684\u5b98\u7f51\u4e0b\u8f7dhaos\u7684\u5b98\u65b9\u955c\u50cf\u6587\u4ef6 ,\u4e00\u822c\u4e3a.gz\u6216.gz.xz\u7b49\u683c\u5f0f,\u7136\u540e\u518d\u7528\u5199\u76d8\u5de5\u5177,\u76f4\u63a5\u628a\u8fd9\u4e2a\u955c\u50cf\u5199\u5165\u786c\u76d8. \u5c06\u955c\u50cf\u6587\u4ef6\u5199\u5165\u786c\u76d8\u4e0a\u7ea6\u6709\u4e24\u79cd\u65b9\u6cd5: \u5728linux\u64cd\u4f5c\u7cfb\u7edf\u4e0a\u5199\u5165\u955c\u50cf \u5728windows\u5e73\u53f0\u4e0a\u5199\u5165\u955c\u50cf \u57fa\u4e8elinux\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf \u8fd9\u79cd\u65b9\u6cd5\u7684\u64cd\u4f5c\u65b9\u6cd5\u662f: \u5148\u4e0b\u8f7d\u5b89\u88c5ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf \u5728\u865a\u62df\u673a\u6216\u7269\u7406\u673a\u4e2d\u5b89\u88c5\u6b64ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf.(\u4e34\u65f6\u4f7f\u7528) \u4f7f\u7528ubuntu24.04\u5236\u4f5clinux\u542f\u52a8U\u76d8ubuntu live \u4f7f\u7528\u542f\u52a8U\u76d8ubuntu live\u5f15\u5bfcx86\u5c0f\u5de5\u63a7\u673a. \u8fdb\u5165try\u6a21\u5f0f(\u4e0d\u5b89\u88c5). \u5728try\u6a21\u5f0f\u4e2d,\u4e0b\u8f7dha\u5b89\u65b9\u955c\u50cf \u4f7f\u7528ubuntu live\u7684\u81ea\u5e26\u7684\u78c1\u76d8\u6062\u590d\u5de5\u5177\u5199\u5165\u955c\u50cf\u5230\u786c\u76d8. \u79fb\u9664U\u76d8 \u91cd\u542f\u7cfb\u7edf \u8fdb\u5165HA cli\u754c\u9762 \u6b64\u79cd\u65b9\u6cd5\u7684\u597d\u5904\u662f,\u4e0d\u7528\u62c6\u9664\u786c\u76d8,\u76f4\u63a5\u5728\u5c0f\u5de5\u63a7\u673a\u4e0a\u5c31\u80fd\u5b9e\u73b0\u64cd\u4f5c. \u57fa\u4e8ewindows\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf. \u5b98\u65b9\u5728\u4ecb\u7ecd\u8fd9\u79cd\u65b9\u6cd5\u662f\u8ba9\u7528\u6237\u628a\u5c0f\u5de5\u63a7\u673a\u7684\u786c\u76d8\u62c6\u4e0b,\u88c5\u5165\u7528\u6237\u81ea\u5df2\u7684\u7535\u8111\u4e2d,\u5e76\u7528balenaEtcher\u5199\u76d8\u5de5\u5177\u5c06\u955c\u50cf\u5199\u5165\u5c0f\u5de5\u63a7\u7684\u673a\u7684\u786c\u76d8\u540e,\u518d\u628a\u5c0f\u5de5\u63a7\u673a\u673a\u7684\u786c\u76d8\u88c5\u5165\u5c0f\u5de5\u63a7\u673a.\u8fd9\u65b9\u6cd5\u65b9\u4fbf\u5feb\u6377,\u4f46\u662f\u9700\u8981\u62c6\u673a,\u6709\u9700\u8981\u7684\u7528\u6237\u53ef\u4ee5\u5230\u5b98\u65b9\u4ecb\u7ecd\u9875\u9762 Geneic x86-64 \u53bb\u770b\u5177\u4f53\u64cd\u4f5c\u65b9\u6cd5. \u6211\u4eec\u5e38\u7528\u7684\u65b9\u6cd5\u5982\u4e0b: \u5236\u4f5c\u4e00\u4e2a\u5176\u4e8ewindows PE\u7cfb\u7edf\u7684\u5f15\u5bfcU\u76d8. \u4e0b\u8f7d\u5b98\u65b9\u955c\u50cf\u5230U\u76d8\u4e2d\u3002 \u89e3\u538b\u955c\u50cf\u4e3a.img\u6587\u4ef6 \u7528PE\u5e26\u7684\u5199\u76d8\u5de5\u5177\uff0c\u5c06HA\u955c\u50cf\u5199\u5165\u786c\u76d8\u3002 \u79fb\u9664U\u76d8\u3002 \u91cd\u542f\u8fdb\u5165HA ClI.","title":"\u5b89\u88c5"},{"location":"install-guide/installHa/#homeassistant","text":"HomeAssistant\u7684\u5b89\u88c5\u6709\u591a\u79cd\u65b9\u5f0f\u4e0e\u65b9\u6cd5,\u6700\u5e38\u7528\u6298\u6709\u786c\u5907\u76f4\u63a5\u5b89\u88c5,docker\u5b89\u88c5\u865a\u62df\u673a\u5b89\u88c5\u7b49. \u4e0b\u9762\u6211\u4eec\u5c31\u4ee5\u786c\u76d8\u5b89\u88c5HAOS\u4e3a\u4f8b\u4ecb\u7ecd\u57fa\u4e8ex86\u786c\u4ef6\u7684\u57fa\u7840\u4e0a\u5b89\u88c5HAOS,\u57fa\u5b83\u7684\u5b89\u88c5\u65b9\u5f0f,\u540e\u7eed\u4f1a\u4ecb\u7ecd.","title":"\u5b89\u88c5HomeAssistant"},{"location":"install-guide/installHa/#haos","text":"","title":"HAOS\u5b89\u88c5"},{"location":"install-guide/installHa/#x86pc","text":"haos\u8981\u5b89\u88c5\u5728\u786c\u76d8\u4e0a,\u603b\u4f53\u601d\u8def\u662f,\u5148\u5230HA\u7684\u5b98\u7f51\u4e0b\u8f7dhaos\u7684\u5b98\u65b9\u955c\u50cf\u6587\u4ef6 ,\u4e00\u822c\u4e3a.gz\u6216.gz.xz\u7b49\u683c\u5f0f,\u7136\u540e\u518d\u7528\u5199\u76d8\u5de5\u5177,\u76f4\u63a5\u628a\u8fd9\u4e2a\u955c\u50cf\u5199\u5165\u786c\u76d8. \u5c06\u955c\u50cf\u6587\u4ef6\u5199\u5165\u786c\u76d8\u4e0a\u7ea6\u6709\u4e24\u79cd\u65b9\u6cd5: \u5728linux\u64cd\u4f5c\u7cfb\u7edf\u4e0a\u5199\u5165\u955c\u50cf \u5728windows\u5e73\u53f0\u4e0a\u5199\u5165\u955c\u50cf","title":"\u5b89\u88c5\u5728X86PC\u786c\u76d8\u4e0a"},{"location":"install-guide/installHa/#linux","text":"\u8fd9\u79cd\u65b9\u6cd5\u7684\u64cd\u4f5c\u65b9\u6cd5\u662f: \u5148\u4e0b\u8f7d\u5b89\u88c5ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf \u5728\u865a\u62df\u673a\u6216\u7269\u7406\u673a\u4e2d\u5b89\u88c5\u6b64ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf.(\u4e34\u65f6\u4f7f\u7528) \u4f7f\u7528ubuntu24.04\u5236\u4f5clinux\u542f\u52a8U\u76d8ubuntu live \u4f7f\u7528\u542f\u52a8U\u76d8ubuntu live\u5f15\u5bfcx86\u5c0f\u5de5\u63a7\u673a. \u8fdb\u5165try\u6a21\u5f0f(\u4e0d\u5b89\u88c5). \u5728try\u6a21\u5f0f\u4e2d,\u4e0b\u8f7dha\u5b89\u65b9\u955c\u50cf \u4f7f\u7528ubuntu live\u7684\u81ea\u5e26\u7684\u78c1\u76d8\u6062\u590d\u5de5\u5177\u5199\u5165\u955c\u50cf\u5230\u786c\u76d8. \u79fb\u9664U\u76d8 \u91cd\u542f\u7cfb\u7edf \u8fdb\u5165HA cli\u754c\u9762 \u6b64\u79cd\u65b9\u6cd5\u7684\u597d\u5904\u662f,\u4e0d\u7528\u62c6\u9664\u786c\u76d8,\u76f4\u63a5\u5728\u5c0f\u5de5\u63a7\u673a\u4e0a\u5c31\u80fd\u5b9e\u73b0\u64cd\u4f5c.","title":"\u57fa\u4e8elinux\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf"},{"location":"install-guide/installHa/#windows","text":"\u5b98\u65b9\u5728\u4ecb\u7ecd\u8fd9\u79cd\u65b9\u6cd5\u662f\u8ba9\u7528\u6237\u628a\u5c0f\u5de5\u63a7\u673a\u7684\u786c\u76d8\u62c6\u4e0b,\u88c5\u5165\u7528\u6237\u81ea\u5df2\u7684\u7535\u8111\u4e2d,\u5e76\u7528balenaEtcher\u5199\u76d8\u5de5\u5177\u5c06\u955c\u50cf\u5199\u5165\u5c0f\u5de5\u63a7\u7684\u673a\u7684\u786c\u76d8\u540e,\u518d\u628a\u5c0f\u5de5\u63a7\u673a\u673a\u7684\u786c\u76d8\u88c5\u5165\u5c0f\u5de5\u63a7\u673a.\u8fd9\u65b9\u6cd5\u65b9\u4fbf\u5feb\u6377,\u4f46\u662f\u9700\u8981\u62c6\u673a,\u6709\u9700\u8981\u7684\u7528\u6237\u53ef\u4ee5\u5230\u5b98\u65b9\u4ecb\u7ecd\u9875\u9762 Geneic x86-64 \u53bb\u770b\u5177\u4f53\u64cd\u4f5c\u65b9\u6cd5. \u6211\u4eec\u5e38\u7528\u7684\u65b9\u6cd5\u5982\u4e0b: \u5236\u4f5c\u4e00\u4e2a\u5176\u4e8ewindows PE\u7cfb\u7edf\u7684\u5f15\u5bfcU\u76d8. \u4e0b\u8f7d\u5b98\u65b9\u955c\u50cf\u5230U\u76d8\u4e2d\u3002 \u89e3\u538b\u955c\u50cf\u4e3a.img\u6587\u4ef6 \u7528PE\u5e26\u7684\u5199\u76d8\u5de5\u5177\uff0c\u5c06HA\u955c\u50cf\u5199\u5165\u786c\u76d8\u3002 \u79fb\u9664U\u76d8\u3002 \u91cd\u542f\u8fdb\u5165HA ClI.","title":"\u57fa\u4e8ewindows\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf."}]} |
| | | {"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"HomeAssistant\u672c\u5730\u90e8\u7f72\u53ca\u88c5\u8c03\u8bd5\u8bf4\u660e \u00b6 \u7b80\u8981\u8bf4\u660e \u5b89\u88c5HomeAssistant linux \u4e0b\u5b89\u88c5","title":"\u9996\u9875"},{"location":"#homeassistant","text":"\u7b80\u8981\u8bf4\u660e \u5b89\u88c5HomeAssistant linux \u4e0b\u5b89\u88c5","title":"HomeAssistant\u672c\u5730\u90e8\u7f72\u53ca\u88c5\u8c03\u8bd5\u8bf4\u660e"},{"location":"about/","text":"\u5173\u4e8e\u6211\u4eec \u00b6 \u5cb1\u7279\u667a\u80fd\u79d1\u6280\uff08\u4e0a\u6d77\uff09\u6709\u9650\u516c\u53f8 \u00b6 \u6570\u636e\u6d41\u52a8\u4e4b\u5904\uff0c\u6548\u7387\u81ea\u7136\u53d1\u751f\u3002 \u00b6 DATA\u4ee3\u8868\u611f\u77e5\u3001\u8fde\u63a5\u4e0e\u667a\u80fd\u3002\u5728\u7e41\u6742\u7684\u533b\u7597\u6570\u636e\u4e2d\uff0c\u4e00\u573a\u6570\u5b57\u5316\u9769\u547d\u6b63\u5728\u53d1\u751f\uff0c\u6211\u4eec\u5b88\u62a4\u7684\u4e0d\u6b62\u662f\u6570\u636e\uff0c\u66f4\u662f\u60a3\u8005\u7684\u6bcf\u4e00\u5206\u949f\u3002\u5cb1\u7279\u667a\u80fd\u2013\u8ba9\u6bcf\u4e00\u53f0\u8bbe\u5907\u6210\u4e3a\u667a\u6167\u533b\u7597\u7684\u795e\u7ecf\u5143\u3002 25\u5e74\u533b\u7597\u4fe1\u606f\u5316\u6df1\u8015\u8005\uff0c\u56e2\u961f\u81ea2000\u5e74\u8d77\u6301\u7eed\u63a2\u7d22\u4fe1\u606f\u5316\u5728\u533b\u7597\u573a\u666f\u7684\u6df1\u5ea6\u5e94\u7528 \u00b6 \u6700\u4f73\u5b9e\u8df5\uff1a\u670d\u52a1\u5168\u7403\u8d85\u8fc7600+\u533b\u7597\u673a\u6784\uff0c\u7eed\u7ea6\u7387\u8d8597% \u5168\u7403\u670d\u52a1\uff1a\u72ec\u7acb\u7684\u82f1/\u65e5/\u9a6c\u6765\u8bed\u7248\u672c\uff0c\u9002\u914d\u5f53\u5730\u4e34\u5e8a\u8def\u5f84 \u6784\u5efa\u6807\u51c6\uff1a\u4e3b\u5bfc\u5236\u5b9a\u591a\u9879\u6807\u51c6\uff0c\u300c\u8840\u6db2\u900f\u6790\u8f6f\u4ef6\u6280\u672f\u8981\u6c42\u300d \u6570\u636e\u4e3b\u6743\uff1a\u5373\u4f7f\u7ec8\u6b62\u5408\u4f5c\uff0c\u4ecd\u7136\u4fdd\u8bc1\u7528\u6237\u4e0d\u53d7\u9650\u5236\u7684\u8bbf\u95ee \u56de\u5f52\u672c\u8d28 \u00b6 \u4e0d\u662f\u7528\u6280\u672f\u66ff\u4ee3\u4eba,\u800c\u662f\u8ba9\u800c\u662f\u8ba9\u4eba\u4ece\u91cd\u590d\u52b3\u52a8\u4e2d\u89e3\u653e\uff0c\u56de\u5f52\u533b\u7597\u670d\u52a1\u7684\u672c\u8d28\u3002 \u77e5\u8bc6\u53cd\u54fa \u00b6 \u57fa\u5c42\u533b\u9662\u6848\u4f8b\u81ea\u52a8\u6c89\u6dc0\u4e3a\u4e09\u7532\u4f18\u5316\u7b56\u7565\uff0c\u8bc6\u522b\u79d1\u5ba4\u5de5\u4f5c\u6d41\u5dee\u5f02\uff0c\u751f\u6210\u5b9a\u5236\u65b9\u6848\u3002 \u5f00\u653e\u751f\u6001 \u00b6 \u5f00\u653eAPI\uff0c\u96c6\u6210100+\u7b2c\u4e09\u65b9\u89e3\u51b3\u65b9\u6848\uff0c\u5171\u5efa\u533b\u7597\u6570\u636e\u4ea4\u4e92\u6807\u51c6\u3002 \u4e3a\u60a8\u6784\u5efa\u53ef\u751f\u957f\u7684\u6280\u672f\u751f\u6001\u548c\u53ef\u6301\u7eed\u7684\u4e1a\u52a1 \u00b6 \u50cf\u642d\u79ef\u6728\u822c\u81ea\u7531\u6269\u5c55\uff0c\u7834\u9664\u201d\u6570\u5b57\u5316=\u9ad8\u6295\u5165\uff0c\u4ece\u57fa\u7840\u7269\u8054\u5230AI\u51b3\u7b56\uff0c\u5206\u9636\u6bb5\u5efa\u8bbe\u907f\u514d\u4e00\u6b21\u6027\u8fc7\u8f7d\u6295\u5165\u3002\u4e0d\u662f\u63a8\u7ffb\u91cd\u5efa\u7cfb\u7edf\uff0c\u800c\u662f\u8ba9\u73b0\u6709\u8d44\u4ea7\u6301\u7eed\u4ea7\u751f\u6307\u6570\u7ea7\u4ef7\u503c\u2014\u2014\u8fd9\u624d\u662f\u533b\u7597\u6570\u5b57\u5316\u7684\u7ec8\u6781\u4f7f\u547d\u3002","title":"\u5173\u4e8e"},{"location":"about/#_1","text":"","title":"\u5173\u4e8e\u6211\u4eec"},{"location":"about/#_2","text":"","title":"\u5cb1\u7279\u667a\u80fd\u79d1\u6280\uff08\u4e0a\u6d77\uff09\u6709\u9650\u516c\u53f8"},{"location":"about/#_3","text":"DATA\u4ee3\u8868\u611f\u77e5\u3001\u8fde\u63a5\u4e0e\u667a\u80fd\u3002\u5728\u7e41\u6742\u7684\u533b\u7597\u6570\u636e\u4e2d\uff0c\u4e00\u573a\u6570\u5b57\u5316\u9769\u547d\u6b63\u5728\u53d1\u751f\uff0c\u6211\u4eec\u5b88\u62a4\u7684\u4e0d\u6b62\u662f\u6570\u636e\uff0c\u66f4\u662f\u60a3\u8005\u7684\u6bcf\u4e00\u5206\u949f\u3002\u5cb1\u7279\u667a\u80fd\u2013\u8ba9\u6bcf\u4e00\u53f0\u8bbe\u5907\u6210\u4e3a\u667a\u6167\u533b\u7597\u7684\u795e\u7ecf\u5143\u3002","title":"\u6570\u636e\u6d41\u52a8\u4e4b\u5904\uff0c\u6548\u7387\u81ea\u7136\u53d1\u751f\u3002"},{"location":"about/#252000","text":"\u6700\u4f73\u5b9e\u8df5\uff1a\u670d\u52a1\u5168\u7403\u8d85\u8fc7600+\u533b\u7597\u673a\u6784\uff0c\u7eed\u7ea6\u7387\u8d8597% \u5168\u7403\u670d\u52a1\uff1a\u72ec\u7acb\u7684\u82f1/\u65e5/\u9a6c\u6765\u8bed\u7248\u672c\uff0c\u9002\u914d\u5f53\u5730\u4e34\u5e8a\u8def\u5f84 \u6784\u5efa\u6807\u51c6\uff1a\u4e3b\u5bfc\u5236\u5b9a\u591a\u9879\u6807\u51c6\uff0c\u300c\u8840\u6db2\u900f\u6790\u8f6f\u4ef6\u6280\u672f\u8981\u6c42\u300d \u6570\u636e\u4e3b\u6743\uff1a\u5373\u4f7f\u7ec8\u6b62\u5408\u4f5c\uff0c\u4ecd\u7136\u4fdd\u8bc1\u7528\u6237\u4e0d\u53d7\u9650\u5236\u7684\u8bbf\u95ee","title":"25\u5e74\u533b\u7597\u4fe1\u606f\u5316\u6df1\u8015\u8005\uff0c\u56e2\u961f\u81ea2000\u5e74\u8d77\u6301\u7eed\u63a2\u7d22\u4fe1\u606f\u5316\u5728\u533b\u7597\u573a\u666f\u7684\u6df1\u5ea6\u5e94\u7528"},{"location":"about/#_4","text":"\u4e0d\u662f\u7528\u6280\u672f\u66ff\u4ee3\u4eba,\u800c\u662f\u8ba9\u800c\u662f\u8ba9\u4eba\u4ece\u91cd\u590d\u52b3\u52a8\u4e2d\u89e3\u653e\uff0c\u56de\u5f52\u533b\u7597\u670d\u52a1\u7684\u672c\u8d28\u3002","title":"\u56de\u5f52\u672c\u8d28"},{"location":"about/#_5","text":"\u57fa\u5c42\u533b\u9662\u6848\u4f8b\u81ea\u52a8\u6c89\u6dc0\u4e3a\u4e09\u7532\u4f18\u5316\u7b56\u7565\uff0c\u8bc6\u522b\u79d1\u5ba4\u5de5\u4f5c\u6d41\u5dee\u5f02\uff0c\u751f\u6210\u5b9a\u5236\u65b9\u6848\u3002","title":"\u77e5\u8bc6\u53cd\u54fa"},{"location":"about/#_6","text":"\u5f00\u653eAPI\uff0c\u96c6\u6210100+\u7b2c\u4e09\u65b9\u89e3\u51b3\u65b9\u6848\uff0c\u5171\u5efa\u533b\u7597\u6570\u636e\u4ea4\u4e92\u6807\u51c6\u3002","title":"\u5f00\u653e\u751f\u6001"},{"location":"about/#_7","text":"\u50cf\u642d\u79ef\u6728\u822c\u81ea\u7531\u6269\u5c55\uff0c\u7834\u9664\u201d\u6570\u5b57\u5316=\u9ad8\u6295\u5165\uff0c\u4ece\u57fa\u7840\u7269\u8054\u5230AI\u51b3\u7b56\uff0c\u5206\u9636\u6bb5\u5efa\u8bbe\u907f\u514d\u4e00\u6b21\u6027\u8fc7\u8f7d\u6295\u5165\u3002\u4e0d\u662f\u63a8\u7ffb\u91cd\u5efa\u7cfb\u7edf\uff0c\u800c\u662f\u8ba9\u73b0\u6709\u8d44\u4ea7\u6301\u7eed\u4ea7\u751f\u6307\u6570\u7ea7\u4ef7\u503c\u2014\u2014\u8fd9\u624d\u662f\u533b\u7597\u6570\u5b57\u5316\u7684\u7ec8\u6781\u4f7f\u547d\u3002","title":"\u4e3a\u60a8\u6784\u5efa\u53ef\u751f\u957f\u7684\u6280\u672f\u751f\u6001\u548c\u53ef\u6301\u7eed\u7684\u4e1a\u52a1"},{"location":"Usages/usage/","text":"\u4f7f\u7528\u6559\u7a0b \u00b6 \u57fa\u7840\u914d\u7f6e \u00b6 \u914d\u7f6e\u7f51\u7edc \u521d\u59cb\u5316\u914d\u7f6e \u5fc5\u88c5\u63d2\u4ef6\u6216\u7ec4\u4ef6 \u00b6 - HACS \u00b6","title":"\u4f7f\u7528\u6982\u8ff0"},{"location":"Usages/usage/#_1","text":"","title":"\u4f7f\u7528\u6559\u7a0b"},{"location":"Usages/usage/#_2","text":"\u914d\u7f6e\u7f51\u7edc \u521d\u59cb\u5316\u914d\u7f6e","title":"\u57fa\u7840\u914d\u7f6e"},{"location":"Usages/usage/#_3","text":"","title":"\u5fc5\u88c5\u63d2\u4ef6\u6216\u7ec4\u4ef6"},{"location":"Usages/usage/#-hacs","text":"","title":"- HACS"},{"location":"Usages/backupAndRestore/BackupToFile/","text":"\u5907\u4efd\u5230\u6587\u4ef6 \u00b6","title":"BackupToFile"},{"location":"Usages/backupAndRestore/BackupToFile/#_1","text":"","title":"\u5907\u4efd\u5230\u6587\u4ef6"},{"location":"Usages/backupAndRestore/RestoreFromFile/","text":"\u4ece\u5907\u4efd\u6587\u4ef6\u6587\u4ef6\u4e2d\u6062\u590d \u00b6 HomeAssistant\u652f\u6301\u4ece\u5907\u4efd\u6587\u4ef6\u4e32\u6062\u590d\u5df2\u914d\u7f6e\u597d\u7684HomeAssistant","title":"RestoreFromFile"},{"location":"Usages/backupAndRestore/RestoreFromFile/#_1","text":"HomeAssistant\u652f\u6301\u4ece\u5907\u4efd\u6587\u4ef6\u4e32\u6062\u590d\u5df2\u914d\u7f6e\u597d\u7684HomeAssistant","title":"\u4ece\u5907\u4efd\u6587\u4ef6\u6587\u4ef6\u4e2d\u6062\u590d"},{"location":"Usages/initConfig/initConfig/","text":"\u521d\u59cb\u5316\u914d\u7f6eHomeAssistant \u00b6 \u9996\u6b21\u6253\u5f00HomeAssistant \u00b6 \u9996\u6b21\u6253\u5f00HomeAssistant\u901a\u8fc7,\u8def\u7531\u5668\u4e3a\u5176\u5206\u914d\u7684IP\u5730\u5740\u52a0\u7aef\u53e3\u53f7\u5373\u53ef\u8fdb\u884cHomeAssistant. \u683c\u5f0f\u5982\u4e0b: http://Ip:Port \u5982:http://192.168.3.2:8123 \u57fa\u4e2d:8123\u4e3a\u5176\u9ed8\u8ba4\u7684\u7aef\u53e3\u540e,\u5f53\u7136,\u7cfb\u7edf\u521d\u59cb\u5316\u6210\u529f\u540e,\u53ef\u4ee5\u6539. \u5982\u4e0b\u56fe\u6240\u793a: \u70b9\u51fb\"\u521b\u5efa\u6211\u667a\u80fd\u5bb6\u5bb6\u5c45\"\u6309\u8fdb\u884c\u4e0b\u4e00\u6b65 \u5728\u8fd9\u91cc\u6211\u4eec\u8f93\u5165\u59d3\u540d,\u7528\u6237\u540d,\u5bc6\u7801,\u786e\u8ba4\u5bc6\u7801 \u8fd9\u91cc\u6211\u4eec\u4f7f\u7528\u7edf\u4e00\u7684\u4fe1\u606f \u59d3\u540d:\u5cb1\u7279\u667a\u80fd \u7528\u6237\u540d:dtuser \u5bc6\u7801:****** \u786e\u8ba4\u5bc6\u7801:***** \u6ce8\u610f:\u4e0a\u8ff0\u5bc6\u7801\u4e3a\u4e86\u5b89\u5168,\u6ca1\u6709\u663e\u793a,\u8bf7\u54a8\u8be2\u7cfb\u7edf\u7ba1\u7406\u5458\u83b7\u53d6\u771f\u6b63\u7684\u5bc6\u7801. \u70b9\u51fb\"\u521b\u5efa\u5e10\u6237\", \u8fd9\u4e00\u6b65,\u4f1a\u8981\u6c42\u4f60\u8f93\u5165\u4f4d\u7f6e,\u8f93\u5165\u57ce\u5e02\u70b9\u83b7\u53d6,\u5982\u679c\u53d6\u4e0b\u5230\u4f1a\u62a5\u9519.\u6ca1\u5173\u7cfb,\u76f4\u63a5\u4e0b\u4e00\u6b65\u5373\u53ef,\u7cfb\u7edf\u914d\u7f6e\u5b8c\u6210\u540e,\u8fd8\u53ef\u66f4\u6539. \u8fd9\u4e00\u6b65\u662f\u8981\u6c42,\u4f60\u8f93\u4e0b\u6240\u5c5e\u7684\u56fd\u5bb6\u4e0e\u5730\u533a,\u5b83\u4f1a\u81ea\u52a8\u5224\u65ad\u51fa\u6765,\u56fd\u5bb6,\u76f4\u63a5\u70b9\u4e0b\u4e00\u6b65\u5373\u53ef. \u6b64\u65f6,\u5b83\u53ef\u80fd\u8fd8\u4f1a\u5f39\u51fa\u4e00\u4e2a\u5bf9\u8bdd\u6846\u6846,\u5e2e\u4f60\u68c0\u6d4b\u4f4d\u7f6e ,\u70b9\u786e\u5b9a\u5373\u53ef \u5982\u679c\u4e0d\u60f3\u8ba9\u5176\u68c0\u6d4b,\u76f4\u63a5\u70b9\u53d6\u6d88\u5373\u53ef,\u56e0\u4e3a\u5176\u68c0\u6d4b\u6298\u53ef\u80fd\u5f88\u6162,\u6240\u4ee5,\u76f4\u63a5\u70b9\u53d6\u6d88,\u9009\u62e9\u4e2d\u56fd\u5373\u53ef. \u8fd9\u91cc\u7684\u51e0\u9879,\u5168\u90e8\u4e0d\u7528\u9009,\u76f4\u63a5\u4e0b\u4e00\u6b65 \u8fd9\u4e00\u6b65,\u7cfb\u7edf\u4f1a\u81ea\u52a8\u626b\u63cf\u5c40\u57df\u7f51\u4e2d\u7684\u80fd\u76f4\u63a5\u5165\u7684\u8bbe\u5907.\u76f4\u63a5\u70b9\u51fb\u5b8c\u6210, \u7136\u540e,\u7cfb\u7edf\u4f1a\u8f6c\u5230\u5982\u4e0b\u754c\u9762 \u53ef\u80fd\u8981\u6301\u7eed\u4e00\u9635,\u7b49\u5f85\u5176\u5b8c\u6210\u5373\u53ef. \u5f00\u59cb\u7b2c\u4e00\u6b21,\u53ef\u80fd\u5f88\u6162 \u9996\u6b21\u5b8c\u6210\u5982\u4e0b\u663e\u793a \u66f4\u65b0\u5fc5\u8981\u7684\u7ec4\u4ef6 \u00b6 \u9996\u6b21\u767b\u5f55,\u53ef\u80fd\u4f1a\u663e\u793a\u66f4\u65b0,\u5982\u6b64\u65f6\u663e\u793a \u63d0\u793a\u66f4\u65b0Home Assistnat Operating System Update,\u70b9\u51fb\u5982\u4e0b\u6309\u94ae,\u4ee5\u5f39\u51fa\u7684\u5bf9\u8bdd\u6846\u4e2d\uff0c\u70b9\u66f4\u65b0\u6309\u94ae \u5982\u4e0b\u56fe\u6240\u793a\uff0c\u7cfb\u7edf\u5c06\u4f1a\uff0c\u8fdb\u884c\u66f4\u65b0 \u6ce8\u610f\uff0c\u8fd9\u4e2a\u64cd\u4f5c\uff0c\u4e00\u822c\u662f\u4ece\u4e24\u4e2a\u5730\u65b9\u83b7\u53d6\u66f4\u65b0\u5305\uff0c\u4e00\u662fgithub\u4e00\u4e2a\u662fdocker\u7684\u4ed3\u5e93\uff0c\u6240\u4ee5\uff0c \u8981\u4fdd\u6301\u79d1\u5b66\u4e0a\u7f51\u7684\u7545\u901a \u3002\u8fd9\u4e2a\u8fc7\u7a0b \uff0c\u4f30\u8ba1\u8981\u51e0\u5206\u949f\uff0c\u9700\u8981\u8010\u5fc3\u7b49\u7b49\uff0c\u4e5f\u6709\u53ef\u80fd\u4f1a\u66f4\u65b0\u5931\u8d25\uff0c\u7136\u540e\uff0c\u518d\u6b21\u66f4\u65b0\u3002 \u66f4\u65b0\u65f6,\u5982\u679c\u7f51\u7edc\u6709\u95ee\u9898\u53ef\u80fd\u4f1a\u51fa\u5728\u65e5\u5fd7 \u4e2d\u62a5\u51fa\u5982\u4e0b\u9519\u8bef aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.439 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.440 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.440 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.440 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') [09:26:17] INFO: Home Assistant Core finish process exit code 0 [09:26:17] INFO: Home Assistant Core service shutdown s6-rc: info: service legacy-services successfully stopped s6-rc: info: service legacy-cont-init: stopping s6-rc: info: service legacy-cont-init successfully stopped s6-rc: info: service fix-attrs: stopping s6-rc: info: service fix-attrs successfully stopped s6-rc: info: service s6rc-oneshot-runner: stopping s6-rc: info: service s6rc-oneshot-runner successfully stopped s6-rc: info: service s6rc-oneshot-runner: starting s6-rc: info: service s6rc-oneshot-runner successfully started s6-rc: info: service fix-attrs: starting s6-rc: info: service fix-attrs successfully started s6-rc: info: service legacy-cont-init: starting s6-rc: info: service legacy-cont-init successfully started s6-rc: info: service legacy-services: starting services-up: info: copying legacy longrun home-assistant (no readiness notification) s6-rc: info: service legacy-services successfully started 2025-04-16 17:28:26.876 ERROR (MainThread) [homeassistant.components.homeassistant_alerts.coordinator] Timeout fetching homeassistant_alerts data 2025-04-16 17:51:56.276 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain hassio.update 2025-04-16 17:51:56.278 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain cloud.tts 2025-04-16 17:51:56.278 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain mobile_app.notify 2025-04-16 17:51:56.278 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain backup.sensor 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain energy.sensor 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain sun.sensor 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain homeassistant.scene 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain hassio.binary_sensor 2025-04-16 17:51:56.280 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain hassio.sensor \u4e0a\u8ff0\u9519\u8bef\u591a\u662f\u7531\u4e8e\u7f51\u7edc\u95ee\u9898\u5f15\u8d77\u7684,\u8981\u53bb\u68c0\u662f\u79d1\u5b66\u4e0a\u7f51\u662f\u5426\u8fd8\u6b63\u5e38. \u66f4\u5b8c\u5b8c\u6210\u540e,\u518d\u6b21\u542f\u52a8\u540e,\u4f1a\u663e\u793a\u6ca1\u6709\u53ef\u7528\u7684\u66f4\u65b0 \u914d\u7f6e-\u901a\u7528 \u00b6 \u70b9\u51fb,\u5f00\u59cb,\u901a\u7528 \u66f4\u6539\u540d\u79f0\u4e3a:\u5cb1\u7279\u667a\u80fd \u5176\u5b83\u7684\u4e0d\u53d8 #### \u914d\u7f6e-\u7f51\u7edc-\u4e3b\u673a\u540d \u628a\u4e3b\u673a\u540d\u914d\u7f6e\u6210\u4e3a\u5c40\u57df\u7f51\u4e2d\u552f\u4e00\u7684,\u5b9e\u9645\u8ba9\u5c31\u662f\u8ba1\u7b97\u673a\u540d,\u56e0\u4e3a\u540c\u4e00\u5c40\u57df\u7f51\u4e2d,\u8ba1\u7b97\u673a\u540d,\u4e0d\u5141\u8bb8\u76f8\u540c \u914d\u7f6e-\u8bbe\u7f6e-\u52a0\u8f7d\u9879 \u00b6 \u52a0\u8f7d\u9879\u4e2d\u6709\u8bb8\u591a\u5fc5\u88c5\u7ec4\u4ef6,\u9700\u8981\u4e00\u4e00\u5b89\u88c5,\u9996\u6b21\u8fdb\u5165\u65f6,\u53ef\u80fd\u4f1a\u663e\u793a\u5982\u4e0b\u9875\u9762 \u70b9\u51fb\u4e0b\u89d2\u7684\"\u52a0\u8f7d\u9879\u5546\u5e97\" \u5b89\u88c5File editor \u00b6 File editor \u662f\u4e00\u4e2a\u7528\u4e8e\u4fee\u6539HA\u7684\u914d\u7f6e\u6587\u4ef6\u7684\u96c6\u6210\u5de5\u5177,\u5c5e\u5fc5\u88c5\u9879,\u70b9\u51fb\u5b89\u88c5 \u70b9\u51fb\u5b89\u88c5,\u7cfb\u7edf\u4f1a\u5728\u540e\u53f0\u81ea\u52a8\u5b89\u88c5\u6b64\u63d2\u4ef6, \u5b89\u88c5\u5b8c\u6210\u540e,\u4f1a\u81ea\u52a8\u91cd\u542f \u6709\u65f6\u4e5f\u4f1a\u63d0\u793a\u5b89\u88c5\u5931\u8d25 \u8fd9\u79cd\u7ecf\u67e5\u770b\u65e5\u5fd7 \u591a\u4e3a\u7f51\u5f3a\u884c\u95ee\u9898\u65e0\u6cd5\u8bbf\u95ee.docker.io,\u8fd9\u662f\u56e0\u4e3a\u79d1\u5b66\u4e0a\u98ce\u7684\u539f\u56e0,\u91cd\u70b9\u6392\u67e5\u7f51\u7edc,\u5b89\u88c5\u6210\u529f\u540e,\u518d\u6b21\u8fdb\u5165\u4f1a\u663e\u793a\u5982\u4e0b\u754c\u9762 \u52fe\u9009,\u5f00\u673a\u542f\u52a8,\u81ea\u52a8\u6062\u590d,\u663e\u793a\u4e8e\u4fa7\u8fb9\u680f \u70b9\u51fb\u542f\u52a8,\u6216\u91cd\u542f,\u5c06\u4f1a\u5728\u4fa7\u8fb9\u680f\u770b\u5230\u6b64\u56fe\u6807,\u70b9\u51fb\u6253\u5f00\u7f51\u9875\u754c\u9762 \u80fd\u770b\u5230\u5982\u4e0b\u754c\u9762,\u8bf4\u660e\u5b89\u88c5\u6210\u529f \u6b64\u65f6\u52a0\u8f7d\u9879\u4e2d,\u5c31\u591a\u51fa\u4e86File editor\u9009\u9879 \u5b89\u88c5Samba share\u63d2\u4ef6 \u00b6 Samba share\u63d2\u4ef6\u662f\u4e00\u4e2a\u63d0\u4f9b\u5171\u4eab\u76ee\u5f55\u7684\u65b9\u5f0f\u5141\u884c\u5176\u5b83\u8ba1\u7b97\u673a\u7528\u8fd9\u79cd\u65b9\u5f0f\u67e5\u770b\u7f16\u8f91ha\u7684\u6587\u4ef6\u7684\u7ec4\u4ef6. \u70b9\u51fb\u5b89\u88c5 \u5b89\u88c5\u5931\u8d25\u65f6,\u4f1a\u6709\u5982\u4e0b\u63d0\u4e0b\u63d0\u793a \u6253\u5f00\u81ea\u52a8\u6062\u590d \u63a5\u4e0b\u6765\u6211\u4eec\u9700\u8981\u5230\u914d\u7f6e\u9009\u9879\u4e2d \u6b64\u5904\u6211\u4eec\u8bbe\u7f6e\u5982\u4e0b\u4fe1\u606f Username:dtuser Password:***** # \u6b64\u5904\u8bf7\u54a8\u8be2\u7ba1\u7406\u5458 Workgroup:WORKGROUP # \u4fdd\u6301\u4e0d\u53d8 \u66f4\u6539\u5b8c\u6210\u540e,\u6709\u5982\u4e0b\u914d\u7f6e \u914d\u7f6e \u5b8c\u6210\u540e,\u70b9\u51fb\u542f\u52a8 \u542f\u52a8\u6210\u529f\u540e,\u4f1a\u51fa\u4e0b\u56fe\u663e\u793a \u6b64\u65f6,\u5982\u679c,\u4e0eHA\u5728\u540c\u4e00\u5c40\u57df\u7f51\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u5982\u4e0b\u65b9\u5f0f\u67e5\u770bHA\u7684\u6587\u4ef6\u76ee\u5f55 \u5728\u5730\u5740\u680f\u8f93\u5165\\HA\u7684IP \u8f93\u5165\u9884\u8bbe\u7684\u7528\u6237\u540d\u4e0e\u5bc6\u7801,\u5373\u53ef\u67e5\u770b,\u7f16\u8f91HA\u7684\u5404\u79cd\u6587\u4ef6\u3002 \u5b89\u88c5Terminal & SSH \u00b6 Terminal & SSH \u63d2\u4ef6\u4e3aHA\u63d0\u4f9b\u4e86\u5728web\u7aef\u4f7f\u7528\u63a7\u5236\u53f0\u7ec8\u7aef\u529f\u80fd,\u53ca\u5f00\u542f\u4e86ssh\u670d\u52a1,\u4f7f\u4e4b\u53ef\u4ee5\u8fdc\u7a0b\u4f7f\u7528SSH\u8bbf\u95eeHA\u7ec8\u7aef\u3002 \u5728\u641c\u7d22\u4e2d\u8f93\u5165Terminal & SSH \u7ed3\u679c\u6709\u53ef\u80fd\u663e\u793a \u641c\u7d22\u4e0d\u5230\uff0c\u8fd9\u65f6\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4ed3\u5e93\u6ca1\u6709\u914d\u7f6e\uff0c\u8fd8\u662f\u4f7f\u7528\u7684\u9ed8\u8ba4\u7684\u4ed3\u5e93\uff0c\u6211\u4eec\u53ef\u4ee5\u589e\u52a0\u4e00\u4e0b\u4ed3\u5e93\uff0c\u5982\u4e0b\uff1a https://github.com/AlexxIT/hassio-addons \u70b9\u51fb\u53f3\u4e0a\u89e3\u7684\u4e09\u4e2a\u70b9,\u9009\u4e2d\u4ed3\u5e93 \u5728\u5f39\u51fa\u6298\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165,\u6211\u4eec\u8bb0\u5f55\u7684\u4ed3\u5e93\u5730\u5740,\u7136\u540e\u70b9\u6dfb\u52a0 \u5b8c\u6210\u540e,\u70b9\u51fb\u5173\u95ed. \u7136\u540e,\u70b9\u51fb\u8fd4\u56de,\u91cd\u65b0\u641c\u7d22 \u8fd9\u6b21\u627e\u5230\u4e86Advance SSH & Web Terminal \u70b9\u51fb\u5b89\u88c5,\u6253\u5f00\u5982\u4e0b\u9875\u9762 \u70b9\u51fb\u5b89\u88c5,\u6709\u65f6\u4f1a\u5b89\u88c5\u5931\u8d25, \u5931\u8d25\u540e,\u9700\u518d\u6b21\u5b89\u88c5,\u540c\u65f6\u68c0\u67e5\u65e5\u5fd7\u4e2d\u63d0\u5230\u7684\u54ea\u4e2a\u7f51\u5740\u65e0\u6cd5\u8bbf\u95ee ,\u628a\u5176\u52a0\u79d1\u5b66\u4e0a\u7f51\u7684\u4ee3\u7406\u540d\u5355\u4e2d. \u5b89\u88c5\u5b8c\u6210\u540e,\u5c31\u53d8\u6210\u5982\u4e0b \u5f00\u542f\u81ea\u52a8\u6062\u5f97,\u663e\u793a\u4fa7\u8fb9\u680f \u63a5\u4e0b\u6765,\u6211\u4eec\u914d\u7f6essh\u7684\u767b\u5f55\u4fe1\u606f,\u5982\u4e0b \u76f8\u5173\u4fe1\u606f\u5982\u4e0b: username:dtuser passsword:**** # \u6b64\u5904\u9700\u8981\u54a8\u8be2\u7ba1\u7406\u5458 \u5176\u5b83\u914d\u7f6e\u9009\u9879\u5982\u4e0b,\u6ce8\u610f\u9009\u9879,\u9009\u9519\u4e86ssh\u53ef\u80fd\u542f\u4e0d\u8d77\u6765,sftp\u5173\u95ed,zsh\u5173\u95ed.compatibility_mode\u8981\u5f00\u542f \u7136\u540e,\u70b9\u51fb\u542f\u52a8\u6309\u94ae \u542f\u52a8\u540e\u5982\u4e0b \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4e24\u4e2a\u5730\u65b9\u8fdb\u5165 \u5728\u65e5\u5fd7 \u7aef\u80fd\u770b\u5230 ssh\u5df2\u542f\u52a8\u6210\u529f s6-rc: info: service base-addon-banner successfully started s6-rc: info: service fix-attrs: starting s6-rc: info: service base-addon-log-level: starting s6-rc: info: service fix-attrs successfully started s6-rc: info: service base-addon-log-level successfully started s6-rc: info: service legacy-cont-init: starting s6-rc: info: service legacy-cont-init successfully started s6-rc: info: service init-ssh: starting s6-rc: info: service init-mysql: starting s6-rc: info: service init-mosquitto: starting s6-rc: info: service init-docker: starting s6-rc: info: service init-docker successfully started s6-rc: info: service init-mysql successfully started s6-rc: info: service init-mosquitto successfully started [14:51:05] WARNING: [14:51:05] WARNING: Logging in with a SSH password is security wise, a bad idea! [14:51:05] WARNING: Please, consider using a public/private key pair. [14:51:05] WARNING: What is this? https://kb.iu.edu/d/aews [14:51:05] WARNING: [14:51:05] NOTICE: RSA host key missing, generating one... Generating public/private rsa key pair. Your identification has been saved in /data/ssh_host_rsa_key Your public key has been saved in /data/ssh_host_rsa_key.pub The key fingerprint is: SHA256:+9pEl2QvyUqsu4B3gnPjhL/Ab71iBIDjWRdYvgZeg0c root@a0d7b954-ssh The key's randomart image is: +---[RSA 3072]----+ | . oE. | |o .o+. | |..o+.= o | | o. = o . + + | | . + S + * . | | ..+. = o . | | B.B.+ o | | X+=.= | | o=o=+o | +----[SHA256]-----+ [14:51:08] NOTICE: ED25519 host key missing, generating one... Generating public/private ed25519 key pair. Your identification has been saved in /data/ssh_host_ed25519_key Your public key has been saved in /data/ssh_host_ed25519_key.pub The key fingerprint is: SHA256:MgbUsAJ+23skjVTwD0pWVRBCmZ0BjU3jwV/99gGnNVc root@a0d7b954-ssh The key's randomart image is: +--[ED25519 256]--+ |. o+o*%O*. . E| |.. . .=+o*o o =.| | ...o+ o .. . = +| | ..*.+ o . . .o| | . =+oS. .o| | .+o .| | . . | | . | | | +----[SHA256]-----+ s6-rc: info: service init-ssh successfully started s6-rc: info: service init-user: starting [14:51:08] NOTICE: Session sharing has been disabled! s6-rc: info: service init-user successfully started s6-rc: info: service ttyd: starting s6-rc: info: service sshd: starting s6-rc: info: service sshd successfully started s6-rc: info: service ttyd successfully started s6-rc: info: service legacy-services: starting [14:51:09] INFO: Starting the ttyd daemon... [14:51:09] INFO: Starting the SSH daemon... s6-rc: info: service legacy-services successfully started Server listening on 0.0.0.0 port 22. Server listening on :: port 22. \u914d\u7f6e\u6210\u529f\u540e,\u53ef\u4ee5\u901a\u8fc7\u5982\u4e0b\u547d\u4ee4\u6765\u6d4b\u8bd5\u662f\u5426\u53ef\u4ee5\u8fdc\u7a0bSSH\u8fde\u5165 \u8f93\u5165yes\u540e\u4f1a\u8981\u6c42 \u8f93\u5165\u5bc6\u7801,\u9a8c\u8bc1\u6b63\u786e\u540e,\u4f1a\u8fdb\u5165\u770b\u5230\u5982\u4e2a\u56fe,\u5c31\u8bf4\u660essh\u5df2\u6b63\u5e38\u7684\u5f00\u542f\u6210\u529f\u4e86 \u4ee5\u4e0b\u754c\u9762\u662f\u5728ha\u4e2d\u770b\u5230\u7684\u5185\u7f6e\u7684ssh \u5176\u5b83,\u5f53\u8bbf\u95ee\u4e00\u4e9b\u7cfb\u7edf\u64cd\u4f5c\u65e0\u6743\u9650\u65f6,\u53ef\u4ee5\u5173\u95ed\u4fdd\u62a4\u5f00\u5173 \u5b89\u88c5Mosquitto broker \u00b6 Mosquitto broker\u662f\u4e00\u4e2a\u91cd\u8981\u7684\u63d2\u4ef6,\u5176\u63d0\u4f9b\u7684MQTT \u670d\u52a1\u4e3a\u516c\u53f8\u5927\u591a\u6570\u6570\u8bbe\u5907\u6298\u96c6\u6210\uff0cmqtt\u901a\u4fe1\u901a\u9053\uff0c\u6240\u4ee5\uff0c\u6b64\u4e3a\u5fc5\u88c5\u63d2\u4ef6\u3002 \u70b9\u51fb\u5b89\u88c5 \u770b\u5230\u5982\u4e0b\u754c\u9762\uff0c\u8bf4\u660e\u5b89\u88c5\u6210\u529f\uff0c \u63a5\u4e0b\u6765\u662f\u914d\u7f6emqtt \u5f00\u542f\u81ea\u52a8\u6062\u590d \u00b6 \u914d\u7f6emqtt\u7684\u7528\u6237\u540d\u5bc6\u7801\u53ca\u5b9a\u5236\u914d\u7f6e \u00b6 username:dtuser password:****** #\u6b64\u5904\u7684\u5bc6\u7801\u8bf7\u54a8\u8be2\u7ba1\u7406\u5458 \u914d\u7f6e\u5b8c\u6210\u540e,\u542f\u52a8mqtt\u670d\u52a1 \u65e5\u5fd7\u4e2d\u663e\u793a\u5982\u4e0b\u4fe1\u606f,\u8bf4\u660e\u6210\u529f s6-rc: info: service s6rc-oneshot-runner: starting s6-rc: info: service s6rc-oneshot-runner successfully started s6-rc: info: service fix-attrs: starting s6-rc: info: service fix-attrs successfully started s6-rc: info: service legacy-cont-init: starting cont-init: info: running /etc/cont-init.d/mosquitto.sh [16:33:27] INFO: Setting up user dtuser [16:33:28] INFO: SSL is not enabled cont-init: info: /etc/cont-init.d/mosquitto.sh exited 0 cont-init: info: running /etc/cont-init.d/nginx.sh cont-init: info: /etc/cont-init.d/nginx.sh exited 0 s6-rc: info: service legacy-cont-init successfully started s6-rc: info: service legacy-services: starting services-up: info: copying legacy longrun mosquitto (no readiness notification) services-up: info: copying legacy longrun nginx (no readiness notification) [16:33:29] INFO: Starting NGINX for authentication handling... s6-rc: info: service legacy-services successfully started [16:33:29] INFO: Starting mosquitto MQTT broker... 2025-04-17 16:33:29: Warning: Mosquitto should not be run as root/administrator. 2025-04-17 16:33:29: mosquitto version 2.0.20 starting 2025-04-17 16:33:29: Config loaded from /etc/mosquitto/mosquitto.conf. 2025-04-17 16:33:29: Loading plugin: /usr/share/mosquitto/go-auth.so 2025-04-17 16:33:29: \u251c\u2500\u2500 Username/password checking enabled. 2025-04-17 16:33:29: \u251c\u2500\u2500 TLS-PSK checking enabled. 2025-04-17 16:33:29: \u2514\u2500\u2500 Extended authentication not enabled. 2025-04-17 16:33:29: Opening ipv4 listen socket on port 1883. 2025-04-17 16:33:29: Opening ipv6 listen socket on port 1883. 2025-04-17 16:33:29: Opening websockets listen socket on port 1884. 2025-04-17 16:33:29: mosquitto version 2.0.20 running 2025-04-17 16:33:29: New connection from ::1:56336 on port 1883. 2025-04-17 16:33:29: Client <unknown> disconnected due to protocol error. [16:33:30] INFO: Successfully send discovery information to Home Assistant. [16:33:31] INFO: Successfully send service information to the Supervisor. \u5f53\u6d88\u606f,\u63d0\u793a\u53d1\u73b0\u8bbe\u5907\u65f6,\u70b9\u51fb,\u5f39\u51fa\u7684\u6d88\u606f\u4e2d,\u70b9check it out,\u7136\u540e,\u770b\u5230\u5df2\u53d1\u73b0mqtt,\u70b9\u51fb\u6dfb\u52a0 \u7136\u540e,\u70b9\u51fb\u5b8c\u6210 \u7136\u540e\u5c31\u4f1a\u5728\u8bbe\u7f6e-\u8bbe\u5907\u4e0e\u670d\u52a1-\u96c6\u6210\u4e2d,\u663e\u793aMqtt,\u4ee5\u540e,\u6240\u6709\u589e\u52a0\u7684MQTT\u7c7b\u8bbe\u5907\uff0c\u90fd\u4f1a\u663e\u793a\u5728\u8fd9\u4e2a\u7c7b\u522b\u4e2d\u3002 \u5b89\u88c5Node-RED\u63d2\u4ef6 \u00b6 Node-Red\u63d2\u4ef6\u662f\u6211\u4eec\u96c6\u4e2d\u5404\u79cd\u8bbe\u5907\u7684\u91cd\u8981\u6d88\u606f\u5904\u7406\u8f6c\u6362\u63d2\u4ef6,\u5c5e\u5fc5\u88c5\u63d2\u4ef6. \u5728\u52a0\u8f7d\u9879\u4e2d,\u641c\u7d22nod\u663e\u793a\u5982\u4e0b \u70b9\u51fb,\u8fdb\u5165\u8be6\u7ec6\u9875\u9762 \u70b9\u51fb\u5b89\u88c5 \u5982\u679c\u5b89\u88c5\u51fa\u9519,\u591a\u534a\u662f\u79d1\u5b66\u4e0a\u7f51\u7684\u95ee\u9898, \u5982\u73b0\u5982\u4e0b\u9875\u9762,\u8bf4\u660e\u5b89\u88c5\u6210\u529f \u5f00\u542f\u81ea\u52a8\u6062\u590d,\u5173\u95ed\u4fa7\u8fb9\u680f \u914d\u7f6enod-red \u6b64\u5904\u7684\u914d\u7f6e\u4fe1\u606f\u4e3a username:admin password:**** #\u6b64\u5904\u7684\u5bc6\u7801,\u8bf7\u5411\u7ba1\u7406\u5458\u83b7\u53d6 ### \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u5173\u95edssl \u7136\u540e\u542f\u52a8node-red \u70b9\u51fb\u6253\u5f00web-\u9875\u9762\u5982\u4e0b \u5229\u7528 Docker \u5b89\u88c5 PostgreSQL \u00b6 \u867d\u7136 Home Assistant OS \u672c\u8eab\u4e0d\u5141\u8bb8\u76f4\u63a5\u8bbf\u95ee\u7cfb\u7edf\u5e95\u5c42\uff0c\u4f46\u5b83\u5185\u7f6e\u4e86 Docker \u652f\u6301\uff0c\u56e0\u6b64\u53ef\u4ee5\u76f4\u63a5\u8fd0\u884c PostgreSQL \u7684 Docker \u5bb9\u5668\u3002 \u6b65\u9aa4 \u00b6 \u786e\u4fdd\u60a8\u6709 SSH \u8bbf\u95ee\u6743\u9650 \u5b89\u88c5 Home Assistant \u7684 SSH & Web Terminal Add-on\uff08\u9ad8\u7ea7\u6a21\u5f0f\uff09\u3002 \u5f00\u542f SSH \u8bbf\u95ee\uff0c\u5177\u4f53\u6b65\u9aa4\u5982\u4e0b\uff1a \u524d\u5f80 Supervisor > Add-on Store \u3002 \u641c\u7d22\u5e76\u5b89\u88c5 SSH & Web Terminal \uff08\u5b98\u65b9\u63d2\u4ef6\uff09\u3002 \u914d\u7f6e SSH \u63d2\u4ef6\uff0c\u786e\u4fdd protected \u8bbe\u7f6e\u4e3a false \uff0c\u7136\u540e\u542f\u52a8\u5b83\u3002 \u8fd0\u884c PostgreSQL \u5bb9\u5668 \u5728 SSH \u6216 Web Terminal \u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a BASHdocker run -d \\ --name=postgresql \\ -e POSTGRES_USER=homeassistant \\ -e POSTGRES_PASSWORD=yourpassword \\ -e POSTGRES_DB=homeassistant \\ -v /mnt/data/supervisor/postgresql:/var/lib/postgresql/data \\ -p 5432:5432 \\ postgres \u66ff\u6362 yourpassword \u4e3a\u60a8\u60f3\u8981\u8bbe\u7f6e\u7684\u6570\u636e\u5e93\u5bc6\u7801\u3002 \u6570\u636e\u5e93\u540d\u79f0\u4e3a homeassistant \uff0c\u7528\u6237\u540d\u4e3a homeassistant \u3002 \u6570\u636e\u5c06\u5b58\u50a8\u5728 /mnt/data/supervisor/postgresql \uff0c\u786e\u4fdd\u6570\u636e\u5728\u91cd\u542f\u540e\u4e0d\u4f1a\u4e22\u5931\u3002","title":"\u7cfb\u7edf\u521d\u59cb\u5316\u914d\u7f6e"},{"location":"Usages/initConfig/initConfig/#homeassistant","text":"","title":"\u521d\u59cb\u5316\u914d\u7f6eHomeAssistant"},{"location":"Usages/initConfig/initConfig/#homeassistant_1","text":"\u9996\u6b21\u6253\u5f00HomeAssistant\u901a\u8fc7,\u8def\u7531\u5668\u4e3a\u5176\u5206\u914d\u7684IP\u5730\u5740\u52a0\u7aef\u53e3\u53f7\u5373\u53ef\u8fdb\u884cHomeAssistant. \u683c\u5f0f\u5982\u4e0b: http://Ip:Port \u5982:http://192.168.3.2:8123 \u57fa\u4e2d:8123\u4e3a\u5176\u9ed8\u8ba4\u7684\u7aef\u53e3\u540e,\u5f53\u7136,\u7cfb\u7edf\u521d\u59cb\u5316\u6210\u529f\u540e,\u53ef\u4ee5\u6539. \u5982\u4e0b\u56fe\u6240\u793a: \u70b9\u51fb\"\u521b\u5efa\u6211\u667a\u80fd\u5bb6\u5bb6\u5c45\"\u6309\u8fdb\u884c\u4e0b\u4e00\u6b65 \u5728\u8fd9\u91cc\u6211\u4eec\u8f93\u5165\u59d3\u540d,\u7528\u6237\u540d,\u5bc6\u7801,\u786e\u8ba4\u5bc6\u7801 \u8fd9\u91cc\u6211\u4eec\u4f7f\u7528\u7edf\u4e00\u7684\u4fe1\u606f \u59d3\u540d:\u5cb1\u7279\u667a\u80fd \u7528\u6237\u540d:dtuser \u5bc6\u7801:****** \u786e\u8ba4\u5bc6\u7801:***** \u6ce8\u610f:\u4e0a\u8ff0\u5bc6\u7801\u4e3a\u4e86\u5b89\u5168,\u6ca1\u6709\u663e\u793a,\u8bf7\u54a8\u8be2\u7cfb\u7edf\u7ba1\u7406\u5458\u83b7\u53d6\u771f\u6b63\u7684\u5bc6\u7801. \u70b9\u51fb\"\u521b\u5efa\u5e10\u6237\", \u8fd9\u4e00\u6b65,\u4f1a\u8981\u6c42\u4f60\u8f93\u5165\u4f4d\u7f6e,\u8f93\u5165\u57ce\u5e02\u70b9\u83b7\u53d6,\u5982\u679c\u53d6\u4e0b\u5230\u4f1a\u62a5\u9519.\u6ca1\u5173\u7cfb,\u76f4\u63a5\u4e0b\u4e00\u6b65\u5373\u53ef,\u7cfb\u7edf\u914d\u7f6e\u5b8c\u6210\u540e,\u8fd8\u53ef\u66f4\u6539. \u8fd9\u4e00\u6b65\u662f\u8981\u6c42,\u4f60\u8f93\u4e0b\u6240\u5c5e\u7684\u56fd\u5bb6\u4e0e\u5730\u533a,\u5b83\u4f1a\u81ea\u52a8\u5224\u65ad\u51fa\u6765,\u56fd\u5bb6,\u76f4\u63a5\u70b9\u4e0b\u4e00\u6b65\u5373\u53ef. \u6b64\u65f6,\u5b83\u53ef\u80fd\u8fd8\u4f1a\u5f39\u51fa\u4e00\u4e2a\u5bf9\u8bdd\u6846\u6846,\u5e2e\u4f60\u68c0\u6d4b\u4f4d\u7f6e ,\u70b9\u786e\u5b9a\u5373\u53ef \u5982\u679c\u4e0d\u60f3\u8ba9\u5176\u68c0\u6d4b,\u76f4\u63a5\u70b9\u53d6\u6d88\u5373\u53ef,\u56e0\u4e3a\u5176\u68c0\u6d4b\u6298\u53ef\u80fd\u5f88\u6162,\u6240\u4ee5,\u76f4\u63a5\u70b9\u53d6\u6d88,\u9009\u62e9\u4e2d\u56fd\u5373\u53ef. \u8fd9\u91cc\u7684\u51e0\u9879,\u5168\u90e8\u4e0d\u7528\u9009,\u76f4\u63a5\u4e0b\u4e00\u6b65 \u8fd9\u4e00\u6b65,\u7cfb\u7edf\u4f1a\u81ea\u52a8\u626b\u63cf\u5c40\u57df\u7f51\u4e2d\u7684\u80fd\u76f4\u63a5\u5165\u7684\u8bbe\u5907.\u76f4\u63a5\u70b9\u51fb\u5b8c\u6210, \u7136\u540e,\u7cfb\u7edf\u4f1a\u8f6c\u5230\u5982\u4e0b\u754c\u9762 \u53ef\u80fd\u8981\u6301\u7eed\u4e00\u9635,\u7b49\u5f85\u5176\u5b8c\u6210\u5373\u53ef. \u5f00\u59cb\u7b2c\u4e00\u6b21,\u53ef\u80fd\u5f88\u6162 \u9996\u6b21\u5b8c\u6210\u5982\u4e0b\u663e\u793a","title":"\u9996\u6b21\u6253\u5f00HomeAssistant"},{"location":"Usages/initConfig/initConfig/#_1","text":"\u9996\u6b21\u767b\u5f55,\u53ef\u80fd\u4f1a\u663e\u793a\u66f4\u65b0,\u5982\u6b64\u65f6\u663e\u793a \u63d0\u793a\u66f4\u65b0Home Assistnat Operating System Update,\u70b9\u51fb\u5982\u4e0b\u6309\u94ae,\u4ee5\u5f39\u51fa\u7684\u5bf9\u8bdd\u6846\u4e2d\uff0c\u70b9\u66f4\u65b0\u6309\u94ae \u5982\u4e0b\u56fe\u6240\u793a\uff0c\u7cfb\u7edf\u5c06\u4f1a\uff0c\u8fdb\u884c\u66f4\u65b0 \u6ce8\u610f\uff0c\u8fd9\u4e2a\u64cd\u4f5c\uff0c\u4e00\u822c\u662f\u4ece\u4e24\u4e2a\u5730\u65b9\u83b7\u53d6\u66f4\u65b0\u5305\uff0c\u4e00\u662fgithub\u4e00\u4e2a\u662fdocker\u7684\u4ed3\u5e93\uff0c\u6240\u4ee5\uff0c \u8981\u4fdd\u6301\u79d1\u5b66\u4e0a\u7f51\u7684\u7545\u901a \u3002\u8fd9\u4e2a\u8fc7\u7a0b \uff0c\u4f30\u8ba1\u8981\u51e0\u5206\u949f\uff0c\u9700\u8981\u8010\u5fc3\u7b49\u7b49\uff0c\u4e5f\u6709\u53ef\u80fd\u4f1a\u66f4\u65b0\u5931\u8d25\uff0c\u7136\u540e\uff0c\u518d\u6b21\u66f4\u65b0\u3002 \u66f4\u65b0\u65f6,\u5982\u679c\u7f51\u7edc\u6709\u95ee\u9898\u53ef\u80fd\u4f1a\u51fa\u5728\u65e5\u5fd7 \u4e2d\u62a5\u51fa\u5982\u4e0b\u9519\u8bef aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.438 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.439 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.440 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.440 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') 2025-04-16 17:26:15.440 ERROR (MainThread) [homeassistant] Error doing job: Future exception was never retrieved (None) aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers') [09:26:17] INFO: Home Assistant Core finish process exit code 0 [09:26:17] INFO: Home Assistant Core service shutdown s6-rc: info: service legacy-services successfully stopped s6-rc: info: service legacy-cont-init: stopping s6-rc: info: service legacy-cont-init successfully stopped s6-rc: info: service fix-attrs: stopping s6-rc: info: service fix-attrs successfully stopped s6-rc: info: service s6rc-oneshot-runner: stopping s6-rc: info: service s6rc-oneshot-runner successfully stopped s6-rc: info: service s6rc-oneshot-runner: starting s6-rc: info: service s6rc-oneshot-runner successfully started s6-rc: info: service fix-attrs: starting s6-rc: info: service fix-attrs successfully started s6-rc: info: service legacy-cont-init: starting s6-rc: info: service legacy-cont-init successfully started s6-rc: info: service legacy-services: starting services-up: info: copying legacy longrun home-assistant (no readiness notification) s6-rc: info: service legacy-services successfully started 2025-04-16 17:28:26.876 ERROR (MainThread) [homeassistant.components.homeassistant_alerts.coordinator] Timeout fetching homeassistant_alerts data 2025-04-16 17:51:56.276 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain hassio.update 2025-04-16 17:51:56.278 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain cloud.tts 2025-04-16 17:51:56.278 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain mobile_app.notify 2025-04-16 17:51:56.278 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain backup.sensor 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain energy.sensor 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain sun.sensor 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain homeassistant.scene 2025-04-16 17:51:56.279 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain hassio.binary_sensor 2025-04-16 17:51:56.280 WARNING (MainThread) [homeassistant.helpers.translation] Failed to load integration for translation: Invalid domain hassio.sensor \u4e0a\u8ff0\u9519\u8bef\u591a\u662f\u7531\u4e8e\u7f51\u7edc\u95ee\u9898\u5f15\u8d77\u7684,\u8981\u53bb\u68c0\u662f\u79d1\u5b66\u4e0a\u7f51\u662f\u5426\u8fd8\u6b63\u5e38. \u66f4\u5b8c\u5b8c\u6210\u540e,\u518d\u6b21\u542f\u52a8\u540e,\u4f1a\u663e\u793a\u6ca1\u6709\u53ef\u7528\u7684\u66f4\u65b0","title":"\u66f4\u65b0\u5fc5\u8981\u7684\u7ec4\u4ef6"},{"location":"Usages/initConfig/initConfig/#-","text":"\u70b9\u51fb,\u5f00\u59cb,\u901a\u7528 \u66f4\u6539\u540d\u79f0\u4e3a:\u5cb1\u7279\u667a\u80fd \u5176\u5b83\u7684\u4e0d\u53d8 #### \u914d\u7f6e-\u7f51\u7edc-\u4e3b\u673a\u540d \u628a\u4e3b\u673a\u540d\u914d\u7f6e\u6210\u4e3a\u5c40\u57df\u7f51\u4e2d\u552f\u4e00\u7684,\u5b9e\u9645\u8ba9\u5c31\u662f\u8ba1\u7b97\u673a\u540d,\u56e0\u4e3a\u540c\u4e00\u5c40\u57df\u7f51\u4e2d,\u8ba1\u7b97\u673a\u540d,\u4e0d\u5141\u8bb8\u76f8\u540c","title":"\u914d\u7f6e-\u901a\u7528"},{"location":"Usages/initConfig/initConfig/#-_1","text":"\u52a0\u8f7d\u9879\u4e2d\u6709\u8bb8\u591a\u5fc5\u88c5\u7ec4\u4ef6,\u9700\u8981\u4e00\u4e00\u5b89\u88c5,\u9996\u6b21\u8fdb\u5165\u65f6,\u53ef\u80fd\u4f1a\u663e\u793a\u5982\u4e0b\u9875\u9762 \u70b9\u51fb\u4e0b\u89d2\u7684\"\u52a0\u8f7d\u9879\u5546\u5e97\"","title":"\u914d\u7f6e-\u8bbe\u7f6e-\u52a0\u8f7d\u9879"},{"location":"Usages/initConfig/initConfig/#file-editor","text":"File editor \u662f\u4e00\u4e2a\u7528\u4e8e\u4fee\u6539HA\u7684\u914d\u7f6e\u6587\u4ef6\u7684\u96c6\u6210\u5de5\u5177,\u5c5e\u5fc5\u88c5\u9879,\u70b9\u51fb\u5b89\u88c5 \u70b9\u51fb\u5b89\u88c5,\u7cfb\u7edf\u4f1a\u5728\u540e\u53f0\u81ea\u52a8\u5b89\u88c5\u6b64\u63d2\u4ef6, \u5b89\u88c5\u5b8c\u6210\u540e,\u4f1a\u81ea\u52a8\u91cd\u542f \u6709\u65f6\u4e5f\u4f1a\u63d0\u793a\u5b89\u88c5\u5931\u8d25 \u8fd9\u79cd\u7ecf\u67e5\u770b\u65e5\u5fd7 \u591a\u4e3a\u7f51\u5f3a\u884c\u95ee\u9898\u65e0\u6cd5\u8bbf\u95ee.docker.io,\u8fd9\u662f\u56e0\u4e3a\u79d1\u5b66\u4e0a\u98ce\u7684\u539f\u56e0,\u91cd\u70b9\u6392\u67e5\u7f51\u7edc,\u5b89\u88c5\u6210\u529f\u540e,\u518d\u6b21\u8fdb\u5165\u4f1a\u663e\u793a\u5982\u4e0b\u754c\u9762 \u52fe\u9009,\u5f00\u673a\u542f\u52a8,\u81ea\u52a8\u6062\u590d,\u663e\u793a\u4e8e\u4fa7\u8fb9\u680f \u70b9\u51fb\u542f\u52a8,\u6216\u91cd\u542f,\u5c06\u4f1a\u5728\u4fa7\u8fb9\u680f\u770b\u5230\u6b64\u56fe\u6807,\u70b9\u51fb\u6253\u5f00\u7f51\u9875\u754c\u9762 \u80fd\u770b\u5230\u5982\u4e0b\u754c\u9762,\u8bf4\u660e\u5b89\u88c5\u6210\u529f \u6b64\u65f6\u52a0\u8f7d\u9879\u4e2d,\u5c31\u591a\u51fa\u4e86File editor\u9009\u9879","title":"\u5b89\u88c5File editor"},{"location":"Usages/initConfig/initConfig/#samba-share","text":"Samba share\u63d2\u4ef6\u662f\u4e00\u4e2a\u63d0\u4f9b\u5171\u4eab\u76ee\u5f55\u7684\u65b9\u5f0f\u5141\u884c\u5176\u5b83\u8ba1\u7b97\u673a\u7528\u8fd9\u79cd\u65b9\u5f0f\u67e5\u770b\u7f16\u8f91ha\u7684\u6587\u4ef6\u7684\u7ec4\u4ef6. \u70b9\u51fb\u5b89\u88c5 \u5b89\u88c5\u5931\u8d25\u65f6,\u4f1a\u6709\u5982\u4e0b\u63d0\u4e0b\u63d0\u793a \u6253\u5f00\u81ea\u52a8\u6062\u590d \u63a5\u4e0b\u6765\u6211\u4eec\u9700\u8981\u5230\u914d\u7f6e\u9009\u9879\u4e2d \u6b64\u5904\u6211\u4eec\u8bbe\u7f6e\u5982\u4e0b\u4fe1\u606f Username:dtuser Password:***** # \u6b64\u5904\u8bf7\u54a8\u8be2\u7ba1\u7406\u5458 Workgroup:WORKGROUP # \u4fdd\u6301\u4e0d\u53d8 \u66f4\u6539\u5b8c\u6210\u540e,\u6709\u5982\u4e0b\u914d\u7f6e \u914d\u7f6e \u5b8c\u6210\u540e,\u70b9\u51fb\u542f\u52a8 \u542f\u52a8\u6210\u529f\u540e,\u4f1a\u51fa\u4e0b\u56fe\u663e\u793a \u6b64\u65f6,\u5982\u679c,\u4e0eHA\u5728\u540c\u4e00\u5c40\u57df\u7f51\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u5982\u4e0b\u65b9\u5f0f\u67e5\u770bHA\u7684\u6587\u4ef6\u76ee\u5f55 \u5728\u5730\u5740\u680f\u8f93\u5165\\HA\u7684IP \u8f93\u5165\u9884\u8bbe\u7684\u7528\u6237\u540d\u4e0e\u5bc6\u7801,\u5373\u53ef\u67e5\u770b,\u7f16\u8f91HA\u7684\u5404\u79cd\u6587\u4ef6\u3002","title":"\u5b89\u88c5Samba share\u63d2\u4ef6"},{"location":"Usages/initConfig/initConfig/#terminal-ssh","text":"Terminal & SSH \u63d2\u4ef6\u4e3aHA\u63d0\u4f9b\u4e86\u5728web\u7aef\u4f7f\u7528\u63a7\u5236\u53f0\u7ec8\u7aef\u529f\u80fd,\u53ca\u5f00\u542f\u4e86ssh\u670d\u52a1,\u4f7f\u4e4b\u53ef\u4ee5\u8fdc\u7a0b\u4f7f\u7528SSH\u8bbf\u95eeHA\u7ec8\u7aef\u3002 \u5728\u641c\u7d22\u4e2d\u8f93\u5165Terminal & SSH \u7ed3\u679c\u6709\u53ef\u80fd\u663e\u793a \u641c\u7d22\u4e0d\u5230\uff0c\u8fd9\u65f6\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4ed3\u5e93\u6ca1\u6709\u914d\u7f6e\uff0c\u8fd8\u662f\u4f7f\u7528\u7684\u9ed8\u8ba4\u7684\u4ed3\u5e93\uff0c\u6211\u4eec\u53ef\u4ee5\u589e\u52a0\u4e00\u4e0b\u4ed3\u5e93\uff0c\u5982\u4e0b\uff1a https://github.com/AlexxIT/hassio-addons \u70b9\u51fb\u53f3\u4e0a\u89e3\u7684\u4e09\u4e2a\u70b9,\u9009\u4e2d\u4ed3\u5e93 \u5728\u5f39\u51fa\u6298\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165,\u6211\u4eec\u8bb0\u5f55\u7684\u4ed3\u5e93\u5730\u5740,\u7136\u540e\u70b9\u6dfb\u52a0 \u5b8c\u6210\u540e,\u70b9\u51fb\u5173\u95ed. \u7136\u540e,\u70b9\u51fb\u8fd4\u56de,\u91cd\u65b0\u641c\u7d22 \u8fd9\u6b21\u627e\u5230\u4e86Advance SSH & Web Terminal \u70b9\u51fb\u5b89\u88c5,\u6253\u5f00\u5982\u4e0b\u9875\u9762 \u70b9\u51fb\u5b89\u88c5,\u6709\u65f6\u4f1a\u5b89\u88c5\u5931\u8d25, \u5931\u8d25\u540e,\u9700\u518d\u6b21\u5b89\u88c5,\u540c\u65f6\u68c0\u67e5\u65e5\u5fd7\u4e2d\u63d0\u5230\u7684\u54ea\u4e2a\u7f51\u5740\u65e0\u6cd5\u8bbf\u95ee ,\u628a\u5176\u52a0\u79d1\u5b66\u4e0a\u7f51\u7684\u4ee3\u7406\u540d\u5355\u4e2d. \u5b89\u88c5\u5b8c\u6210\u540e,\u5c31\u53d8\u6210\u5982\u4e0b \u5f00\u542f\u81ea\u52a8\u6062\u5f97,\u663e\u793a\u4fa7\u8fb9\u680f \u63a5\u4e0b\u6765,\u6211\u4eec\u914d\u7f6essh\u7684\u767b\u5f55\u4fe1\u606f,\u5982\u4e0b \u76f8\u5173\u4fe1\u606f\u5982\u4e0b: username:dtuser passsword:**** # \u6b64\u5904\u9700\u8981\u54a8\u8be2\u7ba1\u7406\u5458 \u5176\u5b83\u914d\u7f6e\u9009\u9879\u5982\u4e0b,\u6ce8\u610f\u9009\u9879,\u9009\u9519\u4e86ssh\u53ef\u80fd\u542f\u4e0d\u8d77\u6765,sftp\u5173\u95ed,zsh\u5173\u95ed.compatibility_mode\u8981\u5f00\u542f \u7136\u540e,\u70b9\u51fb\u542f\u52a8\u6309\u94ae \u542f\u52a8\u540e\u5982\u4e0b \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4e24\u4e2a\u5730\u65b9\u8fdb\u5165 \u5728\u65e5\u5fd7 \u7aef\u80fd\u770b\u5230 ssh\u5df2\u542f\u52a8\u6210\u529f s6-rc: info: service base-addon-banner successfully started s6-rc: info: service fix-attrs: starting s6-rc: info: service base-addon-log-level: starting s6-rc: info: service fix-attrs successfully started s6-rc: info: service base-addon-log-level successfully started s6-rc: info: service legacy-cont-init: starting s6-rc: info: service legacy-cont-init successfully started s6-rc: info: service init-ssh: starting s6-rc: info: service init-mysql: starting s6-rc: info: service init-mosquitto: starting s6-rc: info: service init-docker: starting s6-rc: info: service init-docker successfully started s6-rc: info: service init-mysql successfully started s6-rc: info: service init-mosquitto successfully started [14:51:05] WARNING: [14:51:05] WARNING: Logging in with a SSH password is security wise, a bad idea! [14:51:05] WARNING: Please, consider using a public/private key pair. [14:51:05] WARNING: What is this? https://kb.iu.edu/d/aews [14:51:05] WARNING: [14:51:05] NOTICE: RSA host key missing, generating one... Generating public/private rsa key pair. Your identification has been saved in /data/ssh_host_rsa_key Your public key has been saved in /data/ssh_host_rsa_key.pub The key fingerprint is: SHA256:+9pEl2QvyUqsu4B3gnPjhL/Ab71iBIDjWRdYvgZeg0c root@a0d7b954-ssh The key's randomart image is: +---[RSA 3072]----+ | . oE. | |o .o+. | |..o+.= o | | o. = o . + + | | . + S + * . | | ..+. = o . | | B.B.+ o | | X+=.= | | o=o=+o | +----[SHA256]-----+ [14:51:08] NOTICE: ED25519 host key missing, generating one... Generating public/private ed25519 key pair. Your identification has been saved in /data/ssh_host_ed25519_key Your public key has been saved in /data/ssh_host_ed25519_key.pub The key fingerprint is: SHA256:MgbUsAJ+23skjVTwD0pWVRBCmZ0BjU3jwV/99gGnNVc root@a0d7b954-ssh The key's randomart image is: +--[ED25519 256]--+ |. o+o*%O*. . E| |.. . .=+o*o o =.| | ...o+ o .. . = +| | ..*.+ o . . .o| | . =+oS. .o| | .+o .| | . . | | . | | | +----[SHA256]-----+ s6-rc: info: service init-ssh successfully started s6-rc: info: service init-user: starting [14:51:08] NOTICE: Session sharing has been disabled! s6-rc: info: service init-user successfully started s6-rc: info: service ttyd: starting s6-rc: info: service sshd: starting s6-rc: info: service sshd successfully started s6-rc: info: service ttyd successfully started s6-rc: info: service legacy-services: starting [14:51:09] INFO: Starting the ttyd daemon... [14:51:09] INFO: Starting the SSH daemon... s6-rc: info: service legacy-services successfully started Server listening on 0.0.0.0 port 22. Server listening on :: port 22. \u914d\u7f6e\u6210\u529f\u540e,\u53ef\u4ee5\u901a\u8fc7\u5982\u4e0b\u547d\u4ee4\u6765\u6d4b\u8bd5\u662f\u5426\u53ef\u4ee5\u8fdc\u7a0bSSH\u8fde\u5165 \u8f93\u5165yes\u540e\u4f1a\u8981\u6c42 \u8f93\u5165\u5bc6\u7801,\u9a8c\u8bc1\u6b63\u786e\u540e,\u4f1a\u8fdb\u5165\u770b\u5230\u5982\u4e2a\u56fe,\u5c31\u8bf4\u660essh\u5df2\u6b63\u5e38\u7684\u5f00\u542f\u6210\u529f\u4e86 \u4ee5\u4e0b\u754c\u9762\u662f\u5728ha\u4e2d\u770b\u5230\u7684\u5185\u7f6e\u7684ssh \u5176\u5b83,\u5f53\u8bbf\u95ee\u4e00\u4e9b\u7cfb\u7edf\u64cd\u4f5c\u65e0\u6743\u9650\u65f6,\u53ef\u4ee5\u5173\u95ed\u4fdd\u62a4\u5f00\u5173","title":"\u5b89\u88c5Terminal & SSH"},{"location":"Usages/initConfig/initConfig/#mosquitto-broker","text":"Mosquitto broker\u662f\u4e00\u4e2a\u91cd\u8981\u7684\u63d2\u4ef6,\u5176\u63d0\u4f9b\u7684MQTT \u670d\u52a1\u4e3a\u516c\u53f8\u5927\u591a\u6570\u6570\u8bbe\u5907\u6298\u96c6\u6210\uff0cmqtt\u901a\u4fe1\u901a\u9053\uff0c\u6240\u4ee5\uff0c\u6b64\u4e3a\u5fc5\u88c5\u63d2\u4ef6\u3002 \u70b9\u51fb\u5b89\u88c5 \u770b\u5230\u5982\u4e0b\u754c\u9762\uff0c\u8bf4\u660e\u5b89\u88c5\u6210\u529f\uff0c \u63a5\u4e0b\u6765\u662f\u914d\u7f6emqtt","title":"\u5b89\u88c5Mosquitto broker"},{"location":"Usages/initConfig/initConfig/#_2","text":"","title":"\u5f00\u542f\u81ea\u52a8\u6062\u590d"},{"location":"Usages/initConfig/initConfig/#mqtt","text":"username:dtuser password:****** #\u6b64\u5904\u7684\u5bc6\u7801\u8bf7\u54a8\u8be2\u7ba1\u7406\u5458 \u914d\u7f6e\u5b8c\u6210\u540e,\u542f\u52a8mqtt\u670d\u52a1 \u65e5\u5fd7\u4e2d\u663e\u793a\u5982\u4e0b\u4fe1\u606f,\u8bf4\u660e\u6210\u529f s6-rc: info: service s6rc-oneshot-runner: starting s6-rc: info: service s6rc-oneshot-runner successfully started s6-rc: info: service fix-attrs: starting s6-rc: info: service fix-attrs successfully started s6-rc: info: service legacy-cont-init: starting cont-init: info: running /etc/cont-init.d/mosquitto.sh [16:33:27] INFO: Setting up user dtuser [16:33:28] INFO: SSL is not enabled cont-init: info: /etc/cont-init.d/mosquitto.sh exited 0 cont-init: info: running /etc/cont-init.d/nginx.sh cont-init: info: /etc/cont-init.d/nginx.sh exited 0 s6-rc: info: service legacy-cont-init successfully started s6-rc: info: service legacy-services: starting services-up: info: copying legacy longrun mosquitto (no readiness notification) services-up: info: copying legacy longrun nginx (no readiness notification) [16:33:29] INFO: Starting NGINX for authentication handling... s6-rc: info: service legacy-services successfully started [16:33:29] INFO: Starting mosquitto MQTT broker... 2025-04-17 16:33:29: Warning: Mosquitto should not be run as root/administrator. 2025-04-17 16:33:29: mosquitto version 2.0.20 starting 2025-04-17 16:33:29: Config loaded from /etc/mosquitto/mosquitto.conf. 2025-04-17 16:33:29: Loading plugin: /usr/share/mosquitto/go-auth.so 2025-04-17 16:33:29: \u251c\u2500\u2500 Username/password checking enabled. 2025-04-17 16:33:29: \u251c\u2500\u2500 TLS-PSK checking enabled. 2025-04-17 16:33:29: \u2514\u2500\u2500 Extended authentication not enabled. 2025-04-17 16:33:29: Opening ipv4 listen socket on port 1883. 2025-04-17 16:33:29: Opening ipv6 listen socket on port 1883. 2025-04-17 16:33:29: Opening websockets listen socket on port 1884. 2025-04-17 16:33:29: mosquitto version 2.0.20 running 2025-04-17 16:33:29: New connection from ::1:56336 on port 1883. 2025-04-17 16:33:29: Client <unknown> disconnected due to protocol error. [16:33:30] INFO: Successfully send discovery information to Home Assistant. [16:33:31] INFO: Successfully send service information to the Supervisor. \u5f53\u6d88\u606f,\u63d0\u793a\u53d1\u73b0\u8bbe\u5907\u65f6,\u70b9\u51fb,\u5f39\u51fa\u7684\u6d88\u606f\u4e2d,\u70b9check it out,\u7136\u540e,\u770b\u5230\u5df2\u53d1\u73b0mqtt,\u70b9\u51fb\u6dfb\u52a0 \u7136\u540e,\u70b9\u51fb\u5b8c\u6210 \u7136\u540e\u5c31\u4f1a\u5728\u8bbe\u7f6e-\u8bbe\u5907\u4e0e\u670d\u52a1-\u96c6\u6210\u4e2d,\u663e\u793aMqtt,\u4ee5\u540e,\u6240\u6709\u589e\u52a0\u7684MQTT\u7c7b\u8bbe\u5907\uff0c\u90fd\u4f1a\u663e\u793a\u5728\u8fd9\u4e2a\u7c7b\u522b\u4e2d\u3002","title":"\u914d\u7f6emqtt\u7684\u7528\u6237\u540d\u5bc6\u7801\u53ca\u5b9a\u5236\u914d\u7f6e"},{"location":"Usages/initConfig/initConfig/#node-red","text":"Node-Red\u63d2\u4ef6\u662f\u6211\u4eec\u96c6\u4e2d\u5404\u79cd\u8bbe\u5907\u7684\u91cd\u8981\u6d88\u606f\u5904\u7406\u8f6c\u6362\u63d2\u4ef6,\u5c5e\u5fc5\u88c5\u63d2\u4ef6. \u5728\u52a0\u8f7d\u9879\u4e2d,\u641c\u7d22nod\u663e\u793a\u5982\u4e0b \u70b9\u51fb,\u8fdb\u5165\u8be6\u7ec6\u9875\u9762 \u70b9\u51fb\u5b89\u88c5 \u5982\u679c\u5b89\u88c5\u51fa\u9519,\u591a\u534a\u662f\u79d1\u5b66\u4e0a\u7f51\u7684\u95ee\u9898, \u5982\u73b0\u5982\u4e0b\u9875\u9762,\u8bf4\u660e\u5b89\u88c5\u6210\u529f \u5f00\u542f\u81ea\u52a8\u6062\u590d,\u5173\u95ed\u4fa7\u8fb9\u680f \u914d\u7f6enod-red \u6b64\u5904\u7684\u914d\u7f6e\u4fe1\u606f\u4e3a username:admin password:**** #\u6b64\u5904\u7684\u5bc6\u7801,\u8bf7\u5411\u7ba1\u7406\u5458\u83b7\u53d6 ### \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u5173\u95edssl \u7136\u540e\u542f\u52a8node-red \u70b9\u51fb\u6253\u5f00web-\u9875\u9762\u5982\u4e0b","title":"\u5b89\u88c5Node-RED\u63d2\u4ef6"},{"location":"Usages/initConfig/initConfig/#docker-postgresql","text":"\u867d\u7136 Home Assistant OS \u672c\u8eab\u4e0d\u5141\u8bb8\u76f4\u63a5\u8bbf\u95ee\u7cfb\u7edf\u5e95\u5c42\uff0c\u4f46\u5b83\u5185\u7f6e\u4e86 Docker \u652f\u6301\uff0c\u56e0\u6b64\u53ef\u4ee5\u76f4\u63a5\u8fd0\u884c PostgreSQL \u7684 Docker \u5bb9\u5668\u3002","title":"\u5229\u7528 Docker \u5b89\u88c5 PostgreSQL"},{"location":"Usages/initConfig/initConfig/#_3","text":"\u786e\u4fdd\u60a8\u6709 SSH \u8bbf\u95ee\u6743\u9650 \u5b89\u88c5 Home Assistant \u7684 SSH & Web Terminal Add-on\uff08\u9ad8\u7ea7\u6a21\u5f0f\uff09\u3002 \u5f00\u542f SSH \u8bbf\u95ee\uff0c\u5177\u4f53\u6b65\u9aa4\u5982\u4e0b\uff1a \u524d\u5f80 Supervisor > Add-on Store \u3002 \u641c\u7d22\u5e76\u5b89\u88c5 SSH & Web Terminal \uff08\u5b98\u65b9\u63d2\u4ef6\uff09\u3002 \u914d\u7f6e SSH \u63d2\u4ef6\uff0c\u786e\u4fdd protected \u8bbe\u7f6e\u4e3a false \uff0c\u7136\u540e\u542f\u52a8\u5b83\u3002 \u8fd0\u884c PostgreSQL \u5bb9\u5668 \u5728 SSH \u6216 Web Terminal \u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a BASHdocker run -d \\ --name=postgresql \\ -e POSTGRES_USER=homeassistant \\ -e POSTGRES_PASSWORD=yourpassword \\ -e POSTGRES_DB=homeassistant \\ -v /mnt/data/supervisor/postgresql:/var/lib/postgresql/data \\ -p 5432:5432 \\ postgres \u66ff\u6362 yourpassword \u4e3a\u60a8\u60f3\u8981\u8bbe\u7f6e\u7684\u6570\u636e\u5e93\u5bc6\u7801\u3002 \u6570\u636e\u5e93\u540d\u79f0\u4e3a homeassistant \uff0c\u7528\u6237\u540d\u4e3a homeassistant \u3002 \u6570\u636e\u5c06\u5b58\u50a8\u5728 /mnt/data/supervisor/postgresql \uff0c\u786e\u4fdd\u6570\u636e\u5728\u91cd\u542f\u540e\u4e0d\u4f1a\u4e22\u5931\u3002","title":"\u6b65\u9aa4"},{"location":"Usages/initConfig/installHacs/","text":"","title":"installHacs"},{"location":"Usages/netconfig/netconfig/","text":"\u914d\u7f6e\u7f51\u7edc \u00b6 \u516c\u53f8\u4f7f\u7528\u7684X86\u5c0f\u5de5\u63a7\u673a,\u5927\u591a\u6709\u591a\u4e2a\u7f51\u5361,\u4e00\u822c\u4e00\u4e2a\u65e0\u7ebf\u7f51\u5361,\u4e24\u4e2a\u6709\u7ebf\u7f51\u5361.\u591a\u6570\u60c5\u51b5\u4e0b,\u6211\u4eec\u53ef\u80fd\u662f\u4f7f\u7528\u7684WIFI\u7f51\u7edc\uff0c\u8fd9\u6837\u6bd4\u8f83\u65b9\u4fbf\uff0c\u6709\u65f6\u4e3a\u4e86HA\u63d0\u4f9b\u7684\u670d\u52a1\u6298\u7a33\u5b9a\u6027\uff0c\u6211\u4eec\u5c3d\u91cf\u4f7f\u7528LAN\u7ebf\u7f51\u7edc\uff0c\u907f\u514d\u65e0\u7ebf\u7f51\u4fe1\u53f7\u8d28\u91cf\u7684\u95ee\u9898\u3002\u6240\u4ee5\u5c31\u6d89\u53ca\u5230\u914d\u7f51\u7684\u95ee\u9898\u3002 HomeAssistant\u7684\u7f51\u7edc\u914d\u7f6e,\u5728\u7cfb\u7edf\u6ca1\u6709\u5b89\u88c5\u6210\u529f\u4e4b\u524d,\u4e0d\u80fd\u901a\u8fc7web\u8fdb\u5165\u7f51\u9875\u754c\u9762\u65f6,\u914d\u7f6e\u7f51\u7edc\u53ea\u80fd\u901a\u8fc7\u81ea\u5e26\u7f51\u7edc\u914d\u7f6e\u547d\u4ee4\u6765\u8fdb\u884c. \u719f\u6089\u7f51\u7edc\u914d\u7f6e\u547d\u4ee4 \u00b6 HomeAssistant Cli \u63d0\u4f9b\u4e86\u9ed8\u4fe1\u6298network\u914d\u7f6e\u547d\u4ee4\u5982\u4e0b: ha netWork Useage: ha network [command] Examples: ha network info ha network interface options Available Commands: info Shows information about the host network reload Reload Network information the host scan Scan for Access Points on a wireless interface. update Update settings of a network interface vlan Create a new VLAN on an ethernet interface Flags: -h, --help help for network Global Flags: --api-token string Home Assistant Supervisor API token --config string Optional config file (default is $HOME/.homeassistant.yaml) --endpoint string Endpoint for Home Assistant Supervisor (default is'supervisor') --log-level string Log level (defaults to Warn) --no-progress Disable the progress spinner --raw-json Output raw JSON from the API Use \"ha network [command] --help\" for more information about a command. \u8fd9\u4e2aha network\u547d\u4ee4,\u5927\u7ea6\u5982\u4e0b\u51e0\u4e2a\u529f\u80fd info \u663e\u793a\u7f51\u7edc\u914d\u7f6e\u4fe1\u606f reload \u91cd\u65b0\u52a0\u8f7d\u7f51\u7edc scan \u626b\u63cf\u7f51\u7edc update \u914d\u7f6e\u7f51\u7edc \u6211\u4eec\u5728\u4f7f\u7528\u8fd9\u4e2a\u547d\u4ee4\u65f6,\u53ef\u4ee5\u4f7f\u7528\u5176\u7b80\u5199,\u6bd4\u5982\u7701\u53bb\u524d\u9762\u7684ha,\u8fd8\u53ef\u4ee5\u7701\u53bb\u540e\u9762\u7684work \u6bd4\u5982,\u6211\u4eec\u60f3\u67e5\u770b\u7f51\u7edc\u914d\u7f6e\u4fe1\u606f,\u53ef\u4ee5\u7528\u5982\u4e0b\u547d\u4ee4\u6765\u8fdb\u884c net info \u8fd9\u6761\u547d\u4ee4\u5c31\u4f1a\u628a\u6240\u6709\u7684\u7f51\u7edc\u914d\u7f6e\u4fe1\u606f\u5168\u90e8\u663e\u793a\u51fa\u6765,\u53ea\u662f\u5982\u679c\u7f51\u5361\u8f83\u591a,\u6211\u4eec\u6ca1\u6709\u6cd5\u5728\u4e00\u5c4f\u5168\u90e8\u9605\u8bfb\u5b8c,\u6240\u4ee5\u8fd9\u5c31\u5f15\u53d1\u53e6\u4e00\u4e2a\u95ee\u9898.netwrok\u6240\u6709\u7684\u5b50\u547d\u4ee4,\u540e\u9762\u90fd\u662f\u53ef\u4ee5\u6216\u5fc5\u987b\u8ddf\u7740\u64cd\u4f5c\u5bf9\u50cf\u6765\u8fdb\u884c\u7684,\u5177\u4f53\u7684\u5c31\u662f,\u64cd\u4f5c\u6216\u663e\u793a\u54ea\u4e2a\u7f51\u5361\u63a5\u53e3.\u4e00\u822c\u60c5\u51b5\u4e0b\u662f\u5982\u4e0b\u578b\u5f0f net [command] [interface] \u5373 net [\u5b50\u547d\u4ee4] [\u7f51\u5361\u540d\u79f0] \u90a3\u4e48\u5982\u4f55\u67e5\u770b\u7f51\u5361\u540d\u79f0\u5462,\u5728haos \u7684cli\u63a7\u5236\u53f0\u754c\u9762,\u4efb\u610f\u65f6\u95f4,\u540c\u65f6\u6309\u4e0b ctrl+c \u540e,ha\u7684\u754c\u9762\u8fd4\u56de\u5230\u5f85\u673a\u754c\u9762,\u5982\u4e0b\u56fe\u6240\u793a. \u56fe\u4e2d\u5171\u663e\u793a\u4e86\u4e09\u4e2a\u7f51\u5361\u63a5\u53e3: wlp3s0 \u8fd9\u4e2a\u662f\u65e0\u7ebf\u7f51\u5361\u63a5\u53e3\u7684\u540d\u79f0,\u4e00\u822c\u60c5\u51b5\u4e0bw\u5b57\u7b26\u6253\u5934\u7684\u6211\u4e3a\u65e0\u7ebf\u7f51\u5361 enp2s0 \u8fd9\u4e2a\u5bf9\u5e94\u5c0f\u4e3b\u673a\u4e0a\u5c31\u662fLNA1,\u6709\u7ebf\u7f51\u53611\u7684\u540d\u79f0 enp4s0 \u8fd9\u4e2a\u5bf9\u5e94\u5c0f\u4e3b\u673a\u4e0a\u5c31\u662fLNA2,\u6709\u7ebf\u7f51\u53611\u7684\u540d\u79f0 \u67e5\u770b\u5230\u4e86\u8fd9\u4e09\u4e2a\u7f51\u5361\u540d\u79f0,\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u7f51\u5361\u8fdb\u884c\u67e5\u770b\u4fe1\u606f\u914d\u7f6e\u7b49. \u5bf9\u6709\u521d\u88c5\u7684HAOS\u8fd8\u6709\u51c6\u5907\u8fdb\u884cUdate\u7684\u5c0f\u4e3b\u673a,\u6700\u597d,\u5c31\u662f\u5728\u8def\u7531\u5668\u7aef \u9ed8\u8ba4\u63d0\u4f9b\u79d1\u5b66\u4e0a\u7f51 ,\u5426\u5219\u5728\u65b0\u5b89\u88c5\u6298\u521d\u59cb\u5316\u90a3\u91cc\u5c31\u4f1a\u88ab\u6c38\u8fdc\u5361\u4f4f,\u65e0\u6cd5\u5b89\u88c5\u6210\u529f,\u5982\u679c\u662f\u81ea\u52a8\u66f4\u65b0,\u90a3\u4e48\u5c06\u4f1a\u66f4\u65b0\u5931\u8d25. \u914d\u7f6e\u7f51\u7edc \u00b6 \u4e00\u822c\u60c5\u51b5\u4e0b,\u5bf9\u4e8eenp2s0,enp4s0,\u5982\u679c\u8def\u7531\u5668\u7aef\u63d0\u4f9b\u4e86\u81ea\u52a8\u83b7\u53d6IP\u5730\u5740\u529f\u80fd\uff0c\u5219\u65e0\u9700\u914d\u7f6e\uff0c\u7f51\u7ebf\u63d2\u5165\u5373\u53ef\u4f7f\u7528\u3002 \u4f46\u662f\u5bf9\u4e8e\u6bd4\u8f83\u590d\u6742\u7684\u7f51\u7edc\u5219\u9700\u8981\u914d\u7f6e\uff0c\u540c\u6837\uff0c\u5982\u679c\u60f3\u4f7f\u7528wifi\u7f51\u7edc,\u4e5f\u9700\u8981\u914d\u7f6e . \u914d\u7f6e\u7f51\u7edc\u7684\u547d\u4ee4\u5982\u4e0b: ha > net update Usage: ha network update [interface] [flags] Aliases: update, set, up Examples: ha network update eth0 --ipv4-method auto --ipv6-method disabled Flags: -e, --disabled Disable interface -h, --help help for update --ipv4-address stringArray IPv4 address for the interface in the 192.168.1.5/24 --ipv4-gateway string The IPv4 gateway the interface should use --ipv4-method string Method on IPv4: static|auto|disabled --ipv4-nameserver stringArray IPv4 address of upstream DNS servers. Use multiple times for multiple servers. --ipv6-address stringArray IPv6 address for the interface in the 2001:0db8:85a3:0000:0000:8a2e:0370:7334/64 --ipv6-gateway string The IPv6 gateway the interface should use --ipv6-method string Method on IPv6: static|auto|disabled --ipv6-nameserver stringArray IPv6 address for upstream DNS servers. Use multiple times for multiple servers. --wifi-auth string Used authentication: open, wep, wpa-psk --wifi-mode string Wifi mode: infrastructure, adhoc, mesh or ap --wifi-psk string Shared authentication key for wep or wpa --wifi-ssid string SSID for wifi connection Global Flags: --api-token string Home Assistant Supervisor API token --config string Optional config file (default is $HOME/.homeassistant.yaml) --endpoint string Endpoint for Home Assistant Supervisor (default is `supervisor`) --log-level string Log level (defaults to Warn) --no-progress Disable the progress spinner --raw-json Output raw JSON from the API \u8fd9\u6761\u547d\u4ee4ha network update [interface] [flags],\u63d0\u4f9b\u4e86\u5f88\u591a\u529f\u80fd,\u5b83\u53ef\u4ee5\u914d\u7f6ewif\u7f51\u7edc,\u53ef\u4ee5\u5bf9\u6307\u5b9a\u7684\u7f51\u5361\u914d\u7f6eip4/6\u7684IP\u5730\u5740\uff0c\u7f51\u5173\uff0c\u662f\u5426\u542f\u7528\u7b49.\u56e0\u6b64\u53ef\u4ee5\u5728\u5b9e\u9645\u5de5\u4f5c\u4e2d\u7075\u6d3b\u4f7f\u7528. \u5177\u4f53\u7528\u6cd5\u7b80\u8bd1\u5982\u4e0b ha > net update Usage: ha network update [interface] [flags] Aliases: update, set, up Examples: ha network update eth0 --ipv4-method auto --ipv6-method disabled Flags: -e, --disabled \u7981\u7528\u63a5\u53e3 -h, --help \u663e\u793a\u66f4\u65b0\u7684\u5e2e\u52a9\u4fe1\u606f --ipv4-address stringArray \u63a5\u53e3\u7684 IPv4 \u5730\u5740\uff0c\u4f8b\u5982 192.168.1.5/24 --ipv4-gateway string \u63a5\u53e3\u4f7f\u7528\u7684 IPv4 \u7f51\u5173 --ipv4-method string IPv4 \u65b9\u6cd5: static|auto|disabled --ipv4-nameserver stringArray \u4e0a\u6e38 DNS \u670d\u52a1\u5668\u7684 IPv4 \u5730\u5740\uff0c\u53ef\u591a\u6b21\u4f7f\u7528\u4ee5\u6307\u5b9a\u591a\u4e2a\u670d\u52a1\u5668 --ipv6-address stringArray \u63a5\u53e3\u7684 IPv6 \u5730\u5740\uff0c\u4f8b\u5982 2001:0db8:85a3:0000:0000:8a2e:0370:7334/64 --ipv6-gateway string \u63a5\u53e3\u4f7f\u7528\u7684 IPv6 \u7f51\u5173 --ipv6-method string IPv6 \u65b9\u6cd5: static|auto|disabled --ipv6-nameserver stringArray \u4e0a\u6e38 DNS \u670d\u52a1\u5668\u7684 IPv6 \u5730\u5740\uff0c\u53ef\u591a\u6b21\u4f7f\u7528\u4ee5\u6307\u5b9a\u591a\u4e2a\u670d\u52a1\u5668 --wifi-auth string \u4f7f\u7528\u7684\u8ba4\u8bc1\u65b9\u5f0f: open, wep, wpa-psk --wifi-mode string WiFi \u6a21\u5f0f: infrastructure, adhoc, mesh \u6216 ap --wifi-psk string WEP \u6216 WPA \u7684\u5171\u4eab\u8ba4\u8bc1\u5bc6\u94a5 --wifi-ssid string WiFi \u8fde\u63a5\u7684 SSID Global Flags: --api-token string Home Assistant Supervisor API \u4ee4\u724c --config string \u53ef\u9009\u7684\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\uff08\u9ed8\u8ba4\u503c\u4e3a $HOME/.homeassistant.yaml\uff09 --endpoint string Home Assistant Supervisor \u7684\u7aef\u70b9\uff08\u9ed8\u8ba4\u503c\u4e3a `supervisor`\uff09 --log-level string \u65e5\u5fd7\u7ea7\u522b\uff08\u9ed8\u8ba4\u503c\u4e3a Warn\uff09 --no-progress \u7981\u7528\u8fdb\u5ea6\u6761 --raw-json \u4ee5\u539f\u59cb JSON \u683c\u5f0f\u8f93\u51fa API \u6570\u636e FATA[0000] Error while executing rootCmd: accepts 1 arg(s), received 0 \u4e0b\u9762,\u6211\u4eec\u5c31\u4ee5\u914d\u7f6ewifi\u8054\u63a5\u5230\u7f51\u7edc\u4e3a\u4f8b\u8bf4\u660e\u4e00\u4e0b: \u6bd4\u5982\u6211\u4eec\u9ed8\u8ba4\u7684WIFI\u70ed\u70b9\u5982\u4e0b: wifi info: ssid:DT_IoT_GateWay passWord:HnczjTyrb0 \u90a3\u6839\u636e\u6211\u4eec\u4e0a\u6587\u67e5\u770b\u5230\u7684\u65e0\u7ebf\u7f51\u5361\u7684\u540d\u79f0: wlp3s0 \u6211\u4eec\u4f7f\u7528\u5982\u4e0b\u914d\u7f6e\u547d\u4ee4,\u6765\u8ba9haos\u5c0f\u5de5\u63a7\u673a\u8054\u4e0awifi\u7f51\u7edc: ha network update wlp3s0 --wifi-auth wpa-psk --wifi-psk \"HmczjTYrb0\" --wifi-mode infrastructure --wifi-ssid \"DT_IoT_GateWay\" --ipv4-method auto --ipv6-method disabled \u8fd9\u6761\u547d\u4ee4\u89e3\u91ca\u5982\u4e0b: \u6307\u5b9awifi\u7684\u5bc6\u7801\u65b9\u5f0f\u4e3a:wpa-psk (--wifi-auth wpa-psk). \u6307\u5b9awif\u7684\u5bc6\u7801\u4e3a:HnczjTyrb0 (--wifi-psk \"HmczjYrb0\"). \u6307\u5b9a\u7f51\u5361\u63a5\u53e3\u6a21\u5f0f\u4e3a:infrastructure \u5373\u5e38\u89c4\u6a21\u5f0f (--wifi-mode infrastructure). \u6307\u5b9a\u8981\u8054\u63a5\u7684\u7f51\u7edcSSID:DT_IoT_GateWay (--wifi-ssid \"DT_IoT_GateWay\"). \u6307\u5b9aIP\u5730\u5740\u83b7\u53d6\u65b9\u5f0f\uff08\u9759\u6001\u3001\u81ea\u52a8\u3001\u7981\u7528\uff09\uff1a\u81ea\u52a8 ( --ipv4-method auto). \u6307\u5b9a\u662f\u5426\u7981\u7528IpV6:\u7981\u7528 (--ipv6-method disabled) \u5982\u4e0b\u56fe\u6240\u793a,\u6211\u4eec\u6210\u529f\u7684\u4f7f\u7528\u8fd9\u6761\u6307\u4ee4,\u914d\u7f6e\u597d\u4e86wifi\u7f51\u7edc: \u5982\u4e0b\u6240\u793a,\u914d\u7f51\u6210\u529f\u540e,\u8def\u7531\u5668\u5df2\u81ea\u52a8\u4e3a\u5176\u5206\u914d\u597d\u4e86ip\u5730\u5740: \u6b64\u65f6,\u6211\u4eec\u5728\u6d4f\u89c8\u5668\u4e2d\u8f93\u5165\u7f51\u5740 http://192.168.3.2:8123 \u5373\u53ef\u8fdb\u5165haos\u7684web\u9875\u9762. \u4e0b\u56fe\u662f\u65e0\u7ebf\u7f51\u5361\u4e0e\u6709\u7ebf\u7f51\u5361\u540c\u65f6\u542f\u7528\u7684\u60c5\u51b5,\u53ef\u4ee5\u770b\u5230,\u4e24\u4e2a\u7f51\u5361\u90fd\u88ab\u6b63\u786e\u7684\u5206\u914d\u5230\u4e86IP\u5730\u5740\uff1a \u5728\u7cfb\u7edf\u5b89\u88c5\u597d\u521d\u59cb\u5316\u5b8c\u6210\u540e\u914d\u7f6e\u7f51\u7edc \u00b6 \u7cfb\u7edf\u521d\u59cb\u5316\u5b8c\u6210\u540e,\u4ecd\u7136\u53ef\u4ee5\u8c03\u6574\u914d\u7f6e\u7f51\u7edc, \u8bbe\u7f6e-\u7cfb\u7edf-\u7f51\u7edc \u4e2d\u914d\u7f6e\u7f51\u7edc\u63a5\u53e3\u53ef\u4ee5\u8fdb\u884c\u7f51\u7edc\u914d\u7f6e \u5728\u8fd9\u91cc\u4f60\u53ef\u4ee5\u770b\u5230\u6211\u4eec\u7684\u4e09\u5757\u7f51\u5361,wlp3s0,enp2s0,enp4s0,\u53ef\u5728\u6b64\u5904\u914d\u7f6e,\u6bcf\u4e2a\u7f51\u5361\u7684IP\uff0c\u5b50\u7f51\uff0c\u7f51\u5173\uff0cDNS\u7b49\uff0c\u4e5f\u53ef\u4ee5\u914d\u7f6ewi-fi\u70ed\u70b9.","title":"\u914d\u7f6e\u7f51\u7edc"},{"location":"Usages/netconfig/netconfig/#_1","text":"\u516c\u53f8\u4f7f\u7528\u7684X86\u5c0f\u5de5\u63a7\u673a,\u5927\u591a\u6709\u591a\u4e2a\u7f51\u5361,\u4e00\u822c\u4e00\u4e2a\u65e0\u7ebf\u7f51\u5361,\u4e24\u4e2a\u6709\u7ebf\u7f51\u5361.\u591a\u6570\u60c5\u51b5\u4e0b,\u6211\u4eec\u53ef\u80fd\u662f\u4f7f\u7528\u7684WIFI\u7f51\u7edc\uff0c\u8fd9\u6837\u6bd4\u8f83\u65b9\u4fbf\uff0c\u6709\u65f6\u4e3a\u4e86HA\u63d0\u4f9b\u7684\u670d\u52a1\u6298\u7a33\u5b9a\u6027\uff0c\u6211\u4eec\u5c3d\u91cf\u4f7f\u7528LAN\u7ebf\u7f51\u7edc\uff0c\u907f\u514d\u65e0\u7ebf\u7f51\u4fe1\u53f7\u8d28\u91cf\u7684\u95ee\u9898\u3002\u6240\u4ee5\u5c31\u6d89\u53ca\u5230\u914d\u7f51\u7684\u95ee\u9898\u3002 HomeAssistant\u7684\u7f51\u7edc\u914d\u7f6e,\u5728\u7cfb\u7edf\u6ca1\u6709\u5b89\u88c5\u6210\u529f\u4e4b\u524d,\u4e0d\u80fd\u901a\u8fc7web\u8fdb\u5165\u7f51\u9875\u754c\u9762\u65f6,\u914d\u7f6e\u7f51\u7edc\u53ea\u80fd\u901a\u8fc7\u81ea\u5e26\u7f51\u7edc\u914d\u7f6e\u547d\u4ee4\u6765\u8fdb\u884c.","title":"\u914d\u7f6e\u7f51\u7edc"},{"location":"Usages/netconfig/netconfig/#_2","text":"HomeAssistant Cli \u63d0\u4f9b\u4e86\u9ed8\u4fe1\u6298network\u914d\u7f6e\u547d\u4ee4\u5982\u4e0b: ha netWork Useage: ha network [command] Examples: ha network info ha network interface options Available Commands: info Shows information about the host network reload Reload Network information the host scan Scan for Access Points on a wireless interface. update Update settings of a network interface vlan Create a new VLAN on an ethernet interface Flags: -h, --help help for network Global Flags: --api-token string Home Assistant Supervisor API token --config string Optional config file (default is $HOME/.homeassistant.yaml) --endpoint string Endpoint for Home Assistant Supervisor (default is'supervisor') --log-level string Log level (defaults to Warn) --no-progress Disable the progress spinner --raw-json Output raw JSON from the API Use \"ha network [command] --help\" for more information about a command. \u8fd9\u4e2aha network\u547d\u4ee4,\u5927\u7ea6\u5982\u4e0b\u51e0\u4e2a\u529f\u80fd info \u663e\u793a\u7f51\u7edc\u914d\u7f6e\u4fe1\u606f reload \u91cd\u65b0\u52a0\u8f7d\u7f51\u7edc scan \u626b\u63cf\u7f51\u7edc update \u914d\u7f6e\u7f51\u7edc \u6211\u4eec\u5728\u4f7f\u7528\u8fd9\u4e2a\u547d\u4ee4\u65f6,\u53ef\u4ee5\u4f7f\u7528\u5176\u7b80\u5199,\u6bd4\u5982\u7701\u53bb\u524d\u9762\u7684ha,\u8fd8\u53ef\u4ee5\u7701\u53bb\u540e\u9762\u7684work \u6bd4\u5982,\u6211\u4eec\u60f3\u67e5\u770b\u7f51\u7edc\u914d\u7f6e\u4fe1\u606f,\u53ef\u4ee5\u7528\u5982\u4e0b\u547d\u4ee4\u6765\u8fdb\u884c net info \u8fd9\u6761\u547d\u4ee4\u5c31\u4f1a\u628a\u6240\u6709\u7684\u7f51\u7edc\u914d\u7f6e\u4fe1\u606f\u5168\u90e8\u663e\u793a\u51fa\u6765,\u53ea\u662f\u5982\u679c\u7f51\u5361\u8f83\u591a,\u6211\u4eec\u6ca1\u6709\u6cd5\u5728\u4e00\u5c4f\u5168\u90e8\u9605\u8bfb\u5b8c,\u6240\u4ee5\u8fd9\u5c31\u5f15\u53d1\u53e6\u4e00\u4e2a\u95ee\u9898.netwrok\u6240\u6709\u7684\u5b50\u547d\u4ee4,\u540e\u9762\u90fd\u662f\u53ef\u4ee5\u6216\u5fc5\u987b\u8ddf\u7740\u64cd\u4f5c\u5bf9\u50cf\u6765\u8fdb\u884c\u7684,\u5177\u4f53\u7684\u5c31\u662f,\u64cd\u4f5c\u6216\u663e\u793a\u54ea\u4e2a\u7f51\u5361\u63a5\u53e3.\u4e00\u822c\u60c5\u51b5\u4e0b\u662f\u5982\u4e0b\u578b\u5f0f net [command] [interface] \u5373 net [\u5b50\u547d\u4ee4] [\u7f51\u5361\u540d\u79f0] \u90a3\u4e48\u5982\u4f55\u67e5\u770b\u7f51\u5361\u540d\u79f0\u5462,\u5728haos \u7684cli\u63a7\u5236\u53f0\u754c\u9762,\u4efb\u610f\u65f6\u95f4,\u540c\u65f6\u6309\u4e0b ctrl+c \u540e,ha\u7684\u754c\u9762\u8fd4\u56de\u5230\u5f85\u673a\u754c\u9762,\u5982\u4e0b\u56fe\u6240\u793a. \u56fe\u4e2d\u5171\u663e\u793a\u4e86\u4e09\u4e2a\u7f51\u5361\u63a5\u53e3: wlp3s0 \u8fd9\u4e2a\u662f\u65e0\u7ebf\u7f51\u5361\u63a5\u53e3\u7684\u540d\u79f0,\u4e00\u822c\u60c5\u51b5\u4e0bw\u5b57\u7b26\u6253\u5934\u7684\u6211\u4e3a\u65e0\u7ebf\u7f51\u5361 enp2s0 \u8fd9\u4e2a\u5bf9\u5e94\u5c0f\u4e3b\u673a\u4e0a\u5c31\u662fLNA1,\u6709\u7ebf\u7f51\u53611\u7684\u540d\u79f0 enp4s0 \u8fd9\u4e2a\u5bf9\u5e94\u5c0f\u4e3b\u673a\u4e0a\u5c31\u662fLNA2,\u6709\u7ebf\u7f51\u53611\u7684\u540d\u79f0 \u67e5\u770b\u5230\u4e86\u8fd9\u4e09\u4e2a\u7f51\u5361\u540d\u79f0,\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u7f51\u5361\u8fdb\u884c\u67e5\u770b\u4fe1\u606f\u914d\u7f6e\u7b49. \u5bf9\u6709\u521d\u88c5\u7684HAOS\u8fd8\u6709\u51c6\u5907\u8fdb\u884cUdate\u7684\u5c0f\u4e3b\u673a,\u6700\u597d,\u5c31\u662f\u5728\u8def\u7531\u5668\u7aef \u9ed8\u8ba4\u63d0\u4f9b\u79d1\u5b66\u4e0a\u7f51 ,\u5426\u5219\u5728\u65b0\u5b89\u88c5\u6298\u521d\u59cb\u5316\u90a3\u91cc\u5c31\u4f1a\u88ab\u6c38\u8fdc\u5361\u4f4f,\u65e0\u6cd5\u5b89\u88c5\u6210\u529f,\u5982\u679c\u662f\u81ea\u52a8\u66f4\u65b0,\u90a3\u4e48\u5c06\u4f1a\u66f4\u65b0\u5931\u8d25.","title":"\u719f\u6089\u7f51\u7edc\u914d\u7f6e\u547d\u4ee4"},{"location":"Usages/netconfig/netconfig/#_3","text":"\u4e00\u822c\u60c5\u51b5\u4e0b,\u5bf9\u4e8eenp2s0,enp4s0,\u5982\u679c\u8def\u7531\u5668\u7aef\u63d0\u4f9b\u4e86\u81ea\u52a8\u83b7\u53d6IP\u5730\u5740\u529f\u80fd\uff0c\u5219\u65e0\u9700\u914d\u7f6e\uff0c\u7f51\u7ebf\u63d2\u5165\u5373\u53ef\u4f7f\u7528\u3002 \u4f46\u662f\u5bf9\u4e8e\u6bd4\u8f83\u590d\u6742\u7684\u7f51\u7edc\u5219\u9700\u8981\u914d\u7f6e\uff0c\u540c\u6837\uff0c\u5982\u679c\u60f3\u4f7f\u7528wifi\u7f51\u7edc,\u4e5f\u9700\u8981\u914d\u7f6e . \u914d\u7f6e\u7f51\u7edc\u7684\u547d\u4ee4\u5982\u4e0b: ha > net update Usage: ha network update [interface] [flags] Aliases: update, set, up Examples: ha network update eth0 --ipv4-method auto --ipv6-method disabled Flags: -e, --disabled Disable interface -h, --help help for update --ipv4-address stringArray IPv4 address for the interface in the 192.168.1.5/24 --ipv4-gateway string The IPv4 gateway the interface should use --ipv4-method string Method on IPv4: static|auto|disabled --ipv4-nameserver stringArray IPv4 address of upstream DNS servers. Use multiple times for multiple servers. --ipv6-address stringArray IPv6 address for the interface in the 2001:0db8:85a3:0000:0000:8a2e:0370:7334/64 --ipv6-gateway string The IPv6 gateway the interface should use --ipv6-method string Method on IPv6: static|auto|disabled --ipv6-nameserver stringArray IPv6 address for upstream DNS servers. Use multiple times for multiple servers. --wifi-auth string Used authentication: open, wep, wpa-psk --wifi-mode string Wifi mode: infrastructure, adhoc, mesh or ap --wifi-psk string Shared authentication key for wep or wpa --wifi-ssid string SSID for wifi connection Global Flags: --api-token string Home Assistant Supervisor API token --config string Optional config file (default is $HOME/.homeassistant.yaml) --endpoint string Endpoint for Home Assistant Supervisor (default is `supervisor`) --log-level string Log level (defaults to Warn) --no-progress Disable the progress spinner --raw-json Output raw JSON from the API \u8fd9\u6761\u547d\u4ee4ha network update [interface] [flags],\u63d0\u4f9b\u4e86\u5f88\u591a\u529f\u80fd,\u5b83\u53ef\u4ee5\u914d\u7f6ewif\u7f51\u7edc,\u53ef\u4ee5\u5bf9\u6307\u5b9a\u7684\u7f51\u5361\u914d\u7f6eip4/6\u7684IP\u5730\u5740\uff0c\u7f51\u5173\uff0c\u662f\u5426\u542f\u7528\u7b49.\u56e0\u6b64\u53ef\u4ee5\u5728\u5b9e\u9645\u5de5\u4f5c\u4e2d\u7075\u6d3b\u4f7f\u7528. \u5177\u4f53\u7528\u6cd5\u7b80\u8bd1\u5982\u4e0b ha > net update Usage: ha network update [interface] [flags] Aliases: update, set, up Examples: ha network update eth0 --ipv4-method auto --ipv6-method disabled Flags: -e, --disabled \u7981\u7528\u63a5\u53e3 -h, --help \u663e\u793a\u66f4\u65b0\u7684\u5e2e\u52a9\u4fe1\u606f --ipv4-address stringArray \u63a5\u53e3\u7684 IPv4 \u5730\u5740\uff0c\u4f8b\u5982 192.168.1.5/24 --ipv4-gateway string \u63a5\u53e3\u4f7f\u7528\u7684 IPv4 \u7f51\u5173 --ipv4-method string IPv4 \u65b9\u6cd5: static|auto|disabled --ipv4-nameserver stringArray \u4e0a\u6e38 DNS \u670d\u52a1\u5668\u7684 IPv4 \u5730\u5740\uff0c\u53ef\u591a\u6b21\u4f7f\u7528\u4ee5\u6307\u5b9a\u591a\u4e2a\u670d\u52a1\u5668 --ipv6-address stringArray \u63a5\u53e3\u7684 IPv6 \u5730\u5740\uff0c\u4f8b\u5982 2001:0db8:85a3:0000:0000:8a2e:0370:7334/64 --ipv6-gateway string \u63a5\u53e3\u4f7f\u7528\u7684 IPv6 \u7f51\u5173 --ipv6-method string IPv6 \u65b9\u6cd5: static|auto|disabled --ipv6-nameserver stringArray \u4e0a\u6e38 DNS \u670d\u52a1\u5668\u7684 IPv6 \u5730\u5740\uff0c\u53ef\u591a\u6b21\u4f7f\u7528\u4ee5\u6307\u5b9a\u591a\u4e2a\u670d\u52a1\u5668 --wifi-auth string \u4f7f\u7528\u7684\u8ba4\u8bc1\u65b9\u5f0f: open, wep, wpa-psk --wifi-mode string WiFi \u6a21\u5f0f: infrastructure, adhoc, mesh \u6216 ap --wifi-psk string WEP \u6216 WPA \u7684\u5171\u4eab\u8ba4\u8bc1\u5bc6\u94a5 --wifi-ssid string WiFi \u8fde\u63a5\u7684 SSID Global Flags: --api-token string Home Assistant Supervisor API \u4ee4\u724c --config string \u53ef\u9009\u7684\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\uff08\u9ed8\u8ba4\u503c\u4e3a $HOME/.homeassistant.yaml\uff09 --endpoint string Home Assistant Supervisor \u7684\u7aef\u70b9\uff08\u9ed8\u8ba4\u503c\u4e3a `supervisor`\uff09 --log-level string \u65e5\u5fd7\u7ea7\u522b\uff08\u9ed8\u8ba4\u503c\u4e3a Warn\uff09 --no-progress \u7981\u7528\u8fdb\u5ea6\u6761 --raw-json \u4ee5\u539f\u59cb JSON \u683c\u5f0f\u8f93\u51fa API \u6570\u636e FATA[0000] Error while executing rootCmd: accepts 1 arg(s), received 0 \u4e0b\u9762,\u6211\u4eec\u5c31\u4ee5\u914d\u7f6ewifi\u8054\u63a5\u5230\u7f51\u7edc\u4e3a\u4f8b\u8bf4\u660e\u4e00\u4e0b: \u6bd4\u5982\u6211\u4eec\u9ed8\u8ba4\u7684WIFI\u70ed\u70b9\u5982\u4e0b: wifi info: ssid:DT_IoT_GateWay passWord:HnczjTyrb0 \u90a3\u6839\u636e\u6211\u4eec\u4e0a\u6587\u67e5\u770b\u5230\u7684\u65e0\u7ebf\u7f51\u5361\u7684\u540d\u79f0: wlp3s0 \u6211\u4eec\u4f7f\u7528\u5982\u4e0b\u914d\u7f6e\u547d\u4ee4,\u6765\u8ba9haos\u5c0f\u5de5\u63a7\u673a\u8054\u4e0awifi\u7f51\u7edc: ha network update wlp3s0 --wifi-auth wpa-psk --wifi-psk \"HmczjTYrb0\" --wifi-mode infrastructure --wifi-ssid \"DT_IoT_GateWay\" --ipv4-method auto --ipv6-method disabled \u8fd9\u6761\u547d\u4ee4\u89e3\u91ca\u5982\u4e0b: \u6307\u5b9awifi\u7684\u5bc6\u7801\u65b9\u5f0f\u4e3a:wpa-psk (--wifi-auth wpa-psk). \u6307\u5b9awif\u7684\u5bc6\u7801\u4e3a:HnczjTyrb0 (--wifi-psk \"HmczjYrb0\"). \u6307\u5b9a\u7f51\u5361\u63a5\u53e3\u6a21\u5f0f\u4e3a:infrastructure \u5373\u5e38\u89c4\u6a21\u5f0f (--wifi-mode infrastructure). \u6307\u5b9a\u8981\u8054\u63a5\u7684\u7f51\u7edcSSID:DT_IoT_GateWay (--wifi-ssid \"DT_IoT_GateWay\"). \u6307\u5b9aIP\u5730\u5740\u83b7\u53d6\u65b9\u5f0f\uff08\u9759\u6001\u3001\u81ea\u52a8\u3001\u7981\u7528\uff09\uff1a\u81ea\u52a8 ( --ipv4-method auto). \u6307\u5b9a\u662f\u5426\u7981\u7528IpV6:\u7981\u7528 (--ipv6-method disabled) \u5982\u4e0b\u56fe\u6240\u793a,\u6211\u4eec\u6210\u529f\u7684\u4f7f\u7528\u8fd9\u6761\u6307\u4ee4,\u914d\u7f6e\u597d\u4e86wifi\u7f51\u7edc: \u5982\u4e0b\u6240\u793a,\u914d\u7f51\u6210\u529f\u540e,\u8def\u7531\u5668\u5df2\u81ea\u52a8\u4e3a\u5176\u5206\u914d\u597d\u4e86ip\u5730\u5740: \u6b64\u65f6,\u6211\u4eec\u5728\u6d4f\u89c8\u5668\u4e2d\u8f93\u5165\u7f51\u5740 http://192.168.3.2:8123 \u5373\u53ef\u8fdb\u5165haos\u7684web\u9875\u9762. \u4e0b\u56fe\u662f\u65e0\u7ebf\u7f51\u5361\u4e0e\u6709\u7ebf\u7f51\u5361\u540c\u65f6\u542f\u7528\u7684\u60c5\u51b5,\u53ef\u4ee5\u770b\u5230,\u4e24\u4e2a\u7f51\u5361\u90fd\u88ab\u6b63\u786e\u7684\u5206\u914d\u5230\u4e86IP\u5730\u5740\uff1a","title":"\u914d\u7f6e\u7f51\u7edc"},{"location":"Usages/netconfig/netconfig/#_4","text":"\u7cfb\u7edf\u521d\u59cb\u5316\u5b8c\u6210\u540e,\u4ecd\u7136\u53ef\u4ee5\u8c03\u6574\u914d\u7f6e\u7f51\u7edc, \u8bbe\u7f6e-\u7cfb\u7edf-\u7f51\u7edc \u4e2d\u914d\u7f6e\u7f51\u7edc\u63a5\u53e3\u53ef\u4ee5\u8fdb\u884c\u7f51\u7edc\u914d\u7f6e \u5728\u8fd9\u91cc\u4f60\u53ef\u4ee5\u770b\u5230\u6211\u4eec\u7684\u4e09\u5757\u7f51\u5361,wlp3s0,enp2s0,enp4s0,\u53ef\u5728\u6b64\u5904\u914d\u7f6e,\u6bcf\u4e2a\u7f51\u5361\u7684IP\uff0c\u5b50\u7f51\uff0c\u7f51\u5173\uff0cDNS\u7b49\uff0c\u4e5f\u53ef\u4ee5\u914d\u7f6ewi-fi\u70ed\u70b9.","title":"\u5728\u7cfb\u7edf\u5b89\u88c5\u597d\u521d\u59cb\u5316\u5b8c\u6210\u540e\u914d\u7f6e\u7f51\u7edc"},{"location":"install-guide/LinuxInstall/","text":"\u57fa\u4e8elinux\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf \u00b6 \u8fd9\u79cd\u65b9\u6cd5\u7684\u64cd\u4f5c\u65b9\u6cd5\u662f: \u5148\u4e0b\u8f7d ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf\u684c\u9762\u7248 \uff0c\u4fdd\u5b58\u4e3aubuntu24.04-desktip-amd.iso\u3002 \u5728\u865a\u62df\u673a\u6216\u7269\u7406\u673a\u4e2d\u5b89\u88c5\u6b64ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf.(\u4e34\u65f6\u4f7f\u7528)\u3002 \u8fd9\u4e2a\u8fc7\u7a0b \uff0c\u8bf7\u53c2\u8003\u5176\u5b83\u6559\u7a0b\u3002 \u4f7f\u7528ubuntu24.04\u5236\u4f5clinux\u542f\u52a8U\u76d8ubuntu live\u3002 \u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u628a\u4e0b\u8f7d\u7684ubuntu24.04-desktip-amd.iso\u653e\u5230\u65b0\u5b89\u88c5\u7684Ubuntu\u64cd\u4f5c\u7cfb\u7edf\u4e0b\u6298\u4efb\u610f\u76ee\u5f55,\u5982,\u653e\u5230 \u8fd9\u4e2a\u76ee\u5f55. \u7136\u540e,\u627e\u5230ubuntu\u81ea\u5e26\u7684\u542f\u52a8\u76d8\u5236\u4f5c\u5de5\u5177,\u5982\u56fe\u6240\u793a c\u8fd0\u884c\u542f\u52a8\u76d8\u521b\u5efa\u5668,\u5982\u4e0b \u5148\u62e9\u521a\u521a\u653e\u7f6e\u7684ubuntu24.04-desktip-amd.iso\u4f5c\u4e3a\u6e90\u955c\u50cf,\u7136\u540e\u628a\u8981\u5236\u4f5c\u542f\u52a8\u76d8\u7684U\u76d8\u63d2\u5165USB\u53e3\uff0c\u7136\u540e\uff0c\u9009 \u62e9\u4f5c\u4e3a\u8981\u4f7f\u7528\u7684\u78c1\u76d8\uff0c\u5f53\u7136\u53ef\u4ee5\u63d0\u524d\u63d2\u5165U\u76d8\u3002\u7136\u540e\u70b9\u51fb\u5236\u4f5c\u542f\u52a8\u76d8\u3002 \u5728\u5f39\u51fa\u7684\u786e\u8ba4\u6846\u4e2d\uff0c\u70b9\u51fb\u662f\uff0c \u7136\u540e\u8f93\u51fa\u5f53\u524d\u7684\u7528\u6237\u5bf9\u5e94\u7684\u5bc6\u7801\uff0c\u786e\u8ba4\uff0c \u7cfb\u7edf\u5c06\u4f1a\u81ea\u52a8\u5f00\u542f\u628aubuntu live \u542f\u52a8\u5f15\u5bfc\u76d8\u4fe1\u606f, \u5199\u5165U\u76d8\uff0c \u63d0\u793a\u5b8c\u6210\u65f6\uff0c\u70b9\u9000\u51fa\uff0c\u5f39\u51fa\u5982\u4e0b\u63d0\u793a \uff0c\u8bf4\u660e\u542f\u52a8U\u76d8\u5236\u4f5c\u6210\u529f\u4e86\u3002 \u4f7f\u7528\u542f\u52a8U\u76d8ubuntu live\u5f15\u5bfcx86\u5c0f\u5de5\u63a7\u673a. \u628aU\u76d8\u63d2\u5165\u5165X86\u5c0f\u5de5\u63a7\u673a\u5e76\u786e\u4fdd \u6b63\u786e\u914d\u7f6e\u4e86Bios \u542f\u52a8\u540e,\u6309F11\u5176\u5b83\u4e3b\u673a\u53ef\u80fd\u6709\u6240\u4e0d\u540c(\u53ef\u4ee5\u67e5\u4e3b\u677f\u8bf4\u660e\u4e66,\u6216\u54a8\u8be2\u4e3b\u677f\u5382\u5bb6),\u9009\u62e9\u4ee5U\u76d8\u5f15\u5bfc\u3002 \u516c\u53f8\u7684\u5c0f\u5de5\u63a7\u673a,\u662f\u542f\u52a8\u65f6,\u6309F11\u4e0d\u653e,\u8fdb\u5165\u7cfb\u7edf\u5f15\u5bfc\u83dc\u5355,\u6839\u636eU\u76d8\u7684\u4e0d\u540c,U\u76d8\u5f15\u5bfc\u76d8\u4e2d\u7684\u7cfb\u7edf\u7c7b\u522b\u4e0d\u540c,\u663e\u793a\u7684\u5185\u5bb9\u7565\u6709\u4e0d\u540c,\u5982\u4e0b\u56fe\u6240\u793a \u8fdb\u5165try\u6a21\u5f0f(\u4e0d\u5b89\u88c5). \u5f53\u7cfb\u7edf\u542f\u52a8\u65f6,\u8bf7\u786e\u4fdd\u9009\u62e9\u201cTry or Install Ubuntu\". \u7cfb\u7edf\u542f\u4f1a\u542f\u52a8U\u76d8\u4e2d\u7684Ubuntu live\u7cfb\u7edf, \u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d, \u4f1a\u6709\u51e0\u4e2a\u9009\u9879\u8981\u9009\u62e9\u5982\u4e0b\u56fe\u6240\u793a, \u9009\u62e9\u8bed\u8a00 \u6b64\u5904\u76f4\u63a5\u4e0b\u4e00\u6b65 \u6b64\u5904\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f51\u7edc\u8fde\u63a5\u53ef\u4ee5\u9009\u76f4\u63a5\u8fde\u63a5,\u4e5f\u53ef\u4ee5\u9009\u62e9wifi\u5f53\u7136,wifi\u5357\u8981\u914d\u7f6e\u70ed\u70b9. \u540c\u65f6,\u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d,\u8981\u4fdd\u6301\u7f51\u7edc\u7545\u901a( *\u4e00\u5b9a\u8981\u80fd\u6b63\u5e38\u8bbf\u95eeGoogle\u53caHomeAssistant\u5b98\u7f51 ),\u80fd\u6b63\u5e38\u7684\u8bbf\u95ee\u5e76\u4e0b\u8f7dHomeAssistantOS\u7684\u955c\u50cf. \u5728try\u6a21\u5f0f\u4e2d,\u4e0b\u8f7dha\u5b89\u65b9\u955c\u50cf \u8fdb\u5165Ubuntu Live\u7cfb\u7edf\u540e,\u6253\u5f00\u6d4f\u89c8\u5668,\u8bbf\u95eeHomeAssistant\u7684 \u5b98\u65b9\u6587\u6863 , \u8fdb\u5165HomeAssistant\u5b98\u7f51,\u70b9\\\u51fb\u83dc\u5355Installstatiion,\u8fdb\u5165\u5b89\u88c5\u8bf4\u660e \u627e\u5230GenericX86-84,\u5e76\u6253\u5f00\u8fd9\u4e2a\u5728\u9875\u9762 \u627e\u5230\u9875\u9762\u4e2d\u7684\u955c\u50cf\u4e0b\u8f7d\u5730\u5740\u5982\u4e0b\u56fe \u4e0b\u8f7d HomeAssistOs-x86-64\u955c\u50cf \u5f00\u59cb\u4e0b\u8f7d\u540e,\u5982\u4e0b\u56fe\u6240\u793a \u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u5982\u4e0b\u56fe\u6240\u793a \u4e0b\u8f7d\u5b8c\u6210\u540e \u6587\u4ef6\u4fdd\u5b58\u5728/home/Downloads/hos_Generic-86-64-15.1.img.xz \u4f7f\u7528ubuntu live\u7684\u81ea\u5e26\u7684\u78c1\u76d8\u6062\u590d\u5de5\u5177\u5199\u5165\u955c\u50cf\u5230\u786c\u76d8. \u5728Ubuntu Live\u7684\u7cfb\u7edf\u4e2d,\u627e\u5230\u663e\u793a\u5e94\u7528\u7a0b\u5e8f(\u4e00\u822c\u5728\u5de6\u4e0a\u89d2\u6216\u53f3\u4e0b\u89d2), \u641c\u7d22\u5e76\u627e\u5230Disks\u5e94\u7528\u7a0b\u5e8f,\u5e76\u6253\u5f00Disks\u5e94\u7528\u7a0b\u5e8f. \u5728\u5de6\u4fa7\u5217\u8868\u4e2d\u627e\u5230\u5e76\u9009\u62e9\u4f60\u7684\u76ee\u6807\u78c1\u76d8(\u4e00\u822c\u4e3a\u4f60\u8981\u5b89\u88c5HAOS\u7684\u786c\u76d8) \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u83dc\u5355\u56fe\u6807\uff08\u4e09\u4e2a\u70b9\uff09\uff0c\u9009\u62e9\u201c\u6062\u590d\u78c1\u76d8\u955c\u50cf\u201d \u6d4f\u89c8\u5e76\u9009\u62e9\u4f60\u4e0b\u8f7d\u7684HAOS\u955c\u50cf\u6587\u4ef6\u3002 \u70b9\u51fb,\u5e76\u6d4f\u89c8\u5230\u4e0b\u8f7d\u7684\u6587\u4ef6 hos_Generic-86-64-15.1.img.xz \u786e\u8ba4\u76ee\u6807\u78c1\u76d8\uff0c\u5e76\u5f00\u59cb\u955c\u50cf\u6062\u590d\u8fc7\u7a0b\u3002 \u786e\u8ba4\u6807\u786c\u76d8\u6b63\u786e\u540e,\u7ee7\u7eed \u63d0\u793a\u786e\u8ba4\u65f6\u70b9\u51fb Restore \u63d0\u793a\u6388\u6743\u65f6,\u70b9\u51fb Authenticate \u786e\u5b9a\u540e,\u5c31\u4f1a\u5f00\u59cb\u628a\u955c\u50cf\u6587\u4ef6\u5199\u5165\u786c\u76d8 \u8bf7\u6ce8\u610f,\u8fd9\u4e2a\u8fc7\u7a0b\u4e00\u5c06\u4f1a,\u6e05\u9664\u786c\u76d8\u4e0a\u539f\u6709\u7684\u6570\u636e,\u8bf7\u786e\u4fdd\u5df2\u5907\u4efd\u91cd\u8981\u6570\u636e. \u5199\u5165\u5b8c\u6210\u540e,\u5982\u4e0b\u56fe\u6240\u793a \u6b64\u65f6,\u5c31\u5df2\u7ecf\u6210\u529f\u7684\u628aHA\u955c\u50cf\u5199\u5165\u5230\u786c\u548c\u808b\u4e2d\u4e86 \u79fb\u9664U\u76d8 \u4e00\u65e6Home Assistant\u64cd\u4f5c\u7cfb\u7edf\u5b89\u88c5\u5b8c\u6210\uff0c\u5173\u95ed\u7cfb\u7edf\u3002 \u5f53Ubuntu\u5173\u95ed\u540e\uff0c\u79fb\u9664USB\u95ea\u5b58\u9a71\u52a8\u5668\uff08Ubuntu\u4f1a\u901a\u77e5\u60a8\u53ef\u4ee5\u5b89\u5168\u79fb\u9664\uff09\u3002 \u91cd\u542f\u7cfb\u7edf. \u73b0\u5728\uff0c\u60a8\u7684Home Assistant\u670d\u52a1\u5668\u5df2\u7ecf\u8bbe\u7f6e\u5b8c\u6bd5\uff0c\u60a8\u53ef\u4ee5\u5f00\u59cb\u4f7f\u7528\u5b83\u3002 \u8fdb\u5165HA cli\u754c\u9762 \u7cfb\u7edf\u542f\u52a8\u6210\u529f\u540e\uff0c\u5982\u4e0b\u56fe\u6240\u793a \u901a\u8fc7\u6d4f\u89c8\u5668,\u8f93\u5165\u63a7\u5236\u53f0\u63d0\u793a\u7684IP\u52a0\u7aef\u53e3 http://192.168.3:8123 \u5373\u53ef\u8fdb\u5165\u56fe\u578b\u5316\u754c\u9762,\u5982\u4e0b","title":"\u57fa\u4e8elinux\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf"},{"location":"install-guide/LinuxInstall/#linux","text":"\u8fd9\u79cd\u65b9\u6cd5\u7684\u64cd\u4f5c\u65b9\u6cd5\u662f: \u5148\u4e0b\u8f7d ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf\u684c\u9762\u7248 \uff0c\u4fdd\u5b58\u4e3aubuntu24.04-desktip-amd.iso\u3002 \u5728\u865a\u62df\u673a\u6216\u7269\u7406\u673a\u4e2d\u5b89\u88c5\u6b64ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf.(\u4e34\u65f6\u4f7f\u7528)\u3002 \u8fd9\u4e2a\u8fc7\u7a0b \uff0c\u8bf7\u53c2\u8003\u5176\u5b83\u6559\u7a0b\u3002 \u4f7f\u7528ubuntu24.04\u5236\u4f5clinux\u542f\u52a8U\u76d8ubuntu live\u3002 \u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u628a\u4e0b\u8f7d\u7684ubuntu24.04-desktip-amd.iso\u653e\u5230\u65b0\u5b89\u88c5\u7684Ubuntu\u64cd\u4f5c\u7cfb\u7edf\u4e0b\u6298\u4efb\u610f\u76ee\u5f55,\u5982,\u653e\u5230 \u8fd9\u4e2a\u76ee\u5f55. \u7136\u540e,\u627e\u5230ubuntu\u81ea\u5e26\u7684\u542f\u52a8\u76d8\u5236\u4f5c\u5de5\u5177,\u5982\u56fe\u6240\u793a c\u8fd0\u884c\u542f\u52a8\u76d8\u521b\u5efa\u5668,\u5982\u4e0b \u5148\u62e9\u521a\u521a\u653e\u7f6e\u7684ubuntu24.04-desktip-amd.iso\u4f5c\u4e3a\u6e90\u955c\u50cf,\u7136\u540e\u628a\u8981\u5236\u4f5c\u542f\u52a8\u76d8\u7684U\u76d8\u63d2\u5165USB\u53e3\uff0c\u7136\u540e\uff0c\u9009 \u62e9\u4f5c\u4e3a\u8981\u4f7f\u7528\u7684\u78c1\u76d8\uff0c\u5f53\u7136\u53ef\u4ee5\u63d0\u524d\u63d2\u5165U\u76d8\u3002\u7136\u540e\u70b9\u51fb\u5236\u4f5c\u542f\u52a8\u76d8\u3002 \u5728\u5f39\u51fa\u7684\u786e\u8ba4\u6846\u4e2d\uff0c\u70b9\u51fb\u662f\uff0c \u7136\u540e\u8f93\u51fa\u5f53\u524d\u7684\u7528\u6237\u5bf9\u5e94\u7684\u5bc6\u7801\uff0c\u786e\u8ba4\uff0c \u7cfb\u7edf\u5c06\u4f1a\u81ea\u52a8\u5f00\u542f\u628aubuntu live \u542f\u52a8\u5f15\u5bfc\u76d8\u4fe1\u606f, \u5199\u5165U\u76d8\uff0c \u63d0\u793a\u5b8c\u6210\u65f6\uff0c\u70b9\u9000\u51fa\uff0c\u5f39\u51fa\u5982\u4e0b\u63d0\u793a \uff0c\u8bf4\u660e\u542f\u52a8U\u76d8\u5236\u4f5c\u6210\u529f\u4e86\u3002 \u4f7f\u7528\u542f\u52a8U\u76d8ubuntu live\u5f15\u5bfcx86\u5c0f\u5de5\u63a7\u673a. \u628aU\u76d8\u63d2\u5165\u5165X86\u5c0f\u5de5\u63a7\u673a\u5e76\u786e\u4fdd \u6b63\u786e\u914d\u7f6e\u4e86Bios \u542f\u52a8\u540e,\u6309F11\u5176\u5b83\u4e3b\u673a\u53ef\u80fd\u6709\u6240\u4e0d\u540c(\u53ef\u4ee5\u67e5\u4e3b\u677f\u8bf4\u660e\u4e66,\u6216\u54a8\u8be2\u4e3b\u677f\u5382\u5bb6),\u9009\u62e9\u4ee5U\u76d8\u5f15\u5bfc\u3002 \u516c\u53f8\u7684\u5c0f\u5de5\u63a7\u673a,\u662f\u542f\u52a8\u65f6,\u6309F11\u4e0d\u653e,\u8fdb\u5165\u7cfb\u7edf\u5f15\u5bfc\u83dc\u5355,\u6839\u636eU\u76d8\u7684\u4e0d\u540c,U\u76d8\u5f15\u5bfc\u76d8\u4e2d\u7684\u7cfb\u7edf\u7c7b\u522b\u4e0d\u540c,\u663e\u793a\u7684\u5185\u5bb9\u7565\u6709\u4e0d\u540c,\u5982\u4e0b\u56fe\u6240\u793a \u8fdb\u5165try\u6a21\u5f0f(\u4e0d\u5b89\u88c5). \u5f53\u7cfb\u7edf\u542f\u52a8\u65f6,\u8bf7\u786e\u4fdd\u9009\u62e9\u201cTry or Install Ubuntu\". \u7cfb\u7edf\u542f\u4f1a\u542f\u52a8U\u76d8\u4e2d\u7684Ubuntu live\u7cfb\u7edf, \u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d, \u4f1a\u6709\u51e0\u4e2a\u9009\u9879\u8981\u9009\u62e9\u5982\u4e0b\u56fe\u6240\u793a, \u9009\u62e9\u8bed\u8a00 \u6b64\u5904\u76f4\u63a5\u4e0b\u4e00\u6b65 \u6b64\u5904\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7f51\u7edc\u8fde\u63a5\u53ef\u4ee5\u9009\u76f4\u63a5\u8fde\u63a5,\u4e5f\u53ef\u4ee5\u9009\u62e9wifi\u5f53\u7136,wifi\u5357\u8981\u914d\u7f6e\u70ed\u70b9. \u540c\u65f6,\u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d,\u8981\u4fdd\u6301\u7f51\u7edc\u7545\u901a( *\u4e00\u5b9a\u8981\u80fd\u6b63\u5e38\u8bbf\u95eeGoogle\u53caHomeAssistant\u5b98\u7f51 ),\u80fd\u6b63\u5e38\u7684\u8bbf\u95ee\u5e76\u4e0b\u8f7dHomeAssistantOS\u7684\u955c\u50cf. \u5728try\u6a21\u5f0f\u4e2d,\u4e0b\u8f7dha\u5b89\u65b9\u955c\u50cf \u8fdb\u5165Ubuntu Live\u7cfb\u7edf\u540e,\u6253\u5f00\u6d4f\u89c8\u5668,\u8bbf\u95eeHomeAssistant\u7684 \u5b98\u65b9\u6587\u6863 , \u8fdb\u5165HomeAssistant\u5b98\u7f51,\u70b9\\\u51fb\u83dc\u5355Installstatiion,\u8fdb\u5165\u5b89\u88c5\u8bf4\u660e \u627e\u5230GenericX86-84,\u5e76\u6253\u5f00\u8fd9\u4e2a\u5728\u9875\u9762 \u627e\u5230\u9875\u9762\u4e2d\u7684\u955c\u50cf\u4e0b\u8f7d\u5730\u5740\u5982\u4e0b\u56fe \u4e0b\u8f7d HomeAssistOs-x86-64\u955c\u50cf \u5f00\u59cb\u4e0b\u8f7d\u540e,\u5982\u4e0b\u56fe\u6240\u793a \u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u5982\u4e0b\u56fe\u6240\u793a \u4e0b\u8f7d\u5b8c\u6210\u540e \u6587\u4ef6\u4fdd\u5b58\u5728/home/Downloads/hos_Generic-86-64-15.1.img.xz \u4f7f\u7528ubuntu live\u7684\u81ea\u5e26\u7684\u78c1\u76d8\u6062\u590d\u5de5\u5177\u5199\u5165\u955c\u50cf\u5230\u786c\u76d8. \u5728Ubuntu Live\u7684\u7cfb\u7edf\u4e2d,\u627e\u5230\u663e\u793a\u5e94\u7528\u7a0b\u5e8f(\u4e00\u822c\u5728\u5de6\u4e0a\u89d2\u6216\u53f3\u4e0b\u89d2), \u641c\u7d22\u5e76\u627e\u5230Disks\u5e94\u7528\u7a0b\u5e8f,\u5e76\u6253\u5f00Disks\u5e94\u7528\u7a0b\u5e8f. \u5728\u5de6\u4fa7\u5217\u8868\u4e2d\u627e\u5230\u5e76\u9009\u62e9\u4f60\u7684\u76ee\u6807\u78c1\u76d8(\u4e00\u822c\u4e3a\u4f60\u8981\u5b89\u88c5HAOS\u7684\u786c\u76d8) \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u83dc\u5355\u56fe\u6807\uff08\u4e09\u4e2a\u70b9\uff09\uff0c\u9009\u62e9\u201c\u6062\u590d\u78c1\u76d8\u955c\u50cf\u201d \u6d4f\u89c8\u5e76\u9009\u62e9\u4f60\u4e0b\u8f7d\u7684HAOS\u955c\u50cf\u6587\u4ef6\u3002 \u70b9\u51fb,\u5e76\u6d4f\u89c8\u5230\u4e0b\u8f7d\u7684\u6587\u4ef6 hos_Generic-86-64-15.1.img.xz \u786e\u8ba4\u76ee\u6807\u78c1\u76d8\uff0c\u5e76\u5f00\u59cb\u955c\u50cf\u6062\u590d\u8fc7\u7a0b\u3002 \u786e\u8ba4\u6807\u786c\u76d8\u6b63\u786e\u540e,\u7ee7\u7eed \u63d0\u793a\u786e\u8ba4\u65f6\u70b9\u51fb Restore \u63d0\u793a\u6388\u6743\u65f6,\u70b9\u51fb Authenticate \u786e\u5b9a\u540e,\u5c31\u4f1a\u5f00\u59cb\u628a\u955c\u50cf\u6587\u4ef6\u5199\u5165\u786c\u76d8 \u8bf7\u6ce8\u610f,\u8fd9\u4e2a\u8fc7\u7a0b\u4e00\u5c06\u4f1a,\u6e05\u9664\u786c\u76d8\u4e0a\u539f\u6709\u7684\u6570\u636e,\u8bf7\u786e\u4fdd\u5df2\u5907\u4efd\u91cd\u8981\u6570\u636e. \u5199\u5165\u5b8c\u6210\u540e,\u5982\u4e0b\u56fe\u6240\u793a \u6b64\u65f6,\u5c31\u5df2\u7ecf\u6210\u529f\u7684\u628aHA\u955c\u50cf\u5199\u5165\u5230\u786c\u548c\u808b\u4e2d\u4e86 \u79fb\u9664U\u76d8 \u4e00\u65e6Home Assistant\u64cd\u4f5c\u7cfb\u7edf\u5b89\u88c5\u5b8c\u6210\uff0c\u5173\u95ed\u7cfb\u7edf\u3002 \u5f53Ubuntu\u5173\u95ed\u540e\uff0c\u79fb\u9664USB\u95ea\u5b58\u9a71\u52a8\u5668\uff08Ubuntu\u4f1a\u901a\u77e5\u60a8\u53ef\u4ee5\u5b89\u5168\u79fb\u9664\uff09\u3002 \u91cd\u542f\u7cfb\u7edf. \u73b0\u5728\uff0c\u60a8\u7684Home Assistant\u670d\u52a1\u5668\u5df2\u7ecf\u8bbe\u7f6e\u5b8c\u6bd5\uff0c\u60a8\u53ef\u4ee5\u5f00\u59cb\u4f7f\u7528\u5b83\u3002 \u8fdb\u5165HA cli\u754c\u9762 \u7cfb\u7edf\u542f\u52a8\u6210\u529f\u540e\uff0c\u5982\u4e0b\u56fe\u6240\u793a \u901a\u8fc7\u6d4f\u89c8\u5668,\u8f93\u5165\u63a7\u5236\u53f0\u63d0\u793a\u7684IP\u52a0\u7aef\u53e3 http://192.168.3:8123 \u5373\u53ef\u8fdb\u5165\u56fe\u578b\u5316\u754c\u9762,\u5982\u4e0b","title":"\u57fa\u4e8elinux\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf"},{"location":"install-guide/WinPeInstall/","text":"Windows PE \u4e0b\u5199\u5165 HA \u955c\u50cf \u00b6 windows Pe\u4e0b\u5199\u5165\u786c\u76d8\u955c\u50cf\u7684\u4e3b\u8981\u601d\u8def\u662f\u4f7f\u7528Roadkilnet\u5f00\u53d1\u7684Rodakill's Disk Image\u5de5\u5177\u628aHA\u7684\u955c\u50cf\u5199\u5165\u786c\u76d8. \u4e0b\u8f7dDisk Image \u00b6 DiskImage\u7684\u5b98\u65b9\u4e0b\u8f7d\u5730\u5740\u4e3a ) https://roadkil.net/program.php?ProgramID=12&Action=NewOSID&DownloadVersion=12&Installer=NO \u8fdb\u5165\u7f51\u7ad9\u7684\u4e0b\u8f7d\u9875\u9762,\u5982\u4e0b,\u9009\u62e9windows8 10 or 11\u548cStand Alone Version\u7248\u672c,\u7136\u540e\u70b9\u51fb\u4e0b\u8f7d \u4e0b\u8f7d\u5b8c\u6210\u540e,\u5f97\u5230\u5982\u4e0bDiskImage_1_6_WinAll .exe\u6587\u4ef6 ,\u4fdd\u5b58\u597d,\u540e\u9762\u9700\u8981\u4fdd\u5b58\u4e48U\u76d8\u3002 \u5236\u4f5cWindowsPE\u5f15\u5bfcU\u76d8 \u00b6 windows\u7684PE\u5236\u4f5c\u5de5\u5177\u6709\u5f88\u591a\uff0c\u6bd4\u5982\u8001\u6bdb\u6843,\u5927\u767d\u83dc,\u7b49,\u4f46\u8fd9\u4e9b\u5927\u591a\u4f1a\u6709\u503c\u5165\u5e7f\u544a\u7b49,\u7528\u4e8e\u5b89\u88c5windows\u7cfb\u7edf\u4f1a\u6709\u8bb8\u591a\u5783\u573e\u8f6f\u4ef6,\u8fd9\u91cc\u63a8\u8350\u4f7f\u7528\" \u5faePE\u5de5\u5177\u7bb1 \",\u4e0b\u8f7d\u5b89\u88c5\u7a0b\u5e8f\u5982\u4e0b: \u8fd0\u884cWePev2.3.exe \u70b9\u51fb\u53f3\u4e0b\u89d2\u7684\u5b89\u88c5\u5230U\u76d8\u56fe\u6807 \u9009\u62e9\u6b63\u786e\u7684\u4ea7\uff0c\u5e76\u914d\u597d\u5377\u6807\uff0c\u70b9\u51fb\u7acb\u5373\u5b89\u88c5\u5230U\u76d8\uff0c \u63d0\u793a\u5f00\u59cb\u5236\u4f5cU\u76d8 \u7a0d\u7b49\u7247\u523b \u7cfb\u7edf\u63d0\u793a\u5236\u4f5c\u5b8c\u6210 \u4e0b\u8f7d\u5e76\u89e3\u538bHAOS\u955c\u50cf\u5230U\u76d8 \u00b6 \u70b9\u51fb\u8bbf\u95ee Ha-os-GenerricX86-64\u9875\u9762 ,\u627e\u5230\u4e0b\u955c\u50cf\u7684\u4e0b\u8f7d\u94fe\u63a5 \u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u5982\u4e0b\u94fe\u63a5 \u4e0b\u8f7d,\u4f46\u5c3d\u91cf\u8fd8\u662f\u6309\u4e0a\u8ff0\u65b9\u6cd5\u4e0b\u8f7d,\u4fdd\u8bc1\u6bcf\u6b21\u4e0b\u8f7d\u7684\u90fd\u662f\u5b98\u7f51\u6700\u65b0\u7684\u7248\u672c. \u4e0b\u8f7d\u5b8c\u6210\u540e\u5982\u4e0b \u89e3\u538b\u8fd9\u4e2a\u6587\u4ef6 \u5f97\u5230haos_generic-x86-64-15.1.img,\u628a\u8fd9\u4e2a\u6587\u4ef6\u590d\u5236\u5230U\u76d8\u4e2d\u4efb\u610f\u76ee\u5f55 \u6bd4\u5982\uff0c\u6211\u653e\u5230\u4e86\u5982\u4e0b\u76ee\u5f55 \u628a\u4e4b\u524d\u4e0b\u8f7d\u597d\u7684Disk Image\u653e\u5165U\u76d8 \u00b6 \u81f3\u6b64WINpe\u5f15\u5bfcU\u76d8\u5c31\u5236\u4f5c\u597d\u4e86\u3002 \u7528\u6b64U\u76d8\u5f15\u5bfc\u5c0f\u5de5\u63a7\u673a\uff0c\u6ce8\u610f\u610f\u8981\u6b63\u786e\u7684\u914d\u7f6eBIOS\uff0c\u53ca\u8981\u7528\u6b63\u786e\u7684\u6539\u53d8\u542f\u52a8\u987a\u5e8f\u7684\u65b9\u6cd5\u5982F11\u5e38\u6309, \u5f15\u5bfc\u6210\u529f\u767d\u5e26 ,\u76f4\u5165PE\u542f\u52a8\u754c\u9762\uff0c\u9009 \u7b2c\u4e00\u9879\u9ed8\u8ba4\uff0c\u7ee7\u7eed \u7a0d\u5019\u4f1a\u8fdb\u5165PE\u7cfb\u7edf \u627e\u5230\u5e76\u542f\u52a8diskImage\u5199\u76d8\u5de5\u5177 \u70b9YES\u7ee7\u7eed \u9009 \u62e9\u4e0b\u8f7d\u597d\u7684HAOS\u7684\u5b89\u88c5\u955c\u50cfimg\u6587\u4ef6 \u63d0\u793a\u6570\u636e\u6709\u4e22\u5931\u98ce\u9669\u65f6,\u70b9\u662f \u6ce8\u610f\u5728\u5199\u5165\u4e4b\u524d,\u4e00\u5b9a\u8981\u786e\u8ba4\u662f\u786c\u76d8\u800c\u975eU\u76d8\uff0c\u4e00\u822c\u4e3aphysical disk 0 \u5199\u5165\u5b8c\u6210\u540e\u4f1a\u63d0\u793a\u5199\u5165\u6210\u529f \u91cd\u65b0\u542f\u52a8\u8fdb\u5165HA cli\u754c\u9762 \u00b6 \u7cfb\u7edf\u542f\u52a8\u6210\u529f\u540e\uff0c\u5982\u4e0b\u56fe\u6240\u793a \u901a\u8fc7\u6d4f\u89c8\u5668,\u8f93\u5165\u63a7\u5236\u53f0\u63d0\u793a\u7684IP\u52a0\u7aef\u53e3 http://192.168.3:8123 \u5373\u53ef\u8fdb\u5165\u56fe\u578b\u5316\u754c\u9762,\u5982\u4e0b","title":"Windows PE \u4e0b\u5199\u5165 HA \u955c\u50cf"},{"location":"install-guide/WinPeInstall/#windows-pe-ha","text":"windows Pe\u4e0b\u5199\u5165\u786c\u76d8\u955c\u50cf\u7684\u4e3b\u8981\u601d\u8def\u662f\u4f7f\u7528Roadkilnet\u5f00\u53d1\u7684Rodakill's Disk Image\u5de5\u5177\u628aHA\u7684\u955c\u50cf\u5199\u5165\u786c\u76d8.","title":"Windows PE \u4e0b\u5199\u5165 HA \u955c\u50cf"},{"location":"install-guide/WinPeInstall/#disk-image","text":"DiskImage\u7684\u5b98\u65b9\u4e0b\u8f7d\u5730\u5740\u4e3a ) https://roadkil.net/program.php?ProgramID=12&Action=NewOSID&DownloadVersion=12&Installer=NO \u8fdb\u5165\u7f51\u7ad9\u7684\u4e0b\u8f7d\u9875\u9762,\u5982\u4e0b,\u9009\u62e9windows8 10 or 11\u548cStand Alone Version\u7248\u672c,\u7136\u540e\u70b9\u51fb\u4e0b\u8f7d \u4e0b\u8f7d\u5b8c\u6210\u540e,\u5f97\u5230\u5982\u4e0bDiskImage_1_6_WinAll .exe\u6587\u4ef6 ,\u4fdd\u5b58\u597d,\u540e\u9762\u9700\u8981\u4fdd\u5b58\u4e48U\u76d8\u3002","title":"\u4e0b\u8f7dDisk Image"},{"location":"install-guide/WinPeInstall/#windowspeu","text":"windows\u7684PE\u5236\u4f5c\u5de5\u5177\u6709\u5f88\u591a\uff0c\u6bd4\u5982\u8001\u6bdb\u6843,\u5927\u767d\u83dc,\u7b49,\u4f46\u8fd9\u4e9b\u5927\u591a\u4f1a\u6709\u503c\u5165\u5e7f\u544a\u7b49,\u7528\u4e8e\u5b89\u88c5windows\u7cfb\u7edf\u4f1a\u6709\u8bb8\u591a\u5783\u573e\u8f6f\u4ef6,\u8fd9\u91cc\u63a8\u8350\u4f7f\u7528\" \u5faePE\u5de5\u5177\u7bb1 \",\u4e0b\u8f7d\u5b89\u88c5\u7a0b\u5e8f\u5982\u4e0b: \u8fd0\u884cWePev2.3.exe \u70b9\u51fb\u53f3\u4e0b\u89d2\u7684\u5b89\u88c5\u5230U\u76d8\u56fe\u6807 \u9009\u62e9\u6b63\u786e\u7684\u4ea7\uff0c\u5e76\u914d\u597d\u5377\u6807\uff0c\u70b9\u51fb\u7acb\u5373\u5b89\u88c5\u5230U\u76d8\uff0c \u63d0\u793a\u5f00\u59cb\u5236\u4f5cU\u76d8 \u7a0d\u7b49\u7247\u523b \u7cfb\u7edf\u63d0\u793a\u5236\u4f5c\u5b8c\u6210","title":"\u5236\u4f5cWindowsPE\u5f15\u5bfcU\u76d8"},{"location":"install-guide/WinPeInstall/#haosu","text":"\u70b9\u51fb\u8bbf\u95ee Ha-os-GenerricX86-64\u9875\u9762 ,\u627e\u5230\u4e0b\u955c\u50cf\u7684\u4e0b\u8f7d\u94fe\u63a5 \u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u5982\u4e0b\u94fe\u63a5 \u4e0b\u8f7d,\u4f46\u5c3d\u91cf\u8fd8\u662f\u6309\u4e0a\u8ff0\u65b9\u6cd5\u4e0b\u8f7d,\u4fdd\u8bc1\u6bcf\u6b21\u4e0b\u8f7d\u7684\u90fd\u662f\u5b98\u7f51\u6700\u65b0\u7684\u7248\u672c. \u4e0b\u8f7d\u5b8c\u6210\u540e\u5982\u4e0b \u89e3\u538b\u8fd9\u4e2a\u6587\u4ef6 \u5f97\u5230haos_generic-x86-64-15.1.img,\u628a\u8fd9\u4e2a\u6587\u4ef6\u590d\u5236\u5230U\u76d8\u4e2d\u4efb\u610f\u76ee\u5f55 \u6bd4\u5982\uff0c\u6211\u653e\u5230\u4e86\u5982\u4e0b\u76ee\u5f55","title":"\u4e0b\u8f7d\u5e76\u89e3\u538bHAOS\u955c\u50cf\u5230U\u76d8"},{"location":"install-guide/WinPeInstall/#disk-imageu","text":"\u81f3\u6b64WINpe\u5f15\u5bfcU\u76d8\u5c31\u5236\u4f5c\u597d\u4e86\u3002 \u7528\u6b64U\u76d8\u5f15\u5bfc\u5c0f\u5de5\u63a7\u673a\uff0c\u6ce8\u610f\u610f\u8981\u6b63\u786e\u7684\u914d\u7f6eBIOS\uff0c\u53ca\u8981\u7528\u6b63\u786e\u7684\u6539\u53d8\u542f\u52a8\u987a\u5e8f\u7684\u65b9\u6cd5\u5982F11\u5e38\u6309, \u5f15\u5bfc\u6210\u529f\u767d\u5e26 ,\u76f4\u5165PE\u542f\u52a8\u754c\u9762\uff0c\u9009 \u7b2c\u4e00\u9879\u9ed8\u8ba4\uff0c\u7ee7\u7eed \u7a0d\u5019\u4f1a\u8fdb\u5165PE\u7cfb\u7edf \u627e\u5230\u5e76\u542f\u52a8diskImage\u5199\u76d8\u5de5\u5177 \u70b9YES\u7ee7\u7eed \u9009 \u62e9\u4e0b\u8f7d\u597d\u7684HAOS\u7684\u5b89\u88c5\u955c\u50cfimg\u6587\u4ef6 \u63d0\u793a\u6570\u636e\u6709\u4e22\u5931\u98ce\u9669\u65f6,\u70b9\u662f \u6ce8\u610f\u5728\u5199\u5165\u4e4b\u524d,\u4e00\u5b9a\u8981\u786e\u8ba4\u662f\u786c\u76d8\u800c\u975eU\u76d8\uff0c\u4e00\u822c\u4e3aphysical disk 0 \u5199\u5165\u5b8c\u6210\u540e\u4f1a\u63d0\u793a\u5199\u5165\u6210\u529f","title":"\u628a\u4e4b\u524d\u4e0b\u8f7d\u597d\u7684Disk Image\u653e\u5165U\u76d8"},{"location":"install-guide/WinPeInstall/#ha-cli","text":"\u7cfb\u7edf\u542f\u52a8\u6210\u529f\u540e\uff0c\u5982\u4e0b\u56fe\u6240\u793a \u901a\u8fc7\u6d4f\u89c8\u5668,\u8f93\u5165\u63a7\u5236\u53f0\u63d0\u793a\u7684IP\u52a0\u7aef\u53e3 http://192.168.3:8123 \u5373\u53ef\u8fdb\u5165\u56fe\u578b\u5316\u754c\u9762,\u5982\u4e0b","title":"\u91cd\u65b0\u542f\u52a8\u8fdb\u5165HA cli\u754c\u9762"},{"location":"install-guide/configX86Bios/","text":"\u901a\u7528\u8bbe\u7f6e \u00b6 \u8981\u542f\u52a8Home Assistant\u64cd\u4f5c\u7cfb\u7edf\uff0cBIOS\u9700\u8981\u542f\u7528UEFI\u542f\u52a8\u6a21\u5f0f\u5e76\u7981\u7528\u5b89\u5168\u542f\u52a8\u3002 \u4ee5\u4e0b\u622a\u56fe\u6765\u81ea\u7b2c\u4e03\u4ee3\u82f1\u7279\u5c14NUC\u7cfb\u7edf\u3002\u60a8\u7684\u7cfb\u7edf\u4e0a\u7684BIOS\u83dc\u5355\u53ef\u80fd\u770b\u8d77\u6765\u4e0d\u540c\uff0c\u4f46\u9009\u9879\u5e94\u8be5\u4ecd\u7136\u5b58\u5728\u5e76\u5177\u6709\u7c7b\u4f3c\u7684\u540d\u79f0\u3002 \u8981\u8fdb\u5165BIOS\uff0c\u8bf7\u542f\u52a8\u60a8\u7684x86-64\u786c\u4ef6\u5e76\u53cd\u590d\u6309\u4e0bF2\u952e\uff08\u5728\u67d0\u4e9b\u7cfb\u7edf\u4e0a\uff0c\u8fd9\u53ef\u80fd\u662fDel\u3001F1\u6216F10\u952e\uff09\u3002 \u786e\u4fdd\u542f\u7528\u4e86UEFI\u542f\u52a8\u6a21\u5f0f\u3002 \u7981\u7528\u5b89\u5168\u542f\u52a8\u3002 \u4fdd\u5b58\u66f4\u6539\u5e76\u9000\u51fa\u3002 BIOS\u914d\u7f6e\u73b0\u5df2\u5b8c\u6210\u3002 \u516c\u53f8\u5c0f\u5de5\u63a7\u673a(1900)\u914d\u7f6e \u00b6 \u516c\u53f8\u7684\u5c0f\u5de5\u63a7\u673a\u8fdb\u5165Bios\u7684\u65b9\u5f0f,\u662f\u5f00\u673a\u65f6,\u6309DEL\u952e,\u8fdb\u5165\u5982\u4e0b\u754c\u9762 \u8fdb\u5165Bios\u540e,\u8981\u8c03OS Selection,\u9ed8\u8ba4\u4e3awindows7\u9700\u8981\u8c03\u6574\u4e3aLinux\u5982\u4e0b\u56fe \u7136\u540e\u4fdd\u5b58,\u9000\u51fa \u63d0\u793a\u4fdd\u5b58\u65f6,\u9009\u62e9YES","title":"configX86Bios"},{"location":"install-guide/configX86Bios/#_1","text":"\u8981\u542f\u52a8Home Assistant\u64cd\u4f5c\u7cfb\u7edf\uff0cBIOS\u9700\u8981\u542f\u7528UEFI\u542f\u52a8\u6a21\u5f0f\u5e76\u7981\u7528\u5b89\u5168\u542f\u52a8\u3002 \u4ee5\u4e0b\u622a\u56fe\u6765\u81ea\u7b2c\u4e03\u4ee3\u82f1\u7279\u5c14NUC\u7cfb\u7edf\u3002\u60a8\u7684\u7cfb\u7edf\u4e0a\u7684BIOS\u83dc\u5355\u53ef\u80fd\u770b\u8d77\u6765\u4e0d\u540c\uff0c\u4f46\u9009\u9879\u5e94\u8be5\u4ecd\u7136\u5b58\u5728\u5e76\u5177\u6709\u7c7b\u4f3c\u7684\u540d\u79f0\u3002 \u8981\u8fdb\u5165BIOS\uff0c\u8bf7\u542f\u52a8\u60a8\u7684x86-64\u786c\u4ef6\u5e76\u53cd\u590d\u6309\u4e0bF2\u952e\uff08\u5728\u67d0\u4e9b\u7cfb\u7edf\u4e0a\uff0c\u8fd9\u53ef\u80fd\u662fDel\u3001F1\u6216F10\u952e\uff09\u3002 \u786e\u4fdd\u542f\u7528\u4e86UEFI\u542f\u52a8\u6a21\u5f0f\u3002 \u7981\u7528\u5b89\u5168\u542f\u52a8\u3002 \u4fdd\u5b58\u66f4\u6539\u5e76\u9000\u51fa\u3002 BIOS\u914d\u7f6e\u73b0\u5df2\u5b8c\u6210\u3002","title":"\u901a\u7528\u8bbe\u7f6e"},{"location":"install-guide/configX86Bios/#1900","text":"\u516c\u53f8\u7684\u5c0f\u5de5\u63a7\u673a\u8fdb\u5165Bios\u7684\u65b9\u5f0f,\u662f\u5f00\u673a\u65f6,\u6309DEL\u952e,\u8fdb\u5165\u5982\u4e0b\u754c\u9762 \u8fdb\u5165Bios\u540e,\u8981\u8c03OS Selection,\u9ed8\u8ba4\u4e3awindows7\u9700\u8981\u8c03\u6574\u4e3aLinux\u5982\u4e0b\u56fe \u7136\u540e\u4fdd\u5b58,\u9000\u51fa \u63d0\u793a\u4fdd\u5b58\u65f6,\u9009\u62e9YES","title":"\u516c\u53f8\u5c0f\u5de5\u63a7\u673a(1900)\u914d\u7f6e"},{"location":"install-guide/installHa/","text":"\u5b89\u88c5HomeAssistant \u00b6 HomeAssistant\u7684\u5b89\u88c5\u6709\u591a\u79cd\u65b9\u5f0f\u4e0e\u65b9\u6cd5,\u6700\u5e38\u7528\u6298\u6709\u786c\u5907\u76f4\u63a5\u5b89\u88c5,docker\u5b89\u88c5\u865a\u62df\u673a\u5b89\u88c5\u7b49. \u4e0b\u9762\u6211\u4eec\u5c31\u4ee5\u786c\u76d8\u5b89\u88c5HAOS\u4e3a\u4f8b\u4ecb\u7ecd\u57fa\u4e8ex86\u786c\u4ef6\u7684\u57fa\u7840\u4e0a\u5b89\u88c5HAOS,\u57fa\u5b83\u7684\u5b89\u88c5\u65b9\u5f0f,\u540e\u7eed\u4f1a\u4ecb\u7ecd. HAOS\u5b89\u88c5 \u00b6 \u5b89\u88c5\u5728X86PC\u786c\u76d8\u4e0a \u00b6 haos\u8981\u5b89\u88c5\u5728\u786c\u76d8\u4e0a,\u603b\u4f53\u601d\u8def\u662f,\u5148\u5230HA\u7684\u5b98\u7f51\u4e0b\u8f7dhaos\u7684\u5b98\u65b9\u955c\u50cf\u6587\u4ef6 ,\u4e00\u822c\u4e3a.gz\u6216.gz.xz\u7b49\u683c\u5f0f,\u7136\u540e\u518d\u7528\u5199\u76d8\u5de5\u5177,\u76f4\u63a5\u628a\u8fd9\u4e2a\u955c\u50cf\u5199\u5165\u786c\u76d8. \u5c06\u955c\u50cf\u6587\u4ef6\u5199\u5165\u786c\u76d8\u4e0a\u7ea6\u6709\u4e24\u79cd\u65b9\u6cd5: \u5728linux\u64cd\u4f5c\u7cfb\u7edf\u4e0a\u5199\u5165\u955c\u50cf \u5728windows\u5e73\u53f0\u4e0a\u5199\u5165\u955c\u50cf \u57fa\u4e8elinux\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf \u00b6 \u8fd9\u79cd\u65b9\u6cd5\u7684\u64cd\u4f5c\u65b9\u6cd5\u662f: \u5148\u4e0b\u8f7d\u5b89\u88c5ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf \u5728\u865a\u62df\u673a\u6216\u7269\u7406\u673a\u4e2d\u5b89\u88c5\u6b64ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf.(\u4e34\u65f6\u4f7f\u7528) \u4f7f\u7528ubuntu24.04\u5236\u4f5clinux\u542f\u52a8U\u76d8ubuntu live \u4f7f\u7528\u542f\u52a8U\u76d8ubuntu live\u5f15\u5bfcx86\u5c0f\u5de5\u63a7\u673a. \u8fdb\u5165try\u6a21\u5f0f(\u4e0d\u5b89\u88c5). \u5728try\u6a21\u5f0f\u4e2d,\u4e0b\u8f7dha\u5b89\u65b9\u955c\u50cf \u4f7f\u7528ubuntu live\u7684\u81ea\u5e26\u7684\u78c1\u76d8\u6062\u590d\u5de5\u5177\u5199\u5165\u955c\u50cf\u5230\u786c\u76d8. \u79fb\u9664U\u76d8 \u91cd\u542f\u7cfb\u7edf \u8fdb\u5165HA cli\u754c\u9762 \u6b64\u79cd\u65b9\u6cd5\u7684\u597d\u5904\u662f,\u4e0d\u7528\u62c6\u9664\u786c\u76d8,\u76f4\u63a5\u5728\u5c0f\u5de5\u63a7\u673a\u4e0a\u5c31\u80fd\u5b9e\u73b0\u64cd\u4f5c. \u57fa\u4e8e windows\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf. \u00b6 \u5b98\u65b9\u5728\u4ecb\u7ecd\u8fd9\u79cd\u65b9\u6cd5\u662f\u8ba9\u7528\u6237\u628a\u5c0f\u5de5\u63a7\u673a\u7684\u786c\u76d8\u62c6\u4e0b,\u88c5\u5165\u7528\u6237\u81ea\u5df2\u7684\u7535\u8111\u4e2d,\u5e76\u7528balenaEtcher\u5199\u76d8\u5de5\u5177\u5c06\u955c\u50cf\u5199\u5165\u5c0f\u5de5\u63a7\u7684\u673a\u7684\u786c\u76d8\u540e,\u518d\u628a\u5c0f\u5de5\u63a7\u673a\u673a\u7684\u786c\u76d8\u88c5\u5165\u5c0f\u5de5\u63a7\u673a.\u8fd9\u65b9\u6cd5\u65b9\u4fbf\u5feb\u6377,\u4f46\u662f\u9700\u8981\u62c6\u673a,\u6709\u9700\u8981\u7684\u7528\u6237\u53ef\u4ee5\u5230\u5b98\u65b9\u4ecb\u7ecd\u9875\u9762 Geneic x86-64 \u53bb\u770b\u5177\u4f53\u64cd\u4f5c\u65b9\u6cd5. \u6211\u4eec\u5e38\u7528\u7684\u65b9\u6cd5\u5982\u4e0b: \u5236\u4f5c\u4e00\u4e2a\u5176\u4e8ewindows PE\u7cfb\u7edf\u7684\u5f15\u5bfcU\u76d8. \u4e0b\u8f7d\u5b98\u65b9\u955c\u50cf\u5230U\u76d8\u4e2d\u3002 \u89e3\u538b\u955c\u50cf\u4e3a.img\u6587\u4ef6 \u7528PE\u5e26\u7684\u5199\u76d8\u5de5\u5177\uff0c\u5c06HA\u955c\u50cf\u5199\u5165\u786c\u76d8\u3002 \u79fb\u9664U\u76d8\u3002 \u91cd\u542f\u8fdb\u5165HA ClI.","title":"\u5b89\u88c5"},{"location":"install-guide/installHa/#homeassistant","text":"HomeAssistant\u7684\u5b89\u88c5\u6709\u591a\u79cd\u65b9\u5f0f\u4e0e\u65b9\u6cd5,\u6700\u5e38\u7528\u6298\u6709\u786c\u5907\u76f4\u63a5\u5b89\u88c5,docker\u5b89\u88c5\u865a\u62df\u673a\u5b89\u88c5\u7b49. \u4e0b\u9762\u6211\u4eec\u5c31\u4ee5\u786c\u76d8\u5b89\u88c5HAOS\u4e3a\u4f8b\u4ecb\u7ecd\u57fa\u4e8ex86\u786c\u4ef6\u7684\u57fa\u7840\u4e0a\u5b89\u88c5HAOS,\u57fa\u5b83\u7684\u5b89\u88c5\u65b9\u5f0f,\u540e\u7eed\u4f1a\u4ecb\u7ecd.","title":"\u5b89\u88c5HomeAssistant"},{"location":"install-guide/installHa/#haos","text":"","title":"HAOS\u5b89\u88c5"},{"location":"install-guide/installHa/#x86pc","text":"haos\u8981\u5b89\u88c5\u5728\u786c\u76d8\u4e0a,\u603b\u4f53\u601d\u8def\u662f,\u5148\u5230HA\u7684\u5b98\u7f51\u4e0b\u8f7dhaos\u7684\u5b98\u65b9\u955c\u50cf\u6587\u4ef6 ,\u4e00\u822c\u4e3a.gz\u6216.gz.xz\u7b49\u683c\u5f0f,\u7136\u540e\u518d\u7528\u5199\u76d8\u5de5\u5177,\u76f4\u63a5\u628a\u8fd9\u4e2a\u955c\u50cf\u5199\u5165\u786c\u76d8. \u5c06\u955c\u50cf\u6587\u4ef6\u5199\u5165\u786c\u76d8\u4e0a\u7ea6\u6709\u4e24\u79cd\u65b9\u6cd5: \u5728linux\u64cd\u4f5c\u7cfb\u7edf\u4e0a\u5199\u5165\u955c\u50cf \u5728windows\u5e73\u53f0\u4e0a\u5199\u5165\u955c\u50cf","title":"\u5b89\u88c5\u5728X86PC\u786c\u76d8\u4e0a"},{"location":"install-guide/installHa/#linux","text":"\u8fd9\u79cd\u65b9\u6cd5\u7684\u64cd\u4f5c\u65b9\u6cd5\u662f: \u5148\u4e0b\u8f7d\u5b89\u88c5ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf \u5728\u865a\u62df\u673a\u6216\u7269\u7406\u673a\u4e2d\u5b89\u88c5\u6b64ubuntu24.04\u64cd\u4f5c\u7cfb\u7edf.(\u4e34\u65f6\u4f7f\u7528) \u4f7f\u7528ubuntu24.04\u5236\u4f5clinux\u542f\u52a8U\u76d8ubuntu live \u4f7f\u7528\u542f\u52a8U\u76d8ubuntu live\u5f15\u5bfcx86\u5c0f\u5de5\u63a7\u673a. \u8fdb\u5165try\u6a21\u5f0f(\u4e0d\u5b89\u88c5). \u5728try\u6a21\u5f0f\u4e2d,\u4e0b\u8f7dha\u5b89\u65b9\u955c\u50cf \u4f7f\u7528ubuntu live\u7684\u81ea\u5e26\u7684\u78c1\u76d8\u6062\u590d\u5de5\u5177\u5199\u5165\u955c\u50cf\u5230\u786c\u76d8. \u79fb\u9664U\u76d8 \u91cd\u542f\u7cfb\u7edf \u8fdb\u5165HA cli\u754c\u9762 \u6b64\u79cd\u65b9\u6cd5\u7684\u597d\u5904\u662f,\u4e0d\u7528\u62c6\u9664\u786c\u76d8,\u76f4\u63a5\u5728\u5c0f\u5de5\u63a7\u673a\u4e0a\u5c31\u80fd\u5b9e\u73b0\u64cd\u4f5c.","title":"\u57fa\u4e8elinux\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf"},{"location":"install-guide/installHa/#windows","text":"\u5b98\u65b9\u5728\u4ecb\u7ecd\u8fd9\u79cd\u65b9\u6cd5\u662f\u8ba9\u7528\u6237\u628a\u5c0f\u5de5\u63a7\u673a\u7684\u786c\u76d8\u62c6\u4e0b,\u88c5\u5165\u7528\u6237\u81ea\u5df2\u7684\u7535\u8111\u4e2d,\u5e76\u7528balenaEtcher\u5199\u76d8\u5de5\u5177\u5c06\u955c\u50cf\u5199\u5165\u5c0f\u5de5\u63a7\u7684\u673a\u7684\u786c\u76d8\u540e,\u518d\u628a\u5c0f\u5de5\u63a7\u673a\u673a\u7684\u786c\u76d8\u88c5\u5165\u5c0f\u5de5\u63a7\u673a.\u8fd9\u65b9\u6cd5\u65b9\u4fbf\u5feb\u6377,\u4f46\u662f\u9700\u8981\u62c6\u673a,\u6709\u9700\u8981\u7684\u7528\u6237\u53ef\u4ee5\u5230\u5b98\u65b9\u4ecb\u7ecd\u9875\u9762 Geneic x86-64 \u53bb\u770b\u5177\u4f53\u64cd\u4f5c\u65b9\u6cd5. \u6211\u4eec\u5e38\u7528\u7684\u65b9\u6cd5\u5982\u4e0b: \u5236\u4f5c\u4e00\u4e2a\u5176\u4e8ewindows PE\u7cfb\u7edf\u7684\u5f15\u5bfcU\u76d8. \u4e0b\u8f7d\u5b98\u65b9\u955c\u50cf\u5230U\u76d8\u4e2d\u3002 \u89e3\u538b\u955c\u50cf\u4e3a.img\u6587\u4ef6 \u7528PE\u5e26\u7684\u5199\u76d8\u5de5\u5177\uff0c\u5c06HA\u955c\u50cf\u5199\u5165\u786c\u76d8\u3002 \u79fb\u9664U\u76d8\u3002 \u91cd\u542f\u8fdb\u5165HA ClI.","title":"\u57fa\u4e8ewindows\u64cd\u4f5c\u7cfb\u7edf\u5199\u5165\u955c\u50cf."}]} |
| New file |
| | |
| | | var base_path = 'function' === typeof importScripts ? '.' : '/search/'; |
| | | var allowSearch = false; |
| | | var index; |
| | | var documents = {}; |
| | | var lang = ['en']; |
| | | var data; |
| | | |
| | | function getScript(script, callback) { |
| | | console.log('Loading script: ' + script); |
| | | $.getScript(base_path + script).done(function () { |
| | | callback(); |
| | | }).fail(function (jqxhr, settings, exception) { |
| | | console.log('Error: ' + exception); |
| | | }); |
| | | } |
| | | |
| | | function getScriptsInOrder(scripts, callback) { |
| | | if (scripts.length === 0) { |
| | | callback(); |
| | | return; |
| | | } |
| | | getScript(scripts[0], function() { |
| | | getScriptsInOrder(scripts.slice(1), callback); |
| | | }); |
| | | } |
| | | |
| | | function loadScripts(urls, callback) { |
| | | if( 'function' === typeof importScripts ) { |
| | | importScripts.apply(null, urls); |
| | | callback(); |
| | | } else { |
| | | getScriptsInOrder(urls, callback); |
| | | } |
| | | } |
| | | |
| | | function onJSONLoaded () { |
| | | data = JSON.parse(this.responseText); |
| | | var scriptsToLoad = ['lunr.js']; |
| | | if (data.config && data.config.lang && data.config.lang.length) { |
| | | lang = data.config.lang; |
| | | } |
| | | if (lang.length > 1 || lang[0] !== "en") { |
| | | scriptsToLoad.push('lunr.stemmer.support.js'); |
| | | if (lang.length > 1) { |
| | | scriptsToLoad.push('lunr.multi.js'); |
| | | } |
| | | if (lang.includes("ja") || lang.includes("jp")) { |
| | | scriptsToLoad.push('tinyseg.js'); |
| | | } |
| | | for (var i=0; i < lang.length; i++) { |
| | | if (lang[i] != 'en') { |
| | | scriptsToLoad.push(['lunr', lang[i], 'js'].join('.')); |
| | | } |
| | | } |
| | | } |
| | | loadScripts(scriptsToLoad, onScriptsLoaded); |
| | | } |
| | | |
| | | function onScriptsLoaded () { |
| | | console.log('All search scripts loaded, building Lunr index...'); |
| | | if (data.config && data.config.separator && data.config.separator.length) { |
| | | lunr.tokenizer.separator = new RegExp(data.config.separator); |
| | | } |
| | | |
| | | if (data.index) { |
| | | index = lunr.Index.load(data.index); |
| | | data.docs.forEach(function (doc) { |
| | | documents[doc.location] = doc; |
| | | }); |
| | | console.log('Lunr pre-built index loaded, search ready'); |
| | | } else { |
| | | index = lunr(function () { |
| | | if (lang.length === 1 && lang[0] !== "en" && lunr[lang[0]]) { |
| | | this.use(lunr[lang[0]]); |
| | | } else if (lang.length > 1) { |
| | | this.use(lunr.multiLanguage.apply(null, lang)); // spread operator not supported in all browsers: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator#Browser_compatibility |
| | | } |
| | | this.field('title'); |
| | | this.field('text'); |
| | | this.ref('location'); |
| | | |
| | | for (var i=0; i < data.docs.length; i++) { |
| | | var doc = data.docs[i]; |
| | | this.add(doc); |
| | | documents[doc.location] = doc; |
| | | } |
| | | }); |
| | | console.log('Lunr index built, search ready'); |
| | | } |
| | | allowSearch = true; |
| | | postMessage({config: data.config}); |
| | | postMessage({allowSearch: allowSearch}); |
| | | } |
| | | |
| | | function init () { |
| | | var oReq = new XMLHttpRequest(); |
| | | oReq.addEventListener("load", onJSONLoaded); |
| | | var index_path = base_path + '/search_index.json'; |
| | | if( 'function' === typeof importScripts ){ |
| | | index_path = 'search_index.json'; |
| | | } |
| | | oReq.open("GET", index_path); |
| | | oReq.send(); |
| | | } |
| | | |
| | | function search (query) { |
| | | if (!allowSearch) { |
| | | console.error('Assets for search still loading'); |
| | | return; |
| | | } |
| | | |
| | | var resultDocuments = []; |
| | | var results = index.search(query); |
| | | for (var i=0; i < results.length; i++){ |
| | | var result = results[i]; |
| | | doc = documents[result.ref]; |
| | | doc.summary = doc.text.substring(0, 200); |
| | | resultDocuments.push(doc); |
| | | } |
| | | return resultDocuments; |
| | | } |
| | | |
| | | if( 'function' === typeof importScripts ) { |
| | | onmessage = function (e) { |
| | | if (e.data.init) { |
| | | init(); |
| | | } else if (e.data.query) { |
| | | postMessage({ results: search(e.data.query) }); |
| | | } else { |
| | | console.error("Worker - Unrecognized message: " + e); |
| | | } |
| | | }; |
| | | } |
| | |
| | | pip install mkdocs-bootstrap |
| | | pip install mkdocs-windmill |
| | | pip install mkdocs-gitbook name: gitbook |
| | | pip install markdown-checklist |
| | | ``` |
| | | |
| | | |