SWPF ノーコード仕組み解説
1. SWPFの全体像(まずここだけ)
SWPF では、デバイスから届くデータ(温度・湿度など)を、次の3つで「ノーコード処理」します。
| 要素 | 何をする?(初心者向け) |
|---|---|
| Input(受信データ) | HTTP / MQTT で届いた値。例:TEMP=28.4, HUMID=62 など。 |
| Profile(プロファイル) | 「このデバイスはどのテンプレを使う?」や「有効/無効」など、運用設定(まとめ役)。 |
| Template(テンプレート) | 実際の処理内容。rule_json(条件)と template_json(実行内容・式)を持つ。 |
処理イメージ(図)
flowchart LR A[IoTデバイス] -->|HTTP / MQTT| B[SWPF 受信] B --> C[Context 正規化] C --> D[Profile 読み込み] D --> E[rule_json 判定
どのTemplateを実行するか] E --> F[template_json 実行
EXPRESSION / COMMAND / etc] F --> G[結果を保存
INPUT.RESULTS / TRACE]
※ Mermaid が表示されない場合でも、流れが読めるように文章でも説明します。
2. Template / Profile / Common の役割
Template エンティティ(処理の中身)
- rule_json:どの条件で、どの処理(テンプレID)を選ぶか(分岐)
- template_json:選ばれた後に実行する内容(メール送信・式計算・Webhook など)
Profile エンティティ(運用設定・まとめ役)
- デバイスやユーザーに紐づけて「どの Template を使うか」を管理
- テンプレを複数まとめる/有効・無効などを切り替える
- 初心者はまず「1デバイス = 1プロファイル」くらいでOK
Common(共通機能:あれば自動利用)
SWPF は、共通側に「params_map」や「evaluator」があればそれを使い、無ければモジュール内フォールバックで動きます。
つまり、設定(JSON)を変えるだけで、実行ロジックの共通化・再利用がしやすい設計です。
3. 受信データ(HTTP / MQTT)例
HTTP(例:POST JSON)
{
"device_code": "dev-001",
"at": "2026-01-03T06:00:00+09:00",
"TEMP": 28.4,
"HUMID": 62,
"CO2": 820
}
受信後、SWPF はこのデータを Context(実行用の入れ物)に正規化します。
MQTT(例:payload JSON)
{
"device_code": "dev-001",
"TEMP": 28.4,
"HUMID": 62,
"battery": 87
}
MQTT の場合も最終的には同じ Context 形式へ揃えます(HTTP/MQTTの違いは入口だけ)。
まずは キー名を統一することが成功の近道です。
4. ノーコード処理の流れ(ステップ解説)
- 受信:HTTP または MQTT でデータが届く
- 正規化:Context に整形(例:input.raws / input.values など)
- Profile 決定:device_code などから Profile を選ぶ(または直指定)
- rule_json 評価:条件を判定し、実行する Template(または Template 内の分岐先)を決める
- template_json 実行:EXPRESSION(式)や COMMAND(メール送信等)を実行
- 結果保存:INPUT.RESULTS に結果を入れて次の処理で参照できるようにする(デバッグ用に TRACE)
そのため「前の結果を次が使う」仕組み(INPUT.RESULTS)が重要になります。
5. rule_json(条件分岐)の書き方
rule_json は「条件 → 選択結果(template_id など)」を決める JSON です。
最小イメージ
{
"cases": [
{ "if": "TEMP >= 30", "then": "HOT" },
{ "if": "TEMP <= 10", "then": "COLD" }
],
"default": "DEFAULT"
}
- cases:上から順に評価します(最初に当たった then を採用)
- if:条件式(例:TEMP >= 30)
- then:採用するテンプレID(またはアクション名)
- default:どれにも当たらない場合
「受信データに存在しないキー」を参照すると、意図しない結果になります(後述の「つまずき」参照)。
6. template_json(処理テンプレ)の書き方
template_json は、rule_json で選ばれた後に「実行する中身」です。代表例:
| type | 用途 | 例 |
|---|---|---|
| COMMAND | メール送信、Webhook、SwitchBot制御など “実行” | mail_send / http_post / mqtt_publish … |
| EXPRESSION | 計算(式)して結果を作る | 不快指数、平均、しきい値判定用のスコア |
| DATA(例) | テンプレ内の定数・メッセージなど | 通知メッセージ、メール件名の差し替え |
テンプレ定義例(差し替えパターン)
{
"DEFAULT": {
"mailinfo": {
"to": "admin@sincerew.biz",
"subject": "みまもり通知"
},
"message": "データを受信しました"
},
"HOT": {
"mailinfo": {
"subject": "【警告】高温です"
},
"message": "温度が高すぎます"
},
"DISCOMFORT_INDEX": {
"type": "EXPRESSION",
"label": "Discomfort Index",
"expr": "0.81 * TEMP + 0.01 * HUMID * (0.99 * TEMP - 14.3) + 46.3",
"result_key": "discomfort_index"
}
}
上の例では、DEFAULT/HOT は「メール情報や文言」を持ち、DISCOMFORT_INDEX は「式(EXPRESSION)」を持っています。
実際の実行は、選ばれたテンプレと、実行プラグイン(mail_send 等)の組み合わせで行われます。
7. EXPRESSION(式)の書き方・例
EXPRESSION は「受信値(TEMP 等)を使って計算し、結果を result_key に保存する」ための型です。
基本フォーマット
{
"type": "EXPRESSION",
"label": "名前(任意)",
"expr": "計算式(文字列)",
"result_key": "保存キー"
}
使えること(初心者向け)
- 四則演算:+ - * /
- カッコ:( )
- 数値:整数・小数
- 変数:受信データのキー(TEMP / HUMID など)
例:TEMP で送っているのに expr 側が temp だと参照できません。
例:不快指数
{
"type": "EXPRESSION",
"label": "Discomfort Index",
"expr": "0.81 * TEMP + 0.01 * HUMID * (0.99 * TEMP - 14.3) + 46.3",
"result_key": "discomfort_index"
}
8. INPUT.RESULTS / TRACE の考え方
INPUT.RESULTS(次の処理へ渡す “最新の結果”)
例:DISCOMFORT_INDEX を計算したら、input.results.discomfort_index に保存して、次の executor が参照できます。
「結果を次の処理で使う」ための入れ物です。
TRACE(デバッグ用 “履歴”)
どのテンプレが選ばれ、どんな式が評価され、何が返ったかを残します。
本番は RESULTS だけ見れば動きますが、問題が起きたら TRACE が役に立ちます。
初心者でも混乱が減り、デバッグもしやすい構成になります。
9. 具体例:温湿度 → 不快指数 → メール通知
Step A:受信(例)
{
"device_code": "dev-001",
"TEMP": 28.4,
"HUMID": 62
}
Step B:まず式で不快指数を作る(EXPRESSION)
{
"DISCOMFORT_INDEX": {
"type": "EXPRESSION",
"label": "Discomfort Index",
"expr": "0.81 * TEMP + 0.01 * HUMID * (0.99 * TEMP - 14.3) + 46.3",
"result_key": "discomfort_index"
}
}
Step C:不快指数の結果で分岐(rule_json の例)
{
"cases": [
{ "if": "discomfort_index >= 80", "then": "ALERT_MAIL" },
{ "if": "discomfort_index >= 75", "then": "WARN_MAIL" }
],
"default": "OK_MAIL"
}
※ ここで discomfort_index を参照できるのは、Step B で result_key に保存したからです。
(実装によって参照場所が input.results.discomfort_index になる場合もあります。SWPF側の参照ルールに合わせてください)
Step D:メールテンプレ(template_json の例)
{
"ALERT_MAIL": {
"type": "COMMAND",
"command": "mail_send",
"mailinfo": {
"to": "admin@sincerew.biz",
"subject": "【警告】危険な暑さです"
},
"message": "不快指数が高いです。換気や冷却を検討してください。"
},
"WARN_MAIL": {
"type": "COMMAND",
"command": "mail_send",
"mailinfo": {
"to": "admin@sincerew.biz",
"subject": "【注意】暑さ注意"
},
"message": "不快指数が上がっています。状況を確認してください。"
},
"OK_MAIL": {
"type": "COMMAND",
"command": "mail_send",
"mailinfo": {
"to": "admin@sincerew.biz",
"subject": "みまもり通知"
},
"message": "受信しました(正常範囲)。"
}
}
10. よくあるつまずき(初心者チェック)
✅ 1) 受信データのキー名と、expr / if の変数名が一致していない
TEMP を送っているのに expr が temp になっている等。まずはキー名を統一。
✅ 2) 数値が文字列になっている("28.4" など)
数値として演算できない場合があります。可能なら送信側で数値に。
✅ 3) default が無い / 分岐が想定外
cases に当たらないと何も起きないことがあります。default は入れておくと安全。
✅ 4) 結果を次が参照できない(RESULTS の保存先)
“どこに保存されるか” は実装方針(INPUT.RESULTS を key→obj に正規化する等)で変わります。
迷ったら TRACE を確認し、「結果がどのキーに入ったか」を見てください。
そこが揃えば、メールやWebhookのような “実行” は後から足しても比較的安全です。
© SWPF / Sincere Will Platform Framework
当サイトまたはIoTカスタムモジュール、開発支援に関するお問い合わせはこちらのメールフォームからお気軽にお問い合わせください。