I am trying to calibrate my appliance’s power consumption by trapping the power metrics the sensor sends periodically. I can’t figure out how to trigger a rule only once per received status update. My sensor sends one of the following MQTT messages:
MQT: tele/power_monitor/SENSOR = {"Time":"2018-09-11T22:54:28","ENERGY":{"Total":0.000,"Yesterday":0.000,"Today":0.000,"Period":0,"Power":0,"Factor":0.00,"Voltage":0,"Current":0.000}}
MQT: stat/power_monitor/STATUS10 = {"StatusSNS":{"Time":"2018-09-11T22:54:35","ENERGY":{"Total":0.000,"Yesterday":0.000,"Today":0.000,"Power":0,"Factor":0.00,"Voltage":0,"Current":0.000}}}
The SENSOR message ENERGY payload contains 8 metrics while the STATUS10 payload contains only 7 metrics (no Period
).
My rule prints once for every member of the group (8 Items) for each metric in the message (64 for SENSOR, 56 for STATUS10). I want to log a set of metrics (8 or 7) only once per MQTT message. How can I avoid the repetition?
rule "Power Logging"
when
Member of gPowerMonitor received update
then
gPowerMonitor.members.forEach[o |
logInfo("power_log", "Power Logging - " + o.name + " = " + o.state.toString)
end
Items declarations:
Group:Switch:OR(OFF, ON) gPowerMonitor
Number power_monitor_total
"Power Monitor: Total [%.3f]" <none> (gPowerMonitor)
{ mqtt="
<[broker:tele/power_monitor/SENSOR:state:JSONPATH($.ENERGY.Total)],
<[broker:stat/power_monitor/STATUS10:state:JSONPATH($.StatusSNS.ENERGY.Total)]
" }
Number power_monitor_yesterday
"Power Monitor: Yesterday [%.3f]" <none> (gPowerMonitor)
{ mqtt="
<[broker:tele/power_monitor/SENSOR:state:JSONPATH($.ENERGY.Yesterday)],
<[broker:stat/power_monitor/STATUS10:state:JSONPATH($.StatusSNS.ENERGY.Yesterday)]
" }
Number power_monitor_today
"Power Monitor: Today [%.3f]" <none> (gPowerMonitor)
{ mqtt="
<[broker:tele/power_monitor/SENSOR:state:JSONPATH($.ENERGY.Today)],
<[broker:stat/power_monitor/STATUS10:state:JSONPATH($.StatusSNS.ENERGY.Today)]
" }
Number power_monitor_period
"Power Monitor: Period [%d]" <none> (gPowerMonitor)
{ mqtt="
<[broker:tele/power_monitor/SENSOR:state:JSONPATH($.ENERGY.Period)]
" }
Number power_monitor_power
"Power Monitor: Power [%d]" <none> (gPowerMonitor)
{ mqtt="
<[broker:tele/power_monitor/SENSOR:state:JSONPATH($.ENERGY.Power)],
<[broker:stat/power_monitor/STATUS10:state:JSONPATH($.StatusSNS.ENERGY.Power)]
" }
Number power_monitor_powerFactor
"Power Monitor: Power Factor [%.2f]" <none> (gPowerMonitor)
{ mqtt="
<[broker:tele/power_monitor/SENSOR:state:JSONPATH($.ENERGY.Factor)],
<[broker:stat/power_monitor/STATUS10:state:JSONPATH($.StatusSNS.ENERGY.Factor)]
" }
Number power_monitor_voltage
"Power Monitor: Voltage [%d]" <none> (gPowerMonitor)
{ mqtt="
<[broker:tele/power_monitor/SENSOR:state:JSONPATH($.ENERGY.Voltage)],
<[broker:stat/power_monitor/STATUS10:state:JSONPATH($.StatusSNS.ENERGY.Voltage)]
" }
Number power_monitor_current
"Power Monitor: Current [%.3f]" <none> (gPowerMonitor)
{ mqtt="
<[broker:tele/power_monitor/SENSOR:state:JSONPATH($.ENERGY.Current)],
<[broker:stat/power_monitor/STATUS10:state:JSONPATH($.StatusSNS.ENERGY.Current)]
" }
Thank you in advance for your advice.
Regards.
Mike