<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>庄菲什</title>
  <icon>https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/avatar.png</icon>
  <subtitle>Keep Cool</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://yoursite.com/"/>
  <updated>2024-01-30T09:13:07.260Z</updated>
  <id>http://yoursite.com/</id>
  
  <author>
    <name>drunkfish</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Gemini 的使用</title>
    <link href="http://yoursite.com/gemini/"/>
    <id>http://yoursite.com/gemini/</id>
    <published>2024-01-01T00:00:00.000Z</published>
    <updated>2024-01-30T09:13:07.260Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/gemini_cover.png" alt="gemini_cover"></p><p><a href="https://deepmind.google/technologies/gemini/" target="_blank" rel="noopener">Gemini</a> 是 Google 在 2023 年 12 月发布的 AI 模型，与 ChatGPT 相比，有以下特点：</p><ul><li><p>可以联网获取最新数据；</p></li><li><p>与 ChatGPT 结果不相上下的水准；</p></li><li><p>可以辨识图片（ChatGPT 需订阅才可使用）；</p></li><li><p>比 ChatGPT 生成更快；</p></li><li><p>频率限制宽松，每分钟 <a href="https://ai.google.dev/models/gemini?hl=zh-tw" target="_blank" rel="noopener">60 次要求</a>（ChatGPT 未订阅每分钟不超过 3 次请求）</p></li></ul><p>综上，Gemini 可以作为 ChatGPT 付费版的另一种选择。以下是使用 Gemini 的几种方法： </p><h2 id="Bard-网页"><a href="#Bard-网页" class="headerlink" title="Bard 网页"></a>Bard 网页</h2><p>使用 Gemini 最简单的方式是在 Bard 中使用，直接打开 <a href="https://bard.google.com/" target="_blank" rel="noopener">https://bard.google.com/</a> 登录 Google 账号就可以使用，除了发送文本，还可以发送图片。</p><h2 id="沉浸式翻译"><a href="#沉浸式翻译" class="headerlink" title="沉浸式翻译"></a>沉浸式翻译</h2><p><a href="https://immersivetranslate.com/" target="_blank" rel="noopener">沉浸式翻译</a>是一款非常好用双语对照网页翻译浏览器插件，可以通过调用 api 方式进行翻译网页、PDF文档，ePub 电子书，字幕档。除了可以翻译网页，沉浸式翻译还支持在线影片字幕实时翻译、鼠标经过翻译、输入框翻译。</p><p>ChatGPT 未订阅每分钟不超过 3 次请求，无法在沉浸式翻译中使用，而 Gemini 每分钟可 60 此要求，生成速度快，与 ChatGPT 不相上下的翻译品质，可顺畅在沉浸式翻译中使用。</p><p>使用时先在 <a href="https://makersuite.google.com/app/apikey" target="_blank" rel="noopener">https://makersuite.google.com/app/apikey</a> 生成 API key，之后再填入沉浸式翻译中就可以使用。</p><h2 id="Bob-翻译"><a href="#Bob-翻译" class="headerlink" title="Bob 翻译"></a>Bob 翻译</h2><p><a href="https://bobtranslate.com/" target="_blank" rel="noopener">Bob</a> 是一款 macOS 平台的全局划词翻译、OCR 应用。可以通过<a href="https://github.com/Brain777777/bob-plugin-gemini" target="_blank" rel="noopener">此插件</a>，填入 API key 使用 Gemini 翻译。</p><p>类似的应用还有 <a href="https://github.com/pot-app/pot-desktop" target="_blank" rel="noopener">Pot</a>、<a href="https://github.com/tisfeng/Easydict" target="_blank" rel="noopener">Easydict</a>。</p><h2 id="chatGPTBox"><a href="#chatGPTBox" class="headerlink" title="chatGPTBox"></a>chatGPTBox</h2><p><a href="https://github.com/josStorer/chatGPTBox" target="_blank" rel="noopener">chatGPTBox</a> 是一款将各类深度集成到浏览器中的插件, 使用时只需要打开 <a href="https://bard.google.com/" target="_blank" rel="noopener">https://bard.google.com/</a> 就可以在 chatGPTBox 中使用。</p><p>chatGPTBox 有几个非常实用的功能：</p><ul><li>在搜索引擎右侧显示 Gemini 对话及相关内容；</li><li>摘要 Youtube 视频内容；</li><li>通过右键菜单通过 Gemini 总结任意页面内容</li></ul><h2 id="tg-gemini-bot"><a href="#tg-gemini-bot" class="headerlink" title="tg-gemini-bot"></a>tg-gemini-bot</h2><p><a href="https://github.com/winniesi/tg-gemini-bot" target="_blank" rel="noopener">tg-gemini-bot</a> 可以将 Gemini 连接 Telegram，在 Telegram 介面中使用 Gemini 。</p><p>tg-gemini-bot 可以通过 Vercel 部署，不需要额外服务器，另外，tg-gemini-bot 还支持发送图片。</p><h2 id="ChatGPT-Next-Web"><a href="#ChatGPT-Next-Web" class="headerlink" title="ChatGPT-Next-Web"></a>ChatGPT-Next-Web</h2><p><a href="https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web" target="_blank" rel="noopener">ChatGPT-Next-Web</a> 是一款 ChatGPT 前端，可以部署 Vercel，支持 GPT模型，同时也支持 Gemini，使用时可以绑定自己的域名。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/gemini_cover.png&quot; alt=&quot;gemini_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>reMarkable 1 使用汇整</title>
    <link href="http://yoursite.com/remarkable/"/>
    <id>http://yoursite.com/remarkable/</id>
    <published>2023-12-16T00:00:00.000Z</published>
    <updated>2024-01-30T09:09:30.848Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/remarkable_cover.png" alt="remarkable_cover"></p><p>网络时代，看书这件事情依然重要。时移世易，物转星移，新技术、新事物不断出现，人们依旧会遇到相同或相似的问题，先人的观点依然可以给后人带来启发、增广见闻。<br>小弟最近购入了二手 E-Ink 设备一代 <a href="https://remarkable.com/" target="_blank" rel="noopener">reMarkable</a>，这是一款过时的小众产品，但作为一个看书设备是可以的。</p><h2 id="自带应用"><a href="#自带应用" class="headerlink" title="自带应用"></a>自带应用</h2><h3 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h3><p><a href="https://remarkable.com/" target="_blank" rel="noopener">reMarkable</a> 最新型号是 reMarkable 2，小弟手上的是一代。一代外观设计不错，正面是白色，10.3 英寸 E-Ink 屏幕，226 DPI，下方有三颗实体按键，背面是铝制，厚度 6.7mm，重 350 g。因为屏幕有 10.3 英寸，总体感觉是尺寸不小，拿在手里有一点重。<br>机子内部有 1 GHz A9 CPU、512 M 的 RAM 和 8 G 存储，以及 Micro USB 充电头、3000 mAh 电池，大概 2013 年 Android 手机的配置加上 10 寸墨水屏幕。机子性能不高（10 年前的配置），但是系统基于 Linux 且只用来看书，不会太影响体验。比较影响体验的是「古老」的<br>USB 充电头，充电需要确认正反，以及羸弱的 3000 mAh 电池，虽然屏幕耗电量较少，但是实际使用 3000 mAh 电池还是不耐用。</p><h3 id="手写"><a href="#手写" class="headerlink" title="手写"></a>手写</h3><p>机器本身定位是电子纸，把纸张数字化，在屏幕上模拟在纸上写画，因此这个机子的强项是手写。机子有附一支电磁笔，不用充电，可以直接使用。<br>笔的书写体验很赞，不似 Apple Pencil 在 iPad 上滑滑的感觉， reMarkable 的笔尖与屏幕写画时有摩擦力，过程中还会有沙沙声，延时感觉不到，总体接近真实纸张书写的感觉。</p><p>reMarkable 还有一个实用功能是可以将文档实时镜像到电脑客户端。</p><h3 id="阅读"><a href="#阅读" class="headerlink" title="阅读"></a>阅读</h3><p>reMarkable 也有阅读功能，但是体验不优。导入的电子书被转成 PDF 文档，可以对文档标注、写画。<br>除此阅读体验非常一般，默认中文显示为乱码（可通过 SFTP 将中文字体文件上传至路径 <code>/home/root/.local/share/fonts</code>，参考<a href="https://zhuanlan.zhihu.com/p/645101699" target="_blank" rel="noopener">这篇文章</a>），不支持换字体。<br>总体来说，reMarkable 自带应用书写体验高分，机器做工中规中矩，阅读功能不及格。</p><h3 id="同步"><a href="#同步" class="headerlink" title="同步"></a>同步</h3><p>reMarkable 有多种方式可以将文档导入或同步：<br>1、通过官方客户端或网页<br>注册绑定设备后可以直接使用官方客户端或网页 <a href="https://my.remarkable.com" target="_blank" rel="noopener">https://my.remarkable.com</a> 导入或同步文档，需要注意：</p><ul><li>默认只会同步过去 50 天的文档，客户端内只能查看，无法编辑，如果需要同步所有文档、多端编辑需要订阅 Connect 订阅服务（若在 2021 年 10 月 12 日之前购买了 reMarkable，可终身解锁此项订阅服务）</li><li>同步服务在北韩地区无法直接使用<br>2、通过 USB 连接电脑<br>可以直接使用 USB 数据线将文档导入至 reMarkable，参考<a href="https://support.remarkable.com/s/article/Transferring-files-using-a-USB-cable" target="_blank" rel="noopener">这里</a>。<br>3、通过网盘<br>可通过 Google Drive、Dropbox、OneDrive 这类网盘工具导入文档，参考<a href="https://support.remarkable.com/s/article/Integrating-with-Google-Drive-Dropbox-and-OneDrive" target="_blank" rel="noopener">这里</a>。<br>4、通过浏览器插件<br>如果浏览器中看到想深入阅读的文章，可以通过 reMarkable 插件将文章发送至 reMarkable，参考<a href="https://support.remarkable.com/s/article/Read-on-reMarkable-Google-Chrome-Extension" target="_blank" rel="noopener">这里</a>。</li></ul><h2 id="KOReader"><a href="#KOReader" class="headerlink" title="KOReader"></a>KOReader</h2><p>reMarkable 阅读功能很阳春，但是可以安装  <a href="https://koreader.rocks/" target="_blank" rel="noopener">KOReader</a>。KOReader 是一款专为墨水屏幕设备设计的优秀阅读应用，支持多种电子书格式，并且有 PDF 切边、重排等多种使用功能。</p><h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><p>安装 KOReader 推荐通过 <a href="https://toltec-dev.org/" target="_blank" rel="noopener">Toltec</a> （Toltec 是一个 reMarkable 软件库）安装。<br> 1、首先备份 reMarkable 中的文档，之后对 reMarkable 降级（Toltec 仅支持 2.6.1.71 到 2.15.1.1189 之间的系统版本）。降级的思路是电脑模拟升级服务器，通过修改 reMarkable 升级服务器地址，具体步骤参考<a href="https://github.com/ddvk/remarkable-update" target="_blank" rel="noopener">这里</a>。<br>2、执行命令 <code>opkg install koreader</code></p><p>3、执行命令 <code>opkg install remux</code> 安装启动器 remux，这样长按中间的实体按键就可以切换原生应用与 KOReader。</p><h3 id="配置-1"><a href="#配置-1" class="headerlink" title="配置"></a>配置</h3><p>1、配置字体<br>参考 <a href="https://github.com/koreader/koreader/wiki/Fonts" target="_blank" rel="noopener">https://github.com/koreader/koreader/wiki/Fonts</a> </p><p>2、配置词典<br> KOReader 支持 StarDict 字典格式，参考 <a href="https://github.com/koreader/koreader/wiki/Dictionary-support，中英词典下载可在[这里](https://github.com/zdict/dictionaries/tree/master)下载。" target="_blank" rel="noopener">https://github.com/koreader/koreader/wiki/Dictionary-support，中英词典下载可在[这里](https://github.com/zdict/dictionaries/tree/master)下载。</a></p><h3 id="导入书籍"><a href="#导入书籍" class="headerlink" title="导入书籍"></a>导入书籍</h3><p>KOReader 有非常多种方法导入书籍，以下是几个例子：</p><ul><li>直接通过 SFTP 将电子书文档传至 reMarkable</li><li>（推荐）如果有 NAS，可以通过 Webdav 传输，这种方法最简单、最直觉，参考 <a href="https://koreader.rocks/user_guide/#transferring" target="_blank" rel="noopener">https://koreader.rocks/user_guide/#transferring</a></li><li>通过 Calibre 应用，参考 <a href="https://github.com/koreader/koreader/wiki/Calibre-wireless-connection" target="_blank" rel="noopener">https://github.com/koreader/koreader/wiki/Calibre-wireless-connection</a></li><li>如果有部署 <a href="https://github.com/janeczku/calibre-web" target="_blank" rel="noopener">Calibre-Web</a>，可以通过 OPDS 传书 ，参考 <a href="https://github.com/koreader/koreader/wiki/OPDS-support" target="_blank" rel="noopener">https://github.com/koreader/koreader/wiki/OPDS-support</a></li></ul><h2 id="配件相关"><a href="#配件相关" class="headerlink" title="配件相关"></a>配件相关</h2><h3 id="保护套"><a href="#保护套" class="headerlink" title="保护套"></a>保护套</h3><p>墨水屏幕非常脆弱，保护套最好配一个。作为一款小众又过时的电子产品，配件很稀少，小弟最后找到了和 reMarkable 1 尺寸接近的平板 <a href="https://www.vivo.com.cn/vivo/param/vivopadair" target="_blank" rel="noopener">vivo Pad Air（2023）</a>，两者尺寸如下：</p><table><thead><tr><th>设备</th><th>长 mm</th><th>宽 mm</th><th>厚 mm</th></tr></thead><tbody><tr><td>reMarkable 1</td><td>177</td><td>256</td><td>6.7</td></tr><tr><td>vivo Pad Air</td><td>176.00</td><td>259.73</td><td>6.67</td></tr></tbody></table><p>两者尺寸非常接近，卖家众多，价格便宜，甚至充电口也是对的。</p><h2 id="笔芯"><a href="#笔芯" class="headerlink" title="笔芯"></a>笔芯</h2><p>reMarkable 耗材是笔芯，可以选用第三方毛毡笔芯。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/remarkable_cover.png&quot;
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>聚会好帮手——Nintendo Switch 的使用</title>
    <link href="http://yoursite.com/switch/"/>
    <id>http://yoursite.com/switch/</id>
    <published>2023-12-02T00:00:00.000Z</published>
    <updated>2024-01-30T09:15:19.086Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/swittch_cover.png" alt="switch_cover"></p><p>亲友聚会，玩游戏可以快速炒热气氛。所有游戏平台中，派对类游戏数量最多、品质最高的就属 Nintendo Switch 了。</p><h2 id="创新的设计"><a href="#创新的设计" class="headerlink" title="创新的设计"></a>创新的设计</h2><p>Nintendo Switch 初代于于 2017 年发布，在 2024 年新一代即将发布时，创新点仍然不过时。</p><h3 id="桌机、掌机二合一"><a href="#桌机、掌机二合一" class="headerlink" title="桌机、掌机二合一"></a>桌机、掌机二合一</h3><p>Nintendo Switch 一台主机有三种游玩方式：TV模式（游戏画面显示在  电视上游玩）、桌上模式（主机放置在桌上游玩）、掌机模式（手持主机游玩）。</p><h3 id="Joycon"><a href="#Joycon" class="headerlink" title="Joycon"></a>Joycon</h3><p>Joycon 是 Nintendo Switch 创新的控制手柄，集成了<br>NFC、HD震动（可体现细腻的震动）、动作感应器、陀螺仪感应器、动感IR照相机。一般游戏主机都是附一个游戏手柄，而 Joycon 可一人同时使用两支，也可以一人用一支玩双人，不用额外另外购买游戏手柄就可以两人游玩。</p><h2 id="Hack"><a href="#Hack" class="headerlink" title="Hack"></a>Hack</h2><p>对 Nintendo Switch 主机来说，游戏来源有两种：卡带、eShop。卡带是游戏实体化，可以即插即用，不想玩了卡带可以卖二手。eShop 是 Nintendo Switch 在线游戏商店，可以跨区更便宜买游戏。</p><p>如果不想购买 Nintendo Switch 主机，可以在电脑安装模拟器，目前主要有两款 Switch 模拟器：<a href="https://yuzu-emu.org/" target="_blank" rel="noopener">Yuzu</a>、<a href="https://ryujinx.org/" target="_blank" rel="noopener">Ryujinx</a>。模拟器可以搭配 Joycon 或其他游戏手柄游玩。</p><p>除了模拟器，Nintendo Switch 主机也可以 hack。如果是初代 Switch 主机在<a href="https://suchmememanyskill.github.io/guides/switchserials/" target="_blank" rel="noopener">这些序列号之内</a>可以使用注入器「软破」。其他型号的 Switch 主机需要拆机焊接芯片「硬破」。</p><p>Switch 主机 hack 后可以在 SD 卡中安装 <a href="https://github.com/Atmosphere-NX/Atmosphere" target="_blank" rel="noopener">Atmosphere</a> 的固件，通过此固件安装一个与原系统相同的「虚拟相同」，在虚拟系统中安装游戏，即用真实的硬件运行改版的系统。虚拟系统可以方便地安装游戏，在游戏中修改存档、使用金手指（游戏作弊工具）、使用插件。</p><p>模拟器和 hack 的主机不能进行联机玩，只能本地游玩。</p><h2 id="聚会游戏推荐"><a href="#聚会游戏推荐" class="headerlink" title="聚会游戏推荐"></a>聚会游戏推荐</h2><p>Nintendo Switch 可玩游戏非常之多，小弟只玩过寥寥几款，玩过的游戏中，任天堂本家游戏品质非常高，以下是几款适合聚会的游戏：</p><h3 id="Nintendo-Switch-Sports"><a href="#Nintendo-Switch-Sports" class="headerlink" title="Nintendo Switch Sports"></a>Nintendo Switch Sports</h3><p>说到 <a href="https://www.nintendo.com/us/store/products/nintendo-switch-sports-switch/" target="_blank" rel="noopener">Nintendo Switch 运动</a>，不得不说 Wii Sports，Wii Sports 是 Wii 平台（Nintendo Switch 的上上一代主机）最受欢迎的游戏之一，体感游戏的代名词。Nintendo Switch Sports 复刻了 Wii Sports 和 Wii Sports Resort 的很多玩法，画面更加精致。</p><h3 id="超级玛利欧兄弟惊奇"><a href="#超级玛利欧兄弟惊奇" class="headerlink" title="超级玛利欧兄弟惊奇"></a>超级玛利欧兄弟惊奇</h3><p><a href="https://www.nintendo.com/us/store/products/super-mario-bros-wonder-switch/" target="_blank" rel="noopener">超级玛利欧兄弟惊奇</a>是一款由任天堂在 2023 年 10 月发售的横轴过关游戏，有传统「超级玛利欧兄弟」经典玩法相似，但游戏也加入了一些新的元素，可以双人合作游玩，朋友一起合作完成关卡。</p><h3 id="玛利欧赛车-8-豪华版"><a href="#玛利欧赛车-8-豪华版" class="headerlink" title="玛利欧赛车 8 豪华版"></a>玛利欧赛车 8 豪华版</h3><p>玛利欧赛车一直是任天堂各代主机的热门游戏，玩法简单好上手、赛道设计精致、丰富。<a href="https://www.nintendo.com/us/store/products/mario-kart-8-deluxe-switch/" target="_blank" rel="noopener">玛利欧赛车 8 豪华版</a>，是 Wii U （任天堂上一代主机）游戏「玛利欧赛车 8」的加强版。</p><h3 id="玛利欧派对"><a href="#玛利欧派对" class="headerlink" title="玛利欧派对"></a>玛利欧派对</h3><p><a href="https://www.nintendo.com/us/store/products/super-mario-party-switch/" target="_blank" rel="noopener">玛利欧派对</a> 是体感小游戏集合，可以和朋友玩 80 款体感小游戏，游戏都很好上手。</p><h3 id="超级玛利欧-奥德赛"><a href="#超级玛利欧-奥德赛" class="headerlink" title="超级玛利欧 奥德赛"></a>超级玛利欧 奥德赛</h3><p><a href="https://www.nintendo.com/us/store/products/super-mario-odyssey-switch/" target="_blank" rel="noopener">超级玛利欧 奥德赛</a>是一款「3D箱庭探索」游戏，游戏中玛利欧可以将帽子附身在其他角色或敌人身上，操控他们进行冒险。游戏可以双人游玩探索，一人控制玛利欧，另一人控制帽子。</p><h3 id="超级玛利欧3D世界-狂怒世界"><a href="#超级玛利欧3D世界-狂怒世界" class="headerlink" title="超级玛利欧3D世界 + 狂怒世界"></a>超级玛利欧3D世界 + 狂怒世界</h3><p><a href="https://www.nintendo.com/us/store/products/super-mario-3d-world-plus-bowsers-fury-switch/" target="_blank" rel="noopener">超级玛利欧3D世界 + 狂怒世界</a> 是 Wii U 平台「超级玛利欧 3D世界」的移植，以及追加「狂怒世界」模式，可多人本地游玩。</p><h2 id="配件"><a href="#配件" class="headerlink" title="配件"></a>配件</h2><h3 id="Pixl-for-Amiibo"><a href="#Pixl-for-Amiibo" class="headerlink" title="Pixl for Amiibo"></a>Pixl for Amiibo</h3><p>Amiibo 是任天堂销售的游戏周边，呈现为卡片或一个游戏角色的模型，每个 Amiibo 都在模型底座或卡片有嵌入了 NFC 标签，NFC 标签记录了一些数据，玩家购买Amiibo 扫描 NFC 标签可以获得游戏中的道具等。</p><p><strong><a href="https://github.com/solosky/pixl.js" target="_blank" rel="noopener">Pixl for Amiibo</a></strong> 是一个基于原版 <a href="http://www.espruino.com/Pixl.js" target="_blank" rel="noopener">Pixl.js</a>的开源 Amiibo 模拟器，可存储所有 Amiibo 数据，通过旋钮上下选择特定的 Amiibo 使用。</p><h3 id="8BitDo-USB-无线接收器"><a href="#8BitDo-USB-无线接收器" class="headerlink" title="8BitDo USB 无线接收器"></a>8BitDo USB 无线接收器</h3><p>除了可以使用任天堂本家的 Joycon 和 Switch Pro Controller，借助<a href="https://www.8bitdo.com/wireless-usb-adapter/" target="_blank" rel="noopener">八位堂 USB 无线接收器</a> 其他手柄（PS 手柄，Xbox 手柄等）也可以用在 Switch 上。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/swittch_cover.png&quot;
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>使用 Google Colab 玩 AI</title>
    <link href="http://yoursite.com/colab/"/>
    <id>http://yoursite.com/colab/</id>
    <published>2023-09-01T00:00:00.000Z</published>
    <updated>2023-08-29T05:25:36.546Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/colab_cover.png" alt="colab_cover"></p><p>2023 年，AI 热潮延烧，而想要学习和使用 AI，一个基础条件是需要有较好 GPU 的电脑提供算力。其中原因之一是，与 「通才型」处理器 CPU ，理论上能完成任何运算任务不同，GPU 硬件架构中有专门为深度学习中常见执行数值计算任务设计（如矩阵乘法、卷积等）。另外重要的是，GPU 支持大规模并行运算，可以同时处理大量神经元和参数训练任务，加速训练和推断。</p><p>新世纪，电脑可以在本地，也可以在云端。Google Colab（全名为「Colaboratory」）是一个由 Google 提供的云端 Jupyter 笔记本环境，可以在浏览器使用 云端的 GPU，执行 AI 任务。以下以时下最热门的 Whisper 和 Stable Diffusion 为例：</p><h2 id="免费付费"><a href="#免费付费" class="headerlink" title="免费付费"></a>免费付费</h2><p>Google Colab 最初设计是学习、教学演示用，可以免费使用。但由于 Google Colab 使用简单、配置较高，随着 AI 热度持续增加，高峰时期往往需要排队，如果需要较稳定使用 Google Colab，可以考虑购买运算单元。运算单元以量计价，不用的时候不计价（注意，未使用的运算单元会在 90 天后失效）。Colab 运算单元便宜的购买渠道是在土耳其区购买。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/colab1.png" alt="colab1"></p><p>另外，Colab 使用 Google Drive 存储，免费 15 GB，有些 AI 项目如 Stable Diffusion 需要下载模型，15 GB 可能不够，此时可以订阅 Google One 提升存储空间。Google One 便宜的购买渠道是通过 Google Drive 的土耳其区 iOS 内购。 </p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/colab2.png" alt="colab2"></p><h2 id="Whisper"><a href="#Whisper" class="headerlink" title="Whisper"></a>Whisper</h2><h3 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h3><p><a href="https://github.com/openai/whisper" target="_blank" rel="noopener">Whisper</a> 是 <a href="https://openai.com/" target="_blank" rel="noopener">OpenAI</a> 的开源语音转文字模型，支持多语言，准确率很高。在 Colab 中使用非常简单，已经有很大大大写好笔记，下面以 <a href="https://github.com/lewangdev/autotranslate" target="_blank" rel="noopener">autotranslate</a> 这个笔记为例：</p><p>打开 <a href="https://colab.research.google.com/github/lewangdev/autotranslate/blob/main/autotranslate.ipynb" target="_blank" rel="noopener">autotranslate</a>笔记本，按照顺序点击各标题左侧的三角形按钮，运行各个单元，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/colab3.png" alt="colab3"></p><p>当下载好模型后，就可以选择需要转文字的音频文件，可以是 Youtube 链接，也可以是 Google Drive 中的文件。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/colab4.png" alt="colab4"></p><p>填写好音频文件路径后就可以进行转录，可以看到转录后的文字，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/colab5.png" alt="colab5"></p><p>转录完成后可以合成 .SRT 文件储存在 Google Drive 中。再次转录可以再次运行这个笔记本，故可以将这个笔记本储存副本方便使用。</p><h3 id="使用场景"><a href="#使用场景" class="headerlink" title="使用场景"></a>使用场景</h3><p>人接受信息很大一部分来自视觉，字幕虽为无障碍设计，但有文字可以更好、更快地理解音视频内容。以下是几个应用场景：</p><p>1、将会议语音转成逐字稿</p><p>在会议中录音，将会议音频通过 Whisper 转成文字档，再利用  ChatGFT 将录音逐字稿转成规范文章段落及会议内容摘要。</p><p>2、为学习类视频添加字幕</p><p>有些学习类视频缺少字幕，可以通过 Whisper 添加字幕，加快学习进度。</p><h2 id="Stable-Diffusion"><a href="#Stable-Diffusion" class="headerlink" title="Stable Diffusion"></a>Stable Diffusion</h2><p><a href="https://github.com/Stability-AI/stablediffusion" target="_blank" rel="noopener">Stable Diffusion</a> 是开源的文字到图像生成模型，相较于 <a href="https://www.midjourney.com" target="_blank" rel="noopener">Midjourney</a>，Stable Diffusion 可以本地部署，自己训练模型，更灵活调节各种参数，以及无限制生成图片。</p><h3 id="准备-1"><a href="#准备-1" class="headerlink" title="准备"></a>准备</h3><p>Google Colab 是运行 Stable Diffusion 的好方式，由于 Stable Diffusion 太多人使用，目前 Google Colab 只有付费后才可以运行 Stable Diffusion。</p><p>首先打开<a href="https://github.com/camenduru/stable-diffusion-webui-colab/tree/drive" target="_blank" rel="noopener">这个网页</a>，首次运行需要先运行第一个笔记本中的命令，会下载安装各种依赖，期间需要 Google Drive 授权。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/colab6.png" alt="colab6"></p><p>第一个笔记本运行结束后再运行第二个笔记本，第一次运行可能时间会比较长，等到输出单元格中显示链接，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/colab7.png" alt="colab7"></p><p>后打开链接即可看到 Stable Diffusion WebUI。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/colab8.png" alt="colab8"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/colab_cover.png&quot; alt=&quot;colab_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;2023 年，AI 热潮延烧，而想要学习和使用
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>使用 Obsidian 做笔记</title>
    <link href="http://yoursite.com/obsidian/"/>
    <id>http://yoursite.com/obsidian/</id>
    <published>2023-08-16T00:00:00.000Z</published>
    <updated>2023-08-13T01:11:05.846Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_cover.png" alt="obsidian_cover"></p><h2 id="笔记之必要性"><a href="#笔记之必要性" class="headerlink" title="笔记之必要性"></a>笔记之必要性</h2><blockquote><p>大脑不是用来记事情，而是想事情的地方。<br>——《搞定》（Getting Things Done）一书作者大卫．艾伦（David Allen）</p></blockquote><p>诺兰导演电影《<a href="https://www.netflix.com/watch/60020435" target="_blank" rel="noopener">记忆拼图</a>》（Memento）中男主角蓝纳无法有新的记忆，他透过各种笔记、拍立得照片、身体刺青，来让自己持续掌握情报。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_memento.png" alt="obsidian_memento"></p><p>现实生活中，早在文字还没有发明出来前，人类就在洞穴的岩壁上用符号、图案等记录信息。总览历史，很多名人也都以记笔记高手而闻名，其中包括达·芬奇（Leonardo da Vinci）、马克·吐温（Mark Twain）、本杰明·富兰克林（Benjamin Franklin）等等，综合来说，笔记受到如此广泛使用，是因为笔记提供了以下作用：</p><ul><li>收集汇总资讯：笔记可以将资讯收集、汇总至一处，避免资讯分散在各个地方；</li><li>拆解任务：记笔记的过程即是对任务的思考、拆解过程，笔记中的待办是完成任务的一个个行动；</li><li>减轻大脑认知负担：笔记可以比大脑记住更多信息，有了笔记可以有更多脑力花在思考上；</li><li>预演任务的小型实验室：笔记可以看成预演任务的小型实验室，拆解出的行动、步骤可以看成实际执行任务的预演；</li><li>创意发想的基础：创意产生的条件之一是汇总信息，重新组合，产生新的想法。</li></ul><h2 id="记笔记的理论"><a href="#记笔记的理论" class="headerlink" title="记笔记的理论"></a>记笔记的理论</h2><p>《记忆拼图》是艺术作品，当代也有人遇到和男主角类似的问题。Youtuber Tiago Forte 曾经因为药物副作用造成短期失忆问题，通过记笔记，他练成一套名为「第二大脑」的知识管理系统（参见作者书籍 《<a href="https://www.buildingasecondbrain.com/book" target="_blank" rel="noopener">Building a Second Brain</a>》或中文版《<a href="https://www.books.com.tw/products/0010948656" target="_blank" rel="noopener">打造第二大脑：多一个数位大脑，资讯超载时代的高效能知识管理术</a>》）。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_book.png" alt="obsidian_book"></p><p>书中作者有提出两个关键理论，其一为做笔记的 CODE 步骤：</p><ul><li>获取（Capture）：只获取未来有所启发、用得上、有关连性、引发共鸣的资讯</li><li>组织（Organize）：着眼于可操作性，将资讯有序分类，</li><li>萃取（Distill）：做笔记的同时摘要重点、去芜存菁，找出精髓</li><li>表达（Express）：把先前储存的内容重新组合成自己的新作品</li></ul><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_code.png" alt="obsidian_code"></p><p>以及 PARA 分类法，储存的所有资讯可归入四大类别：</p><ul><li>P 专案：职涯或人生中正努力进行的短期任务</li><li>A 领域：想要逐步掌理的长期任务</li><li>R 资源：未来可能有用途的题材或旨趣</li><li>A 档案库：来自其他三大类别的备而不用的事项</li></ul><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_para.png" alt="obsidian_para"></p><h2 id="笔记工具"><a href="#笔记工具" class="headerlink" title="笔记工具"></a>笔记工具</h2><h3 id="曾经的-Evernote"><a href="#曾经的-Evernote" class="headerlink" title="曾经的 Evernote"></a>曾经的 Evernote</h3><p>坊间有很多记笔记的应用，小弟之前用的是 Evernote，通过低价区解锁付费功能。对小弟来说，Evernote 功能很全面，虽然有小缺点，但是总体体验不错。今年 <a href="https://evernote.com/blog/evernote-pricing-upcoming-features-update/" target="_blank" rel="noopener">Evernote 价格调涨</a>后，感觉付费用到的只有多设备同步一个功能，CP 值不高。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_invoice.png" alt="obsidian_invoice"></p><h3 id="不一样的-Obsidian"><a href="#不一样的-Obsidian" class="headerlink" title="不一样的 Obsidian"></a>不一样的 Obsidian</h3><p>各式各样的笔记工具中，一个叫做 <a href="https://obsidian.md/" target="_blank" rel="noopener">Obsidian</a> 的应用出现在小弟的眼帘。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_ui.png" alt="obsidian_ui"></p><p>Obsidian 本身的意思是「黑曜岩」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_dic.png" alt="obsidian_dic"></p><p>不仅名字和其他笔记应用不一样，Obsidian 功能方面和其他笔记应用也不一样：</p><p>1.以 Markdown 文件管理的架构</p><p>不同于其他笔记应用，Obsidian 直接以 Markdown 文件存储笔记，每一则笔记即是一个 Markdown 文件，附带 Markdown 文件关联的图片等附件，比起其他笔记应用，Obsidian 更像 VS Code，因此也可以将 Obsidian 看做是 Markdown 文件的管理工具。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_feature1.png" alt="obsidian_feature1"></p><p>这样的好处是数据掌握在自己手中，最大程度保证隐私，同时 Markdown 是纯文本格式，即便以后 Obsidian 不再维护，还可以用各种编辑器打开笔记。 </p><p>2.原生支持双向链接</p><p>优质笔记的必要条件是笔记间可以建立连结。Obsidian 可以很方便得插入笔记链接，只需要输入 <code>[[</code> 就可以快速插入笔记，也支持双向链接，关联后笔记可以双向跳转。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_feature2.png" alt="obsidian_feature2"></p><p>3.众多插件扩展功能</p><p>Obsidian 是闭源应用，但支持插件扩展，可以通过插件扩展功能，目前已有超过 1000 个插件，功能复盖各个范围。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_feature3.png" alt="obsidian_feature3"></p><p>Obsidian 并非完美，缺点也不少：</p><p>1.无 Web 端</p><p>Obsidian 目前支持电脑端、手机端，但不支持 Web 端。有大大尝试<a href="https://github.com/sytone/obsidian-remote" target="_blank" rel="noopener">将 Obsidian   和 VNC 放在 Docker 运行</a>，体验不优。</p><p>2.功能依赖插件</p><p>Obsidian 的优点之一是有众多插件，这也是缺点之一，插件可以一定程度弥补 Obsidian 功能缺失，但是插件品质良莠不齐，过一段时间不再维护的插件也不乏少数。</p><p>3.介面待打磨</p><p>Obsidian 介面打磨程度不高，尤其手机端，很多是照搬电脑端，没有专门针对移动端适配。</p><p>除此之外，Obsidian 基于本地 Markdown 文件，没有协作功能。</p><h3 id="从-Evernote-迁移笔记"><a href="#从-Evernote-迁移笔记" class="headerlink" title="从 Evernote 迁移笔记"></a>从 Evernote 迁移笔记</h3><p>从 Evernote 迁移笔记到 Obsidian 的简单方法是借助 <a href="https://joplinapp.org/" target="_blank" rel="noopener">Joplin</a> 这个笔记应用，首先在 Evernote 中将笔记导出，导入到 Joplin，再从 Joplin 导出 Markdown 文件。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_inport.png" alt="obsidian_inport"></p><h2 id="Obsidian-功能大补贴"><a href="#Obsidian-功能大补贴" class="headerlink" title="Obsidian 功能大补贴"></a>Obsidian 功能大补贴</h2><p>Obsidian 有非常多的插件，以下插件以实现 Evernote 功能为主：</p><h3 id="同步相关"><a href="#同步相关" class="headerlink" title="同步相关"></a>同步相关</h3><p>Obsidian 有官方同步功能，但需付费。<a href="https://github.com/remotely-save/remotely-save" target="_blank" rel="noopener">Remotely Save</a> 是 Obsidian 的另一个非官方同步插件，可以使用 Amazon S3、Dropbox、OneDrive 或 WebDAV 在不同设备同步（推荐使用 <a href="https://zh.wikipedia.org/wiki/%E5%9F%BA%E4%BA%8EWeb%E7%9A%84%E5%88%86%E5%B8%83%E5%BC%8F%E7%BC%96%E5%86%99%E5%92%8C%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6" target="_blank" rel="noopener">WebDAV</a>）。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_remotely_save.png" alt="obsidian_remotely_save"></p><p>除了使用插件，也可以使用带同步功能的网络存储进行同步，如 iCloud Drive、Synology Drive 等等。</p><h3 id="剪藏相关"><a href="#剪藏相关" class="headerlink" title="剪藏相关"></a>剪藏相关</h3><p>Evernote 有一个很厉害的独家功能是可以将网页内容<a href="https://evernote.com/intl/zh-tw/features/webclipper" target="_blank" rel="noopener">剪藏</a>（Web Clipper）至笔记。对于 Obsidian，理论上只要将网页文章内容转换成 Markdown 格式就可以保存网页，这方面做的好的是一个叫做<a href="http://ksria.com/simpread/" target="_blank" rel="noopener">简悦</a>的浏览器插件，可以较准确地辨识出网页中的文章内容，还可以以 <code>md + assets</code> 的格式保存网页内容至本地。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_simpread.png" alt="obsidian_simpread"></p><h3 id="Tag-相关"><a href="#Tag-相关" class="headerlink" title="Tag 相关"></a>Tag 相关</h3><p>Evernote 中的 Tag 是一个很好用的功能，可以将笔记分离、归纳到具体的专案或用途，同时一条笔记可以归纳到不同 Tag。Obsidian 本身有 Tag 功能，但是非常难用，只能借助插件拓展 Tag 功能。</p><h4 id="1-TagFolder"><a href="#1-TagFolder" class="headerlink" title="1.TagFolder"></a>1.TagFolder</h4><p><a href="https://github.com/vrtmrz/obsidian-tagfolder" target="_blank" rel="noopener">TagFolder</a> 可以实现树状结构展示 Tag。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_tagfolder.png" alt="obsidian_tagfolder"></p><h4 id="2-Tag-Wrangler"><a href="#2-Tag-Wrangler" class="headerlink" title="2.Tag Wrangler"></a>2.Tag Wrangler</h4><p><a href="https://github.com/pjeby/tag-wrangler" target="_blank" rel="noopener">Tag Wrangler</a> 可以该 Obsidian 的 Tag 窗格增加右键菜单，快速执行 Tag 的重命名、删除等操作。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_tag_wrangler.png" alt="obsidian_tag_wrangler"></p><h4 id="3-Templater"><a href="#3-Templater" class="headerlink" title="3.Templater"></a>3.Templater</h4><p>Obsidian 有两种在笔记种加入 Tag 的方法：其一为输入 <code>#</code> 后接标签内容，其二是在通过 YAML 在 Front Matter 中加入标签内容。第一种方法在有些 Markdown 编辑器中会将 <code>#</code> 认为是一级标题，因此比较长治久安的方法是在Front Matter 中加入标签信息。</p><p>为此，小弟安装了 <a href="https://github.com/SilentVoid13/Templater" target="_blank" rel="noopener">Templater</a> 插件，这是一个模版类型的插件，插件本身定义了一种模版语言，可将变量和函数结果插入到笔记中（详见插件<a href="https://silentvoid13.github.io/Templater/" target="_blank" rel="noopener">文档</a>）。小弟定义了两个模版并指定了快捷键，其一是快速加入 Front Matter：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Blog_使用 Obsidian 做笔记</span><br><span class="line">date: 2023-08-10 16:31:29</span><br><span class="line">modify: 2023-08-12 14:33:41</span><br><span class="line">tags: </span><br><span class="line">---</span><br></pre></td></tr></table></figure><p>其二是更新 Front Matter：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">title: Blog_使用 Obsidian 做笔记</span><br><span class="line">date: 2023-08-10 16:31:29</span><br><span class="line">modify: 2023-08-12 14:33:41</span><br></pre></td></tr></table></figure><h4 id="4-Fuzzytag"><a href="#4-Fuzzytag" class="headerlink" title="4.Fuzzytag"></a>4.Fuzzytag</h4><p>如前所述，小弟偏好在 Front Matter 中加入 Tag 信息，这样做的问题是在 Front Matter 输入 <code>#</code> 字符后 Tag 不能自动补全。<a href="https://github.com/adriandersen/obsidian-fuzzytag" target="_blank" rel="noopener">Fuzzytag</a> 是解决这一问题的插件，安装好此插件后，在 Front Matter 区域输入 <code>#</code> 字符后会自动补全 Tag。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_feature_fuzzy_tag.png" alt="obsidian_feature_fuzzy_tag"></p><h3 id="提醒相关"><a href="#提醒相关" class="headerlink" title="提醒相关"></a>提醒相关</h3><p>Evernote 中有一个实用功能，可以设定笔记提醒，当到达提醒时间时会显示系统通知。<a href="https://github.com/uphy/obsidian-reminder" target="_blank" rel="noopener">Reminder</a> 是 Obsidian 的一个提醒插件可以指定时间提醒通知，打开相应笔记。注意移动端（Android/iOS）系统通知不可用，Obsidian 在移动端无通知功能。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_reminder.gif" alt="obsidian_reminder"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/obsidian_cover.png&quot; alt=&quot;obsidian_cover&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;笔记之必要性&quot;&gt;&lt;a
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>ChatGPT 的几个小工具</title>
    <link href="http://yoursite.com/gpt/"/>
    <id>http://yoursite.com/gpt/</id>
    <published>2023-03-20T00:00:00.000Z</published>
    <updated>2023-08-13T01:18:36.382Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/gpt_cover.png" alt="gpt_cover"></p><p>2022 年末，ChatGPT 开放大众使用，不到两个月时间已经有一亿用户，一时之间人人皆讨论。GPT (Generative Pre-trained Transformer) 全称是生成型预训练变换模型，由 <a href="https://openai.com/" target="_blank" rel="noopener">OpenAI</a> 公司开发，可以通过深度学习生成人类理解的自然语言。</p><p>一分耕耘，没有收获，或者百分收获。活在地球的有意思的点之一是难以预料未来的事情。通过数以亿计的文本数据进行训练，标注者进行数据标注、反馈，GPT 超出了之前设计的预期，学习到了人类语言的规律和诀窍，推理和生成人类语言很自然。</p><p>《<a href="https://www.books.com.tw/products/0010938851" target="_blank" rel="noopener">人类大历史</a>》作者曾指出，语言是人类文明的重要基石，我们文明的要素，包括宗教、法律、国家等等，皆建立在语言之上，语言某种程度是人类文明的操作系统。现在机器已经掌握了人类文明操作系统——语言的一些诀窍，未来可能对人类产生重要影响。 </p><p>对个人而言，我们的工作中，很大一部分是「生成」方面的工作，程序员需要输出代码、设计师需要输出视觉图，善用机器相当于增加了一个分身，可以大幅提升生产效率。</p><p>ChatGPT 出现后，基于它的工具雨后春笋般出现，这些工具可以帮我们更好地使用 GPT，以下是小弟试用后留下的几个小工具（不断整理中）：</p><h2 id="ChatGPT-网页版"><a href="#ChatGPT-网页版" class="headerlink" title="ChatGPT 网页版"></a>ChatGPT 网页版</h2><p>ChatGPT 可以直接在浏览器使用<a href="https://chat.openai.com/" target="_blank" rel="noopener">网页版</a>，电脑、手机浏览器都可以使用。免费可以使用 GPT-3.5，付费可以使用 GPT-4。</p><h2 id="New-Bing"><a href="#New-Bing" class="headerlink" title="New Bing"></a>New Bing</h2><p>作为 OpenAI 主要投资方，微软有 GPT 独家授权，自家的 Bing 搜索已经结合 GPT。</p><h3 id="电脑端"><a href="#电脑端" class="headerlink" title="电脑端"></a>电脑端</h3><p>电脑端推荐使用 <a href="https://www.microsoft.com/zh-tw/edge?form=MA13FJ" target="_blank" rel="noopener">Microsoft Edge 浏览器</a>，Edge 浏览器有紧密结合 New Bing：</p><p>1、右上角有 New Bing 的侧边栏按钮，可以输入文字问问题聊天，也可以对当前页面进行总结等等</p><p>2、New Bing 的侧边栏有「创作」功能，可以使用 GPT 技术进行文本生成</p><p>3、当选中文字后文字会自动到侧边栏中，可以一键发送</p><p>4、未来 New Bing 将结合更多 Edge 浏览器功能</p><p>如果不想使用 Edge 浏览器，可以通过以下方法：</p><p>1、修改浏览器 UA（User Agent） 使用 New Bing，Chrome 安装插件实现</p><p>2、使用第三方 Bing 桌面程序 <a href="https://github.com/dice2o/BingGPT" target="_blank" rel="noopener">BingGPT</a></p><h3 id="手机端"><a href="#手机端" class="headerlink" title="手机端"></a>手机端</h3><p>手机端使用 New Bing 方法有二： </p><p>1、使用 Bing App 或手机端 Edge 浏览器</p><p>2、修改手机浏览器 UA（User Agent）</p><h2 id="Poe"><a href="#Poe" class="headerlink" title="Poe"></a>Poe</h2><p><a href="https://poe.com/" target="_blank" rel="noopener">Poe</a> 是 Quora 的 AI 应用，有内置 ChatGPT，免费可以使用 GPT-3.5，付费可以使用 GPT-4。Poe 有网页版和手机端，登录后即可使用</p><h2 id="ChatGPT-Box"><a href="#ChatGPT-Box" class="headerlink" title="ChatGPT Box"></a>ChatGPT Box</h2><p><strong><a href="https://github.com/josStorer/chatGPTBox" target="_blank" rel="noopener">ChatGPT Box</a></strong> 是一个功能非常多的浏览器插件，列一下小弟最喜欢的：</p><p>1、 最全的 API 支持 (网页版 ChatGPT、API、 Azure API、New Bing、Poe等)</p><p>2、在 Google 搜索结果右侧显示 ChatGPT 结果；</p><p>3、在 YouTube 视频右侧显示 ChatGPT 对视频的总结；</p><p>4、右键菜单总结页面</p><h2 id="Bob"><a href="#Bob" class="headerlink" title="Bob"></a>Bob</h2><p>Bob 是一款 macOS 平台的翻译和 OCR 软件，已经支持使用 ChatGPT 翻译。免费版可以使用 <a href="https://github.com/yetone/bob-plugin-openai-translator" target="_blank" rel="noopener">OpenAI Translator Bob Plugin</a>，商店版已经内置。</p><p>Bob 支持使用 PopClip 调用，选中需要翻译的文本之后，点击 <a href="https://pilotmoon.com/popclip" target="_blank" rel="noopener">PopClip</a> 插件图标就可以翻译</p><h2 id="ChatGPT-Next-Web"><a href="#ChatGPT-Next-Web" class="headerlink" title="ChatGPT Next Web"></a>ChatGPT Next Web</h2><p><a href="https://github.com/Yidadaa/ChatGPT-Next-Web" target="_blank" rel="noopener">ChatGPT Next Web</a> 是一个 ChatGPT 前端页面，支持 OpenAI API，可以一键部署在 Vercel，方便不方便使用 ChatGPT 的朋友使用 ChatGPT，也有桌面端。</p><h2 id="EnConvo"><a href="#EnConvo" class="headerlink" title="EnConvo"></a>EnConvo</h2><p><a href="https://www.enconvo.com/" target="_blank" rel="noopener">EnConvo</a> 是一个类似 <a href="https://www.raycast.com" target="_blank" rel="noopener">Raycast</a> 快速启动的 ChatGPT 应用，介面很像 <a href="https://www.notion.so/product/ai" target="_blank" rel="noopener">Notion AI</a>，可以系统全局实用，按下快捷键即可打开对话窗口，之后可以对回复内容复制或插入。</p><h2 id="MenubarX"><a href="#MenubarX" class="headerlink" title="MenubarX"></a>MenubarX</h2><p><a href="https://menubarx.app/" target="_blank" rel="noopener">MenubarX</a> 可以在 macOS 的菜单栏打开浏览器网页，将 <a href="https://chat.openai.com/" target="_blank" rel="noopener">ChatGPT 网页版</a> 地址输入就可以在菜单栏使用 ChatGPT。</p><h2 id="Unite-或-Coherence-X"><a href="#Unite-或-Coherence-X" class="headerlink" title="Unite 或 Coherence X"></a>Unite 或 Coherence X</h2><p><a href="https://www.bzgapps.com/unite" target="_blank" rel="noopener">Unite</a> 和 <a href="https://www.bzgapps.com/coherence" target="_blank" rel="noopener">Coherence X</a> 是 macOS 平台上的两款工具，可以把网站变成原生应用。将 <a href="https://chat.openai.com/" target="_blank" rel="noopener">ChatGPT 网页版</a> 地址输入可以生成 ChatGPT 应用程序。</p><h2 id="ChatGPT-Exporter"><a href="#ChatGPT-Exporter" class="headerlink" title="ChatGPT Exporter"></a>ChatGPT Exporter</h2><p><a href="https://greasyfork.org/zh-TW/scripts/456055-chatgpt-exporter" target="_blank" rel="noopener">ChatGPT Exporter</a> 是一个基于 <a href="https://www.tampermonkey.net" target="_blank" rel="noopener">Tampermonkey</a> 的脚本，可以方便汇出 ChatGPT 聊天纪录，支持纯文本、截图、Markdown、HTML、JSON。</p><h2 id="ChatGPT-语音版"><a href="#ChatGPT-语音版" class="headerlink" title="ChatGPT 语音版"></a>ChatGPT 语音版</h2><p><a href="https://github.com/SheikhAminul/ChatGPT-voice-control" target="_blank" rel="noopener">VoiceWave</a> 是一个浏览器插件，可以实现与 ChatGPT 语音对话，基于 ChatGPT 网页版，通过语音辨识向 ChatGPT 提问，再通过语音合成 ChatGPT 的回答。</p><p>推荐使用 Edge 浏览器使用此插件，Edge 浏览器可以使用微软的 TTS，合成语音更加自然。</p><h2 id="Siri-快捷指令"><a href="#Siri-快捷指令" class="headerlink" title="Siri 快捷指令"></a>Siri 快捷指令</h2><p>有大大写了 Apple Shotcuts，可以在 Siri 中使用 ChatGPT，实现到<a href="https://shivam.sh/2023/siri-gpt" target="_blank" rel="noopener">这里</a>下载捷径，填入 OpenAI API。使用时需要先说出捷径名称运行捷径，之后就可以与 ChatGPT 对话。</p><h2 id="ChatGPT-Telegram-机器人"><a href="#ChatGPT-Telegram-机器人" class="headerlink" title="ChatGPT Telegram 机器人"></a>ChatGPT Telegram 机器人</h2><p>得益于 OpenAI API，可以在任何地方使用 ChatGPT。Telegram 的 UI 做得很漂亮，各端适配优异，是使用 ChatGPT 的好平台。<a href="https://github.com/RainEggplant/chatgpt-telegram-bot" target="_blank" rel="noopener">Chatgpt Telegram Bot</a> 可以连接 Telegram 和 ChatGPT，基于 Node.js，支持 OpenAI API，可以在 Docker 中运行。</p><h2 id="ChatGPT-指令大全"><a href="#ChatGPT-指令大全" class="headerlink" title="ChatGPT 指令大全"></a>ChatGPT 指令大全</h2><p><a href="https://www.explainthis.io/zh-hant/chatgpt" target="_blank" rel="noopener">ChatGPT 指令大全</a> 是一个汇总 ChatGPT 指令的网站，支持中英文。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/gpt_cover.png&quot; alt=&quot;gpt_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;2022 年末，ChatGPT
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>制作超酷的 WiFi 信息卡</title>
    <link href="http://yoursite.com/wifi_card/"/>
    <id>http://yoursite.com/wifi_card/</id>
    <published>2023-03-01T00:00:00.000Z</published>
    <updated>2023-02-07T11:39:25.717Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/wifi_card_cover.png" alt="wifi_card_cover"></p><p>有亲友来家里，一个必要的招待是帮亲友连接 WiFi。分享 WiFi 最简单但使用最不方便的方法是把 WiFi 名称和密码写在纸上或口述，有没有其他家中分享 WiFi 的方式？以下是小弟的一些实践：</p><p>WiFi 分享的一个问题是除了直接输入密码不同设备没有一个通用的密码分享方式，但是有一些设备又有通用的。</p><h2 id="亲友苹果设备分享-WiFi"><a href="#亲友苹果设备分享-WiFi" class="headerlink" title="亲友苹果设备分享 WiFi"></a>亲友苹果设备分享 WiFi</h2><p>苹果有注意到这个问题，所以苹果设备间有内建分享 WiFi 密码的功能。如果亲友和自己都是用的苹果设备，可以直接使用苹果的 WiFi分享功能，参见 <a href="https://support.apple.com/zh-tw/HT209368，这是最快速、简单的分享" target="_blank" rel="noopener">https://support.apple.com/zh-tw/HT209368，这是最快速、简单的分享</a> WiFi 的方式。</p><p>判定亲友的方式三自己已将对方 Apple ID 绑定的手机号或电子邮件地址储存在「联系人」中，当亲友在要连接的装置上选取 Wi-Fi 网路时，自己的装置上会显示一个分享 WiFi 密码的模态，点一下「分享密码」，就可以将密码共享给亲友。</p><p>密码分享给亲友后，若亲友有其他苹果设备，也会同步密码。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/ios_share_wifi.jpeg" alt="ios_share_wifi"></p><h2 id="通用-WiFi-密码分享贴纸"><a href="#通用-WiFi-密码分享贴纸" class="headerlink" title="通用 WiFi 密码分享贴纸"></a>通用 WiFi 密码分享贴纸</h2><p>聪明的人已经注意到 WiFi 分享的问题，也给出了巧妙的解法。</p><p><a href="https://tenonedesign.com/porter.php" target="_blank" rel="noopener">Wifi Porter</a> 是一块带 WiFi 标识的木板，内建 NFC 线圈，有 NFC 功能的手机可以直接贴近木板连接 WiFi，不带 WiFi 功能的手机、电脑可以翻转木板背面查看 WiFi 信息或扫描 QR Code 连接 WiFi。WiFi 信息及 QR Code 可以自己打印，放在木板里。<a href="https://tenonedesign.com/hospitality.php" target="_blank" rel="noopener">Wifi Porter Hospitality Edition</a> 是这个公司的另一个 WiFi 连接辅助产品，把 WiFi 信息和 WiFi 标志都放在了正面。这个产品利用了 NFC 的便捷、QR Code 在手机间的通用、不同设备的兼容性，是个设计很好的产品。</p><p>看到这个产品，小弟也想通过一张 WiFi 信息卡片探索 WiFi 分享方式，首先列出手机、平板、电脑连接 WiFi 最简便的方式（不包括苹果设备间 WiFi 分享功能）</p><table><thead><tr><th>设备</th><th>连接 WiFi 方便形式</th></tr></thead><tbody><tr><td>有 NFC 功能 Android 手机</td><td>碰触含 WiFi 信息的 NFC 贴纸</td></tr><tr><td>无 NFC 功能 Android 手机、Android 平板、XR 之前 iPhone、iPad</td><td>扫描含 WiFi 信息的 QR Code</td></tr><tr><td>XR 后续 iPhone</td><td>碰触 NFC 贴纸，跳转含 WiFi 信息的静态页面，查看 WiFi 名称，复制 WiFi 密码</td></tr><tr><td>Windows 电脑、macOS 电脑、Linux 电脑</td><td>手动输入 WiFi 信息</td></tr></tbody></table><p>根据这些信息，最终贴纸包括以下几个部分：</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/wifi_card_info.png" alt="wifi_card_info"></p><h3 id="A-WiFi-标识区"><a href="#A-WiFi-标识区" class="headerlink" title="A.WiFi 标识区"></a>A.WiFi 标识区</h3><p>WiFi 标识区展示 Wifi 标志，标识此处有 WiFi 信息。</p><h3 id="B-NFC-贴纸区"><a href="#B-NFC-贴纸区" class="headerlink" title="B.NFC 贴纸区"></a>B.NFC 贴纸区</h3><p>Android 与 iPhone 碰触 NFC 后连接 WiFi 方式不同，Android 可直接读取并导入 WiFi 信息，iOS 设备碰触 NFC 后无法读取 WiFi 信息。</p><p>不过 iOS 有折中方式，可以先跳转至一个含 WiFi 信息的静态网页，网页中显示 WiFi 名称密码、「一键复制」按钮，点击「一键复制」按钮后可复制 WiFi 密码，打开 WiFi 设置页面后选择要连接的 WiFi 粘贴密码即可连接。</p><p>需要注意的是，针对 iPhone 的这个静态页面需要确保外网可以访问的到。</p><p>是以 NFC 贴纸需要两个，为 Android 与 iPhone 分别制作。</p><p>Android 手机贴纸： 准备好 NFC 贴纸后，在支持 NFC 的手机（Android、iOS 均可）下载安装 <a href="https://play.google.com/store/apps/details?id=com.wakdev.wdnfc" target="_blank" rel="noopener">NFC Tools</a> （有Android、iOS 版），选择「写信息」→「加一条记录」，找到 WiFi 选项填写 WiFi 信息，之后点击「写入」，将 NFC 贴纸放在摄像头附件等待写入完成，写好之后可以测试是否正常写入及信息是否正确。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/wifi_card_android.png" alt="wifi_card_android"></p><p>iOS 手机贴纸：iOS 需要预先制作好 WiFi 信息静态页，静态页显示 WiFi 信息，下面有一个「复制密码」的按钮，点击「复制密码」按钮后显示操作步骤。制作好静态页后需要将静态页部署至可外网访问的服务器上（也可以是群晖），部署好之后记下静态页访问链接。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/wifi_card_ios_web.png" alt="wifi_card_ios_web"></p><p>在支持 NFC 的手机（Android、iOS 均可）下载安装 <a href="https://apps.apple.com/app/nfc-tools/id1252962749" target="_blank" rel="noopener">NFC Tools</a> （有Android、iOS 版），选择「写信息」→「加一条记录」，找到 URL 网址填写静态页链接，之后点击「写入」，将 NFC 贴纸放在摄像头附件等待写入完成，写好之后可以测试是否正常写入及信息是否正确。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/wifi_card_ios.png" alt="wifi_card_ios"></p><h3 id="C-QR-Code-区"><a href="#C-QR-Code-区" class="headerlink" title="C.QR Code 区"></a>C.QR Code 区</h3><p>用系统相机应用扫描 QR Code 是 Android 与 iOS 通用的连接 WiFi 方式，可以直接在<a href="https://qifi.org/" target="_blank" rel="noopener">这里</a> 生成含有 WiFi 信息的 QR Code。</p><h3 id="D-WiFi-信息区"><a href="#D-WiFi-信息区" class="headerlink" title="D.WiFi 信息区"></a>D.WiFi 信息区</h3><p>WiFi 信息区显示 WiFi 名称与密码明文，方便电脑等设备连接 WiFi。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/wifi_card_cover.png&quot;
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>NASTool 实现媒体自动化</title>
    <link href="http://yoursite.com/nastools/"/>
    <id>http://yoursite.com/nastools/</id>
    <published>2022-12-31T00:00:00.000Z</published>
    <updated>2023-02-07T04:33:12.802Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_cover.png" alt="nastools_cover"></p><p>流媒体当道的时代，通过 <a href="https://zh.wikipedia.org/zh-tw/PT%E4%B8%8B%E8%BC%89" target="_blank" rel="noopener">PT 站点</a>下载影片观看仍有其意义所在。流媒体的好处是方便，网页、客户端打开就能看，画面品质、字幕翻译有保证。但流媒体缺点也存在，流媒体由于版权因素片源较分散，即便订阅了 Netflix、Disney+、HBO Go 等多家流媒体，仍有些影片看不到，或者版权到期影片下架，加之现在各家流媒体重金投入自制剧制作，这个情况更严重。</p><p>PT 站点是流媒体的补充，缺点是操作步骤比流媒体点播多很多，首先要登录 PT 站点搜索资源名称，找到资源下载种子文件，再将种子文件导入下载工具等待下载完成，一段时间打开下载工具确认资源已下载完成。 </p><p><a href="https://github.com/jxxghp/nas-tools" target="_blank" rel="noopener">nas-tools</a> 是一个影视资源的自动化工具，可以直接搜索资源、自动下载、重命名资源，此外还有资源订阅、站点养护、站点功能，打通 PT 站点、下载工具、媒体服务器。</p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>nas-tools 很适合运行在群晖，以下是群晖 Docker 安装 nas-tools 的简要步骤：</p><p>打开群晖 Docker，在「注册表」中搜索「jxxghp」，下载「jxxghp/nas-tools」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_docker1.png" alt="nastools_docker1"></p><p>等待下载完成后在映像中找到「jxxghp/nas-tools」，打开高级设置，在「卷」中添加存放 nas-tools 配置文件的目录，映射为 <code>/config</code>，以及媒体目录，映射为<code>/想设置的容器内能见到的目录</code>，若有多个媒体目录，需要分别映射进来，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_docker1.png" alt="nastools_docker1"></p><p>Docker 版本 nas-tools 默认使用 3000 端口，可以映射为其他端口。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_docker1.png" alt="nastools_docker1"></p><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>等待 nas-tools 启动，在浏览器访问链接 <code>http://群晖地址:自定义端口号</code>，输入默认用户密码：admin/password 登录，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_login.png" alt="nastools_login"></p><h3 id="配置-TMDB"><a href="#配置-TMDB" class="headerlink" title="配置 TMDB"></a>配置 TMDB</h3><p>在 <a href="https://www.themoviedb.org/" target="_blank" rel="noopener">https://www.themoviedb.org/</a> 注册账号，在「账号设定」→「API」中找到 API Key 并复制，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_tmdb1.png" alt="nastools_tmdb1"></p><p>在 nas-tools 中「设置」→「基础设置」中填入 TMDB API Key 并保存。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_tmdb2.png" alt="nastools_tmdb2"></p><h3 id="配置媒体目录"><a href="#配置媒体目录" class="headerlink" title="配置媒体目录"></a>配置媒体目录</h3><p>文件转移模式支持六种模式：复制、硬链接、软链接、移动、RCLONE、MINIO。</p><ol><li><p>复制模式下载做种和媒体库是两份，多占用存储，好处是媒体库的盘不用 24 小时运行可以休眠；</p></li><li><p>硬链接模式不用额外增加存储空间，一份文件两份目录，但需要下载目录和媒体库目录在一个磁盘分区或者存储空间；</p><p>软链接模式就是快捷方式，需要容器内路径与真实路径一致才能正常使用；</p></li><li><p>移动模式会移动和删除原文件及目录；</p></li><li><p>RCLONE 模式 针对 RCLONE 网盘使用场景，MINIO 针对 S3/云原生场景。</p></li></ol><p>根据自己实际情况在 nas-tools 中「设置」→「基础设置」→「默认文件转移方式」选择相应的模式并保存。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_file_type.png" alt="nastools_file_type"></p><p>在「设置」→「基础设置」中将媒体库文件夹添加至相应类别。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_media_file.png" alt="nastools_media_file"></p><h3 id="配置索引器"><a href="#配置索引器" class="headerlink" title="配置索引器"></a>配置索引器</h3><p>首先需要添加 PT 或 BT 站点，在「站点管理」→「站点维护」中，选择「新增站点」，填入站点链接地址、cookie 等信息（cookie 可通过浏览器 F12 开发者工具获取）。如果有多个站点，可逐个添加。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_index1.png" alt="nastools_index1"></p><p>添加好站点后，在「设置」→「索引器」中选中内建索引器，选择需要索引的站点。、</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_index2.png" alt="nastools_index2"></p><h3 id="配置下载器"><a href="#配置下载器" class="headerlink" title="配置下载器"></a>配置下载器</h3><p>nas-tools 支持 qBittorrent、Transmission 等下载工具，在「设置」→「下载器」中选择自己使用的下载工具，填入地址、用户名、密码，添加好可测试是否联通。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_download.png" alt="nastools_download"></p><h3 id="配置媒体服务器"><a href="#配置媒体服务器" class="headerlink" title="配置媒体服务器"></a>配置媒体服务器</h3><p>nas-tools 支持 Emby、Jellyfin、Plex，设置媒体服务器后可以对本地资源进行判重避免重复下载、标识本地已存在的资源、重命名文件帮助搜刮。在「设置」→「媒体服务器」中选择自己使用的媒体服务器并填入相应信息。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_media_server.png" alt="nastools_media_server"></p><h2 id="配置字幕"><a href="#配置字幕" class="headerlink" title="配置字幕"></a>配置字幕</h2><p>nas-tools 支持 OpenSubtitles 和 ChineseSubFinder， OpenSubtitles 无需配置即可使用，ChineseSubFinder 需要自行搭建，可根据实际选择。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_media_subtitle.png" alt="nastools_media_subtitle"></p><h3 id="配置-Telegram-通知"><a href="#配置-Telegram-通知" class="headerlink" title="配置 Telegram 通知"></a>配置 Telegram 通知</h3><p>nas-tools 支持 Telegram、Slack 等近十种渠道图文消息通知，最简单的是 Telegram，在 Telegram 创建好机器人后，在 nas-tools 「设置」→「消息通知」中选择「新增消息通知」，之后选择 Telegram 并填入机器人 Token 及用户 ID。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_notify.png" alt="nastools_notify"></p><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p>可利用公网 IP 和 DDNS 配置外网访问 nas-tools，在搜索框中输入想看的影片，在各站点搜索后显示搜索结果，选择相应的种子选择下载，即可将种子文件推送至下载器，待下载完成，媒体服务器会对下载的文件搜刮、解码，便于在各设备上观看。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_example.png" alt="nastools_example"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nastools_cover.png&quot; alt=&quot;nastools_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;流媒体当道的时代，通过 &lt;a
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>Fire Tablet 100 种另类用法</title>
    <link href="http://yoursite.com/fire_tablet/"/>
    <id>http://yoursite.com/fire_tablet/</id>
    <published>2022-12-12T00:00:00.000Z</published>
    <updated>2023-02-07T05:22:21.544Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/fire_tablet_cover.png" alt="fire_tablet_cover"></p><p>前年黑色星期五小弟在美国亚马逊买了 Fire HD 8 Plus，经过了半个地球，从美国转运至新加坡，再由新加坡运到中国，终于这个平板到了小弟手里。平板从中国生产，运到美国贩售，最后由中国人购买，回到中国。想想有些不可思议，从美国购买需要付半个地球的运费和关税，最后价格还是比直接在中国买划算。</p><p>平板配置不高，但是有触控屏幕、麦克风、扬声器、麦克风，支持无线充电，运行 Android 系统，有了这些，可以做的事情就很多了，以下是小弟的一些实践：</p><h2 id="作为-Echo-Show"><a href="#作为-Echo-Show" class="headerlink" title="作为 Echo Show"></a>作为 Echo Show</h2><p>Fire Tablet 支持 Hands-Free 使用 Alexa，只要说出唤醒词「Alexa」或「Amazon」就可以执行 Alexa 命令，包括问天气、定时、视频电话、控制设备等等。除此之外，Fire HD 8 和 Fire HD 10 还支持 Show Mode，可以把 Fire Tablet 当成 Echo Show，入口有以下几个：</p><ul><li><p>直接说出「Alexa，switch to Show Mode」；</p></li><li><p>在顶部往下滑在下拉菜单中将 Show Mode 的开关打开；</p></li><li><p>设置中无线充电时切换至 Show Mode，当无线充电时，就可以自动切换至 Show Mode，断开无线充电自动关闭 Show Mode。</p></li></ul><p>Fire Tablet 的 Show Mode 可以实现 Echo Show 的大部分功能，但还是有些功能实现不了：</p><ul><li><p>唤醒词只能用 Alexa 或 Amazon；</p></li><li><p>无法用语音命令使用 Spotify 播放音乐，只能打开 Spotify 应用。</p></li></ul><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/fire_tablet_show_mode.png" alt="fire_tablet_show_mode"></p><h2 id="Alexa-设备-Dashboard"><a href="#Alexa-设备-Dashboard" class="headerlink" title="Alexa 设备 Dashboard"></a>Alexa 设备 Dashboard</h2><p>FireOS 有内置 Alexa 设备的 Dashboard，屏幕底部比其他 Android 平板多了一个设备仪表板的虚拟按键，可在任何介面点击位设备仪表板按钮进入设备仪表板。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/fire_tablet_dashboard.png" alt="fire_tablet_dashboard"></p><h2 id="智能家居-Dashboard"><a href="#智能家居-Dashboard" class="headerlink" title="智能家居 Dashboard"></a>智能家居 Dashboard</h2><p>Fire Tablet 另一个很实用的功能是作为 Home Assistant Dashboard，推荐使用 <a href="https://www.fully-kiosk.com/" target="_blank" rel="noopener">Kiosk Browser</a>，可以实现一个屏幕控制所有设备。</p><p>除此之外，还可以安装 <a href="https://github.com/thomasloven/hass-browser_mod" target="_blank" rel="noopener">browser_mod</a> 组件实现自动化，比如：</p><ul><li><p>当有人按门铃时，平板电脑显示前门摄像头视频流；</p></li><li><p>整点、半点报时；</p></li><li><p>洗衣机完成洗衣播放音乐或 TTS 通知；</p></li><li><p>到睡觉时间在小孩房间的平板显示弹窗通知。</p></li></ul><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/fire_tablet_kiosk.jpeg" alt="fire_tablet_kiosk"></p><h2 id="魔镜"><a href="#魔镜" class="headerlink" title="魔镜"></a>魔镜</h2><p><a href="https://magicmirror.builders/" target="_blank" rel="noopener">MagicMirror²</a> 是树莓派的一个超酷的模块化智能镜子平台，可以把走廊或浴室镜子转换为个人助理，通过各种模块化组件显示各类信息。Magic Mirror 一个缺点是适配树莓派显示器价格都不是很便宜，自己用旧显示器改装也较麻烦。</p><p>魔镜一个较核心的组件是一个叫做半透镜的镜子，这种镜子可透过一半光，反射另一半光，利用 Fire Tablet 、半透镜和 Home Assistant，可以快速制作一个 Magic Mirror，制作方法很简单：</p><p>1.在 Home Assistant 选择要显示的组件，选择 Dark Mode，即黑底白字模式</p><p>2.将单向镜粘在 Fire Tablet 上</p><p>3.将 Fire Tablet 插入电源保证供电</p><p>一个简单的 Magic Mirror 就做好了，这个魔镜支持显示各类信息，不支持触屏，但是支持 Alexa 语音助手。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/fire_tablet_mirror.jpeg" alt="fire_tablet_mirror"></p><h2 id="作为-CarPlay-Android-Auto-使用"><a href="#作为-CarPlay-Android-Auto-使用" class="headerlink" title="作为 CarPlay/Android Auto 使用"></a>作为 CarPlay/Android Auto 使用</h2><p>驾驶自家车时，一个较频繁使用的是车载系统，车载系统可以提供音乐播放、导航、通话、新闻、一键控制等等。Apple CarPlay 和 Android Auto 是苹果和 Google 为汽车设计的内容延伸功能，可以通过最日常最常用的电子设备——手机连接到车载系统，无缝造访联络人、简讯、音乐和地图导航。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/fire_tablet_carplay_demo.png" alt="fire_tablet_carplay_demo"></p><p>有些买的早的车可能没有支援 CarPlay，可以买一个 CarPlay 转换盒、Type-C to USB OTG 转接头，将 CarPlay 转换盒与 Fire Tablet 连接， Fire Tablet 上安装 CarPlay 转换盒的特定应用即可激活 Apple CarPlay 或 Android Auto。图片来自<a href="https://youtu.be/yqSm5vlLCfo" target="_blank" rel="noopener">这里</a>。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/fire_tablet_carplay.png" alt="fire_tablet_carplay"></p><p>Fire Tablet 屏幕有 8 寸、10 寸，支援触控，可以作为很好的 CarPlay/Android Auto 车载系统，另外还支援无线充电，不占用 Type-C 口。</p><h2 id="简易版-Stream-Deck"><a href="#简易版-Stream-Deck" class="headerlink" title="简易版 Stream Deck"></a>简易版 Stream Deck</h2><p>Stream Deck 是 <a href="https://www.elgato.com/" target="_blank" rel="noopener">Elgato</a> 推出的视频直播操作、宏命令控制台，搭配 LCD 实体按钮，可以自定义图标及按钮功能，同时保持实体按键的触控感。同时 Stream Deck 可自定义程度很高，支援的应用也很多，包括 OBS、Twitch、Twitter、、YouTube 等等，可以设置一个按键执行一系列命令，如一键切换场景，开启直播和控制音量。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/fire_tablet_stream_deck_demo.jpeg" alt="fire_tablet_stream_deck_demo"></p><p>Stream Deck 设计很赞，但价格不便宜，借助宏命令应用 Fire Tablet 也可以变成一个简易版 Stream Deck。这类应用需要在电脑和 Fire Tablet 安装相关应用，Fire Tablet 可以自定义 Dashboard 命令按钮，配置好后通过平板上的 Dashboard 命令按钮就可以控制电脑，包括 <a href="https://www.touch-portal.com/" target="_blank" rel="noopener">Touch Portal</a>（有收费功能）、<a href="https://macrodeck.org/download" target="_blank" rel="noopener">Macro Deck</a>（免费，仅支持 Windows 系统）、<a href="https://www.elgato.com/en/stream-deck-mobile" target="_blank" rel="noopener">Stream Deck Mobile</a>（Stream Deck 官方宏命令应用，订阅制）。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/fire_tablet_panel.png" alt="fire_tablet_panel"></p><h2 id="为局域网设备提供代理"><a href="#为局域网设备提供代理" class="headerlink" title="为局域网设备提供代理"></a>为局域网设备提供代理</h2><p>如果在熊猫国看流媒体，一个重要的步骤是开网络代理，有些设备没办法装代理应用（如 Apple TV）或者 CPU 算力无法支持代理设备的加密解密运算（如低配 Android TV），除了配置软路由之外，一个简单的办法是通过 Fire Tablet 为局域网设备提供代理。</p><p>这里主要利用的是 <a href="https://play.google.com/store/apps/details?id=com.github.kr328.clash" target="_blank" rel="noopener">Clash for Android</a> 的允许局域网连接功能，之后在需要代理的设备上将代理网关设置为 Fire Tablet 的 IP 地址即可。</p><h2 id="媒体选择器"><a href="#媒体选择器" class="headerlink" title="媒体选择器"></a>媒体选择器</h2><p>Fire Tablet 可以安装各类流媒体应用，包括 Netflix、Disney+、HBO Go 等等，虽然 8 寸的分辨率只有 1280 x 800 分辨率（即 189 ppi），但海外流媒体码率都较高，观看起来较清晰。除此之前，得益于 Chromecast 的投屏功能，Fire Tablet 可以作为一个很好的媒体选择器，Fire Tablet 查看媒体信息，之后点击投屏即可在电视观看，期间 Fire Tablet 可以作为一个遥控器控制电视。手机也可以做媒体选择器，Fire Tablet 的好处在于可以作为公共设备放在电视旁边，可以随时拿起使用。</p><h2 id="作为摄像头"><a href="#作为摄像头" class="headerlink" title="作为摄像头"></a>作为摄像头</h2><p>使用 <a href="https://play.google.com/store/apps/details?id=com.pas.webcam" target="_blank" rel="noopener">IP Webcam</a> 可以把 Fire Tablet 变成一个可以使用多种查看方式查看的网络摄像头用作视频监控。这个应用支持动作检测、声音检测，可以在动作或声音监测触发后云推送通知、动作触发后云录制。</p><p>如果有群晖，也可以直接使用群晖官方的 <a href="https://play.google.com/store/apps/details?id=com.synology.DScam" target="_blank" rel="noopener">DS cam</a> 将 Fire Tablet作为一个监控摄像头。</p><h2 id="把-3D-打印机变无线"><a href="#把-3D-打印机变无线" class="headerlink" title="把 3D 打印机变无线"></a>把 3D 打印机变无线</h2><p><a href="https://octoprint.org/" target="_blank" rel="noopener">OctoPrint</a> 是一个 3D 打印机的 Web 界面，可以实现在浏览器中控制和监控 3D 打印机和打印作业，安装各类插件系统扩展功能，方便地创建延时摄影，直接切片 STL 文件等等。</p><p>OctoPrint 运行在 Linux 系统上，Android 系统内核也是 Linux，理论上可以运行 Linux 应用。有大大做了 <a href="https://github.com/feelfreelinux/octo4a" target="_blank" rel="noopener">octo4a</a>，可以方便地在 Android 设备上安装 OctoPrint。</p><p>首先下载 <a href="https://github.com/feelfreelinux/octo4a/releases/" target="_blank" rel="noopener">Octo4a 应用</a>，安装应用中的步骤，几分钟就可以将 Octoprint 安装到Android 设备上。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/fire_tablet_octo4a_demo.png" alt="fire_tablet_octo4a_demo"></p><p>装好 OctoPrint 后通过 USB OTG 将 Fire Tablet 与 3D 打印机连接，之后在 OctoPrint 的 Web 介面操作即可。</p><p>值得注意的是，Fire Tablet 有无线充电，不会占用宝贵的 Type-C 口，也就不用转接线拓展。</p><h2 id="作为-3D-打印机面板"><a href="#作为-3D-打印机面板" class="headerlink" title="作为 3D 打印机面板"></a>作为 3D 打印机面板</h2><p>Octo4a 应用可以让 Android 手机安装 [Octoprint]，但在手机上的查看打印机状态没有适配。<a href="https://unchartedbull.github.io/OctoDash/index.html" target="_blank" rel="noopener">OctoDash</a> 是用于 OctoPrint 的开源仪表板，针对触摸屏设备进行了优化，整体UI 很美观。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/fire_tablet_octodash_demo.png" alt="fire_tablet_octodash_demo"></p><p>有大大实现了<a href="https://xiaoxx.cc/use-octodash-on-your-android-phone/" target="_blank" rel="noopener">在 Android 上运行 Octodash</a>，可以直接利用触屏屏幕查看信息和控制打印机。图片来自作者文章。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/fire_tablet_octodash.jpeg" alt="fire_tablet_octodash"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/fire_tablet_cover.png&quot;
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>SONOFF Zigbee 网关的使用</title>
    <link href="http://yoursite.com/zigbee_hub/"/>
    <id>http://yoursite.com/zigbee_hub/</id>
    <published>2022-12-04T00:00:00.000Z</published>
    <updated>2023-02-07T04:38:33.776Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/zigbee_hub_cover.png" alt="zigbee_hub_cover"></p><p>早些时候小弟买了 <a href="https://sonoff.tech/product/gateway-and-sensors/sonoff-zigbee-3-0-usb-dongle-plus-p/" target="_blank" rel="noopener">SONOFF 的 Zigbee USB 网关</a>，记录下使用过程。</p><h2 id="两种网关"><a href="#两种网关" class="headerlink" title="两种网关"></a>两种网关</h2><p>目前 SONOFF 的 Zigbee USB 网关有两款：ZBDongle-P、ZBDongle-E，两款信号和做工都很好，ZBDongle-P 是 CC2652P 芯片，ZBDongle-E 的 EFR32MG21 是更新的芯片。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/zigbee_hub_compare.jpeg" alt="zigbee_hub_compare"></p><p>两款外壳都是金属外壳，做工很有质感，头部是 USB 口，尾部可旋上天线。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/zigbee_hub_accessories.jpeg" alt="zigbee_hub_accessories"></p><p>小弟买的时间较早，买的是 CC2652P 的版本，以下示例 CC2652P 版本的使用。</p><h2 id="注意"><a href="#注意" class="headerlink" title="注意"></a>注意</h2><p>如果在树莓派运行 Home Assistant，可以直接将 Dongle 插入树莓派 USB 口，若是群晖虚拟机运行 Home Assistant 需要添加在设定中将 USB 设备添加至虚拟机中（路径为选中 Home Assistant 虚拟机→「动作」→「编辑」→「其他」）</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/zigbee_hub_vmm.png" alt="zigbee_hub_vmm"></p><h3 id="重要提示-1"><a href="#重要提示-1" class="headerlink" title="重要提示 1"></a>重要提示 1</h3><p>USB 3.0 端口（内部带有蓝色的端口）会对任何 2.4Ghz 无线设备造成明显的、噪音和无线电干扰，包括 Zigbee。如果不使用 USB 延长线，可能无法工作，包括配对问题、设备丢失、无法访问设备、超时等，因此强烈建议使用 USB 延长线连接网关与群晖。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/zigbee_hub_usb_cable.jpeg" alt="zigbee_hub_usb_cable"></p><h3 id="重要提示-2"><a href="#重要提示-2" class="headerlink" title="重要提示 2"></a>重要提示 2</h3><p>ZigBee 和 Wi-Fi 信道都存在于 2.4 GHz 频段、相同的频率空间。同一环境同时部署 Wi-Fi 和 ZigBee，必须仔细规划确保不会相互干扰，其中信道规划很关键。</p><p>要选择不与 WiFi 重叠的 Zigbee 通道，Zigbee 可以尝试通道 15、20 或 25，这些 Zig bee 通道避开最常见的 WiFi 通道（1、6、11），或者选择 WiFi 通道避开  Zigbee 通道，参考<a href="https://www.control4.com/docs/product/zigbee/best-practices/english/latest/zigbee-best-practices-rev-d.pdf" target="_blank" rel="noopener">这里</a>与<a href="https://www.metageek.com/training/resources/zigbee-wifi-coexistence/" target="_blank" rel="noopener">这里</a>。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/zigbee_hub_channel.png" alt="zigbee_hub_channel"></p><h2 id="通过-ZHA-使用"><a href="#通过-ZHA-使用" class="headerlink" title="通过 ZHA 使用"></a>通过 ZHA 使用</h2><p>连接好之后 Home Assisrant 可以自动发现设备，之后按照屏幕的操作即可。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/zigbee_hub_ha_discovery.webp" alt="zigbee_hub_ha_discovery"></p><h2 id="通过-Zigbee2MQTT-使用"><a href="#通过-Zigbee2MQTT-使用" class="headerlink" title="通过 Zigbee2MQTT 使用"></a>通过 Zigbee2MQTT 使用</h2><p>在 Home Assistant 中使用 Zigbee 设备的另一种方法是使用 Zigbee2MQTT</p><p>使用 Zigbee2MQTT 一个较复杂的步骤是刷固件，推荐在 Windows 系统下进行，以下是步骤：</p><h3 id="下载固件"><a href="#下载固件" class="headerlink" title="下载固件"></a>下载固件</h3><p>到<a href="https://www.home-assistant.io/integrations/zha" target="_blank" rel="noopener">这里</a>下载协调器固件，下载完成后解压缩。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/zigbee_hub_download_firmware.jpg" alt="zigbee_hub_download_firmware"></p><h3 id="安装驱动"><a href="#安装驱动" class="headerlink" title="安装驱动"></a>安装驱动</h3><p>安装 <a href="https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads" target="_blank" rel="noopener">CP210x USB to UART Bridge VCP Drivers</a> 驱动。</p><h3 id="安装刷固件工具"><a href="#安装刷固件工具" class="headerlink" title="安装刷固件工具"></a>安装刷固件工具</h3><p>到<a href="https://www.ti.com/tool/FLASH-PROGRAMMER" target="_blank" rel="noopener">这里</a>下载刷固件工具并安装。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/zigbee_hub_download_tool.png" alt="zigbee_hub_download_tool"></p><h3 id="拆机"><a href="#拆机" class="headerlink" title="拆机"></a>拆机</h3><p>用十字螺丝刀拧下金属外壳的两颗螺丝，拆出电路板。</p><h3 id="开始刷机"><a href="#开始刷机" class="headerlink" title="开始刷机"></a>开始刷机</h3><p>打开安装好的 SmartRF Flash Programmer，左上角确保选中「none」，左下角选择「CC2652P」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/zigbee_hub_flash1.jpeg" alt="zigbee_hub_flash1"></p><p>Flash Image(S) 选择固件路径，Actions 勾选「Erase」「Program」。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/zigbee_hub_flash2.jpg" alt="zigbee_hub_flash2"></p><p>将网关连接好 USB 延长线，按住「boot」按钮并保持，在将 USB 延长线连接电脑（也可以直接按住「boot」按钮并保持连接电脑）。</p><p>点击三角形的「烧录」按钮，待绿色进度条走完，全程需按住 「boot」按钮。若显示红色，可重复步骤重试。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/zigbee_hub_cover.png&quot; alt=&quot;zigbee_hub_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;早些时候小弟买了 &lt;a
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>Nest Hub 的使用</title>
    <link href="http://yoursite.com/nest_hub/"/>
    <id>http://yoursite.com/nest_hub/</id>
    <published>2022-11-26T00:00:00.000Z</published>
    <updated>2023-02-07T04:34:17.392Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nest_hub_cover.png" alt="nest_hub_cover"></p><p>早些时候，小弟从沃尔玛买了 <a href="https://store.google.com/product/nest_hub_2nd_gen" target="_blank" rel="noopener">Nest Hub 2</a>，经过一个多月的路程终于收到。小弟之前就有用过 Google Home Mini，经过一段时间的使用，感觉这个产品有很多设计很好的功能，非非仅仅加了屏幕。</p><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>Nest Hub 2 有配备 7 寸触控屏幕 (1024 x 600px，169.5ppi)、1.7 寸喇叭、3 个远扬麦克风，此外有内建带 Motion Sense 功能的 Soli 感应器、环境光度等化感应器、温度感应器，重量有 558 克，支持 2.4 GHz 与 5 GHz 的 Wi-Fi、蓝牙 5.0，未来支持 Matter 协议。</p><h2 id="睡眠感应"><a href="#睡眠感应" class="headerlink" title="睡眠感应"></a>睡眠感应</h2><p>Nest Hub 2 一个很厉害的功能是<a href="https://store.google.com/tw/product/nest_hub_sleep_sensing" target="_blank" rel="noopener">睡眠感应功能</a>。说到功能不得不提带 Motion Sense 功能的 <a href="https://atap.google.com/soli/" target="_blank" rel="noopener">Soli 感应器</a>， Soli 是一个微型雷达，可以感应、理解各种人体的运动，从心跳到身体的运动，最早用在 Pixel 4 手机上，可以让 Pixel 4 无需触摸手机跳过歌曲、暂停闹钟、静音来电等等。而现在 Google 进一步通过配套的软件发挥这个雷达的潜力。除了 Soli 雷达，Nest Hub 2 还使用麦克风感应声音、光传感器感应光线、温度感应器感应温度、超声波传感器感应距离，综合收集睡眠数据。</p><p>具体使用是睡前将 Nest Hub 2 面对自己，无须其他操作，待第二天早上就可以看到睡眠数据。睡眠感应功能会协助分析瞭解影响睡眠品质的可能原因，通过这侦测你的呼吸速率，睡眠期间受到的干扰，例如咳嗽和打鼾声，以及房间中的光线和温度变化。睡眠感应仅支持分析一个人的睡眠状况，目前此服务可以免费使用，将来会收费。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nest_hub_sleep.webp" alt="nest_hub_sleep"></p><h2 id="智能家居"><a href="#智能家居" class="headerlink" title="智能家居"></a>智能家居</h2><p>Nest Hub 2 另一个实用功能是可以控制智能家居设备，有了屏幕有些操作可以更简单，还可以一次查看多个设备的状态。通过语音控制设备存在一些问题：口音辨识不准确，命令的发现等等，触控屏幕是语音控制一个很好的补充。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nest_hub_smart_home.webp" alt="nest_hub_smart_home"></p><p>除此之外，如果有使用 Home Assistant，还可以使用 <a href="https://cast.home-assistant.io/faq.html" target="_blank" rel="noopener">Home Assistant Cast</a> 将 Home Assistant 设备数据投屏至 Nest Hub 上，支持触屏操作。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nest_hub_cast.png" alt="nest_hub_cast"></p><h2 id="语音助手"><a href="#语音助手" class="headerlink" title="语音助手"></a>语音助手</h2><p>Nest Hub 2 内置 Google Assistant，是忙碌家庭的好帮手，可以查看日曆，设定提醒或计时器和闹钟、待办事项、取得天气资讯、通过广播讯息告诉大家晚餐准备好了等等。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nest_hub_voice.webp" alt="nest_hub_voice"></p><p>比较贴心的是，通过传感器的协作，Nest Hub 2 对很多细节了设计。当靠近萤幕时，装置画面会自动亮起显示内容。当关灯后屏幕也会自动变暗显示。当在房间的另一头离屏幕很远时，萤幕会放大烹饪计时器显示的时间，方便查看。使用快捷手势操作可以延后闹钟、停止计时器。</p><h2 id="欣赏影音"><a href="#欣赏影音" class="headerlink" title="欣赏影音"></a>欣赏影音</h2><p>Nest Hub 2 有内置 Youtube、Netflix、Disney+、Spotify 等流媒体应用，可以直接在屏幕点选观看。另外也有内置 Chromecast 功能，可以通过手机将流媒体内容投至 Nest Hub 2 播放。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nest_hub_media.png" alt="nest_hub_media"></p><p>Nest Hub 2 播放流媒体的好处是播放音质会好很多，可以手势播放或暂停歌曲，以及语音控制。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nest_hub_cover.png&quot; alt=&quot;nest_hub_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;早些时候，小弟从沃尔玛买了 &lt;a
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>人生苦短，我用 NAS——NAS 用法介绍</title>
    <link href="http://yoursite.com/nas/"/>
    <id>http://yoursite.com/nas/</id>
    <published>2022-11-20T00:00:00.000Z</published>
    <updated>2023-02-07T11:41:50.117Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_cover.png" alt="nas_cover"></p><p>2022 年，人类进入 21 世纪已经快 1/4，20 年前还在用传统的调制解调器上网，现在可以在线观看 4K 影片。技术的进步也带来问题的增多，我们的各种数据集中在几个大公司手里，照片、影片、应用、其他文件占的存储空间越来越大。</p><p>难以想象，1998、1999 年还在讨论因为节约内存和存储空间的「<a href="https://zh.m.wikipedia.org/zh-tw/2000%E5%B9%B4%E9%97%AE%E9%A2%98" target="_blank" rel="noopener">千年虫问题</a>」，2022 年有 1T 存储容量的手机，手机存储容量比之前都要大，却比以往更容易容量不足。</p><p>新世纪解决村存储空间不足的一个方法是使用 NAS （Network Attached Storage 网路附加储存），NAS 是一台电脑，可以集中储存照片、影片、音乐、文件等。由于本身是一台电脑，所以 NAS 的功能不限于存储，还有很多其他功能。</p><p>NAS 有很多品牌，群晖、威联通、华芸等等，其中市占率较高的是群晖，以下以群晖为例说明：</p><h2 id="跨平台共享存储文件"><a href="#跨平台共享存储文件" class="headerlink" title="跨平台共享存储文件"></a>跨平台共享存储文件</h2><p>NAS 默认有装好 NFS、SMB、FTP、WebDAV 等文件共享服务，可以很方便地在局域网及外网跨平台、跨设备大容量共享存储文件。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_share_file.png" alt="nas_share_file"></p><h2 id="多设备同步文件"><a href="#多设备同步文件" class="headerlink" title="多设备同步文件"></a>多设备同步文件</h2><p>NAS 设备多提供可以自动同步的应用，如群晖的 <a href="https://www.synology.com/zh-tw/dsm/feature/drive" target="_blank" rel="noopener">Synology Drive</a> 在需要同步的设备装好应用或在浏览器打开应用页面后，就可以将文件同步至最新，同时还有随需同步、协作、版本回溯等功能。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_drive.png" alt="nas_drive"></p><h2 id="备份手机照片、影片"><a href="#备份手机照片、影片" class="headerlink" title="备份手机照片、影片"></a>备份手机照片、影片</h2><p>手机存储一部分是照片、影片占用，NAS 设备都有提供辈分手机照片、影片的功能，可以安全备份手机照片、影片，释放手机存储空间。群晖照片备份工具有 <a href="https://www.synology.com/zh-tw/dsm/feature/photos" target="_blank" rel="noopener">Synology Photos</a> ，手机安装应用备份照片后可以在应用内查看备份的照片，还可以依人脸辨识、地理位置、标籤自动产生相簿。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_photos.webp" alt="nas_photos"></p><p>不过 iOS 端的 Synology Photos 并不好用，iOS 开启 iCloud 备份后会将不使用且已备份到 iCloud 的照片、影片在本机删除，Synology Photos 备份这些照片需要先从 iCloud 下载照片到本地。这样有太多问题，手机备份照片前，可能存储空间已经不够，从 iCloud 下载照片到本地会加剧手机存储空间不够，手机存储空间不够一定程度会导致手机运行卡顿，如果照片很多，卡顿过程会持续很久。解决这个问题的一个办法是使用 <a href="https://hub.docker.com/r/boredazfcuk/icloudpd" target="_blank" rel="noopener">boredazfcuk/icloudpd</a> 这个 Docker，可以直接将 iCloud 中的照片、影片备份至群晖。</p><h2 id="备份整个电脑"><a href="#备份整个电脑" class="headerlink" title="备份整个电脑"></a>备份整个电脑</h2><p>除了备份文件、照片、视频等，NAS 还提供整个电脑备份功能，与 macOS 的 <a href="https://support.apple.com/zh-tw/HT201250" target="_blank" rel="noopener">Time Machine</a> 功能类似，但是功能更加强大。群晖的 <a href="https://www.synology.com/zh-tw/dsm/feature/active-backup-business/pc" target="_blank" rel="noopener">Active Backup for Business</a> 可以对 Windows、macOS、Linux 系统进行整机备份，还可以排程备份任务，或登出或装置开机等触发备份，备份的电脑无法开机时，通过 U 盘进行整机復原。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_active_backup.webp" alt="nas_active_backup"></p><h2 id="PT-下载"><a href="#PT-下载" class="headerlink" title="PT 下载"></a>PT 下载</h2><p>PT 下载是流媒体资源的补充，NAS 可 24 小时下载、做种，有足够的存储空间，是 PT|下载最佳伴侣，NAS 可以方便地安装主流的 PT 下载工具，如 qBittorrent、Transmission 等等。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_qb.png" alt="nas_qb"></p><h2 id="媒体服务器"><a href="#媒体服务器" class="headerlink" title="媒体服务器"></a>媒体服务器</h2><p>下载好的媒体文件最好有一处集中管理，并提供多媒体串流服务，方便在各设备上观看。媒体服务器即是提供以上功能的产品，常用的有 Jellyfin、Emby、Plex，NAS 可方便地安装以上媒体服务器。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_jellyfin.png" alt="nas_jellyfin"></p><h2 id="图书管理"><a href="#图书管理" class="headerlink" title="图书管理"></a>图书管理</h2><p>除了管理影音内容，NAS 也可以管理电子书内容，<a href="https://hub.docker.com/r/johngong/calibre-web" target="_blank" rel="noopener">Calibre Web</a> 是一个好用的电子书管理工具，有干净的介面，可以搜刮电子书信息，转换电子书格式、提供 OPDS （ Open Publication Distribution System，开放式出版发布系统）服务等，方便在各端查看电子书。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_calibre.png" alt="nas_calibre"></p><h2 id="管理网路摄像头"><a href="#管理网路摄像头" class="headerlink" title="管理网路摄像头"></a>管理网路摄像头</h2><p><a href="https://www.synology.com/zh-tw/surveillance" target="_blank" rel="noopener">Surveillance Station</a> 是群晖的网路摄像头管理工具，可以观看、录製即时影像、设定排程录影，透过网页、手机播放录好的事件，以及在重要事件发生时发送通知。NAS 存储空间很大，不用担心录制的影像无处存放。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_surveillance_station.png" alt="nas_surveillance_station"></p><h2 id="运行-Home-Assistant"><a href="#运行-Home-Assistant" class="headerlink" title="运行 Home Assistant"></a>运行 Home Assistant</h2><p><a href="https://www.home-assistant.io/" target="_blank" rel="noopener">Home Assistant</a> 是开源的智能家居自动化平台，可以接入市面上几乎所有智能家居设备。群晖是运行 Home Assistant 好设备，最简单的方法是通过虚拟机安装 Home Assistant。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_home_assistant.png" alt="nas_home_assistant"></p><h2 id="运行-OpenWrt"><a href="#运行-OpenWrt" class="headerlink" title="运行 OpenWrt"></a>运行 OpenWrt</h2><p><a href="https://openwrt.org/" target="_blank" rel="noopener">OpenWrt</a> 是一个开源的路由器系统，可以安装很多拓展，且稳定性很好。OpenWrt 可以很好地解决各种网络问题，如多设备使用代理、域名分流、隐私保护等等。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_openwrt.png" alt="nas_openwrt"></p><h2 id="托管静态页面"><a href="#托管静态页面" class="headerlink" title="托管静态页面"></a>托管静态页面</h2><p>NAS 可以架设、发佈网站，小弟最常用的用来托管静态网页，群晖有附带 Web Station 套件，只需要几个简单步骤就可以快速部署静态网页。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_web_station.png" alt="nas_web_station"></p><p>一个示例是若群晖运行了上面提到的很多服务，可以通过 Web Station 快速部署一个导航页。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_nav_page.png" alt="nas_nav_page"></p><h2 id="运行-Docker"><a href="#运行-Docker" class="headerlink" title="运行 Docker"></a>运行 Docker</h2><p>Docker 是一款轻量级虚拟化应用程序，可以快速部署各种打包的容器应用。群晖的 Docker 套件有提供 Docker 图形介面，使用者可免除使用文字指令，快速完成Docker下的应用程式部署与操作，对初学者非常友好。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_web_station.png" alt="nas_web_station"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/nas_cover.png&quot; alt=&quot;nas_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;2022 年，人类进入 21 世纪已经快 1/4，20
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>ESP32 实现在家离家判断</title>
    <link href="http://yoursite.com/espresense/"/>
    <id>http://yoursite.com/espresense/</id>
    <published>2022-11-11T00:00:00.000Z</published>
    <updated>2023-02-07T11:42:52.418Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/espresense_cover.png" alt="espresense_cover"></p><p>在家、离家是两个区别较大的场景，通过设备追踪（Device Tracke）可以是判断在家离家的一个简单、可靠方式，<a href="https://espresense.com/" target="_blank" rel="noopener">ESPresense</a> 是一个利用 ESP32 低成本实现设备追踪的项目。</p><h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/beacon_flow.jpeg" alt="beacon_flow.jpeg"></p><p><a href="https://espresense.com/" target="_blank" rel="noopener">ESPresense</a> 通过蓝牙信号强度测量距离，首先 ESP32 收集信标（如手机、手表）广播的广告包，并发布至 MQTT，Home Assistant 解析 MQTT 信息并报告给追踪传感器。大多数蓝牙设备处于隐私广播的 mac 地址都有加密，但 ESPresense 基于指纹 ID 追踪，可以稳定、可靠地跟踪设备。通过蓝牙信号强度测量距离可精确到几米，也可以追踪设备是否在某一个房间，ESP32 价格低廉，综合来说，这是一个低成本且可靠的设备追踪方案。</p><h2 id="刷机"><a href="#刷机" class="headerlink" title="刷机"></a>刷机</h2><p>准备好 ESP32 后可直接在线刷机：</p><p>1.确保电脑装好驱动：</p><ul><li>CP2102 驱动： <a href="https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers" target="_blank" rel="noopener">Windows 和 Mac</a></li><li>CH342、CH343、CH9102 驱动： <a href="https://www.wch.cn/downloads/CH343SER_ZIP.html" target="_blank" rel="noopener">Windows</a>、 <a href="https://www.wch.cn/downloads/CH34XSER_MAC_ZIP.html" target="_blank" rel="noopener">Mac</a></li><li>CH340、CH341 驱动： <a href="https://www.wch.cn/downloads/CH341SER_ZIP.html" target="_blank" rel="noopener">Windows</a>、 <a href="https://www.wch.cn/downloads/CH341SER_MAC_ZIP.html" target="_blank" rel="noopener">Mac</a> </li></ul><p>2.将 ESP32 与电脑通过数据线连接（确保 USB 数据线可用于数据传输，而不是仅用于供电的数据线），使用 Chromium 内核的浏览器打开 <code>https://espresense.com/firmware</code></p><p>3.点击「连接」，选择端口，等待刷机完成。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/espresense_flash.png" alt="espresense_flash"></p><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>刷机完成后重启 ESP32，寻找 SSID 为 <code>ESPresense-</code> 开头的 AP 热点并连接，</p><p>连接 AP 热点后在设置页面中，填入 WIFI 信息、房间名称及 MQTT 信息，以及多少米判断在房间、不在房间。</p><p>!<img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/espresense_setting.png" alt="espresense_setting"></p><h3 id="Android-设备"><a href="#Android-设备" class="headerlink" title="Android 设备"></a>Android 设备</h3><p>对于 Android 设备需要一个应用程序发出 BLE 广告，推荐 Home Assistant 的 <a href="https://play.google.com/store/apps/details?id=io.homeassistant.companion.android&hl=en_GB&gl=US" target="_blank" rel="noopener">HA Companion App</a> 。</p><h3 id="iOS-设备"><a href="#iOS-设备" class="headerlink" title="iOS 设备"></a>iOS 设备</h3><p>苹果设备会发出各种<a href="https://github.com/furiousMAC/continuity" target="_blank" rel="noopener">连续性</a>消息，指纹 <code>apple:100?:*-*</code> 通常是可见的。但如果家里有很多 iPhone，会导致附近的信息冲突并重复。</p><p>解决此问题需要从 iOS 或 WatchOS 设备获取 IRK（身份解析密钥），并添加至 ESPresense 的 <code>Known BLE identity resolving keys</code> 配置中：</p><p>1.浏览器打开 <code>http://espresense 设备 IP/ui</code>，在名称中为您的设备填写想显示的设备名称，点击「Enroll」按钮，</p><p>!<img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/espresense_enroll.png" alt="espresense_enroll"></p><p>2.打开 iOS 设备，在「设置」→「蓝牙」中找到 ESPresense 设备并配对，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/espresense_pair.png" alt="espresense_pair"></p><p>4.下载安装 <a href="http://mqtt-explorer.com/" target="_blank" rel="noopener">MQTT Explorer</a>，填入 MQTT 信息，在 <code>espresense/settings</code> 主题中可以找到 IRK 密钥。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/espresense_mqtt.png" alt="espresense_mqtt"></p><h3 id="APPle-Watch"><a href="#APPle-Watch" class="headerlink" title="APPle Watch"></a>APPle Watch</h3><p>Apple Watch 的 IRK 获取参见 <a href="https://espresense.com/beacons/apple" target="_blank" rel="noopener">https://espresense.com/beacons/apple</a> Watch OS 相关内容。</p><h3 id="Home-Assistant-配置"><a href="#Home-Assistant-配置" class="headerlink" title="Home Assistant 配置"></a>Home Assistant 配置</h3><p>Home Assistant 可以自动发现 ESPresense，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/espresense_ha_mqtt.png" alt="espresense_ha_mqtt"></p><p>每个需要追踪的信标需要添加到 configuration.yaml 文件中，</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">sensor:</span></span><br><span class="line"><span class="comment"># 每个需要追踪的信标都需要设置</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">mqtt_room</span></span><br><span class="line">    <span class="attr">device_id:</span> <span class="string">"iTrack:xxxxxxxxxxxx"</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">'ESP Keys'</span></span><br><span class="line">    <span class="attr">state_topic:</span> <span class="string">'espresense/devices/iTrack:xxxxxxxxxxxx'</span></span><br><span class="line">    <span class="attr">timeout:</span> <span class="number">10</span></span><br><span class="line">    <span class="attr">away_timeout:</span> <span class="number">120</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">mqtt_room</span></span><br><span class="line">    <span class="attr">device_id:</span> <span class="string">"iBeacon:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-3-58241"</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">'ESP Chipolo'</span></span><br><span class="line">    <span class="attr">state_topic:</span> <span class="string">'espresense/devices/iBeacon:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-3-58241'</span></span><br><span class="line">    <span class="attr">timeout:</span> <span class="number">10</span></span><br><span class="line">    <span class="attr">away_timeout:</span> <span class="number">120</span></span><br></pre></td></tr></table></figure><p>保存后重启 Home Assistant，之后就可以看到追踪的信标距离 ESP32 的距离以及是否在房间。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/espresense_device.png" alt="espresense_device"></p><p>需要注意的是，若墙壁等阻隔，测量距离可能比实际距离稍远。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/espresense_cover.png&quot;
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>Android 设备做家庭 Dashboard</title>
    <link href="http://yoursite.com/kiosk/"/>
    <id>http://yoursite.com/kiosk/</id>
    <published>2022-06-10T00:00:00.000Z</published>
    <updated>2022-06-08T14:03:51.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_cover_new.png" alt="kiosk_cover"></p><p>智能家居场景面板是扩展智能家居控制的好方法，可以更方便地让客人或其他家庭成员控制家里的设备，除此之外，还可以一目了然地查看某个设备的状态并与设备交互。市面上有一些场景面板类产品，这些场景面板可以方便地控制接入的设备，美中不足是大多数产品自定义程度不高。</p><p>除了使用市面上的场景面板，另一个 CP 值比较高的方式是利用 Android 设备作为 Dashboard，通过安装 Home Assistant App 或浏览器在触屏屏幕上控制各种设备。</p><h2 id="设备选择"><a href="#设备选择" class="headerlink" title="设备选择"></a>设备选择</h2><h3 id="旧-Android-手机或-Android-平板"><a href="#旧-Android-手机或-Android-平板" class="headerlink" title="旧 Android 手机或 Android 平板"></a>旧 Android 手机或 Android 平板</h3><p>如果不想额外花费，可以直接使用旧 Android 手机充当 Home Assistant 的控制装置，不过使用旧手机需要解决电源的问题。</p><p>除了旧 Android 手机，还可以使用 Android 平板，好处是有比手机更大的屏幕。平板中 CP 值比较高的有 <a href="https://www.amazon.com/Amazon-Fire-Tablet-Family/b?ie=UTF8&node=6669703011" target="_blank" rel="noopener">Amazon Fire Tablet</a> 或 <a href="https://www.walmart.com/search?q=onn+tablet" target="_blank" rel="noopener">Walmart 的 onn tablet</a>。其中有些平板还支持语音助手，如 Amazon 的 Fire 平板支持免提使用 Alexa。和手机一样，平板也有电源的问题需要解决。</p><p>一个较干净利索的思路是使用无线充电器（需要手机或平板支持），在墙上装一个手机或平板的壁挂支架（可以 3D 打印），支架或平板其中一个粘上小磁片，另一个粘上铁片，通过磁吸拿下放上去。</p><p>另外一个需要注意的问题是，使用 Android 设备做 Dashboard 屏幕可能会有反光（灯光或太阳光）的问题，解决这个问题的思路是贴磨砂的膜或者屏幕亮度调高。</p><h3 id="Android-场景面板"><a href="#Android-场景面板" class="headerlink" title="Android 场景面板"></a>Android 场景面板</h3><p>除了常规的 Android 设备，也有厂商推出 Android 系统的场景面板，这类面板的好处是既有 Android 的灵活性，又可以无缝安装在原来灯泡机械开关的位置，直接市电供电。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_panel1.png" alt="kiosk_panel1"></p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_panel2.png" alt="kiosk_panel2"></p><h2 id="应用选择"><a href="#应用选择" class="headerlink" title="应用选择"></a>应用选择</h2><p>Android 系统使用 Home Assistant 主要有三种方式：</p><p>第一种是直接使用 Home Assistant 官方的 <a href="https://www.home-assistant.io/integrations/mobile_app/" target="_blank" rel="noopener">Companion App</a>；</p><p>第二种是使用全屏浏览器类应用，如 <a href="https://www.fully-kiosk.com/" target="_blank" rel="noopener">Fully Kiosk Browser</a>（部分功能付费）或 <a href="https://github.com/thecowan/wallpanel-android" target="_blank" rel="noopener">WallPanel</a>（免费），浏览器类应用可以实现更多功能，如利用设备摄像头作为一个运动传感器、支持将浏览器作为一个媒体播放器、实现更多自动化等等。</p><p><img src="https://github.com/thecowan/wallpanel-android/raw/master/img/dashboard2.png" alt="img"></p><p>第三类是类似 <a href="https://sharptools.io/" target="_blank" rel="noopener">SharpTools</a> 这样的工具，这类工具有很多预制的适配 Dashboard 的卡片，直接选择相应的卡片可以快速配置美观的 Dashboard，由于卡片类型都是定义好的，所以自定义程度不如浏览器类应用，但是配置起来相对容易。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_sharptools.png" alt="kiosk_sharptools"></p><h2 id="配置展示应用"><a href="#配置展示应用" class="headerlink" title="配置展示应用"></a>配置展示应用</h2><p>三种方式中自定义程度高且功能丰富的是使用浏览器类应用，以 Fully Kiosk Browser 为例，安装好之后可以进行以下设置：</p><p>1、基本设置</p><p>在「设置」→「网页内容设置」可以填入 Home Assistant 的地址。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_setting1.png" alt="kiosk_browser_setting1"></p><p>2、其他设置</p><p>可以设置多少秒之后显示屏保，屏保可以设置打开一个网址，或者调用 Android 系统自带屏保或者打开某一个 App。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_setting2.png" alt="kiosk_browser_setting2"></p><p>除此之外，还可以设置摄像头作为一个运动传感器，传感器敏感度、侦测到运动传感器后点亮屏幕等等都可以设置，这样在无人操作或夜晚就可以关闭屏幕显示，防止光污染。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_setting3.png" alt="kiosk_browser_setting3"></p><p>需要注意的是，设置中标注 PLUS 的，如果不付费会出现水印。</p><p>3、远端控制</p><p>Full Kiosk Browser 可以设置远端控制，打开远端控制后可以在其他设备通过浏览器访问 Kiosk Browser 的地址进行设置。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_setting4.png" alt="kiosk_browser_setting4"></p><p>打开设置中的「远端控制」及设置好密码后，就可以直接在电脑浏览器进行设置了。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_setting5.png" alt="kiosk_browser_setting5"></p><p>4、系统权限</p><p>如果希望 Fully Kiosk Browser 可以控制系统屏幕等，需要获取系统权限，需要确保这些权限是打开状态。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_setting6.png" alt="kiosk_browser_setting6"></p><p>5、作为组件接入 Home Assistant</p><p>Full Kiosk Browser 可以通过  <a href="https://github.com/cgarwood/homeassistant-fullykiosk" target="_blank" rel="noopener">Fully Kiosk Browser integration</a> 组件 这个组件作为一个系统组件接入 Home Assistant，</p><p>首先在 HACS 中搜索「Full Kiosk Browser」并安装，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_kiosk_integration1.png" alt="kiosk_browser_kiosk_integration1"></p><p>在「设置」→「设备与服务」中，点击右下角「add integration」，搜索「kiosk」，选择「Full Kiosk Browser」</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_kiosk_integration2.png" alt="kiosk_browser_kiosk_integration2"></p><p>填入安装 Full Kiosk Browser 的设备的 IP 地址及密码，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_kiosk_integration3.png" alt="kiosk_browser_kiosk_integration3"></p><p>正确填入后 Home Assistant 会多一个设备，安装 Kiosk Browser 设备的各种信息都可以作为一个传感器接入。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_kiosk_integration4.png" alt="kiosk_browser_kiosk_integration4"></p><h2 id="配置-Dashboard"><a href="#配置-Dashboard" class="headerlink" title="配置 Dashboard"></a>配置 Dashboard</h2><p>Home Assistant 可自定义程度很高，有很多大大分享自己的配置，如 <a href="https://github.com/matt8707" target="_blank" rel="noopener">matt8707</a> 的<a href="https://github.com/matt8707/hass-config" target="_blank" rel="noopener">类似 HomeKit 的 Dashboard</a>，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_sample1.png" alt="kiosk_browser_sample1"></p><p><a href="https://github.com/pqpxo" target="_blank" rel="noopener">pqpxo</a> 的 <a href="https://github.com/pqpxo/SWAKES_hassio" target="_blank" rel="noopener">SWAKES_hassio</a></p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_sample2.png" alt="kiosk_browser_sample2"></p><p><a href="https://github.com/jimz011" target="_blank" rel="noopener">jimz011</a> 的 <a href="https://github.com/jimz011/homekit-infused" target="_blank" rel="noopener">homekit-infused</a> ，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_sample3.png" alt="kiosk_browser_sample3"></p><p>这些配置介面很漂亮，不过这些介面需要自己配置 yaml 文件，配置起来复杂。</p><p>简单的方式是通过 GUI 直接增删卡片，除了 Home Assistant 自带的卡片类型，有大大分享了一个简洁、可自定义的 UI 卡片集合 <a href="https://github.com/piitaya/lovelace-mushroom" target="_blank" rel="noopener">Mushroom Card</a>，可以丰富自定义卡片类型，方便地构建美观的 Dashboard。</p><h3 id="安装-Mushroom-Card"><a href="#安装-Mushroom-Card" class="headerlink" title="安装 Mushroom Card"></a>安装 Mushroom Card</h3><p>可直接通过 HACS 安装 Mushroom Card，在 HACS 前端中搜索「mushroom」安装，之后重启 Home Assistant。</p><h3 id="配置卡片"><a href="#配置卡片" class="headerlink" title="配置卡片"></a>配置卡片</h3><p>1、单个 entity 卡片</p><p>首先点击右上角「更多」按钮，点击「编辑 Dashboard」进入编辑状态，点击右下角的「添加」按钮，在「按照卡片」选项中搜索「mushroom」，可以看到 mushroom 相关卡片，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_insert_mushroom.png" alt="kiosk_browser_insert_mushroom"></p><p>Mushroom Card 目前有这几种类型的卡片：</p><p><a href="https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/alarm.md" target="_blank" rel="noopener">警报卡片</a>、<a href="https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/cover.md" target="_blank" rel="noopener">窗帘卡片</a>、<a href="https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/entity.md" target="_blank" rel="noopener">实体卡片</a>、<a href="https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/fan.md" target="_blank" rel="noopener">风扇卡片</a>、<a href="https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/light.md" target="_blank" rel="noopener">灯泡卡片</a>、<a href="https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/person.md" target="_blank" rel="noopener">家庭成员卡片</a>、<a href="https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/template.md" target="_blank" rel="noopener">自定义卡片</a>、<a href="https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/chips.md" target="_blank" rel="noopener">Chips 卡片</a>、<a href="https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/title.md" target="_blank" rel="noopener">标题卡片</a>、<a href="https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/update.md" target="_blank" rel="noopener">更新管理卡片</a>、 <a href="https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/vacuum.md" target="_blank" rel="noopener">吸尘器卡片</a>、<a href="https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/media-player.md" target="_blank" rel="noopener">媒体播放器卡片</a>、<a href="https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/lock.md" target="_blank" rel="noopener">锁卡片</a>、<a href="https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/humidifier.md" target="_blank" rel="noopener">加湿器卡片</a></p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_mushroom_all.png" alt="kiosk_browser_mushroom_all"></p><p>每种卡片都可以自定义参数，如窗帘卡片可以设置是否显示位置百分百、显示开合按钮等等。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_insert_mushroom_cover_card.png" alt="kiosk_browser_insert_mushroom_cover_card"></p><p>2、善用 Horizon Stack</p><p>Mushroom Card 可以和系统自带的 Horizontal Stack 结合使用，创建更丰富的卡片形式，在添加卡片中搜索「horizontal」选择 Horizontal Stack 嵌套 Mushroom Card。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_insert_horizontal_stack.png" alt="kiosk_browser_insert_horizontal_stack"></p><p>3、设置页面层级</p><p>Mushroom Card 可以设置点击后效果，可以设置点击跳转路径，通过此设置有页面层级的 Dashboard。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_browser_mushroom_click.png" alt="kiosk_browser_mushroom_click"></p><h3 id="隐藏顶部-bar"><a href="#隐藏顶部-bar" class="headerlink" title="隐藏顶部 bar"></a>隐藏顶部 bar</h3><p>另外一个需要注意的是，Home Assistant 默认会显示顶部 bar，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_kiosk_mode.gif" alt="kiosk_kiosk_mode"></p><p>如果想隐藏，可以用 <a href="https://github.com/maykar/kiosk-mode" target="_blank" rel="noopener">kiosk-mode</a> 这个小工具，首先下载 <a href="https://github.com/matt8707/kiosk-mode/releases/latest" target="_blank" rel="noopener">kiosk-mode.js</a> 到 <code>www</code> 路径下，Dashboard 编辑模式选择「原始 yaml 编辑」，将以下代码添加并保存。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">resources:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">url:</span> <span class="string">/local/kiosk-mode.js?v=1.2.1</span></span><br><span class="line">    <span class="attr">type:</span> <span class="string">module</span></span><br></pre></td></tr></table></figure><p>如果想显示隐藏的 bar，在路径加上参数 <code>?disable_km</code> 可临时取消隐藏。</p><h3 id="Dashboard-示例"><a href="#Dashboard-示例" class="headerlink" title="Dashboard 示例"></a>Dashboard 示例</h3><p>最终可以得到这样一个 Dashboard，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic//kiosk_final_dashboard.jpg" alt="kiosk_final_dashboard"></p><h2 id="自动化"><a href="#自动化" class="headerlink" title="自动化"></a>自动化</h2><p>Dashboard 本身的自动化可以通过 <a href="https://github.com/thomasloven/hass-browser_mod" target="_blank" rel="noopener">hass-browser_mod</a> 这个组件实现。</p><h3 id="安装-browser-mod"><a href="#安装-browser-mod" class="headerlink" title="安装 browser mod"></a>安装 browser mod</h3><p>安装分三步：</p><p>1、直接在 HACS 搜索「browser mod」搜索并安装，</p><p>2、在 <code>configuration.yaml</code>文件中加入</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">browser_mod:</span><br><span class="line">  prefix: &quot;browser_&quot;</span><br></pre></td></tr></table></figure><p>3、重启 Home Assistant</p><p>安装好之后可用的命令很丰富，包括調試、設置主題、導航至某个路径、显示实体详情、媒体播放、浏览器 Toast、浏览器 popup 弹窗、关闭 popup 弹窗、延遲、呼叫某个 Home Assistant 服務等等。</p><p>browser mod 有一个概念是 entity_id，browser mod 通过 entity_id 区分各浏览器，entity_id 可以在开发者工具里「服务」中选择「Browser mod: debug」，呼叫后将在所有浏览器弹出 entity_id 信息。</p><h3 id="自动化示例-1：有人按门铃显示摄像头"><a href="#自动化示例-1：有人按门铃显示摄像头" class="headerlink" title="自动化示例 1：有人按门铃显示摄像头"></a>自动化示例 1：有人按门铃显示摄像头</h3><p>當有人按門鈴時，播放声音，并把门口的攝像頭画面在平板上彈出。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">alias:</span> <span class="string">popup_camera</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">''</span></span><br><span class="line"><span class="attr">trigger:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">device</span></span><br><span class="line">    <span class="attr">domain:</span> <span class="string">mqtt</span></span><br><span class="line">    <span class="attr">device_id:</span> <span class="string">fc7c97eef33567c1e5107e84d452a42e</span></span><br><span class="line">    <span class="attr">type:</span> <span class="string">click</span></span><br><span class="line">    <span class="attr">subtype:</span> <span class="string">single</span></span><br><span class="line">    <span class="attr">discovery_id:</span> <span class="number">0x00158d0003503065</span> <span class="string">click_single</span></span><br><span class="line"><span class="attr">condition:</span> <span class="string">[]</span></span><br><span class="line"><span class="attr">action:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">browser_mod.more_info</span></span><br><span class="line">    <span class="attr">data:</span></span><br><span class="line">      <span class="attr">entity_id:</span> <span class="string">camera.camera1</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">media_player.play_media</span></span><br><span class="line">    <span class="attr">data:</span></span><br><span class="line">      <span class="attr">media_content_id:</span> <span class="string">https://i.drunkfish.me:8123/local/doorbell.mp3</span></span><br><span class="line">      <span class="attr">media_content_type:</span> <span class="string">music</span></span><br><span class="line">      <span class="attr">deviceID:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="number">12345678</span><span class="number">-12345678</span></span><br><span class="line">    <span class="attr">target:</span></span><br><span class="line">      <span class="attr">entity_id:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">media_player.browser_c494f5db_139ca1f4</span></span><br><span class="line"><span class="attr">mode:</span> <span class="string">single</span></span><br></pre></td></tr></table></figure><h3 id="自动化示例-2：平板做报时钟"><a href="#自动化示例-2：平板做报时钟" class="headerlink" title="自动化示例 2：平板做报时钟"></a>自动化示例 2：平板做报时钟</h3><p>每天整点报时，方便实践单核工作法。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">alias:</span> <span class="string">clock</span> <span class="string">hour</span> <span class="string">fire</span> <span class="string">tablet</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">''</span></span><br><span class="line"><span class="attr">trigger:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'8:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'9:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'10:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'11:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'12:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'13:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'14:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'15:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'16:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'17:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'18:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'19:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'20:00:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'21:00:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'22:00:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'23:00:00'</span></span><br><span class="line"><span class="attr">condition:</span> <span class="string">[]</span></span><br><span class="line"><span class="attr">action:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">media_player.play_media</span></span><br><span class="line">    <span class="attr">data:</span></span><br><span class="line">      <span class="attr">media_content_id:</span> <span class="string">https://i.drunkfish.me:8123/local/hour.mp3</span></span><br><span class="line">      <span class="attr">media_content_type:</span> <span class="string">music</span></span><br><span class="line">      <span class="attr">deviceID:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="number">12345678</span><span class="number">-12345678</span></span><br><span class="line">    <span class="attr">target:</span></span><br><span class="line">      <span class="attr">entity_id:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">media_player.browser_c494f5db_139ca1f4</span></span><br></pre></td></tr></table></figure><h3 id="自动化示例-3：睡觉时间在小孩房间平板显示通知"><a href="#自动化示例-3：睡觉时间在小孩房间平板显示通知" class="headerlink" title="自动化示例 3：睡觉时间在小孩房间平板显示通知"></a>自动化示例 3：睡觉时间在小孩房间平板显示通知</h3><p>晚上 10 点半在小孩房间平板显示声音和弹窗，提醒小孩睡觉，5s 后弹窗消失。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_automation_bedtime.png" alt="kiosk_automation_bedtime"></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">alias:</span> <span class="string">it's</span> <span class="string">bed</span> <span class="string">time</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">''</span></span><br><span class="line"><span class="attr">trigger:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'22:30'</span></span><br><span class="line"><span class="attr">condition:</span> <span class="string">[]</span></span><br><span class="line"><span class="attr">action:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">browser_mod.popup</span></span><br><span class="line">    <span class="attr">data:</span></span><br><span class="line">      <span class="attr">title:</span> <span class="string">Popup</span> <span class="string">example</span></span><br><span class="line">      <span class="attr">large:</span> <span class="string">ture</span></span><br><span class="line">      <span class="attr">hide_header:</span> <span class="string">ture</span></span><br><span class="line">      <span class="attr">card:</span></span><br><span class="line">        <span class="attr">type:</span> <span class="string">markdown</span></span><br><span class="line">        <span class="attr">content:</span> <span class="string">'![](https://i.drunkfish.me:8123/local/bedtime.png)'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">media_player.play_media</span></span><br><span class="line">    <span class="attr">data:</span></span><br><span class="line">      <span class="attr">media_content_id:</span> <span class="string">https://i.drunkfish.me:8123/local/bedtime.mp3</span></span><br><span class="line">      <span class="attr">media_content_type:</span> <span class="string">music</span></span><br><span class="line">      <span class="attr">deviceID:</span></span><br><span class="line">       <span class="bullet">-</span> <span class="number">12345678</span><span class="number">-12345678</span></span><br><span class="line">    <span class="attr">target:</span></span><br><span class="line">      <span class="attr">entity_id:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">media_player.browser_c494f5db_139ca1f4</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">delay:</span></span><br><span class="line">      <span class="attr">hours:</span> <span class="number">0</span></span><br><span class="line">      <span class="attr">minutes:</span> <span class="number">0</span></span><br><span class="line">      <span class="attr">seconds:</span> <span class="number">5</span></span><br><span class="line">      <span class="attr">milliseconds:</span> <span class="number">0</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">browser_mod.close_popup</span></span><br><span class="line">    <span class="attr">data:</span> <span class="string">&#123;&#125;</span></span><br><span class="line"><span class="attr">mode:</span> <span class="string">single</span></span><br></pre></td></tr></table></figure><h3 id="自动化示例-4：午夜后吸顶灯打开，切换到客厅视图"><a href="#自动化示例-4：午夜后吸顶灯打开，切换到客厅视图" class="headerlink" title="自动化示例 4：午夜后吸顶灯打开，切换到客厅视图"></a>自动化示例 4：午夜后吸顶灯打开，切换到客厅视图</h3><p>晚上 12 点后客厅吸顶燈打开后，浏览器切換到客厅视图。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">alias:</span> <span class="string">turn</span> <span class="string">on</span> <span class="string">ceiling</span> <span class="string">light_switch</span> <span class="string">to</span> <span class="string">card</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">''</span></span><br><span class="line"><span class="attr">trigger:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">state</span></span><br><span class="line">    <span class="attr">entity_id:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">switch.switch</span></span><br><span class="line">    <span class="attr">from:</span> <span class="string">'off'</span></span><br><span class="line">    <span class="attr">to:</span> <span class="string">'on'</span></span><br><span class="line"><span class="attr">condition:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">condition:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">before:</span> <span class="string">'07:00:00'</span></span><br><span class="line">    <span class="attr">after:</span> <span class="string">'00:00:00'</span></span><br><span class="line"><span class="attr">action:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">browser_mod.navigate</span></span><br><span class="line">    <span class="attr">data:</span></span><br><span class="line">      <span class="attr">navigation_path:</span> <span class="string">/lovelace-test/living%20room</span></span><br><span class="line">    <span class="attr">deviceID:</span></span><br><span class="line">       <span class="bullet">-</span> <span class="number">12345678</span><span class="number">-12345678</span>      </span><br><span class="line"><span class="attr">mode:</span> <span class="string">single</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/kiosk_cover_new.png&quot;
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>Android TV 应用推荐——以 Mibox 为例</title>
    <link href="http://yoursite.com/tv/"/>
    <id>http://yoursite.com/tv/</id>
    <published>2021-12-12T00:00:00.000Z</published>
    <updated>2023-02-07T05:20:22.318Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/tv_cover.png" alt="tv_cover"></p><p>小弟入手了一个小米盒子国际版 <a href="https://www.mi.com/global/mibox" target="_blank" rel="noopener">Mibox Original</a>，运行 Android TV 系统，下面是一些使用建议：</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/tv_mibox.png" alt="tv_mibox"></p><h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>并非所有运行 Android 系统的盒子或电视都是 <a href="https://www.android.com/tv/" target="_blank" rel="noopener">Android TV</a>，Android TV 是有 Google 认证的盒子或电视，预装 Google 服务框架，带 Chromecast 功能，有 Netflix 等流媒体授权。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/tv_index.png" alt="tv_index"></p><h3 id="网络建议"><a href="#网络建议" class="headerlink" title="网络建议"></a>网络建议</h3><p>稳定的网络连接是充分使用 Android TV 的前提，推荐使用软路由，通过 <a href="https://github.com/vernesong/OpenClash" target="_blank" rel="noopener">OpenClash</a> 插件实现网络代理、域名分流。</p><h3 id="Google-Assistant"><a href="#Google-Assistant" class="headerlink" title="Google Assistant"></a>Google Assistant</h3><p>Android TV 系统有内置 Google Assistant 语音助理，按下遥控器语音按钮可激活使用，<a href="https://www.youtube.com/watch?v=hIHsgqID9Xc" target="_blank" rel="noopener">可用语音执行很多操作</a>，如查看日程、打开应用、搜索影片、控制其他设备等等。针对搜索影片，Android TV 上的 Google Assistant 有做聚合搜索，直接说出电影或剧集名称（可中文或英文）会显示所有可以播放的选项。另外，还可以用 Google Home 反向控制 Android TV。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/tv_google_assistant.png" alt="tv_google_assistant"></p><h3 id="Chromecast"><a href="#Chromecast" class="headerlink" title="Chromecast"></a>Chromecast</h3><p>Android TV 系统内置 Chromecast，流媒体平台都有支援，只要轻轻一点就可以将影片或音乐投至电视欣赏，用手机充当遥控器控制。</p><h2 id="欣赏串流媒体"><a href="#欣赏串流媒体" class="headerlink" title="欣赏串流媒体"></a>欣赏串流媒体</h2><p>Android TV 一个最主要的功能是用来欣赏串流媒体平台，在 Google Play 中可以方便安装各类流媒体应用，且 Android TV 上的流媒体应用都有对电视使用场景做优化与适配。Android TV 可以方便地切换 Google 账号，可以注册多个地区的 Google 账号方便下载不同地区的流媒体应用。</p><p>目前有支援的中文的较主流流媒体平台有 <a href="https://www.netflix.com/browse" target="_blank" rel="noopener">Netflix</a>、<a href="https://www.disneyplus.com/" target="_blank" rel="noopener">Disney+</a>、<a href="https://www.hbogoasia.tw/movies" target="_blank" rel="noopener">HBO GO</a>、<a href="https://www.primevideo.com/" target="_blank" rel="noopener">Amazon Prime Video</a>、<a href="https://www.apkmirror.com/apk/apple-inc/apple-tv-android-tv/" target="_blank" rel="noopener">Apple TV+</a>、<a href="https://play.google.com/store/apps/details?id=tw.com.gamer.android.animad" target="_blank" rel="noopener">动画疯</a>、<a href="https://www.spotify.com/" target="_blank" rel="noopener">Spotify</a> 等等。很多流媒体都有低价区，可以跨区订阅，还支持家庭共享账号，故可以至低价区订阅找人合租或直接找人合租。</p><p>如果有订阅多个串流媒体平台，可以使用 <a href="https://www.justwatch.com/" target="_blank" rel="noopener">JustWatch</a>，可以聚合搜索各个流媒体平台的资源，手机、电脑同时安装 JustWatch 后，就可以在手机聚合搜索影片，并直接在电视播放。</p><h2 id="观看电视直播"><a href="#观看电视直播" class="headerlink" title="观看电视直播"></a>观看电视直播</h2><p>除了点播流媒体，Android TV 也可以像「传统电视」一样看电视直播。Youtube 上就有很多免费电视直播频道可以直接观看。</p><p>如果有直播源可以使用 <a href="https://play.google.com/store/apps/details?id=ar.tvplayer.tv" target="_blank" rel="noopener">TiviMate IPTV Player</a> 观看 IPTV，应用有对电视操作特别适配，介面美观，功能全面。或者在 <a href="">Kodi</a> 这个应用上安装 <a href="https://kodi.wiki/view/Add-on:PVR_IPTV_Simple_Client">PVR IPTV Simple Client</a> 这个插件来播放直播源。</p><h2 id="欣赏局域网内媒体"><a href="#欣赏局域网内媒体" class="headerlink" title="欣赏局域网内媒体"></a>欣赏局域网内媒体</h2><p>若 NAS 下载了很多影片，可以通过安装应用在电视上直接播放。<a href="https://kodi.tv/" target="_blank" rel="noopener">Kodi</a> 可以挂载局域网 NAS，对影片内容进行搜刮、下载字幕以及播放等等。除此之外，若在 NAS 上有安装<a href="https://www.plex.tv/" target="_blank" rel="noopener">Plex</a>、<a href="https://emby.media/" target="_blank" rel="noopener">Emby</a> 或 <a href="https://jellyfin.org/" target="_blank" rel="noopener">Jellyfin</a> 等媒体服务器，可以安装相应客户端欣赏其中的影片。</p><h2 id="应用推荐"><a href="#应用推荐" class="headerlink" title="应用推荐"></a>应用推荐</h2><h3 id="ATV-Launcher-Pro"><a href="#ATV-Launcher-Pro" class="headerlink" title="ATV Launcher Pro"></a>ATV Launcher Pro</h3><p>Android TV 自带 Launcher 有很多推荐内容，且不符合 Android TV 应用图标规范的应用不能直接显示出来。如果需要一个简单的、可自定义的  Launcher，可以使用 <a href="https://play.google.com/store/apps/details?id=ca.dstudio.atvlauncher.pro" target="_blank" rel="noopener">ATV Launcher Pro</a> ，这个启动器介面简单，可以隐藏应用、自定义应用图标、自定义图标顺序等等。</p><h3 id="Mix-Apps"><a href="#Mix-Apps" class="headerlink" title="Mix-Apps"></a>Mix-Apps</h3><p>除了 ATV Launcher Pro，也可以使用 <a href="https://play.google.com/store/apps/details?id=com.himedia.applications" target="_blank" rel="noopener">Mix-Apps</a> 将应用图标不带 Banner 的应用显示出来。</p><h3 id="乐播投屏"><a href="#乐播投屏" class="headerlink" title="乐播投屏"></a>乐播投屏</h3><p><a href="https://www.hpplay.com.cn" target="_blank" rel="noopener">乐播投屏</a> 对 AirPlay 协议做了逆向，可以将 Android 设备模拟成 Apple TV，方便苹果设备使用 AirPlay 进行投屏。</p><h3 id="小盒精灵"><a href="#小盒精灵" class="headerlink" title="小盒精灵"></a>小盒精灵</h3><p><a href="http://down.znds.com/apk/app/2020/0222/7414.html" target="_blank" rel="noopener">小盒精灵</a>可以方便在手机浏览器输入文字、传输文件。</p><h3 id="Kodi"><a href="#Kodi" class="headerlink" title="Kodi"></a>Kodi</h3><p><a href="https://kodi.tv/" target="_blank" rel="noopener">Kodi</a> 是 Xbox 以前的 Media Center，播放能力、可拓展能力很强。可以播放局域网内影片，也可以用来观看 IPTV、通过安装插件观看 Netflix、当做 DLNA 投屏装置等等，功能很多。</p><h3 id="Button-Mapper"><a href="#Button-Mapper" class="headerlink" title="Button Mapper"></a>Button Mapper</h3><p><a href="https://play.google.com/store/apps/details?id=flar2.homebutton" target="_blank" rel="noopener">Button Mapper</a> 可以自定义遥控器按键，使遥控器或其他输入设备使用更顺手。</p><h3 id="JioPages"><a href="#JioPages" class="headerlink" title="JioPages"></a>JioPages</h3><p><a href="https://play.google.com/store/apps/details?id=com.jio.web.androidtv" target="_blank" rel="noopener">JioPages</a> 是一款 TV 浏览器，有对电视操作进行适配，可以进行一些轻度浏览网页操作。</p><h3 id="tinyCam-Monitor"><a href="#tinyCam-Monitor" class="headerlink" title="tinyCam Monitor"></a>tinyCam Monitor</h3><p><a href="https://play.google.com/store/apps/details?id=com.alexvas.dvr" target="_blank" rel="noopener">tinyCam Monitor</a> 可以方便地在电视大屏幕上查看 IP 摄像机。</p><h2 id="手机应用推荐"><a href="#手机应用推荐" class="headerlink" title="手机应用推荐"></a>手机应用推荐</h2><h3 id="Google-TV"><a href="#Google-TV" class="headerlink" title="Google TV"></a>Google TV</h3><p><a href="https://support.google.com/googletv/answer/11136134" target="_blank" rel="noopener">Google TV 应用</a> 是 Google 官方的 Android TV 控制应用，可以用手机控制 Android TV、进行语音交互、输入文字等等。</p><p>除此之外，若用 Google 搜索影片时将影片加入 Watchlist，也可以在 Google TV 应用中看到。</p><h3 id="Kodi-Remote"><a href="#Kodi-Remote" class="headerlink" title="Kodi Remote"></a>Kodi Remote</h3><p><a href="https://kodi.wiki/view/Official_Kodi_Remote" target="_blank" rel="noopener">Kodi Remote</a> 是 Kodi 官方的 Kodi 控制应用，可以方便地在 Kodi 各功能切换、控制、查看媒体信息等等。</p><h2 id="配件推荐"><a href="#配件推荐" class="headerlink" title="配件推荐"></a>配件推荐</h2><h3 id="迷你键盘"><a href="#迷你键盘" class="headerlink" title="迷你键盘"></a>迷你键盘</h3><p>盒子自带遥控器的按键比较少，只能满足基本使用。小弟有买过一些遥控器，也曾</p><p><a href="http://www.riitek.com/index.html" target="_blank" rel="noopener">i8 迷你键盘</a> 看起来有点像一个游戏手柄，比较厉害的是小小空间装了完整 QWERTY 全键盘、触摸板，还支持背光按键。i8 迷你键盘有好几个版本：推荐蓝牙版本或蓝牙/2.4GHz 双模版。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic5@master/uPic/tv_i8.jpeg" alt="tv_i8"></p><h3 id="NFC-贴纸"><a href="#NFC-贴纸" class="headerlink" title="NFC 贴纸"></a>NFC 贴纸</h3><p>NFC 贴纸的功能是快速打开小盒精灵的页面或者打开 Google TV 应用，可以粘在遥控器上，手机碰触贴纸即可快速打开 Google TV，方便输入长文本或发送安装包。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/tv_cover.png&quot; alt=&quot;tv_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;小弟入手了一个小米盒子国际版 &lt;a
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>100 种设备接入 HomeKit</title>
    <link href="http://yoursite.com/tuya_hub/"/>
    <id>http://yoursite.com/tuya_hub/</id>
    <published>2021-11-10T00:00:00.000Z</published>
    <updated>2021-11-17T14:42:44.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_cover.png" alt="tuya_hub_cover"></p><blockquote><p>四海皆兄弟，谁为行路人。——两汉·佚名</p></blockquote><p>一直以来，苹果的产品都是品质的保证。在智能家居领域， 苹果主推的 <a href="https://www.apple.com/ios/home/" target="_blank" rel="noopener">HomeKit</a> 也是独树一帜，在很多方面与其他平台不一样：</p><p>HomeKit 设备需要一个叫做「Works with Apple HomeKit」的认证，认证通过备案制管理。大公司可以为自己工厂申请资质，初创公司可以委托拥有资质的工厂代生产，由于备案制，HomeKit 设备品质都有保证。也因为需要认证， HomeKit 认证设备售价普遍较高。</p><p>与其他平台的另一个不同之处在于，HomeKit 需要通过一个「<a href="https://support.apple.com/en-us/HT207057" target="_blank" rel="noopener">家居中枢</a>」实现设备自动化及外网访问。家庭中枢可以是 HomePod、iPad 或 Apple TV ，在本地网络处理各类自动化，这样做一方面可以用苹果 A 系列处理器弥补各类网关性能上的不足，另一方面数据存在本地，免数据传到外网中转，隐私可最大程度保护。</p><p>同时，HomeKit 的另一项优势在于苹果有目前最完善的跨设备体验，无论手机、平板、电脑、手表、电视还是音箱，都可以提供一致、优质的体验，并且 HomeKit 在苹果各设备上都有系统级的入口，可以以最短的路径操作设备。</p><p>小弟最近在使用 <a href="https://item.taobao.com/item.htm?id=658436128278&spm=2015.23436601.0.0" target="_blank" rel="noopener">Zemismart 的涂鸦 Zigbee HomeKit 网关</a>，可以作为<a href="https://www.tuya.com/" target="_blank" rel="noopener">涂鸦</a> Zigbee 设备与 HomeKit 的桥梁，快速将各类涂鸦 Zigbee 设备转成「一等设备」，使用苹果生态及涂鸦生态的叠加优势。</p><p>在用这个网关之前，小弟一直使用 Home Assistant 作为中介将设备接入 HomeKit，总体感觉是「灵活有余，稳定不足」，设备状态容易「无响应」，而坊间的 HomeKit 网关大多只支持自家品牌的设备，这个网关（确切的说是桥接器）算是一个折衷，有苹果认证保证连接的稳定，半开放的涂鸦固件确保有足够种类数量的设备接入。</p><h2 id="外观"><a href="#外观" class="headerlink" title="外观"></a>外观</h2><p>就像路由器的性能比外观重要，网关的外观与功能相比也很次要，但是好的外观还是可以吸引到人。这款网关很小巧，整体是一个扁平的圆柱体，外观简洁、紧凑，全白的颜色非常有质感，侧边有一圈指示灯，总体看上去觉有点像压扁的 <a href="https://store.google.com/us/product/google_wifi_2nd_gen?hl=en-US" target="_blank" rel="noopener">Google Wifi</a>，接口方面有一个 microUSB 电源口和一个以太网口。除了网关本体，另有附赠一个底座、一条 microUSB 充电线、一根网线与三颗螺丝。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_package.jpg" alt="tuya_hub_package"></p><h2 id="入网"><a href="#入网" class="headerlink" title="入网"></a>入网</h2><p>网关入网很简单，首先确保 iOS 设备已登录 iCloud 且已开启「iCloud 钥匙串」和「家庭」。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_ios_check.png" alt="tuya_hub_ios_check"></p><p>将网关通电，网关未附电源，可以用手机的 5V 1A 豆腐头充电器，通电同时用网线将网关与路由器连接（附的网线较短，可能需要另找一根网线），之后长按以太网口旁边的「重置」按钮，此时网关进入配对状态，指示灯显示<strong>常绿</strong>。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_pair_hub.jpg" alt="tuya_hub_pair_hub"></p><p>HomeKit 认证设备通过贴纸（二维码或 NFC 贴纸）配对入网，这个网关在网关底部、包装盒、说明书都有贴二维码贴纸，打开使用 iOS 设备的「家庭」应用，选择右上角的「＋」→「添加配件」或者直接点击「添加配件」按钮，扫描贴纸上的配对码，HomeKit 会识别为「桥接设备」，点击「添加到家庭」按钮，耐心等待「家庭」App 将网关接入，之后选择网关所在房间及重命名网关。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_home_pair.jpg" alt="tuya_hub_home_pair"></p><h2 id="添加子设备"><a href="#添加子设备" class="headerlink" title="添加子设备"></a>添加子设备</h2><h3 id="可配对的子设备"><a href="#可配对的子设备" class="headerlink" title="可配对的子设备"></a>可配对的子设备</h3><p>网关的作用在于收集信号，发送指令，实现产品之间的通讯连接，需要各种功能需要接入子设备。这个网关目前只要是涂鸦标准方案（目前只支持刷入涂鸦标准方案的固件的设备）的 Zigbee 设备理论上就可以接入，不需要是同一个品牌。涂鸦 Zigbee 设备的一个特点是品类覆盖广，在涂鸦 App 中列出的 Zigbee 设备就有 56 种之多，覆盖了开关、传感器、窗帘等除电冰箱、洗衣机大家电之外的几乎所有品类。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_child.png" alt="tuya_hub_child"></p><p>需要注意的是，涂鸦厂商采用自定义固件或厂商固件，这些「非标准」固件由开发者或厂商维护，其中可能与这个网关连不上。即便如此，可选的设备还是有很多。</p><p>除了品类丰富，涂鸦固件的设备另外一个特点是价格亲民，性价比普遍较高。</p><h3 id="配对流程"><a href="#配对流程" class="headerlink" title="配对流程"></a>配对流程</h3><p>这个网关可以在「家庭」App 添加子设备，也可以「涂鸦」App 添加子设备，在一个 App 中添加子设备后两个 App 中可以同步。</p><h4 id="使用「家庭」App-配对子设备"><a href="#使用「家庭」App-配对子设备" class="headerlink" title="使用「家庭」App 配对子设备"></a>使用「家庭」App 配对子设备</h4><p>配对子设备的需要网关与子设备同时进入配对状态，使用「家庭」App 配对子设备需要手动将网关调至配对状态，具体的操作是按一下网关侧面的 reset 键，此时网关指示灯显示<strong>绿色灯闪烁</strong>，同时子设备也要调至配对状态（不同设备进入配对设备方法不同，如大多数传感器是长按 reset 键至指示灯闪烁，具体可查阅设备附的说明书或设备标识）。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_home_pair_child.jpg" alt="tuya_hub_home_pair_child"></p><p>网关会自动寻找并配对网关，待配对完成，子设备会出现在「家庭」App。</p><h4 id="使用「涂鸦」App-配对子设备"><a href="#使用「涂鸦」App-配对子设备" class="headerlink" title="使用「涂鸦」App 配对子设备"></a>使用「涂鸦」App 配对子设备</h4><p>除了使用「家庭」App 配对子设备，也可以使用「涂鸦」App 配对子设备。若之前有通过 「家庭」App 入网，打开「涂鸦」App 可以直接发现网关，点击「添加」即可将网关绑定至涂鸦账号，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_child_pair_tuya1.png" alt="tuya_hub_child_pair_tuya1"></p><p>不同于在「家庭」App 中需要手动将网关调至配对状态，在「涂鸦」App 中可以直接在 App 中将网关调至配对状态，在「涂鸦」App 中找到网关，进入网关详情页面，点击「添加子设备」按钮，可将网关调至配对状态，同时将子设备调至配对状态（可参阅子设备说明书），网关会自动发现设备。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_child_pair_tuya2.png" alt="tuya_hub_child_pair_tuya2"></p><h3 id="两者区别"><a href="#两者区别" class="headerlink" title="两者区别"></a>两者区别</h3><p>「家庭」App 与「涂鸦」App 都可添加独立子设备，添加后两个 App 中可以同步，在「家庭」App 中需要手动将网关调至配对状态，添加子设备后无法直接手动删除。「涂鸦」App 中管理子设备较灵活，可以手动解绑子设备。</p><h2 id="苹果装置控制设备"><a href="#苹果装置控制设备" class="headerlink" title="苹果装置控制设备"></a>苹果装置控制设备</h2><p>网关入网后可以用 iPhone、iPad、Mac 设备控制子设备或查看设备状态，包括 Siri、「家庭」应用、控制中心快捷入口，或者使用 Apple Watch 的「家庭」应用以及 HomePod 或 Apple TV 的 Siri 控制。</p><h2 id="自动化与外网控制"><a href="#自动化与外网控制" class="headerlink" title="自动化与外网控制"></a>自动化与外网控制</h2><p>由于 HomeKit 生态的特殊性，自动化及场景设置主要有两种方式：</p><h3 id="通过-HomeKit-自动化"><a href="#通过-HomeKit-自动化" class="headerlink" title="通过 HomeKit 自动化"></a>通过 HomeKit 自动化</h3><p>HomeKit 需要苹果定义的「家庭中枢」实现自动化，这样做的前提是要有 HomePod、iPad 或 Apple TV 的其中一个设备作为家庭中枢，家庭中枢在本地网络实现自动化和外网访问。</p><h4 id="「家庭」App-自带自动化"><a href="#「家庭」App-自带自动化" class="headerlink" title="「家庭」App 自带自动化"></a>「家庭」App 自带自动化</h4><p>设置好家庭中枢后，可以直接在「家庭」App 中设置自动化。</p><p>以「日出打开窗帘」为例，打开「家庭」App 的「自动化」tab，点击「创建自动化」按钮，选择「某个特定时间」，触发条件选择「日出」，执行设备选择窗帘。状态调整为「打开」，点击「完成」可建立自动化。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_home_auto.png" alt="tuya_hub_home_auto"></p><h4 id="第三方-HomeKit-应用"><a href="#第三方-HomeKit-应用" class="headerlink" title="第三方 HomeKit 应用"></a>第三方 HomeKit 应用</h4><p>比较遗憾的是，「家庭」应用自带的自动化不是很丰富，如「家庭」App 尚未开放用温度或湿度数值作为自动化触发条件，如想设置根据温度或湿度开启冷气或加湿器这样的自动化就不能直接添加了。</p><p>不过苹果有开放其他应用读取家庭数据，有第三方应用可提供复杂的自动化设定，付费的应用有 <a href="https://apps.apple.com/us/app/home-4/id995994352" target="_blank" rel="noopener">Home+ 4</a>、<a href="https://apps.apple.com/us/app/homedash/id1003033186" target="_blank" rel="noopener">HomeDash</a> 等，免费的有 <a href="https://apps.apple.com/us/app/eve-for-homekit/id917695792" target="_blank" rel="noopener">Eve for HomeKit</a>。<a href="https://www.evehome.com/en" target="_blank" rel="noopener">Eve</a> 是一家生产 HomeKit 配件的厂商，他家的 <a href="https://apps.apple.com/us/app/eve-for-homekit/id917695792" target="_blank" rel="noopener">Eve for HomeKit</a> 除了可以接自家的设备（全是 HomeKit 设备）以外，也可以设定很多 HomeKit 的自动化，功能齐全并且免费。</p><p>以「温度高于 30℃打开冷气」为例设置自动化，安装好 Eve for HomeKit 后，打开「自动化」tab 中的「规则」，点击「新增规则」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_eve_auto1.png" alt="tuya_hub_eve_auto1"></p><p>在触发条件中选择「添加触发条件」，选择「温度」，选中要监控的温度计并调整温度至阈值温度，如果需要设置其他触发条件也可以添加，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_eve_auto2.png" alt="tuya_hub_eve_auto2"></p><p>Eve 的自动化是通过建立场景实现的，选择「新增场景」→「新增动作」，在「模式」中找到要控制的空调并调整温度至阈值温度，之后重命名场景，选择一个图标方便辨识。选中这个场景作为执行动作就可以了。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_eve_auto3.png" alt="tuya_hub_eve_auto3"></p><p>建立好自动化之后，在「家庭」App 中也可以看到这个自动化。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_eve_auto4.png" alt="tuya_hub_eve_auto4"></p><h3 id="通过涂鸦-App"><a href="#通过涂鸦-App" class="headerlink" title="通过涂鸦 App"></a>通过涂鸦 App</h3><h3 id="「涂鸦」App-自动化"><a href="#「涂鸦」App-自动化" class="headerlink" title="「涂鸦」App 自动化"></a>「涂鸦」App 自动化</h3><p>如果没有苹果的家庭中枢设备或者感觉 HomeKit 设置麻烦，可以使用涂鸦 App 的自动化功能。无需额外设备，在涂鸦 App 就可以设置各种自动化。</p><p>打开「涂鸦」App 的「智能」tab，选择「创建智能场景」，触发条件依次选择「气象变化时」→「日落日出」→「日出」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_tuya_auto1.png" alt="tuya_hub_tuya_auto1"></p><p>执行动作选择「操作设备」，在设备列表中选中要执行动作的设备，功能依次选择「控制」→「开启」，保存即可建立好自动化。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_tuya_auto2.png" alt="tuya_hub_tuya_auto2"></p><h3 id="两者区别-1"><a href="#两者区别-1" class="headerlink" title="两者区别"></a>两者区别</h3><p>两种方式的区别在于家庭中枢的自动化是本地控制，「涂鸦」 App 的自动化是连接到涂鸦的服务器。对于设置难易度来说，有些自动化「家庭」App 设置起来稍微麻烦一点。就执行效率来说，苹果家庭中枢会更快，且由于本地控制，即使断网，家庭中枢的自动化仍可正常运行。另外，如果注重隐私，可以只用 HomeKit 生态。</p><h2 id="对接其他平台"><a href="#对接其他平台" class="headerlink" title="对接其他平台"></a>对接其他平台</h2><p>网关采用的是涂鸦方案，这个网关也可以接入 Google Assistant、Amazon Alexa 等语音平台，这些语音平台也可以设定一些自动化。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/tuya_hub_cover.png&quot;
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>一分钟给卷珠帘加「魔法」</title>
    <link href="http://yoursite.com/roller_blind/"/>
    <id>http://yoursite.com/roller_blind/</id>
    <published>2021-09-30T00:00:00.000Z</published>
    <updated>2021-09-11T15:19:56.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_cover.png" alt="roller_blind_cover"></p><blockquote><p>我在冰封的深海，找寻希望的缺口。却在午夜惊醒时，蓦然瞥见绝美的月光。——幾米《我的心中每天开出一朵花》</p></blockquote><p>几千年以来，窗帘与人类的生存空间共存，从最简单的兽皮、草席到现在风格与款式的千变万化。窗帘给我们提供遮光、隔熱、保护隱私的功能，在一定程度可以抑制噪音，在白天帮助唤醒，晚上幫助我们睡眠。</p><p>众多窗帘中，可以更加精细化调整光线的窗帘是卷珠帘、百叶帘。相较于卷珠帘可以通过上下调整透光量、百叶帘还可以通过调整窗叶的角度精细调整光线，以上两种窗帘都可以通过卷帘的机械装置向下拉动卷珠调整窗帘透光大小。</p><p>如果卷珠帘接入家庭自动化，就可以根据不同时间调整进入房间的光线，提升每天的生活品质。坊间有不少厂商有出电动窗帘（如<a href="https://www.ikea.cn/cn/zh/cat/dian-dong-juan-lian-44531/" target="_blank" rel="noopener">宜家的电动卷帘</a>），大多数需要整体换窗帘。</p><p>小弟最近有用 <a href="https://detail.tmall.com/item.htm?id=646026082368" target="_blank" rel="noopener">Zemismart 的卷珠帘外挂</a>，可以免去窗帘轨道等一系列繁琐步骤，快速将卷珠帘接入家居自动化平台，赋予卷珠帘「魔法」。</p><h2 id="适用范围"><a href="#适用范围" class="headerlink" title="适用范围"></a>适用范围</h2><p>Zemismart 的卷珠帘外挂由电机、遥控器、发射器、转轴齿轮配件组成。电机转动卷珠（可通过转轴齿轮配件适配不同卷珠），发射器与遥控器可发送转动指令，发射器可将窗帘接入到各语音平台。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_pic.png" alt="roller_blind_pic"></p><p>基于巧妙的设计，Zemismart 的这个外挂适配市面上几乎所有用卷珠帘滚轮机械的各种 blind，如百叶帘（Venetian blind）、垂直帘（Vertical blind）、蜂窝帘（Honeycomb blind）等，以及各种 shade，如三色帘（Triple shade）、卷帘（Roller shade）、斑马帘（Zebra shade）等。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_type.png" alt="roller_blind_type"></p><p>另外比较酷的是，这款产品已内置电池，无需考虑插座布线供电。</p><h2 id="安装与接入-OEM"><a href="#安装与接入-OEM" class="headerlink" title="安装与接入 OEM"></a>安装与接入 OEM</h2><h3 id="版本差异"><a href="#版本差异" class="headerlink" title="版本差异"></a>版本差异</h3><p>产品有分涂鸦版与米家版：涂鸦版使用的是 915mHz 射频，发射器是涂鸦固件，可通过涂鸦固件对接天猫、Amazon Alexa、Google Assistant等语音平台。米家版使用的是蓝牙协议，可直接接入米家 App，与米家生态的各种设备联动。两版本均无法直接接入 Apple HomeKit，但可以通过 Shortcuts 使用 Siri 语音命令控制。两版本除协议及固件有差异，其余无显著差异。</p><h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><p>相较于其他的窗帘需要换轨道的复杂繁琐操作，这款产品安装很简单。首先使用卡针长按电机的「set」键（这个键确切地说是 power 键）待蓝色灯闪烁一下即开机。此时按动电机上的按钮齿轮即转动，按动遥控器按钮齿轮也可转动。</p><p>将将电机头部的外壳取出，卷珠帘的卷珠套入电机齿轮，看齿轮可否带动卷珠转动，带不动可更换转轴配件。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_roller.png" alt="roller_blind_roller"></p><p>套好卷珠后可将电机用胶或者用附送的螺丝将电机固定在墙上，注意将卷珠及电机在同一平面，即窗帘与卷珠尽量保持垂直，电机后的背板的后盖底部轻向上掀可以分离，另外，产品有附盖板贴纸帮助确定打孔或粘贴位置。背板固定好之后，将电机挂好珠子，电机卡进背板，完成即完成，</p><h3 id="接入米家-App"><a href="#接入米家-App" class="headerlink" title="接入米家 App"></a>接入米家 App</h3><p>米家版接入米家 App 很简单，首先将发射器通电，用卡针长按上面的「set」键约 5 秒，待蓝灯闪烁。</p><p>打开米家 App ，点击右上角「+」选择「扫描」中可以扫描到（请确保系统蓝牙已打开且授权米家 App 使用蓝牙），</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_mijia1.png" alt="roller_blind_mijia1"></p><p>之后按步骤填入 WiFi 名称及密码即可，注意 WiFi 确保是 2.5Ghz。</p><p>接入之后可以设定上下滚动距离，在窗帘页面右上角点击「…」，进入设置页面选择「设置距离」，进入「距离设置」页面，可以先清除距离设置，将窗帘手拉至最低或最高，之后按动电机或遥控器将窗帘升或降至最高或最低，按下遥控器的「暂停」键，并在 App 中点击「最低」或「最高」，设置好最高后依法配置最低点。另外，「设置」页面还有一个翻转选项，可以按实际是否打开，使最终 App 中的「打开窗帘」与实际的「打开窗帘」一致。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_mijia2.png" alt="roller_blind_mijia2"></p><h3 id="接入涂鸦-App"><a href="#接入涂鸦-App" class="headerlink" title="接入涂鸦 App"></a>接入涂鸦 App</h3><p>若使用天猫等语音助理，可以通过先接入涂鸦 App 再对接语音平台，首先将发射器插入 USB 充电器，用卡针长按「set」键约 5 秒，看到蓝灯闪烁。</p><p>下载安装 Tuya Smart 应用，点击右上角「+」按钮，选择「小型家庭装置」中的「窗帘 Wifi」，之后按步骤填入 WiFi 名称及密码，注意 WiFi 确保是 2.5Ghz。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_tuya1.png" alt="roller_blind_tuya·"></p><p>接入之后可以设定上下滚动距离，在窗帘页面右上角点击「更多」，进入设置页面选择「设置距离→「上限设置」，可以先清除距离设置，将窗帘手拉至最低或最高，之后按动电机或遥控器将窗帘升或降至最高或最低，按下遥控器的「暂停」键，并在 App 中点击「最低」或「最高」，设置好最高后依法配置最低点。另外，「设置」页面还有一个翻转选项，可以按实际是否打开，使最终 App 中的「打开窗帘」与实际的「打开窗帘」一致。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_tuya2.png" alt="roller_blind_tuya2"></p><h2 id="小贴士"><a href="#小贴士" class="headerlink" title="小贴士"></a>小贴士</h2><p>1、电机转速有两档</p><p>这款产品转速有两档，默认按下「上升」键是慢速，转速慢且噪音小，再次按下「上升」键是快速，转速快且噪音稍大。快速、慢速上升下降在电机按钮、遥控器及 App 中均适用。</p><p>2、米家版联动示例</p><p>如果之前有买过米家生态的产品，米家版的可以与之前购买的产品一起使用，产生最大收益，联动示例：</p><ul><li>定时开关窗帘</li><li>使用米家无线开关、米家魔方控制窗帘开关</li><li>当气温超过 35℃ 时自动关闭窗帘</li><li>当打开空调时自动关闭窗帘</li><li>设置「晚安」模式关闭窗帘</li></ul><p>3、遥控器背板有附磁铁</p><p>遥控器背板有附磁铁，可吸附在含铁的背板上（如冰箱上）防止找不到。</p><h2 id="使用-Siri-控制窗帘"><a href="#使用-Siri-控制窗帘" class="headerlink" title="使用 Siri 控制窗帘"></a>使用 Siri 控制窗帘</h2><p>窗帘外挂无法直接接入 Apple HomeKit，但可以通过 Shortcuts 使用 Siri 语音命令控制。</p><h3 id="米家使用-Siri"><a href="#米家使用-Siri" class="headerlink" title="米家使用 Siri"></a>米家使用 Siri</h3><p>米家版使用 Siri 控制主要有两个步骤：</p><p>首先新建一个「手动执行窗帘打开/关闭」的自动化，在米家 App 首页点击「自动化」标签，之后点击右上角「+」按钮，在条件中选择「手动执行」，行动中选择「Zemismart 窗帘」，之后选择动作并保存。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_mijia3.png" alt="roller_blind_mijia3"></p><p>之后在「自动化」标签中可以看到新建的自动化，点击右上角的「添加至 Siri」入口，输入语音命令如「帮我打开窗帘」之后保存。保存好之后可以试试用 Siri 是否可以正常启动命令。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_mijia4.png" alt="roller_blind_mijia4"></p><h3 id="涂鸦使用-Siri"><a href="#涂鸦使用-Siri" class="headerlink" title="涂鸦使用 Siri"></a>涂鸦使用 Siri</h3><p>涂鸦版使用 Siri 控制与米家版相似，也是新建一个「手动执行窗帘打开/关闭」的自动化，再将这个命令添加至 Siri。</p><h2 id="接入-Home-Assistant"><a href="#接入-Home-Assistant" class="headerlink" title="接入 Home Assistant"></a>接入 Home Assistant</h2><p>米家固件、涂鸦固件都支持接入 Home Assistant。</p><h3 id="使用涂鸦组件接入"><a href="#使用涂鸦组件接入" class="headerlink" title="使用涂鸦组件接入"></a>使用涂鸦组件接入</h3><p>目前涂鸦组件接入有三种方式，旧涂鸦组件、涂鸦组件 v2 及 <a href="https://github.com/rospogrigio/localtuya" target="_blank" rel="noopener">localtuya</a>。最简单的是旧涂鸦组件，直接在 integration 中搜索「tuya」，带组件安装完成后输入国家编号、涂鸦用户名邮箱、涂鸦密码即可。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_ha1.png" alt="roller_blind_ha1"></p><p>添加后可以看到添加的窗帘设备，不过似乎不能百分比控制。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_ha2.png" alt="roller_blind_ha2"></p><p>涂鸦组件 v2 是涂鸦官方与 Home Assistant 出的组件，需要先在 HACS 或手动安装。</p><p>localtuya 是本地获取涂鸦设备 token，免连涂鸦服务器，相应更迅速，隐私性更好，需要先在 HACS 或手动安装，之后获取设备 token，由此接入窗帘支持百分比控制。</p><h3 id="使用-Miiot-组件接入"><a href="#使用-Miiot-组件接入" class="headerlink" title="使用 Miiot 组件接入"></a>使用 Miiot 组件接入</h3><p>米家设备接入 Home Assistant 方式很多，比较简单的是利用 <a href="https://github.com/al-one/hass-xiaomi-miot" target="_blank" rel="noopener">Xiaomi Miot Auto</a>，可以手动或在 HACS 安装，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_ha3.png" alt="roller_blind_ha3"></p><p>重启后在在 integration 中搜索「xiaomi」，选择「Xiaomi Miot Auto」，填写小米账号及密码，国家选择「中国」即可将米家设备接入 Home Assistant。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_ha4.png" alt="roller_blind_ha4"></p><p>接入后可以看到窗帘设备，暂时不支持百分比控制。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_ha5.png" alt="roller_blind_ha5"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/roller_blind_cover.png&quot;
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>电视增加超酷的 Ambilight</title>
    <link href="http://yoursite.com/ambilight/"/>
    <id>http://yoursite.com/ambilight/</id>
    <published>2021-05-16T00:00:00.000Z</published>
    <updated>2021-06-15T05:06:10.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_new_cover.png" alt="ambilight_new_cover"></p><p><a href="https://www.philips.com.tw/c-m-so/tv/ambilight/latest" target="_blank" rel="noopener">Ambilight</a> 是 Philips 在自家电视或显示器的特别的酷设计，电视边框有彩灯带，灯会随屏幕边缘显示内容同步颜色。另外，飞利浦还出过一个 <a href="https://www.lighting.philips.com.hk/zh/consumer/p/hue-play-hdmi-sync-box-/8718699707248" target="_blank" rel="noopener">Philips Hue Play HDMI Sync Box</a> 。Philips 对 Ambilight 的解释：</p><blockquote><p>情境光源(Ambilight) 是飞利浦的独特功能，会将柔和光源投射到电视周围的墙壁，依照画面的色彩与亮度自动变化。 情境光源可以改善感应到的对比度、色彩与细节，产生观看大萤幕的错觉。 而且，因为是较为放松的观赏体验，经证实可减少眼睛疲劳。</p></blockquote><h2 id="在-Android-TV-上安装"><a href="#在-Android-TV-上安装" class="headerlink" title="在 Android TV 上安装"></a>在 Android TV 上安装</h2><p>在 Android TV 上主要是通过一个开源项目 <a href="https://github.com/hyperion-project/hyperion.ng" target="_blank" rel="noopener">Hyperion</a> 实现，这个项目可以选择有线或无线连接，有线连接的好处是可以播放有 DRM 的内容，包括 Netflix、HBO、Disney+ 这类流媒体服务，缺点是需要 HDMI 采集卡及树莓派。目前 HDMI 采集卡 1080P 价格较便宜，4K 价格稍贵，可按需选择。如果选择无线连接，无需 HDMI 采集卡，但是无法识别有 DRM 的媒体内容。</p><p>小弟没有采集卡测试，以下步骤是通过无线连接方式实现电视的 Ambilight 效果，主要原理是 Android TV 通过应用 <a href="https://github.com/abrenoch/hyperion-android-grabber" target="_blank" rel="noopener">Android Screen Grabber</a> 抓取屏幕边缘信息并发送至 Hyperion（运行在群晖），Hyperion 再将 UDP 数据包同步至 WLED（通过 ESP8266 控制）。</p><h3 id="灯带计算"><a href="#灯带计算" class="headerlink" title="灯带计算"></a>灯带计算</h3><p>坊间比较参见的灯带是 WS2812B 或 WS2811 灯带，灯带上都有焊好 LED 灯，两种灯带主要区别是电压，WS2812B 灯带的工作电压为 5V，WS2811 灯带工作电压为 5V 。</p><p>灯带有不同级别的保护，可以按需选择。最常见的情况是 IP20-30（可以防止固体颗粒进入）、IP65（可以防止灰尘和水蒸气进入）、IP67（可以防灰尘以及部分或短期浸入水中至 1m 深度），基材颜色有黑色、白色两种。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_led_style.png" alt="ambilight_led_style"></p><p>灯带每米的 LED 数量不同。通常每一米有 144、60、30 颗等等。一般每米灯泡密度越高，环境光分辨率越大，最大亮度也就越大。同时，项目中的 LED 越多，电源方案就会越复杂，且需要更多的电流。</p><p>小弟建议用尺子量一下电视的边长，确定是要环绕边框的一边、两边、三边还是四边，进而确定用几米灯带及多少颗灯泡。如果系统中的LED总数不超过 120 个，则选择 WS2812B。如果大于 120 个，建议选工作电压为 12V 的 WS2811。</p><p>两种灯带最大功耗大约为 0.3 瓦，电源不应小于 N×0.3 瓦（N 是项目中 LED 的数量）。例如，一台 42 英寸电视，选择 WS2812B LED 灯带，每米 30 个 LED，需要 3 米 LED 灯带（屏幕四边均安装），最大功率为 0.3×3×30=27 瓦，所需电流为 27/5≈6A，所以应该准备一个 5V 6A的电源。</p><p>另外。如果 LED 灯条较长，电压会有损耗，尤其是在使用 5V 灯带时。建议 5 V 时每消耗 10 W 和 12 V 时每消耗 25 W 单独配电源。</p><h3 id="所需元件"><a href="#所需元件" class="headerlink" title="所需元件"></a>所需元件</h3><p>1、D1 Mini（或 ESP 8266）</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/ambilight_component1.png" alt="ambilight_component1"></p><p>2、WS2812B 或 WS2811 灯带</p><p>灯带一般是按米卖，长度需测量</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/ambilight_component2.png" alt="ambilight_component2"></p><p>3、5V 或 12V 电源</p><p>电流根据灯泡总功率决定</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/ambilight_component3.png" alt="ambilight_component3"></p><p>4、DC 直流电源插头公头母座圆孔</p><p>直径需与电源匹配</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/ambilight_component4.png" alt="ambilight_component4"></p><p>5、杜邦线若干</p><p>建议公对公、公对母、母对母都备一些，方便延长，至少准备公对母的杜邦线</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/ambilight_component5.png" alt="ambilight_component5"></p><p>6、3PIN 灯带免焊连接卡扣（非必须）</p><p>非必须，用于连接灯带，可用焊接代替</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/ambilight_component6.png" alt="ambilight_component6"></p><p>7、3PIN 灯带免焊连接器 T 型（非必须）</p><p>非必须，用于连接折角的灯带，可以弯折灯带或焊接代替</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/ambilight_component7.png" alt="ambilight_component7"></p><h3 id="安装-Hyperion"><a href="#安装-Hyperion" class="headerlink" title="安装 Hyperion"></a>安装 Hyperion</h3><p>安装 Hyperion 有很多种方法，下面介绍两种：</p><h4 id="通过群晖-Docker-安装"><a href="#通过群晖-Docker-安装" class="headerlink" title="通过群晖 Docker 安装"></a>通过群晖 Docker 安装</h4><p>打开群晖 Docker，在「注册表」中搜索「mumpfnix」，选择 <code>mumpfnix-hyperion.ng</code>，并下载，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_docker1.png" alt="ambilight_docker1"></p><p>等待 image 下载完成（下载完成群晖会有通知），在「映像」中找到映像 <code>mumpfnix-hyperion.ng:latest</code>，点击「启动」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_docker2.png" alt="ambilight_docker2"></p><p>选择「高级设置」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_docker3.png" alt="ambilight_docker3"></p><p>可以新建一个文件夹存放配置文件，名字任意，如 <code>hyperion</code>，在「卷」中添加路径，映射为 <code>/root/.hyperion</code>，这个路径会存放 Hyperion 的配置文件，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_docker4.png" alt="ambilight_docker4"></p><p>在「端口」中开放 <code>6080</code>、<code>19444</code>、<code>19445</code> 三个端口，并启动容器。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_docker5.png" alt="ambilight_docker5"></p><p>在浏览器访问地址 <code>http://群晖地址:6080</code> 可以看到 Hyperion 配置页面说明成功安装。如果安装过程中遇到问题可以查阅 <a href="https://docs.hyperion-project.org/" target="_blank" rel="noopener">Hyperion 文档</a>。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_hyperion_web.png" alt="ambilight_hyperion_web"></p><h4 id="通过-Home-Assistant-插件安装"><a href="#通过-Home-Assistant-插件安装" class="headerlink" title="通过 Home Assistant 插件安装"></a>通过 Home Assistant 插件安装</h4><p>在  Home Assistant 的 Supervisor 中点击右上角三个点按钮，选择「库」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_hyperion_ha1.png" alt="ambilight_hyperion_ha1"></p><p>添加库的地址 <code>https://github.com/bradsjm/hassio-addons</code>，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_hyperion_ha2.png" alt="ambilight_hyperion_ha2"></p><p>在插件列表中找到 <code>Hyperion.NG</code> 并安装即可。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_hyperion_ha3.png" alt="ambilight_hyperion_ha3"></p><h3 id="刷入固件"><a href="#刷入固件" class="headerlink" title="刷入固件"></a>刷入固件</h3><p>ESP8266 通过刷入 <a href="https://github.com/Aircoookie/WLED" target="_blank" rel="noopener">WLED 固件</a>来控制灯带，刷入固件很容易：</p><p>1.首先要下载相应模块的驱动，若是 D1 mini，请前往<a href="https://wiki.wemos.cc/downloads" target="_blank" rel="noopener">这里</a>下载，若是 NodeMCU 请前往<a href="https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers" target="_blank" rel="noopener">这里</a>下载。</p><p>2.下载安装 <a href="https://github.com/marcelstoer/nodemcu-pyflasher/releases" target="_blank" rel="noopener">NodeMCU PyFlasher</a> 及控制端 <a href="https://github.com/Aircoookie/WLED/releases/tag/v0.9.1" target="_blank" rel="noopener">WLED 固件</a>，选择 <a href="https://github.com/Aircoookie/WLED/releases/download/v0.9.1/WLED_0.9.1_ESP8266.bin" target="_blank" rel="noopener"><code>WLED_版本号_ESP8266.bin</code></a>`将模块用 MicroUSB 数据线连接至电脑 USB 口，选择好端口及固件路径，点击「刷入」，之后等待刷武完成。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_esptool.png" alt="ambilight_esptool"></p><h3 id="连线与安装"><a href="#连线与安装" class="headerlink" title="连线与安装"></a>连线与安装</h3><h4 id="连线"><a href="#连线" class="headerlink" title="连线"></a>连线</h4><p>首先按照以下连接 ESP8266 与灯带，注意一定要灯带「进箭头」的方向：</p><table><thead><tr><th>灯带</th><th>ESP8266</th></tr></thead><tbody><tr><td>5V（一般为红色）</td><td>VIN</td></tr><tr><td>GND（一般为绿色）</td><td>GND</td></tr><tr><td>DIN（一般为白色）</td><td>D4</td></tr></tbody></table><p>之后将灯带的另外红线与白线连接至 DC 电流头正负极（注意不要接反），连接好再次确认是进箭头「进箭头」的方向。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_wire.png" alt="ambilight_wire"></p><p>如果一切顺利，连接好电源，前 30 个 LED 将亮起亮橙色。</p><h4 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h4><p>将电视翻到背面，将灯带粘到电视的边框。若灯带不够长，可以在铜触点位置将灯带剪断，用灯带连接卡扣将两端的铜触点连接或者直接焊接铜触点。</p><p>折角地方可以直接弯折灯带或者用折角卡扣或者焊接。注意连接灯带时一定要沿着箭头方向连接 LED 灯带。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/ambilight_wire_tv.png" alt="ambilight_wire_tv"></p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/ambilight_wire_tv2.png" alt="ambilight_wire_tv2"></p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic4@master/uPic/ambilight_wire2.png" alt="ambilight_wire2"></p><p>安装好之后将每一边的灯泡数目记下来备用。</p><h3 id="WLED-配置"><a href="#WLED-配置" class="headerlink" title="WLED 配置"></a>WLED 配置</h3><p>将刷好固件的 ESP8266 通电，可以看到名为 <code>WLED-AP</code> 的 AP，连入这个 WiFi（密码是 <code>wled1234</code>)，连接成功后会振动打开 IP 为 <code>4.3.2.1</code> 的地址，点击其中的「WiFi 设置」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_wled_setting0.png" alt="ambilight_wled_setting0"></p><p>将 WiFi 的 SSID 及密码填入并保存，之后 ESP8266 将联网，在路由器后台找到 ESP8266 的 IP 地址并在浏览器打开，打开后可以看到 WLED 的控制介面，选择「配置」→「LED 配置」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_wled_setting2.png" alt="ambilight_wled_setting2"></p><p>填写用到的灯泡总数，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_wled_setting3.png" alt="ambilight_wled_setting3"></p><p>在这一页的下面的「变换」中取消勾选「淡入淡出」，配置好之后保存。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_wled_setting4.png" alt="ambilight_wled_setting4"></p><h3 id="Hyperion-配置"><a href="#Hyperion-配置" class="headerlink" title="Hyperion 配置"></a>Hyperion 配置</h3><p>在浏览器打开 Hyperion 配置页面 <code>http://群晖地址:6080</code> ，选择「配置」→「LED 硬件」的「LED 控制端」标签中，控制类型选择「wled」，之后填入灯泡总数及 IP 地址，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_hyperion1.png" alt="ambilight_hyperion1"></p><p>在「LED 层」标签中填入上、下、左、右的灯泡数目及输入位置，点击保存可以在右侧看到预览，调整参数使预览符合真实的灯泡位置，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_hyperion2.png" alt="ambilight_hyperion2"></p><p>在「配置」→「网络服务」中，确保「端口缓冲服务器」打开并开放端口。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_hyperion3.png" alt="ambilight_hyperion3"></p><h3 id="Android-TV-配置"><a href="#Android-TV-配置" class="headerlink" title="Android TV 配置"></a>Android TV 配置</h3><p>Android TV 需要安装  <a href="https://github.com/abrenoch/hyperion-android-grabber" target="_blank" rel="noopener">hyperion-android-grabber</a> 这个应用，到<a href="https://github.com/abrenoch/hyperion-android-grabber/releases/tag/v1.0" target="_blank" rel="noopener">这里</a>下载好 apk 安装包并导入Android TV 安装，安装完成打开可以自动搜索到 Hyperion 服务器，之后在配置中需要修改横向、纵向灯泡数目，以及消息优先级调整为 <code>150</code>。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_tv_setting1.png" alt="ambilight_tv_setting1"></p><p>保存后若灯带随屏幕示例颜色变化而变化说明配置成功。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_tv_setting2.png" alt="ambilight_tv_setting2"></p><h3 id="应用兼容性"><a href="#应用兼容性" class="headerlink" title="应用兼容性"></a>应用兼容性</h3><p>比较遗憾的是，这种无线连接的方式无法抓取有 DRM 的内容。大多数流媒体应用可以在选择电影或剧集时抓取到屏幕边缘信息，播放媒体时就无法显示。</p><p>默认官方 Youtube 应用无法抓取，第三方 <a href="https://smartyoutubetv.github.io/" target="_blank" rel="noopener">Smart YouTube TV</a> 可以。</p><h2 id="在电脑上安装"><a href="#在电脑上安装" class="headerlink" title="在电脑上安装"></a>在电脑上安装</h2><p>在电脑（PC、Mac 都可以）上可以通过 <a href="https://github.com/psieg/Lightpack" target="_blank" rel="noopener">Prismatik</a> 这款应用实现 Ambilight 效果，无需配置 Hyperion。</p><p>安装方法与在电视上安装方法相似，需要在电脑屏幕边缘装好灯带，之后到<a href="https://github.com/psieg/Lightpack/releases/" target="_blank" rel="noopener">这里</a>下载安装 Prismatik，打开设置，在「设备」中选择「运行配置向导」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_pc_setting1.png" alt="ambilight_pc_setting1"></p><p>填入 WLED 的 IP 地址，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_pc_setting2.png" alt="ambilight_pc_setting2"></p><p>填入灯泡总数、顶部、两侧、底部灯泡数、开始灯泡，点击「应用」可预览效果，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_pc_setting3.png" alt="ambilight_pc_setting3"></p><p>设置完成后选中「屏幕抓取」模式配置完成。</p><h2 id="接入-Home-Assistant"><a href="#接入-Home-Assistant" class="headerlink" title="接入 Home Assistant"></a>接入 Home Assistant</h2><h3 id="WLED-接入"><a href="#WLED-接入" class="headerlink" title="WLED 接入"></a>WLED 接入</h3><p>正常情况下 Home Assistant 可以自动发现 WLED，之后 WLED 可以以彩色灯泡接入 HomeKit、Google Home 和 Alexa。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_wled_integration.png" alt="ambilight_wled_integration"></p><h3 id="Hyperion-接入"><a href="#Hyperion-接入" class="headerlink" title="Hyperion  接入"></a>Hyperion  接入</h3><p>Hyperion 可以以 integration 的形式接入，在 Home Assistant 「配置」→「 Integration」中点击「添加  Integration」，搜索「hyperion」，填入群晖 IP 地址即可。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_hyperion_integration1.png" alt="ambilight_hyperion_integration1"></p><p>接入后可以控制 Hyperion 开关。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_hyperion_integration2.png" alt="ambilight_hyperion_integration2"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ambilight_new_cover.png&quot; alt=&quot;ambilight_new_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>群晖做超酷的录像机——免订阅+隐私保护+接入 HA</title>
    <link href="http://yoursite.com/cam/"/>
    <id>http://yoursite.com/cam/</id>
    <published>2021-05-01T00:00:00.000Z</published>
    <updated>2021-05-24T13:50:27.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_cover.png" alt="cam_cover"></p><p><a href="https://www.netflix.com/title/70264888" target="_blank" rel="noopener">《黑镜》</a> 里有好几个关于摄像头隐私的故事，在新世纪，摄像头带来了「方便」，也给带来隐私方面的挑战。隐私问题在超级大国熊猫国尤其是个大问题，当权者对被统治者有深深的恐惧，用尽全力获取被统治者的一切行踪。还会强制要求各种提供服务的厂商上传用户资料，其中一个知名的例子是强制苹果中国公司将服务器设在中国贵州。</p><p>比较安全且方便地使用摄像头监控的方法之一是本地局域网控制查看摄像头，外网访问利用公网 IP+DDNS，同时拒绝摄像头联外网并停用云存储功能。可以达到这一目的的成熟方案之一是利用群晖的 <a href="https://www.synology.com/zh-tw/surveillance" target="_blank" rel="noopener">Surveillance Station</a>（<a href="https://demo.synology.com/zh-tw/surveillance?utm_source=feature&utm_medium=mobile" target="_blank" rel="noopener">此处</a>可以在线体验群晖 Surveillance Station），具有直觉操作的使用者界面，因应各类情境的应用程式（即时影像警报系统、时间轴录影回放、电子地图等），可透过内部或外部网络、电脑、手机随时随地存取。</p><h2 id="接入群晖"><a href="#接入群晖" class="headerlink" title="接入群晖"></a>接入群晖</h2><h3 id="使用旧手机"><a href="#使用旧手机" class="headerlink" title="使用旧手机"></a>使用旧手机</h3><p>可以直接使用旧手机摄像头接入群晖，接入方法非常简单。首先群晖安装好 Surveillance Station 套件(套件中心搜索 Surveillance Station 安装即可)，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_dsm_ss.png" alt="cam_dsm_ss"></p><p>手机下载安装好「<a href="https://www.synology.com/zh-tw/surveillance/feature/mobile#LiveCam" target="_blank" rel="noopener">LiveCam</a>」，填入群晖地址、用户名、密码即可，群晖会自动连接这个摄像头。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_dsm_livecam.png" alt="cam_dsm_livecam"></p><h3 id="使用摄像头"><a href="#使用摄像头" class="headerlink" title="使用摄像头"></a>使用摄像头</h3><h4 id="1、摄像头推荐"><a href="#1、摄像头推荐" class="headerlink" title="1、摄像头推荐"></a>1、摄像头推荐</h4><p>群晖原生支援所有主流影音编码，及来自逾 130 个厂牌、超过 7600 种摄影机及录影服务器，<a href="https://www.synology.com/zh-tw/compatibility/camera" target="_blank" rel="noopener">在此</a>可以检视完整的相容性清单。</p><p>群晖支援 <a href="https://www.onvif.org" target="_blank" rel="noopener">ONVIF</a> (the Open Network Video Interface Forum）协议，ONVIF 是一个通用协议，只要摄像头支援 ONVIF 大概率可以接入群晖。</p><p>目前 CP 值比较高、支持 ONVIF 的摄像头是 <a href="https://security.tp-link.com.cn/" target="_blank" rel="noopener">TP-LINK 的摄像头</a>。小弟手里有一台 <a href="https://www.tp-link.com.cn/product_1917.html?smb" target="_blank" rel="noopener">TP-LINK 的 TL-IPC43CA</a>：</p><ul><li><p>支持 ONVIF 协议；</p></li><li><p>最高分辨率 2304*1296，可输出300万像素画面；</p></li><li><p>支持云台转动，水平 360°，垂直 114°；</p></li><li><p>带夜视功能，夜视带彩；</p></li><li><p>支持 WiFi 连接与以太网口连接；</p></li><li><p>CP 值高，淘宝售价 ￥130 左右。</p></li></ul><h4 id="2、利用-ONVIF-接入"><a href="#2、利用-ONVIF-接入" class="headerlink" title="2、利用 ONVIF 接入"></a>2、利用 ONVIF 接入</h4><p>下载 TP-LINK 摄像头的手机端 <a href="https://security.tp-link.com.cn/service/detail_download_6737.html" target="_blank" rel="noopener">TP-LINK 安防</a>（注意此应用在美区 App Store 及Google Play 未上架），手机安装好后用<strong>电子邮箱</strong>注册，按步骤配置网络。</p><p>电脑浏览器打开群晖 Surveillance Station，打开应用程序 IP Camera，点击「添加」→「添加摄像头」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_add1.png" alt="cam_add1"></p><p>选择「快速配置」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_add2.png" alt="cam_add2"></p><p>在添加页面中的 IP 地址点击搜索图标，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_add3.png" alt="cam_add3"></p><p>群晖会找到局域网内支持的摄像头，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_add4.png" alt="cam_add4"></p><p>默认 TP-LINK 摄像头用户名为 <code>admin</code>，密码为空，点击下一步即可添加。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_add5.png" alt="cam_add5"></p><p>添加摄像头之后可以实时查看摄像头串流，制定录像规则等等。手机可以下载 <a href="https://www.synology.com/zh-tw/surveillance/feature/mobile" target="_blank" rel="noopener">DS cam</a> 实时查看串流和录像。</p><p>需要注意的是，群晖 Surveillance Station 默认只支持两个摄像头接入，2 个以上接入需要授权。</p><h4 id="3、必做调整"><a href="#3、必做调整" class="headerlink" title="3、必做调整"></a>3、必做调整</h4><h5 id="①-分辨率调整"><a href="#①-分辨率调整" class="headerlink" title="① 分辨率调整"></a>① 分辨率调整</h5><p>小弟的这个摄像头接入群晖默认分辨率达不到  2304*1296，其中的原因是摄像头默认开启 H265，而群晖只支持 H264，需要修改摄像头配置，步骤如下：</p><p>电脑浏览器输入摄像头 IP 地址进入摄像头配置页面，用户名 <code>admin</code>，密码默认为空，在<code>设置→摄像头→视音频</code>中调整视频编码为  <code>H264</code>，分辨率为  <code>2304*1296</code> 并保存。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_resolution1.png" alt="cam_resolution1"></p><p>在群晖摄像头配置中，选择 <code>设备设置→视频</code>，在「串流 1 」中，分辨率选择  <code>2304*1296</code> 并保存。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_resolution2.png" alt="cam_resolution2"></p><p>设置完成后即可看到 2304*1296 的高画质画面。</p><p>② 云台参数调整</p><p>群晖支持云台控制，但在这款摄像头上有问题，点一下方向按钮会一直转到底，而不是一段距离一段距离地移动，可以通过以下步骤修改配置：</p><p>在群晖摄像头列表中，点击<code>配置→导出</code>，选择导出路径、摄像头，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_export.png" alt="cam_export"></p><p>导出完成后，在导出的文件夹中找到 <code>.Exp@SSCap</code> 路径下的 <code>名称_IP 地址</code>文件，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_export2.png" alt="cam_export2"></p><p>用文本编辑器打开，将里面的 pan、tilt、zoom 、focus 参数改为 <code>absolute</code></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">pan &#x3D; absolute</span><br><span class="line">tilt &#x3D; absolute</span><br><span class="line">zoom &#x3D; absolute</span><br><span class="line">focus &#x3D; absolute</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_export3.png" alt="cam_export3"></p><p>修改完成之后在摄像头列表点击<code>配置→导入</code>，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_inport1.png" alt="cam_inport1"></p><p>选择修改后的配置，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_inport2.png" alt="cam_inport2"></p><p>设置完成后可以测试是否可以一段距离地移动。</p><h2 id="隐私保护"><a href="#隐私保护" class="headerlink" title="隐私保护"></a>隐私保护</h2><p>摄像头有很大的隐私隐患，尤其是在熊猫国，中国各厂商的摄像头只要联网都非常不安全，比较简单有效的处理方法是禁止摄像头联网，各种控制管理在群晖进行。</p><p>OpenWrt 系统禁止摄像头联外网方法很简单，在<code>网络→防火墙→自定义规则</code>中添加一条规则就可以（AA:BB:CC:DD:EE:FF 为摄像头 MAC 地址）：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">iptables -I FORWARD  -m mac --mac-source AA:BB:CC:DD:EE:FF -j DROP</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_firewall.png" alt="cam_firewall"></p><p>添加完成可以打开「TP-LINK 安防 App」 ，若显示「未连接」说明规则生效。可以安心使用摄像头。</p><p>添加规则之后摄像头无法连接外网，但仍可在局域网被访问，使用群晖各端可以查看摄像头，利用公网 IP+ DDNS 或群晖自带 QuickConnect 可以外网访问。</p><h2 id="接入-Home-Assistant"><a href="#接入-Home-Assistant" class="headerlink" title="接入 Home Assistant"></a>接入 Home Assistant</h2><h3 id="利用群晖接入"><a href="#利用群晖接入" class="headerlink" title="利用群晖接入"></a>利用群晖接入</h3><p>可以通过群晖组件直接将 摄像头接入 Home Assistant，在 integration 中选择添加，搜索 <code>synology</code>，填入群晖地址、用户名、密码，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_ha.png" alt="cam_ha"></p><p>添加群晖组件后即可看到摄像头，如果接入的 ONVIF 摄像头有支援传感器也会一起显示（小弟的这款没有），</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_ha2.png" alt="cam_ha2"></p><p>另外还有一个群晖 Surveillance Station 「回家模式」开关传感器。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_ha3.png" alt="cam_ha3"></p><h3 id="motionEye-插件"><a href="#motionEye-插件" class="headerlink" title="motionEye 插件"></a>motionEye 插件</h3><p>另外可以利用 motionEye 插件查看摄像头 ，在 Supervisor 中找到 motionEye 插件并安装，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_motioneye1.png" alt="cam_motioneye1"></p><p>安装完成之后打开 UI，之后添加摄像头，选择「网络摄像头」，URL 填入<code>rtsp://摄像头 IP:554/stream1</code>即可添加。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_motioneye2.png" alt="cam_motioneye2"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/cam_cover.png&quot; alt=&quot;cam_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>Google 艺文的使用</title>
    <link href="http://yoursite.com/google_art/"/>
    <id>http://yoursite.com/google_art/</id>
    <published>2021-04-03T00:00:00.000Z</published>
    <updated>2021-05-24T13:52:37.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/google_art_cover.png" alt="google_art_cover"></p><h2 id="艺术的慰藉"><a href="#艺术的慰藉" class="headerlink" title="艺术的慰藉"></a>艺术的慰藉</h2><p>进入 20 世纪，科学强势发展，宗教影响日益式微。信仰宗教的人减少，但人们面对生命的终极课题越来越困惑，解决这个问题的途径之一是借助于艺术，才子作家阿兰·德波顿在<a href="https://www.books.com.tw/products/0010642359" target="_blank" rel="noopener">《艺术的慰藉》</a>一书中曾论述艺术有七大功能：</p><p>1.矫正记忆的缺陷</p><p>艺术能够把经验的果实变得令人难忘，而且还能不断以新面貌重现。</p><p>2.散播希望</p><p>艺术让我们随时都能看得到令人愉悦开心的事物。</p><p>3.呈现有尊严的哀愁</p><p>艺术提醒我们，哀愁在美好人生中也占有一席之地，因此我们比较不会对自己遭遇的困难感到恐慌。</p><p>4.协助我们取得平衡</p><p>艺术以异常清晰的象征体现我们良好特性的本质，引导我们發挥自己最优秀的潜力。</p><p>5.引导我们认识自我</p><p>艺术能够帮助我们辨识出对我们具有核心重要性，却又难以形诸言词的事物。我们可以拿起艺术作品，以困惑但认真的态度说：「这就是我。」</p><p>6.扩展我们的经验</p><p>艺术是他人的经验透过极度精致的方式累积而成的结果。我们在艺术中可以找到其他文化的鲜明范例，因此亲近艺术作品能够扩展我们对自己以及世界的概念。</p><p>7.唤醒麻木的心灵</p><p>艺术能够剥开我们的外壳，把我们从习以为常的泥沼中拉出来，不再对自己身周的一切视而不见。</p><h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p><a href="https://artsandculture.google.com/" target="_blank" rel="noopener">Google Arts &amp; Culture</a> 是 Google 开發的在线艺术平台，各地区博物馆、艺廊等组织合作，利用各种技术将各博物馆实景、艺术作品数字化，提供艺术品的导览与简介。Google Arts &amp; Culture 可以直接在浏览器使用，也可以下载 App 使用。</p><p>Google 已与世界上大部分博物馆合作（包括中国），将成千上万的艺术品数字化，可以按照时间、色彩、主题等等推荐筛选。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/google_art_pic.png" alt="google_art_pic"></p><p>在艺术品详情可以通过放大查看高清照片，也可以通过 360°街景查看，或者通过 AR（虚拟现实）查看。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/google_art_view.png" alt="google_art_view"></p><p>另外，Google Arts &amp; Culture App 还提供了艺术滤镜、艺术转化、艺术自拍等等有趣的小功能。</p><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p>有以下途径可以使用 Google Arts &amp; Culture 的高清艺术照作为壁纸或屏保：</p><p>1、Android TV</p><ul><li>可以通过 Chromecast 将艺术高清图投放至 Android TV 大屏查看，支持拖拽、放大缩小查看细节。</li></ul><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/google_art_chromecast.jpg" alt="google_art_chromecast"></p><ul><li>可以设置 Google Arts &amp; Culture 艺术图作为屏保。在 Google Home App 中找到 Android TV 设置，打开「Ambient Mode」，选择「Art gellery」，之后选择「Fine art」。</li></ul><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/google_art_tv.png" alt="google_art_tv"></p><p>2、Google Nest Hub</p><p>Google Nest Hub 也支持 Chromecast 和设置屏保，方法与 Android TV 一致。</p><p>3、Chrome 浏览器</p><p>Chrome 浏览器中可以使用 Google 官方出的 <a href="https://chrome.google.com/webstore/detail/google-arts-culture/akimgimeeoiognljlfchpbkpfbmeapkh" target="_blank" rel="noopener">Google Arts &amp; Culture 插件</a>，可以设置每打开一个新标签页显示一张艺术图片。另外，遇见喜欢的艺术图片可以点击查看详情或者加入收藏在其他端查看。目前此插件仅支持 Chrome 浏览器。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/google_art_chrome.jpg" alt="google_art_chrome"></p><p>4、MacOS</p><p>MacOS 可以使用 <a href="https://apps.apple.com/us/app/artpaper-new-wallpapers-daily/id1028838684" target="_blank" rel="noopener">Artpaper</a> 作为桌面壁纸。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/google_art_artpaper.jpg" alt="google_art_artpaper"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/google_art_cover.png&quot; alt=&quot;google_art_cover&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;艺术的慰藉&quot;&gt;&lt;a
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>HA 联动像素钟</title>
    <link href="http://yoursite.com/awtrix_api/"/>
    <id>http://yoursite.com/awtrix_api/</id>
    <published>2021-03-28T00:00:00.000Z</published>
    <updated>2021-04-22T08:29:34.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/awtrix_api_cover.png" alt="awtrix_api_cover"></p><p>小弟曾做过一个像素钟 <a href="https://lametric.com/en-US" target="_blank" rel="noopener">LaMetric Time</a> 的 DIY 替代品 AWTRIX，有 8*32 个像素，可以显示像素动画、文字信息的等等。比较酷的是， AWTRIX 支持外部控制，这样就可以与其他设备联动。</p><p>AWTRIX 可以通过 HTTP 和 MQTT 两种方式从外部控制，控制的元素很多，从显示图标、显示特定文字等都可以，详见 AWTRIX 文档 <a href="https://awtrixdocs.blueforcer.de/#/en-en/api" target="_blank" rel="noopener">API 部分</a>。以下实例介绍 AWTRIX 与 Home Assistant 的联动：</p><h2 id="利用-HTTP"><a href="#利用-HTTP" class="headerlink" title="利用 HTTP"></a>利用 HTTP</h2><p>实例：通过 HTTP 定时控制像素灯泡开关</p><p>AWTRIX 某种意义算是一个灯泡组合的信息版，可惜这个灯泡组合不能方便地打开/关闭显示屏幕，有大大利用 HTTP <a href="https://bbs.iobroker.cn/t/topic/3509" target="_blank" rel="noopener">将 AWTRIX 虚拟成一个灯光开关接入</a>，将以下代码复制粘贴至 configuration.yaml 文件即可（记得将 AWTRIX-SERVER_IP 替换成实际 IP ）：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">light:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">template</span></span><br><span class="line">    <span class="attr">lights:</span></span><br><span class="line">      <span class="attr">theater_volume:</span></span><br><span class="line">        <span class="attr">friendly_name:</span> <span class="string">Steam</span></span><br><span class="line">        <span class="attr">turn_on:</span></span><br><span class="line">          <span class="attr">service:</span> <span class="string">shell_command.turn_on_123</span></span><br><span class="line">        <span class="attr">turn_off:</span></span><br><span class="line">          <span class="attr">service:</span> <span class="string">shell_command.turn_off_541</span></span><br><span class="line"></span><br><span class="line"><span class="attr">shell_command:</span></span><br><span class="line">  <span class="attr">turn_off_541:</span> <span class="string">'curl --header "Content-Type: application/json" --request POST --data &#123;"power":false&#125; http://[AWTRIX-SERVER_IP]/api/v3/basics'</span></span><br><span class="line">  <span class="attr">turn_on_123:</span> <span class="string">'curl --header "Content-Type: application/json" --request POST --data &#123;"power":true&#125; http://[AWTRIX-SERVER_IP]:7000/api/v3/basics'</span></span><br></pre></td></tr></table></figure><p>加入虚拟开关后，就可以通过自动化控制像素时钟的显示与关闭，如可以设置定时开关屏幕，每天 7 点自动打开屏幕， 晚上 11 点关闭屏幕，自动化配置参考：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">id:</span> <span class="string">'xxxxx'</span></span><br><span class="line">  <span class="attr">alias:</span> <span class="string">awtrix</span> <span class="string">on</span></span><br><span class="line">  <span class="attr">description:</span> <span class="string">''</span></span><br><span class="line">  <span class="attr">trigger:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'7:00'</span></span><br><span class="line">  <span class="attr">condition:</span> <span class="string">[]</span></span><br><span class="line">  <span class="attr">action:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">switch.turn_on</span></span><br><span class="line">    <span class="attr">data:</span> <span class="string">&#123;&#125;</span></span><br><span class="line">    <span class="attr">entity_id:</span> <span class="string">switch.original_xiaomi_mi_smart_wifi_socket</span></span><br><span class="line">  <span class="attr">mode:</span> <span class="string">single</span></span><br></pre></td></tr></table></figure><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">id:</span> <span class="string">'xxxxx'</span></span><br><span class="line">  <span class="attr">alias:</span> <span class="string">awtrix</span> <span class="string">off</span></span><br><span class="line">  <span class="attr">description:</span> <span class="string">''</span></span><br><span class="line">  <span class="attr">trigger:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'23:00'</span></span><br><span class="line">  <span class="attr">condition:</span> <span class="string">[]</span></span><br><span class="line">  <span class="attr">action:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">shell_command.turn_off_541</span></span><br><span class="line">    <span class="attr">data:</span> <span class="string">&#123;&#125;</span></span><br><span class="line">  <span class="attr">mode:</span> <span class="string">single</span></span><br></pre></td></tr></table></figure><h2 id="利用-MQTT"><a href="#利用-MQTT" class="headerlink" title="利用 MQTT"></a>利用 MQTT</h2><p>实例：通过 MQTT 实现扫描特定 NFC 标签（或其他条件）显示「降落文字」（falling test）</p><p>首先可以在 AWTRIX 设置好 MQTT 服务器，设置成功在 MQTT 服务器中可以看到 awtrix 相关的主题，AWTRIX 基本主题是<code>awtrix</code>。</p><p>这里示例扫描特定 NFC 标签（或其他条件）显示「降落文字」，自动化配置参考：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">id:</span> <span class="string">'xxxxx'</span></span><br><span class="line">  <span class="attr">alias:</span> <span class="string">Tag</span> <span class="string">blue</span> <span class="string">is</span> <span class="string">scanned</span></span><br><span class="line">  <span class="attr">description:</span> <span class="string">''</span></span><br><span class="line">  <span class="attr">trigger:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">tag</span></span><br><span class="line">    <span class="attr">tag_id:</span> <span class="string">xx-xx-xx-xx</span></span><br><span class="line">  <span class="attr">condition:</span> <span class="string">[]</span></span><br><span class="line">  <span class="attr">action:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">mqtt.publish</span></span><br><span class="line">    <span class="attr">data:</span></span><br><span class="line">      <span class="attr">topic:</span> <span class="string">awtrix/notify</span></span><br><span class="line">      <span class="attr">payload:</span> <span class="string">'&#123;"name":"TestNotification", "force":true, "repeat":10,"fallingText":"keep cool", "color":[0, 255, 0]&#125;'</span></span><br><span class="line">  <span class="attr">mode:</span> <span class="string">single</span></span><br></pre></td></tr></table></figure><p>扫描 NFC 标签后， AWTRIX 先绿色字体显示「keep」，之后掉落显示「cool」。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/awtrix_api_cover.png&quot; alt=&quot;awtrix_api_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;小弟曾做过一个像素钟 &lt;a
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>自制 NFC 读卡器接入 HA</title>
    <link href="http://yoursite.com/nfc_reader/"/>
    <id>http://yoursite.com/nfc_reader/</id>
    <published>2021-03-27T00:00:00.000Z</published>
    <updated>2021-04-22T08:31:42.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/nfc_reader_cover.png" alt="nfc_reader_cover"></p><p>NFC（Near-field communication，近距离无线通讯）可以作为一种很好的验证方式，以一种方便的形式实现一些自动化，比如：</p><ul><li>扫描 NFC 卡之后播放特定的音乐列表清单</li><li>利用 NFC 标籤激活房间中的场景</li><li>通过 NFC 卡开锁</li><li>读取后 NFC 标签打开设备详情页</li><li>等等</li></ul><p>现在人人随身携带手机，手机也自带 NFC 功能，NFC 使用场景更加充满实用性和想象力。Home Assistant 在 App 中已为标籤编写特殊的 Home Assistant URL扫描 NFC 标籤后，可以触發 Home Assistant 应用并将标识符發送到 Home Assistant 实例处理。</p><p>不过不是所有手机都支持 NFC（如 iPhone 需要 iPhone XS、XR、iPhone 11 及以上可以后台读取 NFC 卡片）。有大大利用 ESPHome <a href="https://github.com/adonno/tagreader" target="_blank" rel="noopener">自制了一个 NFC 读卡器</a>，小弟跟着步骤踩了一遍坑，以下是步骤：</p><h2 id="所需材料"><a href="#所需材料" class="headerlink" title="所需材料"></a>所需材料</h2><p>1、ESP8266（或 D1 Mini，D1 mini 体积更小）<br>2、PN532 NFC 读卡器（PN532 可能是最好的 NFC 读写模块）<br>3、WS2812（非必须，用作读卡后的 LED 灯泡反馈）<br>4、蜂鸣器（非必须，作为读卡后的声音反馈）<br>5、3D 打印外（非必须），地址在<a href="https://github.com/adonno/tagreader/blob/master/STLs" target="_blank" rel="noopener">这里</a><br>6、杜邦线若干</p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><p>如果使用 D1 Mini，可能需要焊接。</p><p>另外，确保将 PN532 上的开关设置为以下开关状态：<br>开关1：打开（向上）<br>开关2：关闭（向下）</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/nfc_reader_pn532.png" alt="nfc_reader_pn532"></p><h2 id="刷机"><a href="#刷机" class="headerlink" title="刷机"></a>刷机</h2><p>确保 ESPHome 版本在 1.16.0 及以上，在 ESPHome 中新增一个 ESP8266 设备，在配置中加入以下代码（若无 WS2812 和蜂鸣器可以删去相应代码）：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">substitutions:</span></span><br><span class="line">  <span class="attr">devicename:</span> <span class="string">tagreader</span></span><br><span class="line">  <span class="attr">friendly_name:</span> <span class="string">TagReader</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 如果有蜂鸣器，连接成功后在 api 中通知</span></span><br><span class="line">  <span class="attr">on_boot:</span></span><br><span class="line">    <span class="attr">priority:</span> <span class="number">-10</span></span><br><span class="line">    <span class="attr">then:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">wait_until:</span></span><br><span class="line">        <span class="attr">api.connected:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">logger.log:</span> <span class="string">API</span> <span class="string">is</span> <span class="string">connected!</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">rtttl.play:</span> <span class="string">"success:d=24,o=5,b=100:c,g,b"</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">light.turn_on:</span></span><br><span class="line">        <span class="attr">id:</span> <span class="string">activity_led</span></span><br><span class="line">        <span class="attr">brightness:</span> <span class="number">100</span><span class="string">%</span></span><br><span class="line">        <span class="attr">red:</span> <span class="number">0</span><span class="string">%</span></span><br><span class="line">        <span class="attr">green:</span> <span class="number">0</span><span class="string">%</span></span><br><span class="line">        <span class="attr">blue:</span> <span class="number">100</span><span class="string">%</span></span><br><span class="line">        <span class="attr">flash_length:</span> <span class="string">500ms</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 在 HA 中虚拟一个可以控制 LED 灯和蜂鸣器的开关</span></span><br><span class="line"><span class="attr">switch:</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">template</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">"$&#123;friendly_name&#125; Buzzer Enabled"</span></span><br><span class="line">  <span class="attr">id:</span> <span class="string">buzzer_enabled</span></span><br><span class="line">  <span class="attr">icon:</span> <span class="string">mdi:volume-high</span></span><br><span class="line">  <span class="attr">optimistic:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">restore_state:</span> <span class="literal">true</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">template</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">"$&#123;friendly_name&#125; LED enabled"</span></span><br><span class="line">  <span class="attr">id:</span> <span class="string">led_enabled</span></span><br><span class="line">  <span class="attr">icon:</span> <span class="string">mdi:alarm-light-outline</span></span><br><span class="line">  <span class="attr">optimistic:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">restore_state:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 启用 Home Assistant API</span></span><br><span class="line"><span class="attr">api:</span></span><br><span class="line">  <span class="attr">services:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">rfidreader_tag_ok</span></span><br><span class="line">    <span class="attr">then:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">rtttl.play:</span> <span class="string">"beep:d=16,o=5,b=100:b"</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">rfidreader_tag_ko</span></span><br><span class="line">    <span class="attr">then:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">rtttl.play:</span> <span class="string">"beep:d=8,o=5,b=100:b"</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">play_rtttl</span></span><br><span class="line">    <span class="attr">variables:</span></span><br><span class="line">      <span class="attr">song_str:</span> <span class="string">string</span></span><br><span class="line">    <span class="attr">then:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">rtttl.play:</span> <span class="type">!lambda</span> <span class="string">'return song_str;'</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">write_tag_random</span></span><br><span class="line">    <span class="attr">then:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">lambda:</span> <span class="string">|-</span></span><br><span class="line">        <span class="string">static</span> <span class="string">const</span> <span class="string">char</span> <span class="string">alphanum[]</span> <span class="string">=</span> <span class="string">"0123456789abcdef"</span><span class="string">;</span></span><br><span class="line">        <span class="string">std::string</span> <span class="string">uri</span> <span class="string">=</span> <span class="string">"https://www.home-assistant.io/tag/"</span><span class="string">;</span></span><br><span class="line">        <span class="string">for</span> <span class="string">(int</span> <span class="string">i</span> <span class="string">=</span> <span class="number">0</span><span class="string">;</span> <span class="string">i</span> <span class="string">&lt;</span> <span class="number">8</span><span class="string">;</span> <span class="string">i++)</span></span><br><span class="line">          <span class="string">uri</span> <span class="string">+=</span> <span class="string">alphanum[random_uint32()</span> <span class="string">%</span> <span class="string">(sizeof(alphanum)</span> <span class="bullet">-</span> <span class="number">1</span><span class="string">)];</span></span><br><span class="line">        <span class="string">uri</span> <span class="string">+=</span> <span class="string">"-"</span><span class="string">;</span></span><br><span class="line">        <span class="string">for</span> <span class="string">(int</span> <span class="string">j</span> <span class="string">=</span> <span class="number">0</span><span class="string">;</span> <span class="string">j</span> <span class="string">&lt;</span> <span class="number">3</span><span class="string">;</span> <span class="string">j++)</span> <span class="string">&#123;</span></span><br><span class="line">          <span class="string">for</span> <span class="string">(int</span> <span class="string">i</span> <span class="string">=</span> <span class="number">0</span><span class="string">;</span> <span class="string">i</span> <span class="string">&lt;</span> <span class="number">4</span><span class="string">;</span> <span class="string">i++)</span></span><br><span class="line">            <span class="string">uri</span> <span class="string">+=</span> <span class="string">alphanum[random_uint32()</span> <span class="string">%</span> <span class="string">(sizeof(alphanum)</span> <span class="bullet">-</span> <span class="number">1</span><span class="string">)];</span></span><br><span class="line">          <span class="string">uri</span> <span class="string">+=</span> <span class="string">"-"</span><span class="string">;</span></span><br><span class="line">        <span class="string">&#125;</span></span><br><span class="line">        <span class="string">for</span> <span class="string">(int</span> <span class="string">i</span> <span class="string">=</span> <span class="number">0</span><span class="string">;</span> <span class="string">i</span> <span class="string">&lt;</span> <span class="number">12</span><span class="string">;</span> <span class="string">i++)</span></span><br><span class="line">          <span class="string">uri</span> <span class="string">+=</span> <span class="string">alphanum[random_uint32()</span> <span class="string">%</span> <span class="string">(sizeof(alphanum)</span> <span class="bullet">-</span> <span class="number">1</span><span class="string">)];</span></span><br><span class="line">        <span class="string">auto</span> <span class="string">message</span> <span class="string">=</span> <span class="string">new</span> <span class="string">nfc::NdefMessage();</span></span><br><span class="line">        <span class="string">message-&gt;add_uri_record(uri);</span></span><br><span class="line">        <span class="string">ESP_LOGD("tagreader",</span> <span class="string">"Writing payload: %s"</span><span class="string">,</span> <span class="string">uri.c_str());</span></span><br><span class="line">        <span class="string">id(pn532_board).write_mode(message);</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">write_tag_id</span></span><br><span class="line">    <span class="attr">variables:</span></span><br><span class="line">      <span class="attr">tag_id:</span> <span class="string">string</span></span><br><span class="line">    <span class="attr">then:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">lambda:</span> <span class="string">|-</span></span><br><span class="line">        <span class="string">auto</span> <span class="string">message</span> <span class="string">=</span> <span class="string">new</span> <span class="string">nfc::NdefMessage();</span></span><br><span class="line">        <span class="string">std::string</span> <span class="string">uri</span> <span class="string">=</span> <span class="string">"https://www.home-assistant.io/tag/"</span><span class="string">;</span></span><br><span class="line">        <span class="string">uri</span> <span class="string">+=</span> <span class="string">tag_id;</span></span><br><span class="line">        <span class="string">message-&gt;add_uri_record(uri);</span></span><br><span class="line">        <span class="string">id(pn532_board).write_mode(message);</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">clean_tag</span></span><br><span class="line">    <span class="attr">then:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">lambda:</span> <span class="string">'id(pn532_board).clean_mode();'</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">cancel_writing</span></span><br><span class="line">    <span class="attr">then:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">lambda:</span> <span class="string">'id(pn532_board).read_mode();'</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="attr">i2c:</span></span><br><span class="line">  <span class="attr">scan:</span> <span class="literal">False</span></span><br><span class="line">  <span class="attr">frequency:</span> <span class="string">400kHz</span></span><br><span class="line"></span><br><span class="line"><span class="attr">pn532_i2c:</span></span><br><span class="line">  <span class="attr">id:</span> <span class="string">pn532_board</span></span><br><span class="line">  <span class="attr">on_tag:</span></span><br><span class="line">    <span class="attr">then:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">homeassistant.tag_scanned:</span> <span class="type">!lambda</span> <span class="string">|</span></span><br><span class="line">        <span class="string">if</span> <span class="string">(!tag.has_ndef_message())</span> <span class="string">&#123;</span></span><br><span class="line">          <span class="string">ESP_LOGD("tagreader",</span> <span class="string">"No NDEF"</span><span class="string">);</span></span><br><span class="line">          <span class="string">return</span> <span class="string">x;</span></span><br><span class="line">        <span class="string">&#125;</span></span><br><span class="line">        <span class="string">auto</span> <span class="string">message</span> <span class="string">=</span> <span class="string">tag.get_ndef_message();</span></span><br><span class="line">        <span class="string">auto</span> <span class="string">records</span> <span class="string">=</span> <span class="string">message-&gt;get_records();</span></span><br><span class="line">        <span class="string">for</span> <span class="string">(auto</span> <span class="string">&amp;record</span> <span class="string">:</span> <span class="string">records)</span> <span class="string">&#123;</span></span><br><span class="line">          <span class="string">std::string</span> <span class="string">payload</span> <span class="string">=</span> <span class="string">record-&gt;get_payload();</span></span><br><span class="line">          <span class="string">size_t</span> <span class="string">pos</span> <span class="string">=</span> <span class="string">payload.find("https://www.home-assistant.io/tag/");</span></span><br><span class="line">          <span class="string">if</span> <span class="string">(pos</span> <span class="string">!=</span> <span class="string">std::string::npos)</span> <span class="string">&#123;</span></span><br><span class="line">            <span class="string">return</span> <span class="string">payload.substr(pos</span> <span class="string">+</span> <span class="number">34</span><span class="string">);</span></span><br><span class="line">          <span class="string">&#125;</span></span><br><span class="line">        <span class="string">&#125;</span></span><br><span class="line">        <span class="string">ESP_LOGD("tagreader",</span> <span class="string">"Bad NDEF, fallback to uid"</span><span class="string">);</span></span><br><span class="line">        <span class="string">return</span> <span class="string">x;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">if:</span></span><br><span class="line">        <span class="attr">condition:</span></span><br><span class="line">          <span class="attr">switch.is_on:</span> <span class="string">buzzer_enabled</span></span><br><span class="line">        <span class="attr">then:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">rtttl.play:</span> <span class="string">"success:d=24,o=5,b=100:c,g,b"</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">if:</span></span><br><span class="line">        <span class="attr">condition:</span></span><br><span class="line">          <span class="attr">switch.is_on:</span> <span class="string">led_enabled</span></span><br><span class="line">        <span class="attr">then:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">light.turn_on:</span></span><br><span class="line">            <span class="attr">id:</span> <span class="string">activity_led</span></span><br><span class="line">            <span class="attr">brightness:</span> <span class="number">100</span><span class="string">%</span></span><br><span class="line">            <span class="attr">red:</span> <span class="number">0</span><span class="string">%</span></span><br><span class="line">            <span class="attr">green:</span> <span class="number">100</span><span class="string">%</span></span><br><span class="line">            <span class="attr">blue:</span> <span class="number">0</span><span class="string">%</span></span><br><span class="line">            <span class="attr">flash_length:</span> <span class="string">500ms</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 定义蜂鸣器输出所在端口</span></span><br><span class="line"><span class="attr">output:</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">esp8266_pwm</span></span><br><span class="line">  <span class="attr">pin:</span> <span class="string">D7</span></span><br><span class="line">  <span class="attr">id:</span> <span class="string">buzzer</span></span><br><span class="line"></span><br><span class="line"><span class="attr">binary_sensor:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">status</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">"$&#123;friendly_name&#125; Status"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 定义蜂鸣器作为 RTTTL 输出</span></span><br><span class="line"><span class="attr">rtttl:</span></span><br><span class="line">  <span class="attr">output:</span> <span class="string">buzzer</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># LED 配置</span></span><br><span class="line"><span class="attr">light:</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">fastled_clockless</span></span><br><span class="line">  <span class="attr">chipset:</span> <span class="string">WS2812</span></span><br><span class="line">  <span class="attr">pin:</span> <span class="string">D8</span></span><br><span class="line">  <span class="attr">default_transition_length:</span> <span class="string">10ms</span></span><br><span class="line">  <span class="attr">num_leds:</span> <span class="number">1</span></span><br><span class="line">  <span class="attr">rgb_order:</span> <span class="string">GRB</span></span><br><span class="line">  <span class="attr">id:</span> <span class="string">activity_led</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">"$&#123;friendly_name&#125; LED"</span></span><br><span class="line">  <span class="attr">restore_mode:</span> <span class="string">ALWAYS_OFF</span></span><br></pre></td></tr></table></figure><p>之后编译并下载固件，使用 <a href="https://github.com/marcelstoer/nodemcu-pyflasher" target="_blank" rel="noopener">NodeMCU PyFlasher</a> 将固件刷入 ESP8266/D1 Mini。</p><h2 id="连线"><a href="#连线" class="headerlink" title="连线"></a>连线</h2><p>按照以下将 ESP8266 与 PN532 连线：</p><table><thead><tr><th>PN532</th><th>ESP8266</th></tr></thead><tbody><tr><td>GND</td><td>G</td></tr><tr><td>VCC</td><td>VIN</td></tr><tr><td>SDA</td><td>D2</td></tr><tr><td>SCL</td><td>D1</td></tr></tbody></table><p>LED 等与蜂鸣器可以按照以下连线：</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/nfc_reader_schematics.png" alt="nfc_reader_schematics"></p><p>最终效果如下：</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/nfc_reader_inside.jpg" alt="nfc_reader_inside"></p><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p>确保 Home Assistant版本在 0.115 及以上，待 NFC 读取器连接到与 HA 同一网络，Home Assistant 会自动發现 NFC 读取器。</p><p>之后从 Home Assistant 中的标籤界面中可以管理扫描的标籤（在 config-&gt;tag 下可以找到。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/nfc_reader_ui.gif" alt="nfc_reader_ui"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/nfc_reader_cover.png&quot; alt=&quot;nfc_reader_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;NFC（Near-field
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>善用悲观的力量——Using Ancient Philosophy to Live a Modern Life</title>
    <link href="http://yoursite.com/stoic/"/>
    <id>http://yoursite.com/stoic/</id>
    <published>2021-03-07T00:00:00.000Z</published>
    <updated>2021-04-25T15:07:10.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/stoic_cover.png" alt="stoic_cover"></p><blockquote><p>如果想要一个新点子，读一本古书吧。</p><p>──摘自伊凡．巴夫洛夫（等人）</p></blockquote><p>几个世纪以来，宗教推播着黑暗的讯息，佛教告诉信徒人生是一场苦痛，基督教诉说着人类的堕落和人世不可避免的不完美。如今我们活在一个乐观的世界，商人尝试用欢乐向我们推销商品，科技的进步让我们对未来感到一切都会变得更美好。</p><p>各种乐观的今日，我们面临更多的焦虑、诱惑、竞争，如同两千年前的古罗马人一样面临的羞辱、悲伤、衰老，但我们仍旧束手无策，饱受各种负面情绪所苦。</p><p>心理学家威廉·詹姆士提出过一个等式:「幸福等于现实除以期待」，有两种方式可以实现快乐：改变现实，或改变期待。</p><p>两千多年前，一个叫做斯多噶哲学学派尝试运用悲观思考的正面力量，解决人生困境。他们主张降低期待，每天会预演一些重要的课题：「人生永远会出错」「每个人多数时间都在烦恼和难过」「在生涯的重大选择上后悔是很平常的」「唯一『正常』的人是那些我们还不熟的人」「高兴超过 15 分钟是很困难的」「几乎所有的希望都会破灭」「平庸是普遍的」。斯多噶哲学发现，痛苦的元凶就是人类「贪得无厌」「习惯控制结果」的两大天性，让我们不知不觉丧失了享受简单事物的能力，而严重耗损了享受生活、感受快乐的能力。</p><p>在斯多噶主义者眼中，「消极想像」可以消解填不满的欲望，「幽默自嘲」可以穿越羞辱与愤怒，「宿命论」可以战胜生命的悲苦与眼泪，我们应该努力剔除过度的欲望及有毒的情绪，实践素朴的极简生活，發现生命真正有价值的事物，学会保持心灵平静。</p><p>斯多噶哲学强调用悲观的力量找回快乐的能力，提出五大极简心法，帮助我们恢復快乐的嗅觉：</p><p>1、消极想像大满足</p><p>斯多噶哲学倡导我们牢牢记住「万事皆无」，常常想像最坏的结果，想象失去，学会渴望早已拥有的事物，成为「成熟的」乐观主义者。改变我们的心智状态，增强对生活的享受，享受，却不执着，「勇于不敢，爱而无伤」。同时消除困境带来的心理痛苦，寻找出路活下去。</p><p>2、控制二分心自在</p><p>斯多噶主义认为，改变自己的欲望，是人生幸福的祕诀。我们应该学会将事物分成能控制与不能控制的，让爱控制的心学会断捨离。我们可以把事物分成由我们决定的，和不由我们决定的。我们不能够完全控制的事物，又有两种状况：我们可能完全无法控制（比如明天会不会出太阳），或者能够控制一些但不能完全控制（比如是否会赢得网球比赛）。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/stoic_content1.jpeg" alt="stoic_content1"></p><p>对于我们无法完全控制的事物，我们不应该花时间和精力去关注。对于能部分控制的事物，我们应当将追求的目标放到内在，也就是「目标内在化」：把目标设定为尽力發挥到最佳水准，减少随后情绪上的苦恼。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/stoic_content2.jpeg" alt="stoic_content2"></p><p>3、活在当下大智慧</p><p>斯多葛哲学建议我们针对过去和现在採取宿命论的态度，牢记过去是不能改变的，思考过去，吸取教训，帮助建构未来。拥抱眼下这个时刻，拥抱宿命，摆脱不满足，学会享受现有的生活。</p><p>4、锻鍊意志反快乐</p><p>在斯多葛主义看来，进行消极想像，预想可能發生在我们身上的坏事，定期自寻不适、自找麻烦，延迟享受，培养自控力，锻鍊意志力，培养自我控制力，这样快乐便可以操之于己。</p><p>5、反躬自省的实践</p><p>斯多葛主义者建议我们定期对日常生活中的事件进行沉思，定期反省日常生活中的事件，像《沉思录》那样认真过生活。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/stoic_cover.png&quot;
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>电子版单向历使用</title>
    <link href="http://yoursite.com/oneway/"/>
    <id>http://yoursite.com/oneway/</id>
    <published>2020-12-20T00:00:00.000Z</published>
    <updated>2021-01-04T06:45:37.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/oneway_cover.png" alt="oneway_cover"></p><p>单向历是单向书店出的日历，开始是线上版，印成纸质版之后迅速流行，还带动了一波日历风潮。小弟觉得这个日历很酷，这个日历传递了小弟不具备但想拥有的品质：朴实、可爱、有趣、平和。上面的文字默默引导小弟以灵魂人的视角面对生活，醒目的日期提醒小弟生命有限，勇敢争取自己想要的。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/oneway_paper.jpeg" alt="oneway_pape"></p><p>有些人买纸质日历追求生活的「仪式感」，小弟是个内心脆弱、将就过日子的粗糙人，觉得「仪式感」可有可无，偏好电子版日历。下面是使用电子版单向历的几种方法：</p><h2 id="单向历-App"><a href="#单向历-App" class="headerlink" title="单向历 App"></a>单向历 App</h2><p>最简单的方法是安装「单向历」App，手机应用商店搜索下载即可。注意，App 中的文字内容和纸质版不一样。</p><h2 id="秒秒测日历"><a href="#秒秒测日历" class="headerlink" title="秒秒测日历"></a>秒秒测日历</h2><p>小米下的<a href="http://www.miaomiaoce.com/product.html" target="_blank" rel="noopener">秒秒测</a>公司有出一款 <a href="https://shop41517656.m.youzan.com/wscgoods/detail/1y6m3h8gmm8qo" target="_blank" rel="noopener">Eink 日历</a>，其中有包含单向历。售价约 ￥200（物料成本大约 ￥100），Eink 屏幕、乐鑫 ESP32 芯片、微信 airkiss 联网方案，拆机图片详见这个<a href="https://www.mydigit.cn/forum.php?mod=viewthread&tid=133256" target="_blank" rel="noopener">大大的帖子</a>。另外，这个日历的文字内容与纸质版一致。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/oneway_miaomiaoce.jpg" alt="oneway_miaomiaoce"></p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/oneway_miaomiaoce2.png" alt="oneway_miaomiaoce2"></p><h2 id="DIY"><a href="#DIY" class="headerlink" title="DIY"></a>DIY</h2><h3 id="获取单向历图片"><a href="#获取单向历图片" class="headerlink" title="获取单向历图片"></a>获取单向历图片</h3><p>首先手机安装好抓包工具 <a href="https://apps.apple.com/cn/app/id1210562295" target="_blank" rel="noopener">Thor</a> 和单向历 App，启动抓包，打开单向历 App，可以得到某一天如 2020 年 10 月 29 日的线上版单向历的图片地址是 <code>https://img.owspace.com/Public/uploads/Download/2020/1029.jpg</code> 。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/oneway_thor.png" alt="oneway_thor"></p><p>获取当天的线上版单向历图片，只要将相应的日期替换成当天之后下载即可。实现这个功能比较简单的办法是利用计划任务，以群晖为例：</p><h4 id="建立外链文件夹"><a href="#建立外链文件夹" class="headerlink" title="建立外链文件夹"></a>建立外链文件夹</h4><p>借助 <a href="https://github.com/helloxz/zdir" target="_blank" rel="noopener">Zdir</a> 这个小工具可以建立外链文件夹。首先新建一个文件夹用来存放日历图片文件，打开群晖 Docker，在「注册表」中搜索「zdir」，选择「baiyuetribe/zdir」并下载，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/oneway_docker1.png" alt="oneway_docker1"></p><p>待映像下载完成，映射路径到 <code>/var/www/html/var</code> ，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/oneway_docker2.png" alt="oneway_docker2"></p><p>映射 80 端口，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/oneway_docker3.png" alt="oneway_docker3"></p><p>之后在路由器中设置好端口映射。</p><h4 id="添加计划任务"><a href="#添加计划任务" class="headerlink" title="添加计划任务"></a>添加计划任务</h4><p>打开群晖「控制面板」中的「计划任务」，创建一条用户自定义脚本，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/oneway_task1.png" alt="oneway_task1"></p><p>在脚本中设置以下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash">!/bin/bash</span></span><br><span class="line">cd /volume1/8t/share/oneway # 完整路径</span><br><span class="line">a=$(date +"%Y/%m%d") </span><br><span class="line">curl -o calendar.jpg http://img.owspace.com/Public/uploads/Download/$a.jpg</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/oneway_task2.png" alt="oneway_task2"></p><p>之后运行一次测试是否正常，之后设置每天 0 点运行。到此可以得到一个图片的地址，类似 <code>http://&lt;群晖地址&gt;:&lt;端口号&gt;/var/oneway/calendar.jpg</code></p><h3 id="屏幕显示"><a href="#屏幕显示" class="headerlink" title="屏幕显示"></a>屏幕显示</h3><h4 id="通过-ESP8266-Eink-屏幕"><a href="#通过-ESP8266-Eink-屏幕" class="headerlink" title="通过 ESP8266 + Eink 屏幕"></a>通过 ESP8266 + Eink 屏幕</h4><p>ESP8266 作为控制，Eink 屏幕输出日历图片，可以实现秒秒测日历的近似效果。比较简单的搭建方法是利用 <a href="https://esphome.io" target="_blank" rel="noopener">ESPHome</a>，需要准备的材料：ESP8266 开发版、Eink 屏幕、Eink 屏幕确定版，参考 <a href="https://esphome.io/components/display/waveshare_epaper.html" target="_blank" rel="noopener">Eink 屏幕输出</a>连线、定义输出设备，参考 <a href="https://esphome.io/components/display/index.html" target="_blank" rel="noopener">ESPHome 显示</a>配置图片显示。</p><p>这种方法小弟没有具体尝试，使用时可能要挑选合适大小的屏幕（图片尺寸 691*1006 px）。这个方法比较酷的地方是显示什么完全自由，不仅可以显示图片，显示内容可以完全自定义。</p><h4 id="通过-Kindle（未越狱）"><a href="#通过-Kindle（未越狱）" class="headerlink" title="通过 Kindle（未越狱）"></a>通过 Kindle（未越狱）</h4><p>首先点击 Kindle 首页右上角的「搜索」图标，输入 <code>~ds</code>，按回车键，调用隐藏的 <code>Disable Screensaver</code> 命令。这样 Kindle 可以禁用休眠不锁屏。（注意重启 Kindle 失效）。</p><p>在浏览器输入图片地址 <code>http://&lt;群晖地址&gt;:&lt;端口号&gt;/var/oneway/calendar.jpg</code>，之后双击图片即可居中放大显示。注意，这个「日历」不会自动刷新，需要明天点击「刷新」按钮手动刷新（意外地拥有精致上流人士才有的「仪式感」）</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/kindle_calendar.jpeg" alt="oneway_kindle"></p><h4 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h4><p>因为我们最终得到的是一个固定的链接，所以能用的地方很多，如用在 iOS 上的 Widget 上、Home Assistant 的图片组件等等。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/oneway_cover.png&quot;
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>使用 Bitwarden 搭建密码管理</title>
    <link href="http://yoursite.com/bitwarden/"/>
    <id>http://yoursite.com/bitwarden/</id>
    <published>2020-12-14T00:00:00.000Z</published>
    <updated>2021-01-04T06:40:59.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/bitwarden_cover.png" alt="bitwarden_cover"></p><p>使用密码管理工具管理密码理由很多，最主要的是方便、安全。Bitwarden 是一个开源的密码管理服务，全平台支持，介面简洁，前后端均开源（Telegram 仅客户端开源）功能全面，支持两步验证（Lastpass 付费版都不支持的功能）、团队共享密码库，另外，支持将服务端部署在自己的服务器上。</p><p>小弟尝试在群晖搭建 Bitwarden 服务端，期间踩了一些坑，主要参考了<a href="https://www.chiphell.com/thread-2006498-1-1.html" target="_blank" rel="noopener">这位大大的帖子</a>。</p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><p>首先需要配置好域名和 SSL 证书，最简单的是利用群晖自带功能申请一个二级域名，并为这个二级域名申请 SSL 证书。在群晖「控制面板」→「安全」中导出证书，导出得到一个压缩包备用，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/bitwarden_export_ssl.png" alt="bitwarden_export_ssl"></p><p>新建一个文件夹存放密码数据库，一个文件夹存放 SSL 证书，并将导出的证书压缩包解压至这个文件夹。</p><h2 id="Docker-安装"><a href="#Docker-安装" class="headerlink" title="Docker 安装"></a>Docker 安装</h2><p>打开群晖 Docker，在「注册表」 中搜索 <code>bitwardenr</code>，找到 <code>bitwardenrs/server</code> 并选择 latest 下载。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/bitwarden_docker1.png" alt="bitwarden_docker1"></p><p>待镜像下载完成（有群晖系统通知），到「映像」中找到并双击打开下载好的镜像，点击「高级设置」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/bitwarden_docker2.png" alt="bitwarden_docker2"></p><p>在「卷」 中添加路径存放密码数据库的文件夹，装载路径为<code>/data</code>，添加存放 SSL 证书的文件夹，装载路径为 <code>/ssl</code></p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/bitwarden_docker3.png" alt="bitwarden_docker3"></p><p>在 「端口设置」中自定义容器端口 <code>80</code> 所对应的本地端口，删去自带的 <code>3021</code> 的容器端口，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/bitwarden_docker4.png" alt="bitwarden_docker4"></p><p>在环境变量中添加 <code>ROCKET_TLS</code>，值为 <code>{certs=&quot;/ssl/cert.pem&quot;,key=&quot;/ssl/privkey.pem&quot;}</code>（值里面的文件名改为自己的证书的文件名），点击应用保存。</p><h2 id="设置端口映射"><a href="#设置端口映射" class="headerlink" title="设置端口映射"></a>设置端口映射</h2><p>在路由器中设置好端口转发（确保有有公网 IP），OpenWrt 系统可以在「网络」→「防火墙」→「端口转发」中找到。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt23_new.png" alt="bitwarden_port"></p><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p>在浏览器中输入 <code>https:// &lt;DDNS 域名&gt;:&lt;端口号&gt;</code> 即可访问刚刚搭建的 Bitwarden 服务，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/bitwarden_web.png" alt="bitwarden_web"></p><p>之后注册一个账号即可使用，注意千万牢记主密码。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/bitwarden_web2.png" alt="bitwarden_web2"></p><p>各端客户端可以到官方下载专区 <a href="https://bitwarden.com/download/" target="_blank" rel="noopener">https://bitwarden.com/download/</a> 下载，使用方法大致相同，在设置中填写服务器地址即可。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/bitwarden_url.png" alt="bitwarden_url"></p><h2 id="维护"><a href="#维护" class="headerlink" title="维护"></a>维护</h2><p>如果用的是群晖申请的 Let’s Encrypt 证书，3 个月证书会过期，过期之后重新导出证书文件覆盖即可。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/bitwarden_cover.png&quot;
        
      
    
    </summary>
    
    
    
      <category term="Docker" scheme="http://yoursite.com/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>通过 Calibre-Web 制作图书在线管理</title>
    <link href="http://yoursite.com/calibre/"/>
    <id>http://yoursite.com/calibre/</id>
    <published>2020-12-11T00:00:00.000Z</published>
    <updated>2021-01-04T06:41:06.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/calibre_cover.png" alt="calibre_cover.png"></p><p>随着时间推移，小弟渐渐不再局限在一个平台买电子书，<a href="http://kobo.com/" target="_blank" rel="noopener">Kobo</a>、美亚、中亚上都买过电子书，时间一长，图书的管理成了一个问题。</p><p>小弟开始是用 <a href="https://calibre-ebook.com" target="_blank" rel="noopener">Calibre</a> 这个应用管理电子书，这个应用可以很好地完成去电子书 DRM、转换格式等等，缺点也有：1、图书管理限于本地电脑，无法全平台、外网访问图书资源库，图书本身也占用很多本地存储资源；2、转换格式时若图书文件较大会花很长时间，还会占用很多 CPU 资源，转换图书期间本地电脑几乎不能做其他的事。</p><p><a href="https://github.com/janeczku/calibre-web" target="_blank" rel="noopener">Calibre-Web</a> 是一个很酷的在线图书管理服务，基于网页，介面简洁，使用 Calibre 的数据库，可以在线转换格式、浏览、下载图书，如果设置好端口映射，就可以在外网全平台访问图书资源库了。下面是步骤：</p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><p>Calibre-Web 和 Calibre 使用相同的数据库，首次打开Calibre-Web 可能会因为没有数据库而报错，为此我们可以先建好一个空白数据库备用。在电脑上打开 Calibre，选择「资源库」→「切换/新增资源库」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/calibre_data.png" alt="calibre_data.png"></p><p>选择「在新路径新增资源库」并指定路径，之后可得到一个 <code>metadata.db</code> 文件，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/calibre_data2.png" alt="calibre_data2"></p><p>在群晖任意路径新建一个文件夹用来存放图书，文件名任意，权限设置为可读写，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/calibre_file.png" alt="calibre_file"></p><p>将上一步 <code>metadata.db</code> 文件拷贝至这个路径，</p><h2 id="Docker-安装"><a href="#Docker-安装" class="headerlink" title="Docker 安装"></a>Docker 安装</h2><p>在群晖打开 Docker，在「注册表」中搜索「calibre」，选择「technosoft2000/calibre-web」这个映像并下载，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/calibre_docker1.png" alt="calibre_docker1"></p><p>待下载完成（有群晖系统通知），在「映像」中找到「technosoft2000/calibre-web」双击，选择「高级设置」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/calibre_docker2.png" alt="calibre_docker2"></p><p>映射路径 <code>/books</code>，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/calibre_docker3.png" alt="calibre_docker3"></p><p>端口根据自己情况设置或选择默认，之后应用设置。</p><h2 id="查看效果"><a href="#查看效果" class="headerlink" title="查看效果"></a>查看效果</h2><p>在浏览器输入地址 <code>http://hostname:&lt;HTTP PORT&gt;/opds</code>，输入用户名、密码，默认如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">用户名: admin</span><br><span class="line">密码: admin123</span><br></pre></td></tr></table></figure><p>登录之后可以更改密码、新增用户，或者上传书籍，设置 Kindle 推送，上传的书籍可以转化格式、epub 格式还可以在线阅读等等，都是图形化操作。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/calibre_main_screen.png" alt="calibre_main_screen"></p><h2 id="外网访问"><a href="#外网访问" class="headerlink" title="外网访问"></a>外网访问</h2><p>如果有公网 IP，可以在路由器中新增一个映射端口，这样就可以在外网访问了。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/calibre_cover.png&quot;
        
      
    
    </summary>
    
    
    
      <category term="Docker" scheme="http://yoursite.com/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>洗衣完成发送短信</title>
    <link href="http://yoursite.com/ha_washer/"/>
    <id>http://yoursite.com/ha_washer/</id>
    <published>2020-11-30T00:00:00.000Z</published>
    <updated>2021-01-04T06:43:32.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_washer_cover.png" alt="ha_washer_cover"></p><p>小弟看到有大大有贴<a href="https://blog.yxwang.me/2019/07/washer-dryer-notification/" target="_blank" rel="noopener">洗衣机洗衣完成发通知的自动化</a>，通过插座功率的改变来判断洗衣完成，小弟偏好这种接外挂式的改造，感觉实用，跟着试了一番：</p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><h3 id="接入插座"><a href="#接入插座" class="headerlink" title="接入插座"></a>接入插座</h3><p>这个自动化需要一个可以测功率的插座，小弟有一个「小米插座增强版」，有内置测功率的功能，首先要先将这个插座接入 Home Assistant，具体步骤可参考<a href="https://github.com/syssi/xiaomiplug" target="_blank" rel="noopener">这个大大的程序</a>，其中 token 可以通过<a href="https://www.kapiba.ru/2017/11/mi-home.html" target="_blank" rel="noopener">修改版米家 App</a>（仅支持 Android 系统，免 root）获取。</p><p>之后在 <code>configuration.yaml</code> 文件中添加一个传感器获取插座功率：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">sensor:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">template</span></span><br><span class="line">    <span class="attr">sensors:</span></span><br><span class="line">      <span class="attr">xiaomi_plug_power:</span></span><br><span class="line">        <span class="attr">friendly_name:</span> <span class="string">"socket load power"</span></span><br><span class="line">        <span class="attr">unit_of_measurement:</span> <span class="string">W</span></span><br><span class="line">        <span class="attr">value_template:</span> <span class="string">"<span class="template-variable">&#123;&#123; state_attr('switch.xiaomi_chuangmi_plug_v3', 'load_power') &#125;&#125;</span>"</span></span><br></pre></td></tr></table></figure><h3 id="配置通知"><a href="#配置通知" class="headerlink" title="配置通知"></a>配置通知</h3><p>Home Assistant 通知方式很多，App 通知无需配置，另外还可以选短信通知、TTS 通知等。</p><h3 id="配置-Twilio-短信通知"><a href="#配置-Twilio-短信通知" class="headerlink" title="配置 Twilio 短信通知"></a>配置 Twilio 短信通知</h3><p>利用 Twilio 可以发送短信通知，注册试用即送 $15，美国手机号文字短信 $0.0075/条，中国手机号文字短信 $0.0280/条。</p><p>首先到 <a href="https://www.twilio.com" target="_blank" rel="noopener">Twilio</a> 网站注册并试用，验证手机号后可以获得一个美国手机号，账号 SID 及Token。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_washer_twillo.png" alt="ha_washer_twillo"></p><p>在 Home Assistant 的 <code>configuration.yaml</code> 文件中添加配置：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">twilio:</span></span><br><span class="line">  <span class="attr">account_sid:</span> <span class="string">ACCOUNT_SID_FROM_TWILIO</span></span><br><span class="line">  <span class="attr">auth_token:</span> <span class="string">AUTH_TOKEN_FROM_TWILIO</span></span><br></pre></td></tr></table></figure><p>试用账号只能给白名单的手机号，需要将接受短信的手机号添加至白名单，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_washer_twillo_phone.png" alt="ha_washer_twillo_phone"></p><h3 id="配置-TTS-通知"><a href="#配置-TTS-通知" class="headerlink" title="配置 TTS 通知"></a>配置 TTS 通知</h3><p>若使用 Googlecast 设备访问地址是配置了 SSL 证书，需要添加 base_url，另外，建议添加与文字内容相同的语言（避免用说英文的方式说中文）。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">tts:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">google_translate</span></span><br><span class="line">    <span class="attr">base_url:</span> <span class="string">https://&lt;Home</span> <span class="string">Assistant</span> <span class="string">URL&gt;:8123</span></span><br><span class="line">    <span class="attr">language:</span> <span class="string">'en-us'</span></span><br></pre></td></tr></table></figure><h3 id="配置-Home-Assistant-应用通知"><a href="#配置-Home-Assistant-应用通知" class="headerlink" title="配置 Home Assistant 应用通知"></a>配置 Home Assistant 应用通知</h3><p>免配置，装好应用，允许应用通知权限即可。</p><h2 id="自动化"><a href="#自动化" class="headerlink" title="自动化"></a>自动化</h2><p>自动化这里小弟搬运<a href="https://blog.yxwang.me/2019/07/washer-dryer-notification/" target="_blank" rel="noopener">大大的配置</a>，用两种状态（空闲和运转）描述洗衣机状态，在 <code>configuration.yaml</code> 文件中添加配置：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">input_select:</span></span><br><span class="line">  <span class="attr">washer_status:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">Washer</span> <span class="string">Status</span></span><br><span class="line">    <span class="attr">options:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">Idle</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">Running</span></span><br><span class="line">    <span class="attr">initial:</span> <span class="string">Idle</span></span><br></pre></td></tr></table></figure><p>定义虚拟的洗衣机传感器，</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">sensor:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">template</span></span><br><span class="line">    <span class="attr">sensors:</span></span><br><span class="line">      <span class="attr">washer_status:</span></span><br><span class="line">        <span class="attr">value_template:</span> <span class="string">'<span class="template-variable">&#123;&#123; states.input_select.washer_status.state&#125;&#125;</span>'</span></span><br><span class="line">        <span class="attr">friendly_name:</span> <span class="string">'Washer Status'</span></span><br></pre></td></tr></table></figure><p>自动化脚本一：检测到电量后的更新洗衣机状态为运转，10 瓦作为运转开始的阈值。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">alias:</span> <span class="string">Set</span> <span class="string">washer</span> <span class="string">active</span> <span class="string">when</span> <span class="string">power</span> <span class="string">detected</span></span><br><span class="line"><span class="attr">trigger:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">numeric_state</span></span><br><span class="line">    <span class="attr">entity_id:</span> <span class="string">switch.xiaomi_chuangmi_plug_v3</span></span><br><span class="line">    <span class="attr">value_template:</span> <span class="string">'<span class="template-variable">&#123;&#123; state_attr(''switch.xiaomi_chuangmi_plug_v3'', ''load_power'') &#125;&#125;</span>'</span></span><br><span class="line">    <span class="attr">above:</span> <span class="string">'10'</span></span><br><span class="line"><span class="attr">condition:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">condition:</span> <span class="string">or</span></span><br><span class="line">    <span class="attr">conditions:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">condition:</span> <span class="string">state</span></span><br><span class="line">        <span class="attr">entity_id:</span> <span class="string">sensor.washer_status</span></span><br><span class="line">        <span class="attr">state:</span> <span class="string">Idle</span></span><br><span class="line"><span class="attr">action:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">input_select.select_option</span></span><br><span class="line">    <span class="attr">data:</span></span><br><span class="line">      <span class="attr">entity_id:</span> <span class="string">input_select.washer_status</span></span><br><span class="line">      <span class="attr">option:</span> <span class="string">Running</span></span><br><span class="line"><span class="attr">mode:</span> <span class="string">single</span></span><br></pre></td></tr></table></figure><p>自动化脚本二：洗衣机用电低于 3 瓦且超过 1 分钟以上后，把状态切换成空置并通过 Twilio 发送短信通知、应用通知、TTS。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">alias:</span> <span class="string">Set</span> <span class="string">washer</span> <span class="string">inactive</span></span><br><span class="line"><span class="attr">trigger:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">numeric_state</span></span><br><span class="line">    <span class="attr">entity_id:</span> <span class="string">switch.xiaomi_chuangmi_plug_v3</span></span><br><span class="line">    <span class="attr">value_template:</span> <span class="string">'<span class="template-variable">&#123;&#123; state_attr(''switch.xiaomi_chuangmi_plug_v3'', ''load_power'') &#125;&#125;</span>'</span></span><br><span class="line">    <span class="attr">below:</span> <span class="string">'3'</span></span><br><span class="line">    <span class="attr">for:</span> <span class="string">'0:01:00'</span></span><br><span class="line"><span class="attr">condition:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">condition:</span> <span class="string">or</span></span><br><span class="line">    <span class="attr">conditions:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">condition:</span> <span class="string">state</span></span><br><span class="line">        <span class="attr">entity_id:</span> <span class="string">sensor.washer_status</span></span><br><span class="line">        <span class="attr">state:</span> <span class="string">Running</span></span><br><span class="line"><span class="attr">action:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">input_select.select_option</span></span><br><span class="line">    <span class="attr">data:</span></span><br><span class="line">      <span class="attr">entity_id:</span> <span class="string">input_select.washer_status</span></span><br><span class="line">      <span class="attr">option:</span> <span class="string">Idle</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">notify.sms</span></span><br><span class="line">    <span class="attr">data:</span></span><br><span class="line">      <span class="attr">message:</span> <span class="string">'The Washer is finished!'</span></span><br><span class="line">      <span class="attr">target:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">'+8613012345678'</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">'+8613033333333'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">tts.google_translate_say</span></span><br><span class="line">    <span class="attr">data:</span></span><br><span class="line">      <span class="attr">message:</span> <span class="string">'The Washer is finished!'</span></span><br><span class="line">    <span class="attr">entity_id:</span> <span class="string">media_player.bedroom_speaker</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">notify.notify</span></span><br><span class="line">    <span class="attr">data:</span></span><br><span class="line">      <span class="attr">title:</span> <span class="string">The</span> <span class="string">Washer</span> <span class="string">is</span> <span class="string">finished</span></span><br><span class="line">      <span class="attr">message:</span> <span class="string">'The Washer is finished!'</span> </span><br><span class="line"><span class="attr">mode:</span> <span class="string">single</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_washer_notify.png" alt="ha_washer_notify"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_washer_cover.png&quot; alt=&quot;ha_washer_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;小弟看到有大大有贴&lt;a
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>窗帘快速接入 HA——免去换轨 超快接入</title>
    <link href="http://yoursite.com/ha_curtain/"/>
    <id>http://yoursite.com/ha_curtain/</id>
    <published>2020-11-22T00:00:00.000Z</published>
    <updated>2021-01-04T06:43:09.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_curtain_cover.png" alt="ha_curtain_cover"></p><p>小弟觉得窗帘接入自动化还是有用的，早上打开窗帘可以更好地醒来，晚上关掉窗帘在黑暗环境也容易睡眠。不知因为什么，市面上大部分窗帘产品感觉都被带偏了，大多数都需要换轨道，安装繁琐，这一点对租房者不友好。</p><p>偶然发现了 <a href="https://www.switch-bot.com/" target="_blank" rel="noopener">Switchbot</a> 有出 <a href="https://www.switch-bot.com/products/switchbot-curtain" target="_blank" rel="noopener">Switchbot Curtain</a> ，安装简单，无需更换轨道，感觉这样的产品更适合自己。</p><p>小弟买的是淘宝的一款类似产品，<a href="https://www.zemismart.com/products/zemismart-tuya-smart-curtain-driver-for-m17" target="_blank" rel="noopener">Zemismart 的涂鸦窗帘</a>，价格只要 Switchbot Curtain 不到一半价格，涂鸦 433 mHZ 方案。</p><h2 id="与-Switchbot-Curtain-对比"><a href="#与-Switchbot-Curtain-对比" class="headerlink" title="与 Switchbot Curtain 对比"></a>与 Switchbot Curtain 对比</h2><p>有大大做了<a href="https://youtu.be/3Gm5bBW1sRY" target="_blank" rel="noopener">与 Switchbot Curtain 对比视频</a>，Switchbot Curtain 全面超越 Zemismart 窗帘，只有两点微微胜出：</p><p>1、价格</p><p>单个 Switchbot Curtain， $89（约 ￥584）</p><p>单个 Zemismart，国际友人 $50，淘宝 ￥200</p><p>单论价格，Zemismart 还是占优势的，淘宝购买更划算。</p><p>2、接入 HA 便利</p><p>Zemismart 有附 433mHz WiFi 转接头，内置涂鸦固件，可以方便接入 HA（Switchbot Curtain 目前似乎不能原生接入 Home  Assistant，Switchbot 可以）。</p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>Zemismart 好像一直在做海外市场，Youtube 有一些产品的视频，小弟买的这个是刚刚生产出来的，下单到收货花了近两周，外包装是一个白色的盒子，一个字也没有，打开盒子，有附一个窗帘马达、一个 WiFi USB 转换器、一个 433 mHZ 遥控器、三对挂钩适配三种窗帘轨道、两节 18650 电池、一本英文说明书。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_curtain_stuff.jpg" alt="ha_curtain_stuff"></p><p>Zemismart 窗帘安装很简单，装上电池，将马达挂在窗帘末端，用遥控器测距就安装好了。</p><p>插上  WiFi USB 转换器，在 Tuya Smart App 中配对就可以接入 WiFi 了。如果 App 上开光与实际不一致，可通过反挂马达同步。</p><p>另外这个窗帘也支持「touch and go」的功能，稍用力反方向手动拉窗帘可以自动开合窗帘。</p><p>尾部还有一个鸡肋的光敏电阻，可以感知光线强弱，当光线较弱时认定为「夜间模式」，会省一点电。</p><h2 id="接入-Home-Assistant-及其他"><a href="#接入-Home-Assistant-及其他" class="headerlink" title="接入 Home  Assistant 及其他"></a>接入 Home  Assistant 及其他</h2><h3 id="利用-Tuya-组件"><a href="#利用-Tuya-组件" class="headerlink" title="利用 Tuya 组件"></a>利用 Tuya 组件</h3><p>Home Assistant 支持涂鸦固件，直接在 Configuration 中点击右下角的添加按钮，搜索 <code>tuya</code>，之后填入用户名、密码、国家代码即可。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_curtain_ha.png" alt="ha_curtain_ha"></p><h3 id="利用-localTuya-组件"><a href="#利用-localTuya-组件" class="headerlink" title="利用 localTuya 组件"></a>利用 localTuya 组件</h3><h3 id="OpenMQTTGateway-自制-RF-网关"><a href="#OpenMQTTGateway-自制-RF-网关" class="headerlink" title="OpenMQTTGateway 自制 RF 网关"></a>OpenMQTTGateway 自制 RF 网关</h3><p>另外，还可以通过 <a href="https://docs.openmqttgateway.com" target="_blank" rel="noopener">OpenMQTTGateway</a> 自制 RF 网关本地控制。</p><p>Google Assistant 和 Alexa 可以通过 Home Assistant，也可以通过涂鸦账号接入。</p><p>Homekit 可以通过 Home Assistant 接入。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_curtain_app2.png" alt="ha_curtain_app"></p><h2 id="自动化"><a href="#自动化" class="headerlink" title="自动化"></a>自动化</h2><p>接入 Home Assistant 可以方便地进行各种自动化，玩法很多。</p><h2 id="缺点"><a href="#缺点" class="headerlink" title="缺点"></a>缺点</h2><p>1、做工不优</p><p>Zemismart 好像在供应链议价能力较弱，这个窗帘外壳看起来像比较廉价的塑料，连接处缝隙也较大，小弟的这个窗帘电池垫片第一次装电池就陷到内壳里了，只能拆开取出。</p><p>2、噪音较大</p><p>这个是比较大的缺点，这款窗帘开关噪音很大，这一点产品开发时好像完全没有考虑优化，每次开合窗帘都像一个巨大机械怪兽在行走。</p><p>3、不支持百分比控制</p><p>无论 Home Assistant、Google Assistant、Alexa或者 HomeKit 中，都只能控制开合，没法按百分比控制（HomeKit 中有显示百分比，但只能控制开合）。</p><p>4、433 mHZ</p><p>这款窗帘是比较过时的 433 mHZ，没有采用 Zigbee，不过厂家似乎在以后会出 Zigbee 的版本。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_curtain_cover.png&quot;
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>小米温度计接入 HA</title>
    <link href="http://yoursite.com/ha_xiaomi_tem/"/>
    <id>http://yoursite.com/ha_xiaomi_tem/</id>
    <published>2020-11-21T00:00:00.000Z</published>
    <updated>2021-01-04T06:43:40.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_xiaomi_tem_cover.png" alt="ha_xiaomi_tem_cover"></p><p>小米有出好几款温度计，借助 ESPHome 和 Zigbee2MQTT，可以将其接入 Home Assistant。</p><h2 id="圆形-Zigbee-温度计"><a href="#圆形-Zigbee-温度计" class="headerlink" title="圆形 Zigbee 温度计"></a>圆形 Zigbee 温度计</h2><p><img src="https://www.zigbee2mqtt.io/images/devices/WSDCGQ01LM.jpg" alt="../images/devices/WSDCGQ01LM.jpg"></p><table><thead><tr><th>型号</th><th><a href="https://www.zigbee2mqtt.io/devices/WSDCGQ11LM.html" target="_blank" rel="noopener">WSDCGQ11LM</a>、<a href="https://www.zigbee2mqtt.io/devices/WSDCGQ12LM.html" target="_blank" rel="noopener">WSDCGQ12LM</a></th></tr></thead><tbody><tr><td>协议</td><td>Zigbee</td></tr></tbody></table><p>这个 Zigbee 圆形温度计好像是小米出的第一款温度计，可以通过 Zigbee2MQTT 快速接入，具体制作可参考小弟之前的文章。</p><h2 id="方形-Zigbee-温度计"><a href="#方形-Zigbee-温度计" class="headerlink" title="方形 Zigbee 温度计"></a>方形 Zigbee 温度计</h2><p><img src="https://www.zigbee2mqtt.io/images/devices/WSDCGQ11LM.jpg" alt="../images/devices/WSDCGQ11LM.jpg"></p><table><thead><tr><th>型号</th><th><a href="https://www.zigbee2mqtt.io/devices/WSDCGQ11LM.html" target="_blank" rel="noopener">WSDCGQ11LM</a>、<a href="https://www.zigbee2mqtt.io/devices/WSDCGQ12LM.html" target="_blank" rel="noopener">WSDCGQ12LM</a></th></tr></thead><tbody><tr><td>协议</td><td>Zigbee</td></tr></tbody></table><p>Zigbee 方形温度计可以通过 Zigbee2MQTT 接入。</p><h2 id="圆形-LCD-蓝牙温度计"><a href="#圆形-LCD-蓝牙温度计" class="headerlink" title="圆形 LCD 蓝牙温度计"></a>圆形 LCD 蓝牙温度计</h2><p><img src="https://esphome.io/_images/xiaomi_lywsdcgq.jpg" alt="../../_images/xiaomi_lywsdcgq.jpg"></p><table><thead><tr><th>型号</th><th>LYWSDCGQ</th></tr></thead><tbody><tr><td>协议</td><td>蓝牙</td></tr></tbody></table><p>这款温度计是蓝牙协议，圓形，分段 LCD 显示，可廣播溫度、濕度和電池電量，可通过 ESPHome 接入（参考小弟之前的文章），</p><p>配置示例：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">sensor:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">xiaomi_lywsdcgq</span></span><br><span class="line">    <span class="attr">mac_address:</span> <span class="string">"7A:80:8E:19:36:BA"</span></span><br><span class="line">    <span class="attr">temperature:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">"LYWSDCGQ Temperature"</span></span><br><span class="line">    <span class="attr">humidity:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">"LYWSDCGQ Humidity"</span></span><br><span class="line">    <span class="attr">battery_level:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">"LYWSDCGQ Battery Level"</span></span><br></pre></td></tr></table></figure><h2 id="长方形-E-Ink-蓝牙温度计"><a href="#长方形-E-Ink-蓝牙温度计" class="headerlink" title="长方形 E-Ink 蓝牙温度计"></a>长方形 E-Ink 蓝牙温度计</h2><p><img src="https://esphome.io/_images/xiaomi_lywsd02.jpg" alt="../../_images/xiaomi_lywsd02.jpg"></p><table><thead><tr><th>型号</th><th>LYWSD02</th></tr></thead><tbody><tr><td>协议</td><td>蓝牙</td></tr></tbody></table><p>长方形 E-Ink 蓝牙温度计有電子墨水顯示屏，可廣播溫度和濕度值，無電池狀態。可通过 ESPHome 接入，</p><p>配置示例：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">sensor:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">xiaomi_lywsd02</span></span><br><span class="line">    <span class="attr">mac_address:</span> <span class="string">"3F:5B:7D:82:58:4E"</span></span><br><span class="line">    <span class="attr">temperature:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">"LYWSD02 Temperature"</span></span><br><span class="line">    <span class="attr">humidity:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">"LYWSD02 Humidity"</span></span><br></pre></td></tr></table></figure><h2 id="圆形-E-Ink-蓝牙温度计"><a href="#圆形-E-Ink-蓝牙温度计" class="headerlink" title="圆形 E-Ink 蓝牙温度计"></a>圆形 E-Ink 蓝牙温度计</h2><p><img src="https://esphome.io/_images/xiaomi_cgg1.jpg" alt="../../_images/xiaomi_cgg1.jpg"></p><table><thead><tr><th>型号</th><th>CGG1</th></tr></thead><tbody><tr><td>协议</td><td>蓝牙</td></tr></tbody></table><p>圆形 E-Ink 蓝牙温度计带電子墨水顯示屏，可通过 ESPHome 接入，</p><p>配置示例：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">sensor:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">xiaomi_cgg1</span></span><br><span class="line">    <span class="attr">mac_address:</span> <span class="string">"7A:80:8E:19:36:BA"</span></span><br><span class="line">    <span class="attr">temperature:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">"CGG1 Temperature"</span></span><br><span class="line">    <span class="attr">humidity:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">"CGG1 Humidity"</span></span><br><span class="line">    <span class="attr">battery_level:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">"CGG1 Battery Level"</span></span><br></pre></td></tr></table></figure><h2 id="方形-LCD-蓝牙小温度计"><a href="#方形-LCD-蓝牙小温度计" class="headerlink" title="方形 LCD 蓝牙小温度计"></a>方形 LCD 蓝牙小温度计</h2><p><img src="https://esphome.io/_images/xiaomi_lywsd03mmc.jpg" alt="../../_images/xiaomi_lywsd03mmc.jpg"></p><table><thead><tr><th>型号</th><th>LYWSD03MMC</th></tr></thead><tbody><tr><td>协议</td><td>蓝牙</td></tr></tbody></table><p>这款温度计体积很小，方形，分段 LCD 显示，蓝牙协议（已加密），可廣播溫度、濕度和電池電量，需要先可获取 bindkey 再通过 ESPHome 接入。</p><p>有大大写了<a href="https://github.com/atc1441/ATC_MiThermometer" target="_blank" rel="noopener">很赞的网页版程序</a>可以快速获取到 bindkey，步骤如下：</p><p>在浏览器（推荐电脑版 Chrome）打开网页 <a href="https://atc1441.github.io/TelinkFlasher.html" target="_blank" rel="noopener">https://atc1441.github.io/TelinkFlasher.html</a> ，点击「connect」可以看到蓝牙设备列表，选中名称叫做「LYWSD03MMC」的设备并配对，若有多个，建议关闭其他，一个一个获取，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_xiaomi_tem1.png" alt="ha_xiaomi_tem1"></p><p>配对后即可获取到 bindkey，记下备用。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_xiaomi_tem2.png" alt="ha_xiaomi_tem2"></p><p>在电脑连接的蓝牙设备中可以获取到温度计的 MAC 地址。</p><p>之后通过 ESPHome 可接入 Home Assistant，配置示例：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">sensor:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">xiaomi_lywsd03mmc</span></span><br><span class="line">    <span class="attr">mac_address:</span> <span class="string">"A4:C1:38:B1:CD:7F"</span></span><br><span class="line">    <span class="attr">bindkey:</span> <span class="string">"eef418daf699a0c188f3bfd17e4565d9"</span></span><br><span class="line">    <span class="attr">temperature:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">"LYWSD03MMC Temperature"</span></span><br><span class="line">    <span class="attr">humidity:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">"LYWSD03MMC Humidity"</span></span><br><span class="line">    <span class="attr">battery_level:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">"LYWSD03MMC Battery Level"</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_xiaomi_tem_cover.png&quot;
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>Google Home 作报时钟</title>
    <link href="http://yoursite.com/ha_clock/"/>
    <id>http://yoursite.com/ha_clock/</id>
    <published>2020-11-15T00:00:00.000Z</published>
    <updated>2021-01-04T06:42:59.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_clock_cover.png" alt="ha_clock_cover"></p><p>小弟一直很偏好报时钟，买过 <a href="https://www.muji.com/sg/products/cmdty/detail/4547315832491" target="_blank" rel="noopener">MUJI 的郭公报时钟</a>，还用宜家的表壳 DIY 过一个报时钟。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_clock_diy.png" alt="ha_clock_diy"></p><p>这些都可以实现报时，但是程序都是写死的。MUJI 报时钟很有趣，还可以感应光线开关报时，小弟觉得这个条件不够完善，有时候很早天亮会被吵醒，晚上完睡觉会吵到别人。DIY 报时钟音乐但是固定的，每天的报时时间也是固定的。</p><p>有 Home Assistant，Google Home 作为音频输出，才是最酷的报时钟。</p><p>首先准备好音频文件，常用的报时铃声有<a href="https://www.youtube.com/watch?v=oTW01MlbBRM" target="_blank" rel="noopener">西敏寺钟声</a>、<a href="https://www.youtube.com/watch?v=0nc6lx2i4-Q" target="_blank" rel="noopener">孤挺花</a>、<a href="https://youtu.be/yDETNSA-u6M" target="_blank" rel="noopener">念故乡</a>等等，需要将音频文件设置成外链，小弟是借助 <a href="https://github.com/helloxz/zdir" target="_blank" rel="noopener">zdir</a> 这个工具。</p><p>之后新建一个自动化，配置参考：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">alias:</span> <span class="string">clock</span> <span class="string">hour</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">''</span></span><br><span class="line"><span class="attr">trigger:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'8:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'9:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'10:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'11:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'12:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'13:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'14:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'15:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'16:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'17:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'18:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'19:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'20:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'21:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'22:00'</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">at:</span> <span class="string">'23:00'</span></span><br><span class="line"><span class="attr">condition:</span> <span class="string">[]</span></span><br><span class="line"><span class="attr">action:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">media_player.play_media</span></span><br><span class="line">    <span class="attr">data:</span></span><br><span class="line">      <span class="attr">entity_id:</span> <span class="string">media_player.bedroom_speaker</span></span><br><span class="line">      <span class="attr">media_content_id:</span> <span class="string">'http://drunkfish.i234.me:4444/var/clock.mp3'</span></span><br><span class="line">      <span class="attr">media_content_type:</span> <span class="string">music</span></span><br><span class="line"><span class="attr">mode:</span> <span class="string">single</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_clock_cover.png&quot; alt=&quot;ha_clock_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;小弟一直很偏好报时钟，买过 &lt;a
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>Chromecast 设备接入 HA</title>
    <link href="http://yoursite.com/ha_chromecast/"/>
    <id>http://yoursite.com/ha_chromecast/</id>
    <published>2020-11-14T00:00:00.000Z</published>
    <updated>2021-01-04T06:34:42.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_chromecast_cover.png" alt="ha_chromecast_cover"></p><p>Home Assistant 可以自动发现 Chromecast 设备，进行相关配置可以解锁更多玩法。</p><h2 id="Chromecast-音频"><a href="#Chromecast-音频" class="headerlink" title="Chromecast 音频"></a>Chromecast 音频</h2><p>Chromecast 音频包括 Google Home、Google Home mini、Google Nest Mini、Google Audio。</p><h3 id="充当-AirPlay-设备"><a href="#充当-AirPlay-设备" class="headerlink" title="充当 AirPlay 设备"></a>充当 AirPlay 设备</h3><p>若安装的是 HASS 可以在 Add-on Store 中查找安装插件 <code>AirCast</code>，安装后不需配置，Google Home就可以当做一个 AirPlay 设备使用了。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_chromecast_aircast.png" alt="ha_chromecast_aircast"></p><h3 id="TTS"><a href="#TTS" class="headerlink" title="TTS"></a>TTS</h3><p>Google Home 支持 TTS，配置 SSL 证书后会出现无法播放的情况，有大大贴出<a href="https://community.home-assistant.io/t/tts-with-ssl-on/207875/3" target="_blank" rel="noopener">解决方法</a>，比较简单的办法是在 <code>tts</code> 组件下添加一个 <code>base_url</code>，地址是配置了 SSL 证书的Home Assistant 访问地址。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">tts:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">google_translate</span></span><br><span class="line">    <span class="attr">base_url:</span> <span class="string">https://&lt;Home</span> <span class="string">Assistant</span> <span class="string">URL&gt;:8123</span></span><br></pre></td></tr></table></figure><h3 id="播放音频文件"><a href="#播放音频文件" class="headerlink" title="播放音频文件"></a>播放音频文件</h3><p>同样音频文件在配置 SSL 证书后也会出现无法播放，小弟的解决办法是通过 <a href="https://github.com/helloxz/zdir" target="_blank" rel="noopener">zdir</a> 这个小工具将音频文件转成外链。</p><h2 id="Android-TV"><a href="#Android-TV" class="headerlink" title="Android TV"></a>Android TV</h2><p>Android TV 在 Home Assistant 也可以自动发现，配置 ADB 有更多的控制选项。</p><p>首先在 Android TV 在手机「设置」→「关于」→「Build」中连按 7 次，打开「开发者选项」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_chromecast_adb.png" alt="ha_chromecast_adb"></p><p>在 Add-on Store 中查找安装插件 <code>ADB - Android Debug Bridge</code>，并配置 Android TV 地址，</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">devices:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">&lt;Android</span> <span class="string">TV</span> <span class="string">IP</span> <span class="string">Address&gt;</span></span><br><span class="line"><span class="attr">reconnect_timeout:</span> <span class="number">90</span></span><br></pre></td></tr></table></figure><p>在 <code>configuration.yaml</code> 文件中添加配置：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">media_player:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">androidtv</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">Android</span> <span class="string">TV</span></span><br><span class="line">    <span class="attr">host:</span> <span class="string">&lt;Android</span> <span class="string">TV</span> <span class="string">IP</span> <span class="string">Address&gt;</span></span><br><span class="line">    <span class="attr">adb_server_ip:</span> <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span></span><br><span class="line">    <span class="attr">adb_server_port:</span> <span class="number">5037</span></span><br></pre></td></tr></table></figure><p>配置好之后重启 Home Assistant，首次连接到设备时，Android TV 上将出现一个对话框，要求批准连接。选中「始终允许来自此设备的连接」复选框，之后点击「确定」。</p><p>在前端 UI 添加媒体播放器即可看到新配置的 Android TV，组件可以看到屏幕缩略图，点开可以控制音量、上一首、下一首等等，也可以直接打开某一个应用。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_chromecast_tv.png" alt="ha_chromecast_tv"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_chromecast_cover.png&quot; alt=&quot;ha_chromecast_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;Home
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>空调快速接入 HA</title>
    <link href="http://yoursite.com/ha_ac/"/>
    <id>http://yoursite.com/ha_ac/</id>
    <published>2020-11-08T00:00:00.000Z</published>
    <updated>2021-01-04T06:42:30.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ac_cover.png" alt="ha_ac_cover"></p><p><a href="https://github.com/Caffreyfans/IRbaby" target="_blank" rel="noopener">IRbaby</a> 是一个 ESP8266 空调红外方案，只需对其进行简单设置就可以快速部署在 Home Assisant。</p><h2 id="材料准备"><a href="#材料准备" class="headerlink" title="材料准备"></a>材料准备</h2><p>1、ESP8266</p><p><img src="http://irbaby.caffreyfans.top/src/nodemcu.jpg" alt="Nodemcu"></p><p>2、红外二级管</p><p><img src="http://irbaby.caffreyfans.top/src/ir_led.jpg" alt="红外二级管"></p><p>3、红外接收头（非必须）</p><p><img src="http://irbaby.caffreyfans.top/src/ir_receiver.jpg" alt="红外接收头"></p><h2 id="连线"><a href="#连线" class="headerlink" title="连线"></a>连线</h2><p><img src="http://irbaby.caffreyfans.top/src/connect.jpg" alt="接线"></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">红外二级管长引脚接 gpio，短脚接地。如果不使用录码功能可忽略红外接收头。</span><br></pre></td></tr></table></figure><h2 id="开始使用"><a href="#开始使用" class="headerlink" title="开始使用"></a>开始使用</h2><ol><li><p>下载 <a href="https://github.com/Caffreyfans/IRbaby-firmware/releases" target="_blank" rel="noopener">ESP8266 固件</a>并烧写到设备，</p></li><li><p>设备上电，移动端搜索连接到 <code>ESP**</code> 信号，并对设备进行联网设置，</p></li><li><p>下载 <a href="https://github.com/Caffreyfans/IRbaby-android/releases" target="_blank" rel="noopener">Android 客户端</a>并运行，对设备进行 MQTT 和红外收发引脚设定。</p><p>参考引脚：</p><p><img src="https://esphome.io/_images/nodemcu_esp8266-full.jpg" alt="../_images/nodemcu_esp8266-full.jpg"></p></li><li><p>匹配电器，完成控制。</p></li></ol><table><thead><tr><th></th><th></th><th></th></tr></thead><tbody><tr><td><img src="http://irbaby.caffreyfans.top/src/discovery.jpg" alt="发现设备"></td><td><img src="http://irbaby.caffreyfans.top/src/device_setting.jpg" alt="配置信息"></td><td><img src="http://irbaby.caffreyfans.top/src/select.jpg" alt="添加电器"></td></tr><tr><td><img src="http://irbaby.caffreyfans.top/src/parse.jpg" alt="匹配电器"></td><td><img src="http://irbaby.caffreyfans.top/src/main.jpg" alt="已有电器"></td><td><img src="http://irbaby.caffreyfans.top/src/mqtt.jpg" alt="导出MQTT"></td></tr></tbody></table><p>5、在 Home Assistant 中的 Integrations 中可以自动发现一个 MQTT 设备。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ac_mqtt.png" alt="ha_ac_mqtt"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ac_cover.png&quot; alt=&quot;ha_ac_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>到家附近 自动开灯</title>
    <link href="http://yoursite.com/ha_tracker/"/>
    <id>http://yoursite.com/ha_tracker/</id>
    <published>2020-11-07T00:00:00.000Z</published>
    <updated>2021-01-04T06:43:24.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_tracker_cover.png" alt="ha_washer_cover"></p><p>我们几乎每天回家都会开灯，Home Assistant 的设备跟踪功能可以帮助这个过程自动化。</p><p>Home Assistant 的设备跟踪功能可以判定在家、离家状态有很多，现在大多数人好像到哪里都会带手机，手机可以作为一个追踪的设备，设备跟踪功能很多，比如 <a href="https://www.home-assistant.io/integrations/icloud/" target="_blank" rel="noopener">Apple iCloud</a>、<a href="https://www.home-assistant.io/integrations/bluetooth_tracker/" target="_blank" rel="noopener">通过蓝牙设备追踪</a>、路由器追踪、<a href="https://www.home-assistant.io/integrations/device_tracker.mqtt/" target="_blank" rel="noopener">MQTT 设备追踪</a>等等。</p><p>其中路由器追踪又分<a href="https://www.home-assistant.io/integrations/asuswrt/" target="_blank" rel="noopener">华硕路由器追踪</a>、<a href="https://www.home-assistant.io/integrations/luci/" target="_blank" rel="noopener">OpenWRT (luci)</a>、<a href="https://www.home-assistant.io/integrations/ubus/" target="_blank" rel="noopener">OpenWrt (ubus)</a> 追踪，小弟这里用 OpenWRT (luci)实例，在这个追踪器中，设备 WiFi 断开 2-3 分钟会设置状态为「离开」，连上 WiFi 10 秒会判定「在线」。</p><h2 id="OpenWRT-配置"><a href="#OpenWRT-配置" class="headerlink" title="OpenWRT 配置"></a>OpenWRT 配置</h2><p>打开 OpenWrt 介面，选中「系统」→「软件包」中，点击刷新软件列表，之后在「过滤器」中搜索「luci-mod-rpc」，如未安装可点击安装。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_tracker_luci.png" alt="ha_washer_luci"></p><h2 id="Home-Assistant-配置"><a href="#Home-Assistant-配置" class="headerlink" title="Home Assistant 配置"></a>Home Assistant 配置</h2><p>在 Home Assistant 的 <code>configuration.yaml</code> 文件中添加配置：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">device_tracker:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">luci</span></span><br><span class="line">    <span class="attr">host:</span> <span class="string">ROUTER_IP_ADDRESS</span></span><br><span class="line">    <span class="attr">username:</span> <span class="string">YOUR_ADMIN_USERNAME</span></span><br><span class="line">    <span class="attr">password:</span> <span class="string">YOUR_ADMIN_PASSWORD</span></span><br><span class="line">    <span class="attr">interval_seconds:</span> <span class="number">10</span></span><br><span class="line">    <span class="attr">consider_home:</span> <span class="number">120</span></span><br><span class="line">    <span class="attr">new_device_defaults:</span></span><br><span class="line">      <span class="attr">track_new_devices:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><h3 id="自动化"><a href="#自动化" class="headerlink" title="自动化"></a>自动化</h3><p>以下是一个自动化的示例，追踪的设备的手机，在 18:00-23:00 期间若手机状态由「离家」变为「在家」，即打开灯。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">alias:</span> <span class="string">welcome</span> <span class="string">home</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">''</span></span><br><span class="line"><span class="attr">trigger:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">state</span></span><br><span class="line">    <span class="attr">entity_id:</span> <span class="string">&lt;device_tracker</span> <span class="string">MAC</span> <span class="string">Address&gt;</span></span><br><span class="line">    <span class="attr">from:</span> <span class="string">not_home</span></span><br><span class="line">    <span class="attr">to:</span> <span class="string">home</span></span><br><span class="line"><span class="attr">condition:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">condition:</span> <span class="string">time</span></span><br><span class="line">    <span class="attr">after:</span> <span class="string">'18:00'</span></span><br><span class="line">    <span class="attr">before:</span> <span class="string">'23:00'</span></span><br><span class="line"><span class="attr">action:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">type:</span> <span class="string">turn_on</span></span><br><span class="line">    <span class="attr">device_id:</span> <span class="string">&lt;device_id&gt;</span></span><br><span class="line">    <span class="attr">entity_id:</span> <span class="string">&lt;entity_id&gt;</span></span><br><span class="line">    <span class="attr">domain:</span> <span class="string">&lt;domain&gt;</span></span><br><span class="line"><span class="attr">mode:</span> <span class="string">single</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_tracker_cover.png&quot; alt=&quot;ha_washer_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;我们几乎每天回家都会开灯，Home
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>Alexa 接入 HA</title>
    <link href="http://yoursite.com/ha_alexa/"/>
    <id>http://yoursite.com/ha_alexa/</id>
    <published>2020-11-02T00:00:00.000Z</published>
    <updated>2021-01-04T06:42:43.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa_covwe.png" alt="ha_alexa_cove"></p><p>和 Google Assistant 一样，通过 <a href="https://www.home-assistant.io/cloud/" target="_blank" rel="noopener">Home Assistant Cloud</a> 服务可以快速接入 Home Assistant，每月 ＄5。有大大写了<a href="https://github.com/mike-grant/haaska" target="_blank" rel="noopener">一个程序</a>可以帮助接入 Home Assistant，并且写了<a href="https://github.com/mike-grant/haaska/wiki" target="_blank" rel="noopener">详细的 wiki</a>，小弟走了一遍流程，下面是步骤：</p><h2 id="设置好外网访问"><a href="#设置好外网访问" class="headerlink" title="设置好外网访问"></a>设置好外网访问</h2><p>和 Google Assistant 一样需要设置好 https 外网访问。</p><h2 id="下载-haaska"><a href="#下载-haaska" class="headerlink" title="下载 haaska"></a>下载 haaska</h2><p>下载 <a href="https://github.com/mike-grant/haaska/releases/latest" target="_blank" rel="noopener">haaska 最新版本</a>，将其命名为like <code>haaska_1.1.0.zip</code>。</p><p>将以下内容添加到您的<code>configuration.yaml</code>文件中：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">api:</span></span><br><span class="line"></span><br><span class="line"><span class="attr">alexa:</span></span><br><span class="line">  <span class="attr">smart_home:</span></span><br></pre></td></tr></table></figure><p>之后在 Home Assistant 中创建一个获取一个长期令牌。登录 Home Assistant，单击头像或头像蓝色圆圈内的字母，向下滚动到「长期访问令牌」。点击 <code>CREATE TOKEN</code>，对于 <code>Name? 输入</code> haaska，之后点击 <code>OK</code>。令牌将出现，複製到安全的地方备用。</p><h2 id="设置-haaska"><a href="#设置-haaska" class="headerlink" title="设置 haaska"></a>设置 haaska</h2><h3 id="设置与亚马逊的登录"><a href="#设置与亚马逊的登录" class="headerlink" title="设置与亚马逊的登录"></a>设置与亚马逊的登录</h3><p>登录 <a href="https://developer.amazon.com/home.html" target="_blank" rel="noopener">Amazon Developer Console</a> （建议美亚账号），</p><p>点击顶部导航栏中的<a href="https://developer.amazon.com/loginwithamazon/console/site/lwa/overview.html" target="_blank" rel="noopener">「使用 Amazon 登录」</a>链接，</p><p>点击「创建新的安全配置文件」的金色按钮，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa1.png" alt="ha_alexa1"></p><p>输入以下内容：</p><ul><li>输入您想要的任何安全配置文件名称，例如  haaska</li><li>写一个简短的描述，例如 haaska for my Home Assistant</li><li>添加您想要的隐私声明网址，随意填</li></ul><p>点击保存继续，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa2.png" alt="ha_alexa2"></p><p>在新的安全配置文件上，点击齿轮按钮，选择网络设置，记下客户端 ID 和客户端密钥，将此窗口保持打开状态以供参考。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa3.png" alt="ha_alexa3"></p><h3 id="设置-Alexa-技能套件"><a href="#设置-Alexa-技能套件" class="headerlink" title="设置 Alexa 技能套件"></a>设置 Alexa 技能套件</h3><p>打开一个<strong>新的浏览器窗口</strong>，使先前的<strong>窗口</strong>保持打开状态，以供以后使用。</p><p>点击页面右上方的<a href="https://developer.amazon.com/home.html" target="_blank" rel="noopener">开发者控制台</a>链接，</p><p>在导航栏中查找 Alexa，选择 <a href="https://developer.amazon.com/alexa/console/ask" target="_blank" rel="noopener">Alexa Skills Kit</a> ，点击<a href="https://developer.amazon.com/alexa/console/ask/create-new-skill" target="_blank" rel="noopener">创建技能</a>按钮，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa4.png" alt="ha_alexa4"></p><p>在这个新页面上，输入以下内容：</p><ul><li>技能名称-可以是您想要的任何名称，例如 haaska，</li><li>语言-选择您要使用的正确语言，例如英语，</li><li>点击「智能家居」图块，</li></ul><p>点击右上角的蓝色「创建技能」按钮，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa5.png" alt="ha_alexa5"></p><p>记下列出的技能ID（例如<code>amzn1.ask.skill.ed66dfa4-1185-492e-bf6e-1f70e90fb018</code>）。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa6.png" alt="ha_alexa6"></p><h3 id="准备-AWS-Lambda-访问"><a href="#准备-AWS-Lambda-访问" class="headerlink" title="准备 AWS Lambda 访问"></a>准备 AWS Lambda 访问</h3><p>打开一个<strong>新的浏览器窗口</strong>。请保持先前的窗口打开，以便以后使用。注册登录到 <a href="https://console.aws.amazon.com/console/home" target="_blank" rel="noopener">AWS 控制台</a>（注意：注册 AWZ 需要外币信用卡验证），选择 <a href="https://console.aws.amazon.com/iam/home" target="_blank" rel="noopener">IAM</a> ，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa7.png" alt="ha_alexa7"></p><p>在左侧栏上，点击<a href="https://console.aws.amazon.com/iam/home#/roles" target="_blank" rel="noopener">角色</a>。之后点击蓝色的<a href="https://console.aws.amazon.com/iam/home#/roles%24new?step=type" target="_blank" rel="noopener">创建角色</a>按钮，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa8.png" alt="ha_alexa8"></p><p>勾选「AWS服务」图块，点击选中 Lambda，之后点击右下角「下一步：权限」按钮，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa9.png" alt="ha_alexa9"></p><p>在搜索框中输入「basic」，之后选中 AWSLambdaBasicExecutionRole，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa10.png" alt="ha_alexa10"></p><p>点击右下角的「下一步：标签」按钮，无需输入任何标签，之后点击「下一步：查看」继续。</p><p>在「角色名称」框中，输入 lambda_basic_execution，点击右下角「创建角色」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa11.png" alt="ha_alexa11"></p><p>单击左上方的AWS按钮，返回到<a href="https://console.aws.amazon.com/console/home" target="_blank" rel="noopener">主控制台</a>。</p><h3 id="地区选择"><a href="#地区选择" class="headerlink" title="地区选择"></a>地区选择</h3><p>在屏幕的右上角用户名旁边，根据语言选中相应的地区，英语选择「美国东部（弗吉尼亚北部）」。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa12.png" alt="ha_alexa12"></p><h3 id="设置-AWS-Lambda-第-1-部分"><a href="#设置-AWS-Lambda-第-1-部分" class="headerlink" title="设置 AWS Lambda-第 1 部分"></a>设置 AWS Lambda-第 1 部分</h3><p>点击左上方的服务按钮，在列表中，找到「计算」部分，之后单击 <a href="https://console.aws.amazon.com/lambda/home" target="_blank" rel="noopener">Lambda</a> ，点击橙色的<a href="https://console.aws.amazon.com/lambda/home?#/create" target="_blank" rel="noopener">创建功能</a>按钮，选中「从头开始创建作者」图块，设置以下选项：</p><ul><li>名称 - haaska</li><li>运行 - <code>Python 3.6</code></li><li>角色 - 选择现有角色</li><li>现有角色 - lambda_basic_execution</li></ul><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa13.png" alt="ha_alexa13"></p><h3 id="设置-AWS-Lambda-第-2-部分"><a href="#设置-AWS-Lambda-第-2-部分" class="headerlink" title="设置 AWS Lambda-第 2 部分"></a>设置 AWS Lambda-第 2 部分</h3><p>在新功能的「设计器」部分中，点击 Alexa Smart Home。如果没有看到此信息，说明尚未设置<a href="https://github.com/mike-grant/haaska/wiki/Setting-up-haaska#Region-Select" target="_blank" rel="noopener">正确的区域</a>。</p><p>在「应用程序 ID」框中，从 Alexa 开发人员控制台窗口（例如<code>amzn1.ask.skill.ed66dfa4-1185-492e-bf6e-1f70e90fb018</code>）複製并粘贴「技能ID」，</p><p>确保选中「启用触发器」，点击右下角的「添加」，在「设计器」部分中，点击功能名称（例如 haaska），在「功能代码」部分中，查找「代码输入类型」，点击此菜单，选择「上传.zip文件」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa14.png" alt="ha_alexa14"></p><p>点击「上传」按钮，选择之前下载的 zip 文件（例如<code>haaska_1.1.0.zip</code>）。</p><p>在「处理程序」框中，将现有内容替换为 haaska.event_handler，等待其加载。</p><h2 id="配置-haaska-功能"><a href="#配置-haaska-功能" class="headerlink" title="配置 haaska 功能"></a>配置 haaska 功能</h2><p>在「功能代码」部分，将看到文件列表，双击 <code>config.json</code>，</p><p>在 URL 部分中，添加远程 Home Assistant URL（例如 <code>https://my-hass.example.com:8123</code>）</p><p>在「承载令牌」部分中，添加先前保存的长期令牌（例如 amcb3i2248yfm …）</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa15.png" alt="ha_alexa15"></p><h2 id="将-AWS-Lambda-链接到-Alexa-技能套件"><a href="#将-AWS-Lambda-链接到-Alexa-技能套件" class="headerlink" title="将 AWS Lambda 链接到 Alexa 技能套件"></a>将 AWS Lambda 链接到 Alexa 技能套件</h2><p>在Lambda窗口的右上方，有一个 ARN（例如 arn:aws:lambda:us-east-1:111234567890:function:haaska），复制此文本并保存。</p><p>返回您的 Alexa 开发人员控制台窗口，将ARN粘贴到标有「默认端点」的框中，</p><p>从可用的复选框中，点击与之前的技能语言/Lambda 功能区域匹配的「端点区域」，将 ARN 粘贴到区域框中，点击右上角的「保存」按钮。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa16.png" alt="ha_alexa16"></p><h2 id="链接-Alexa-技能套件以登录-Amazon"><a href="#链接-Alexa-技能套件以登录-Amazon" class="headerlink" title="链接 Alexa 技能套件以登录 Amazon"></a>链接 Alexa 技能套件以登录 Amazon</h2><p>点击「设置帐户链接」按钮，输入以下内容：</p><table><thead><tr><th>名称</th><th>内容</th></tr></thead><tbody><tr><td>Authorization URI</td><td><code>https://www.amazon.com/ap/oa</code></td></tr><tr><td>Access Token URI</td><td><code>https://api.amazon.com/auth/o2/token</code></td></tr><tr><td>Client ID</td><td>「使用Amazon登录」窗口中的客户端 ID</td></tr><tr><td>Client Secret</td><td>「使用亚马逊登录」窗口中的客户端秘钥</td></tr><tr><td>Client Authentication Scheme</td><td>HTTP 脚本 (推荐)</td></tr><tr><td>Scope</td><td>点击 <code>+ Add Scope</code> 并输入 <code>profile</code></td></tr><tr><td>Domain List</td><td><em>Not used</em></td></tr><tr><td>Default Access Token Expiration Time</td><td><em>Not used</em></td></tr></tbody></table><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa17.png" alt="ha_alexa17"></p><p>之后将看到重定向URI的列表，把这些复制备用，点击右上角的保存。</p><p>返回到 Amazon 开发人员控制台/使用 Amazon 登录窗口，点击右下角的编辑，在「允许的返回 URL」部分中，点击「添加另一个」，直到三行为止。</p><p>在每一行上，从  Alexa Developer Console 窗口中添加一个重定向 URL，点击保存。</p><h3 id="测试-haaska"><a href="#测试-haaska" class="headerlink" title="测试 haaska"></a>测试 haaska</h3><p>登录到 <a href="https://console.aws.amazon.com/lambda/home" target="_blank" rel="noopener">Lambda 控制台</a>，点击 haaska，之后点击页面右上方的「测试」按钮，</p><p>在「事件名称」字段中为测试指定一个自定义名称。将以下 JSON 复制到测试控制台：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"directive"</span>: &#123;</span><br><span class="line">    <span class="attr">"header"</span>: &#123;</span><br><span class="line">      <span class="attr">"namespace"</span>: <span class="string">"Alexa.Discovery"</span>,</span><br><span class="line">      <span class="attr">"name"</span>: <span class="string">"Discover"</span>,</span><br><span class="line">      <span class="attr">"payloadVersion"</span>: <span class="string">"3"</span>,</span><br><span class="line">      <span class="attr">"messageId"</span>: <span class="string">"1bd5d003-31b9-476f-ad03-71d471922820"</span></span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">"payload"</span>: &#123;</span><br><span class="line">      <span class="attr">"scope"</span>: &#123;</span><br><span class="line">        <span class="attr">"type"</span>: <span class="string">"BearerToken"</span>,</span><br><span class="line">        <span class="attr">"token"</span>: <span class="string">"access-token-from-skill"</span></span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>单击「创建」，测试应该在「测试」按钮旁边的下拉框中列出，单击「测试」按钮，如果测试成功，将出现一个绿色的选中标记。恭喜，haaska 可以与 Home Assistant 进行通信。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa18.png" alt="ha_alexa18"></p><p>如果有问题，并且测试失败，可以展开「详细信息」部分查看。</p><h2 id="Alexa-App-中设定"><a href="#Alexa-App-中设定" class="headerlink" title="Alexa App 中设定"></a>Alexa App 中设定</h2><p>打开 Alexa App，在「更多」tab 中选择「Skill &amp; Games」，之后就可以在「Your Skills」的「Dev」中可以看到建立的技能，连接即可。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa19.png" alt="ha_alexa19"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_alexa_covwe.png&quot; alt=&quot;ha_alexa_cove&quot;&gt;&lt;/p&gt;
&lt;p&gt;和 Google Assistant
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>Google Assistant 接入 HA</title>
    <link href="http://yoursite.com/ha_ga/"/>
    <id>http://yoursite.com/ha_ga/</id>
    <published>2020-11-01T00:00:00.000Z</published>
    <updated>2021-01-04T06:43:17.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ga_cover.png" alt="ha_google_assistant_cover"></p><p>Google Assistant 接入 Home Assistant 最简单的方法是通过 <a href="https://www.home-assistant.io/cloud/" target="_blank" rel="noopener">Home Assistant Cloud</a> 服务，每月 ＄5，收入用于支持 Home Assistant 的开发，如果不想折腾可以直接订阅即可。另外一种方法是通过手动设置的方法，下面是步骤：</p><h2 id="设置好外网访问"><a href="#设置好外网访问" class="headerlink" title="设置好外网访问"></a>设置好外网访问</h2><p>首先确保有公网 IP，在群晖或路由器中设置好 DDNS、端口映射 8123 端口，域名申请好 SSL 证书。</p><h2 id="新增-Action"><a href="#新增-Action" class="headerlink" title="新增 Action"></a>新增 Action</h2><p>打开网址 <a href="http://console.actions.google.com/" target="_blank" rel="noopener">http://console.actions.google.com</a>，</p><p>点击 <code>New Project</code> 并为项目命名，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ga1.png" alt="ha_ga1"></p><p>选中 <code>Smart Home</code> 卡片，之后点击 <code>Start Building</code>，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ga2.png" alt="ha_ga2"></p><p>点击 <code>Name your Smart Home action</code> 下方 <code>Quick Setup</code> 的名称，为操作命名（Home Assistant 将在 Google Home 应用中显示为 <code>[test] &lt;Action Name&gt;</code>），</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ga3.png" alt="ha_ga3"></p><p>点击 <code>Build your Action</code>下方的 <code>Add Action(s)</code>，添加 Home Assistant 的访问 URL <code>https://[YOUR HOME ASSISTANT URL:PORT]/api/google_assistant</code>，之后点击 <code>Save</code>，在 <code>Overview</code> 选项卡，可以看到应用程序详细信息。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ga4.png" alt="ha_ga4"></p><h2 id="关联账号"><a href="#关联账号" class="headerlink" title="关联账号"></a>关联账号</h2><p>点击页面 <code>Setup account linking</code> 下面的 <code>Quick Setup</code> 设置<code>Overview</code>，</p><p>输入以下内容：1.专案项目 ID： <code>https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID</code>（可以通过网址 URL 看到 YOUR_PROJECT_ID，）；2. Client Secret：无填写要求；3.授权 URL（与实际 URL 替换）： <code>https://[YOUR HOME ASSISTANT URL:PORT]/auth/authorize</code>。4.令牌URL（与实际URL替换）： <code>https://[YOUR HOME ASSISTANT URL:PORT]/auth/token</code>，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ga5.png" alt="ha_ga5"></p><p>在<code>Configure your client</code> <code>Scopes</code>文本框中，输入 <code>email</code> 并点击 <code>Add scope</code>，输入<code>name</code>并再次点击 <code>Add scope</code> 。（不要勾选 <code>Google to transmit clientID and secret via HTTP basic auth header</code>)，点击<code>Next</code>，然后点击 <code>Save</code>，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ga6.png" alt="ha_ga6"></p><p>选择顶部的选项卡 <code>Test</code> 按钮以生成草稿版本 Test App。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ga7.png" alt="ha_ga7"></p><h2 id="启用设备同步"><a href="#启用设备同步" class="headerlink" title="启用设备同步"></a>启用设备同步</h2><p>这一步的目的是向Google服务器发送状态报告，当使用命令 Ok Google，sync my devices 时，可以同步设备。</p><p>首先在GCP控制台中，转到<a href="https://console.cloud.google.com/apis/credentials/serviceaccountkey" target="_blank" rel="noopener">「创建服务帐户密钥」</a>页面。</p><p>确保匹配 <code>project_id</code>，从服务帐户列表中，选择新服务帐户。在服务帐户名称字段中，输入名称。在服务帐户 ID 字段中，输入 ID。从角色列表中，选择服务帐户 &gt; 服务帐户令牌创建者。密钥类型，选择 JSON，点击创建，之后包含密钥下载的 JSON 文件将自动下载。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ga8.png" alt="ha_ga8"></p><p>转到 <a href="https://console.cloud.google.com/apis/api/homegraph.googleapis.com/overview" target="_blank" rel="noopener">Google API 控制台</a>。选择项目，查找并启用 HomeGraph API。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ga9.png" alt="ha_ga9"></p><h2 id="Home-Assistant-配置"><a href="#Home-Assistant-配置" class="headerlink" title="Home Assistant 配置"></a>Home Assistant 配置</h2><p>将以下配置添加至 <code>configuration.yaml</code>：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">google_assistant:</span></span><br><span class="line">  <span class="attr">project_id:</span> <span class="string">YOUR_PROJECT_ID</span></span><br><span class="line">  <span class="attr">service_account:</span> <span class="type">!include</span> <span class="string">SERVICE_ACCOUNT.JSON</span></span><br><span class="line">  <span class="attr">report_state:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>如果有不想使用 Google Assistant 进行控制的实体，可以将其禁用，在其下方，键入<code>expose:</code>并将其设置为<code>false</code>。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">google_assistant:</span></span><br><span class="line">    <span class="attr">light.living_room:</span></span><br><span class="line">      <span class="attr">expose:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure><h2 id="Google-Home-App-设置"><a href="#Google-Home-App-设置" class="headerlink" title="Google Home App 设置"></a>Google Home App 设置</h2><p>打开手机上的 Google Home App，添加设备，选择 test 账号，之后填入 Home Assistant 用户名及密码。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ga10.png" alt="ha_ga10"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/ha_ga_cover.png&quot; alt=&quot;ha_google_assistant_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;Google
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>制作使用网址导航</title>
    <link href="http://yoursite.com/nav/"/>
    <id>http://yoursite.com/nav/</id>
    <published>2020-10-25T00:00:00.000Z</published>
    <updated>2021-01-04T06:45:01.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/nav_cover.png" alt="nav_cover"></p><p>小弟在群晖上跑了不少服务，多了之后要记各个服务项的地址，想尝试做一个网址导航方便使用各项服务。一番搜索，发现<a href="https://github.com/WebStackPage/WebStackPage.github.io" target="_blank" rel="noopener">这个</a>好像不错，静态页面，简单直接。</p><h2 id="修改源码"><a href="#修改源码" class="headerlink" title="修改源码"></a>修改源码</h2><p>首先修改静态页面的源码，将里面的网址换成自己的地址。<a href="https://github.com/WebStackPage/WebStackPage.github.io" target="_blank" rel="noopener">下载</a>好作者的源码解压，用文本编辑器打开其中的文件修改即可。有一个问题是，html 文件里的各种标签的括号容易搞混层级，这里可以一款前端编辑器 <a href="https://www.espressoapp.com/" target="_blank" rel="noopener">Espresso</a>，这个小工具可以方便折叠收起各种标签，找到对应位置替换地址即可。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/nav_tool.png" alt="nav_tool"></p><p>图片资源放在 <code>/assets/images</code> 路径下，作者还放了一个 Sketch 的源文件，方便改图。</p><p>改好好可以在浏览器中看下效果。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/nav_preview.png" alt="nav_preview"></p><h2 id="设置外网访问"><a href="#设置外网访问" class="headerlink" title="设置外网访问"></a>设置外网访问</h2><p>比较简单从外网访问这个网页的方式是通过群晖的 Web 服务器。</p><p>首先上传网页文件夹至群晖任意位置，在群晖套件中心安装「Web Station」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/nav_web1.png" alt="nav_web1"></p><p>打开 Web Station，新建一个网站，可以选择按端口号，之后填写端口号，后端服务器可任意选择，之后即可创建好网站。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/nav_web2.png" alt="nav_web2"></p><p>若设置好了 DDNS 与端口映射，应该外网就可以访问了。</p><p>需要注意的是，各类入口露在外网，记得设好密码，密码建议不要太简单。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/nav_cover.png&quot;
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>舵机控制普通单控 86 开关</title>
    <link href="http://yoursite.com/servo/"/>
    <id>http://yoursite.com/servo/</id>
    <published>2020-10-24T00:00:00.000Z</published>
    <updated>2021-01-04T06:46:06.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/servo_cover.png" alt="servo_cover"></p><p>小弟想将灯泡接入 HA，看到有大大通过舵机控制灯泡开关（参见<a href="https://taron.top/archives/108.html" target="_blank" rel="noopener">这里</a>），感觉思路很赞，那个大大是通过 Arduino 写固件，小弟觉得想用 ESPHome 实现，代码简单、有拓展性（可接入其他传感器之类的），尝试一番成功接入。</p><h2 id="材料准备"><a href="#材料准备" class="headerlink" title="材料准备"></a>材料准备</h2><p>1、ESP8266 开发板</p><p>2、SG90 9g 克舵机（90 度）</p><p>3、公对母杜邦线</p><p>4、公对母 USB 延长线（方便接电源）</p><p>5、90 度直角固定支架（或其他直角支架）</p><h2 id="刷入固件"><a href="#刷入固件" class="headerlink" title="刷入固件"></a>刷入固件</h2><p>确保安装好 ESPHome，HASS 可以直接通过插件安装。打开 ESPHome ，新建或打开已经或在原有设备新增以下代码：</p><p>ESP8266 参考：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">api:</span></span><br><span class="line">  <span class="attr">services:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">control_servo</span></span><br><span class="line">      <span class="attr">variables:</span></span><br><span class="line">        <span class="attr">level:</span> <span class="string">float</span></span><br><span class="line">      <span class="attr">then:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">servo.write:</span></span><br><span class="line">            <span class="attr">id:</span> <span class="string">my_servo</span></span><br><span class="line">            <span class="attr">level:</span> <span class="type">!lambda</span> <span class="string">'return level / 100.0;'</span></span><br><span class="line"></span><br><span class="line"><span class="attr">servo:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">id:</span> <span class="string">my_servo</span></span><br><span class="line">    <span class="attr">output:</span> <span class="string">pwm_output</span></span><br><span class="line"></span><br><span class="line"><span class="attr">output:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">esp8266_pwm</span></span><br><span class="line">    <span class="attr">id:</span> <span class="string">pwm_output</span></span><br><span class="line">    <span class="attr">pin:</span> <span class="string">D7</span></span><br><span class="line">    <span class="attr">frequency:</span> <span class="number">50</span> <span class="string">Hz</span></span><br><span class="line"></span><br><span class="line"><span class="attr">switch:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">platform:</span> <span class="string">gpio</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">"switch"</span></span><br><span class="line">    <span class="attr">pin:</span> <span class="string">D7</span></span><br><span class="line">    <span class="attr">on_turn_on:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">servo.write:</span></span><br><span class="line">          <span class="attr">id:</span> <span class="string">my_servo</span></span><br><span class="line">          <span class="attr">level:</span> <span class="string">+100.0%</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">delay:</span> <span class="number">0.</span><span class="string">5s</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">servo.write:</span></span><br><span class="line">          <span class="attr">id:</span> <span class="string">my_servo</span></span><br><span class="line">          <span class="attr">level:</span> <span class="number">0</span><span class="string">%</span>  </span><br><span class="line">    <span class="attr">on_turn_off:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">servo.write:</span></span><br><span class="line">          <span class="attr">id:</span> <span class="string">my_servo</span></span><br><span class="line">          <span class="attr">level:</span> <span class="number">-100.0</span><span class="string">%</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">delay:</span> <span class="number">0.</span><span class="string">5s</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">servo.write:</span></span><br><span class="line">          <span class="attr">id:</span> <span class="string">my_servo</span></span><br><span class="line">          <span class="attr">level:</span> <span class="number">0</span><span class="string">%</span></span><br></pre></td></tr></table></figure><p>代码执行命令如下：按下「开」，正旋转 70%，500ms 之后回到初始位置；按下「关」，负旋转 70%，500ms 之后回到初始位置。注意角度可以按照实际情况修改。</p><p>在 Home Assistant 可以自动发现 ESPHome 设备，添加即可。</p><h2 id="连线"><a href="#连线" class="headerlink" title="连线"></a>连线</h2><p>首先将舵机与 ESP8266 连线，</p><table><thead><tr><th>舵机</th><th>ESP8266</th></tr></thead><tbody><tr><td>红色</td><td>3.3V</td></tr><tr><td>棕色</td><td>GND</td></tr><tr><td>黄色</td><td>D7</td></tr></tbody></table><p>将舵机、直角支架放在 86 开关上确定各自的距离，注意舵机旋转方向，用热熔胶粘在直角支架上，直角支架粘在墙上，舵机与开关可以留一定距离，这样不影响手动开关。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/servo_pic1.jpg" alt="servo_pic1"></p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/servo_pic2.jpg" alt="servo_pic2"></p><p>距离可参考小弟的：</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/servo_distance2.png" alt="servo_distance"></p><p>粘上后最好等待 24 小时热熔胶固定再使用。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic3@master/uPic/servo_cover.png&quot; alt=&quot;servo_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;小弟想将灯泡接入
        
      
    
    </summary>
    
    
    
      <category term="Home Assistant" scheme="http://yoursite.com/tags/Home-Assistant/"/>
    
  </entry>
  
  <entry>
    <title>大国特色奇异技巧系列之三：联通光猫改桥接实现外网访问</title>
    <link href="http://yoursite.com/modem/"/>
    <id>http://yoursite.com/modem/</id>
    <published>2020-08-08T00:00:00.000Z</published>
    <updated>2021-01-04T06:44:53.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/modem_cover.png" alt="modem_cover"></p><p>如果想要外网访问群晖或其他自己搭建的 Docker 等服务，比较好的方法是利用 DDNS 和端口映射，比其他方法稳定且快速，方法如下：</p><h2 id="光猫改桥接"><a href="#光猫改桥接" class="headerlink" title="光猫改桥接"></a>光猫改桥接</h2><p>光猫最好改成桥接模式，用路由器拨号，这样可以少一层 NAT，并且不受限于自带光猫羸弱的硬件配置和残缺的软件功能。不同光猫改桥接方法不尽相同，以小弟住的地方的光猫是中兴 F627V2，如果和小弟同款，可以参考以下步骤：</p><h3 id="前期准备"><a href="#前期准备" class="headerlink" title="前期准备"></a>前期准备</h3><p>1、确保同型号、同地区</p><p>小弟用的是北京联通，中兴 F627V2，外观如下：</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/modem_hardware1.png" alt="modem_hardware1"></p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/modem_hardware2.png" alt="modem_hardware2"></p><p>另外可以连接光猫的 WiFi 登录光猫后台查看型号：</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/modem_series.png" alt="modem_series"></p><p>2、备份好拨号用户名和密码</p><p>建议保存好拨号用户名和密码，路由器拨号时需要使用。</p><p>连接光猫的 WiFi（名称与密码在光猫背面），浏览器访问 <a href="http://192.168.1.1/hidden_version_switch.gch" target="_blank" rel="noopener">http://192.168.1.1/hidden_version_switch.gch</a> ，选 <code>Default version</code>，输入密码 CUAdmin，保存修改，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/modem_switch.png" alt="modem_switch"></p><p>浏览器访问 <a href="http://192.168.1.1/cu.html" target="_blank" rel="noopener">http://192.168.1.1/cu.html</a> ，选择「管理员账户」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/modem_admin.png" alt="modem_admin"></p><p>输入密码 <code>CUAdmin</code> 进入，选择「基本配置」，连接名称选择 <code>2_INTERNET_B_VID_0</code>，端口绑定勾选 <code>LAN1</code>，VLAN 模式选 <code>改写(tag)</code>，VLAN ID 填写 <code>3961</code>，点击「修改」。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/modem_config.png" alt="modem_config"></p><p>输完后再检查一遍，确保输入正确。</p><h3 id="配置路由器拨号"><a href="#配置路由器拨号" class="headerlink" title="配置路由器拨号"></a>配置路由器拨号</h3><p>不同的路由器配置拨号不完全一样，以 OpenWrt 为例：</p><p>在「网络」中选择「端口」，找到「WAN」口，点击「修改」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/modem_pppoe1.png" alt="modem_pppoe1"></p><p>协议选择「PPPoE」，填入拨号用户名和密码，点击「保存并应用」。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/modem_pppoe2.png" alt="modem_pppoe2"></p><p>之后浏览器打开网址试试，正常打开说明配置成功。</p><h2 id="确保有公网-IP"><a href="#确保有公网-IP" class="headerlink" title="确保有公网 IP"></a>确保有公网 IP</h2><p>外网访问 NAS 需要公网 IP，判断是否有公网 IP 可以参照<a href="https://hsk.oray.com/news/5928.html" target="_blank" rel="noopener">这篇</a>。</p><p>由于 IPv4 是稀缺资源（现已耗尽），公网 IP 大部分默认没有开通。如果没有公网 IP，可以打电话给运营商的客服，一般情况会有装网师傅再联系，说明开通公网 IP 即可，注意不要说搭服务器之类的黑话（需要知道，在世界上最富裕、最发达、最文明、最开放的國家，网站是需要「备案」的）。话术可以参考以下：</p><blockquote><p>话术参考 1：我想用光猫里的端口映射功能，请问是应该怎样操作。</p></blockquote><p>（一般师傅会推荐使用光猫自带的 DMZ 功能，贴心会发一个 PDF 说明文件，之后如果没开公网 IP 师傅会帮开公网 IP ）</p><blockquote><p>话术参考 2：我想给家里的网开公网 IP。</p></blockquote><p>（不想拐弯抹角也可以直接问，有些师傅会说公网 IP 是企业用的，费用很高，这时候说是那种临时公网 IP）</p><h2 id="设置-DDNS"><a href="#设置-DDNS" class="headerlink" title="设置 DDNS"></a>设置 DDNS</h2><p>DDNS 即动态 DNS，方便我们的公网 IP 更换时仍可以指向我们的主机。设置 DDNS 最简单的方法是利用群晖的 DDNS（OpenWrt 也支持，比群晖稍繁琐）。</p><p>打开群晖控制面板，找到「外部访问」，之后添加 DDNS，最简单的是选择群晖自带的 DDNS。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/modem_ddns2.png" alt="modem_ddns"></p><h2 id="配置端口映射"><a href="#配置端口映射" class="headerlink" title="配置端口映射"></a>配置端口映射</h2><p>设置好 DDNS 还需要配置端口映射，不同路由器配置方法不尽相同，大体相似，以 OpenWrt 为例：</p><p>在「网络」中选择「防火墙」，找到「端口转发」，添加主机、内部端口、外部端口即可。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/modem_port.png" alt="modem_port"></p><p>配置好之后可以用手机蜂窝网络访问 DDNS 域名:端口号，可正常访问说明配置成功。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/modem_cover.png&quot; alt=&quot;modem_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;如果想要外网访问群晖或其他自己搭建的 Docker
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>这个手机来自过去——掌阅 F1/海信 A5 使用</title>
    <link href="http://yoursite.com/eink/"/>
    <id>http://yoursite.com/eink/</id>
    <published>2020-07-25T00:00:00.000Z</published>
    <updated>2021-01-04T06:41:47.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_cover.png" alt="eink_cover"></p><blockquote><p>It’s time for a phone to save us from our phones.</p><p>– <a href="https://youtu.be/l9evyGr57hs" target="_blank" rel="noopener">Windows Phone commercial - “Really?!”</a></p></blockquote><p>（9 月 10 日补充「关于打卡」）</p><p>小弟最近入手一个手机，<a href="https://item.jd.com/100012756284.html" target="_blank" rel="noopener">掌阅 F1</a>，这个手机特别之处是屏幕是电子纸，另外还可以参与<a href="https://sale.jd.com/m/h5/urbwvqmqh1qb.html" target="_blank" rel="noopener">打卡 0 元购买</a>。手机是海信代工的，外壳打上了掌阅的标志，和去年出的「<a href="https://item.jd.com/100009261640.html" target="_blank" rel="noopener">海信 A5</a>」硬件配置相同，配置如下：</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_hardware.png" alt="eink_hardware"></p><p>小弟用了一段时间这个手机，感觉还挺好的，以下是一些应用推荐：</p><h2 id="作为电子纸阅读器"><a href="#作为电子纸阅读器" class="headerlink" title="作为电子纸阅读器"></a>作为电子纸阅读器</h2><p>这个手机作为一个文字类电子纸阅读器还是可以的，5.84 英寸、276 ppi、158g，比 Kindle 便携、更容易装进口袋。由于是手机，故可插手机卡，支持 4G，在没有 WiFi 的地方可以通过蜂窝网络联网。另外，手机对电子纸屏幕有软件上的优化，包括底部导航键可以选择「清晰」「流畅」等模式、双击左侧按键可以强制刷新、设置应用内整页刷新等等。骁龙 439、4G 内存非高配，但对阅读类应用够用。</p><p>注意：阅读类应用尽量调成白底黑字、无动画、高对比度，在电子纸屏幕显示效果最佳。</p><h3 id="读书应用推荐"><a href="#读书应用推荐" class="headerlink" title="读书应用推荐"></a>读书应用推荐</h3><p>1、各电子书平台</p><p>手机内置 Android 9 系统，可以安装各类 Android 应用。如果在其他电子书平台（如 <a href="https://readmoo.com/" target="_blank" rel="noopener">Readmoo 读墨</a>、<a href="https://www.kobo.com/" target="_blank" rel="noopener">Kobo</a>）有购买电子书，可以免转档直接安装相应应用使用（Google Play 图书无法使用）。</p><p>2、Kindle</p><p>如果有 Kindle 设备，可以装一个 Kindle 应用，与硬件 Kindle 或其他平台的 Kindle 阅读进度保持同步。</p><p>另外，亚马逊中国自己魔改了 Kindle 应用，推荐安装 Google Play 的版本，64 位，无启动广告。</p><p>3、Moon+ Reader</p><p>阅读应用推荐 <a href="https://www.moondownload.com" target="_blank" rel="noopener">Moon+ Reader</a>，可以高度定制化，对阅读内的方方面面设置，包括字体、间距、翻页方式、调用 TTS 等等，甚至可以设置使用耳机音量键翻页。</p><p>4、KOReader</p><p><a href="https://koreader.rocks/" target="_blank" rel="noopener">KOReader</a> 可以方便读一些图片类、扫描类 PDF 文档，能自动切边、重排（许多人给 Kindle 越狱或选 Kobo 阅读器而不选 Kindle 就是为了可以用 KOReader）。由于有更高的硬件配置，使用中，感觉比在 Kindle 上使用 KOReader 更流畅，少有卡顿情况。</p><p>下图是同一个文档同一页重排前后效果对比：</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_koreader.png" alt="eink_koreader"></p><p>另外，由于是电子纸屏幕，可以关闭「颜色渲染」功能，减少一点内存占用。</p><h3 id="借书应用推荐"><a href="#借书应用推荐" class="headerlink" title="借书应用推荐"></a>借书应用推荐</h3><p>1、Libby</p><p>Kindle 可以在图书馆借书，但是需要美国借书证或美国实体手机号（Google Voice 号码不可以）。</p><p>借助安装 <a href="https://www.overdrive.com/apps/libby/" target="_blank" rel="noopener">Libby</a> 应用，借书并在电子纸屏幕上阅读成为可能。<a href="https://www.overdrive.com/apps/libby/" target="_blank" rel="noopener">Libby</a> 是一个超酷的借书应用，与全世界大多数图书馆都有合作（其中包括中国），在上面可以很方便地借电子书或有声书。</p><p>首先可以到下面列出的图书馆办一张借书证，得到卡号与密码（其中浙江图书馆可以在支付宝中在线申请）。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_china_list.png" alt="eink_china_list"></p><p>在 Libby 中找到对应图书馆，之后添加借书证就可以借书了，可借的包括英文书、中文书、有声书（带耳机标志）。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_libby.png" alt="eink_libby"></p><p>注意：大部分读者书图书馆只有几份数字拷贝，可能需要预定排队。另外，借书有数量限制，每个图书馆不同，默认一定期限内自动归还，也可以提早归还。</p><p>2、Hyread</p><p><a href="https://ebook.hyread.com.tw" target="_blank" rel="noopener">Hyread</a> 是台湾图书馆借阅平台，中文书多，还包括很多热门的的书。大多数台湾的图书馆注册验证并不严格，在中国也能用（参见这位大大写的<a href="https://www.facebook.com/groups/hyreadgaze/permalink/872978743174546/" target="_blank" rel="noopener">攻略</a>）。</p><p>注册成功后在 Hyread 中找到对应图书馆并填入用户名及密码。之后可以按照类别选书，也可以直接搜索书名或作者名。可借的有中文书、杂志，其中一些很夯的如《原子习惯》也有。大部分书也只有几份数字拷贝，想借需要预定。</p><p>Hyread 比较酷的一点是大部分书可以在线读（这个比 Libby 还要酷），一本书看到「Read now」按钮表示这本书可以在线读，这个有点类似在图书馆阅览书，但不借回家。借书时，有些书会消耗点数，有些不会，不同图书馆点数不尽相同。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_hyread.png" alt="eink_hyread"></p><h3 id="RSS-订阅"><a href="#RSS-订阅" class="headerlink" title="RSS 订阅"></a>RSS 订阅</h3><p>RSS 订阅推荐 <a href="https://www.inoreader.com" target="_blank" rel="noopener">Inoreader</a>，可以多平台同步，方便将文章保存至 Evernote 等。</p><h3 id="那么，Kindle-呢"><a href="#那么，Kindle-呢" class="headerlink" title="那么，Kindle 呢"></a>那么，Kindle 呢</h3><p>论显示效果，小弟感觉 Kindle 在软件层面优化得更好一点，文字显示更锐利，不容易有类似残影，漫画显示也更清晰、屏幕显得更大。2：1 的屏幕比时每行可以容纳的字减少，眼睛需要更频繁上下跳转。另一方面，2：1 的屏幕比使手机很细长，更容易装进口袋。内置相对开放的 Android 可以安装各种阅读类应用，作为 Kindle 的一个补充。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_compare.JPG" alt="eink_compare"></p><h2 id="作为音乐播放器"><a href="#作为音乐播放器" class="headerlink" title="作为音乐播放器"></a>作为音乐播放器</h2><p>这个手机视频体验不优，但当一个音乐播放器，连接音箱还是不错的。小弟连的是 Google Home Mini，手机不支持使用 Google Home 应用连接 Chromecast，但是可以蓝牙连接。使用中，蓝牙连接较稳定，也支持各种语音指令，如「pause」「continue to play」「next」等等。</p><h3 id="网易云音乐"><a href="#网易云音乐" class="headerlink" title="网易云音乐"></a>网易云音乐</h3><p>网易云音乐配合 <a href="https://github.com/nondanee/UnblockNeteaseMusic" target="_blank" rel="noopener">UnblockNeteaseMusic</a> 解锁脚本可以听大多数音乐。建议安装<a href="https://www.wandoujia.com/apps/293217/history_v90" target="_blank" rel="noopener">网易云音乐 v4.0.0</a>，没有花里胡哨的功能、资源占用小。 </p><h3 id="Youtube"><a href="#Youtube" class="headerlink" title="Youtube"></a>Youtube</h3><p>Youtube 有很多官方或个人上传的 MV 视频，基本覆盖所有已发行的音乐， Youtube 也可以做一个音乐播放工具。一个问题是，小弟目前不知道怎么给这个手机安装 Google 框架，官方的 Youtube 没法使用。小弟安装了一个改版的 Youtube，<a href="https://vanced.app/" target="_blank" rel="noopener">YouTube Vanced</a>（感谢 Xin Yee 推荐），免 Google 服务，另外可以去广告，还有后台播放。</p><h3 id="Spotify"><a href="#Spotify" class="headerlink" title="Spotify"></a>Spotify</h3><p>如果没有 Spotify Premium，可以到 <a href="https://moddroid.com/" target="_blank" rel="noopener">MODDROID</a> 下载一个修改版的 Spotify ，可以去广告、无限切歌。不过，比较尴尬的是， Spotify 在这个手机上显示黑乎乎一片，看起来有一点吃力。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_music.png" alt="eink_music"></p><h2 id="作为学习手机"><a href="#作为学习手机" class="headerlink" title="作为学习手机"></a>作为学习手机</h2><p>这个设备和 Kindle 不同之处在于，可以作为手机使用。小弟觉得这个手机很适合作为想学习的人，需要手机的一些便利，但是又不希望沉迷在视频、社交等应用，某种程度可能是一个「save us from our phones」的手机。</p><h3 id="优点"><a href="#优点" class="headerlink" title="优点"></a>优点</h3><p>作为一个手机，这个手机在系统上做了优化，包括上划、左划、下划全局手势，还为电子纸屏幕的优化，不用操心的后台自动清理、等等，以及一些贴心的新功能，如分屏、息屏手势、两指识别等。</p><p>手机自带的应用也相对很完善，拨号内置了 T9 拨号，也有类似冰箱的应用，甚至有一个语音助手。</p><p>手机电池容量够，加上电子纸屏幕耗电少，待机时间长。</p><h3 id="缺点"><a href="#缺点" class="headerlink" title="缺点"></a>缺点</h3><p>由于 E-Ink 屏幕限制，手机屏幕对视频、动效显示不佳，另外，有些暗色系应用看起来有些吃力。</p><p>另外一个是小弟没有正常安装使用 Google 框架（应该可以使用，但小弟没找到方法），依赖 Google 框架的应用用不了，手机可用性大大降低。</p><p>另外，手机 WiFi 只支持 2.4GHz，有点遗憾。</p><h3 id="应用推荐"><a href="#应用推荐" class="headerlink" title="应用推荐"></a>应用推荐</h3><p>这个手机自带的应用还挺完善的，拨号内置了 T9 拨号，也有类似冰箱的应用，甚至有一个语音助手。</p><p>1、卸载自带垃圾应用</p><p><strong>方法一：</strong></p><p>系统自带应用大多数可以禁用卸载，浏览器与自带应用市场需要 ADB 连电脑禁用或删除，方法如下：</p><p>① 电脑端装好 ADB 工具；</p><p>② 在手机「设置」→「关于手机」→「Kernel 版本」中连按 7 次，打开「开发者选项」；</p><p>③ 在手机「设置」→「其他设置」→「开发者选项」中，打开「USB 调试」；</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_adb2.png" alt="eink_adb"></p><p>④ 手机 USB 连接电脑，并允许 USB 调试；</p><p>⑤ 打开系统终端机，输入 <code>adb shell</code>，进入 adb 命令环境， <code>pm disable-user  --user 0 应用包名</code> 可以禁用应用，<code>pm uninstall  --user 0 应用包名</code> 可以卸载应用。</p><p>如：禁用浏览器和自带应用市场可以输入：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">浏览器 pm disable-user  --user 0 com.android.browser</span><br><span class="line">应用市场 pm disable-user  --user 0 com.hisense.hiphone.appstore</span><br></pre></td></tr></table></figure><p>卸载浏览器和自带应用市场可以输入：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">浏览器 pm uninstall  --user 0 com.android.browser</span><br><span class="line">应用市场 pm uninstall  --user 0 com.hisense.hiphone.appstore</span><br></pre></td></tr></table></figure><p>不知道包名，可以安装 LibChecker 或 Package Names（可在 Google Play 搜索下载）。</p><p><strong>方法二（免电脑，推荐）：</strong></p><p>安装 <a href="https://f-droid.org/packages/io.github.muntashirakon.AppManager/" target="_blank" rel="noopener">App Manager</a> （可在 <a href="https://f-droid.org/" target="_blank" rel="noopener">F-Droid</a> 下载），这个应用可以模拟 ADB，安装好后找到要禁用或卸载的应用即可，免电脑操作，推荐。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_app-manager.png" alt="eink_app-manager"></p><p>2、浏览器</p><p>浏览器推荐 <a href="https://www.coolapk.com/apk/alook.browser" target="_blank" rel="noopener">Alook</a> 是一个好用的浏览器，可以倍速、小窗、后台播放，小窗播放视频等等，贴心功能很多。</p><p>3、应用市场</p><p>Google Play 里的应用都是 64 位，可以更好发挥硬件性能、更省电。另外，Google Play 里的应用都经过 Google 审核，相对更安全，是应用市场首选。</p><p>由于小弟没安装成功 Google Play，所以只能用第三方应用市场，如 <a href="https://auroraoss.com/downloads.php" target="_blank" rel="noopener">Aurora Store</a> （基于 Google Store API 构建，可以登录 Google 账号，推荐）、 <a href="https://apkpure.com" target="_blank" rel="noopener">APKPure</a>（可以直接使用网页版）、<a href="https://www.apkmirror.com/" target="_blank" rel="noopener">APKMirror</a>（仅网页版）。</p><p>如果有下载国内应用需求，可以使用<a href="https://www.coolapk.com/" target="_blank" rel="noopener">酷市场</a>（推荐 <a href="https://www.wandoujia.com/apps/998339/history_v1601131" target="_blank" rel="noopener">v6.0.1</a> 版本，够用，没有乱七八糟的功能）。</p><p>另外可以安装 <a href="https://f-droid.org/" target="_blank" rel="noopener">F-Droid</a>，里面的应用都是开源的。</p><p>4、Wormhole</p><p><a href="https://er.run" target="_blank" rel="noopener">Wormhole</a> 可以方便在电脑查看、控制手机，可以直接在电脑键盘操作、输入文本等。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_pc7.png" alt="eink_pc"></p><p>5、AirDroid</p><p><a href="https://www.airdroid.com" target="_blank" rel="noopener">AirDroid</a> 可以方便在电脑浏览器控制、管理手机，传输文件等等。</p><p>6、欧路词典</p><p><a href="https://www.eudic.net/v4/en/app/eudic" target="_blank" rel="noopener">欧路词典</a>是一个好用的词典应用，支持 MDX 格式的词典，可以剪贴板取词，跨应用全局使用。</p><p>7、Telegram</p><p><a href="https://telegram.org/" target="_blank" rel="noopener">Telegram</a> 作为一个即时沟通工具没话说，占用资源极少，运行超流畅，各种好玩的贴纸，不用担心泄露隐私。另外可以作为在其他设备传输工具，方便传输文本、文件等。</p><p>另外，Telegram 借助 <a href="https://github.com/blueset/ehForwarderBot" target="_blank" rel="noopener">ehForwarderBot</a> 这个小工具，可以作为一个微信客户端，界面美观、现代，启动迅速，运行流畅，可无限多端登录，信息全云端存储，不用担心臃肿的垃圾微信信息占用宝贵的存储空间。</p><p>Telegram 可以自定义皮肤，建议将消息背景、气泡等调成黑白获得更好的显示。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_telegram_mini2.jpg" alt="eink_telegram_mini"></p><p>8、讯飞输入法</p><p>手机系统自带<a href="https://srf.xunfei.cn/" target="_blank" rel="noopener">讯飞输入法</a>，也支持超酷的无需切换直接手写功能，使用时手写笔迹有些延时。自带的功能较精简，可以选择升级（建议安装 Google Play 的 版本，64 位），升级后会比自带的臃肿，但是功能也会多一点，升级后小弟比较喜欢的功能有：① 按键有振动反馈，更有打字的感觉；② 可以安装剪贴板插件，方便管理剪贴板。 </p><p>推荐使用「无缝线框·浅色」这款皮肤，在电子纸屏幕显示更清楚。</p><p>9、Overdrop</p><p>Overdrop 是一款天气应用，可以设置白底黑字、无动画显示，在电子纸屏幕上获得较好的天气体验。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_weather&tts.png" alt="eink_weather&amp;tts"></p><p>10、Google Text-to-speech Engine</p><p>Google 有把文字转语音引擎单独打包，可以直接安装，在需要 TTS 的应用（如 Moon+ Reader）中使用。</p><p>11、乐播投屏</p><p>这个手机投屏协议是 Miracast，没法使用 Google Home 这个应用，所以没法使用 Chromecast 投屏。可以安装<a href="https://www.hpplay.com.cn/" target="_blank" rel="noopener">乐播投屏</a>进行投屏（电视或盒子端、手机端均需安装），推荐安装 <a href="https://m.wandoujia.com/apps/6651787/history_v30214" target="_blank" rel="noopener">v3.2.14 版本</a>，体积小，免注册。</p><h2 id="关于打卡"><a href="#关于打卡" class="headerlink" title="关于打卡"></a>关于打卡</h2><p>（9 月 10 日补充）</p><p>这个手机可以<a href="https://sale.jd.com/m/h5/urbwvqmqh1qb.html" target="_blank" rel="noopener">打卡 0 元购买</a>，大体规则是在「掌阅精选」应用阅读 30 分钟，打卡 180 天可返购机款。有大大写了 Auto.js 脚本，可帮助完成打卡。</p><p>首先下载 <a href="https://drive.google.com/file/d/11qGDEPZZnrfgVoY3xW5bg-eGGAEkLANz/view?usp=sharing" target="_blank" rel="noopener">Auto.js V4.0.1 Beta</a>（最后一个免费版本，最新版本需付费），允许无障碍权限，新建脚本，输入以下内容并保存：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//等待无障碍服务开启</span></span><br><span class="line">auto.waitFor();</span><br><span class="line"><span class="comment">//启动掌阅精选</span></span><br><span class="line">app.startActivity(&#123;</span><br><span class="line">    packageName: <span class="string">'com.zhangyue.read.iReader'</span>,</span><br><span class="line">    data: <span class="string">'zyireaderpro://home'</span></span><br><span class="line">&#125;);</span><br><span class="line"><span class="comment">//打开书籍</span></span><br><span class="line"><span class="keyword">var</span> bookList = selector().id(<span class="string">'bookshelf_all_recyclerview'</span>).findOne()</span><br><span class="line"><span class="keyword">var</span> book0 = bookList.child(<span class="number">1</span>); <span class="comment">// child0是空白的view，跳过。</span></span><br><span class="line">book0.click();</span><br><span class="line"><span class="comment">//进度展示</span></span><br><span class="line"><span class="keyword">var</span> readMinutes = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">var</span> tipWindow = floaty.window(</span><br><span class="line">    &lt;frame gravity=<span class="string">"center"</span>&gt;</span><br><span class="line">        &lt;text id=<span class="string">"text"</span>&gt;本次已阅读<span class="number">0</span>分钟&lt;<span class="regexp">/text&gt;</span></span><br><span class="line"><span class="regexp">    &lt;/</span>frame&gt;</span><br><span class="line">);</span><br><span class="line">tipWindow.setPosition(<span class="number">360</span>,<span class="number">10</span>);</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">updateTip</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">    tipWindow.text.setText(<span class="string">'本次已阅读'</span>+readMinutes+<span class="string">'分钟'</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//定时翻页</span></span><br><span class="line"><span class="keyword">const</span> width = device.width;</span><br><span class="line"><span class="keyword">const</span> height = device.height;</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">nextPage</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">    <span class="keyword">var</span> random = (<span class="built_in">Math</span>.random()*<span class="number">2</span> + <span class="number">7</span>)/<span class="number">10</span>;</span><br><span class="line">    <span class="keyword">var</span> x = width*random;</span><br><span class="line">    <span class="keyword">var</span> y = height*random;</span><br><span class="line">    click(x,y);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> count = <span class="number">30</span>;</span><br><span class="line"><span class="keyword">var</span> stopAfter31m = <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">while</span> (count &gt; <span class="number">0</span>)&#123;</span><br><span class="line">    <span class="keyword">var</span> random123 = <span class="built_in">Math</span>.floor(<span class="built_in">Math</span>.random() * <span class="number">3</span>);</span><br><span class="line">    sleep(<span class="number">1000</span> * <span class="number">61</span> * random123);</span><br><span class="line">    nextPage();</span><br><span class="line">    count -= <span class="number">1</span>;</span><br><span class="line">    readMinutes += random123;</span><br><span class="line">    ui.run(updateTip);</span><br><span class="line">    <span class="keyword">if</span> (stopAfter31m &amp;&amp; readMinutes &gt; <span class="number">31</span>)&#123;</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//关闭书籍</span></span><br><span class="line">back();<span class="comment">//不需要退出掌阅精选，H5Bridge需要向它获取数据。</span></span><br><span class="line"><span class="comment">//启动打卡应用H5Bridge</span></span><br><span class="line">app.startActivity(&#123;</span><br><span class="line">    action: <span class="string">'hmct.intent.action.H5BRIDGE'</span></span><br><span class="line">&#125;);</span><br><span class="line">sleep(<span class="number">5000</span>);</span><br><span class="line">click(<span class="number">677</span>,<span class="number">810</span>);<span class="comment">//刷新时长</span></span><br><span class="line">sleep(<span class="number">5000</span>);</span><br><span class="line"><span class="keyword">var</span> button = selector().className(<span class="string">'android.widget.Button'</span>)</span><br><span class="line">                        .text(<span class="string">'立即打卡'</span>);</span><br><span class="line"><span class="keyword">if</span> (button.exists())&#123;</span><br><span class="line">    button.findOne().click();</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    log(<span class="string">'button not found'</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>使用脚本过程确保联网、电量充足。另外，系统升级可能会造成脚本失效，建议关闭系统更新。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_script.png" alt="eink_script"></p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_clock.jpg" alt="eink_clock"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/eink_cover.png&quot; alt=&quot;eink_cover&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s time for a
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>谈谈电子书 DRM</title>
    <link href="http://yoursite.com/drm/"/>
    <id>http://yoursite.com/drm/</id>
    <published>2020-07-17T00:00:00.000Z</published>
    <updated>2021-01-07T03:04:53.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/drm_cover.png" alt="drm_cover"></p><blockquote><p>藏天下於天下。</p></blockquote><p>2007 年，乔布斯希望唱片公司废除音乐的 DRM（数字版权管理），这样 iTunes 上销售的音乐可以就可以在所有设备上播放。这个倡议推动了音乐平台的 DRM 改革，几年过后，线上一首首卖歌逐渐被订阅制听歌取代。</p><p>电子书市场的 DRM 似乎和音乐市场不太一样，出版社众多，看到饱的订阅制无法覆盖每一本书，一本本购书是主流。一个问题是，DRM 是防盗版的好办法吗？DRM 好处会大于坏处吗？</p><p>有位大大曾有过 <a href="https://bookfere.com/post/380.html" target="_blank" rel="noopener">DRM-free 的实验</a>，其中的观点如下：1.有了盗版，书籍销售不降反升；2.去 DRM 对程序员并不费劲；3.盗版是一个宣传、评估内容受欢迎的一种方式。</p><p>已经购买了正版电子书，可以在不同平台、不同设备可以不受限阅读，小弟认为这没有不对的地方，以下是几种电子书平台去电子书的 DRM 的方法：</p><h2 id="Amazon-电子书"><a href="#Amazon-电子书" class="headerlink" title="Amazon 电子书"></a>Amazon 电子书</h2><p>中亚、美亚、日亚等电子书去 DRM 方法相同。Amazon 电子书在 Windows 下去 DRM 最方便，</p><p>1、下载安装 <a href="https://calibre-ebook.com/" target="_blank" rel="noopener">calibre</a>，</p><p>2、下载 <a href="https://github.com/apprenticeharper/DeDRM_tools/releases" target="_blank" rel="noopener">DeDRM_tools</a>，解压，</p><p>3、打开 calibre，在工具栏中找到「偏好设置」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/drm_win1.png" alt="drm_win1"></p><p>在偏好设置中找到「插件」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/drm_win2.png" alt="drm_win2"></p><p>选择「从文件导入」，选择文件 <code>DeDRM_Plugin.zip</code>，安装并重启 calibre，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/drm_win3.png" alt="drm_win3"></p><p>4、下载安装旧版 <a href="https://www.epubsoft.com/soft/kindle-for-pc.html" target="_blank" rel="noopener">Kindle for Windows v1.17</a>，</p><p>5、登录亚马逊账号，下载要去 DRM 的电子书，</p><p>6、在路径 <code>C:/Users/user name/Documents/My Kindle Content</code> 下找到后缀名为 <code>azw</code> 的电子书文件，将文件拖入 calibre，此时已经去好 DRM 了，可以进一步转成 mobi 或 epub 格式。</p><h2 id="Kobo-电子书"><a href="#Kobo-电子书" class="headerlink" title="Kobo 电子书"></a>Kobo 电子书</h2><p>Kobo 电子书在 Windows 和 macOS 下均可去 DRM，</p><p>1、下载安装 <a href="https://calibre-ebook.com/" target="_blank" rel="noopener">calibre</a>，</p><p>2、下载 <a href="https://github.com/apprenticeharper/DeDRM_tools/releases" target="_blank" rel="noopener">DeDRM_tools</a>，解压，</p><p>3、打开 calibre，在工具栏中或菜单栏中的「文件」中找到「偏好设置」，在偏好设置中找到「插件」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/drm_mac1.png" alt="drm_mac1"></p><p>选择「从文件导入」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/drm_mac2.png" alt="drm_mac2"></p><p>选择文件 <code>DeDRM_Plugin.zip</code>，之后选择文件 <code>Obok_plugin.zip</code>，安装并重启 calibre，安装成功后工具栏会看到 Obok DeDRM 图标，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/drm_mac3.png" alt="drm_mac3"></p><p>3、下载安装 <a href="https://www.kobo.com/us/en/p/desktop" target="_blank" rel="noopener">Kobo 桌面客户端</a>，</p><p>4、登录 Kobo 账号，下载要去 DRM 的电子书，</p><p>5、打开 calibre，在工具栏中点击「Obok DeDRM 图标」，可以看到 Kobo 中的电子书，点击「好」可以汇入，汇入之后即去 DRM，之后可以将电子书转成 mobi 或其他格式。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/drm_cover.png&quot;
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>大国特色奇异技巧系列之二：Telegram 收发微信消息</title>
    <link href="http://yoursite.com/ehforwarderbot/"/>
    <id>http://yoursite.com/ehforwarderbot/</id>
    <published>2020-06-26T00:00:00.000Z</published>
    <updated>2021-01-04T06:41:41.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/ehforwarderbot_cover.png" alt="ehforwarderbot_cover"></p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/ehforwarderbot_ui.png" alt="ehforwarderbot_ui"></p><p>不鳥萬如一老师曾讨论过<a href="https://blog.yitianshijie.net/2018/02/27/2nd-anniversary-of-ditching-wechat/" target="_blank" rel="noopener">关于微信</a>，小弟很赞成其中的观点。微信可以成功，和防火长城关系密切。<a href="https://telegram.org/" target="_blank" rel="noopener">Telegram</a> 是一款在功能及体验上远超微信的即时聊天工具，关于 Telegram 的传奇故事可以参见<a href="https://www.tmtpost.com/1443098.html" target="_blank" rel="noopener">这篇</a>。</p><p><a href="https://github.com/blueset/ehForwarderBot" target="_blank" rel="noopener">EH Forwarder Bot</a> 是一位大大开发的一个消息隧道聊天机器人框架，可将一个平台的消息转到另一个平台，其中包括将微信消息转发至 Telegram。</p><p>这个小工具可以将 Web 端的微信消息转发至 Telegram，这样做有几个好处：1、使用更现代的 Telegram 聊天界面收发微信消息；2、聊天记录在 Telegram 云备份一份；3、得益于 Telegram 优秀的跨平台特性，可以更方便多平台使用微信；4、 Telegram 的某些功能，如超多的贴图、定时发信息等也可以使用。</p><p>使用 EH Forwarder Bot 微信消息转至 Telegram 需要准备：1、可以连外网的 VPS 或连外网的群晖（推荐）；2、两个 Telegram 账号；3、确保微信可以正常登录 Web 端。</p><h2 id="配置-Telegram-机器人"><a href="#配置-Telegram-机器人" class="headerlink" title="配置 Telegram 机器人"></a>配置 Telegram 机器人</h2><h3 id="创建-Telegram-机器人"><a href="#创建-Telegram-机器人" class="headerlink" title="创建 Telegram 机器人"></a>创建 Telegram 机器人</h3><p>首先创建一个新的 Telegram 机器人，打开 Telegram 应用，与 <a href="https://t.me/BotFather" target="_blank" rel="noopener">@BotFather</a> 开始对话，</p><p>发送 <code>/start</code> ，可以看到各种指令及简要说明，</p><p>发送 <code>/newbot</code> 创建一个新机器人，之后会询问机器人的名字及机器人的用户名，根据提示输入即可。</p><p>之后会返回机器人的 token，记下备用。</p><h3 id="配置-Telegram-机器人-1"><a href="#配置-Telegram-机器人-1" class="headerlink" title="配置 Telegram 机器人"></a>配置 Telegram 机器人</h3><p>接下来配置刚刚建立的 Telegram 机器人，</p><p>发送 <code>/setprivacy</code> 至 @BotFather，选择刚刚建立的机器人，设置为 <code>Disable</code>，</p><p>发送 <code>/setjoingroups</code> 至 @BotFather，选择刚刚建立的机器人，设置为 <code>Enable</code>，</p><p>发送 <code>/setcommands</code> 至 @BotFather，选择刚刚建立的机器人，回复以下内容：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">help - 显示命令清单</span><br><span class="line">link - 连接对话到 TG 群组</span><br><span class="line">unlink_all - 解除群组中所有对话的连接</span><br><span class="line">info - 显示当前对话的详细信息</span><br><span class="line">chat - 创建对话</span><br><span class="line">recog - 回复语音消息以进行识别</span><br><span class="line">extra - 获取更多功能</span><br><span class="line">update_info - 更新组群名字及头像</span><br></pre></td></tr></table></figure><h3 id="获取-Telegram-ID"><a href="#获取-Telegram-ID" class="headerlink" title="获取 Telegram ID"></a>获取 Telegram ID</h3><p>之后获取自己的 Telegram ID，与 <a href="https://t.me/get_id_bot" target="_blank" rel="noopener">@get_id_bot</a> 对话，发送 <code>/start</code>，获得的一串数字即为自己的 ID，记下这串数字备用。</p><h2 id="配置-Docker"><a href="#配置-Docker" class="headerlink" title="配置 Docker"></a>配置 Docker</h2><p>首先确保 VPS 或群晖可以连外网，Telegram 目前需要连外网才能用。另外，有些 VPS 可能触发微信的异地登录，导致登录 Web 端微信失败（小弟有尝试在谷歌云上搭建，最后导致禁止 Web 端登录微信），相对比较安全且稳定的是在连外网的群晖上搭建。</p><p>小弟使用的是<a href="https://hub.docker.com/r/jemyzhang/ehforwarderbot" target="_blank" rel="noopener">这个大大的 Docker</a>。首先新建存放这个 Docker 的文件夹，文件夹依照下面的层级结构建立好子文件目录：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">📂profiles</span><br><span class="line">└── 📂default</span><br><span class="line">    ├── 📂blueset.telegram</span><br><span class="line">    │   └── config.yaml</span><br><span class="line">    ├── 📂blueset.wechat</span><br><span class="line">    └── config.yaml</span><br></pre></td></tr></table></figure><p>其中，<code>profiles/default/config.yaml</code> 这个文件输入以下内容：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">master_channel: blueset.telegram</span><br><span class="line">slave_channels:</span><br><span class="line">  - blueset.wechat</span><br></pre></td></tr></table></figure><p><code>profiles/default/blueset.telegram/config.yaml</code> 这个文件中输入机器人的 token 和 Telegram ID，</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">token: &quot;123456789:ABCD_1-1A2BASDFA_ASFASDFASDFASDFASF&quot;</span><br><span class="line">admins:</span><br><span class="line">- 1234567</span><br></pre></td></tr></table></figure><p>打开群晖 Docker ，在「注册表」标签卡中搜索「ehforwarderbot」，找到「jemyzhang/ehforwarderbot」下载映像，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/ehforwarderbot_reg.png" alt="ehforwarderbot_reg"></p><p>待下载完成，在「映像」标签卡中点击「启动」，选择「高级设置」，在「路径」选项卡中选择存放配置文件的路径，挂载路径填写 <code>/data</code>，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/ehforwarderbot_dir.png" alt="ehforwarderbot_dir"></p><p>之后启动容器，在「日志」或「终端机」中可以看到微信登录二维码，可以复制网址到浏览器，微信扫描二维码登录，登录成功日志会有显示，Telegram 可以收到微信的消息。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/ehforwarderbot_qr.png" alt="ehforwarderbot_qr"></p><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p>Web 端支持的文字、语音、文件都可以转发至 Telegram，红包、定位、朋友圈等 Web 端没有的功能不支持。</p><h3 id="直接回复"><a href="#直接回复" class="headerlink" title="直接回复"></a>直接回复</h3><p>默认会将所有微信 Web 端的消息汇总至一个消息框中，想要回复可以直接发送命令<code>/chat</code>，选择要回复的联系人或群组，之后右滑返回的消息回复即可。另外还支持 <code>/chat 关键词</code> 快速定位要回复的联系人或群组。</p><h3 id="分组对话"><a href="#分组对话" class="headerlink" title="分组对话"></a>分组对话</h3><p>如果某个联系人或群组，可以首先用两个 Telegram 账号新建一个空白群组，之后向机器人发送命令 <code>/link</code> 将某个联系人或群组连接至空白群组，也支持 <code>/link 关键词</code> 快速链接联系人或群组，之后选择空白群组，链接好之后就可以实现消息分组。</p><h3 id="酷功能"><a href="#酷功能" class="headerlink" title="酷功能"></a>酷功能</h3><h4 id="超酷贴图"><a href="#超酷贴图" class="headerlink" title="超酷贴图"></a>超酷贴图</h4><p>Telegram 有很多不错的贴图，还有很多从 Line 移植过来的贴图，比微信的贴图精致很多，其中静态贴图可以直接发送至微信，动态贴图可以借助 <a href="https://t.me/Stickerdownloadbot" target="_blank" rel="noopener">Sticker download</a> 这个机器人将动态贴图转成 GIF 发送。</p><h4 id="定时发送"><a href="#定时发送" class="headerlink" title="定时发送"></a>定时发送</h4><p>Telegram 支持定时发送信息，这个也支持。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/ehforwarderbot_cover.png&quot; alt=&quot;ehforwarderbot_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img
        
      
    
    </summary>
    
    
    
      <category term="Docker" scheme="http://yoursite.com/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>大国特色奇异技巧系列之一：群晖 Docker 接管百度网盘</title>
    <link href="http://yoursite.com/baidupan/"/>
    <id>http://yoursite.com/baidupan/</id>
    <published>2020-06-25T00:00:00.000Z</published>
    <updated>2021-01-04T06:40:50.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/baiduyun_cover.png" alt="baiduyun_cover"></p><p>21 世纪的欧亚大陆，天下第一超级大国有一项领先全球的科技创举，这项独步世界的先进技术可以对处在水深火热地区传播落后、低级思想的网站或应用进行屏蔽封锁。事实证明，科技创新力量大，国内的同类应用在缺少害虫的情况下，逐渐成长成问鼎天下的巨无霸，其中不乏微信、百度这样的忧质、业界凉心应用。</p><p>都说科技使人变懒退步，这种事情在神奇的超级大国不会发生，我们的聊天工具有内置不允许自有生态链以外、可能会随时打不开朋友发来的链接的超级浏览器，我们有下载速度几乎为零的优秀网盘工具。因为这些优质工具，我们需要「用浏览器打开」等操作，让人动手又动脑，一举解决世界性重大科学难题——人类科技使人变懒的魔咒。</p><p>人人努力上进，偏偏有人退步，「大国特色奇异技巧系列」这个系列介绍国内忧秀应用的退化降级版，帮助大家识别辨认。</p><p>百度网盘是闻名全球的网盘工具，创新性地突破重大技术难关、实现 100M、200M、300M 带宽下下载速度为零，网纷纷按赞业界良心，有些人还感受到了愤怒拍桌后手疼的酥麻感觉。</p><p><a href="https://hub.docker.com/r/johnshine/baidunetdisk-crossover-vnc" target="_blank" rel="noopener">baidunetdisk-crossover-vnc</a> 是一位大大开发的百度网盘下载工具，将虚拟机系统和 VNC 客户端打包至一个 Docker 中，可以帮助高速、稳定下载百度网盘的文件。</p><h2 id="搭建"><a href="#搭建" class="headerlink" title="搭建"></a>搭建</h2><p>baidunetdisk-crossover-vnc 比较适合装在群晖 Docker 中，首先打开群晖 Docker ，在「注册表」中搜索「baidunetdisk」，之后下载映像，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/baiduyun_reg.png" alt="baiduyun_reg"></p><p>待映像下载完映像后在「映像」中找到「baidunetdisk-crossover-vnc」，点击「启动」，选择「高级设置」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/baiduyun_img.png" alt="baiduyun_img"></p><p>默认占用 5901 端口，可以在「端口设置」中根据需要修改，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/baiduyun_port.png" alt="baiduyun_port"></p><p>在路径中选择存放下载文件的路径，挂载路径填入<code>/home/baidu/baidunetdiskdownload/</code>，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/baiduyun_dir.png" alt="baiduyun_dir"></p><p>设置好之后启动容器。</p><p>另：如果感觉 Docker 设置起来麻烦，也可以直接使用群晖套件安装，在<a href="https://github.com/john-shine/synology-baiduNetdisk-package/releases" target="_blank" rel="noopener">这里</a>下载后缀为 <code>spk</code> 的群晖套件文件，打开群晖套件中心，点击「手动安装」</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/baiduyun_spk.png" alt="baiduyun_spk"></p><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p>可以事先先将待下载的文件转存至百度网盘账号内，访问网址 <code>http://群晖 IP:自定义的端口号</code>即可使用百度网盘客户端，首先登录，找到要下载的文件下载，文件会下载至预先设置的文件夹内。小弟使用中速度平均在几兆/秒，最慢也在 100K 左右，相对较稳定。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/baiduyun_ui.png" alt="baiduyun_ui"></p><h2 id="客户端推荐"><a href="#客户端推荐" class="headerlink" title="客户端推荐"></a>客户端推荐</h2><p>如果只是需要看百度网盘的视频或音频，可以尝试使用在线播放。</p><h3 id="电脑端"><a href="#电脑端" class="headerlink" title="电脑端"></a>电脑端</h3><p>电脑端可以使用网页版百度网盘在线播放视频、视频。推荐使用 Firefox 浏览器，自带倍速播放。</p><h3 id="手机端"><a href="#手机端" class="headerlink" title="手机端"></a>手机端</h3><p>手机端不建议使用臃肿的官方客户端，代码质量差、广告多。可以安装 ES File Explorer，百度发力海外市场的应用，支持挂载百度网盘，可以直接播放百度网盘中的视频、音频，支持倍速播放。iOS 可直接 App Store 搜索安装，Android 建议到 <a href="https://moddroid.com/es-file-explorer.html" target="_blank" rel="noopener">MODDROID.COM</a> 下载修改版，解锁付费功能（不建议付费入正版）。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/baiduyun_cover.png&quot; alt=&quot;baiduyun_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;21
        
      
    
    </summary>
    
    
    
      <category term="Docker" scheme="http://yoursite.com/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>想要快乐，读读庄子——How Chuang Tzu Can Change Our Life</title>
    <link href="http://yoursite.com/zhuangzi/"/>
    <id>http://yoursite.com/zhuangzi/</id>
    <published>2020-04-18T00:00:00.000Z</published>
    <updated>2021-02-28T03:22:55.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/zhaungzi_cover.png" alt="zhaungzi_cover"></p><blockquote><p>人在江湖，身由自己。</p></blockquote><p>正如我们和邻居是「熟悉的陌生人」，除了知道有一本叫做《庄子》的书，有时用到出自这本书的成语，如「每下愈况」「朝三暮四」「庖丁解牛」等等，我们对这本书知之甚少。</p><p>《庄子》这本书不好读，不仅仅是成书时间离我们远，还因为这本书是写在乱世，庄子生活的战国时期有七国争雄，战乱频繁，为了安全书中观点通过隐晦的方式书写。作者庄子，当时是管理漆树园的一个小吏。</p><p>尽管《庄子》这本书不好读，但这本书深深影响了很多人的一生，包括陶渊明、李太白、白居易、苏东坡等等。小弟看了蔡璧名老师的公开课<a href="http://ocw.aca.ntu.edu.tw/ntu-ocw/ocw/cou/103S123" target="_blank" rel="noopener">《正是时候读庄子》</a>，后悔没有早点读这本书。</p><p>作者蔡璧名老师是个奇女子，她是台大中国文学系博士、中文系副教授，出生在中医和武术世家，曾得过癌症又奇迹痊愈。看公开课时，可以配合<a href="https://search.books.com.tw/search/query/key/蔡璧名" target="_blank" rel="noopener">蔡老师的书</a>一起看。</p><p>庄子讲的是什么？庄子讨论了跟每个人息息相关的主题：爱情、人生选择、情绪、死亡等等。下面是庄子对我们人生的几条建议：</p><h2 id="灵魂人的视角"><a href="#灵魂人的视角" class="headerlink" title="灵魂人的视角"></a>灵魂人的视角</h2><p>在庄子看来，人的一生应该是热血的，我们应该把人生当做一个 RPG （角色扮演游戏），努力克服困难，顺境时可以随造化之气乘正而行，在六气异变的逆境时可以积极应对变化，将不利因素为己所用（「若夫乘天地之正，而御六气之辩」），做一个「逍遥」的人。</p><p>以地球人的视角，我们往往希望事事顺遂、追求安全感，但在灵魂人的视角，这样的一生是乏味、无趣的。庄子力主我们坚韧不拔，听从自己内心的呼唤，跳出舒适区，勇敢实现自我完成，以「灵魂人的视角过肉体人的一生」。</p><p>此外，庄子希望我们要精进自己的职业、技艺或专业，因为这些可以当作是内在、不可见的生命境界于现实情境中的投影（「一龙一蛇」），以此评估生命进退消长、达标与否，作为提升自己生命境界的辅助工具。</p><h2 id="保持开放心态"><a href="#保持开放心态" class="headerlink" title="保持开放心态"></a>保持开放心态</h2><p>庄子认为，我们痛苦来源之一在于执意要心中所认定的「正色」「正味」，认定世界只有一种正确，自动屏蔽其他可能性，当外在环境不符其成见所预期时，便会立即断定其是非对错，是故产生得失、利害等成见，以致劳倦不安。</p><p>而事实是，对立的一方可能是另一方的养料（「物无非彼，物无非是」），当陷于辩论之中时，庄子建议我们远离「此」的坚持，不固执自己原先的立场为「是」，靠近「彼」的处境，体谅对方的行为与想法，改以「两行」的态度谅解、包容不同的异议。</p><h2 id="注意力转向内"><a href="#注意力转向内" class="headerlink" title="注意力转向内"></a>注意力转向内</h2><p>我们会感到疲惫、痛苦的原因是，我们将太多注意力投放在无法操之在己的外在世界，「终身役役而不见其成功，苶然疲役而不知其所归」地追随世俗、主流价值，以外在世界中的鹄的为人生要务（「以物为事」）。而事实是，所有的追求和盼望都可能随时落空，这使得我们身体坐立不安，精神心神不宁，难以获得长久、真实的「逍遥」。</p><p>庄子并非是劝导我们拒绝或舍弃外在世界的所有，而是希望我们将专注力的探照灯转向，照回内在自我的身、心、灵，致力从事一己身体、心灵的控制与锻炼，以期使个我的身心不论置身何种处境、际遇，都能保持平和、镇静与放松，拥有稳定长远的安乐。</p><h2 id="勇于面对现实"><a href="#勇于面对现实" class="headerlink" title="勇于面对现实"></a>勇于面对现实</h2><p>情绪的来源之一是我们不愿承认某些事实。庄子提醒我们，勤奋地去寻找自己没有看清的事实和真相，接受现实，在行为上承认事实，我们的情绪就会少很多，心情会平静很多（「知不可奈何，而安之若命」）。</p><p>同时，我们要勇于面对自己，可以活在自己的黑暗面中，对自己诚实，承认自己想要的，不要受到世俗的影响，勇敢去争取自己想要的。</p><h2 id="深情而不沉溺"><a href="#深情而不沉溺" class="headerlink" title="深情而不沉溺"></a>深情而不沉溺</h2><p>关于情感，庄子认为，理想的关系像是你喜欢一棵树，只是出自本心地这棵树，为它浇水、施肥、驱虫，而不是想吃树上的果子，或者把树做成家具。喜欢一个人，只是单纯地喜欢，希望他可以终日逍遥、心安身健，而不是把对方当成一个工具，相处的过程中，不会因为提起某个名字、碰触某件话题以致情绪欠佳甚至翻脸无情。</p><p>我们在情感里不要把对方当成一个器具，同时也应该避免自己被当成一个器具，深情但不陷溺在感情里（「不以好恶内伤其身」）。关于爱情，庄子力劝我们应该去寻找那个发光、能够照亮我们生命的人，而前提是我们自己先变这样的人，这样我们才会吸引到这样的人。</p><h2 id="选择权在于我"><a href="#选择权在于我" class="headerlink" title="选择权在于我"></a>选择权在于我</h2><p>庄子提醒我们，人要遭受外在情境的种种压迫与影响，或是能够主动地乘御于情境之上，皆是「咸其自取」、操之在己的。一旦了解到自身拥有选择的权力，许多原本以为是身不由己的困难，便可藉由一己之决心、意志而克服。这也正是庄子所揭示的真正自由——必须为自己的每一个选择负责，不得一味归咎于外在的境遇而加以推拖。另外，庄子还为我们提供了一些小工具：</p><p>「用心若镜」：将自己的心陶冶如一面镜子，无论面对怎样的人事物，都不因有所好恶而刻意迎向或离弃所映照的事物，心平如镜地与人事物应对交接，却不将已然过往的影像情绪留藏镜里，陷溺其中（「至人之用心若镜，不将不迎，应而不藏」）。</p><p>「照之于天」：以日、月为喻——抽离一己「将执而不化」所固守的成见、跳脱一己的立场，看待、体谅人我与所有人间世的异议与纷争。</p><p>「环中」「道枢」：从原本对立的两端抽离而出，转移立场居于车轮或门户的轴心，如此便与轮框、门户上无数过往的「彼」「此」皆成等距——远离了「此」的坚持、靠近「彼」的处境。</p><h2 id="保持身心强健"><a href="#保持身心强健" class="headerlink" title="保持身心强健"></a>保持身心强健</h2><p>在庄子眼中，身体和心灵难分轩轾地影响、决定着我们的生命（「其形化，其心与之然」）。形体一旦衰败，心神也将随之日渐消损，步上「近死」之途；同理，身体一旦升进，心灵的操控与自主能力也将随之一并提升。</p><p>庄子告诉我们，当我们改变「用心」，原本在情境中「日以心斗」的情绪归于平静祥和，保持心绪在「心如死灰」的状态，身体也较不会因情境的压迫而感到疲惫不堪；而若能经由身体的锻炼，将身体维持在「形如稿木」的放松轻盈，亦有助于心绪的宁定，也更易以开阔、包容的眼光与态度，面对生命中的一切处境。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/zhaungzi_cover.png&quot;
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>这样用 Kindle 有点不一样</title>
    <link href="http://yoursite.com/kindle/"/>
    <id>http://yoursite.com/kindle/</id>
    <published>2020-03-15T00:00:00.000Z</published>
    <updated>2021-01-04T06:44:34.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/kindle_cover.png" alt="kindle_cover"></p><ol><li>新买的 Kindle 注册后注意断开 WiFi 防止自动升级固件，待越狱之后再升级固件，越狱可以解锁更多可能性（如阅读 epub 格式电子书等等），越狱相关可以参考<a href="https://bookfere.com/skills/jailbreak" target="_blank" rel="noopener">这里</a>。</li><li>推荐的越狱插件：① <a href="https://bookfere.com/post/823.html" target="_blank" rel="noopener">File Browser</a>：可以方便地在浏览器管理 Kindle 文件；② <a href="https://bookfere.com/post/39.html" target="_blank" rel="noopener">Koreader</a>：超酷的阅读应用，方便在 Kindle 阅读 epub 等格式电子书，pdf 文件支持切边、重排，重排效果很赞，甚至可以 OCR 识别扫描 pdf 文件中的文字。 </li><li>Kindle 屏幕较脆弱（小弟已经用坏两个了，一个进水、一个被压），建议装一个保护套，一般都带休眠功能，打开即读也挺好的。如果感觉重，也可以取出保护套，记得取出时，先取一个对角，再取另一个对角，方能取出。</li><li>天下第一超级大国中国的外文翻译书删减随意、翻译质量差、引进时间长，读台版、英文原版是一个更好、不得不的选择。电子版是购买纸质书的一个补充，可以节省一部分印刷、物流费用，且无需等待物流时间。</li><li>购买台版电子书可以到 <a href="https://readmoo.com/" target="_blank" rel="noopener">Readmoo 读墨电子书</a>、<a href="https://www.kobo.com" target="_blank" rel="noopener">Kobo</a>、<a href="https://play.google.com/store/books" target="_blank" rel="noopener">Google Play 图书</a>、<a href="http://www.bookwalker.com.tw/" target="_blank" rel="noopener">BOOKWALKER</a>、<a href="http://www.books.com.tw/" target="_blank" rel="noopener">博客来电子书</a>、<a href="https://www.amazon.com/Chinese-Traditional-eBooks/" target="_blank" rel="noopener">Amazon.com 繁中电子书店</a>、<a href="https://ebook.hyread.com.tw/" target="_blank" rel="noopener">HyRead</a>、<a href="https://www.pubu.com.tw/" target="_blank" rel="noopener">pubu 书城</a>、<a href="https://www.taaze.tw/" target="_blank" rel="noopener">TAAZE 读册生活</a> 等平台，购买前可以先比价，比价可以用「<a href="https://taiwan-ebook-lover.github.io/" target="_blank" rel="noopener">台湾电子书搜寻</a>」这个小工具，有网页版、 App。其中，各平台对比可以参考这位大大的<a href="https://twinsyang.net/archives/19487" target="_blank" rel="noopener">文章</a>。购书前建议准备好外币银行卡。</li><li>在其他平台购买的电子书想要在 Kindle 上阅读，需要去 DRM 保护、转成 mobi 格式，Kobo 可以很容易去 DRM（参考这个大大的<a href="https://medium.com/akichy/筆記-如何用-kindle-閱讀-kobo-樂天-電子書檔案-5aa529b61203" target="_blank" rel="noopener">文章</a>）。如果比较看重在 Kindle 上阅读这一点，建议在 Kobo 上购买电子书。另外，中亚、美亚账号不互通，建议两个邮箱注册，想在登录美亚的 Kindle 上读中亚的书需要去 DRM。</li><li>寻找英文原版书可以直接 Google 关键词「书名 mobi」或「书名 epub」，另外可以到这两个网站搜索：<a href="http://gen.lib.rus.ec/" target="_blank" rel="noopener">Library Genesis</a>、<a href="https://thepiratebay.org/index.html" target="_blank" rel="noopener">The Pirate Bay</a>。</li><li>购买英文原版书可以到 <a href="https://www.amazon.com" target="_blank" rel="noopener">Amazon.com</a> 购买，需要注册美亚账号，填入「有效的」美国地址（可以在<a href="http://www.fakenamegenerator.com" target="_blank" rel="noopener">这里</a>生成），建议选择 AK、DE、MT、NH，OR 五个免税州中的地址，免扣税（重要，小弟被扣了好几次税才知道）。</li><li>登录美亚账号后 Kindle 会有广告，广告会出现在锁屏及主页底部。有广告需要右划才能解锁，如果感觉繁琐可以联系<a href="https://www.amazon.com/hz/contact-us/" target="_blank" rel="noopener">在线客服</a>，选择「Kindle 设备」，接入人工客服，说 Kindle 上的促销广告很吸引人，奈何自己在中国用不上，每每想到此心急如焚，茶不思饭不想，可以帮去掉广告吗，类似下面的话术：</li></ol><blockquote><p>Hi, I’ve got a Kindle, but I am in China now. The special offer ads are nothing to me, would you please unsubscribe special offers for me? Thanks a lot.</p></blockquote><p>之后客服会帮操作去广告，有些客服需要提供给设备序列号，成功去除 Kindle 会显示一条通知，广告就可以去掉了。</p><ol start="10"><li>Kindle 支持图书馆借书。前提是有一张美国图书馆的借书证或者有一个美国的非虚拟手机号（Google Voice 这类虚拟手机号不可以）。借书是借助 <a href="https://www.overdrive.com/apps/libby/" target="_blank" rel="noopener">Libby</a> 这个服务，有 <a href="https://libbyapp.com" target="_blank" rel="noopener">Web 端</a> 及手机端。首先先添加图书馆，有借书证直接搜索图书馆添加，没有借书证，可以根据手机号查询归属地邮编，搜索添加当地的图书馆。之后输入手机号验证即可在线办理借书证（少部分图书馆不支持在线办理）。添加好借书证就可以借书了，注意有些书需要预定排队（图书馆图书馆不拥有电子书版权，仅仅是一定数量数字拷贝，且每份数字拷贝有借阅次数限制），如果上面有显示「Kindle 格式」，则可以选 Kindle 格式，跳转至 Kindle 借阅链接，点击「借阅」即可。</li><li>Kindle 可以看漫画，漫画资源可以到<a href="https://volmoe.com" target="_blank" rel="noopener">这里</a>下载。</li><li>Kindle 词典资源可以到<a href="https://bookfere.com/dict" target="_blank" rel="noopener">这里</a>下载，英文词典推荐朗文、柯林斯、牛津词典，中文词典推荐萌典。另外 Kindle 支持选中文本在「维基百科」搜索，可以作为词典的一个补充。</li></ol><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/kindle_calendar.jpeg" alt="kindle_calendar"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/kindle_cover.png&quot; alt=&quot;kindle_cover&quot;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;新买的 Kindle 注册后注意断开
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>这个甜甜圈很酷——Google Nest Mini/Home Mini 指南</title>
    <link href="http://yoursite.com/nest/"/>
    <id>http://yoursite.com/nest/</id>
    <published>2020-03-07T00:00:00.000Z</published>
    <updated>2021-01-04T06:45:28.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/nest_cover.png" alt="nest_cover"></p><p>Google Nest Mini （小弟的是旧款 Google Home Mini）是 Google 出的小型音箱，小弟觉得够酷够实用，以下是一些使用建议：</p><h2 id="基本设置"><a href="#基本设置" class="headerlink" title="基本设置"></a>基本设置</h2><p>使用前可以先注册好 Google 账号，建议使用 Gmail App 或 Google App 注册，免输手机号。注意配置好路由器，可以连外网，Google Nest Mini 所有功能均需外网环境下使用。手机安装好名为「Google Home」的 App，Android 系统非原生系统可能安装 Google 框架，iOS 系统需非中国区账号。</p><p>Google Nest Mini ，支持英文、中文。英文可以更换语音角色，还有名人录制的声音，小弟觉得 Google Assistant 的英文声音很自然（目前感觉是最自然的），听起来有活力。另外，可以添加中文，中文支持的指令比英文少，且感不够自然、不支持「连续对话」，建议还是使用英文。比较酷的一点是，Google  Nest Mini 支持自动识别中英文，问英文，回答是英文，问中文，回答是中文。</p><p>Google Nest Mini 唤醒软硬件都做了优化，唤醒异常灵敏。唤醒词是「Hey Google」或「OK Google」，另外「Hey googoo」「Hey noddle」「OK goodle」「Hey d00doo」这些也可以唤醒。另外，Google Nest Mini 支持超酷的连续对话，无需一直说唤醒词。</p><p>Google Nest Mini 支持 Routines，可以将一系列命令集合成一个命令，方便日常操作。</p><p>Google Nest Mini 支持各种 action，详细可以到<a href="https://assistant.google.com/explore" target="_blank" rel="noopener">这里</a>或 Google Assistant 应用中查看。</p><h2 id="作为音箱"><a href="#作为音箱" class="headerlink" title="作为音箱"></a>作为音箱</h2><p>小弟认为  Nest Mini  作为音箱已经值回票价，外观漂亮，音质比手机或电脑自带的好一点，更酷的是可以直接用语音控制，如</p><p>“Hey Google, pause the music.”</p><p> “Hey Google, continue to play.”</p><p>“Hey Google, turn it up.”</p><p>“Hey Google, louder.” </p><p>“Hey Google, stop.”</p><p>等等。 </p><p>Nest Mini 可以绑定 Spotify、YouTube Music 等平台账号，之后可以直接语音控制。</p><p>“Hey Google, play relaxing music on Spotify.”</p><p>“Hey Google, play my ‘Discover Weekly’ playlist on Spotify.”</p><p>等等。</p><p>或者可以利用 Chromecast 播放音乐（各种支持 Chromecast 的 App、Chrome 浏览器等等 ），国内的音乐应用可以通过连接蓝牙播放。</p><h2 id="实体-Google"><a href="#实体-Google" class="headerlink" title="实体  Google"></a>实体  Google</h2><p>Google Nest Mini 像实体的 Google ，简单的问题可以直接用语音获得答案。日常的询问，如日常天气、现在的时间、设定定时器、设定闹钟都可以，如</p><p> “Hey Google, what’s the weather like?”</p><p> “Hey Google, what’s the forecast for today?”</p><p> “Hey Google, set a timer for [time].”</p><p>“Hey Google, cancel my timer.”</p><p>“Hey Google, what time is it?”</p><p>“Hey Google, set an alarm for [time].” </p><p>Google Nest Mini 天气、提醒、闹钟</p><p>或者听新闻（需要先在 App 内选新闻来源），中文新闻有「东森新闻」、「TVBS 新闻」、「公视新闻  PTS News」，如</p><p>“Hey Google, give me some news.” </p><p>或者问一些百科问题，如</p><p>“Hey Google, how to spell [word]?” </p><p>“Hey Google, how do you say [word or phrase] in [language]?” </p><p>“Hey Google, why the sky blue?” </p><p>“Hey Google, who is Steve Jobs?” </p><p>等等。</p><h2 id="小朋友的好伙伴"><a href="#小朋友的好伙伴" class="headerlink" title="小朋友的好伙伴"></a>小朋友的好伙伴</h2><p>Google Nest Mini 是小朋友的好伙伴，对世界充满好奇心的小朋友的问题 Google 总会耐心解答，如</p><p>“Hey Google, tell me a joke.”</p><p>“Hey Google, sing a song.”</p><p>“Hey Google, what does the cat say?”</p><p>“Hey Google, play a game.”</p><p>等等。</p><h2 id="控制其他设备"><a href="#控制其他设备" class="headerlink" title="控制其他设备"></a>控制其他设备</h2><p>Google Nest Mini 可以很方便地控制其他硬件，可以直接购买支持 Google Assistant 的设备，也可以自己搭建接入。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/nest_cover.png&quot; alt=&quot;nest_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;Google Nest Mini （小弟的是旧款
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>群晖虚拟机安装软路由</title>
    <link href="http://yoursite.com/openwrt/"/>
    <id>http://yoursite.com/openwrt/</id>
    <published>2020-02-01T00:00:00.000Z</published>
    <updated>2021-01-04T06:45:45.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt_cover.png" alt="openwrt_cover"></p><blockquote><p>我外表是胖，但内在的我是瘦的。你有没有想到过每个胖人的内部都有个瘦人，就像有人所说，每块石头里都有座雕像？</p></blockquote><p>软路由是一台运行 <a href="https://openwrt.org/" target="_blank" rel="noopener">OpenWrt</a> 系统的主机，以软件的形式实现拨号、DHCP 等路由器功能。相较于「硬路由」，使用软路由的主要理由有：</p><p>1、可以更快更稳地科学上网，因为一个只处理网络相关的 Linux（OpenWrt 基于 Linux） 处理需要消耗 CPU 的运算（如科学上网中的加密解密过程）比其他设备做得更好。</p><p>2、有些设备需要科学上网的环境才能正常使用，如 Google Home，Android TV 等等。</p><p>这篇文章是群晖虚拟机运行 OpenWrt 作为主路由的步骤，这样做的好处是免去另外增添额外硬件。如果群晖只有一个网口，OpenWrt 只能以「旁路由」的方式运行，想以主路由的方式运行，建议群晖有两个物理网口。</p><h2 id="网络连接建议"><a href="#网络连接建议" class="headerlink" title="网络连接建议"></a>网络连接建议</h2><p>大多数光猫默认负责拨号，小弟建议改成桥接模式，不同光猫设置方法不尽相同，可以自行搜索方法，如果搞不定，可以像小弟一样到淘宝寻求办法。</p><p>建议软路由做主路由，硬理由以无线 AP 的模式运行，这样的好处是少了一层 NAT ，减少网络损耗，具体网络连接方式如下：</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt1.png" alt="openwrt1"></p><h2 id="建立虚拟机"><a href="#建立虚拟机" class="headerlink" title="建立虚拟机"></a>建立虚拟机</h2><p>首先准备好软路由固件，固件可以自己编译（推荐用 Github Actions 编译），也可以使用别人编译好的固件。编译好的固件可以到<a href="https://www.right.com.cn/forum/forum-169-1.html" target="_blank" rel="noopener">恩山论坛 x86 系统区</a>去找，有很多大大编译好的，比如小弟使用的<a href="https://www.right.com.cn/forum/thread-3708606-1-1.html" target="_blank" rel="noopener">这个</a>。</p><p>注意：固件文件一般会有 combined 和 uefi-gpt 两种，前者支持 MBR 的分区表和 BIOS 系统，后者支持 GPT 分区表和 EFI 系统。我们这里选用 uefi-gpt 即可，下载的固件后缀名为「.gz」，需要解压成「.img」文件。</p><p>打开群晖「套件中心」，搜索「Virtual Machine Manager」，下载并安装，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt2.png" alt="openwrt2"></p><p>打开 Virtual Machine Manager，在「网络」中添加两个网口，一个作为软路由 LAN 口（作为 DHCP 的网口），一个作为 WAN 口（连外网的网口），</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt3.png" alt="openwrt3"></p><p>最终添加两个网口，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt4.png" alt="openwrt4"></p><p>在「映像」中选择「创建」，选择「从电脑上传」，上传后缀为「.img」的固件文件，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt5.png" alt="openwrt5"></p><p>在「虚拟机」中选择「新建」→「导入」，选择刚刚的映像，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt7.png" alt="openwrt7"></p><p>填入虚拟机名称，名字任意，如 openwrt，选择 CPU、内存（建议 1G 或以上）配置，点击「下一步」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt8.png" alt="openwrt8"></p><p>选择硬盘容量，最小是 10G，点击「下一步」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt9.png" alt="openwrt9"></p><p>点击「+」新增网口，注意 LAN（作为 DHCP 的网口）在上， WAN（连外网的网口）在下，点击「下一步」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt10.png" alt="openwrt10"></p><p>建议勾选「开机自启动」，点击「下一步」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt11.png" alt="openwrt11"></p><p>权限可以全部勾选，点击「下一步」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt12.png" alt="openwrt12"></p><p>确认配置，点击「完成」。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt13.png" alt="openwrt13"></p><h2 id="联网设置"><a href="#联网设置" class="headerlink" title="联网设置"></a>联网设置</h2><h3 id="配置网口"><a href="#配置网口" class="headerlink" title="配置网口"></a>配置网口</h3><p>OpenWrt 模拟了一个管理地址 192.168.1.1 ，可能与我们的路由器或光猫冲突，我们需要先调整管理界面地址。</p><p>在「虚拟机」标签卡中找到刚刚建立的虚拟机，若未开机可以先开机，点击「连接」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt14.png" alt="openwrt14"></p><p>在新浏览器标签页可以看到 OpenWrt 运行的命令行，点击回车，看到 OpenWrt 的标志，之后输入<code>vi /etc/config/network</code>，点击回车，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt15.png" alt="openwrt15"></p><p>之后输入<code>i</code>，进入编辑模式，找到「lan」，将地址改为其他未占用的 IP，如<code>192.168.77.1</code>，之后按 esc 键退出编辑模式，之后重启虚拟机。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt16.png" alt="openwrt16"></p><p>下一步将硬路由设置为 AP 模式，不同路由器设置方法不一样，若是华硕路由器可以下载 <a href="https://www.asus.com/asus-router-app/" target="_blank" rel="noopener">ASUS Router</a> 这个 App 将路由器改为 AP 模式，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt17_new.png" alt="openwrt17"></p><p>先将群晖关机，将一根网线一端插入  LAN 口（作为 DHCP 的网口），另一端插入路由器，之后将群晖开机，</p><p>电脑连接路由器的 WiFi，访问刚刚设定的 OpenWrt 的管理地址，如<code>192.168.77.1</code>，输入密码（可以在固件介绍页找到），找到「网络」→「接口」，在 WAN 口点击「修改」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt18_new.png" alt="openwrt18"></p><p>设置连外网方式，如选择「PPPoE」，填入宽带账号、密码，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt19_new.png" alt="openwrt19"></p><p>稍等片刻，应该可以联网了。</p><h3 id="科学上网设置"><a href="#科学上网设置" class="headerlink" title="科学上网设置"></a>科学上网设置</h3><p>OpenWrt 固件一般会内置不止一个科学上网工具，如 ShadowSocksR Plus+、PassWall、Hello World、OpenClash，填入节点信息即可，或者填入订阅地址。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt20_new.png" alt="openwrt20"></p><h3 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h3><p>若群晖无法联网，可以这样修改，在「控制面板」中找到「网络」，在「常规」选项卡中修改网关地址，将 OpenWrt 的管理地址移到上面。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt21_new.png" alt="openwrt21"></p><h2 id="软路由设置"><a href="#软路由设置" class="headerlink" title="软路由设置"></a>软路由设置</h2><p>OpenWrt 功能很多，以下是几个常用功能的位置：</p><h3 id="设置密码"><a href="#设置密码" class="headerlink" title="设置密码"></a>设置密码</h3><p>在「系统」→「管理权」中可以修改登录密码。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt22.png" alt="openwrt22"></p><h3 id="端口转发"><a href="#端口转发" class="headerlink" title="端口转发"></a>端口转发</h3><p>我们想在外网访问内网的服务或设备，可以使用「端口转发」功能，可以在「网络」→「防火墙」→「端口转发」中找到。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt23_new.png" alt="openwrt23"></p><h3 id="DNS-劫持"><a href="#DNS-劫持" class="headerlink" title="DNS 劫持"></a>DNS 劫持</h3><p>需要将特定域名跳转至特定地址，可以使用「DNS 劫持」，可以在「网络」→「主机名」找到。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt24_new.png" alt="openwrt24"></p><h2 id="管理-Openwrt"><a href="#管理-Openwrt" class="headerlink" title="管理 Openwrt"></a>管理 Openwrt</h2><h3 id="SSH-连接"><a href="#SSH-连接" class="headerlink" title="SSH 连接"></a>SSH 连接</h3><p>OpenWrt 有内置终端机，在「系统」→「TTYD」可以找到。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt25.png" alt="openwrt25"></p><h3 id="STP-管理文件"><a href="#STP-管理文件" class="headerlink" title="STP 管理文件"></a>STP 管理文件</h3><p>在 STP 客户端，如 Transmit 中选择「STP」，填入 OpenWrt IP地址，用户名填「root」，之后就可以管理 OpenWrt 文件。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt27.png" alt="openwrt27"></p><h3 id="固件升级"><a href="#固件升级" class="headerlink" title="固件升级"></a>固件升级</h3><p>OpenWrt 支持固件升级，若使用同一个作者编译的，可以保留配置，Web 页面升级 *.gz 文件无需解压，在「系统」→「备份/升级」中上传固件即可。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt26_new.png" alt="openwrt26"></p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/openwrt_cover.png&quot;
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>Apple Watch 使用理由</title>
    <link href="http://yoursite.com/watch/"/>
    <id>http://yoursite.com/watch/</id>
    <published>2020-02-01T00:00:00.000Z</published>
    <updated>2021-01-04T06:47:02.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/watch_cover2.png" alt="watch_cover2"></p><p>小弟很幸运，很早以前嫂子就送小弟一块 Apple Watch，如果要说这块表有没有用，用一句话描述很合适——「还没用的时候感觉手机可以替代，用了之后离不开」，以下是有一块 Apple Watch 的理由：</p><h2 id="提醒珍惜时间"><a href="#提醒珍惜时间" class="headerlink" title="提醒珍惜时间"></a>提醒珍惜时间</h2><p>正如手机的功能之一是打电话，手表可以看时间。 Apple Watch 提供最酷的时间显示，偏好简洁可以选大字体表盘，喜欢运动可以选运动表盘，还有万花筒、蝴蝶等等可选，每个表盘都设计精美。最酷的是「米奇」「米妮」表盘——这款复刻 1933年 的迪士尼表盘，点一下表盘可以报时，中文「米妮」声音很萌，有时还会加「哇呜」等等语气词。充电时会显示大字体时间，敲一下桌子会显示。</p><p>我们需要一个可以随时看到时间的物品的原因不仅是我们仅仅获得时间信息，更重要的是会给我们一个珍惜时间提醒。佛经的作用不仅仅是提供文字信息，实体的经书犹如佛像，可以提供我们一个可以看到、触摸的实体，提醒我们重要的不是经书，而是佛经中的教义。而时间是我们最稀缺资源，无法再生，一块实体表以一个实体的形式通过数字的笔画、指针的转动提醒我们时间在流逝，人生有限。</p><h2 id="减少手机依赖"><a href="#减少手机依赖" class="headerlink" title="减少手机依赖"></a>减少手机依赖</h2><p>手机的硬件越来越厉害，能做的事情越来越多，我们花在手机上的时间也越来越多，甚至花了过多时间。我们不想沉溺于几英寸的屏幕，又担心错过「重要」的信息。Apple Watch 可以设置每个应用的通知形式，过滤「不重要」的信息，并以一种「温和」「可以感知」的振动方式提醒。我们大可以设置好应用的通知与否，放下手机，专注于其他事情，而手腕收到「重要」通知的振动时，抬手一窥通知简要详情，在需要的时候打开手机。</p><h2 id="帮助保持健康"><a href="#帮助保持健康" class="headerlink" title="帮助保持健康"></a>帮助保持健康</h2><p>Apple Watch 内置保持健康提醒，每日会以温和、不打扰、鼓励为主的方式发提醒。我们快接近设定的目标时，会有提醒，我们超过设定的目标时，会鼓励，我们久坐时，会提醒站立，每个提醒文案和动画都是精心设计，使我们不自觉想要完成健身目标。</p><h2 id="简化日常操作"><a href="#简化日常操作" class="headerlink" title="简化日常操作"></a>简化日常操作</h2><p>手机功能越来越多，操作也越发复杂，有时候我们可能两手拿很多东西不方便，又需要看一些信息或执行一些简单操作，这时候 Apple Watch 的作用就体现出来了，下面是一些例子：</p><ol><li>简化付款</li></ol><p>在中国好像都偏好用二维码、条形码付款，支付宝有出手表付款码，并且可以在表盘上加快捷入口，只要抬腕、点一下即可展示付款码，有二维码、条形码（一般店员扫的是条形码，自己扣机器的是二维码），比较酷一点是，付款码支持「离线」，即Apple Watch 无需联网、连手机可以独立使用（确切地说是半离线，扫码的电脑需要联网）。</p><ol start="2"><li>简化看购物清单</li></ol><p>有时我们会写一个购物清单去购物，有时手机并不是很方便，因为手机会占用一只手。Google Keep 可以解决这个问题，Google Keep 是一个轻量级的笔记应用，在 Apple Watch 很好地适配，且执行速度很快，可以提前打开手表上的 Google Keep ，找到要看的笔记，之后只要抬腕就可以看到诸如购物清单等简单的文字信息。</p><ol start="3"><li>简化控制家电</li></ol><p>如果有搭建或购买 Homekit 的设备，可以直接用手表控制，不用到处找各种开关，可以作为语音控制设备的一个补充。</p><ol start="4"><li>简化用天气等小工具</li></ol><p>手机不在身边，可以用 Apple Watch 完成一些轻量级的操作，如查看天气、设定定时器等等。</p><ol start="5"><li>简化导航</li></ol><p>现在的道路越来越复杂，去陌生地方不得不带手机的原因之一是手机可以导航。小弟曾经尝试用 Apple Watch 的地图导航，是可以基本完成导航这个功能的。首先需要在 iOS 自带地图设定好起点、终点，启动导航，此时打开 Apple Watch 就可以看到导航开始，在过程中，表盘上会显示下一步要乘哪路车，或者应该走哪条路，待该下车或拐弯的时候会振动提醒，同时表盘提示下一步要做什么。整个过程中， Apple Watch 会将路线以文字显示，适时提醒。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/watch_cover2.png&quot; alt=&quot;watch_cover2&quot;&gt;&lt;/p&gt;
&lt;p&gt;小弟很幸运，很早以前嫂子就送小弟一块 Apple
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>DIY 超酷的像素钟</title>
    <link href="http://yoursite.com/awtrix/"/>
    <id>http://yoursite.com/awtrix/</id>
    <published>2020-01-21T00:00:00.000Z</published>
    <updated>2021-01-04T06:40:40.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/awtrix_cover.png" alt="awtrix_cover"></p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/awtrix_display.png" alt="awtrix_display"></p><p>小弟以前听说过 <a href="https://lametric.com/" target="_blank" rel="noopener">LaMetric TIME</a>，觉得很酷，像桌面版的 Apple Watch，可以显示一些固定信息（如时间、天气等等），还可以显示通知，过滤信息。但是囊中羞涩，只能远观。直到发现这位大大的<a href="https://www.youtube.com/playlist?list=PLmxTR4AYd_9T3Lw7PR9u_UrtplM1Dqp77" target="_blank" rel="noopener">视频</a>，详细记录了替代品的完整制作过程，小弟根据步骤也做了一个，期间踩了一些坑，以下是过程：</p><h2 id="购买配件"><a href="#购买配件" class="headerlink" title="购买配件"></a>购买配件</h2><p>像素钟的名字是 <a href="https://blueforcer.de/awtrix-2-0/" target="_blank" rel="noopener">Awtrix</a>，在<a href="https://awtrixdocs.blueforcer.de/#/en-en/hardware" target="_blank" rel="noopener">这里</a>中可以找到需要的电路元件，主要有以下：</p><p>基本元件：</p><ul><li>Wemos D1 mini（也可以用 NodeMCU 等 Esp8266 模块，免焊接）</li><li>8x32 WS2812B 全彩软像素屏</li><li>杜邦线若干（建议公对母、公对公、母对母都备一些，方便延长线）</li><li>MicroUSB 数据线</li></ul><p>可选配件：</p><ul><li>DC 直流电源插头</li><li>5v 4A电源</li><li>1000uF 10V 电容</li><li>LDR GL5528 光敏电阻</li><li>1000Ω 电阻</li><li>APDS-9960 手势模块</li><li>MicroSD 卡模块</li><li>扬声器</li></ul><p>（以上元件都可以在淘宝买到，直接搜索关键词即可，若选择 Wemos D1 mini，可能还需要一个电烙铁进行焊接）。</p><p>其他配件：<br>1.3D 打印光栅<br>默认像素灯是圆形，加入光栅可以将圆形变成方形，显示效果更好，建议打印。打印文件可以在 <a href="https://www.thingiverse.com/thing:2791276" target="_blank" rel="noopener">Thingiverse</a> 下载，小弟是在<a href="http://www.mohou.com/" target="_blank" rel="noopener">魔猴网</a>打印的，加运费大概 60-70 元。</p><p>2.外壳（可选）<br>可选外壳，非必选，打印成本较高，另外作者推出了 Awtrix Pro，外壳和之前的不一样。</p><p>3.亚克力蒙版<br>可以增强显示效果，淘宝搜索「亚克力定制」即可，颜色选「黑茶色」，尺寸可以选 95×340×2mm。</p><p>4.A3 纸<br>起到增强显示效果的作用，A4 纸不够长。</p><h2 id="服务器端"><a href="#服务器端" class="headerlink" title="服务器端"></a>服务器端</h2><p>Awtrix 分服务器端与控制端，其中服务器端小弟选择用群晖 Docker 运行，也可以用树莓派（新的外壳可以直接放入树莓派），甚至是 Android 手机。</p><p>下面是 Docker 的步骤，在注册表中搜索「whyet」，下载「whyet/awtrix2」这个映像。映像下载好运行映像，小弟没搞清楚配置文件的路径，所以没有配置路径相关，另外 Awtrix 默认会占用 7000 端口号，可以根据自己实际情况调整。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/docker_awtrix.png" alt="docker_awtrix"></p><p>容器运行后，可以在日志后终端中看到安装情况，待 jar 文件下载完成，在浏览器中打开 <code>http://群晖 IP:7000</code>，就可以进入 Awtrix 服务器端，因为还没有控制端，所以会有未连接的提示。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/awtrix_manager.png" alt="awtrix_manager"></p><p>另外，服务端适配了移动端，可以手机端进行控制。由于是运行在群晖中，可以通过配置 DDNS 与端口映射实现外网访问。</p><h2 id="控制端"><a href="#控制端" class="headerlink" title="控制端"></a>控制端</h2><h3 id="刷入固件"><a href="#刷入固件" class="headerlink" title="刷入固件"></a>刷入固件</h3><p>1.控制端刷入固件非常容易，首先要下载相应模块的驱动，若是 D1 mini，请前往<a href="https://wiki.wemos.cc/downloads" target="_blank" rel="noopener">这里</a>下载，若是 NodeMCU 请前往<a href="https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers" target="_blank" rel="noopener">这里</a> 下载。</p><p>2.下载安装 <a href="https://github.com/marcelstoer/nodemcu-pyflasher/releases" target="_blank" rel="noopener">NodeMCU PyFlasher</a> 及控制端<a href="https://blueforcer.de/awtrix/beta/firmware.bin" target="_blank" rel="noopener">固件</a>，将模块用 MicroUSB 数据线连接至电脑 USB 口，选择好端口及固件路径，点击[刷入]。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/awtrix_flash.png" alt="awtrix_flash"></p><p>刷入成功可以看到 Awtrix 的 AP，连入这个 WiFi（密码是 awtrixxx），之后填入 WiFi 信息（名称、密码）及服务端 IP （即群晖 IP）即可（无需端口号）。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/awtrix_wifi.png" alt="awtrix_wifi"></p><h3 id="连接电路元件及组装"><a href="#连接电路元件及组装" class="headerlink" title="连接电路元件及组装"></a>连接电路元件及组装</h3><p>1.连接按照官方的<a href="https://awtrixdocs.blueforcer.de/#/en-en/hardware" target="_blank" rel="noopener">电路图</a>连接即可，连接成功默认显示「时间」 App。</p><p>注意：正负极不要接反。</p><p>2.显示部分按照亚克力板、纸（裁成亚克力板大小）、光栅、像素灯从外到底的顺序，用双面胶粘住。若打印了外壳，可以将元件套入外壳中。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/awtrix_wire_mini.JPG" alt="awtrix_wire"></p><p>3.连接好后，按几次 D1 mini 的「reset」键，待屏幕出现图像启动即可。</p><h3 id="App-推荐"><a href="#App-推荐" class="headerlink" title="App 推荐"></a>App 推荐</h3><p>Awtrix 支持多个 App，以下是几个 App 介绍：</p><p>Time：默认自带，可以在设置中调整时区，可以选择日期、时间 12/24 制、是否显示星期指示格式。</p><p>OpenWeather：需到 <a href="https://home.openweathermap.org/" target="_blank" rel="noopener">OpenWeather</a> 注册填入 APIKey。填入之后位置 ID，可以在<a href="https://openweathermap.org/city" target="_blank" rel="noopener">这里</a>。 </p><p>Animations：可以显示随机动画，很有趣，无需配置。目前总计有二十多种动画，包括：91yinpin、彩虹（Rainbow）、老虎机（SlotMachine）、漩涡（Swirl）、Shockwave、KnightRider、Raindrops、Starfield、ghost&amp;pac、Fire2、蝙蝠侠（batman）、Metaballs、emoji、candycane、nyancat、贪吃蛇（snake）、俄罗斯方块（tetris）、吃豆人（pacman）、马力欧（mario）、fire、太空侵略者（space invader）、invader attack、kamehameha、yoshi、Amiga、Smiley</p><p>Moon：可以显示当日月相（即月圆月缺），无需配置。</p><p>PM：可以显示地区 PM2.5 值，需要填入位置监测点位置 ID。</p><p>Matrix：显示黑客帝国里面的矩阵动画。</p><p>Spotify：登录 Spotify 账号即可，每次切换歌曲可以显示歌名（目前仅支持英文显示，其他语言显示空白）。</p><h2 id="固件升级"><a href="#固件升级" class="headerlink" title="固件升级"></a>固件升级</h2><p>Awtrix 控制端升级可以直接在控制界面在线升级，服务端可以通过重启 Docker，重新下载服务器端 jar 文件的形式升级。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic2@master/uPic/awtrix_cover.png&quot; alt=&quot;awtrix_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img
        
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>群晖搭建静态博客</title>
    <link href="http://yoursite.com/hexo/"/>
    <id>http://yoursite.com/hexo/</id>
    <published>2019-11-30T00:00:00.000Z</published>
    <updated>2021-01-04T06:44:14.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/hexo_cover.png" alt="hexo_cover"></p><p>小弟想写一个博客，了解到主流有动态博客 <a href="https://wordpress.org" target="_blank" rel="noopener">WordPress</a>、<a href="Ghosthttps://ghost.org">Ghost</a>，静态的有 <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>、<a href="https://jekyllcn.com" target="_blank" rel="noopener">Jekyll</a>、<a href="https://gohugo.io" target="_blank" rel="noopener">Hugo</a> 等等，小弟的博客只是展示富文本，功能比较简单，尝试使用 Hexo。</p><p><a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a> 是台湾大学生 <a href="https://zespia.tw/" target="_blank" rel="noopener">tommy351</a> 开发的静态网页博客系统，基于 Node.js，可以将 Markdown 生成静态网页。相较于动态博客，Hexo 可托管至 <a href="https://pages.github.com/" target="_blank" rel="noopener">Github Page</a>，免购买与配置服务器，不用担心忘记续费服务器。另外和其他静态博客相比，Hexo 插件比较丰富。</p><p>Hexo 需运行在有 Node.js 及 Git 的环境，换一个电脑写就得重新安装一遍，手机及平板上写更不可能。而群晖 Docker 可以搭建各类环境、支持外网访问，还具备天然的备份功能，感觉在群晖上安装可以实现全终端写博客，以下是小弟的尝试：</p><h2 id="GitHub-创建-Github-Pages"><a href="#GitHub-创建-Github-Pages" class="headerlink" title="GitHub 创建 Github Pages"></a>GitHub 创建 Github Pages</h2><p>首先建立 GitHub Pages，<a href="https://pages.github.com" target="_blank" rel="noopener">GitHub Pages</a> 是 GitHub 提供的一个網頁寄存服務，我们的博客就放在这个地方。登录 <a href="https://github.com/" target="_blank" rel="noopener">Github</a>（没有 Github 账号先注册一个），在任意页面右上角点击「＋」，选择「新建仓库」。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/github_new.png" alt="github_new"></p><p>之后填入名称，包括「Github 用户名」及后缀「.github.io」，等待建好仓库。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/github_repo.png" alt="github_repo"></p><p>浏览器访问地址 <code>https://username.github.io</code> 就可以看到新建的网页。此时已经建好了一个博客，这个博客基于 <a href="https://www.jekyll.com.cn/" target="_blank" rel="noopener">Jekyll</a> ，我们要搭建 Hexo 还要继续。</p><p>注意：个人主页前缀要和 GitHub 用户名一致，只能有一个，若要建立多个，可建立项目主页，具体参见<a href="https://help.github.com/en/github/working-with-github-pages/about-github-pages" target="_blank" rel="noopener">官方文档</a>。</p><h2 id="安装-Hexo"><a href="#安装-Hexo" class="headerlink" title="安装 Hexo"></a>安装 Hexo</h2><h3 id="Docker-安装-Hexo"><a href="#Docker-安装-Hexo" class="headerlink" title="Docker 安装 Hexo"></a>Docker 安装 Hexo</h3><p>之后安装 Hexo，打开群晖 Docker（未安装可在「套件中心」搜索 「docker」下载安装，图标是小鲸鱼顶集装箱）， 在「注册表」标签中搜索「spurin」，找到映像 「spurin/hexo」并下载。这个 Docker 已经集成 <a href="https://github.com/jaredly/hexo-admin" target="_blank" rel="noopener">Hexo Admin Plugin</a>（一个 Hexo 文章后台管理插件）和连接 Github Pages 服务，可以方便我们快速搭建 Hexo 。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/docker_hexo_reg.png" alt="docker_hexo_reg"></p><p>待下载完成后在「映像」标签中双击刚刚下载的映像「spurin/hexo」，点击「高级设置」按钮，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/docker_hexo_image.png" alt="docker_hexo_image"></p><p>在「高级设置」中可以选择是否自动启动、是否建立桌面快捷方式（随个人偏好）。在「卷」标签页中的路径中添加文件夹，此文件夹为放置 Hexo 文件的文件夹，路径为 <code>/app</code> 。在「网络」标签页中可以选「与宿主使用相同网络」，也可以到「端口设置」中自定义端口号。端口号随个人偏好，Hexo 会使用 4000 端口号。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/docker_hexo_dir.png" alt="docker_hexo_dir"></p><p>在「环境」中可以填入自己的 Github 用户名及邮箱，以便生成有效的 SSH Key。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/docker_hexo_env.png" alt="docker_hexo_env"></p><p>点击「应用」按钮，之后点击「下一步」按钮，确认信息填写正确，建立容器，可以勾选「完成向导后运行容器」。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/docker_hexo_image_done.png" alt="docker_hexo_image_done"></p><p>等待容器安装并启动，在「容器」标签页中确保容器启动并正常运行，可以右击容器，选择「细节」，在日志中查看安装详情，等待安装完成。在浏览器中打开 <code>http://群晖 IP:4000</code>，可以看到 Hexo 生成的网站。访问 <code>http://群晖 IP:4000/admin</code>，可以看到文章后台管理页面。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/hexo_admin.png" alt="hexo_admin"></p><h3 id="连接-Github-Pages"><a href="#连接-Github-Pages" class="headerlink" title="连接 Github Pages"></a>连接 Github Pages</h3><p>下一步是连接 Github Pages，打开放置 Hexo 文件的文件夹，找到<code>/.ssh</code> 路径下的 id_rsa.pub 文件，用文本编辑器打开，复制 SSH Key，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/hexo_ssh_key.png" alt="hexo_ssh_key"></p><p>打开 Github 个人设置，找到「SSH and GPG keys」，新建一个密钥，将密钥粘贴。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/github_key.png" alt="github_key"></p><p>在「容器」标签页中找到「spurin/hexo」，右击选择「详情」，</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/docker_hexo_container.png" alt="docker_hexo_container"></p><p>在「终端机」选项卡中输入 <code>ssh -T git@github.com</code>，若可以看到自己的 Github 用户名，证明连接成功。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/key_test.png" alt="key_test"></p><h3 id="配置-Hexo-Admin-插件"><a href="#配置-Hexo-Admin-插件" class="headerlink" title="配置 Hexo Admin 插件"></a>配置 Hexo Admin 插件</h3><p>Hexo Admin 这个插件已经年久失修，最近一次更新是几年前了，小弟使用时踩了不少坑，下面只示范正确的步骤：</p><ol><li>安装 hexo-deployer-git 插件，在容器终端输入命令 <code>npm install hexo-deployer-git --save</code></li><li>在自定义的 Hexo 路径下新建脚本文件 hexo-deploy.sh，内容如下：</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo g</span><br><span class="line">hexo d</span><br></pre></td></tr></table></figure><ol start="3"><li>配置文件 _config.yml 下添加以下：</li></ol><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line">  <span class="attr">repo:</span> <span class="string">git@github.com:&lt;username&gt;/d&lt;username&gt;.github.io.git</span></span><br><span class="line">  <span class="attr">branch:</span> <span class="string">master</span></span><br><span class="line"></span><br><span class="line"><span class="attr">admin:</span></span><br><span class="line">  <span class="attr">deployCommand:</span> <span class="string">'./hexo-deploy.sh'</span></span><br></pre></td></tr></table></figure><p>点击「deploy」按钮可以生成页面并部署至 Github Pages，若未报错说明插件配置成功，打开 <code>https://username.github.io</code> 可以看到 Hexo 生成的页面。</p><p>注意：注意 yml 文件格式规范，名称后面有空格。</p><ol start="4"><li>设置密码</li></ol><p>插件支持设置密码，相应页面设置密码即可。</p><ol start="5"><li>设置外网访问</li></ol><p>为了可以随时随地发布博客，需要配置群晖外网访问。群晖外网访问可以利用群晖自带 DDNS，设置路由器映射端口，注意要有公网 IP（可以联系运营商开通）。</p><h2 id="绑定域名"><a href="#绑定域名" class="headerlink" title="绑定域名"></a>绑定域名</h2><h3 id="购买域名"><a href="#购买域名" class="headerlink" title="购买域名"></a>购买域名</h3><p>如果 IP 地址对应现实生活中的经纬度，域名就相当于我们的地址门牌号，域名可以是有意义的字词，帮助我们快速访问要访问的地址。</p><p>购买域名可以去 <a href="https://www.domcomp.com" target="_blank" rel="noopener">domcomp</a> 先比较下价格再购买。若不想花钱，也可以在 <a href="https://www.freenom.com" target="_blank" rel="noopener">Freenom</a> 申请免费域名。</p><h3 id="域名商设置"><a href="#域名商设置" class="headerlink" title="域名商设置"></a>域名商设置</h3><p>有了域名之后需要将域名解析到虚拟主机（这里是 Github Page 的服务器）上，小弟的域名 drunkfish.me 是从 <a href="https://www.gandi.net" target="_blank" rel="noopener">Gandi.net</a> 买的，新增一条 <code>@</code> 的 ALIAS 记录即可。不同域名商域名解析设置不同，若遇到困难可以联系域名提供商客服。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/domain_alias.png" alt="domain_alias"></p><h3 id="Github-Pages-设定"><a href="#Github-Pages-设定" class="headerlink" title="Github Pages 设定"></a>Github Pages 设定</h3><p>Github Pages 设定很简单，在仓库设置中直接填入域名即可，另外建议勾选「强制 https」，这样访问域名就可以看到安心的绿色小锁。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/page_domain.png" alt="page_domain"></p><p>设置完成之后可能要过几分钟才能可以使 DNS 生效，另外可以在系统终端机使用命令<code>dig your domain +nostats +nocomments +nocmd</code>验证是否绑定成功。</p><p>遇到问题可以咨询域名服务商和查阅 Github Pages 域名相关<a href="https://help.github.com/en/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site" target="_blank" rel="noopener">官方文档</a>。</p><h2 id="配置相关"><a href="#配置相关" class="headerlink" title="配置相关"></a>配置相关</h2><p>Hexo 的设置可以在 <code>_config.yml</code> 这个文件下修改，下面贴一下主要的配置项：</p><h3 id="配置主题"><a href="#配置主题" class="headerlink" title="配置主题"></a>配置主题</h3><p>小弟用了 <a href="https://github.com/xzhih/hexo-theme-casper" target="_blank" rel="noopener">casper</a> 这个主题，安装配置可移步<a href="https://zhih.me/hexo-casper-usage/" target="_blank" rel="noopener">作者</a>博客。</p><p>几个注意的点：</p><ol><li><p>注册 <a href="https://leancloud.app" target="_blank" rel="noopener">LeanCloud</a> 可以用<a href="https://console.leancloud.app/login.html#/signin" target="_blank" rel="noopener">国际版</a>地址注册，免实名认证（需提供国内手机号）；</p></li><li><p>在 Google Analytics 设置中点击[新增账户]可以新增一个账户，找到追踪 ID 填入即可，另外 Google Analytics 有手机端 App 可以使用。</p><p><img src="https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/hexo_ga_app.png" alt="hexo_ga_app"></p></li></ol><h3 id="增加-RSS-支持"><a href="#增加-RSS-支持" class="headerlink" title="增加 RSS 支持"></a>增加 RSS 支持</h3><p>增加 RSS 支持需要安装 <a href="https://github.com/hexojs/hexo-generator-feed" target="_blank" rel="noopener">hexo-generator-feed</a> 插件。</p><p>首先在容器终端中输入命令 <code>npm install hexo-generator-feed</code></p><p>之后在 Hexo 配置文件 <code>_config.yml</code> 文件中增加以下配置即可：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">feed:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">atom</span></span><br><span class="line">  <span class="attr">path:</span> <span class="string">atom.xml</span></span><br><span class="line">  <span class="attr">limit:</span> <span class="number">20</span></span><br><span class="line">  <span class="attr">hub:</span></span><br><span class="line">  <span class="attr">content:</span></span><br><span class="line">  <span class="attr">content_limit:</span> <span class="number">140</span></span><br><span class="line">  <span class="attr">content_limit_delim:</span> <span class="string">' '</span></span><br><span class="line">  <span class="attr">order_by:</span> <span class="string">-date</span></span><br><span class="line">  <span class="attr">icon:</span> <span class="string">icon.png</span></span><br><span class="line">  <span class="attr">autodiscovery:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">template:</span></span><br></pre></td></tr></table></figure><h3 id="文章命名自定义"><a href="#文章命名自定义" class="headerlink" title="文章命名自定义"></a>文章命名自定义</h3><p>Hexo 默认文章链接以文章日期命名，想修改文章链接可以参考<a href="https://hexo.io/docs/permalinks.html" target="_blank" rel="noopener">官方文档</a>。</p><h2 id="撰写文章"><a href="#撰写文章" class="headerlink" title="撰写文章"></a>撰写文章</h2><h3 id="页面属性"><a href="#页面属性" class="headerlink" title="页面属性"></a>页面属性</h3><p>md 文件会存放在 <code>/source/posts</code> 这个路径下，生成的页面在路径 <code>/public</code>，每篇文章可以加入页面属性：</p><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title:               # 文章标题</span><br><span class="line">date:                # 文章日期</span><br><span class="line">tags:                # 文章标签</span><br><span class="line">cover_img:           # 在文章摘要上显示</span><br><span class="line">feature_img:         # 在文章详细页面上置顶</span><br><span class="line">---</span><br></pre></td></tr></table></figure><p>文章用 Markdown 书写，语法参考<a href="https://markdown.tw/" target="_blank" rel="noopener">这个</a>，另外可以参考这个顺口溜：</p><blockquote><p>井号代表是标题，一个六个随你意，<br>星号表示要强调，一斜二粗三合体，<br>加减都可设列表，后面空格别忘记，<br>「&gt;」表示要引用，回车一行算另起，<br>还有中小俩括号，超级链接很容易。</p></blockquote><h3 id="书写工具"><a href="#书写工具" class="headerlink" title="书写工具"></a>书写工具</h3><p>可以直接打开 <code>http://群晖 IP:4000</code> 在线用 Markdown 撰写文章，支持实时保存、预览，另外可以使用任意支持 Markdown 的书写工具书写，如 <a href="http://typora.io" target="_blank" rel="noopener">Typora</a>（支持实时预览、实用小功能）。</p><p>小弟推荐使用图床管理图片（这样做 md 文件可以免配置本地图片路径，且备份时只需要备份一个 md 文件就可以了），图床推荐放在 Github 仓库，稳定、够用（具体参见<a href="https://help.github.com/cn/github/managing-large-files/what-is-my-disk-quota" target="_blank" rel="noopener">容量限制</a>可到100G），推荐使用图床工具上传，如 <a href="https://blog.svend.cc/upic/" target="_blank" rel="noopener">uPic</a>(支持拖拽上传、上传完成后自动复制文件链接等等)、<a href="https://github.com/Molunerfinn/PicGo" target="_blank" rel="noopener">PicGo</a> (多平台、支持<a href="https://github.com/PicGo/Awesome-PicGo" target="_blank" rel="noopener">插件</a>)，建议勾选 <a href="https://www.jsdelivr.com/" target="_blank" rel="noopener">jsDelivr</a> 优化国内访问。</p><p>发布文章有两种：<br>1.本地写好 md 文件，上传至 <code>/source/posts</code> 路径下，之后在容器终端运行 <code>hexo g &amp;&amp; hexo d</code>；<br>2.通过访问 <code>http(s)://群晖 IP:4000</code> ，在线写，写完点击[deploy]按钮。</p><p>书写小建议：<br>1.文件命名建议英文命名，关键词之间用「-」隔开;<br>2.从「##」二级标题开始标；<br>3.Markdown 模块间用一空行隔开；<br>4.写作前排版参考<a href="https://github.com/sparanoid/chinese-copywriting-guidelines" target="_blank" rel="noopener">中文文案排版指北</a>；<br>5.若图片体积太大建议用图片压缩工具压缩。</p><p>至此我们的博客就搭建好了，是不是很酷。</p>]]></content>
    
    <summary type="html">
    
      
      
        
        
          &lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/drunkfish7/pic@master/uPic/hexo_cover.png&quot; alt=&quot;hexo_cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;小弟想写一个博客，了解到主流有动态博客 &lt;a
        
      
    
    </summary>
    
    
    
      <category term="docker" scheme="http://yoursite.com/tags/docker/"/>
    
  </entry>
  
</feed>
