ここはgithubではないのですが、めんどくさいのでこちらに直接ソース公開してみます。
crontab で毎時動かす気温計
kion.pl
#!/usr/bin/env perl
$|=1;
#実行時刻の取得
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
$yyyy = $year + 1900;
$month = $mon + 1;
#ファイル指定
$dir = '/home/username/htdocs/hometemp';
$ym=sprintf("%04d%02d",$yyyy,$month);
mkdir($ymdir);
$log = "$dir/log/$ym.csv";
$tmp = "$dir/tmp.json";
$html = "$dir/kion.html";
#アクセストークンを指定
$apikey = "Nature Remoのアクセストークン";
#コマンドと引数を指定
$curl = "/usr/local/bin/curl";
$curlopt = "-X GET";
$url = "https://api.nature.global/1/devices";
$header1 = "-H \"accept: application/json\"";
$header2 = "-H \"Authorization: Bearer $apikey\"";
$jq = "/usr/local/bin/jq";
#APIアクセスを実行
print STDERR "[exec]$curl $curlopt $url $header1 $header2\n";
$remoapi = `$curl $curlopt $url $header1 $header2`;
print "$remoapi\n";
#センサー値の取り出し
my @remo;
for($loop=0; $loop<=2; $loop++) {
$name = `echo '$remoapi' |$jq -r .[$loop].name`;
chomp($name);
continue if($name eq "");
$firm = `echo '$remoapi' |$jq -r .[$loop].firmware_version`;
$te = `echo '$remoapi' |$jq .[$loop].newest_events.te.val`;
$hu = `echo '$remoapi' |$jq .[$loop].newest_events.hu.val`;
$il = `echo '$remoapi' |$jq .[$loop].newest_events.il.val`;
$mo = `echo '$remoapi' |$jq .[$loop].newest_events.mo.val`;
chomp($firm);
chomp($te);
chomp($hu);
chomp($il);
chomp($mo);
push(@remo, "$name\t$te\t$hu");
#ログを出力
open(LOG, ">>$log");
flock(LOG, 2);
print(LOG "$yyyy/$month/$mday $hour:$min:$sec,name=$name,firm=$firm,te=$te,hu=$hu,il=$il,mo=$mo\n");
close(LOG);
}
#最高、最低気温の取得
foreach(@remo) {
($name, $te, $hu)=split(/\t/,$_);
open(LOG, "$log");
foreach(<LOG>) {
chomp;
if(/^$yyyy\/$month\/$mday /) {
if(/name\=$name,/) {
next if(length($_) < 10);
$tetmp=$_;
$tetmp=~s/.*te=//g;
$tetmp=~s/,.*//g;
if($temax{$name} eq "") {
$temax{$name}=-1000;
}
if($temin{$name} eq "") {
$temin{$name}=1000;
}
if($tetmp > $temax{$name}+0) {
$temax{$name}=$tetmp;
}
if($tetmp < $temin{$name}+0) {
$temin{$name}=$tetmp;
}
}
}
}
close(LOG);
}
#HTMLファイル生成
open(FILE, ">$html");
flock(FILE, 2);
print FILE <<EOM;
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="Refresh" content="60;./kion.html">
<title>kion</title>
<style>
body { background:#eec; color:#000}
span.font1 {font-size: 100%; }
span.font2 {font-size: 100%; }
span.max {color:#f00}
span.min {color:#00f}
</style>
</head>
<body>
<span class="font1">@{[sprintf("%02d:%02d",$hour,$min)]}</span>
EOM
foreach(@remo) {
($name, $te, $hu)=split(/\t/,$_);
if($hu eq "null") {
print FILE <<EOM;
<span class="font2">$name=$te℃</span><span class="max">$temax{$name}℃</span><span class="min">$temin{$name}℃</span>
EOM
} else {
print FILE <<EOM;
<span class="font2">$name=$te℃/$hu%</span><span class="max">$temax{$name}℃</span><span class="min">$temin{$name}℃</span>
EOM
}
}
print FILE <<EOM;
</body>
</html>
EOM
close(FILE);
exit:
りののトゥート(perl)
rinotemp.pl
#!/usr/bin/env perl
#実行時刻の取得
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
$yyyy = $year + 1900;
$month = $mon + 1;
$_hour=$hour;
$_min=$min;
#ファイル指定
#$dir = '/mnt/ramdisk/hometemp';
$dir = '/home/username/htdocs/hometemp/log';
$ym=sprintf("%04d%02d",$yyyy,$month);
$log = "$dir/$ym.csv";
#アクセストークンを指定
$apikey = "Nature Remoのアクセストークン";
#コマンドと引数を指定
$curl = "/usr/local/bin/curl";
$curlopt = "-X GET";
$url = "https://api.nature.global/1/devices";
$header1 = "-H \"accept: application/json\"";
$header2 = "-H \"Authorization: Bearer $apikey\"";
$jq = "/usr/local/bin/jq";
#APIアクセスを実行
#print STDERR "[exec]$curl $curlopt $url $header1 $header2\n";
$remoapi = `$curl $curlopt $url $header1 $header2 2>/dev/null`;
#センサー値の取り出し
my @remo;
for($loop=0; $loop<=2; $loop++) {
$name = `echo '$remoapi' |$jq -r .[$loop].name`;
chomp($name);
continue if($name eq "");
$firm = `echo '$remoapi' |$jq -r .[$loop].firmware_version`;
$te = `echo '$remoapi' |$jq .[$loop].newest_events.te.val`;
$hu = `echo '$remoapi' |$jq .[$loop].newest_events.hu.val`;
$il = `echo '$remoapi' |$jq .[$loop].newest_events.il.val`;
$mo = `echo '$remoapi' |$jq .[$loop].newest_events.mo.val`;
chomp($firm);
chomp($te);
chomp($hu);
chomp($il);
chomp($mo);
push(@remo, "$name\t$te\t$hu");
}
#最高、最低気温の取得
foreach(@remo) {
($name, $te, $hu)=split(/\t/,$_);
open(LOG, "$log");
foreach(<LOG>) {
chomp;
if(/^$yyyy\/$month\/$mday /) {
if(/name\=$name,/) {
next if(length($_) < 10);
$time=$_;
$time=~s/,.*//g;
$time=~s/.* //g;
($hour,$min)=split(/:/,$time);
$tetmp=$_;
$tetmp=~s/.*te=//g;
$tetmp=~s/,.*//g;
if($temax{$name} eq "") {
$temax{$name}=-1000;
}
if($temin{$name} eq "") {
$temin{$name}=1000;
}
if($tetmp > $temax{$name}+0) {
$temax{$name}=$tetmp;
$temaxhour{$name}=$hour;
$temaxmin{$name}=$min;
}
if($tetmp < $temin{$name}+0) {
$temin{$name}=$tetmp;
$teminhour{$name}=$hour;
$teminmin{$name}=$min;
}
}
}
}
close(LOG);
}
foreach(@remo) {
($name, $te, $hu)=split(/\t/,$_);
if($name eq "RemoOut") {
$ondo=sprintf("%.1f℃(最高%.1f℃(%02d:%02d)/最低%.1f℃(%02d:%02d)) 湿度%d%"
, $te
, $temax{$name}, $temaxhour{$name}, $temaxmin{$name}
, $temin{$name}, $teminhour{$name}, $teminmin{$name}
, $hu);
$tee=$te;
}
}
$toot=sprintf("りのの所の%02d:%02d現在の温度はね<br>$ondoだお!", $_hour, $_min);
if($hour >= 3 && $hour < 11) {
$toot.="<br>zzz...✧♡";
} else {
if($tee>=28) {
$toot.="<br>暑いだお!🔥 ";
}
if($tee<=15) {
$toot.="<br>寒いだお!🧊 ぶるぶる";
}
}
$toot.="<br><br>#りのの温度記録";
print $toot;
`/usr/local/bin/python3.9 /home/username/bot.py '$toot'`;
汎用mastodonトゥート
bot.py
from mastodon import Mastodon, StreamListener
import sys
# Botの主な挙動をここに記述します。
class Bot(StreamListener):
# Botの準備してくれる所。所謂おまじない。
def __init__(self):
super(Bot, self).__init__()
# アカウントのローカルタイムラインに動きがあると新規トゥートの情報を持って中の挙動を読み取る。
def on_update(self, status):
pass
def Login():
mastodon = Mastodon(
access_token = "mastodonのアクセストークン", # ここにさっき取得したアクセストークンを入れる。
api_base_url = "https://example.com/" # ここにMastodonのインスタンスのURLを記述
)
return mastodon
def LTLlisten(mastodon):
bot = Bot()
mastodon.stream_local(bot)
# ログインする処理
mastodon = Login()
#LTLlisten(mastodon)
for x in sys.argv:
if not 'bot.py' in x:
x=x.replace('<br>', '\n')
mastodon.toot(x)
実際に動いているもの