
私が欲しかったもの:
- jenkinsでタスクが完了したら、コンピューターに通知を表示し、さらに、arduinoに接続された物理ディスプレイに通知を表示します。
- 電話またはタブレットで開いて、コンピューターの音楽プレーヤーとラズベリーパイのビデオプレーヤーを制御できるインターフェース。
- arduinoにインストールされたセンサーから値を出力するために、ローカルネットワークの外部からアクセス可能なインターフェイス。
何が起こった:
- pythonでメソッド宣言を持つデバイスで実行されているクライアント。
- 「メソッド」を起動するためのRESTful API(右側の画像が表示されます);
- Webインターフェイスを備えた「コントロールパネル」。
- デバイス、メソッド、パネルを管理するためのサービス。
参照資料
サービス
-rdevic.esサーバーのソースコード
-rdevices-serverクライアントのソースコード
-rdevices-client中身は何ですか
rdclient-ユーザーのデバイス上で実行され、メソッドを宣言し、サーバーからの要求に応じてそれらを実行し、結果を送り返します。 Pythonで書かれています。 最初は、サーバーと通信するためにØMQを使用したかったのですが、サーバーをインストールするには、ユーザーがモジュールを作成する必要がありました。 したがって、通常のソケットが使用されます。
コネクタ -デーモンはAPIからリクエストを受信し、クライアントデバイスに送信し、結果を受信し、データベースに書き込み、通知デーモンを送信します。 Pythonと竜巻で書かれています。 Redisは、APIおよび通知サービスとの通信に使用されます。
RESTfull API-ユーザーから直接、または「コントロールパネル」を介してリクエストを受信し、それらをコネクタに渡します。 python、django、tastypieで書かれています。
プッシュ通知 -デーモンはコネクタからメソッドの完了の通知を受け取り、それらを「コントロールパネル」に渡します。 APIリクエストの数を減らすために作られました。 python、tornado、sockjsで書かれています。
ダッシュボード -デバイスを管理するためのWebベースのインターフェースは、ユーザーによって作成され、サーバーに保存されます。 マークアップには、スクリプト、JavaScript、CoffeeScript、またはIcedCoffeeScriptにhtmlが使用されます。
デバイスを作成する方法
作成するには、pipとgitをインストールしていない場合はインストールする必要があります。
そしてrdclientをインストールします:
pip install -e git://github.com/nvbn/rdevices-client.git

次に、サイトから
デバイスを作成し、 uuid
をコピーする必要
があります 。
デバイスを宣言するには、
device.py
などのpythonファイルを作成し、
Device
クラスから継承し、
method(result, [arg1], [arg2], ..)
でメソッドを修飾し、
Meta
uuid
を指定する必要があります。
パラメーターの注釈とメソッドの結果は必須ですが、情報提供のみを目的として使用されます。
単純なデバイスの例:
from rdclient import Device, method class MyDevice(Device): class Meta: uuid = 'DEVICE_UUID' @method('None') def print_123(self): print 123 @method('int', a='int', b='int') def sum_a_and_b(self, a, b): return a + b
これで、クライアントを起動できます。
rdclient device.py
その後、デバイスの簡単なドキュメントがデバイスページに表示されます。
一部のアプリケーションには、既製のミックスインがあります。

APIの使用
最初のステップは
、APIにアクセスするための
キーを作成する
ことです 。
すべてのリクエストはjsonまたはxmlである必要があり、これはヘッダーで明示的に指定する必要があります。次に例を示します。
Accept: application/json Content-type: application/json
メソッドを呼び出すには、POSTリクエストを送信する必要があります
rdevic.es/api/v1/device_method_call?username=USERNAME&api_key=API_KEY
rdevic.es/api/v1/device_method_call?username=USERNAME&api_key=API_KEY
とオブジェクトを含むボディ(jsonまたはxml):
{ method: METHOD_NAME, device: DEVICE_UUID, request: { arg1: 'arg1Value', arg2: 'arg2Value' } }
答えは次のとおりです。
{ method_id: METHOD_ID, request: { arg1: 'arg1Value', arg2: 'arg2Value' }, response: {}, state: 0, text_state: 'started', id: CALL_ID, resource_uri: '/api/v1/device_method_call/CALL_ID/', }
更新されたバージョンは、
resource_uri?username=USERNAME&api_key=API_KEY
でGETリクエストを行うことで取得できます。 メソッド呼び出しの結果は
response
フィールドにあります。
state
のメソッドの実行ステータス。 可能な値:
STATE_CREATED = 0 STATE_FINISHED = 1 STATE_ERROR = 2
リクエストは
curl
行うことができます:
curl "http://rdevic.es/api/v1/device_method_call/?username=nvbn&api_key=45932208bfb91d5ba8c9ab82137026c76ece69a8" -H "Accept: application/json" -H "Content-type: application/json" -X POST -d "{\"method\":\"arduino_write\",\"device\":\"bcc97caa-a09b-11e2-a15d-009c02975edf\",\"request\":{\"data\": \"clear\nwrite:Hello habr\!\n\"}}"
その実行結果は、最初の図には示されていません。

ダッシュボードの作成
まず
、サイトで作成してコード編集を開く必要
があります 。
スクリプトは、JavaScript(
type="javascript"
)、CoffeeScript(
type="coffeescript"
)、およびIcedCoffeeScript(
type="iced-coffeescript"
)で記述できます。
それらでダッシュボードAPIを使用できます。
dashboard.ready(callback)
-ダッシュボードの初期化。dashboard.getDevice(deviceId, callback)
- dashboard.getDevice(deviceId, callback)
デバイスを取得します。device.method(args, [callback])
-メソッドを呼び出し、コールバックで結果を取得します。 args
は、 :
を含むオブジェクトです:
。
パネルの例として
rdclient.mixins.RhythmboxMixin
コンソール(
rdclient.mixins.RhythmboxMixin
):
<script type='text/javascript'> dashboard.ready(function(){ dashboard.getDevice(DEVICE_ID, function(device){ $('#prev').click(function(){ device.rhythmbox_previous({}); }); $('#next').click(function(){ device.rhythmbox_next({}); }); $('#play-pause').click(function(){ device.rhythmbox_play_pause({}); }); }); }); </script> <button class='btn' id='prev'>Prev</button> <button class='btn' id='play-pause'>Play/pause</button> <button class='btn' id='next'>Next</button>
IcedCoffeeScriptを使用して、階段を回避できます。 これにより、スクリプト部分は次のようになります。
<script type='text/iced-coffeescript'> await dashboard.ready await dashboard.getDevice DEVICE_ID, defer device $('#prev').click => device.rhythmbox_previous {} $('#next').click => device.rhythmbox_next {} $('#play-pause').click => device.rhythmbox_play_pause {} </script>
今後の計画
これで、プロジェクトは基本的な機能のみを実装します。 まだ計画中:
- デバイス側のイベント。
- カスタム「パネル」を備えたgitリポジトリ。
- デバイスおよびメソッドへのアクセスが制限されているAPIキー。
PS記事内のすべてのキーとuuidは存在しません。