pusuke0418’s diary

異常にマルチタスクな社内SEのブログ

Raspberry Pi、DHT22(RHT03)、GrowthForecast、不快指数

毎日の天気予報データは取得してためているのですが、実際の室内温度ならびに湿度が観測したかったので、Raspberry Piで行いました。目的は、温湿度、不快指数の可視化となります。

まずセンサーが必要なので、購入しました。DHT22というものにしました。理由は、下記です。

  • 精度が悪くなさそう
  • Amazonなどでも簡単に入手できる
  • デジタルセンサなので、Raspberry Piから直接扱うことができる
  • ブレッドボードに直接差し込める(はんだづけとか必要ない)

ただ、実際買ったらRHT03というものでしたが同じものとのことでした。

つなぎかたなのですが、ここから参考にしていく、Wiring | DHT Humidity Sensing on Raspberry Pi or Beaglebone Black with GDocs Logging | Adafruit Learning Systemであるとか、あるいはgoogleで「DHT raspberry pi」で画像検索すれば例が出てきました。他のDHT11なども同様に扱えるとのこと。

抵抗は、10kΩ(茶黒橙金)を使いました。そして、最初は案の定、配線ミスで1つダメにしました。ブレッドボードにDH22をさす向きや配線を確認してから電気を流さなければならないのですが、私のようなものにはそれがわからないのです。

そして、値を取るのですが、ここも他力本願です。つぎのとおり。感謝です。Software Install (Updated) | DHT Humidity Sensing on Raspberry Pi or Beaglebone Black with GDocs Logging | Adafruit Learning System

とりあえずグラフにしてみようと思って、GrowthForecastを使ってみました。インストールは、cpanmを使って行うとのことで、いくつかインストール方法はあると思いますが、極力パッケージ派なので、aptを使いました。GrowthForecastが利用するrrd-toolもここで入れました。

$ sudo apt-get install cpanminus rrdtool

としました。そして、

$ sudo cpanm -n GrowthForecast

エラーが出て失敗しました。ログを見ろというのでログを見ました。

configure: WARNING:
----------------------------------------------------------------------------
* I could not find a working copy of pangocairo.…
…(省略)
-> FAIL Installing Alien::RRDtool failed. See /root/.cpanm/build.log for details.

結局、正確な記録が無いために定かではないのですが、必要そうなパッケージを入れて再度行うことで、Alien::RRDtoolもクリアしてインストールはできました。あまりスマートではなかったです。おそらく私の容量が悪いのでしょう。いつもそうでした。

$ sudo apt-get install libcairo2-dev libpango1.0-dev libxml2-devel gettext

実際にはここで他にも少しはまっておりまして、昔Webサーバをしごとで移行しているときに、cpanで移設先に多くのモジュールを入れたり入れなかったり、なぜかやるたび結果が違ったり、他にも様々と、パッケージ管理されているものの横でなぜかそっと動いているコンパイルされたPostgresが思い起こされました。なお、少し調べていたら次のような記事を発見しました。また参考に読んでおきたいと思いました。Perlと本気で向き合いたくない人のためのPerl5実行環境構築 - Qiita

あとはGrowthForecastのサイトみながら動作確認などいたしますGrowthForecast - Lightning fast Graphing / Visualization

上記にて基本的な動作確認ができ、ここまできたら、先に取得しているデータをGrowthForecastに投げるのみです。Adafruitsから利用させていただけるAdafruitDHT.pyでは、humidity, temperatureにそれぞれ値が格納されています。これを、最後のprint部分を、print int(humidity)といった形で、単純に整数値で出すように変えました。元のpythonスクリプトから、print部分のみ変更して下記の3つのファイルを作りました。

[ADatemp.py] 
  print int(temperature)
[ADahumit.py]
  print int(humidity)
[ADadi.py] 
  di = (0.81*temperature)+0.01*humidity*(0.99*temperature-14.3)+46.3 #不快指数
  print int(di)

これをGrowthForecastに投げるscriptを作ります。ファイルパスはスクリプトがあるパスを書いているのみです。GrowthForecastではPOSTしたURLにしたがいグラフが作成され、アップデートされます。ちなみに22 14というのはDHT22を使って、14番ピンを使っているということです。

#!/bin/bash
temperature=`/home/pi/scripts/censor/ADatemp.py 22 14`
humidity=`/home/pi/scripts/censor/ADahumit.py 22 14`
di=`/home/pi/scripts/censor/Adadi.py 22 14`
curl -F number=$temperature http://localhost:5125/api/home/thermometer/tmperature
curl -F number=$humidity http://localhost:5125/api/home/thermometer/humidity
curl -F number=$di http://localhost:5125/api/home/thermometer/temperature-humidity_index

最後に、このscriptを、cronに登録して定期的に動作させることで、グラフが作成されます。
f:id:pusuke0418:20150514004956j:plain

PowerShellで開始・終了ページ指定して印刷

やりたいことは、下記。

  • あるアプリケーションが、とある状態で立ち上がっている状態
  • それを、あるページから、あるページまで(xxページから始まってそこから何ページ)を印刷する
  • それを繰り返すので、ちょっと楽したい
  • 難しいこと勉強するのはきついので、UI操作自動化みたいのがいい

何かいい方法はないかと、調べていたら、下記のような情報が。
WindowsアプリのUI自動操作をUI Automation PowerShell Extensionで行う | d.sunnyone.org

あとは、おおよそ下記を参考にしながらできそうな気配。
UI Automation PowerShell Extensions - Documentation
はじめはpythonがいいなと思っていたけれども、pywinautoはなぜかすぐ落ちるしWindowsはやはりWindowsであろう、と。

下記スクリプトプロトタイプ、すでにUIAutomationは読み込まれている状態から。ここでの、UI要素名とか諸々の記載は適当だが、このあたりはリンクにもあるように、UIAutomationSpy.exeを使えば簡単に判明することがわかった。

#印刷するアプリケーションを指定
#ウインドウの名前"hogedoc - Desktop"から取得
$window = "hogedoc - Desktop"
$wnd = Get-UiaWindow -name $window

#開始ページと終了ページを指定する。1ページから10ページめまで
$startp = 1
$endp = 1 + 9

#Ctrl+pにて印刷ダイアログ呼び出し
#keydownは押しっぱなし(多分),keypressは押す,keyupは押したキーを離す???
$wnd.keyboard.keydown([windowsinput.native.virtualkeycode]::control);
$wnd.keyboard.keypress([windowsinput.native.virtualkeycode]::VK_P);
$wnd.keyboard.keyup([windowsinput.native.virtualkeycode]::control)

#"印刷プレビュー"ウインドウが立ち上がる
#このウインドウで印刷するページを入力することになっている
#印刷の開始ページを指定する
#単純にtypetextで文字を送り込むとデフォルトで入っていた文字列に追記されてしまったため、
#ctrl + aを送り込んでからページ数を入力する
$pre_start = Get-UiaWindow -name "hogedoc - 印刷プレビュー" |`
 Get-UiaSpinner -AutomationId 'Page' -Class 'DomainUpDown' -Name 'start:' | `
 Get-UiaEdit -AutomationId 'Text' -Class 'TextBox'
$pre_start.keyboard.keydown([windowsinput.native.virtualkeycode]::control);
$pre_start.keyboard.keypress([windowsinput.native.virtualkeycode]::VK_A);
$pre_start.keyboard.keyup([windowsinput.native.virtualkeycode]::control)
$pre_start.keyboard.typetext($startp)

#印刷の終了ページを指定する
$pre_end = Get-UiaWindow -name "hogedoc - 印刷プレビュー" |`
 Get-UiaSpinner -AutomationId 'Page' -Class 'DomainUpDown' -Name 'end:' | `
 Get-UiaEdit -AutomationId 'Text' -Class 'TextBox'
$pre_end.keyboard.keydown([windowsinput.native.virtualkeycode]::control);
$pre_end.keyboard.keypress([windowsinput.native.virtualkeycode]::VK_A);
$pre_end.keyboard.keyup([windowsinput.native.virtualkeycode]::control)
$pre_end.keyboard.typetext($endp)

#続行ボタンを押して画面を進めるイメージ
Get-UiaWindow -name "hogedoc - 印刷プレビュー" | `
 Get-UiaButton -Class "Button" -Name "Continue" | Invoke-UiaButtonClick

#そして印刷画面。OKボタンを押して印刷するイメージ
Get-UiaWindow -name "印刷" | ` 
 Get-UiaButton -Class "Button" -Name "OK" | Invoke-UiaButtonClick


一行ずつ対話的にやっていたところでは、Ctrlキーを送り込んだ時点でシステム全体がCtrl押しっぱなし状態になって、困ったから再起動した。これ注意。

raspberry pi でUSBスピーカから音出す

調べればいくらでも出てくる話ではございますが、Raspberry Piで音出したいときにUSBスピーカつないでそっから電気とってかつ音を出すと手軽。

はじめに、やることはぐぐったりして動作実績のあるものや、その後継とかを調べること。たいてい大丈夫だが、ハードウェアは相性問題もあるため。ちなみに手元ではMS-P05UWHを使っている。

つぎに、調達したUSBスピーカをRaspberry Piにつなぐ。そして、認識していることを確認する。ここはコマンドを入力したりする。まず、つながない状態で"lsusb"と打つ。そして、つないでもう一度"lsusb"と打つ。

ここで出力がなんか行数増えてれば認識していそうだと考えられる。例えば

$ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 0410:0112 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter
Bus 001 Device 007: ID 0c76:160c JMTek, LLC. ←増えた

因みに、"-v"オプションをつけると詳細な出力がされる。詳細で意味わかんないけど出力中何となくAudioとか文字が見え隠れするとちょっと安心する。"-t"表示でツリー表示。audioとか文字が見えたりするとまたちょっと安心したりする

lsusbというのは、USBデバイスの情報を確認するコマンド。

そして、設定らしきことをするのだけれども、alsaというものが関係している。これは、Advanced Linux Sound Architectureの略なので、まぁそこは推して知るべし。まず、下のコマンド。そして例えば下記のように表示される

$ cat /proc/asound/modules 
 0 snd_bcm2835
 1 snd_usb_audio

これは、alsaサウンドカードドライバのリスト表示なので、snd_usb_audioとあるので、動作しそうであることがわかる。

最後に、alsaの設定ファイルを書き換える。対象は、/etc/modprobe.d/alsa-base.conf。そして、ファイル中に、先ほど確認した"snd_usb_audio"というものを見つける。そして、このindex値を書き換える。

/etc/modprobe.d/alsa-base.conf内

#options snd-usb-audio index=-2    ←書き換え前
options snd-usb-audio index=0   ←書き換え後

なぜindexを0にしているか、それは0を与えて先に読み込ませ、デフォルトの使用としたいから(コメントアウトするだけでも良いらしいけど手元ではなぜかうまく動かなかった)。-2は「ALSA にカードを優先的に使わせないようにする」とのこと(raspbianとは別ディストリビューションだが、arch linuxwikiAdvanced Linux Sound Architecture - ArchWikiより)。

上記までやったら、ちゃっと再起動させてみましょう。

他参考、alsa.opensrc.org