This is now available in build 26242. The config has changed slightly, so review the final documentation for correct usage and examples.
Global Moderators
Forum wide moderators
Posts
-
DynamicGroupController and attributes -
Reactor (Multi-System/Multi-Hub) Announcements -
Rule condition shows TRUE in UI but Rule never transitions to SET — survives full restartA couple of things here...
- Editing the rule will cause re-evaluation, which is likely why you have repeated RESETs in the history with no SETs between.
- As hard as I try, and I keep looking, finding, and fixing, the UI can get out of sync with the running engine/service, so always hard-refresh when the UI isn't making sense.
- If a Rule has been edited, especially multiple times, and it's not performing as expected, reset the Rule. There's button for that:
Even restarting Reactor doesn't do what this button does. - Beyond that, it would also be handy to see the top part of the screen shot that has been cut off (the Triggers group heading and stuff above it).
-
Ooops - Deleted Reactor Ex Machina IINo backup? Restore from backup (recommended) is the best way, of course.
Beyond that, recreating it should not be difficult, but there have been key changes since that original post. Some detail beyond "did not work" is necessary here. Show your work and tell us about your environment.
-
DynamicGroupController and attributesThis sounds really complete. I’ll give it a try when available.
-
DynamicGroupController and attributesHere are the docs for what I have built thus far. Comments and suggestions on functionality appreciated!
Custom Attributes
In addition to setting the primary attribute for a dynamic group, users may add custom attributes to the group. The values of these custom attributes are typically derived from attribute values of the group's members. For example, a group of temperature sensors can have a calculated average of the readings of all the sensors.
Custom attributes are defined under the
calculate:object in a group's configuration. Here's a possible configuration for the example given above as a group with IDtemp_sensors. Theselectconfiguration simply selects all entities having thetemperature_sensorcapability, for illustration purposes (in practice, we'd probably want toinclude_entitysome specific entities for this purpose).temp_sensors: select: - include_capability: temperature_sensor calculate: - attribute: 'temperature_sensor.value' source: attribute: temperature_sensor.value # Where to get data values op: averageThis is the most basic form of custom attribute configuration. The
calculateobject is an array of configuration objects. Theattributekey is required for each array element and specifies the attribute to be defined and calculated on the group. Thesourcesubstructure tells DynamicGroupController what attributes on the member entities should be used for calculation. Any member entity that does not have the specified source attribute, or for which the attribute's value is null, is simply ignored. Theoptells DGC how to reduce (or aggregate) the multiple values from the member entities down to a single value. Pre-defined operations foropare defined below:opType Description average,avg,meannumeric The average (arithmetic mean) of the available values. mediannumeric The median of the available values (i.e. the middle value of the values when sorted). min,maxnumeric The minimum or maximum of the available values. sumnumeric The sum of the available values. countnumeric Count of non-null values. and,nandboolean Logical AND of available values. All values must be boolean true for the result to be true. If nandis used, the result is inverted (i.e. false when all values are true)or,norboolean Logical OR of available values. If any value is true, the result is true. norinverts the results (false when any value is true)xor,xnorboolean Logical XOR. Since more than two values may be considered, this operation is only true when exactly one of the values is true. If multiple are true, or all are false, the result is false. The xnorinverts the result.firststring Given a string or an array of strings to match in a valuekey (at the same level asop), this operation returns the first matching value. That is, each element ofvalueis checked to see if it matches asourcevalue from any of the group's member entities; if so, that element/value is the result; if not, the test moves on to the next element. If no match, null results.!!! note "null Member Attribute Values"
All of the above operations ignore null values from thesource, unless otherwise indicated.There may be circumstances where the
sourcevalues require some pre-conditioning or filtering. This is enabled by thevalue_exprsubkey undersource. The result of the expression is the value that will be added to the array of values foroporreduce_expr. For example, in our temperature sensor group, some of the sensors return temperatures in Celsius, and others in Fahrenheit. We can usevalue_exprto convert the values to a consistent unit, so that the resulting reduction operation yields a consistent value in that same unit:temp_sensors: select: - include_capability: temperature_sensor calculate: - attribute: 'temperature_sensor.value' source: attribute: temperature_sensor.value # Where to get data values # Convert Celsius temperatures to Fahrenheight value_expr: > local units = entity.attributes.temperature_sensor.units; local d = ( units === 'C' || units === '°C' ) ? value * 1.8 + 32 : value; ( d <= 0 || indexOf( ['C','F','°C','°F'], units ) < 0 ) ? null : d op: average prec: 2 # two decimal digit max resultStep by step, the
value_exprabove first fetches the member entity's temperature units into a local variable calledunits. Since theattributeundersourceistemperature_sensor.value, the context variablevaluewill contain the raw value from that attribute. The second line of the expression then checks if the units are Celsius, and if so, converts them to Fahrenheit (if units are not Celsius, it just takes the currentvalue) and assigns it to a local variabled. Finally (third line of the expression), if the value is in range and the units are known, the value ofdis returned, otherwise null. As stated above, most of the predefined operations ignore null values in their computation. Sovalue_exprcan function both to condition values and to filter them.The
preckey allows you to define the number of decimal digits precision for the result value; the result is rounded to comply. For example, a calculated value of 3.14159265 withprec: 4results in 3.1416.If none of the pre-defined operations addresses the need, the
op:key can be replaced with an expression defined byreduce_expr:. The result value of the expression will be the value assigned to the custom attribute. The context forreduce_exprincludes the following variables:grouprefers to the group entity being defined;membersis an array of canonical IDs of the member entities at the time of evaluation (which may change in a truly dynamic group); andvaluesis an array of the member values (as derived fromsource).temp_sensors: select: - include_capability: temperature_sensor calculate: - attribute: 'temperature_sensor.value' source: attribute: temperature_sensor.value # Where to get data values # Compute harmonic mean (not predefined) using expression (trivialized for illustration) reduce_expr: > local s = 0; each v of values: do s = s + (1.0 / v) done; len(values) / s prec: 2 # two decimal digit max resultFinally, custom attributes that should have fixed values can be defined by simply supplying
value:undersource:, like this:- attribute: 'temperature_sensor.units' source: value: '°F'Make sure the data type of the
valueconfigured matches the expected type of attribute being defined. -
DynamicGroupController and attributes@therealdb said in DynamicGroupController and attributes:
Number 2 seems more logical. Right now all we have are empty values.
I have this working, but I have had a busy week and then wife's birthday this weekend, so it might be another couple of days before I turn it loose. Just letting you know I haven't forgotten.
-
Reactor (Multi-System/Multi-Hub) AnnouncementsReactor build 26221
SECURITY! - BARE-METAL USERS: It is always recommended that you update package dependencies whenever installing Reactor updates. After unpacking the Reactor archive, go into the
reactordirectory (whereapp.jslives) and runnpm run depsto update package dependencies. This is particularly important to address security updates for many packages.- DynamicGroupController: Fix an issue where a
filter_expression-controlled group would miss an attribute update. - Engine/Reactions: The log level for the result of Group and While action predicates (i.e. the conditions) has been raised to INFO (4) from DEBUG0 (5). This may help users more easily identify logic bugs in their actions without the need to change the Engine log level (the Engine is dauntingly verbose even at DEBUG0 level).
- HassController: Bless HA to 2026.7.4
- DynamicGroupController: Fix an issue where a
-
[Solved] DynamicGroupController updating members issueYes, I found this as well. I have a fix that I've been running/testing, not yet into a build. I will get it done before the end of the weekend.
-
DynamicGroupController and attributesNumber 2 seems more logical. Right now all we have are empty values.
Maybe some way to do easy things like
- avg/min/max of values
- if any matches a value (ie cool), the value is cool
- and/or/xor for binary values
Similar to other options, to avoid code for simpler scenarios. Thanks.