@toggledbits I understand that you do not perform testing on Mac computers but thought I'd share the following with you in case something can be done.
I started seeing these errors with version 24302. I thought that upgrading to 24343 would have fixed the issue but unfortunately not. I either have to close the browser or clear the cache for the errors to stop popping-up but they slowly come back.
I see these errors on the following browsers:
Safari 16.6.1 on macOS Big Sur Safari 18.1.1 on MacOS Sonoma DuckDuckGo 1.118.0 on macOS Big Sur and Sonoma Firefox 133.0.3 on macOS Big Sur Chrome 131.0.6778 on macOS Big SurHere are the errors
Safari while creating/updating an expression
@http://192.168.0.13:8111/reactor/en-ca/lib/js/reaction-editor.js:543:91 makeExprMenu@http://192.168.0.13:8111/reactor/en-ca/lib/js/reaction-editor.js:537:28 @http://192.168.0.13:8111/reactor/en-ca/lib/js/reaction-editor.js:92:64 @http://192.168.0.13:8111/reactor/en-ca/lib/js/reaction-editor.js:89:68 each@http://192.168.0.13:8111/node_modules/jquery/dist/jquery.min.js:2:3133 @http://192.168.0.13:8111/reactor/en-ca/lib/js/reaction-editor.js:89:35 @http://192.168.0.13:8111/client/MessageBus.js:98:44 forEach@[native code] @http://192.168.0.13:8111/client/MessageBus.js:95:54 @http://192.168.0.13:8111/client/MessageBus.js:106:44 @http://192.168.0.13:8111/client/Observable.js:78:28 signalModified@http://192.168.0.13:8111/reactor/en-ca/lib/js/ee.js:146:21 signalModified@http://192.168.0.13:8111/reactor/en-ca/lib/js/expression-editor.js:40:29 reindexExpressions@http://192.168.0.13:8111/reactor/en-ca/lib/js/expression-editor.js:71:32 @http://192.168.0.13:8111/reactor/en-ca/lib/js/expression-editor.js:608:40 dispatch@http://192.168.0.13:8111/node_modules/jquery/dist/jquery.min.js:2:40040DuckDuckGo while clicking on status
http://192.168.0.13:8111/reactor/en-ca/lib/js/reactor-ui-status.js:789:44 asyncFunctionResume@[native code] saveGridLayout@[native code] dispatchEvent@[native code] _triggerEvent@http://192.168.0.13:8111/node_modules/gridstack/dist/gridstack.js:1401:30 _triggerAddEvent@http://192.168.0.13:8111/node_modules/gridstack/dist/gridstack.js:1383:31 makeWidget@http://192.168.0.13:8111/node_modules/gridstack/dist/gridstack.js:968:30 addWidget@http://192.168.0.13:8111/node_modules/gridstack/dist/gridstack.js:388:24 placeWidgetAdder@http://192.168.0.13:8111/reactor/en-ca/lib/js/reactor-ui-status.js:183:44Firefox while updating a rule
@http://192.168.0.13:8111/reactor/en-ca/lib/js/reaction-editor.js:543:91 makeExprMenu@http://192.168.0.13:8111/reactor/en-ca/lib/js/reaction-editor.js:537:28 @http://192.168.0.13:8111/reactor/en-ca/lib/js/reaction-editor.js:92:64 @http://192.168.0.13:8111/reactor/en-ca/lib/js/reaction-editor.js:89:68 each@http://192.168.0.13:8111/node_modules/jquery/dist/jquery.min.js:2:3133 @http://192.168.0.13:8111/reactor/en-ca/lib/js/reaction-editor.js:89:35 @http://192.168.0.13:8111/client/MessageBus.js:98:44 forEach@[native code] @http://192.168.0.13:8111/client/MessageBus.js:95:54 @http://192.168.0.13:8111/client/MessageBus.js:106:44 @http://192.168.0.13:8111/client/Observable.js:78:28 notifySaved@http://192.168.0.13:8111/reactor/en-ca/lib/js/ee.js:82:21 notifySaved@http://192.168.0.13:8111/reactor/en-ca/lib/js/expression-editor.js:47:26 @http://192.168.0.13:8111/reactor/en-ca/lib/js/reactor-ui-rules.js:1460:39 forEach@[native code] @http://192.168.0.13:8111/reactor/en-ca/lib/js/reactor-ui-rules.js:1459:58Chrome while creating/updating an expression
TypeError: Cannot read properties of undefined (reading 'getEditor') at RuleEditor.makeExprMenu (http://192.168.0.13:8111/reactor/en-ca/lib/js/rule-editor.js:1788:86) at Object.handler (http://192.168.0.13:8111/reactor/en-ca/lib/js/rule-editor.js:2174:54) at http://192.168.0.13:8111/client/MessageBus.js:98:44 at Array.forEach (<anonymous>) at MessageBus._sendToBus (http://192.168.0.13:8111/client/MessageBus.js:95:54) at MessageBus.send (http://192.168.0.13:8111/client/MessageBus.js:106:44) at ExpressionEditor.publish (http://192.168.0.13:8111/client/Observable.js:78:28) at ExpressionEditor.signalModified (http://192.168.0.13:8111/reactor/en-ca/lib/js/ee.js:146:14) at ExpressionEditor.signalModified (http://192.168.0.13:8111/reactor/en-ca/lib/js/expression-editor.js:40:15) at ExpressionEditor.reindexExpressions (http://192.168.0.13:8111/reactor/en-ca/lib/js/expression-editor.js:71:18) ``Thanks to @toggledbits for adding a custom CSS. I've started doing a darker Reactor style.
Here's the file: https://gist.github.com/dbochicchio/825098ac13b7f8cac22012eae37ff7ce
A couple of things are still too bright and I'll eventually catch-up. Just place it under your /config directory, naming the file as customstyles.css. Hard refresh your browser.
Hi
Having to rebuild my Linux Debian box as the SSD failed. And I have forgotten exactly what I did the first time to get it all setup.
I have Debian 12 up and running on the new SSD, I only have console no Desktop GUI.
I am trying to do the bare metal install for MSR. However I am not sure if I am meant to install nodejs whlist logged in as the root user or as the none root user with my name ?
I used putty and connected via SSH and logged in as root and I installed nodejs but I think this was wrong as when logged in as my user name and I do a node -v command it says node is not installed or doesn't show any version number anyway.
But when logged in as root and I do a node -v command it does show me its installed and displays the version number. maybe its a path issue for my username and he can't see node is installed?
So now I am thinking I should of installed node whilst logged in as my user name and not as the root user.
This is how I installed nodejs as whilst logged in as root
ac7bf6c3-23ad-46fc-8ada-44af6704e63e-image.png
Thanks in advance.
Build 21228 has been released. Docker images available from DockerHub as usual, and bare-metal packages here.
Home Assistant up to version 2021.8.6 supported; the online version of the manual will now state the current supported versions; Fix an error in OWMWeatherController that could cause it to stop updating; Unify the approach to entity filtering on all hub interface classes (controllers); this works for device entities only; it may be extended to other entities later; Improve error detail in messages for EzloController during auth phase; Add isRuleSet() and isRuleEnabled() functions to expressions extensions; Implement set action for lock and passage capabilities (makes them more easily scriptable in some cases); Fix a place in the UI where 24-hour time was not being displayed.As the title says, here's my OpenAI Controller for Reactor:
OpenAI Controller per Reactor. Contribute to dbochicchio/reactor-openai development by creating an account on GitHub.
It supports both OpenAI and Azure OpenAI endpoints. You'll need keys/endpoints, according to each service.
The controller supports multiple models, and each one could be mapped as an entity.
It's quite easy to use, and responses can be stored in variables, for easy access. Or sent to another action (Text To Speech, another endpoint, etc).
9013ae50-fd68-42a2-87c3-97479132e465-image.png
80a88eec-7c89-464a-8196-690b4b72d044-image.png
Have fun with LLM into your scenes!
In Home Assistant I have an integration that if I add entities to it, I will get the following error in MSR as certain entity values I'm using in expressions are null for a moment. This is more or less cosmetic issue and happens very rarely as I rarely modify that integration on the hass side.
Screenshot 2024-11-28 at 22.20.41.png
And the expression is
Screenshot 2024-11-28 at 22.38.19.png
Could I "wrap" hass-entity shown above somewhat differently to prevent this error from happening? Using build 24302.
Hello
I am trying to set up Multi System Reactor to automate routines across multiple smart home devices & platforms (e.g., Home Assistant, SmartThings, and Hubitat). While I have successfully linked the systems; I am facing issues with:
-Delays in triggering actions on secondary devices.
-Inconsistent execution of complex logic conditions.
-Synchronization of states between devices when one system updates.
Is there a recommended way to optimize performance & confirm seamless state sharing across systems?
I have checked https://smarthome.community/category/22/multi-system-reactor-msbi guide for reference but still need advice.
Any tips on debugging or log analysis to pinpoint where the issue arises would also be appreciated.
Thank you !
I've managed to use MSR UI on iOS devices to some degree*, so that although UI elements (e.g. rule sets) are not visible in portrait mode, you've seen them in landscape. Now with recents builds (24302) this does not work anymore, elements (rule sets, entities) are not anymore visible in landscape mode.
Does anyone have similar experiences? Using iOS 18 and Safari/Chrome browser.
( *Drag & drop of rule conditions have never worked on a mobile)
@toggledbits Since I have upgraded ZWaveJSController to 24293 from 24257 I am seeing entries related to registering action set_volume, but action is not defined by the capability 143 every time I restart Reactor.
The Siren seems to be doing what it is supposed to do. The volume levels are fine. Should I worry about it?
Reactor version 24302
ZWaveJSController version 24293
Z-Wave JS UI version 9.27.4
zwave-js version 14.3.4
I have the following ACL defined:
groups: admin: users: - admin applications: true api_acls: # This ACL allows users in the "admin" group to access the API - url: "/api" group: admin allow: true log: true # This ACL allows anyone/thing to access the /api/v1/alive API endpoint - url: "/api/v1/alive" allow: trueAnd I have authenticated to MSR as "admin" user. However, I'm getting "access denied" when trying to access http://*******:8111/api/v1/log
So what I'm missing, is my ACL incorrectly defined?
Using build 24302 on Docker.
Hi
I have just connected a bunch of EzloPi controllers to MSR to import some ESP based devices etc.
They all seemed to have worked and imported in to MSR apart from I have one missing device. It is a Digital Gas Sensor device.
This is how that device looks in the Ezlo API.
Devices Info:
_id: "10696001" deviceTypeId: "ezlopi" parentDeviceId: "10696000" category: "level_sensor" subcategory: "" gatewayId: "457a5069" batteryPowered: false name: "Gas Sensor Digital" type: "sensor" reachable: true persistent: true serviceNotification: false armed: false roomId: "" security: "no" ready: true status: "idle" parentRoom: true protectConfig: "default"Items Info:
_id: "20696001" deviceId: "10696001" hasGetter: true hasSetter: false name: "smoke_density" show: true valueType: "substance_amount" scale: "parts_per_million" value: 2.7472610473632812 valueFormatted: "2.75" status: "idle"There is also an Analog Gas sensor that one did import in to MSR OK.
68d63dab-b871-4f44-912b-cf6e0b9eb4c6-image.png
Devices Info:
_id: "10696000" deviceTypeId: "ezlopi" parentDeviceId: "10696000" category: "security_sensor" subcategory: "gas" gatewayId: "457a5069" batteryPowered: false name: "Gas Sensor Analog" type: "sensor" reachable: true persistent: true serviceNotification: false armed: false roomId: "" security: "no" ready: true status: "idle" parentRoom: true protectConfig: "default"Items Info:
_id: "20696000" deviceId: "10696000" hasGetter: true hasSetter: false name: "gas_alarm" show: true valueType: "token" enum: 0: "no_gas" 1: "combustible_gas_detected" 2: "toxic_gas_detected" 3: "unknown" valueFormatted: "no_gas" value: "no_gas" status: "idle"And this is how this MQ2 Gas Sensor looks like on their dashboard:
Digital
cb77dfa3-4af5-4d06-9635-89207a716a89-image.png
Analog
4fb4da1b-e946-4b89-876c-bcd9f5699b6c-image.png
They have an EzloPi website here you can create your own sensor projects using ESP boards, which is very interesting stuff!
And I just wrote on the Ezlo forum here, how to connect an EzloPi controller to MSR.
THANKS.
A couple of things for you @toggledbits, since you mentioned that this release has new features and some tweaks are expected.
Local expressions cannot be deleted. Pushing the X button has no effect for me.
When cloning an entity action, the result is strange (first is cloned one, second is the original action):
a92ea094-9e2c-4aaa-bf47-2d07a6ffdbd0-image.png
When changing the action on the cloned element, the params are added to the original one. See screenshot:
92ac3011-83c8-466b-bd23-47d483ad7a52-image.png
Dark theme has a couple of strange contrasts. One is visible in the previous screenshots (white text on yellow background). Another one is in groups (blue text on blue background):
9b3c4988-53ef-44e6-9672-30e744cacb75-image.png
Overall, I found blue, yellow, red and green (in buttons and forms) to be too bright.
On the bright side:
I love the new script action: thank you! The dark theme is a great start to avoid getting blinded at night I promise I'll try very soon the new features around actions. Thanks!@toggledbits
I just upgraded to version MSR 24293, bare metal running on Fedora. Upon restart, I am getting a error banner:
I followed the new directions about npm
npm i --no-save --no-package-lock --omit dev
Any idea what the issue is?
Seems like switching the UI to the newly added dark mode (thank you for this) does nothing. The UI stays in light mode and only a few buttons turn into dark mode (see screenshot)
Things I have tried:
Hard refresh
Different browser
Different computer
Restarting Reactor
Failed troubleshooting attempts:
No errors in Chrome console
No relevant errors in Reactor log (can still PM the full log file)
Reactor version: latest-24293-ea42a81d
Hardware: Odroid N2+
Linux version: Ubuntu 24.04.1 LTS
3df2806f-9146-485b-9ec1-d056e91cefe5-image.png Dark mode enabled
ff823023-c079-4684-b01f-d6ac6527d31a-image.png Light mode enabled
Good morning,
I have a service MQTT service that needs a restart occasionally. The add-on (Smartbed MQTT) is for the smart bed base for my bed. It has a "safety light" that I can control from HAAS & MSR as a light entity, and also moves the head of the bed to a preset at bedtime, and then lies it back flat in the morning The problem is, from time to time, the light becomes "unavailable" Restarting from the Add-ons tab in HAAS always fixes it, but I should be able to detect when it happens when "light.tempur_pedic_safety_lights" is not true or false, i.e., unavailable.
What I don't know how to do is how to restart that service. Does anybody have experience in restarting add-ons from MSR?
Running:
Reactor (Multi-hub) latest-24212-3ce15e25 ZWaveJSController [0.1.24232]HAAS:
RPi5-64 (8GB) Core 2024.7.3 Supervisor 2024.08.0 Operating System 13.0 Frontend 20240710.0Multidimensional Array
-
Expanding the question, suppose the first part of the array is the device ID, like "vera>device1234".
Is it possible to use the function below to use this same bidirectional array to search for the name, i.e. using val[0] for the search?
sort( each id in testarray: do e=getEntity( id ), ( e?.attributes?.binary_sensor?.state == true or e?.attributes?.motion_sensor?.state == true ) ? e.name : null done )
What would the function look like?
Thanks.
-
@wmarcolin I smell an X-Y problem, but I'll go on...
I don't know what "bidirectionally" means in this context. Do you mean "two dimensional?" Bidirectional refers to movement, for example, forwards and backwards, or up and down, which is a different thing.
A couple of minor comments to @Elcid 's response:
${{[["Window 1","Status On"],["Window 2","Status On"],["Window 3","Status Off"],["Window 4","Status On"]]}}
Note that this is substitution syntax, not expression syntax when defining a variable. Adjust accordingly.
each val in testarray : if val[1] === "Status On" then val[0] endif
There is no
===
operator in the expression language, it's just==
(each val in testarray : if val[0] === "Window 1" then val[1] endif)[0]
This is better written as
first ... of ...
, since you only want the one element (which by implication here the key "Window 1" must be unique in the array), and there's no need to keep searching through the array once you've found it (wastes CPU cycles).But about that uniqueness for "Window 1"... this is the real meat of my response:
If the first element of each subarray (row) is unique, then using a two-dimensional array is inefficient (i.e. doable, but not the best choice). Where unique values are present, an object containing key/value pairs gives immediate random access to any "element", without iteration:
devices = { "lamp1": "on", "lamp2": "off", "lamp3": "on" }
In this example, we can quickly determine the status of any lamp without iteration:
devices.lamp2
will give usoff
.This can be further broken down with additional data: each value in the key/value pairs of the object can be any data type, so they can be an array or object themselves:
devices = { "lamp1": { "status": "on", "room": 0 } "lamp2": { "status": "off", "room": 0 } "lamp3": { "status": "on", "room": 2 } }
We can again quickly get to the state of lamp2 using
devices.lamp2.status
(resultoff
again). Usingdevices.lamp3.room
tells us that lamp3 is in room 2. Note that in the example code above, I have shown lamp1 with a typical (JSON-style) fully indented with line breaks for readability, but lamp2 and lamp3 are in a more compact form. Whitespace (including newlines) are not significant to the syntax. Use them for readability if you wish, or leave them out for compactness if that's acceptable.When you must search within the values, you can still use iteration. Find the devices in room 0:
each dev,id in devices: dev.room==0 ? id : null
By using
each dev,id
, the iterator will provide both the value and the key for each pair in the object. That is, on the first iteration, dev will contain our subobject (itself with keys status and room) for lamp1, and id will containlamp1
; on the second iteration, the subobject for lamp2 is given in dev, and id islamp2
, and so on. The result of the iteration in this case is an array of IDs of objects in room 0:["lamp1","lamp2"]
; you could also modify the iteration to return the data objects (using dev), if that was more efficient for your later use of this expression's result.Find the first device that is "off":
first dev,id of devices: dev.status=="off" ? id : null
Adding new devices after the initialization is also easy:
devices.lamp4 = { "status": "on", "room": 2 }
But this is all data storage theory, and details of an implementation for a problem that apparently hasn't been stated. We need to know what you are really trying to do, if you are asking for help getting it done. As I said, where we stand right now, this seems very X-Y-ish. The post title is also poor quality, and the head post itself breaks a couple of the posting guidelines.
-
Hi Patrick!
%(#ff0000)[Again a Master Class on how to do the right things.]
My use case is that I want to associate each device in my installation with an identification of which group it belongs to (door, window, security, light...).
The group I will have to make the manual list (I think), so the first step of var1, I understand is the list I have to assemble, and whenever I have a new device, I update this list manually.
Just a note master, at the beginning of your example, I had to put the comma at each element of the array
I reproduced your examples to test, and I just can't find the error in the example of the first (var4).
Now comes the use, to see device names and which group they are in, or even to search the groups. My next step, is to manage when a device has the true state of its sensor, to take actions such as triggering an action/alarm/siren/message according to the group the device is part of.
If you can see, I am looking to work around not using (yet) a database, which we have had in other trackers to empower the information from the devices.
Now exploring the Master, sorry
In your last example, you explain how to add one more row to the array, one more element, perfect. Now, is it possible to add another column to the existing array? For example, with the array I created, add a column that already stores the device name? A loop that looks at the devid and then looks at the device name attribute?
I was forgetting, how do I change the contents of the array, is it possible with Set Variable? I want to change for example the group from DevWindow to DevDoor for one element.
Thanks.
-
@wmarcolin Well, I'm almost ready to release my first version of dynamic groups... still hashing out a few details. If you urgently need to do all this work, it's certainly a good opportunity to break your forehead on some sticky problems (I'm always in favor of experimentation and pushing limits).
First, having
var1
be an expression that does an assignment todevices
isn't necessary. Just call your variable devices and put in the rest of the expression after the=
in your screen shot and be done with it. You can also set up yourdevices
structure more simply. I'm not sure what the extradev001
anddev002
identifiers are doing for you, but you can (and probably should) just use the entity canonical IDs directly. It will make everything much simpler. Here's is the expression for thedevices
variable:{ "hubitat>15": { group: "DevWindow" }, "vera>device_1866": { group: "DevDoor" }, ...etc... }
Also, if
group
is the only data you are keeping, there is no value to creating a subobject to keep it, just make the group name be the value of the device's key/ID. But I'll continue with the structure you're trying to use...Anyway, by simplifying the structure of
devices
, here's what it looks like and how it changes your first three expressions:Looking at var2, we need to use quoted identifiers because a canonical ID contains a character (
>
) that cannot be used in an identifier, so thisdevices.hubitat>15.group
is not valid. The quoted identifier syntax iscontext["complexKey"]
as shown.The var3 expression is simpler, because we're not looking through the extra layer of indirection your structure had introduced, we're looking directly as our descriptive subobjects.
The var4 expression is an error in the syntax on my part. The correct syntax is shown, but I've had to embellish a bit here (next release of Reactor for you, so it won't work until I publish and you update).
But here's the important part...
As for the rest of it, you're making it unnecessarily hard, I think, because
entity.primary_value
will give you the value of the primary attribute, so you don't really need to care what capability that comes from and go to the work of classifying devices in expressions to try to make that work. There's an easier way.Based on what I see here, now that we understand you are actually trying to accomplish, what you really need to do is set those primary attributes in
local_hubitat_devices.yaml
, and skip all of thedevices
complexity you are creating here, and just use theprimary_value
from the entity in your sort/search expressions.To do the overrides in
local_hubitat_devices.yaml
:entities: # Entry shows how an entity can have a service added and its name forced "hubitat>76": # Name override name: "Attic Environmental Sensor" # # List of capabilities to add to this device (array) capabilities: - SomeAdditionalCapability - AnotherAdditionalCapability # # Assign primary attribute for this device primary_attribute: "temperature_sensor.value" "hubitat>178": primary_attribute: "x_hubitat_extra_attributes.batteryLastReplaced"
-
Hi Master!
Wow, good news that we will have in the MSR capacity, I am your test guy if you need a tester. And I'm aligned with you, I like to explore, learn, go to the limit, even with knowledge limitations, I seek to explore.
I will keep the array structure that can put more dimensions, surely I will explore.
Aligned from var4, I repeated your instruction and it really follows the syntax error, no problem for now, as I said we are learning and testing.
Master I am trying, to follow the correct path, instead of going all the way around creating the array. I edited the file local_hubitat_devices.yaml to test with these 4 devices, and I see that in the capabilities now appears the DeviceGroup, but I don't see in the attributes, or way to add the value.
# This file has local definitions/overrides for Hubitat devices. --- entities: # Entry shows how an entity can have a capability added and its name forced "hubitat>NNN": # Name override #name: "Attic Environmental Sensor" # # List of capabilities to add to this device (array) #capabilities: # - Tone # # Assign primary attribute for this device #primary_attribute: "temperature_sensor.value" "hubitat>15": capabilities: - DeviceGroup group: "Window" "hubitat>67": capabilities: - DeviceGroup group: "Window" "hubitat>98": capabilities: - DeviceGroup group: "Door" "hubitat>99": capabilities: - DeviceGroup group: "Door"
Now I have a question, can I use this same file for the Vera devices? Following the same path?
Thanks.
-
You can't make up data. Just because you assign the capability DeviceGroup to the device, that doesn't mean you get to assign the attributes (group) that may be associated with that capability. Hubitat would have to provide the group data from its side -- the values for that attribute still have to come from Hubitat. And that probably won't be happening, because DeviceGroup does not appear to be a valid Hubitat capability.
-
@toggledbits I understand, so in this case for now is to use the array resource that we discussed before, until you publish the news.
Anyway thanks for one more class of knowledge.
-
@toggledbits said in Multidimensional Array:
There is no === operator in the expression language, it's just ==
Also used in a test expression and working.
Noted used "in" rather than "of" as I thought he wanted a 2D array not a object/dictionary.
-
@elcid said in Multidimensional Array:
Not according to your doc's.
You are correct, I'm suffering from holiday brain-fade.
@wmarcolin Version 21331 just released has the first release of dynamic groups. It also includes a syntax enhancement to the expression
first...in
statement to allow a result expression, so it can return something other than what it finds (i.e. it can perform operations on what it finds and return that as a result). This is useful for yourvar4
of this post, which should befirst dev,id of devices: dev.group=="DevDoor": id
to give you the ID of the first matching device. But again, I think the combination of primary attribute assignment and dynamic groups is going to be the best way to solve this. -
@toggledbits Hi!
Perfect, you have totally changed the command.
first dev,id in var1 with dev.group=="DevDoor": dev.devid
I'm going to study the dynamic group, because even though I can compare object or array contents, the usage is horrible. It's very difficult to validate an array inside another one, or to make combined selections.
Well, I don't really know the language, so I'm having a hard time. Let's see if the dynamic groups can make something that should be simple easier.
I'll return tomorrow with my experiences
-
Hi Patrick!
I don't know if I'm doing something wrong, but I followed the following steps to use DynamicGroupController.- Stopped the MSR
- Compared the reactor configuration file
- Added the new Groups instruction, the one in the file is almost the same as the manual, and below is the one I set up.
- id: groups enable: true implementation: DynamicGroupController name: Dynamic Group Controller config: groups: "low_battery": name: Low Battery Devices select: - include_capability: - battery_power filter_expression: > entity.attributes.battery_power.level < 0.35 "tripped": name: Tripped Devices select: - include_capability: - binary_sensor - motion_sensor filter_expression: > entity.attributes.binary_sensor.state == true or entity.attributes.motion_sensor.state == true
- I restarted MSR + Tools Restart + Crtl+F5
- Search in Entities and I see that they are created, but without content
- Check if they are available for action, yes but also without content.
- As the master instructed, let's go to the log file.
[latest-21331]2021-11-27T21:13:45.136Z <default:INFO> OWMWeatherController#weather done; 1 locations, 0 failed [latest-21331]2021-11-27T21:13:45.137Z <default:NOTICE> Controller OWMWeatherController#weather is now online. [latest-21331]2021-11-27T21:13:46.538Z <VeraController:NOTICE> Controller VeraController#vera is now online. [latest-21331]2021-11-27T21:13:46.540Z <default:ERR> error updating dynamic group low_battery_entries: Error: Invalid selector key [latest-21331]2021-11-27T21:13:46.541Z <default:CRIT> Error: Invalid selector key Error: Invalid selector key at DynamicGroupController._select (C:\MSR\reactor\server\lib\DynamicGroupController.js:260:23) at DynamicGroupController._update_group (C:\MSR\reactor\server\lib\DynamicGroupController.js:193:45) at C:\MSR\reactor\server\lib\DynamicGroupController.js:243:38 at Array.forEach (<anonymous>) at DynamicGroupController._update (C:\MSR\reactor\server\lib\DynamicGroupController.js:240:95) at C:\MSR\reactor\server\lib\DynamicGroupController.js:150:42 at processTicksAndRejections (node:internal/process/task_queues:96:5) [latest-21331]2021-11-27T21:13:46.543Z <default:ERR> error updating dynamic group tripped_entries: Error: Invalid selector key [latest-21331]2021-11-27T21:13:46.544Z <default:CRIT> Error: Invalid selector key Error: Invalid selector key at DynamicGroupController._select (C:\MSR\reactor\server\lib\DynamicGroupController.js:260:23) at DynamicGroupController._update_group (C:\MSR\reactor\server\lib\DynamicGroupController.js:193:45) at C:\MSR\reactor\server\lib\DynamicGroupController.js:243:38 at Array.forEach (<anonymous>) at DynamicGroupController._update (C:\MSR\reactor\server\lib\DynamicGroupController.js:240:95) at C:\MSR\reactor\server\lib\DynamicGroupController.js:150:42 at processTicksAndRejections (node:internal/process/task_queues:96:5) [latest-21331]2021-11-27T21:13:46.544Z <app:NOTICE> Starting HTTP server and API... [latest-21331]2021-11-27T21:13:46.552Z <app:NOTICE> Starting Reaction Engine...
Well, I found this error, and obviously, I don't know how to solve it. What I did? I reinstalled the MSR, using only the config and storage directory, and the result is the same.
-
The groups would be empty if there were no tripped or low battery devices in their respective groups, so that's not all conclusive; it may be perfectly correct. The groups at least appear to be correct, for empty groups (no entities matched).
The time stamps in your log snippet are unrelated to the time stamp on the entities, so I can't really draw any conclusions from that either. If you post logs, make sure you are posting logs where the time stamps align to the problem you're reporting.
On your conditions, you can't compare an array to an empty string; that's not a valid test.
-
Ok let's go in parts, what I created in Group is the same thing I do in the traditional way and get the result, see the battery case.
I'm not seeing an error anymore, after a reboot of the MSR host.
[latest-21331]2021-11-28T02:45:18.584Z <default:null> Module httpapi v21308 [latest-21331]2021-11-28T02:45:18.661Z <VeraController:null> Module VeraController v21324 [latest-21331]2021-11-28T02:45:18.668Z <default:INFO> Structure#1 loading controller interface hubitat (HubitatController) [latest-21331]2021-11-28T02:45:18.676Z <HubitatController:null> Module HubitatController v21324 [latest-21331]2021-11-28T02:45:18.679Z <default:INFO> Structure#1 loading controller interface groups (DynamicGroupController) [latest-21331]2021-11-28T02:45:18.686Z <DynamicGroupController:null> Module DynamicGroupController v21331 [latest-21331]2021-11-28T02:45:18.688Z <default:INFO> Structure#1 loading controller interface weather (OWMWeatherController) [latest-21331]2021-11-28T02:45:18.693Z <OWMWeatherController:null> Module OWMWeatherController v21313
[latest-21331]2021-11-28T02:45:18.761Z <default:INFO> Starting controller HubitatController#hubitat [latest-21331]2021-11-28T02:45:18.782Z <default:INFO> Starting controller DynamicGroupController#groups [latest-21331]2021-11-28T02:45:18.784Z <default:NOTICE> Controller DynamicGroupController#groups is now online. [latest-21331]2021-11-28T02:45:18.785Z <default:INFO> Starting controller OWMWeatherController#weather
I see that the times are synchronized
But the array is still empty
Any instructions where I can look for something?
-
The recommended debugging for this would be to start unraveling your criteria and see what it produces. As a first step (don't do this, just read), I would remove the
filter_expression
and make sure that your selectors are producing the expected set of eligible devices. An easy way to do that is to simply put an "X" in front offilter_expression
(i.e. to make itXfilter_expression
), which changes the name of the key and hides it from the code that's looking for it. You could also comment it out, but that would require that you comment each subordinate line as well, which is more work and can be error-prone. Restart MSR after config changes, of course, and refreshes are also recommended (don't need to be hard refreshes).But, I found an error, and it's pretty subtle. For me, it logged one short line, so it would be easy to miss; I imagine you have it as well. But it's going to require a code change to fix, so I'll release another build later today. I'll also fix the doc issue you PM'd me about.
Also, don't forget that filtering by controller or capability is a good way to quickly remove "noise" from your Entities list.
-
I debugged removing filter_axpression entirely, and the variables are still empty. I'll wait for your version update and test again.
-
@toggledbits well done
Low Battery Devices charging perfect!
But there is a problem for "tripped", which repeated the same setting as "low_battery".
- id: groups enable: true implementation: DynamicGroupController name: Dynamic Group Controller config: groups: "low_battery": name: Low Battery Devices select: - include_capability: - battery_power filter_expression: > entity.attributes.battery_power.level < 0.3 "tripped": name: Tripped Devices select: - include_capability: - binary_sensor - motion_sensor filter_expression: > entity.attributes.binary_sensor.state == true or entity.attributes.motion_sensor.state == true
This is what is showing up in the log.
[latest-21332]2021-11-29T01:49:33.599Z <default:ERR> error updating dynamic group tripped: ReferenceError: Invalid reference to member state of null [latest-21332]2021-11-29T01:49:33.600Z <default:CRIT> ReferenceError: Invalid reference to member state of null ReferenceError: Invalid reference to member state of null at _run (C:\MSR\reactor\common\lexp.js:1369:31) at _run (C:\MSR\reactor\common\lexp.js:1233:34) at _run (C:\MSR\reactor\common\lexp.js:1290:44) at C:\MSR\reactor\common\lexp.js:1223:29 at Array.forEach (<anonymous>) at _run (C:\MSR\reactor\common\lexp.js:1222:28) at Object.run (C:\MSR\reactor\common\lexp.js:1564:22) at DynamicGroupController._update_group (C:\MSR\reactor\server\lib\DynamicGroupController.js:229:141) at C:\MSR\reactor\server\lib\DynamicGroupController.js:267:39 at Array.forEach (<anonymous>)
Would I have to include any additional information in the configuration to not have this problem with null?
-
In your expression, you are not guarding for entities that have
binary_sensor
but do not havemotion_sensor
, and vice versa. Use the coalescing member access operator?.
in the two sub-expressions. -
Perfect, solved, after putting the ?. in several places until I discovered how to use it correctly
"tripped": name: Tripped Devices select: - include_capability: - binary_sensor - motion_sensor filter_expression: > entity.attributes?.binary_sensor?.state == true or entity.attributes?.motion_sensor?.state == true
Boss, this thread started because I want to associate to each device an information of which group it would belong inside my system, external information that I will have to prepare manually, we started with the array, then we went to object, until you announce this new function.
What is the way now? At this moment my progress is to have in a more simplified way the ID of the devices that will understand a condition, now how in the case of Tripped I will be able to associate to the groups, the list assembled before? I already saw that I can have a global variable with the information, that this Dynamic instruction by the manual will be able to read.
Could you put together an example please?
Thanks.
-
@wmarcolin said in Multidimensional Array:
this thread started because I want to associate to each device an information of which group it would belong inside my system, external information that I will have to prepare manually
You still haven't stated why you want to do this, so in my view, we're on the Y of an X-Y problem. What you are asking seems an odd thing to do... error-prone, laborious, hard to maintain. If I understood why you think you need to do it, we might arrive at a better solution that works from existing functionality, or a clear requirement for a new feature. When I asked before for this clarification (and repair of the topic title), you replied with a restatement of your implementation question, not an explanation of the problem you are trying to solve (i.e. why you want to do the implementation you are asking about), just as you've again done now.
If I ask you how to ventilate an enclosed space that has small windows and a doorway that is usually left open, given no other information, what might you suggest?
Would you answer differently if I also told you in advance that the space will be a new module for the International Space Station?