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で、家の電力の見える化を作ってみよう。