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

 找回密码
 立即注册
查看: 81197|回复: 91

[进阶教程] 个性化智能家居控制界面:Floorplan for Home Assistant

  [复制链接]

5

主题

37

帖子

369

积分

论坛分享达人

积分
369
金钱
327
HASS币
0
发表于 2017-9-9 13:57:50 | 显示全部楼层 |阅读模式
本帖最后由 zhaojunll 于 2017-9-9 13:57 编辑

通过本篇教程,你将获得 Home Assistant 的另一种交互方式:平面图(Floorplan),并跟随示例创建属于你独一无二的个人家庭控制界面。

一、效果展示

Floorplan for Home Assistant 使用系统的前端功能,以一个更直观“家庭平面图”作为交互界面。在 Home Assistant 的 Web 页面控制的所有设备、服务、场景,都可以在平面图中显示并控制。


                               
登录/注册后可看大图
▲Floorplan for Home Assistant 1


                               
登录/注册后可看大图
▲Floorplan for Home Assistant 2


                               
登录/注册后可看大图
▲Floorplan for Home Assistant 3


                               
登录/注册后可看大图
▲Floorplan for Home Assistant 4

二、基础准备
实现原理

Home Assistant 提供的前端功能。由于 Home Assistant 本身使用 Web 页面控制,理论上你可以以任意的 Web 图形化形式展示并控制整个系统。而在平面图(Floorplan)中,通过使自定义的 ha-floorplan.html 页面文件配合SVG 格式图片 floorplan.svg,可以将图片中的可视化设备赋予系统设备的实例 ID(Entity ID),达到关联控制的目的。

3D 的显示效果很棒,可是由于下面几个原因我最终仍选择了 2D 视图模式:
  • 角度固定导致设备显示问题。
  • 灯具的显示控制问题。
  • SVG 实现形式的局限(不支持三维物体的描述,如效果展示2,大部分仍采用了菜单的形式来控制设备)。

SVG:可缩放矢量图形(Scalable Vector Graphics)是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式。SVG由W3C制定,是一个开放标准。

使用工具

SVG 编辑软件Inkscape,免费、开源的矢量图形编辑器,提供了大量绘图和对象操作工具,不仅能导入导出SVG,还支持AI、EPS、PSD和PNG。


                               
登录/注册后可看大图
▲Inkscape

三、安装项目
复制文档

项目文档(或百度网盘 提取密码:rt2n)中下载最新的相关文件,复制到你的 config 目录下,结构如下:


                               
登录/注册后可看大图
▲目录结构

主要需要修改的文件:
  • floorplan.yaml:设备配置文件
  • floorplan.svg:平面图图片文件
  • floorplan.css:显示效果样式文件



显示方式

平面图(Floorplan)在 Home Assistant 中有两种显示方式:

侧边栏


                               
登录/注册后可看大图
▲侧边栏

在  configuration.yaml 添加如下配置:
panel_custom:
  - name: floorplan
    sidebar_title: Floorplan
    sidebar_icon: mdi:bulletin-board
    url_path: floorplan
    config: !include floorplan.yaml

状态卡片


                               
登录/注册后可看大图
▲状态卡片

在  configuration.yaml 添加如下配置:

# 虚拟了一个实例来表示平面图,实例类型任意。
homeassistant:
  customize:    
    binary_sensor.floorplan:
      custom_ui_state_card: floorplan
      config: !include floorplan.yaml
binary_sensor:
  - platform: mqtt
    state_topic: dummy/floorplan/sensor
    name: Floorplan
group:
  zones:
    name: Zones
    entities:
      - binary_sensor.floorplan

以任意方式配置之后重启 Home Assistant 服务,在 Floorplan 面板中你应该能看见如下界面:


                               
登录/注册后可看大图
▲Floorplan 初始界面

官方文档提供了默认的配置文件与 SVG 平面图文件,由于没有跟你的系统关联,无法进行任何操作,下面让我们先将你的设备加入  floorplan.yaml 文件中。

四、添加设备

目前仅支持传感器(Sensor)、开关(Switch)、灯具(Light)、报警面板(Alarm Panel)、二进制传感器(Binary Sensors)、摄像头(Camera)、媒体播放器(Media Player),将你的设备的实例 ID(Entity ID) 添加到 floorplan.yaml 文件相应位置(仅以部分设备为例,详情参照下载文档):

      name: Demo Floorplan
      image: /local/custom_ui/floorplan/floorplan.svg
      stylesheet: /local/custom_ui/floorplan/floorplan.css
      
      # 可选项
      warnings:                  # 开启错误提示,可以在Web页面查看
      # pan_zoom:                  # 缩放
      # hide_app_toolbar:          # 隐藏 Toolbar
      # date_format: DD-MMM-YYYY   # 自定义日期格式
      
      last_motion_entity: sensor.template_last_motion # 最后动作设备
      last_motion_class: last-motion
​
      groups:
​
        - name: Sensors #传感器 名称自定 可以有多组
          entities:
             -  sensor.dark_sky_temperature # 温度传感器 在此处添加你的设备 ID 
          # 文字显示模板,在我的文档中定义了两类,分别带有温湿度单位的,可自行参考
          text_template: '${entity.state ? Math.ceil(entity.state) : "undefined"}'  
          # 显示模板 调用不同的 CSS 信息
          class_template: '
            var temp = parseFloat(entity.state.replace("°", ""));
            if (temp < 10)
              return "temp-low"; # 在 CSS 文件中的 .temp-low 类下修改相关显示属性
            else if (temp < 30)
              return "temp-medium";
            else
              return "temp-high";
            '
​
        - name: Lights
          entities:
             - light.hallway
             - light.living_room
             - light.patio
             - group.kitchen_lights
             - group.living_room_lights
          states: # 状态 以及相应调用的 CSS 信息
            - state: 'on'
              class: 'light-on'
            - state: 'off'
              class: 'light-off'
          action: #执行动作
            domain: homeassistant   
            service: toggle


                               
登录/注册后可看大图
▲错误提示

配置完成后,需要重启 Home Assistant 服务,如果你开启了配置文件中的 warnings 错误提示,刷新浏览器,你将会看到类似上图的信息,提示我们在 SVG 文件中没有找到相应的设备,下面我们将绘制属于你的平面图并将设备与图形关联起来。

五、平面图绘制

平面图一般是在你的户型图基础上进行修改与添加相关设备显示,通过 floorplan.svg 文件展示出来。

获取你的户型图

如果你拥有自己的户型图源文件,你可以直接导入到 Inkscape 中进行修改。如果你没有的话,推荐以下两种方式简单的获取你的户型图:

Inkscape 支持 CAD 文件导入,但是会产生很多杂项,线条也是独立的,不方便后期修改,经过测试仍推荐重绘个人平面图。如果你不需要后期美化,可以在酷家乐下载你的户型图 CAD 文件,并通过在线DXF转SVG直接获得的你的户型图 SVG 文件。


                               
登录/注册后可看大图

酷家乐:在线制作户型图。开始设计后直接搜索你的户型图,找到后直接导出最简户型。


                               
登录/注册后可看大图
▲新建户型


                               
登录/注册后可看大图
▲导出户型

magicplan:使用拍摄与增强现实功能创建个人户型图。如果线上没有你的户型图,你可以使用 magicplan 自行制作。需要注意的是 magicplan 导出功能需要收费,这里我们仅使用制成后的截图来供我们参考制作所需的平面图。


                               
登录/注册后可看大图
▲magicplan

户型图 SVG 文件的绘制

为了后期进一步美化与定制,我们没有使用 CAD 源文件,这就需要我们手动修改户型图。将之前得到的户型图文件拖拽进 Inkscape 进行临摹。

                               
登录/注册后可看大图
▲ 绘制户型图

美化后的户型图完全符合 SVG 文件的要求,你可以试着再往里面添加你的家具家电。

                               
登录/注册后可看大图
▲ 绘制户型图

设备的关联

之所以重绘户型图,一个原因是为了能够使你的平面图看起来更美观,另一个原因就是为了之后的设备关联。所有你想要在平面图中控制的设备,你都需要设置它在 SVG 文件中的属性,赋予相关图形你的实例 ID(Entity ID)。
为了方便触控设备的操作,遵循人机交互的需求(Human Interface),我采用统一大小格式的图标来作为设备的控件。大多数相关图标可以在 FLATICON 网站下载,文末的附件中也含有我用到的一些图标供大家参考。

                               
登录/注册后可看大图

以下仅以灯具控制以及温湿度信息显示为例:

关联灯具

在平面图中适合位置添加你选择的图标,调整到适合大小,设置对象属性。


                               
登录/注册后可看大图
▲添加灯具

关联温湿度信息
在平面图中适合位置添加任意文字,调整到你希望显示的大小,设置对象属性。

                               
登录/注册后可看大图
▲添加温湿度信息

完成后保存 floorplan.svg 文件并替换原文件,刷新浏览器,查看效果,并注意错误提示。

六、个性化设置

经过前面几步,你已经可以在浏览器中使用平面图控制你的设备了,下面主要涉及 floorplan.css 文件的修改,也就是对设备开关状态显示效果、信息显示效果、门窗状态显示效果的自定义,示例如下:

SVG 与 CSS 文件的修改不需要重启 Home Assistant 服务,保存后刷新浏览器即可。


信息文本样式

如我们在 floorplan.yaml 文件中添加的温湿度传感器为例(本例包含多种样式的判断选择):

# 温度 由于温湿度的单位不同,将之分别定义显示模板 text_template
- name: Sensors
          entities:
             - sensor.temperature_158d0001141e1a
             - sensor.temperature_158d0001145a31
          text_template: '${entity.state ? Math.ceil(entity.state) : "undefined"}${entity.attributes.unit_of_measurement}'
          # 样式模板,温度在低于15、15-30、高于30,分别按照 temp-low temp-medium temp-high 的样式显示,在本例中分别显示 蓝色(寒冷)、绿色(舒适)、红色(炎热)
          class_template: '
            var temp = parseFloat(entity.state);
            if (temp < 15)
              return "temp-low";
            else if (temp < 30)
              return "temp-medium";
            else
              return "temp-high";
            '
# 湿度
        - name: Sensors
          entities:
             - sensor.humidity_158d0001141e1a
             - sensor.humidity_158d0001145a31
          text_template: '${entity.state ? Math.ceil(entity.state) : "undefined"}${entity.attributes.unit_of_measurement}'
          # 样式模板,湿度在低于45、45-65、高于65,分别按照 humidity-low humidity-medium humidity-high 的样式显示,在本例中分别显示 黄色(干燥)、绿色(舒适)、蓝色(潮湿)
          class_template: '
            var humidity = parseFloat(entity.state);
            if (humidity < 45)
              return "humidity-low";
            else if (humidity < 65)
              return "humidity-medium";
            else
              return "humidity-high";

            '
在 floorplan.css 文件中对应如下:

/*CSS样式表,修改类似#5bc0de的信息,即改变相应状态显示颜色*/
.temp-low {
  fill: #5bc0de !important;
}
.temp-medium {
  fill: #5cb85c !important;
}
.temp-high {
  fill: #d9534f !important;
}
.humidity-low {
  fill: #f0ad4e !important;
}
.humidity-medium {
  fill: #5cb85c !important;
}
.humidity-high {
  fill: #5bc0de !important;
}


图标控件样式

如我们在 floorplan.yaml 文件中添加的灯具为例。通常会有开和关两个状态,对应两个样式。

states:
  - state: 'on'
    class: 'light-on'
  - state: 'off'
    class: 'light-off'

在 floorplan.css 文件中对应如下:

.light-off {
  opacity: 0.75; /*关闭时不透明度为75%*/
}
​
.light-on { /*开启时正常显示*/
}

效果如下:

                               
登录/注册后可看大图
▲图标控件样式

给一组样式对比, floorplan.css 文件:

.light-off {
  stroke: white; !important;
  fill: #C3B7F4 !important;
}
​
.light-on {
  stroke: white; !important;
  fill: #F8D2B9 !important;
}

效果如下:

                               
登录/注册后可看大图
▲图标控件样式

同理我们可以设置门窗、人体感应器不同状态下的颜色、显示,这里就不一一说明了。
目前大多数浏览器支持的 CSS 效果还有很多,如果你对相关知识有一定了解,你还可以设置动态显示效果,比如风扇开时显示动态图标,关闭时显示静态图标。

七、相关文档下载

文中用到的配置文件、图标、SVG、CSS文档在百度网盘(提取密码:rt2n)提供下载,以便大家参考。  

评分

参与人数 10金钱 +67 收起 理由
zelotoj + 8 高手,这是高手!
zkl + 2
dkef730 + 5 厉害了word楼主!
wosilijie + 2 虽然看不懂,但感觉很厉害的样子。.
554628483 + 2
zin + 2 教程详细清楚,在下对你的景仰犹如滔滔长江.
hundajdx + 3 膜拜大神!
lidicn + 20 膜拜大神!
luzai + 5 精品教程啊,做得真好
+ 18 谢谢大神分享!

查看全部评分

回复

使用道具 举报

24

主题

604

帖子

3400

积分

元老级技术达人

积分
3400
金钱
2791
HASS币
0

卓越贡献

发表于 2017-9-9 14:03:54 | 显示全部楼层
大神!!真的好厉害!!
回复

使用道具 举报

4

主题

340

帖子

2612

积分

金牌会员

Rank: 6Rank: 6

积分
2612
金钱
2272
HASS币
0
发表于 2017-9-9 14:11:08 | 显示全部楼层
这感觉很牛逼呀,看来以后真要挂个平板在墙上了
回复

使用道具 举报

6

主题

124

帖子

687

积分

高级会员

Rank: 4

积分
687
金钱
563
HASS币
0
发表于 2017-9-9 14:17:47 | 显示全部楼层
占楼支持
回复

使用道具 举报

7

主题

156

帖子

1327

积分

论坛技术达人

积分
1327
金钱
1171
HASS币
0
发表于 2017-9-9 14:19:56 | 显示全部楼层
支持支持!!!!!!!!!!
回复

使用道具 举报

9

主题

256

帖子

2659

积分

金牌会员

Rank: 6Rank: 6

积分
2659
金钱
2393
HASS币
60
发表于 2017-9-9 15:01:06 | 显示全部楼层
这个真牛逼,必须支持!
回复

使用道具 举报

62

主题

581

帖子

6055

积分

论坛元老

Rank: 8Rank: 8

积分
6055
金钱
5399
HASS币
240

教程狂人论坛风云人物

发表于 2017-9-9 16:34:33 | 显示全部楼层

大神!!真的好厉害!!
回复

使用道具 举报

2

主题

160

帖子

2484

积分

金牌会员

Rank: 6Rank: 6

积分
2484
金钱
2324
HASS币
0
发表于 2017-9-9 17:18:10 | 显示全部楼层
大神实在太厉害了,这个估计要学很长时间吧?
回复

使用道具 举报

12

主题

335

帖子

2322

积分

论坛DIY达人

积分
2322
金钱
1982
HASS币
0
发表于 2017-9-9 19:39:49 | 显示全部楼层
老早就在群里看到了,原来是这样弄。做起来给老妈用还挺实际的
回复

使用道具 举报

3

主题

74

帖子

717

积分

高级会员

Rank: 4

积分
717
金钱
643
HASS币
0
发表于 2017-9-9 23:41:43 | 显示全部楼层
终于出教程了,看了很多 就是很懵逼
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-27 07:53 , Processed in 1.356011 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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