2026年 05月 08日

スマートメータから100V 2系統それぞれの電流値を得る

スマートメータから瞬間消費電力を読むRubyのコードをT相・R相の電流値(100Vの2系統)をとるように修正した。

仕様上は0.1A単位でとれるみたいだけど、実際は1A単位にまるめられてしまうみたい。なので細かいことはわからない。

うちの分電盤の場合、図面を確認すると交互に配線 (L1N, L2N, L1N, L2N) されているようで、奇数番目がR相、偶数番目がT相になっているようだった。

何が嬉しいか? というと電流値を見ることで、ブレーカーを落としたりしなくてもT相系かR相系かまでは特定できる。

あと力率がある程度わかるかな。コイル負荷か抵抗負荷かぐらいの種類をある程度推測できる。

--- smartmeter.rb.orig	2026-05-08 08:43:13
+++ smartmeter.rb	2026-05-08 20:30:44
@@ -385,7 +385,7 @@
 				ECHONET_Lite::EOJ.new(0x05, 0xFF, 0x01),
 				ECHONET_Lite::EOJ.new(0x02, 0x88, 0x01),
 				0x62,
-				3,
+				4,
 				[
 					ECHONET_Lite::Property.new(
 						0xe7,
@@ -399,6 +399,11 @@
 					),
 					ECHONET_Lite::Property.new(
 						0xe0,
+						0x00,
+						""
+					),
+					ECHONET_Lite::Property.new(
+						0xe8, # 瞬時電力
 						0x00,
 						""
 					),
@@ -494,6 +499,8 @@
 				unit = nil
 				energy = nil
 				watts = nil
+				r_amp = nil
+				t_amp = nil
 				frame.edata.properties.each do |prop|
 					p prop
 					case
@@ -512,16 +519,26 @@
 						#0x0C:1000kWh
 						#0x0D:10000kWh
 						unit = UNIT_KW[prop.edt.unpack("C")[0]]
+
+					when prop.epc == 0xe8 && prop.pdc == 4
+						# 符号付き16bitビッグエンディアン2つ分をアンパック
+						r_raw, t_raw = prop.edt.unpack("s>2")
+						r_amp = r_raw / 10.0
+						t_amp = t_raw / 10.0
 					end
 				end
 
-				puts "%.1f kWh / %d W" % [energy * unit, watts]
+				puts "%.1f kWh / %d W (R: %.1f, T: %.1f)" % [energy * unit, watts, r_amp, t_amp]
 
 				body = ""
 				body << "# TYPE consumed_power GAUGE\n"
 				body << "consumed_power #{watts}\n"
 				body << "# TYPE consumed_energy COUNTER\n"
 				body << "consumed_energy #{energy * unit}\n"
+				body << "# TYPE consumed_current_r GAUGE\n"
+				body << "consumed_current_r #{r_amp}\n"
+				body << "# TYPE consumed_current_t GAUGE\n"
+				body << "consumed_current_t #{t_amp}\n"
 				
 				require 'net/https'