天气系统是一个具有可定制过滤规则的天气通知系统。
主要功能
根据给定的地理信息、目标地址的时区、目标时长以及一个匹配器(Matcher),自动的查询天气信息,找出匹配的时间。
其中,天气区间的精度为3小时。
当系统找到匹配的时间,或者由于天气变化导致之前匹配的时间无效或变更,系统会试图邮件通知用户。
邮件通知会根据用户在联系方式中预留的邮箱和用户选择通知时间来发送邮件。
对于匹配规则,用户可以选择使用自动编辑器。自动编辑器可以帮助用户快速选择需要的天气属性。选择多个匹配器时,系统会找出符合所有匹配器的时间。
匹配规则也可以通过Json直接配置。其语法规则类似于Lisp,只不过是将所有的动词都放到了Json里"action"这个key上。
用户最多可以同时使用20个匹配器。
使用例子
以我人在成都,想要匹配美国的天气为例。
我希望找到:在华盛顿,晴天或少云天气,在当地上午10点到下午6点期间,且必须是周六或周日,并且我希望如果可能有雨那么降水量应当小于1mm。我只需要3个小时,符合就好,因为我只是想出去走走。
(也就是说,我要在10点到6点之间找至少3小时,符合日期、降水、天气等等要求)
首先点击地图按钮,并在弹出的地图中选择我要的地址。(浏览器会默认读出你的所在地,因此会询问用户授权)
然后选择目标地区所在的时区。这个时区会作用于时间匹配器。
此时,我可以选择-5时区,这样后面的时间匹配器,就直接填写10:00到18:00即可。
但我也可以选择+8时区,这样后面的时间匹配器就需要我自己转换,填写23:00到7:00。(但愿我换算对了)
时间可以跨0点,23点到7点可能匹配到凌晨3点,但不会匹配到上午10点。
接着选择需要符合匹配的最小持续时间,这里选择3小时即可。
在进入匹配器之前,应该是这样:
最后,输入匹配器:
如果使用UI编辑器,选择了晴天和少云(也可以disable这个,直接输入云层占比百分比),选择了时间区间和周六日,并且只允许降雨量在0-1mm。
如果使用Json编辑器:
{
"action": "and",
"matchers": [
{
"action": "ids",
"ids": [
800,
801
]
},
{
"action": "dayHour",
"from": 23,
"to": 7,
"timeZone": 8
},
{
"action": "weekDay",
"days": [
7,
6
]
},
{
"action": "rain",
"from": 0,
"to": 1
}
]
}
最后点击提交按钮即可。
其他功能
网页查看匹配
在每个查询的底部,可以查看5天内的天气。如果其中有匹配成功的,会标记已找到。
进入后,匹配的天气会被标记为绿色背景。
注册联系方式
进入侧边栏,选择联系方式,输入邮箱,选择期望收到通知的时间区间即可。
已知问题
诡异的UI
我确实感觉到了这个UI的体验有点别扭。但我不知道怎么改才比较舒服。毕竟之前我和这东西的交互直接基于API交互……
尤其是一些报错,目前的状况是各种校验失败等等,并没有提示具体哪里错了。这些是苦力活,只能慢慢补。
API callback
一般的讲,API callback会比邮件通知好用。但是……没来得及做。
历史背景
最初只是想帮洗衣服找个好日子,看看未来几天有没有晴天。就做了个API,然后调自己现成的邮件通知系统。
然后我这类自动化的工具都有一个传统:允许用户上传脚本来自定义部分功能的逻辑。以前是直接上Lisp,我还专门有个service去校验脚本具体做了什么事情。不过考虑到想增加易用性,就搞了个json把Lisp包装了一下。
后面因为自己也嫌弃凌晨2-3点突然一个邮件过来给我说:大后天的天气不错,就加了一些用户自定义的配置。
最后。为了试试Keycloak、Iframe之类的骚操作,就给这东西赶紧套了一个UI,然后就成了现在这样。