Rule for devices battery level ?
-
How can I make this rule re-trigger ?
Say I don't immediate go replace the battery on the device mentioned, can I have the rule run the alerts / notifications each day or week until I have done it and changed the batteries ?
Also can the alerts also state what the battery level percentage actually is ?
Thanks
-
How can I make this rule re-trigger ?
Say I don't immediate go replace the battery on the device mentioned, can I have the rule run the alerts / notifications each day or week until I have done it and changed the batteries ?
Also can the alerts also state what the battery level percentage actually is ?
Thanks
@cw-kid said in Rule for devices battery level ?:
How can I make this rule re-trigger ?
Wrap the condition in a group and put the group in "pulse" output mode with the timing you want.
@cw-kid said in Rule for devices battery level ?:
Also can the alerts also state what the battery level percentage actually is ?
Yes, but I'm going to leave it as an exercise for the reader. Level of difficulty: moderate.
-
How can I make this rule re-trigger ?
Say I don't immediate go replace the battery on the device mentioned, can I have the rule run the alerts / notifications each day or week until I have done it and changed the batteries ?
Also can the alerts also state what the battery level percentage actually is ?
Thanks
-
Thanks Ian that works, my Telegram text message now has the number% at the end of the message now.
However this messes up the Google Home TTS announcement sent via node-red, if I have a "%" in the expression. So I had to change it to the word "percent" instead and now the TTS sounds correct when spoken.
join( each id in battery_low_list: getEntity(id).name + " " + "at" + " " + int(getEntity(id).attributes.battery_power.level * 100) + " percent", ', ')
-
@cw-kid said in Rule for devices battery level ?:
How can I make this rule re-trigger ?
Wrap the condition in a group and put the group in "pulse" output mode with the timing you want.
@cw-kid said in Rule for devices battery level ?:
Also can the alerts also state what the battery level percentage actually is ?
Yes, but I'm going to leave it as an exercise for the reader. Level of difficulty: moderate.
@toggledbits said in Rule for devices battery level ?:
Wrap the condition in a group and put the group in "pulse" output mode with the timing you want.
Like this?
Seems to be working and the alerts are repeating every 60 seconds now. I will just set this to 24hrs I think.
-
@cw-kid One of my to-do list tasks for expressions is to be able to create a list of devices that match a test. Until that comes, you can just build your own array of battery-operated devices like this (lets call this
battery_device_list
) :Then, you can reduce that list to all of the devices that have battery < 10%:
That leaves you with an array of the entities that have low battery. Use another expression to convert that into a comma-separated list of entity names:
Your rule just checks to see if that
battery_low_names
(a string now) expression is not empty, and runs whatever notifications you want to run if it is not. You can include thebattery_low_names
variable in the text of your email or other notification, too.@toggledbits said in Rule for devices battery level ?:
One of my to-do list tasks for expressions is to be able to create a list of devices that match a test.
This is very useful, is it released yet or still on the to-do list?
-
Still on the to-do list, but I think I'm close to figuring out what I want it to do. These things get harder with time: the more people use them, the more etched in stone they become, so making a "first guess" and completely changing things later isn't really something I want to do a lot of. If I can get something good on the first try, that's the way...
Here's what I'm thinking...
First, the
matchEntities()
function would quickly narrow down the set, in a manner similar to the filters on the Entities page and the Entity Picker:living_room_sensors = matchEntities( { controller: 'vera', capability: [ 'binary_sensor', 'value_sensor'' ], group: 'Living Room' } )
This would return an array of entities. From here, you could use an
each
statement to further filter any deep refinements. This expression would take the above array of sensors in the Living Room and pick out those that are battery powered and have battery level under 50%:low_battery_living_room = each e in living_room_sensors: e.attributes.battery_power?.level <= 0.5 ? e : null
I'm liking this approach because the function could do the bulk reduction of potential hundreds of entities down to a manageable list, and then the final filtering of the list can be done with expressions for maximum flexibility.
Any thoughts about that?
-
Still on the to-do list, but I think I'm close to figuring out what I want it to do. These things get harder with time: the more people use them, the more etched in stone they become, so making a "first guess" and completely changing things later isn't really something I want to do a lot of. If I can get something good on the first try, that's the way...
Here's what I'm thinking...
First, the
matchEntities()
function would quickly narrow down the set, in a manner similar to the filters on the Entities page and the Entity Picker:living_room_sensors = matchEntities( { controller: 'vera', capability: [ 'binary_sensor', 'value_sensor'' ], group: 'Living Room' } )
This would return an array of entities. From here, you could use an
each
statement to further filter any deep refinements. This expression would take the above array of sensors in the Living Room and pick out those that are battery powered and have battery level under 50%:low_battery_living_room = each e in living_room_sensors: e.attributes.battery_power?.level <= 0.5 ? e : null
I'm liking this approach because the function could do the bulk reduction of potential hundreds of entities down to a manageable list, and then the final filtering of the list can be done with expressions for maximum flexibility.
Any thoughts about that?
@toggledbits That would do it for me, is the
matchEntities()
function already available in Expressions? I get no error but no matter what I do the Expression always returns an empty array.
I'd expect this to contain at least something:matchEntities( { controller: 'vera', capability: 'humidity_sensor' } )
-
No, it's not yet available.
-
No, it's not yet available.
@toggledbits Thanks, the new
matchEntities()
is brilliant. Now we can have dynamic arrays of devices. -
@toggledbits Thanks, the new
matchEntities()
is brilliant. Now we can have dynamic arrays of devices.@crille said in Rule for devices battery level ?:
Now we can have dynamic arrays of devices.
Tell me about that...
-
@crille said in Rule for devices battery level ?:
Now we can have dynamic arrays of devices.
Tell me about that...
@toggledbits Inspired by this topic I created a rule with similar expressions to monitor/notify
x_ezlo_device.reachable
for all my Ezlo devices. Instead of managing a static array, like thebattery_device_list
in this topic, the expressionmatchEntities( {capability: 'x_ezlo_device'} )
generates a list of devices that is dynamically updated if devices are added or removed from the controller. -
No, it's not yet available.
@toggledbits I'm testing this new function, but somehow it does not show all the devices I'm expecting it to show. See examples below
Array is empty, although it should contain one device:
Strange, as device 216 definitely has capability "x_vera_device"
-
One of the issues I see in
matchEntities()
as it currently works is that it returns an array of entity objects with attribute values, but it does not update that array when any of the returned entities' attributes or other values changes. So it's certain, then, that the attributes will go stale in the result array.For the next build, I will change the definition of this function to return canonical entity IDs only, rather than entity objects, so you will have to use
getEntity()
in youreach
over the results, as you did with yourtest_array
example, and this will ensure that you are always looking at the latest attributes. You can test this theory now by modifying youreach
ford_failure_list
to usegetEntity( id.canonical_id )
. -
One of the issues I see in
matchEntities()
as it currently works is that it returns an array of entity objects with attribute values, but it does not update that array when any of the returned entities' attributes or other values changes. So it's certain, then, that the attributes will go stale in the result array.For the next build, I will change the definition of this function to return canonical entity IDs only, rather than entity objects, so you will have to use
getEntity()
in youreach
over the results, as you did with yourtest_array
example, and this will ensure that you are always looking at the latest attributes. You can test this theory now by modifying youreach
ford_failure_list
to usegetEntity( id.canonical_id )
.@toggledbits did what you suggested, but situation didn't really change, array is still empty:
-
Can you show the entity detail for device 216 please?
-
@toggledbits did what you suggested, but situation didn't really change, array is still empty:
@tunnus I had some issues as well. I got an empty array and when tried getEntity() I got some "Type Error". Was sure I was doing something wrong but I restarted Reactor and copied the same expression to a new one and suddenly it worked.
@toggledbits I also noticed the array isn't updated when entity changed so I pulse the trigger every minute to update it. Will change to getEntity() for next update. -
Can you show the entity detail for device 216 please?
@toggledbits here you go:
dimming.level=0 dimming.step=null power_switch.state=false x_vera_device.configured=false x_vera_device.device_number=216 x_vera_device.device_type="urn:schemas-upnp-org:device:DimmableLight:1" x_vera_device.failed=true x_vera_device.mapped_by="*;device_type=/urn:schemas-upnp-org:device:DimmableLight:/" x_vera_device.mapped_class="generic_dimmer" x_vera_device.parent_device=1 x_vera_device.room_id="1" x_vera_energy.amps=null x_vera_energy.day_kwh=null x_vera_energy.kwh="6.7000" x_vera_energy.life_kwh=null x_vera_energy.month_kwh=null x_vera_energy.power_factor=null x_vera_energy.volts=null x_vera_energy.watts="" x_vera_energy.week_kwh=null x_vera_energy.year_kwh=null x_vera_svc_cd_jackson_com_DataMine1.errorStatus="true" x_vera_svc_micasaverde_com_EnergyMetering1.ActualUsage="1" x_vera_svc_micasaverde_com_EnergyMetering1.KWH="6.7000" x_vera_svc_micasaverde_com_EnergyMetering1.KWHReading="1597268716" x_vera_svc_micasaverde_com_EnergyMetering1.Log="0,0,0,1633073400,1" x_vera_svc_micasaverde_com_EnergyMetering1.Watts="" x_vera_svc_micasaverde_com_HaDevice1.AutoConfigure="0" x_vera_svc_micasaverde_com_HaDevice1.CommFailure="1" x_vera_svc_micasaverde_com_HaDevice1.CommFailureAlarm="1628783888,1" x_vera_svc_micasaverde_com_HaDevice1.CommFailureTime="1628780288" x_vera_svc_micasaverde_com_HaDevice1.Configured="0" x_vera_svc_micasaverde_com_HaDevice1.FirstConfigured="1526668133" x_vera_svc_micasaverde_com_HaDevice1.LastTimeCheck="1605041801" x_vera_svc_micasaverde_com_HaDevice1.LastTimeOffset="2" x_vera_svc_micasaverde_com_HaDevice1.LastUpdate="0" x_vera_svc_micasaverde_com_HaDevice1.ModeSetting="1:;2:;3:;4:" x_vera_svc_micasaverde_com_HaDevice1.PollRatings="0.20" x_vera_svc_micasaverde_com_ZWaveDevice1.AgiInfo="X" x_vera_svc_micasaverde_com_ZWaveDevice1.AlarmType="0x4,0x8," x_vera_svc_micasaverde_com_ZWaveDevice1.AlarmVersion="0,2" x_vera_svc_micasaverde_com_ZWaveDevice1.AssociationGroups="1" x_vera_svc_micasaverde_com_ZWaveDevice1.AssociationNum="4" x_vera_svc_micasaverde_com_ZWaveDevice1.Capabilities="211,156,1,4,17,1,L,R,B,RS,|37S,38S:3,39S,43S,44S,50S:3,89S,90B,94,112S,113S:4,114,115S,122S,129S,133S,134,152," x_vera_svc_micasaverde_com_ZWaveDevice1.ConfiguredAssoc="" x_vera_svc_micasaverde_com_ZWaveDevice1.ConfiguredVariable="80-Status notification type,1d,3,90- Enable or Disable energy reporting (0-1),1d,1,91-Minimum change in wattage for a REPORT (0-60000),2d,5,92-Minimum change in wattage percent for a REPORT,1d,5,120-Configure external switch mode for S1(0-3),1d,1,125,1d,1,128-Current working mode (0-2),1d,1,129-Dimming principle (0-2),1d,1,130-Dimmer load type connected(0-3),1d,1,131-Minimum brightness level,1d,20,132-Maximum brightness level,1d,90,249,1d,0" x_vera_svc_micasaverde_com_ZWaveDevice1.FirmwareInfo="134,111,41841" x_vera_svc_micasaverde_com_ZWaveDevice1.LastArr="" x_vera_svc_micasaverde_com_ZWaveDevice1.LastNnu="" x_vera_svc_micasaverde_com_ZWaveDevice1.LastReset="1526668110" x_vera_svc_micasaverde_com_ZWaveDevice1.LastRouteUpdate="1597229741" x_vera_svc_micasaverde_com_ZWaveDevice1.ManufacturerInfo="134,3,111" x_vera_svc_micasaverde_com_ZWaveDevice1.MeterScale="5" x_vera_svc_micasaverde_com_ZWaveDevice1.MeterType="1" x_vera_svc_micasaverde_com_ZWaveDevice1.NodeInfo="25S,26S,27S,2bS,2cS,32S,59S,5aB,5e,70S,71S,72,73S,7aS,81S,85S,86,98," x_vera_svc_micasaverde_com_ZWaveDevice1.PlusInfo="1,5,0,6,0,6,0" x_vera_svc_micasaverde_com_ZWaveDevice1.PollNoReply="476" x_vera_svc_micasaverde_com_ZWaveDevice1.PollOk="37823" x_vera_svc_micasaverde_com_ZWaveDevice1.PollSettings="120" x_vera_svc_micasaverde_com_ZWaveDevice1.PollTxFail="1" x_vera_svc_micasaverde_com_ZWaveDevice1.SecurityFailed="0" x_vera_svc_micasaverde_com_ZWaveDevice1.SubscribedAlarms=",0x4,0x8," x_vera_svc_micasaverde_com_ZWaveDevice1.SwitchMlSettings="2,0" x_vera_svc_micasaverde_com_ZWaveDevice1.VariablesGet="80,3,90,1,91,5,92,5,120,1,125,1,128,1,129,1,130,1,131,20,132,90,249,0," x_vera_svc_micasaverde_com_ZWaveDevice1.VariablesSet="80-Status notification type,1d,3,90- Enable or Disable energy reporting (0-1),1d,1,91-Minimum change in wattage for a REPORT (0-60000),2d,5,92-Minimum change in wattage percent for a REPORT,1d,5,120-Configure external switch mode for S1(0-3),1d,1,125,1d,1,128-Current working mode (0-2),1d,1,129-Dimming principle (0-2),1d,1,130-Dimmer load type connected(0-3),1d,1,131-Minimum brightness level,1d,20,132-Maximum brightness level,1d,90,249,1d,0" x_vera_svc_micasaverde_com_ZWaveDevice1.VersionInfo="3,4,54,2,0" x_vera_svc_micasaverde_com_ZWaveNetwork1.ConsecutivePollFails="0" x_vera_svc_micasaverde_com_ZWaveNetwork1.LastPollSuccess="1597268720" x_vera_svc_upnp_org_Dimming1.LoadLevelLast="100" x_vera_svc_upnp_org_Dimming1.LoadLevelStatus="0" x_vera_svc_upnp_org_Dimming1.LoadLevelTarget="100" x_vera_svc_upnp_org_Dimming1.TurnOnBeforeDim="0" x_vera_svc_upnp_org_SwitchPower1.Status="0" zwave_device.capabilities="211,156,1,4,17,1,L,R,B,RS,|37S,38S:3,39S,43S,44S,50S:3,89S,90B,94,112S,113S:4,114,115S,122S,129S,133S,134,152," zwave_device.failed=true zwave_device.manufacturer_info="134,3,111" zwave_device.node_id=53 zwave_device.version_info="3,4,54,2,0" Capabilities: dimming, power_switch, toggle, x_vera_device, x_vera_energy, x_vera_svc_cd_jackson_com_DataMine1, x_vera_svc_micasaverde_com_Color1, x_vera_svc_micasaverde_com_EnergyMetering1, x_vera_svc_micasaverde_com_HaDevice1, x_vera_svc_micasaverde_com_ZWaveDevice1, x_vera_svc_micasaverde_com_ZWaveNetwork1, x_vera_svc_upnp_org_Dimming1, x_vera_svc_upnp_org_SwitchPower1, zwave_device Actions: dimming.down, dimming.set, dimming.up, power_switch.off, power_switch.on, power_switch.set, toggle.toggle, x_vera_device.set_variable, x_vera_energy.resetkwh, x_vera_svc_micasaverde_com_Color1.SetColor, x_vera_svc_micasaverde_com_Color1.SetColorRGB, x_vera_svc_micasaverde_com_Color1.SetColorTemp, x_vera_svc_micasaverde_com_EnergyMetering1.ResetKWH, x_vera_svc_micasaverde_com_HaDevice1.AllowPairing, x_vera_svc_micasaverde_com_HaDevice1.Poll, x_vera_svc_micasaverde_com_HaDevice1.Reconfigure, x_vera_svc_micasaverde_com_HaDevice1.Remove, x_vera_svc_micasaverde_com_HaDevice1.SetPollFrequency, x_vera_svc_micasaverde_com_HaDevice1.StressTest, x_vera_svc_micasaverde_com_HaDevice1.ToggleState, x_vera_svc_micasaverde_com_ZWaveNetwork1.AddNodes, x_vera_svc_micasaverde_com_ZWaveNetwork1.BackupDongle, x_vera_svc_micasaverde_com_ZWaveNetwork1.DownloadNetwork, x_vera_svc_micasaverde_com_ZWaveNetwork1.HealNetwork, x_vera_svc_micasaverde_com_ZWaveNetwork1.PollAllNodes, x_vera_svc_micasaverde_com_ZWaveNetwork1.PutByte, x_vera_svc_micasaverde_com_ZWaveNetwork1.ReconfigureAllNodes, x_vera_svc_micasaverde_com_ZWaveNetwork1.RemoveNodes, x_vera_svc_micasaverde_com_ZWaveNetwork1.SendData, x_vera_svc_micasaverde_com_ZWaveNetwork1.SetPolling, x_vera_svc_micasaverde_com_ZWaveNetwork1.SimulateIncomingData, x_vera_svc_micasaverde_com_ZWaveNetwork1.UpdateNeighbors, x_vera_svc_micasaverde_com_ZWaveNetwork1.UpdateNetwork, x_vera_svc_upnp_org_Dimming1.PauseRamp, x_vera_svc_upnp_org_Dimming1.ResumeRamp, x_vera_svc_upnp_org_Dimming1.SetLoadLevelTarget, x_vera_svc_upnp_org_Dimming1.SetOnEffect, x_vera_svc_upnp_org_Dimming1.SetOnEffectLevel, x_vera_svc_upnp_org_Dimming1.SetRampRate, x_vera_svc_upnp_org_Dimming1.SetStepDelta, x_vera_svc_upnp_org_Dimming1.StartRampDown, x_vera_svc_upnp_org_Dimming1.StartRampToLevel, x_vera_svc_upnp_org_Dimming1.StartRampUp, x_vera_svc_upnp_org_Dimming1.StepDown, x_vera_svc_upnp_org_Dimming1.StepUp, x_vera_svc_upnp_org_Dimming1.StopRamp, x_vera_svc_upnp_org_SwitchPower1.SetTarget, zwave_device.poll, zwave_device.reconfigure, zwave_device.refresh, zwave_device.reset_meters, zwave_device.set_config