20201118のNode.jsに関する記事は4件です。

Steinを使ってSpreadSheetのデータをとるときのメモ

準備

1.Steinにアカウント登録(Googleアカウント) このとき、SpreadSheetへのアクセス許可がなされる。
2.SteinのSpreadSheetのURLを貼り付けるところがあるので、扱いたいSheetのURLをコピペ どのファイルなのかを指定する目的
3.Stein上に表示されるAPIのURLをコピー Steinを通してSpreadSheetにアクセスされる。
 image.png
4.Node.js(今回使う言語)上にコピペ

// Read Sheet1
const SteinStore = require("stein-js-client");
const store = new SteinStore(
  "https://api.steinhq.com/v1/storages/xxxxxxxxxxxxxxx"
);

store.read("Sheet1", { limit: 1, offset: 2 }).then(data => {
  console.log(data);
});

参考URL

Steinのサイト

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

部屋が乾燥してきたらGoogleHomeで知らせてもらう

はじめに

今年の冬は、例年以上に湿度に注意という事で、湿度が低いときはGoogleHomeに注意してもらうことにした。

image.png

ハード

  • RaspberryPi 3B
  • GoogleHome (私のはminiです)
  • SwitchBot 温湿度計
  • 母艦(Windowsマシン。何でも良い)

モジュール

主なモジュールは以下の通り。
- Raspberry Pi OS:Buster(2020-05-27-raspios-buster-armhf)
- Node.js
- castv2-client
- VoiceText
- node-switchbot
- Ambient(予め準備しておく:Ambient)

Ambient ヤメました。1年間しか保存できないので、Google Spredsheetにしました。

Raspberry Pi OS

RaspberryPiのインストールは済んでいるもとします。

~ $ cat /proc/device-tree/model
Raspberry Pi 3 Model B Rev 1.2

~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
Codename:       buster

Raspberry Pi OS:Buster(2020-05-27-raspios-buster-armhf)

castv2-googlehome

以前、投稿した「RaspberryPi で castv2-client を使ってGoogleHomeをしゃべらす」を使用するので、しゃべるところまでは完成させておくこと。

モジュールの取得

今回作成したモジュールをgithubに上げてあるので取得する。
https://github.com/nori-dev-akg/switchbotTH-googlehome

~ $ cd ~                                          #ホームに移動
~ $ git clone https://github.com/nori-dev-akg/switchbotTH-googlehome
~ $ cd switchbotTH-googlehome                     #カレントを移動しておく
~/switchbotTH-googlehome $ npm init --yes         #作業用ディレクトリ初期化
#以降、作業用ディレクトリで行う

ログ

せっかくなので Googleスプレッドシート でログも取っておく
ラズパイからGoogleスプレッドシートへ送信を参考に 送信先URL を準備しておく

node-switchbot

Bluetooth用モジュールと node-switchbotライブラリをインストール

~/switchbotTH-googlehome $ sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
~/switchbotTH-googlehome $ npm install @abandonware/noble
~/switchbotTH-googlehome $ npm install node-switchbot

npm install時にwarningが出るけどスルー

SwitchBot お試し

以下を実行すると、近くの SwitchBot のアドバタイズデータが取れます。何回か出ます。
"address" が SwitchBot の IPアドレス。

#sudoを付けること
~/switchbotTH-googlehome $ sudo node node-switchbot-sample.js
{
  "id": "xxxxxxxxxxxxxxxxx",
  "address": "xx:xx:xx:xx:xx:xx",
  "rssi": -87,
  "serviceData": {
    "model": "T",
    "modelName": "WoSensorTH",
    "temperature": {
      "c": 24.4,
      "f": 75.9
    },
    "fahrenheit": false,
    "humidity": 53,
    "battery": 100
  }
}
:

部屋が乾燥してきたらGoogleHomeで知らせてもらう

いよいよ本題。以下、ソース部分を任意に変更すること

  • RaspberryPi のIPアドレス
  • GoogleHome のIPアドレス
  • VoiceText APIキー
  • SwitchBot IPアドレス
  • GoogleスプレッドシートのURL

ソースでは「20度以上で45%以下になったら通知」となっているので適宜。
メッセージも「乾燥しています」となっているので適宜。
※不在時対策:冬場不在時はエアコンを切っているので20度以上にはならないので

switchbotTH-googlehome.js

         :
const rapsberrypi_ip = '192.168.0.31';
const googlehome_ip = '192.168.0.200';
const voicetext_key = 'xxxxxxxxxxxxxxx';
const switchbot_ip = 'xx:xx:xx:xx:xx:xx';
const message = '乾燥しています';
const speaker = 'haruka'; //'show', 'haruka', 'hikari', 'takeru', 'santa', 'bear'
const min_temp = 20; // 20度以上
const min_humi = 45; // 45%以下
const spreadsheet_url = "https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxx/exec";
         :

実行してみる

~/switchbotTH-googlehome $ sudo node switchbotTH-googlehome.js
24.3
44
ambient:200
乾燥しています
status broadcast playerState=IDLE content=http://192.168.0.31:8080/voicetext/voicetext.mp3
status broadcast playerState=PLAYING content=http://192.168.0.31:8080/voicetext/voicetext.mp3

上記のようになり、GoogleHomeから「乾燥しています」が聞こえればOK。

動かないときは

  • RaspberryPiのIPアドレス VoiceTextのAPIキー GoogleHomeのIPアドレス SwitchBot IPをもう一度確認する。

  • 特に RaspberryPiのIPアドレスGoogleHomeのIPアドレスが間違いやすい!!

  • node-switchbot で使用している noble モジュールが sudo を必要とするので sudo を必ず付ける!sudo node switchbotTH-googlehome.js

永続化 & 定期実行

RaspberryPiの再起動時にも実行されるようにする。
crontab は sudo で実行する!sudo crontab -e
必ず、フルパスで記述する!

#必ず sudo で実行すること! 
~/switchbotTH-googlehome $ sudo crontab -e

#部屋が乾燥してきたらGoogleHomeで知らせてもらう
*/5 * * * * /usr/local/bin/node /home/pi/switchbotTH-googlehome/switchbotTH-googlehome.js > /home/pi/switchbotTH-googlehome/log 2>&1
#/etc/rc.local の下の方に追加
~/switchbotTH-googlehome $ sudo nano /etc/rc.local

/etc/rc.local

:
# castv2-googlehome
forever start /home/pi/castv2-googlehome/api.js

exit 0

おわりに

ログのグラフを添付します。

image

Special Thanks!!!

ラズパイからGoogleスプレッドシートへ送信

以上。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RaspberryPi で castv2-client を使ってGoogleHomeをしゃべらす

はじめに

これまでは google-home-notifier を使って RaspberryPi からGoogleHomeをしゃべらせていたのだが、RaspberryPi を構築しなおしたら全く動かん!色々調べてみたら動かない記事が沢山あって皆さん苦労しているようだ。castv2-client なるものでも GoogleHomeをしゃべらすことができるらしいのでやってみた。

環境

  • RaspberryPi 3B
  • GoogleHome (私のはminiです)
  • 母艦(Windowsマシン。何でも良い)

Raspberry Pi OS

RaspberryPiのインストールは済んでいるもとします。

~ $ cat /proc/device-tree/model
Raspberry Pi 3 Model B Rev 1.2

~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
Codename:       buster

Raspberry Pi OS:Buster(2020-05-27-raspios-buster-armhf)

Node.js & npm

Node.js/npm が入っていなければインストール。

~ $ sudo apt-get update
~ $ sudo apt-get upgrade
~ $ sudo apt-get install -y nodejs npm
~ $ sudo npm install n -g
~ $ sudo n stable
# ターミナルを一旦再起動する PATHが再設定される※
~ $ logout

~ $ npm -v
6.14.8
~ $ node -v
v14.15.1

ちょっと古い node が入ると思うんで sudo n stable で 上げた。
v10.21.0 → v14.15.1
※バージョンが上がっていない場合は ターミナルを再起動すること

VoiceText Web API

文字列を合成音に変えてくれるTTS(TextToSpeech)エンジン。
google-tts-api は発声が遅くてよろしくないが VoiceText はクリアでとっても良い!

VoiceText は無料だがAPIキーが必要。メールアドレスだけで取得できる。
VoiceText Web API

モジュールの取得

今回作成したモジュールをgithubに上げてあるので取得する。
https://github.com/nori-dev-akg/castv2-googlehome

~ $ git clone https://github.com/nori-dev-akg/castv2-googlehome
~ $ cd castv2-googlehome #カレントを移動しておく
~/castv2-googlehome $ npm init --yes #作業用ディレクトリ初期化
#以降、作業用ディレクトリで行う

ライブラリモジュールのインストール

  • castv2-client
  • voicetext
  • express fs
  • forever
~/castv2-googlehome $ npm install voicetext castv2-client express fs
#foreverは sudo でグローバルへ入れておく
~/castv2-googlehome $ sudo npm install -g forever

設定

api.js は常に実行させておく必要があるので forever する。

~/castv2-googlehome $ forever start api.js

speech.js ファイルを修正する。

  • RaspberryPi のIPアドレス
  • GoogleHome のIPアドレス
  • VoiceText APIキー
  • speaker:任意
  • 発声テキスト:任意

~/castv2-googlehome/speech.js

const Castv2GoogleHome = require('./castv2-googlehome.js');

const rapsberrypi_ip = '192.168.0.31';
const googlehome_ip = '192.168.0.200';
const voicetext_key = 'xxxxxxxxxxxxx';

const c2gh = new Castv2GoogleHome(rapsberrypi_ip, googlehome_ip, voicetext_key);

// speaker: 'show', 'haruka', 'hikari', 'takeru', 'santa', 'bear'
c2gh.speech('こんにちは。私はグーグルホームです', 'haruka');

しゃべらせてみる

~/castv2-googlehome $ node speech.js

GoogleHomeから「こんにちは。私はグーグルホームです」と聞こえれば完成!
上記では haruka にしていますが、hikari の方がイントネーションは良いように思われます。「ホ」の部分。show は例の声ですw。

おわりに

モジュール化したので汎用的に使えると思う。
VoiceText の API キーを取得するという手間があるが、「モヤさま」の showくん の声が聞けるのでそれだけの価値はあるかとw。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Node.js】tailwindcssでログインページを作成する方法

はじめに

今回は前回の記事の続きです。
今回はNode.js+EJS+tailwindcssでログインページを作成します。

今回のファイル構成

nodejs-tailwindcss/
  │
  ├ controllers/
  │ └ pageIndex.js
  │
  ├ puclic/
  │ └ styles/
  │     └ style.css
  │     └ tailwind.css
  │
  ├ views/
  │ └ index.ejs
  │
  ├ index.js
  ├ package.json
  ├ postcss.config.js
  ├ tailwind.config.js

それでは実際にコードを書いていきましょう!

最初に、index.jsを作成しよう

index.js
//モジュールを読み込む
const express = require('express');
const ejs = require('ejs')

//コントローラーを読み込む
const pageIndexController = require('./controllers/pageIndex');

//読み込んだexpressモジュールを実体化してインスタンスにする
const app = express();

//テンプレートエンジンとしてejsを用いる
app.set('view engine', 'ejs');

//publicフォルダを使えるようにする
app.use('/public', express.static(__dirname + '/public'));

//ルーティング処理
app.get('/', pageIndexController);

//サーバーを立ち上げる
app.listen(3000, () => {
    console.log('http://localhost:3000');
});

以下の記載で、publicフォルダ内のCSSが読み込めるので、
こちらの記述がない場合はCSSを使えません!
なのでこちらの記述は忘れないでくださいね。
こちらの記事を参考にしてください!

//publicフォルダを使えるようにする
app.use('/public', express.static(__dirname + '/public'));

次にルーティング処理を記述する、pageIndex.jsを作成しましょう。

次に、pageIndex.jsを作成しよう

pageIndex.js
module.exports = (req, res) => {
    res.render('index');
};

これだけしか記載しないので、わざわざファイルを分けるメリットは少ないですが、
運用していく中でファイルを分けておいた方が保守がしやすいので分けるようにしましょう。

最後にindex.ejsを作成しよう

index.ejs
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>nodejs-tailwindcss</title>
        <link rel="stylesheet" href="../public/styles/style.css" />
    </head>

    <body>
        <div class="flex flex-col h-screen">
            <div class="bg-gray-100 flex-auto">
                <div class="flex justify-center mt-20">
                    <div class="w-9/12 border bg-white">
                        <div class="my-16 text-center">
                            <h2 class="text-4xl font-bold">ログイン</h2>
                            <form action="/form/login" method="POST" class="mt-12">
                                <div class="mb-3">
                                    <input
                                        type="email"
                                        placeholder="you@gmail.com"
                                        name="email"
                                        class="text-xl w-7/12 p-3 border rounded"
                                    />
                                </div>
                                <div class="mb-5">
                                    <input
                                        type="password"
                                        placeholder="パスワード"
                                        name="password"
                                        class="text-xl w-7/12 p-3 border rounded"
                                    />
                                </div>
                                <div class="mb-5">
                                    <label class="inline-flex items-center">
                                        <input type="checkbox" class="form-checkbox" />
                                        <span class="ml-2 text-sm">ログインデータを保存する</span>
                                    </label>
                                </div>
                                <button
                                    type="submit"
                                    class="mb-3 text-xl w-4/12 bg-blue-800 text-white py-2 rounded hover:opacity-75"
                                >
                                    ログイン
                                </button>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </body>
</html>

クラスの記載が多いのでコード自体はめちゃくちゃ長いですが、
書いている内容はシンプルです!

正直たくさんコードを書かなければ覚えられないので、
公式サイトで大まかに理解した後は、
チートシートを使うのがおすすめです。

私もまだまだ覚えられていないので、
チートシートを手元においてコーディングしています!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む