Clovaスキル「抵抗値換算」のレポジトリです。サーバはFirebaseを使ってます。
電子工作に使う抵抗素子には「カラーコード」と呼ばれるものが表示されています。このカラーコードの並びから抵抗値を読み取ることができますが、電子工作に慣れていない人には「カラーコード -> 抵抗値」への変換がすぐには難しいです。そこでこのスキルを使ってClovaの前でカラーコードの色の並びを読み上げて、それを抵抗値に変換したものをClovaに読んでもらうものを作りました。
このスキルでは精密抵抗器を無視した4つのカラーコードの並びで、このサイトの「よく使われる抵抗の一覧表」の抵抗素子に対応します(ArduinoでLEDやセンサを使う場合は1kか10kの数値のものしか基本は使わないかと)。カスタムスロットとして同一レポジトリのcolorCodeValue.tsv
を用いています。
手順についてはこの記事を参考にしてます。
まずはFirebase CLIをインストールします。
npm install -g firebase-tools
-g
を使ってグローバルにインストールします。場合によってはpermissionではじかれる可能性もあるのでsudo
が必要かも?
次にログインします。
firebase login
ここら辺はターミナルに言われるまま操作すれば問題ないかと。次にプロジェクトを作成します。
firebase init functions
既存のプロジェクトを選択・新しくプロジェクトを作成する、の2択が選べます。
次にFirebaseにデプロイします。
firebase deploy --only functions,hosting
環境変数は以下のコマンドで設定可能です。
firebase functions:config:set clova.extension.id="your extension id"
環境変数の確認は以下のコマンドを用います。
firebase functions:config:get
コード上で用いたい場合は、以下のようにして呼び出します。
const extensionId = functions.config().clova.extension.id;
また、firebase.json
は以下のように設定しました。
{
"hosting": {
"public": "./",
"rewrites": [{
"source": "/clova",
"function": "clova"
}],
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
]
}
}
expressを用いたスキルの開発はこのサイトを参照して行いました。
functions/
上で以下のコマンドを用いて必要なpackageをインストールします。
npm install --save https://github.com/TanakaMidnight/clova-cek-sdk-nodejs express
Clovaの公式SDKを用いない理由はこの記事を参照してください。
まず連想配列を用意しました。色をkey
に対応する数値をvalue
に設定してます。
const colorcodes = { 黒:'0', 茶:'1', 赤:'2', 橙:'3', 黄:'4', 緑:'5', 青:'6', 紫:'7', 灰:'8', 白:'9' };
抵抗値の計算は以下の式で求めます
const registorValue = (1番目のカラーコード * 10 + 2番目のカラーコード) * 10 ** 3番目のカラーコード;
しかしこの抵抗値を言葉としてアウトプットさせるときは「キロ」などの読み変換させるほうが自然になります。
そこでregistorValue
への代入式を以下のように拡張させました。
const registorValue = thirdValue => {
switch(thirdValue) {
case '0':
return `${firstValue}${secondValue}`;
case '1':
return `${firstValue}${secondValue}0`;
case '2':
if (secondValue === '0') {
return `${firstValue}キロ`;
} else {
return `${firstValue}点${secondValue}キロ`;
}
case '3':
return `${firstValue}${secondValue}キロ`;
case '4':
return `${firstValue}${secondValue}0キロ`;
default:
return '?';
}
}
firstValue, secondValue, thirdValue
はそれぞれ1番目~3番目のカラーコードに対しています。case 5: ~ case 9:
の実装をしていませんが、元々スロットを用意していないので省略しました。
半角の数字スロットを受け取ったときに、その各桁の数値に対応する色のkeyを取得していくような処理を以下のように実装しました。
const registorValue = String(slots.number);
if (typeof Number(registorValue) === 'number' && registorValue.length >= 2) {
const firstColor = Object.keys(colorcodes).filter(key => {
return colorcodes[key] === registorValue.slice(0, 1)
});
const secondColor = Object.keys(colorcodes).filter(key => {
return colorcodes[key] === registorValue.slice(1, 2)
});
const thirdColor = Object.keys(colorcodes).filter(key => {
return colorcodes[key] === String(registorValue.length - 2)
});
const colorcode = `${firstColor}${secondColor}${thirdColor}`;
speech.value = `${registorValue}Ωのカラーコードは${colorcode}金です。`
}
抵抗値を2桁以上と制限をかけていますが、通常は3桁以上の抵抗値をよく使うので実用上は問題ないと思います。今回は誤差の値は考慮しないので4番目のカラーコードをデフォルトで金にしました。
以下のような連想配列を用意しました。DataBaseを使おうと思いましたが、使うほどの内容ではないので逃げました使わないという判断をしました。
const howToMemorize = {
橙 : "橙はミカン",
灰 : "ハイヤー",
白 : "四苦八苦",
紫 : "紫しち部",
緑 : "さつきみどり",
茶 : "茶を一杯",
赤 : "赤いニンジン",
青 : "青虫",
黄 : "四季の色",
黒 : "黒い礼服"
};
覚え方はこのサイトと自分が過去に使った覚え方を参考にしました。