工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Alexa対応のUSB電源スイッチ

コンポーネントと消耗品

>
Arduino MKR1000
× 1
0.1uF0805コンデンサ
× 8
LED(汎用)
× 4
ボタンを押す(長い)
× 4
INA219(soic 8)
× 1
LM3526M
× 2
USBソケット(垂直)
× 4
1k0805抵抗器
× 4
0.1オーム電流センス抵抗
× 1
1uF0805コンデンサ
× 1

必要なツールとマシン

>
3Dプリンター(汎用)
はんだごて(汎用)

アプリとオンラインサービス

>
Amazon AlexaAlexaスキルキット
Tinamous
Amazon Web Services AWS Lambda

このプロジェクトについて

Alexa、ThingyStickをオンにして...

背景

ますます多くのデバイスがUSBで動作しますが、これらの多くはインターネット接続やホームオートメーションオプション(LEDライトなど)のない「ダム」デバイスである傾向があります。リモートで自動化または制御するにはどうすればよいですか?おそらく、主電源スイッチに接続されたUSB電源は、特に4つのデバイスを個別に制御したい場合は、少しやり過ぎです!

このプロジェクトでは、インターネット経由でUSB電源デバイスへの電源を制御できます。また、Alexa用のTinamous SmartHomeスキルを使用すると、ダムUSBデバイスの音声制御を有効にできます。

現在、USB電源をリモートで制御するデバイスは市場に出回っていません。このプロジェクトを開始したとき、(英国では)何も見つかりませんでしたが、最近、マルチギャングアウトレットの一部としていくつか登場しました(そう、アイデアはるか昔に始まった、遠く離れた銀河系で)、これらは有名なホームオートメーションメーカーではなく、ブランドのないメーカー(つまり、ZLD-34UK)によるものであるため、使用するデバイスクラウドの問題があります。中国とその逆に、そのメーカーが存在しなくなった場合、その安全性、ソフトウェアの使用可能性、来週のリサイクルボックスに入れられるか、インターネットに接続されたデバイスに関するその他の通常の懸念事項の多くは言うまでもありません。オープンソースのArduino搭載デバイスと同じようにハッキング可能です。

ユースケース

制御したいUSB電源デバイスの例:

  • USB電源ライト
  • キンドルファイア/クロームキャストスティック(特に子供部屋でテレビを見ないようにするため)
  • USB加湿器
  • Echo Dot(Alexaを一晩シャットダウンさせるか、デバイスを再起動するだけですか)
  • 開発ボード。コードが無限ループに入ったため、そのプロジェクトを再起動する必要がありますか?
  • アクセスが難しいが、時々再起動する必要があるデバイス(ロフトのセンサーなど)
  • (消費電流と入力電圧を測定することにより)電力が供給されていることを確認したいクライアントの施設に設置されたデバイス

シンプルな電源制御: Alexa音声制御またはTinamousを介した他のコマンドを介した、インターネット対応の電源切り替え。オンとオフ。

スマートパワーコントロール: 多くのUSBランプには、ランプをオンにするタッチコントロールがあります。つまり、リモートでライトをオンにすることはできませんが、オフにすることはできます。多くの場合、必要なのはそれだけです(スリープ状態にして、ランプをオンのままにします)。 ?外出して、すべてのライトをオフにしますか?)

ただし、Alexaを使用してUSBランプをオフにした後は、ランプをオンにする前に、Alexaにランプをオンにするように依頼する必要があります。これはばかげています。スマート電源を有効にすると、offコマンドは、デバイスの電源を復旧する前に、ランプの電源を数秒間オフにします。ランプをオフにするのに十分ですが、その後も通常の操作が可能です。

タイマーの自動化: 設定した時間にデバイスの電源を自動的に切るようにします。火のそばでAmazonTVを見ている子供たちは遅くまで固執しますか? USB電源を午後8時に自動的にシャットダウンします。

電力監視: USB電源のハードウェアを開発している場合、特に最初に電源を入れたときにデバイスが消費している電流を知りたい場合や、バッテリーパックの充電のプロファイルを作成したい場合があります。オンボードのINA219を使用すると、消費電流を監視できます(私はわずかな労力で約1kHzのサンプリングを管理しました)。大電流でのUSBリードの電圧降下も問題になる可能性があります。INA219はデバイスへの電力を監視するため、低電圧を警告できます。より高い電流とより大きなケーブルを使用できるように、端子台も用意されています。

停電: MKR 1000のバッテリーオプションを使用することで、USB供給電圧を監視し、入力電源に障害が発生した場合に通知を送信できます。これは、USB電源を使用するが、少し余分な監視が必要なリモート(オフサイト)ソリューション、または家の単純な主電源障害検出と同じように役立つ場合があります。

ハードウェア

このプロジェクトは非常にシンプルで、Arduino MKR1000が中心で、2つのLM3526Mを使用したUSB電源スイッチングにより、ハイサイドスイッチングと障害検出(低電圧、過電流)、INA219を使用した電力監視(電圧と電流)、そして最後にローカル制御オプション用のLEDとスイッチ。

DirtyPCBs.comでPCBを作成しましたが、.brdファイルをOSHPark.comに送信して、作成することもできます。 Arduinoソケットには、ハッキングを可能にするために各ピンの両側にPCBパッドがあります。例えば環境条件用のセンサーや、電圧と電流を表示する小さなOLEDディスプレイを簡単に追加できます。

githubリポジトリでは、2ポートと4ポートのオプションです。 めちゃくちゃにしたので、2ポートPCBに注意してください USBソケットのレイアウトが間違っています(背面から前面にあります-極性が間違っています !)。

勝利 敗北の顎から:

ボードの裏側にUSBソックを取り付けることは実際には素晴らしい解決策であり、ピンの接続が正しいことを意味します(ただし、2ポートボードの場合は、シルクスクリーンが反対側にあることも意味します!)。ソケットにヘッダーが付いたArduinoは、USBソケットをエンクロージャーから取り出すのに必要な高さで少し押し込まれたので、実際にはうまく機能しました。ソケット、スイッチ、LEDを裏側にしてボードをやり直すことにしました。サイドと2つのポートを追加するために、4ポートバージョンが作成されました(また、2つのポーターにLEDがひどく配置されていたので、同様に修正されました!)

LEDとスイッチをドロップまたは改善する必要があるかもしれませんが、これを6または8ポートスイッチャーに拡張することを止めることはほとんどありません。

回路図面は、それを構築するのがはるかに複雑に見えます。多くの抵抗器はオプションです。抵抗R23、19、27、および26はすべてスイッチのプルアップであり、同様にR20-22、R14、およびR15はUSB制御および障害検出用のプルアップです。これらはすべて、ArduinoのINPUT_PULLUPピンモードを介して実行できますが、Arduinoを低電力スリープにし、割り込みを使用してウェイクアップする場合は、フロート(およびバウンド)しないようにこれらを設定することをお勧めします。 。

<図>

USB D + / D-ラインの周りにもオプションの抵抗を追加しました。これらは、デバイスが使用できる電力量を示すために取り付けることができますが、多くのダムデバイスでは、これらはとにかく無視されます。以下では、LED電流制限用のR24のみが実際に必要です。 R2-5とR28は空のままです。

<図>

LEDとスイッチも完全にオプションです。 USBをリモートで制御するスタンドアロンボックスが必要な場合は、これらのパーツを追加しないでください。

電源入力

このコントローラーは、3つのオプションを介して電力を供給できます。

1つ目は「内部」オプション(JP6ピン1と2が接続されている)で、USB電源はArduinoの5Vピンから(したがってArduino USBコネクタから)取得されます。ただし、これは低電力負荷にのみ使用する必要があります。

他のオプションは外部電源(JP6ピン2および3が接続されている)用で、J2(オンボードUSBマイクロコネクタ)またはJP8(端子台)を介して5Vを接続できます。両方のオプションを同時に使用しないでください。外部電源もArduinoVInピンにルーティングされるため、独自の電源オプションも必要ありません。

ボーナスポイントとして、0R抵抗をR10とR11、およびJ2に取り付けると、USB 3のUSBパススルーが得られるため、USB接続デバイスを再起動できます。ハードウェアの開発時に非常に便利で、USBソケットを使い果たしたくない場合に便利です。 PC!

<図>

エンクロージャー

このプロジェクトには、3Dプリント可能なエンクロージャーが含まれています。 PCBと蓋の接続にはM3ヒートフィットインサートを使用していますが、蓋の公差は摩擦ばめには十分です。

ふたにはいくつかのオプションがあります。

  • バッテリーコンパートメントの有無にかかわらず。
  • 脚の有無(ボックスを表面に固定するための取り付け穴)。

同様に、ベースボックスは(OpenSCADを使用して)3つの電源のそれぞれの開口部を含むように構成できます。

エンクロージャーを正しくするのに数回かかりました。プリントをどのようにバージョン管理しますか? Rigid.Inkファンクラブからの私のサンプルは非常に便利でした。

<図>

<図> <図>

Tinamousに接続する

Arduino MKR1000を使用してコンセントを制御しているため、WiFi接続が可能です。このボードを初めて使用する場合は、ボードオプションをArduinoIDEに追加する必要があります。

Tinamous MQTTサーバーを使用して接続します。これは主に、それが素晴らしいからですが、私が創設者/開発者/お茶メーカーだからかもしれません。デバイスに送信されるメッセージのステータス投稿トピックをサブスクライブします。 (つまり、「Status.To」トピック)。

コーディングを開始する前に、Arduinoに最新のファームウェアとTinamousへの安全な接続を取得するために必要なSSL証明書があることを確認する必要があります。もちろん、必要に応じて、これを独自のローカルMQTTサーバーに適合させ、セキュリティについてそれほど心配する必要はありません。

ステップ1

Arduino IDEを開き、 FirmwareUpdater をロードします WiFi101の例メニューからスケッチします。これをデバイスにアップロードします。

<図>

ステップ2

アップロードしたら、 WiFi101ファームウェアアップデータを選択します ツールから メニュー。

<図>

ステップ3

接続をテストしてから、ファームウェアを更新 。それが完了したら、ドメインの追加を使用します ボタンを押して tinamous.com を追加します Arduinoに正しいSSL証明書が設定されていることを確認します。 証明書をWiFiモジュールにアップロードを押します ボタンをクリックして証明書をアップロードします。

ステップ4

これで、独自のファームウェアを作成できます。このプロジェクトに添付されているファイルとGitHubリポジトリにもファイルがあります(GitHubには最新バージョンがあります)。

ArduinoスケッチにはWiFi101とMQTTクライアントを使用します。

<図>

MQTT by JoelGaehwilerオプションを選択します。

ファイルsecrets.hには、WiFiとTinamous MQTT設定を入力する必要があります。明らかな理由で、コピーを含めていません。

WiFiおよびMQTTサーバー設定:

  #define SECRET_SSID "Your SSID" #define SECRET_PASS "Your SSIDs Password" / ************************* TinamousMQTTセットアップ********************************* /#define MQTT_SERVER " .tinamous.com" #define MQTT_SERVERPORT 8883 #define MQTT_USERNAME "UsbSwitch。" #define MQTT_PASSWORD "パスワードはここに入力されます。"#defineMQTT_CLIENT_ID "UsbSwitch" #define DEVICE_USERNAME "UsbSwitch"  

Tinamousにまだ登録していない場合は、ここで独自の無料アカウントを作成できます。登録すると、アカウント/組織名の入力を求められます。これがTinamousのプライベートエリアになり、他のメンバー(Alexaを含む)をそのエリアに招待して、デバイスをグループと共有できます。

以下では、アカウントを「AlexaExample」と呼んでいます。これをMQTTセットアップに含める必要があり、Tinamousアカウントはhttps://AlexaExample.Tinamous.comにあります

<図>

ステップ5

次に、デバイスを追加する必要があります。 [Tinamousデバイス]ページで、[追加]ボタンをクリックします。

<図>

したがって、私のデバイスのTinamousMQTT設定は次のようになります...

  / ************************* Tinamous MQTT Setup *************** ****************** /#define MQTT_SERVER "AlexaExample.tinamous.com" #define MQTT_SERVERPORT 8883 #define MQTT_USERNAME "UsbSwitch.AlexaExample" #defineMQTT_PASSWORD "私のスーパーシークレットパスワード完全にPassw0rdではありません.... "#define MQTT_CLIENT_ID" UsbSwitch "#define DEVICE_USERNAME" UsbSwitch " 

これがTinamousアカウントとデバイス対応です。必要に応じて、ここにデバイスを追加できます。DEVICE_USERNAMEとMQTT_USERNAMEのMQTT設定を更新するだけです(MQTTはhttpなどのヘッダー情報を送信しないため、Tinamousは使用しているサブドメインを認識しないため、ユーザー名のアカウント)。

ステップ6

添付されたコードをデバイスにアップロードします(更新されたsecrets.hファイルを使用)。 TinamousMQTTClient.inoファイルを見てください。これはMQTTインタラクションを処理し、デバイスに送信されるAlexaコマンドを処理します。

SSL用のWiFiSSLClientを使用する必要があります。 SSLなしでローカルMQTTサーバーを使用する場合は、通常のWiFiクライアントを使用してポート1883にドロップダウンできますが、インターネットベースの場合はSSLクライアントを使用してください。

また、MQTTクライアント用にデフォルトのバッファーより少し多く予約する必要があります。ここでは4096バイトを予約しています。

  WiFiSSLClient networkClient; MQTTClient mqttClient(4096);  

mqttClient.beginを使用してクライアントをセットアップし、MQTTサーバーからメッセージを受信したときに呼び出されるonMessageで関数ハンドラーを指定します。

  mqttClient.begin(MQTT_SERVER、MQTT_SERVERPORT、networkClient); //受信したメッセージを処理します。 mqttClient.onMessage(messageReceived);  

次に、関心のあるトピックに接続してサブスクライブできます。ここでは、「Tinamous / V1 / Status.To / UsbSwitch」にサブスクライブしていることがわかります。これにより、Tinamousタイムラインから@UsbSwitchに送信されるメッセージを受信します。これがAlexaからメッセージを受け取る方法です。

  if(!mqttClient.connect(MQTT_CLIENT_ID、MQTT_USERNAME、MQTT_PASSWORD)){if(mqttClient.lastError()==LWMQTT_CONNECTION_DENIED){//このエラーは、ユーザー名またはパスワードが間違っているためです} if(mqttClient。 lastError()==-6){//このエラーは、SSL証明書を追加しなかったことが原因である可能性があります。 } //接続遅延(10000)を再試行する前に遅延を強制します。 falseを返します;} //接続に成功しました。次に、トピックmqttClient.subscribe( "/ Tinamous / V1 / Status.To /" DEVICE_USERNAME); をサブスクライブします。 
<図>

Tinamousタイムラインは、あなたとあなたのデバイス向けのプライベートバージョンのTwitterのように考えることができます。彼らは、MQTTまたはREST API(またはボットの1つ)を使用して、送信されたメッセージを確認し、それに基づいて行動したり、投稿したりできます。メッセージが返されます。

Alexa統合を有効にするためにTinamousで行う作業がもう少しありますが、今のところ、タイムラインを使用してメッセージを送信することで、デバイスとファームウェアをテストできます。

Tinamous SmartHomeスキルを使用する場合、必要なコーディングはこれだけです。

AlexaのTinamousスマートホームスキル

Tinamous Smart Home Skillは現在、公開の承認を待っています(執筆時点では、指が交差してストアにあります...)。独自のUSBスイッチャーを作成するには、このスキルが利用可能になったときに使用できます。

スキルは実際には非常に一般的であり、デバイスやその通信方法については何も知りません。 Tinamousのデバイスにタグを適用すると、スキルによってAlexaアカウントに適切なデバイスが作成されるため、このスキルとTinamousを使用して、デバイスに数行のコードを追加するだけで、独自のプロジェクトの1つを音声で有効にできます。

ただし、状況を変更したり、独自のスキルを記述したりして、開発の詳細を共有することもできます。

.Net Core 2.0のスキルをC#で作成しました。実際には、BOFFスマートファンプロジェクト用に開発されましたが、このプロジェクトでは、デバイスに多くのコンセント(ポート)を持たせ、それぞれをファーストクラスにするために拡張しました。 Alexaスマートホームデバイスの市民。

すべてのコード(一部のテストを含む!)はTinamous SmartHomeリポジトリにあり、クローンを作成、ダウンロードするか、好きなように表示します。スキルをLambdaにプッシュするために、AWSツールがインストールされたVisual Studio2017を使用しました。

フレームワークは、Alexaからの着信ディレクティブメッセージをコードを介してアクセスできるオブジェクトに逆シリアル化し、ヘッダーの名前空間とディレクティブ名に基づいて適切なアクションが実行され、適切な応答が返されます。

関心のある主なメッセージは次のとおりです。

  • アカウントのリンク
  • 発見
  • 状態レポート
  • 電源制御

アカウントのリンク:

これはAlexaによって処理されます。アカウントにスキルを追加すると、Alexaが認証を要求し、Tinamous Authorizeページに移動して、デバイスがアカウントにアクセスできるようにします。ここで、アカウント名(この場合はAlexaExample)、ユーザー名(Steve)、パスワード(いいえ、わかりません!)を入力する必要があります

<図>

発見:

アカウントがリンクされると、Alexaは検出を実行するように促し、スキルは「 Alexa.SmartDevice 」でタグ付けされたデバイスをTinamousに照会します "。これがないデバイスは単に無視されます。

これらのタグは、Tinamousの[デバイス]ページからデバイスを編集することで適用されます。

デバイスが「 MultiPort 」でもタグ付けされている場合 「各ポートが列挙され、それらのデバイスも追加されます。また、デバイスがサポートするAlexaディレクティブに基づいてタグを適用します。ここでは、「 Alexa.PowerController "と、アプリでデバイスを表示するカテゴリを示すタグもあります。ここでは、「 SmartPlug 」を使用しました。 "。

<図>

Alexa.BrightnessControllerなどの他のインターフェースも利用できますが、ここではあまり役に立ちません。詳細については、リポジトリのreadmeを参照してください。

MultiPortデバイスで個々のポートをAlexaに公開するには、デバイスの編集ページでも状態変数を設定する必要があります。

<図>

PortCountはデバイスが持っているポートの数を示し、「Port-1」..「Port-n」はAlexaがポートに使用する名前を示します。名前のないポートはすべて無視されます。ここでポートの名前を簡単に変更し、ディスカバリーを再実行してAlexaを更新できます。

発見中に、スキルは「powerState」または「powerState-port-n」のタグが付けられた、名前が付けられた、またはラベルが付けられたフィールドも適切に探します。このフィールドが見つかった場合、デバイスでサポートされている機能として割り当てられます(詳細については、状態レポートを参照してください)。

<図>

状態レポート

検出フェーズで、デバイスの機能をAlexaに伝えました。スキルはデフォルトで、これらをリクエストできることをAlexaに伝えます。したがって、AlexaはStateReportリクエストを送信して、これらの値を取得します。

これをサポートするために適用する最後のタグのセットが1つあります。今回は、デバイスフィールドです。デバイスがデータを送信すると(これは、ArduinoコードでMQTTを介してプッシュされるsenmlメッセージです)、Tinamousはデバイスのフィールドを作成します。次に、フィールドリストの[詳細]オプションを使用して、これを編集できます。タグオプションの使用は、ファームウェアでフィールド名を正しく取得したり、名前を変更したい場合にスタックしたりする必要がないことを意味するため、最も用途が広いです。

<図> <図>

ポート固有のフィールドが見つからない場合、Alexaは非ポート固有のフィールド(ここではpowerStateという名前)にフォールバックします。

電源制御

私たちのデバイスは、これなしではAlexaで使用されません! Alexaはスキル「TurnOn」と「TurnOff」に2つのディレクティブを送信します。スキルのメイン関数のエントリポイントは、最初に名前空間(Alexa.PowerController)を探し、次に適切なコントローラークラス(PowerController.cs)にジョブを渡します。

次に、スキルはステータスメッセージをTinamousタイムラインに公開するだけです。

例:

@UsbSwitchをオンにする

または

@UsbSwitchポート1をオンにする

サポートされている他のインターフェイスは、ほぼ同じ方法で処理されます。次に、このステータスメッセージを監視し、アクションを実行するのはデバイス次第です。その後、AlexaはStateReportを使用して状態を読み戻すことができます。

それがスキルの仕組みです。これで、AWS Lambdaにプッシュし、Alexaコンソールでスキルエントリを作成して、実際にAlexaにアクセスできるようにする必要があります。

AWS Lambda関数の作成:

Visual Studio内のAWSツールを使用して、コンパイルされたスキルをLambdaにプッシュしました。ただし、最初にラムダを作成する必要があります。

ヒント: サポートしている言語に適したAWSエリアにLambdaを作成します。英語(英国)はeu-west(アイルランド)をターゲットにする必要があります。

新しいラムダ関数を最初から作成します。既存のブループリントは制限されており、古くなっています(SmartHomeインターフェイスのV2のみをサポートしていますが、これは非常に異なり、非推奨です。V3を使用しています)。

Lambdaが必要なリソースにアクセスできるようにするには、新しいロールを作成する必要があります。ここでは、デフォルトとしてSimple Microservicesを選択します(実際には、必要以上のものを提供します)。 Cloud Watchでログを取得していないことがわかった場合は、IAMセクションを介してそのためのロール権限を付与する必要がある場合もあります。

<図>

次に、VisualStudioからバイナリを公開する必要があります。 AWSツールをインストールしたら、プロジェクトを右クリックして[AWSLambdaに公開...]を選択します

<図>

次に、Lambda式の詳細を入力し、[アップロード...]をクリックします。

<図> <図>

アップロードしたら、Lambdaでいくつかのテストを実行して、実行されることを確認できます。次に、[アクション]ドロップダウンから[新しいバージョンを公開]する必要があります。

<図>

公開したら、これにアクセスするためのスキル権限を付与する必要があります。

「AlexaSmartHome」トリガーをクリックして、スキルIDを入力します(まだ持っていませんが...)

<図>

Alexaコンソールでスキルを作成する:

Lambdaの準備がほぼ整ったので、スキル開発者コンソールに移動して、実際にそのエントリを作成する必要があります。 https://developer.amazon.comを開き、Alexaスキルキットを選択して、新しいスキルを追加します。

ターゲットとする言語であるSmartHome Skill API(たとえば、英国では英語(UK))を選択し、V3(推奨)ペイロードバージョンを選択します。

<図>

[構成]ページで、より興味深い詳細を確認できます。バージョン管理されたLambda(画面の右上)からLambdaARNを入力します。 :1、:2、:5246のように終了する必要があります(いくつか行った場合は;-))。

<図>

Lambdaでは、「アプリケーションID」、「スキルID」、「ID」など、スキルから今日呼ばれているものを貼り付けることもできますが、amzn1.ask.skill.2 _______________ 50のようになります。

アプリケーションIDを追加したら、必ず[保存]をクリックしてください。古いコンソールでは、スキル名の下のヘッダーにIDがあり、新しいermで新しいウィンドウを開き、コンソールのスキルリストに戻って、適切なリンクをクリックします。 (まるで彼らが実際にスキルを作るためにコンソールを使用したことがないかのようです)。

アカウントのリンクを有効にするには、Tinamousで作成されたOAuthアプリケーションが必要です。これは、Alexaボットを使用して行われます。 Tinamousアカウントのボットページに移動し、Alexaボットを追加します。作成すると、ダイアログボックスに、アカウントのリンクを構成するために必要なすべての詳細が表示されます。

注意:(間もなく...)公開されたTinamous SmartHomeスキルを使用している場合は、Alexaボットは必要ありません。

<図> <図>

ボットによって作成されたアプリケーションにより、他のTinamousアカウント所有者は、あなたのスキルを使用して自分のアカウントをリンクすることができます。当然、スキルを公開する必要はなく、非公開にすることもできます。また、Tinamousアカウントでスキルを表示することはできません。

同様に、別のデバイスクラウドを使用する場合(真剣に、なぜそうするのですか;-))、OAuthアプリケーションの詳細を入力する必要があります。

[テスト]ページで、[Alexaアプリにこのスキルを表示する]でスキルが[はい]に設定されていることを確認します。

保存してalexa.amazon.co.uk(またはお住まいの地域に適したアプリ)にアクセスするか、明らかに彼らのアプリも.....

[スキル]、右上の[スキル]、[開発スキル]の順にクリックすると、開発スキルであることを示す緑色のマーカーが付いたスキルが表示されます。

<図> <図>

「Alexa、USBライトをオフにする」、および選択すると追加のスキル情報が「公開情報」ページで構成されているため、公開に完全に取り組むことなく、開発中に情報を入力できます。

スキルコードを更新する必要がある場合は、新しいLambda関数をアップロードし、新しいバージョンを作成し、SmartHomeトリガーとスキルIDを再度追加してから、バージョン管理されたLambda関数をスキルコンソールに貼り付けます(バージョン管理されたラムダですが、試したときに機能しませんでした。その時点で間違っていたことが他にもたくさんありましたが)。

成功!

スキルコードがLambdaで実行され、スキルがAlexaアカウントにインストールされているので、検出を実行してから、デバイスの制御を開始できます。

CloudWatchログをクリックすると、スキルによって書き込まれたログ情報を確認できます。

スキルのデバッグとヒント

Alexaは、問題が発生したときに開発者からのフィードバックをほとんど提供しません。何年もかけて、Alexaが期待どおりに機能しない理由を推測することができます。

  • エンドポイントIDで英数字以外のほとんどのものを避けてください(私はある段階で*を使用し、すべてが壊れましたが、明白な方法ではありませんでしたが、#は問題ありませんでした。図を見てください!)
  • すべてをログに記録します。スキルを呼び出したら、ログを確認してください。ログがない場合は、おそらく認証であるか、スキルがLambda式に対して許可されていません。
  • 一致するAWSとAlexaのメールアカウントを使用します。
  • ラムダをスキルと同じ地域に保持します(英国のスキルの場合はアイルランド)。
  • スキルが呼び出されてもAlexaがそれに応答しない場合(つまり、デバイスがリストされていない場合)、応答形式が間違っている可能性があります。
  • 日常のAlexaアカウントを使用したくない場合は、Amazonの世帯を使用して2つ目のアダルトアカウントを追加できます。ただし、これは大人2名に限定されているようであり、壮大な遅延なしに変更することはできません。
  • 「Alexa、プロファイルの切り替え」に、開発者プロファイルと通常のプロファイルを切り替えるように依頼できます。
  • Alexaコンソールの再設計により、より優れたデバッグ情報が利用できるようになることを願っています。ただし、現在表示されているのは、ボックスが大きく、検証が少し優れていることだけです。いくつかのログが利用可能ですが、それらは単なる成功ログです。別名管理レベルは良い指標であり、デバッグには役立たない36時間遅れています!

1つのスキル、あらゆる(IoT)モノ!

Tinamous SmartHomeスキルを使用すると、(モノのインターネット)モノがTinamous MQTTサーバーに接続できる(またはサポートされているボットを介して接続されている)限り、Alexa SmartHomeコントロールをモノに追加するだけで、次のようなメッセージを処理できます。 「オンにする」、「オフにする」、「明るさを20に設定する」。 Tinamousにタグを追加するだけで、...

「アレクサ、スマートホームデバイスを発見」

コード

  • AlexaUsbSwitcher.ino
  • TinamousMQTTClient.ino
  • UsbControl.ino
  • WiFiClient.ino
  • Secrets.h
AlexaUsbSwitcher.ino Arduino
これがメインファイルです。
 #include  #include  #include  #include  //独自のSecrets.hにWiFiとTinamousの定義を提供しますその中に。#include "Secrets.h" // ================================/ *#define MAX_USB_PORTS 2 // 2ポートboard.intled_pin [MAX_USB_PORTS] [2] ={{A5、A6}、{0,1}}; int switch_pin [] ={A0、A1}; // UsbスイッチBチャネル->ピン5 ==USB1int usb_enable_pin [] ={2、5}; int usb_fault_pin [] ={3、4}; bool usb_port_state [] ={false、false}; bool usb_power_mode [] ={0、0、1、1}; * /// --------------------------------- // 4ポートボード。#defineMAX_USB_PORTS 4 // 2ポートボードには2色のLEDがあり、4ポートは同じピンを使用しません...... // LED:TX、Rx、D7、D6(1-4)int led_pin [MAX_USB_PORTS] [2] ={ {14、14}、{13,13}、{7,7}、{6,6}}; int switch_pin [] ={A0、A1、A2、A3}; // USBイネーブルピン、D1、D3、 D4、D5(この順序ではありません)int usb_enable_pin [] ={5、4、1、3}; //単一の障害ピン(D2)int usb_fault_pin [] ={2、2、2、2}; bool usb_port_state [ ] ={false、 false、false、false}; //モード:0-要求に応じてオフにします。//モード:1-スイッチをオフにしてから、遅延後にオンにします(タッチコントロールのあるLEDライトに便利です)。intusb_power_mode[] ={1 、0、0、0}; // ================================//自動化オプション.//時間(ミリス)USBポートのオン/オフを切り替える必要があります。//ゼロはignore.unsigned long usb_power_switch_on_at [] ={0、0、0、0}; //最初のループで処理されるように> 0に設定します。 /副作用は、スマートパワーモードのユーザーが再びオンになるようにスケジュールすることです。//unsignedlong usb_power_switch_off_at [] ={1、1、1、1}; //電流モニターINA219Adafruit_INA219ina219; //フラグ1つ以上のUSBポートに障害があるかどうかを示します。boolhas_usb_fault=false; //測定電力.floatshunt_voltage =0; float bus_voltage =0; float current_mA =0; float load_volatile =0; float power_mW =0; //分/ max float max_current_mA =0; float max_busvoltage =0; float min_busvoltage =20; //電力使用量を追跡します。unsignedlonglast_measurement_time=0; bool power_failed =false; bool over_current =false; // MQTTパブリッシング.//デバイスに電力を供給するときはおそらく速くしたい//そうでないときは遅くしたい!intupdate_interval_seconds =20; unsigned long next_message_send_at =0; // =================================================//メインセットアップエントリポイント// =================================================void setup(){pinMode(LED_BUILTIN、OUTPUT); digitalWrite(LED_BUILTIN、HIGH); for(int channel =0; channel  MAX_USB_PORTS){戻る; } //セットアップの進行状況に基づいてLED(1..4)を点灯します。 SetLeds(stage-1、true、true);} // ===================================================//メインループ// ===================================================void loop(){// 4ポートデバイス、デバッグLEDはポート4LEDです。 //ポート4がオンになっている場合は、LEDをオフにしないでください。 // 4つのポートをすべてオフにすると、デバッグLEDを好きなように点滅させることができます... if(!hasPoweredPorts()){digitalWrite(LED_BUILTIN、LOW); } //障害をチェックします。 bool faulted =false; for(int channel =0; channel  max_current_mA){max_current_mA =current_mA; } if(bus_voltage> max_busvoltage){max_busvoltage =bus_voltage; } if(bus_volatile  4.5){Serial.print( "外部電源が復元されました。バス電圧:"); Serial.print(バス電圧); Serial.println( "V"); publishTinamousStatus( "外部電源が復元されました。"); power_failed =false; } if(bus_voltage <4.2 &&!power_failed){Serial.print( "外部電源障害!バス電圧:"); Serial.print(バス電圧); Serial.println( "V."); publishTinamousStatus( "外部電源が失われました!"); power_failed =true; } if(over_current &¤t_mA <1500){publishTinamousStatus( "現在の障害がクリアされました!"); over_current =false; } if(current_mA> 2000 &&!over_current){//過負荷! publishTinamousStatus( "Over Current!"); over_current =true; }} void printPowerWide(){Serial.print( "バス電圧:\ t"); Serial.print(バス電圧); Serial.print( "V \ t"); Serial.print( "現在:\ t"); Serial.print(current_mA); Serial.print( "mA \ t"); Serial.print( "最大電流:\ t"); Serial.print(max_current_mA); Serial.print( "mA \ t"); Serial.print( "最小電圧:\ t"); Serial.print(min_busvoltage); Serial.print( "V \ t"); Serial.print( "最大電圧:\ t"); Serial.print(max_busvoltage); Serial.print( "V \ t"); Serial.println();} void printPowerSkinny(){Serial.print(bus_voltage); Serial.print( "\ t"); Serial.print(current_mA); Serial.print( "\ t \ t"); Serial.print(max_current_mA); Serial.print( "\ t \ t"); Serial.print(min_busvoltage); Serial.print( "\ t"); Serial.print(max_busvoltage); Serial.print( "\ t"); Serial.print( "["); for(int channel =0; channel  next_message_send_at){Serial.println( "------- ----------------- "); Serial.println( "MQTT公開測定値"); if(power_failed){//電源がバッテリーの電力を維持できなかったときに//送信する頻度を減らします。 sendNextPublishAt(update_interval_seconds * 10); } else {sentNextPublishAt(update_interval_seconds); } //そしてsenmlとして1つ実行します... String senml ="{'e':["; //電圧senml =senml + "{'n': 'busVoltage'"; senml =senml + "、 'v':"; senml =senml + String(bus_voltage); senml =senml + "、 'u': 'V'}"; //最大電圧senml =senml + "、{'n': 'maxBusVoltage'"; senml =senml + "、 'v':"; senml =senml + String(max_busvoltage); senml =senml + "、 'u': 'V'}"; //最小電圧senml =senml + "、{'n': 'minBusVoltage'"; senml =senml + "、 'v':"; senml =senml + String(min_busvoltage); senml =senml + "、 'u': 'V'}"; //現在のsenml =senml + "、{'n': 'Current'"; senml =senml + "、 'v':"; senml =senml + String(current_mA); senml =senml + "、 'u': 'mA'}"; //最大電流senml =senml + "、{'n': 'MaxCurrent'"; senml =senml + "、 'v': '"; senml =senml + String(max_current_mA); senml =senml + "'、' u ':' mA '}"; // mAhが消費されました... senml =senml + "、{'n': 'mAh'"; senml =senml + "、 'v':"; senml =senml + String(0); // TODO! senml =senml + "、 'u': 'mAh'}"; senml =senml + "、{'n': 'powerState"; senml =senml + "'、' bv ':"; if(isPowered()){senml =senml + "true"; } else {senml =senml + "false"; } senml =senml + "}"; for(int channel =0; channel  0 &&onAt  0 &&offAt  
TinamousMQTTClient.ino Arduino
このファイルはMQTT接続を処理しました(つまり、Alexaコマンドに応答するビットです)。
 // ======================================// MQTTを介したTinamous接続// ======================================#include  #include  #include "secrets.h" //Secrets.hのWiFiおよびMQTT設定// SSL接続には必ずWiFiSSLClientを使用してください。 //非SSL(ポート1883)の場合は、通常のWiFiClientを使用します。//WiFiClientnetworkClient; WiFiSSLClient networkClient; // https://github.com/256dpi/arduino-mqtt//4096バイトのバッファサイズを指定MQTTClientmqttClient(4096); //電源を入れてから接続されている場合boolwas_connected =false; String senml =""; unsigned long nextSendMeasurementsAt =0; // =================================================// MQTT接続情報を設定します// =================================================bool setupMqtt(){senml.reserve(4096); Serial.print( "ポートでTinamousMQTTサーバーに接続しています:"); Serial.println(MQTT_SERVERPORT); Serial.print( "サーバー:"); Serial.println(MQTT_SERVER); mqttClient.begin(MQTT_SERVER、MQTT_SERVERPORT、networkClient); //受信したメッセージを処理します。 mqttClient.onMessage(messageReceived); connectToMqttServer();} // =================================================// MQTTサーバーに接続します。これは//繰り返し呼び出すことができ、すでに接続されている場合は無視されます// =================================================bool connectToMqttServer(){if(mqttClient.connected()){return true; } Serial.println( "Reconnecting ...."); Serial.println( "wifiをチェックしています..."); if(WiFi.status()!=WL_CONNECTED){Serial.print( "WiFiNotConnected。Status:"); Serial.print(WiFi.status()、HEX); Serial.println(); delay(10000); falseを返します。 } Serial.println( "MQTTサーバーに接続しています..."); if(!mqttClient.connect(MQTT_CLIENT_ID、MQTT_USERNAME、MQTT_PASSWORD)){Serial.println( "MQTTサーバーへの接続に失敗しました。"); Serial.print( "エラー:"); Serial.print(mqttClient.lastError()); Serial.print( "、リターンコード:"); Serial.print(mqttClient.returnCode()); Serial.println(); if(mqttClient.lastError()==LWMQTT_CONNECTION_DENIED){Serial.println( "アクセスが拒否されました。ユーザー名とパスワードを確認してください。ユーザー名は 'DeviceName.AccountName'である必要があります。例:MySensor.MyHome"); } if(mqttClient.lastError()==-6){Serial.println( "ArduinoにTinmaous.comのSSL証明書がロードされていることを確認してください"); //ファームウェアアップデータスケッチをArduinoにロードします。 // [ツール]-> [WiFiファームウェアアップデータ]ユーティリティを使用します} //再試行されるまで10秒待ちます。 delay(10000); falseを返します。 } Serial.println( "Tinamous MQTTに接続しました!"); mqttClient.subscribe( "/ Tinamous / V1 / Status.To /" DEVICE_USERNAME); Serial.println( "subscribed to status.to topic。"); //こんにちはと言ってください。 publishTinamousStatus( "Hello!Usbスイッチが接続されました。@ me with help for help。"); was_connected =true; trueを返す;} // =================================================// mqtt処理のループ// =================================================void mqttLoop(){//とにかく呼び出し、すでに接続されている場合は何もしません。 connectToMqttServer(); mqttClient.loop(); } // =================================================// Tinamousタイムラインにステータスメッセージを公開する// =================================================void publishTinamousStatus(String message){Serial.println( "Status:" + message); mqttClient.publish( "/ Tinamous / V1 / Status"、メッセージ); } // =================================================//プレーンなjson形式を使用して測定値を公開する// =================================================void publishTinamousJsonMeasurements(String json){Serial.println( "Measurement:" + json); mqttClient.publish( "/ Tinamous / V1 / Measurements / Json"、json); } // =================================================// senmljson形式を使用して測定値を公開する// =================================================void publishTinamousSenMLMeasurements(String senml){Serial.println( "SenML Measurement:" + senml); mqttClient.publish( "/ Tinamous / V1 / Measurements / SenML"、senml); if(mqttClient.lastError()!=0){Serial.print( "MQTTエラー:"); Serial.print(mqttClient.lastError()); Serial.println(); } Serial.println( "Done。");} // =================================================// MQTTサーバーから受信したメッセージ// =================================================void messageReceived(String&topic、String&payload){Serial.println( "トピックに関するTinamousからのメッセージ:" +トピック+ "-" +ペイロード); // @で始まる場合は、このデバイスへのステータスメッセージです。 if(payload.startsWith( "@")){payload.toLowerCase(); if(handleStatusMessage(payload)){Serial.println( "@ meステータスメッセージが処理されました。");戻る; }} //期待されるコマンドを取得できなかったため、メッセージは私たちに届きました。 //ヘルプメッセージを公開します。 publishTinamousStatus( "こんにちは!メッセージがわかりませんでした。@助けてください。");} // =================================================//メッセージはステータス投稿(おそらくAlexa)でした// =================================================bool handleStatusMessage(Stringpayload){文字バッファ[25]; // for 1..4(0..3にマップ)for(int port =0; port  0){Serial.print( "ポートをオンにする"); Serial.println(port); setUsb(port、true); trueを返します。 } sprintf(buffer、 "ポートをオフにする-%01d"、ポート+ 1); if(payload.indexOf(buffer)> 0){Serial.print( "ポートをオフにする"); Serial.println(port); setUsb(port、false); trueを返します。 }} //ポートが指定されていません。すべてオンにします。 if(payload.indexOf( "turn on")> 0){allOn(); trueを返します。 } if(payload.indexOf( "turn off")> 0){allOff(); trueを返します。 } if(payload.indexOf( "help")> 0){Serial.println( "Sending help ..."); publishTinamousStatus( "Send a message to me(@" DEVICE_USERNAME ")then:" "'Turn on Port-1' to turn on usb port 1、" "'Turn off Port-1' to off usb port 1、" " 「オン」にするとすべてのUSBポートがオンになります」「「オフにすると」からすべてのUSBポートがオフになります」 trueを返します。 } Serial.print( "不明なステータスメッセージ:"); Serial.println(ペイロード); falseを返します;} 
UsbControl.ino Arduino
このファイルは、USB電源切り替えの反復を担当します。
 // ======================================// USBポート電源制御//および表示// ======================================// 1つ以上のポートがpoweredboolhasPoweredPorts(){for(int channel =0; channel  
WiFiClient.ino Arduino
このファイルはWiFi接続を扱います
 // ======================================/ / WiFi処理// ======================================#include "Secrets.h" char ssid [] =SECRET_SSID; char pass [] =SECRET_PASS; int status =WL_IDLE_STATUS; void setupWiFi(){Serial.println( "WiFiに接続しています..."); //シールドの存在を確認します:if(WiFi.status()==WL_NO_SHIELD){Serial.println( "WiFiシールドが存在しません"); //続行しない:while(true); } // WiFiネットワークへの接続を試みます:while(status!=WL_CONNECTED){Serial.print( "WPA SSIDに接続しようとしています:"); Serial.println(ssid); // WPA / WPA2ネットワークに接続します:status =WiFi.begin(ssid、pass); //接続を10秒待ちます:delay(10000); } //これで接続されたので、データを出力します。Serial.println( "ネットワークに接続しています"); printCurrentNet(); printWiFiData();} // --------------------------------------- // WiFivoid printWiFiData (){// WiFiシールドのIPアドレスを出力します:IPAddress ip =WiFi.localIP(); Serial.print( "IPアドレス:"); Serial.println(ip); Serial.println(ip); // MACアドレスを出力します:byte mac [6]; WiFi.macAddress(mac); Serial.print( "MACアドレス:"); Serial.print(mac [5]、HEX); Serial.print( ":"); Serial.print(mac [4]、HEX); Serial.print( ":"); Serial.print(mac [3]、HEX); Serial.print( ":"); Serial.print(mac [2]、HEX); Serial.print( ":"); Serial.print(mac [1]、HEX); Serial.print( ":"); Serial.println(mac [0]、HEX);} void printCurrentNet(){//接続しているネットワークのSSIDを出力します:Serial.print( "SSID:"); Serial.println(WiFi.SSID()); //接続しているルーターのMACアドレスを出力します:byte bssid [6]; WiFi.BSSID(bssid); Serial.print( "BSSID:"); Serial.print(bssid [5]、HEX); Serial.print( ":"); Serial.print(bssid [4]、HEX); Serial.print( ":"); Serial.print(bssid [3]、HEX); Serial.print( ":"); Serial.print(bssid [2]、HEX); Serial.print( ":"); Serial.print(bssid [1]、HEX); Serial.print( ":"); Serial.println(bssid [0]、HEX); //受信信号強度を出力します:long rssi =WiFi.RSSI(); Serial.print( "信号強度(RSSI):"); Serial.println(rssi); //暗号化タイプを出力します:byteencryption =WiFi.encryptionType(); Serial.print( "暗号化タイプ:"); Serial.println(暗号化、HEX); Serial.println();} String hostName ="www.google.com"; void doPing(){Serial.print( "Pinging"); Serial.print(hostName); Serial.print( ":"); int pingResult =WiFi.ping(hostName); if(pingResult> =0){Serial.print( "SUCCESS!RTT ="); Serial.print(pingResult); Serial.println( "ms"); } else {Serial.print( "FAILED!エラーコード:"); Serial.println(pingResult); }} void reconnectWiFi(){//接続が失われた場合にWiFiネットワークへの再接続を試行します:while(status!=WL_CONNECTED){Serial.print( "WPA SSIDに接続しようとしています:"); Serial.println(ssid); // WPA / WPA2ネットワークに接続します:status =WiFi.begin(ssid、pass); if(status ==WL_CONNECTED){Serial.print( "ネットワークに再接続しています"); printCurrentNet(); printWiFiData();戻る; } delay(5000); }} 
Secrets.h Arduino
これは独自の設定で更新する必要があります。
 #defineSECRET_SSID ""#defineSECRET_PASS "" / ***************** ******** TinamousMQTTセットアップ********************************* /#define MQTT_SERVER "<アカウント名> .tinamous.com "#define MQTT_SERVERPORT 8883 #define MQTT_USERNAME" <デバイスユーザー名>。<アカウント名> "#defineMQTT_PASSWORD"デバイスパスワード "#defineMQTT_CLIENT_ID"ランダムクライアントID "#define DEVICE_USERNAME" <デバイスユーザー名> "

カスタムパーツとエンクロージャー

接続方法がわからない場合は、これが最善の策です。 Arduino、端子台、追加のUSBマイクロ用の穴があります。これはすべてコネクタバージョンですが、一部のプリンタが苦労する可能性のあるテキストの最初のレイヤーは含まれていません。これは最も単純なバージョンであり、最も速く印刷できます。

回路図

これをOSHParkまたはDirtyPCBに送信して、独自のファイルを作成します。 arduinostandaloneusbswitch-4port_q16AoF01Aq.brd arduinostandaloneusbswitch-v2_Xd45dtjndI.sch
GitHubUSBパワースイッチャーリポジトリ
必要なもの:Arduino / StandAlone /フォルダーと4ポートバージョンhttps://github.com/ThingySticks/USBPowerSwitcher

製造プロセス

  1. 電源
  2. C# switch ステートメント
  3. バッテリー充電器は、より高い電力密度、より速い充電を提供します
  4. 停電センサー
  5. Raspberry Pi /ホログラムSMS制御AC電源スイッチ
  6. 風力
  7. パワーハンマーガイド
  8. 自動パワープレスとは?
  9. パワーチャックとは
  10. パワーチャッククイックガイド
  11. 水力発電を理解する