asopi tech
asopi techIndie Developer

Asopitech With · スマホHEMS

Nature Remo E2 with Alopex Skulk

Nature Remo E2は、太陽光発電や蓄電池のある家の発電量、消費電力、売電と買電をスマホでリアルタイムに見せるスマホHEMSです。これをAlopex Skulkで作り直すと…?

更新: 2026/10/12

どんなサービスか

Nature Remo E2は、スマートメーターや太陽光発電、蓄電池とつながり、家の発電量と消費電力、売電と買電をスマホで見せるスマホHEMSです。蓄電池やエコキュートの操作もアプリから行えます。扱うデータは、消費電力と売電の時系列です。

データの置き場所

  • Skulkの時系列:消費電力、買電、売電を、家と項目のタグを付けてSkulkに追記します。
  • 時間で区切る集計:日、週、月ごとの合計と最大を、時間で区切る集計で出します。
  • PromQL:昨日や先月との比較のグラフを、PromQLで問い合わせます。

スマートメーターから値を読んで書き込むのは、アプリのコードです。

配置の形

Skulkを、家の中の機器とアプリに組み込みます。家の電力の記録は家の中にたまり、たくさんの家の記録は、同じエンジンのSkulkのクラスタで受けられます。

Alopex Skulkが合う理由

電力の見える化は、時系列を期間ごとに比べることが中心です。Skulkは、取り込み、時間の集計、PromQLを機器の中で行い、家の中だけで電力の記録を扱えます。

コードで見る

消費電力をLine ProtocolでSkulkに取り込み、読み出す中心だけを取り出したコードです(Rust)。

use alopex_skulk::ingest::line_protocol::LineProtocolDecoder;
use alopex_skulk::ingest::{IngestLimits, Ingestor};
use alopex_skulk::model::FieldValue;
use alopex_skulk::store::recovery::{RecoveryConfig, RecoveryStore};

fn main() -> alopex_skulk::Result<()> {
    std::fs::create_dir_all("remo-data").unwrap();
    let store = RecoveryStore::open("remo-data", RecoveryConfig::default())?;
    let limits = IngestLimits::default();
    let mut ingestor = Ingestor::new(store, limits);

    // 消費電力(W)を、家のタグ付きで取り込む(measurement,tag field timestamp[ns])
    let base: i64 = 7_200_000_000_000;
    let now = base + 300_000_000_000;
    for (i, watts) in [320.0, 450.0, 1200.0].iter().enumerate() {
        let ts = base + (i as i64) * 60_000_000_000;
        let line = format!("power,home=main watts={watts} {ts}");
        let batch = LineProtocolDecoder::new(limits).decode(line.as_bytes(), now)?;
        assert_eq!(ingestor.ingest(batch, now)?.accepted_count(), 1);
    }
    ingestor.sink_mut().flush_all()?;

    // 取り込んだ消費電力を読み出す
    for row in &ingestor.sink().read_measurement("power")? {
        if let Some(FieldValue::Float(watts)) = row.row().field("watts") {
            println!("t={} watts={watts}", row.row().timestamp());
        }
    }
    Ok(())
}

取り込みは ingest() が返った時点でWALに永続します。日・週・月の合計や前日・前月との比較は、Skulkの時間で区切る集計/PromQLで出します。

時間の集計とPromQLを機器の中で動かせるAlopex Skulkで、家の電力の見える化を作ってみよう。

関連リンク