最近,我一直在改造自己家的电路。在之前装修时,没有考虑到智能家居方面。导致后期对设备的升级较为困难,想着,如何在保证原有线路改变幅度不大的情况下,尽可能的实现智能化呢?

本期,以自己家中的插线板为例,谈谈自己的改造思路。给其接入智能模块 实现对电量的实时统计和控制。

设备介绍

本期,我们用到的设备为Shelly 2PM Gen4。支持Zigbee、蓝牙、Wi-Fi等连接方式。可以控制电机使用场景(如电动窗帘、卷帘门等)和两路电路的控制。设备小巧,可以完美地放入开关和插座后面。支持脚本、HTTPS、MQTTS、等协议,可玩性更高。

线路连接说明:

01双继电器模式

  • • O1、O2 互相独立,控制 2 路负载:可以是 2 盏灯、或者灯 + 插座、灯 + 排风扇等任意两路 220V 设备。• S1 控制 O1,S2 控制 O2。(两根线接入物理开关。从而控制灯)
    注意:模块 LN 必须拿到零火供电。
    02电机模式
    O1、O2合并给一台双向交流电机用。O1 = 电机上行,O2 = 电机下行。S1、S2 变成:上行按键、下行按键。注意,不能接大功率电机。

实物连接

实物连接

快速上手

完成设备连接后,登录APP添加设备。完成后,我们便可以看到设备的详细信息了。

接下来,我们来探究更多好玩的玩法。

接入HA

设备接入HomeAssistant的方法很简单,添加设备IP地址后,自动加入设备。(建议在路由器中绑定设备IP)

卡片展示

接下来,我们接入HA中的能源板块。

配置MQTT

接下来,我们配置MQTT,在APP或者直接访问设备IP,配置MQTT

完成后,订阅设备主题,便可以收到数据信息了。

当前数据比较凌乱,我们可以在MQTT后端新建规则,对数据进行清洗。

清洗后的数据如下:

{"voltage":220.3,"ts":1789187880.0,"sw":0,"ret_aenergy_wh":0.0,"pf":0.8,"freq":50.02,"current":0.451,"aprtpower":74.1,"apower":74.1,"aenergy_wh":297.749}

SQL代码 (查询1号时,修改0为1即可)

SELECT
  payload.params.ts AS ts,
  0 AS sw,
  CASE WHEN is_null(payload.params.'switch:0'.voltage) THEN 'null' ELSE payload.params.'switch:0'.voltage END AS voltage,
  payload.params.'switch:0'.current AS current,
  payload.params.'switch:0'.apower AS apower,
  CASE WHEN is_null(payload.params.'switch:0'.aprtpower) THEN 'null' ELSE payload.params.'switch:0'.aprtpower END AS aprtpower,
  CASE WHEN is_null(payload.params.'switch:0'.pf) THEN 'null' ELSE payload.params.'switch:0'.pf END AS pf,
  CASE WHEN is_null(payload.params.'switch:0'.freq) THEN 'null' ELSE payload.params.'switch:0'.freq END AS freq,
  CASE WHEN is_null(payload.params.'switch:0'.aenergy.total) THEN 'null' ELSE payload.params.'switch:0'.aenergy.total END AS aenergy_wh,
  CASE WHEN is_null(payload.params.'switch:0'.ret_aenergy.total) THEN 'null' ELSE payload.params.'switch:0'.ret_aenergy.total END AS ret_aenergy_wh
FROM "shelly2pmg4-acebe6f47ec8/events/rpc"
WHERE is_null(payload.params.'switch:0'.apower) = false

将MQTT数据接入HA 效果如下:

自定义脚本

如果你没有HA等平台,但也想需要更多拓展功能,不妨试试APP中的自定义脚步功能。
这里,以总消耗的电费信息为例,创建脚本,示例代码如下

// ===================== 配置区(按需修改) =====================
let CONFIG = {
  switchId: 0,        // 监测哪一路: 0 或 1
  tariff: 0.6,        // 电价, 单位 元/kWh
  intervalMs: 30000   // 刷新间隔, 毫秒
};

let VC_COST_ID = 200;   // Number: 累计电费
let VC_STATUS_ID = 201; // Text:   实时状态
let VC_GROUP_ID = 202;  // Group:  电费群组
// ============================================================

function r2(x) { return Math.round(x * 100) / 100; }
function r3(x) { return Math.round(x * 1000) / 1000; }

// 串行初始化: 一个 RPC 完成再发下一个,防止并发超限
function init(onDone) {
  // 1) 累计电费 Number
  Shelly.call("Virtual.Add", { type: "number", id: VC_COST_ID }, function () {
    Shelly.call("Number.SetConfig", {
      id: VC_COST_ID,
      config: {
        name: "累计电费",
        min: 0,
        meta: { ui: { view: "field", unit: "¥", step: 0.01 } }
      }
    }, function () {
      // 2) 实时状态 Text
      Shelly.call("Virtual.Add", { type: "text", id: VC_STATUS_ID }, function () {
        Shelly.call("Text.SetConfig", {
          id: VC_STATUS_ID,
          config: { name: "实时状态", meta: { ui: { view: "label" } } }
        }, function () {
          // 3) 电费 Group,并把上面两个装进去
          Shelly.call("Virtual.Add", { type: "group", id: VC_GROUP_ID }, function () {
            Shelly.call("Group.SetConfig", {
              id: VC_GROUP_ID,
              config: { name: "电费" }
            }, function () {
              Shelly.call("Group.Set", {
                id: VC_GROUP_ID,
                value: ["number:" + VC_COST_ID, "text:" + VC_STATUS_ID]
              }, function () {
                if (onDone) onDone();
              });
            });
          });
        });
      });
    });
  });
}

// 读数据并刷新卡片
function update() {
  let st = Shelly.getComponentStatus("switch", CONFIG.switchId);
  if (!st) { print("switch status not ready"); return; }

  let power = st.apower || 0;
  let totalWh = (st.aenergy && st.aenergy.total) ? st.aenergy.total : 0;
  let kwh = totalWh / 1000;
  let cost = kwh * CONFIG.tariff;

  Shelly.call("Number.Set", { id: VC_COST_ID, value: r2(cost) });
  let line = "实时 " + power + " W · 累计 " + r3(kwh) + " kWh";
  Shelly.call("Text.Set", { id: VC_STATUS_ID, value: line });
  print(line + " · 电费 ¥" + r2(cost));
}

// 启动: 串行建组件 → 刷一次 → 定时刷新
init(function () {
  update();
  Timer.set(CONFIG.intervalMs, true, update);
});

效果如下:

接入小爱

没有什么事,是动动嘴巴干不了的。即使不能直接接入米家生态,我们可以通过巴法云插件将设备接入到米家。

总结

一个小小的继电器模块,可以玩出与众不同的花样,将物联网深深的融入到我们的生活。在生活中,你想通过物联网实现什么?不妨说出你的精彩想法!

更多精彩文章 欢迎关注我们


本文首发于微信公众号,原文链接:普通插座如何秒变智能插座?

最后修改:2026 年 09 月 21 日
可怜可怜吧!正在沿街乞讨~