用MATLAB实现便便时间间隔的定期统计分析

为了达成如题的目的,实现方法已经有了早期的两个版本:

  • 2014年:手机端手动输入便便时间,经Dropbox同步至本地PC;利用Windows计划任务定期执行统计分析的MATLAB脚本;将结果发邮箱,再利用IFTTT发Twitter上。(见Github)
  • 2017年3月:应对Dropbox被墙,将便便时间记录放到Notepad上;MATLAB里利用正则把页面上的数据读下来,再进行统计分析;同样用Windows计划任务实现定期执行。

上述两个方案中最难坚持的部分在于:要打开手机浏览器,访问相应记录网页,再按10个数字手动输入便便时间。

去年10月搞定了第三版实现方法,借助Thingspeak数据上载的timestamp,完美回避手动输入时间数据;同时脚本执行也丢去了Thingspeak;分析结果推送则通过IFTTT的webhooks发至Telegram;Thingspeak还具备利用数据作图的功能。具体如下:

便便时间记录
  • Thingspeak上开1个field的public Channel,取得API_write_key(Note: private Channel的读取需要API_read_key)。
  • 方法一:在手机浏览器中收藏以下Thingspeak数据上载链接(API key替换为你自己的);每次如厕,掏出手机,打开浏览器的收藏夹,点击一下上述收藏链接,即完成一次便便时间记录(Note:每访问一次即在Thingspeak上记录一次数据,故千万别刷新)。

    https://api.thingspeak.com/update.json?api_key={API_write_key}&field1=poo

  • 方法二:iOS设备的话,建立一个workflow,add workflow to home screen,每次如厕点击生成的workflow icon即可。

Telegram推送准备
  • 在IFTTT关联Telegram,即TG上有@ifttt这个bot。
  • 在IFTTT启用webhooks,后面需调用的url可在这里看到
  • 在IFTTT建立一个if Webhooks then Telegram的Applet,设定一个Event Name。
统计分析和推送
  • Thingspeak上再开一个新app - MATLAB Analysis,将如下MATLAB代码填入,其中频道ID和Telegram Webhooks部分换成你自己的:
% PooAnalysis
%
% thingSpeak Channel ID
ID={your_ID};

%读取最近一周的数据
[poo1,pooT] = thingSpeakRead(ID,'Fields',1,'NumDays',7);
%求这一周平均隔多少小时拉一次
weekresult=hours(mean(diff(pooT)));

clear poo1 pooT
%读取所有数据
[poo1,pooT] = thingSpeakRead(ID,'Fields',1,'NumPoints',8000);
%求整个统计期间平均隔多少小时啦一次
allresult=hours(mean(diff(pooT)));

%个性化推送字符串生成
if weekresult>=48
    string2=['X桶啊你!'];
elseif weekresult>=24 & weekresult<48
    string2=['你拉屎还不够勤快!'];
else
    string2=['赏你朵勤快拉屎小红花!'];
end

string1=['#poo 你上周平均隔',num2str(weekresult),'小时拉一次屎,',string2,' | 整个统计期间平均隔',num2str(allresult),'小时拉一次。'];

%推送至Telegram
options = weboptions('RequestMethod','post');
response = webwrite('https://maker.ifttt.com/trigger/{your_event_name}/with/key/{your_token}', 'value1',string1, options);

给这个MATLAB Analysis加一个Time Control,设定每周执行一次。

推送效果如图:

锦上添花部分:利用Thingspeak Apps - MATLAB Visualizations绘统计图
  • 在Thingspeak添加一个MATLAB Visualization,放入以下代码:
% Prior to running this MATLAB code template, assign the channel ID to read
% data from to the 'readChannelID' variable. Also, assign the field ID
% within the channel that you want to read data from to plot.

% TODO - Replace the [] with channel ID to read data from:
readChannelID = {your_channel_ID};
% TODO - Replace the [] with the Field ID to read data from:
fieldID = 1;

% Channel Read API Key
% If your channel is private, then enter the read API
% Key between the '' below:
% readAPIKey = ' ';

%% Read Data %%

[poo1, pooT] = thingSpeakRead(readChannelID, 'Field', fieldID, 'NumPoints', 8000, 'ReadKey', readAPIKey);

%% Visualize Data %%

[N,X]=hist(hour(pooT),0:23);
XTickN = 0 : 23;
axes('Position',[0.1 0.3 0.8 0.6],...
   'XLim',[0 23],...
   'XTick',XTickN,...
   'Box','On')
hold on
bar(N,'FaceColor',[0.9 0.5 0.3]);
title('When you poo in a day!');
xlabel('hour');
hold off

效果如图:

:虽说是便便时间间隔统计,但这个思路一样可以用于记录和统计分析些别的。

Call Bitly/Google URL shorten API in MATLAB

Bitly

Bitly API document: /v3/shorten

Matlab code:


url  = 'https://api-ssl.bitly.com/v3/shorten?access_token={your_access_token}&format=txt&longUrl=http://google.com/';
shortened = webread(url)

Escape character is also supported / 支持转义字符:


url  = 'https://api-ssl.bitly.com/v3/shorten?access_token={your_access_token}&format=txt&longUrl=http%3A%2F%2Fgoogle.com%2F';
shortened = webread(url)

Google

Google API document: URL Shortener

First, you should have a URL shortener API key. It can be generated in the Credentials page.

Then, the matlab code:


url='https://www.googleapis.com/urlshortener/v1/url?key={yours}';
options = weboptions('RequestMethod','post', 'MediaType','application/json');
Body = struct('longUrl', 'http://www.google.com/');
response = webwrite(url, Body, options);

Note:确保你的MATLAB可以科学上网(Preferences->Web->Internet connection里设置use a proxy)。

利用MATLAB的Timer实现网络图片的定时下载

这个约每小时更新的GIF格式遥感图片为例:

MATLAB当前目录下新建一个.m脚本,本例里起名为wvgifdownload.m:

%图片存储目录设定:
folderpath=['d:\temp\'];

if length(dir([folderpath,'*.gif']))==0  %判断目录是否已有GIF文件
    urlwrite('http://www.goes.noaa.gov/dimg/jma/fd/wvblue/10.gif',[folderpath,'1.gif'],'timeout',15); %空目录则将下载的图片命名为1.gif
else %文件夹已有GIF文件
    localinfo=imfinfo([folderpath,num2str(length(dir([folderpath,'*.gif']))),'.gif']); %获取目录里最新GIF的文件信息
    webinfo=imfinfo('http://www.goes.noaa.gov/dimg/jma/fd/wvblue/10.gif');%获取目标网络图片的文件信息
    if localinfo.FileSize~=webinfo.FileSize %比较两者文件大小,若不一样,则表示网络图片已更新,可以下载
        urlwrite('http://www.goes.noaa.gov/dimg/jma/fd/wvblue/10.gif',['f:\CloudGIF\wv\',num2str(length(dir([folderpath,'*.gif']))+1),'.gif'],'timeout',15);
    end
end

设定Timer对象,这里起名为down:

down = timer                                 ...
(   'Name'          , 'my_timer'        ...
,   'TimerFcn'      , @(varargin)evalin('base','wvgifdownload')  ...
,   'BusyMode'      , 'drop'            ...
,   'ExecutionMode' , 'fixedRate'      ...
,   'Period'        ,  1800               ...
,   'StartDelay'    ,  0                ...
);

注意TimerFcn这里是调用当前目录脚本的写法,如果是函数则按函数调用去写。本例Period这里设定的是半小时执行一次,即每半小时检查网络图片是否更新,如有更新即可下载。

执行Timer:

start(down)

如何推广Telegram频道

新建立了一个MATLAB TIPS的Telegram频道,欢迎加入。

目前:

  • po了好些自己以前用到的现成脚本、函数,或前人写的技巧、教程、文档上去;
  • 基于RSS自动发布一些Matlab相关博客的最新日志链接
  • 欢迎作管理员共同打理,只要顺手把自己用上的网页url发上来就好。

建好后就经历了到处发小广告做宣传的过程,在此总结一番:

Telegram内宣传

電報群推廣

在这个TG群里发布频道链接,当频道订阅人数在50人以上时,将被推送至電報群組廣播频道;当频道订阅人数在50人以下时将暂时推送至電報新群推送頻道

TGCN-群组频道狼:yum:

这是TGCN-群组索引计划的bot。添加该机器人作频道管理员(任意权限),然后转发频道任一文字信息给机器人即可完成频道添加。频道马上会发布于其索引频道@zh_groups

频道/群组/机器人分享

号称Telegram上的hao123。入群发布频道链接,即可将频道加入其bot@hao1234bot的索引,可以在bot和群里搜索到。

Telegram Channels List

菜单点选注册新频道,然后将频道内容转发给该bot,选好频道分类即可。似乎是根据频道描述里的语言,把频道丢去中国频道列表channelList English。同时,频道亦发布于其网站channelist.ir

群組導航 - 分享/推廣

入群发布频道链接,群简介说将会被整理至频道群組導航

Telegram外宣传

Telegram Channels Catalog

国外的一个大型频道收集站,看起来和Telegram Bot Store是一家。用TG帐号登录后,即可添加频道。亦可用其bot添加频道,索引成功同样会出现在网站中,但bot添加的频道没有频道logo,所以推荐网站添加。似乎订阅人数较多的频道才会在其TG频道推广。

Telegram 蒐集君

一个以WordPress搭建的群组频道收集blog。以公共帐号登入后台,编写频道宣传文章,经管理员审核后即可出现在该blog上。

tlgrm.eu

进入频道分类页面,即可看到提交频道的加号按钮。似乎较多人订阅的频道方能显示。

tsear.ch

添加完显示:

Your channel will appear in our channels and search databases within the next 2 weeks.

应该是进入其网站和bot的索引。

inten.to

可以submit yours,但过多久收录未知。