我的自动化生活

我也幻想着可以过上Jarvis的生活。

早上起来就可以得到天气信息、回到家就可以打开热水器、语音控制家电、随时通知你有一条新的快递信息等等。既然有树莓派和服务器,平时又比较懒,为何不尝试实现一下呢?

首先需要一个终端用于接受信息,目前想到了三个方式:

  • 显示器显示
  • 通过扬声器播放
  • 发送到手机通知

显示器显示确实是一个好的方式,可以DIY页面,会更加的炫酷,但是考虑到长时间开启显示器比较浪费,所以选择了「通过扬声器播放」和「发送到手机通知」,Home Assistant可以使用MPD组件通过树莓派连接音响,使用Google的TTS就可以做到声音推送。

The mpd platform allows you to control a Music Player Daemon from Home Assistant. Unfortunately you will not be able to manipulate the playlist (add or delete songs) or add transitions between the songs.

而更为详细的通知选择了推送到手机中。

Pushover

虽然有很多可以作为接受通知推送的客户端,比如IFTTT、钉钉、企业微信、微信等等,但是用过一段时间后感觉不太满意:

  • 与其他消息混杂在一起,消息权重不明确
  • 会有推送限制(微信公众号1次/1天)
  • 不能自定义消息

所以使用了Pushover来接受所有WebHook或者服务器推送的消息,Pushover 是一个通知服务,它对外提供了丰富的 API,只要调用 API 就可以给客户端发送推送通知。

Pushover页面

同时也可以通过不同的「Notification」设置不同的声音,就可以不看手机就知道是哪种类型的通知了。最重要最有用的一点就是可以得通知增加一个等级:

By default, messages have normal priority (a priority of 0). Messages may be sent with a different priority that affects how the message is presented to the user. Please use your best judgement when sending messages to other users and specifying a message priority. Specifying a message priority does not affect queueing or routing priority and only affects how device clients display them.

所以Pushover是整个自动化的主要终端,所有的消息都会被推送在这里。

JsBox

这应该是我认为在iOS平台中最喜欢的一款APP。

最早接触钟大的时候还是在限免Pin的时候,然后Pin加入了xTeko(JsBox Lite)可以使用JavaScript写一些简单的脚本。后来当JsBox独立出来后就赶快买了下来。(当时还只是30RMB,后来便涨到50RMB了,真是早买早享受。

然后就疯狂安利朋友,以至于送朋友生日礼物直接送了JsBox套装:

jsbox套装

如果你还不知道JsBox可以先看看文档,说不定就种草了!

公交信息

JsBox有定时器触发模式,可以在某个时间点推送一条通知,更舒服的是通知中也可以执行脚本操作,所以可以在某个时间(手动)执行一条脚本。

下班时间 -> 发送通知 -> 重按通知 -> 获取公交信息

公司附近有两个公交站点,距离不一样。每个公交站点又有不同的可以回家的公交,所以这个脚本就是获取可以到家的所有公交信息,计算到站的时间,然后按照时间进行排序,就可以得到最快到站的是哪辆公交车了。

不得不说杭州实时公交的信息很丰富,连车速都可以获取到。(获取可以动态计算到达车站的步速?

公交信息

快递信息

很多快递信息还是会发送一条短息告诉你取件码是多少,对于短信已经成为「验证码收纳箱」的我来说确实不是一件方便的事情,因为不知不觉就忘记了还有收件短信这个事情。

所以这个脚本很简单,当快递信息来的之后,长按短信复制,打开这个脚本,脚本会分析剪贴板的文字内容,若发现有「验证码」、「取件码」、「收货码」等字样的信息正则出来号码之后存储在SQLlite中。

快递信息

之所以会存储在SQLlite中是想尝试一下使用JsBox操作数据库,当然,放在本地存储中也是完全可以的。

为了每次懒得改代码加入了一个简单的设置:

快递信息设置

和「快接指令」APP不同的是,JsBox提供了更多的接口和更方便的操作,听说iOS13增加了快接指令自动化。期待一下,之后应该就可以联动JsBox自动推送了。

AutoCenter

AutoCenter是使用Laravel(5.8)框架写的一个定时任务的框架,部署运行在阿里云。通过这个框架解决了一些不能通过Zapier或者IFTTT运行的或者是其他接口的一些任务。

同时封装了一下Pushover的Facades,HTTP请求使用了GuzzleHttp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class PushOver
{
/**
* 通过PushOver向终端发送消息
* @param $title
* @param $content
* @param int $level
* @return bool
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public static function send($title, $content, $level = 0)
{
$client = new Client();

$response = $client->request('POST', 'https://api.pushover.net/1/messages.json', [
'form_params' => [
'token' => env('PUSHOVER_TOKEN'),
'user' => env('PUSHOVER_USER'),
'device' => env('PUSHOVER_DEVICE'),
'title' => $title . (env('APP_DEBUG') ? '-DEBUG' : ''),
'message' => $content,
'priority' => $level,
'html' => 1,
]
]);
$body = json_decode($response->getBody(), true);

if ($body['status'] == 1) {
return true;
}
Log::error('PUSHOVER发送失败');

return false;
}
}

快递信息推送

除了短信的快递信息,小区这边都会使用蜂站来使用公众号推送,然而…关注的公众号太多了经常看不到快递信息。

所以抓了一下蜂站的包,找到了「待领取包裹」的接口,每30分钟请求一下查询是否有快递,再推送到Pushover就可以了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$response = $this->client->request('GET', 'http://wx.fengzhan.com/wx/getExpress?', [
'query' => [
'openid' => env('EXPRESS_OPENID'),
'appid' => env('EXPRESS_APPID'),
'mobilenumber' => env('EXPRESS_PHONE')
]
]);

$list = json_decode($response->getBody(), true);

if (!$list || is_null($list)) {
return;
}

foreach ($list as $item) {
if (!Cache::has("express:{$item['expcode']}")) {
$this->push->send('#新的快递提醒', "来自{$item['address']}的{$item['expName']}快递,取件码:{$item['shelfCode']}");
Cache::put("express:{$item['expcode']}", 'true', Carbon::now()->addDays(2));
}
}

服务器流量

由于某些服务器是包月包流量的那种,尤其是在家中用树莓派做了全局代理供switch更新软件、打Splatoon2和马车等联机后,合理控制流量就很重要。

所以每天上午9点30分查询一下服务器流量再推送过来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public function getData()
{
$response = $this->client->request('GET', 'https://api.64clouds.com/v1/getServiceInfo?api_key=' . env('VPN_KEY'));
$data = json_decode($response->getBody(), true);

$factor = 1073741824; //除数因子
$used = round($data['data_counter'] / $factor, 2);
$total = round($data['plan_monthly_data'] / $factor, 2);
$reset = date('Y年m月d日', $data['data_next_reset']); //下次流量周期

$left = $total - $used; //剩余流量
$today = date('Y年m月d日', time());

$this->push->send('#服务器流量', "截止{$today},已使用{$used}GB,流量剩余{$left}GB于{$reset}到达新周期");
}

签到(Beta)

既然快递都懒得查看了,那一些APP的签到肯定也要「自动」。签到(Beta)提供了一些网站的签到服务,由PHP强力驱动,使用Laravel(5.8)框架。

🤖 签到 (Beta)

这不是一个即开即用的程序,可能需要以下基础:

  • 了解使用Charles进行抓包方式
  • 了解HTTP协议和请求方式
  • 了解JSON
  • 了解Cookie、UA等一些基本的请求Header和请求Body体
  • 能够忍受炒鸡简单的界面和不怎么有逻辑性的操作

前端偷懒直接使用了Bootstrap3.0,做了一个简单的模板:可以创建模板从而兼容不同接口的签到。

签到(Beta)

这样子就不用再打开APP进行签到了。

Zapier & IFTTT

和IFTTT相似,Zapier也是一个工作流服务。

不同于 IFTTT 只支持串联两个服务,Zapier 支持串联多个服务,让你可以建立一套有更复杂需求的工作流。

看起来很强大!只是…目前只用到了Webhook这个服务。

转发 Disqus

Disqus没有客户端、同时Webhook只能在Wordpress中使用,并且每次Disqus发送的邮件都被拉到垃圾邮件里,所以使用Zapier转发了Disqus评论再通过Webhook发送到Pushover里。

转发到Telegram

其他的,例如微博、Twitter、Ins等消息都是用IFTTT转发到了Talagram群组中。

Home Assistant

Home Assistant系统提供了自动化操作,可以将不同的实体串联起来来实现自动化。

比如晚上定时关闭电风扇:

1
2
3
4
5
6
7
8
9
10
11
12
13
- id: '1553826382737'
alias: 定时关闭风扇
trigger:
- at: 01:00
platform: time
condition:
- condition: state
entity_id: switch.plug_fans
state: 'on'
action:
- data:
entity_id: switch.plug_fans
service: switch.turn_off

一些家居自动化

所以使用Home Assistant和Homekit联动,自动化就会方便很多:

  • 到达家中后安防模式调整为「在家」,关闭所有电器
  • 出门后安防模式调整为「离家」,打开热水器
  • 夜晚自动关闭空调
  • 当Home Assistant服务关闭/启动时发送通知
  • 热水器完成加热时发送通知
  • 温度异常(过高、过低)发送通知

当然,有些自动化操作还需要「状态」,比如周几执行、几点执行等。现在基本上很少去手动操作所有的电器了。到家后,拿上手柄就去救塞尔达去了。(逃

快捷指令

目前的自动化并没有那么的「自动」,有些还需要手动执行,通过快捷指令和Siri,这样走在路上直接「Hey, Siri」就可以,或者通过 Watch,抬腕后就可以发送指令了。另外,如果Apple开放HomePod的接口就更完美了。

看了WWDC发布会好像iOS13会有使用Siri读出通知的特性,那么以后使用AirPods走在路上,会不会:

> You have a new express info, Sir.

> Welcome Home, Sir. The water heater has been opened.

哈哈哈,想想就激动。

最后

这是目前想到的可以偷懒的方式,其实在大三的时候就已经挖了一个坑,当时使用的Mui框架和咕咕鸡:

2016年的原型

然后简单的链接了咕咕鸡后就鸽了,直到毕业之后有了自己的屋子终于可以随心所欲的折腾了。哦对了,我还给这个自动化起了一个非常可爱的名字:酸奶。👇 越来越像想象中的生活了。

🎉 期待有一天可以更加完善。

🥳 加载Disqus评论