FlowはM5Stack公式のM5Stackシリーズ用プログラミング環境です。特徴としては、Blocklyと呼ばれるブロック・プログラミング環境を使ってプログラムを記述し、対応するMicroPythonコードをインターネット経由、もしくはローカルのシリアル通信経由でデバイスにダウンロードすることができます。ブロック・プログラミング環境を使わない場合、MicroPythonのコードを直接記述することもできます。Flowのファームウェアに制御用のライブラリが含まれており、専用のブロックが用意されているため、モジュールを使うプログラムをBlocklyで比較的簡潔に記述することができます。Flowから使おうとする場合、専用のブロックが無いため、Blocklyで用意されているブロックを組み合わせて自作モジュールの制御処理を記述する必要があります。この場合、モジュールの内容にもよりますが、大体の場合はBlocklyで記述するのには向かない複雑な処理が必要となるため、Blockly単体で記述するのは現実的ではありません。3つの項目が表示されます。Makerが別のタブで開きます。この画面でカスタム・ブロックの内容を記述していきます。以下はWi-SUNモジュール用のカスタム・ブロックを開いた状態の画面です。カスタム・ブロックを作るグループ名の設定まずは、カスタム・ブロックのグループ名を決めてNamespaceに入力します。Flowに読み込んだときに属するグループの名前になります。Wi-SUN用カスタム・ブロックではグループ名をWi-SUNにしています。ボタンを押すと、色選択画面が表示されます。ここで設定した色がBlockly上で表示されるカスタム・ブロックの色となります。リストから選択します。ブロックの名前と種類の設定Nameにカスタム・ブロックの名前を入力します。表示され...ません。Typeでブロックの種類をValueもしくはExecuteから選びます。Valueブロックは、関数呼び出しのように実行した結果の値をもつブロックです。センサーの値を読み取るブロックなどが該当します。ように左側に別のブロックをつなげられる形になります。逆に結果の値をもたない場合はExecuteブロックにします。ように、前後の処理とつなげられる形になります。ボタンを押して、ブロックのパラメータを追加します。パラメータはnameとtypeの属性を持っています。nameは画面上に表示されるパラメータの名前として使われます。ブロックに対応するMicroPythonコード内でパラメータを参照するときにも用います。typeはパラメータの種類を指定します。4つのパラメータの種類があります。Labelパラメータブロックの画面上に任意の文字列を表示するために使用します。最初のパラメータはLabelパラメータとして、ブロックの名前を入れておくと良いです。Update"でtypeがLabelのパラメータを持っています。ちなみに、Wi-SUNのstartブロックではそのことに気付く前に他のパラメータを入力してしまったため、ブロックの名前が表示されていません。現状、パラメータの並び替えはサポートされていないので、気をつけましょう。(厳密にはブロック定義のJSONを直接編集すれば変えることは可能ですが面倒です)Variableパラメータ他のブロックの値を入力するパラメータを定義します。このパラメータに対応する行は右側が欠けた状態となり、他のValueブロックを接続してその結果をパラメータの値とすることができます。Numberパラメータ数値を入力できるパラメータを定義します。現状デフォルト値は設定できないようです。Stringパラメータ任意の文字列を入力できるパラメータを定義します。Numberと同様デフォルト値の設定は出来ないようです。CodeにMicroPythonで記述します。書くことにより、nameがparamのパラメータの内容を参照できます。展開されるので、文字列として扱いたい場合は、"${param}"のようにダブル・クォーテーションで括ります。TypeがExecuteのstartブロックのコードを以下に示します。${rx}や${tx}がパラメータを埋め込んでいる箇所です。${log_debug}や${use_i2c}はStringパラメータですが、わざとダブル・クォーテーションで囲まずに参照しています。Blockly上でlog_debugやuse_i2cにTrueやFalseを直接記述して使うことを想定しています。${route_b_password})wisun_start()TypeがValueのvaluesブロックのコードを以下に示します。Valueの場合、記述したコードが、値を受け取るブロックのコードに埋め込まれるようになりますので、Pythonのコードが式であることが必要です。wisun_instance.values()カスタム・ブロックの保存カスタム・ブロックの定義が終わったら、画面右下のDownloadボタンを押して、カスタム・ブロックの定義をファイルに保存します。(namespaceの値).m5bという名前のファイルがダウンロードされます。選んで、保存したカスタム・ブロックのファイルを開きます。(Beta)グループの下に、namespaceで指定した名前のグループが追加されます。グループを選ぶと、作成したカスタム・ブロックが表示されますので、あとは標準のブロックと同じようにブロックを組み立ててプログラムを作成します。Makerで、ブロックに対応するMicroPythonコードはあまり長くすると、スクリプト実行前にメモリ不足のエラーになったり、保存先の領域が不足して動かなくなります。Managerから対象のM5Stack/StickCにダウンロードするという方法で対処可能です。Flowで使えないので、Wi-SUNカスタム・ブロックではダウンロード済みのスクリプトをimportして使うようになっています。Managerでダウンロードしたスクリプトをimportできるようにしています。wisunでwisunモジュールをインポートしています。バイトコード・コンパイルはMicroPythonをビルドするとできあがるmpy-crossツールが必要ですが、ビルドするの面倒な人向けに、アップロードしたスクリプトをバイトコードコンパイルするWebアプリを用意しといたので、よろしければどうぞ。以降、作ったカスタム・ブロックを紹介します。HATを制御するためのカスタム・ブロックです。ローム製Wi-SUNモジュールBP35A1を制御して、家庭のスマートメーターと通信して、現在の消費電力や、積算の消費電力量を取得することが出来ます。HATのケースがオレンジ色なのが印象に残っていたからのような気がします。