ネットワーク機器管理

API トークン

外部システム (勤怠 / CRM 等) からこの代理店のデータを操作するための長命トークンです。 Secret は発行直後の 1 度だけ表示されます — その場で安全に保管してください。

読み込み中...

📚 API 利用サンプル集

発行したトークンを使って実際にデータを取得・登録するパターン集です。 $RSU_TOKEN はお手元で発行した rsu_xxxxxxxx_xxxxx... 全体に置き換えてください。

共通の前提: ベース URL を $API、トークンを $RSU_TOKEN として以下のように環境変数化しておくと、サンプルがそのまま動きます。
export API='https://api.your-domain.jp/api/v1'
export RSU_TOKEN='rsu_a1B2c3D4_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
① 電気 / 水道 / ガス / 温水 — メーター種別ごとの月次収集

meter_type で絞り込めます (electricity / water / gas / hot_water)。 物件 1 棟ぶんの当月検針値を一括 CSV で落とすのが一番簡単です。

# 物件 12 の 2026-04 ぶん、電気だけ CSV
curl -s "$API/properties/12/meters/export.csv?month=2026-04&meter_type=electricity" \
  -H "Authorization: Bearer $RSU_TOKEN" \
  -o "elec_2026-04.csv"

# 水道
curl -s "$API/properties/12/meters/export.csv?month=2026-04&meter_type=water" \
  -H "Authorization: Bearer $RSU_TOKEN" -o "water_2026-04.csv"

# ガス
curl -s "$API/properties/12/meters/export.csv?month=2026-04&meter_type=gas" \
  -H "Authorization: Bearer $RSU_TOKEN" -o "gas_2026-04.csv"

プレビュー: elec_2026-04.csv

場所使用量料金
101号室2026-04142.5 kWh¥4,118
102号室2026-0498.2 kWh¥3,070
201号室2026-04175.8 kWh¥4,956
共用廊下2026-0422.1 kWh¥745

そのまま会計ソフト / Excel に取り込み可能

CSV ではなく JSON で扱いたい場合は GET /properties/{pid}/meters?meter_type=electricity で ID を引いてから GET /meters/{mid}/readings を回します。

② 個別収集 — 特定の世帯 / メーターだけ取る

「101号室の電気使用量」「特定メーターの過去 24 ヶ月」だけ欲しいケース。

# 世帯 88 のメーター一覧 (電気・水道・ガスすべて)
curl -s "$API/units/88/meters" \
  -H "Authorization: Bearer $RSU_TOKEN" | jq

# メーター 301 の検針履歴 (直近 24 ヶ月)
curl -s "$API/meters/301/readings?months=24" \
  -H "Authorization: Bearer $RSU_TOKEN" | jq '.items[] | {billing_month, usage, calculated_charge}'

# 世帯 88 の月次レポート CSV (期間指定)
curl -s "$API/units/88/meters/export.csv?from=2026-01&to=2026-04" \
  -H "Authorization: Bearer $RSU_TOKEN" -o "unit88.csv"

プレビュー: JSON レスポンス

{
  "meter_id": 301,
  "items": [
    {
      "billing_month": "2026-04-01",
      "reading_value": "13245.0",
      "previous_value": "13105.0",
      "usage":          "140.0",
      "unit_price":     "27.50",
      "basic_charge":   "880.00",
      "calculated_charge": "4730.00"
    },
    { "billing_month": "2026-03-01",
      "usage": "132.0",
      "calculated_charge": "4510.00" }
  ]
}

usagecalculated_charge はサーバ側で自動計算済

③ cron で毎月 1 日に自動収集 (Python + crontab)

毎月 1 日 02:00 に「先月ぶんの全物件・全メーター」を取得し、社内サーバの CSV に追記する例。 BI ツールの ETL バッチや会計連携の典型パターンです。

collect_meters.py

#!/usr/bin/env python3
"""毎月 1 日に動かす検針データ収集バッチ。"""
import os, csv, datetime as dt
from pathlib import Path
import requests

API   = os.environ["RSU_API"]            # https://api.your-domain.jp/api/v1
TOKEN = os.environ["RSU_TOKEN"]
HEAD  = {"Authorization": f"Bearer {TOKEN}"}
OUT   = Path("/var/data/meters")
OUT.mkdir(parents=True, exist_ok=True)

# 「先月」を YYYY-MM で
today  = dt.date.today()
first  = today.replace(day=1)
target = (first - dt.timedelta(days=1)).strftime("%Y-%m")

props = requests.get(f"{API}/properties/", headers=HEAD, timeout=30).json()["items"]

rows = []
for p in props:
    meters = requests.get(
        f"{API}/properties/{p['id']}/meters",
        headers=HEAD, timeout=30,
    ).json()["items"]
    for m in meters:
        hist = requests.get(
            f"{API}/meters/{m['id']}/readings",
            headers=HEAD, params={"months": 1}, timeout=30,
        ).json()["items"]
        for r in hist:
            if not r["billing_month"].startswith(target):
                continue
            rows.append({
                "property":   p["name"],
                "location":   m.get("location_label") or m.get("common_area_label"),
                "meter_type": m["meter_type"],
                "month":      r["billing_month"],
                "usage":      r["usage"],
                "charge":     r["calculated_charge"],
            })

out_file = OUT / f"meters_{target}.csv"
with out_file.open("w", newline="", encoding="utf-8-sig") as f:
    w = csv.DictWriter(f, fieldnames=list(rows[0].keys()) if rows else [])
    w.writeheader()
    w.writerows(rows)

print(f"✓ {len(rows)} rows -> {out_file}")

crontab -e

# 毎月 1 日 02:00 に先月ぶんを収集
0 2 1 * * RSU_API=https://api.your-domain.jp/api/v1 \
          RSU_TOKEN=rsu_xxxxxxxx_yyyyyyy... \
          /usr/bin/python3 /opt/rsu/collect_meters.py >> /var/log/rsu_collect.log 2>&1

プレビュー: 実行イメージ & ログ

02:00:01 ⏰ cron 起動
02:00:03 📋 物件一覧取得 (12 件)
02:00:08 🔌 メーター一覧取得 (47 件)
02:00:25 📊 検針履歴を順に取得
02:00:31 ✓ CSV 書込 完了
$ tail /var/log/rsu_collect.log
✓ 47 rows -> /var/data/meters/meters_2026-04.csv
セキュリティ: crontab に直接 token を書くと ps や envfile 流出時に漏洩する。 可能なら /etc/rsu.env (chmod 600) に置いて . /etc/rsu.env; で読み込む形を推奨。
④ 別サイトの入力フォームから検針値を POST する (write スコープ)

自社の社内ツールや別ドメインの巡回スタッフ用フォームから、検針値をこのシステムに書き戻すパターン。 スコープに write を含めて発行したトークンが必要です。

サーバ側 (PHP プロキシ) — token をブラウザに見せないため、必ずバックエンド経由で叩く

<?php
// /your-internal-site/api/post_reading.php
header('Content-Type: application/json');

$token = getenv('RSU_TOKEN');                 // .env から読む
$api   = 'https://api.your-domain.jp/api/v1';

$body = json_decode(file_get_contents('php://input'), true);
$meter_id = (int)($body['meter_id'] ?? 0);

$payload = [
  'reading_date'  => $body['reading_date'],   // "2026-04-25"
  'reading_value' => $body['reading_value'],  // 13245.0
  'billing_month' => $body['billing_month'],  // "2026-04-01"
  'note'          => $body['note'] ?? null,
];

$ch = curl_init("$api/meters/$meter_id/readings");
curl_setopt_array($ch, [
  CURLOPT_POST           => true,
  CURLOPT_POSTFIELDS     => json_encode($payload),
  CURLOPT_HTTPHEADER     => [
    'Authorization: Bearer ' . $token,
    'Content-Type: application/json',
  ],
  CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
http_response_code(curl_getinfo($ch, CURLINFO_HTTP_CODE));

フロント (HTML) — 巡回スタッフが手入力するフォーム

<form id="readingForm">
  <input name="meter_id"      placeholder="メーターID"   required>
  <input name="reading_date"  type="date"               required>
  <input name="reading_value" type="number" step="0.1"  required placeholder="現在値">
  <input name="billing_month" type="month"              required>
  <textarea name="note" placeholder="備考 (任意)"></textarea>
  <button type="submit">送信</button>
</form>
<script>
document.getElementById('readingForm').addEventListener('submit', async (e) => {
  e.preventDefault();
  const f = new FormData(e.target);
  const body = {
    meter_id:      Number(f.get('meter_id')),
    reading_date:  f.get('reading_date'),
    reading_value: Number(f.get('reading_value')),
    billing_month: f.get('billing_month') + '-01',  // YYYY-MM-DD に揃える
    note:          f.get('note') || null,
  };
  const res = await fetch('/api/post_reading.php', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(body),
  });
  const data = await res.json();
  alert(res.ok
    ? `✓ 登録しました (使用量 ${data.usage} ${data.unit_label || ''})`
    : `✗ エラー: ${data.detail || res.status}`);
});
</script>

プレビュー: 巡回スタッフ用入力画面

✓ 登録しました (使用量 140.0 kWh)
絶対やってはいけない: ブラウザの JavaScript に Bearer rsu_... を直接埋めること。 開発者ツールから丸見えになり、悪意あるユーザーにトークンを盗まれます。 必ず自社サーバ側で token を保持し、プロキシ経由で API を叩く構成にしてください。
⑤ メーター写真を送って OCR で検針値を読ませる

スマホアプリ等から写真を投げて自動で数値化したい場合。OCR は確定前のサジェスト値を返すだけなので、 続けて ④ の POST /meters/{mid}/readings で確定する 2 段構えになります。

# 写真 (multipart) を OCR に投げる
curl -s -X POST "$API/meters/301/readings/ocr" \
  -H "Authorization: Bearer $RSU_TOKEN" \
  -F "file=@./meter_photo.jpg" | jq

# 戻り値の例
# {
#   "ocr_value": 13245.0,
#   "confidence": 0.92,
#   "raw_text": "13245",
#   "photo_path": "meters/.../meter_photo.jpg"
# }

# 値を確認したうえで確定保存
curl -s -X POST "$API/meters/301/readings" \
  -H "Authorization: Bearer $RSU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "reading_date":  "2026-04-25",
    "billing_month": "2026-04-01",
    "reading_value": 13245.0,
    "photo_path":    "meters/.../meter_photo.jpg"
  }'

プレビュー: OCR の流れ

📷 1 3 2 4 5

meter_photo.jpg

13245.0
信頼度 92%

→ 確認後に POST /readings で確定

⑥ よく使うエンドポイント早見表
目的メソッドパス必要スコープ
物件一覧GET/properties/read
物件配下のメーターGET/properties/{pid}/meters?meter_type=electricityread
世帯のメーターGET/units/{uid}/metersread
メーター詳細GET/meters/{mid}read
検針履歴GET/meters/{mid}/readings?months=12read
物件 CSVGET/properties/{pid}/meters/export.csv?month=YYYY-MMread
世帯 CSVGET/units/{uid}/meters/export.csv?from=YYYY-MM&to=YYYY-MMread
OCR 写真投稿POST/meters/{mid}/readings/ocrwrite
検針値の登録POST/meters/{mid}/readingswrite
検針値の修正PATCH/readings/{rid}write
⑦ ハマりどころ TOP 3
  1. 401 Unauthorized — ヘッダ書式は Authorization: Bearer rsu_... (Bearer の後ろは半角スペース 1 つ。コロン不要)
  2. 403 / scope error — 検針値の 書き込み は トークンに write スコープが必須。発行時に外していると失敗する
  3. 404 で物件が見えない — トークンは発行した代理店のデータ専用。 テナント越境はできない仕様