2022年2月11日金曜日

Google Spreadsheetで更新された値が閾値超えたらメール通知するGoogle Apps Scriptの設定

Raspberry Piに繋げたセンサーのデータはGoogle Spreadsheetに保存できたので、

【 Raspberry Piで取得したセンサー情報をGoogleスプレッドシートに保存する(Python) 】

今度はデータがCO2の値が更新された際に閾値を超えていたら自分にメール通知するように設定した


CO2の値を見て一応換気の目安にでもなればいいなと思うが、恐らく寒くて換気はしない気もする



 まずは該当のspreadsheetを開いて、【拡張機能】>【Apps Script】を開く




以下の内容でスクリプトを作成

function getLastRowValue() {

  //アクティブなシートを取得
  var sheet = SpreadsheetApp.getActiveSheet();
  //空白で無い最終行の行番号を取得してlastRowに代入
  var lastRow = sheet.getLastRow();
  //最終行の行番号(lastRow)列番号5.0(E列)に入力された値をvalueに代入
  var value = sheet.getRange(lastRow5.0).getValue();

  /*valueが1500を超えていればメール送信
  MailApp.sendEmail(<送信先メールアドレス),<件名>,<本文>);
  送信元は自身のgmail*/
  if (value > 1500){
    MailApp.sendEmail("<送信先メールアドレス>""CO2濃度通知","閾値オーバー、換気しましょう");
  }
}


この内容で保存して、画面左の時計マークの【トリガー】を開いてScriptの実行条件を以下の内容で設定する

【実行する関数】 上で作成した関数

【実行するデプロイ】Head

【イベントのソース】スプレッドシートから

【イベントの種類】変更時

【エラー通知】毎日通知を受け取る


これでRaspberry Piから入力された値からCO2の部分だけを見て処理してくれるようになった


テスト時はsheet.getRange()の値で行番号はlastRowを見ればいいので問題なかったが、列番号はE列だから5でいいかと思っていたが、整数だとエラーとなったので5.0とした

アルファベット1桁MS Excelもそうだが、A~ZまでではなくAAなど2桁以上になるからそのためだろうか

細かく調べていないのでその辺りの仕様はまだ理解できていない



if文の内容をもう少し細かくすれば乾燥だったり、夏場の熱中症対策などに役立てることもできそうだ

2022年1月31日月曜日

ヘッドセットのイヤーパッドとヘッドバンドカバー交換

 自宅のデスクトップPCや仕事用のPCでのリモートワークで毎日酷使しているパイオニア製のヘッドセットSE-MS5Tのイヤーパッドとヘッドバンド部分の合皮が剥げてきた


使えないことはないが、たまに耳に黒いカスが付いたりするのが不快なので交換する


純正は見つからなかったので、Amazonで適当にサイズが合いそうなものを見繕ってきた

イヤーパッドはオーディオテクニカのATH-Mシリーズ互換のものがサイズが近そうだった

購入したものは外径10mm×8.7mm、内径5.5mm×4mmくらい

ヘッドバンドカバーは長さ245mm、幅70mmで伸縮性のある素材にした



イヤーパッドははめ込んでいるだけなのですぐ取れたが、ヘッドバンドカバーは両端の部品のネジを外して合皮の縫い目を切って分解していく



ざっくりばらしてみたが、ヘッドバンドの内側クッションはそのまま使えそう

外側の薄い方は両端がはみ出るので少しカットして再利用

ヘッドバンドカバー自体はファスナーで閉じるだけなので、少し引っ張って伸ばしながら占めてやればちゃんと閉まった



手軽に交換できる部品を交換しただけで十分綺麗になった

ただ、イヤーパッドの内径が少し小さいのか素材が固いのか、若干耳への当たりが固くなった気がする

使っている内になじめばいいが、痛くなるようなら別の物を探してもいいかもしれない



価格の割に音がいいし、creative mediaのSoundblaster Play3経由で利用ると低音もそれなりに鳴るので満足している

こういった消耗品を用意している高価なヘッドフォンに買い替えるのもいいかもしれないが、ひとまずはこれが壊れるまではそのまま使っていきたいとも思う

2022年1月23日日曜日

8インチのandroidタブレット購入

Fire HD 8を所持しているものの、利用できるアプリとスペックがそれなりなので、別途androidタブレットの購入を検討していた


年末頃からAmazonで【 Blackview Tab6 】という8インチタブレットが販売されており、見たところ公式ショップからの出品だったので試しに購入


 


日本公式ショップということもあり技適はもちろん取得済み


本体サイズとしてはFire HD 8よりも縦長な感じ

スペックは高いわけではないが、電子書籍の閲覧やYouTubeの動画を見る程度であればそこまで気にならない

さすがにゲームを遊ぼうと思うとそれなりに軽量のパズルゲームなどでないと難しい
GPU処理が必要なものはかなりもたついたり、ゲームの起動自体に時間が掛かるなど不便だった


ただ、サブ機として購入したので個人的には全く問題ない
またグレースケールモードを搭載しており、ボタン一つでモノクロ表示にできるので、書籍を読む際はより見やすくなるのが良い

できればFHD対応の方が細かい文字もより見やすくなったろうが、価格を考えれば十分妥協できる


液晶保護フィルムは標準で貼られているが個人的に質感が好みではないのでガラスフィルムは別注した
画面保護だけが目的なら標準のフィルムでも十分かもしれない

2022年1月6日木曜日

Raspberry Piで取得したセンサー情報をGoogleスプレッドシートに保存する(Python)

 Raspberry PiにBME280と MH-Z19Cを繋げてデータを取得できたので、cronで定期的にGoogleスプレッドシートに投げる方法のメモ

(尚、センサー類の部分は省略)


Google 公式ドキュメントは以下の辺りを参照した

【 Google APIs ご利用方法 】 

Google Cloudのアカウントを作成してプロジェクトを事前に作っておき、以下手順を実行


1:Google CloudAPIの有効化

【 Cloud Console API ライブラリ 】からプロジェクトを選択して、APIページで有効にするをクリックして有効化


2:サービスアカウントの作成とJSONキー取得
Google Cloud Platform内から【 APIとサービス 】> 【 認証情報 】を開く
画面右下の【 サービスアカウントを管理 】を開く

画面上部の【 +サービスアカウントを作成 】からアカウントを作成する


【 サービスアカウント名 】を入力、2項目の【 サービスアカウントID 】は自動入力されるので、そのまま作成する


作成したサービスアカウントを選び、移動した先で【 キー 】タブを開き【 鍵を追加 】のプルダウンメニューから【 新しい鍵を作成 】を選び、JSON形式の鍵を作成する
操作しているPCにJSON形式の鍵が保存されるので、Raspberry PiにはSCPコマンドなどで送信しておく

3:必要なAPIライブラリ有効化
Google Cloud Platform内から【 APIとサービス 】> 【 ライブラリ 】を開く
検索窓から【 Google Derive API 】と【 Google Sheet API  】の2つを有効化する


4:Googleスプレッドシート側での共有設定
データを保存したいスプレッドシートを作成し、画面右上の【 共有 】を開き、上記で作成したサービスアカウントを追加する
サービスアカウントの表記は以下の通り
【  <サービスアカウント名>@<サービスアカウントID>.iam.gserviceaccount.com 】


5:Raspberry PiへGoogleスプレッドシートと認証用のライブラリインストール
$ sudo pip install gspread
$ sudo pip install oauth2cliengt


後はPythonでコードを書くだけ

import gspread
import json
import datetime 
from oauth2client.service_account import ServiceAccountCredentials

#Google スプレッドシートAPI認証
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('<保存したJSONキーのパス>', scope)
gc = gspread.authorize(credentials)
SPREADSHEET_KEY = '<対象スプレッドシートキー>'
worksheet = gc.open_by_key(SPREADSHEET_KEY).worksheet('<シート名>')

#日時取得
today = datetime.datetime.now()

#Googleスプレッドシートへデータ転送
record = [ today.strftime('%Y/%m/%d %H:%M'), <B列の値>,<C列の値>,<D列の値>,<E列の値>]
worksheet.append_row(record)


<スプレッドシートキー>は該当スプレッドシートのURLに含まれている値を入力する
    https://docs.google.com/spreadsheets/d/<スプレッドシートキー>/edit#gid=0
シート名は日本語でも問題なく認識した

今回のコードではA列に日時を入れている、B〜E列には温度、湿度、気圧、CO2濃度の値をそれぞれ入れて、最終行に追記する形にしている


思いの他簡単に送信できたので、後はデータポータルでの可視化やGoogle Apps Scriptを用いた自動通知などと絡めれば十分使えると思う

端末が増えた場合は、デバイスID的な列を追加するか、スプレッドシートのシート自体を分けてしまえば管理もしやすそうな気がする


次はGCPへのデータ送信もやりたいが、Google IoT Coreからpub/Sub経由でFunctionを使うと課金されるので、試しに使うならBigQueryに直接投げる方法になるかな


2021年12月10日金曜日

広島ドリミネーション2021

  撮影日:2021/11/20

撮影場所:広島県広島市


11月22日(月)に広島市内へ出かけようとしたが、予報では雨だったので急遽予定を変更して土曜日に外出


それなりに落ち着いてきたこともあり人出は多く、久々の人ごみに少しストレスを感じてしまった

去年まで利用していた駐車場が閉鎖になったため、別の駐車場を調査して何とか車も停めることができた


今年は少し早めに来たこともあり、暗くなってもそこまで寒さを感じるほど冷えなかったのは幸いだ




11月17日から開始だったため、12月に見に来ていた昨年よりも夜の人通りも多いように感じた
ただ、各人距離を取ったり、展示物にも冊が設けられていて近づきすぎたり触れないようになっている物も多かった様な気がする



昨年やその前に見かけた桜や紅葉のイルミネーションが見当たらなかったり、イルミネーションをしていないエリアも存在したため、少し物足りなさは感じる状態だった




とはいえ、小規模ながら開催することで人出も増え、少しでも経済が回るのであればそれはそれでいいんじゃないかと思う

2021年11月23日火曜日

今年の秋も短かった

 撮影日:2021/11/14

撮影場所:山口県岩国市 吉香公園


休みの合間を見つけて錦帯橋辺りに紅葉を撮りに出掛けてみた

今年は染まりかけだったり散りかけだったりで、いまいち好みの景色を見つけることはできなかった



暖かい日から急に寒くなったので綺麗な紅葉は期待できない思っていたので予想通りではあったのもの少し残念


年々秋が短くなっている様な気がするので、来年も恐らくすぐ終わるんだろうな



久々に中版フィルムのMamiya RB67を持ち出したけど、ウェイト担いだ散歩で終わってしまった気もする

最寄りのキタムラへ現像を依頼したら、仕上がりが約2週間後とのこと
時期的なものなのか需要の問題なのかまでは聞いていないが、フィルム自体も廃盤品が増えているし、そろそろ手放す事も検討した方がいいのだろうか

撮るのも楽しいし、写る絵も好きだけど、現像に今まで以上の時間が掛かったりフィルムが手に入りにくくなるのであれば撮る楽しさも減ってしまうから仕方ない
あと一本残っているProviaを撮り終わってからまた考えよう

2021年10月19日火曜日

OpenWrtにZabbix Agentを入れてZabbix Serverから監視する

ZabbixサーバにOpenWrtを追加したので手順をメモ


Zabbix Serverは5.0 LTS


■Zabbix Agentインストール

OpenWrtにログイン後【システム】>【Software】から【Zabbix-agentd】をダウンロードする

【abbix-extra-mac80211】と【zabbix-extra-network】と【zabbix-extra-wifi】はagentdの追加パッケージの様なのでついでにインストールした

wifiのはいらなかったかな

agentのバージョンは5.0.7-3なのでZabbix Serverのバージョンが違えば使えないかな


■設定ファイル修正

次に OpenWrtにSSHでログインして設定ファイルを編集する

# vim /etc/zabbix_agentd.conf

Server= <Zabbix ServerのIP>

ServerActive=<Zabbix ServerのIP>

Hostname=<Agent側のホスト名>

※OpenWrtの初期ホスト名は【OpenWrt】


■FWルール追加

このままだとPortが空いてないのでiptablesでルールを追加する

# iptables -A INPUT -p tcp --dport 10050 -j ACCEPT -s <Zabbix ServerのIP>



■Zabbix Serverホスト追加

後はZabbix Server側にホストを追加すればいい

グループは【Linux Servers】でインターフェースは【エージェント】としてOpenWrtのIPアドレスを指定

しばらくすればステータスが有効になって各種グラフの数値が取得できる



問題なく稼働しているし、速度もそれなりに出ているものの、XG Firewallに比べれば機能に劣るし、GUIで簡単に管理できる機能も少なく感じる


いっそのことOpenWrtを入れたNanoPi R4Sを予備に回して、Ubuntuマシンに組みまえたLIVA ZにOpensense入れてメインマシンに使って見ようかとも思うが、そうするとUbuntuを入れるマシンが足りなくなるので、別途小型のベアボーンでも欲しくなるな