Skip to content

Multi-System Reactor

819 Topics 7.8k Posts
  • Category Topic Guide -- Read Before Posting

    Pinned Locked guidelines
    1
    8 Votes
    1 Posts
    1k Views
    No one has replied
  • Reactor (Multi-System/Multi-Hub) Announcements

    Pinned Locked announcements
    131
    5 Votes
    131 Posts
    75k Views
    toggledbitsT
    Reactor build 25325 Rules/Expressions: fix an additional evaluation case from @Crille UI: silence an error that could occur during restarts (the shutdown process could stimulate the Set Rules status widget to fire queries at the inoperative host that eventually time out). HassController: Bless HA to 2025.11.3
  • Device log?

    2
    0 Votes
    2 Posts
    31 Views
    toggledbitsT
    You list Hubitat and HASS as hubs, and the default logging for both of these hubs should tell you what you need to know. I've tried to keep these messages fairly consistent across the controllers, generally in this form: [...]2025-11-25T12:45:08.121Z <xxx:INFO> xxx#house perform power_switch.set on Switch#house>device_396 with { "state": false } Search using the canonical entity ID. There are several capabilities that can turn a light on, so searching by capability is harder. The idea is to find a perform ??? on ??? with ??? at the right time with the right entity ID. From there, start looking backwards for a message like either one of these: [...]2025-11-25T12:45:00.100Z <Engine:NOTICE> Starting reaction Parking Area Light Off (re-lk5lrx5a) or [...]2025-11-25T12:45:08.121Z <Engine:INFO> Resuming reaction Parking Area Light Off (re-lk5lrx5a) from step 3 If this line is within just a couple of lines, maybe even directly before, the perform log entry you found above, then that's the name of the Reaction that manipulated the device. If that has :S or :R at the end of its ID and the tag <SET> or <RESET> appended to the Reaction name, the Reaction is part of a Rule with that ID and name, and that is the rule that is manipulating the entity — you're done! If the Reaction ID doesn't have the :S or :R suffix, then the Reaction is not rule-based (e.g. it's a global reaction), and you need to find what launched it. If the line you've found is of the form Resuming "<reaction name>" (reaction id)" from step n, then keep looking backwards. You may find more Resuming lines for other steps of the same reaction, but your goal now is to find the line that looks like Starting "<reaction name>" (reaction id). Once you are on the Starting "<reaction name>" (reaction id) line, you should not have to look very far to find an Enqueuing "<reaction name>" (reaction id) line. Once you are on the Enqueueing line, you should not have to look very far to find another Resuming or Starting reaction line. This line may have the :S and :R on the reaction ID that you are looking for to indicate the rule that launched the reaction. If it doesn't, then the reaction was launched by another reaction, and you just repeat the above process looking for what started this reaction. This path will eventually lead to the responsible rule. Live example from my host this morning. The perform action we found above is for an outdoor flood light that lights a parking pad at my house. It got turned off. By what, though? Well, we already established that is was by a reaction called Parking Area Light Off because we found a Resuming line for that reaction right before the perform line for the entity. Let's keep digging to find the responsible rule. Here's are some more relevant lines from my log: [...]2025-11-25T12:45:00.067Z <Engine:INFO> Enqueueing "Morning Lighting Off<SET>" (rule-knjifbn1:S) [...]2025-11-25T12:45:00.078Z <Engine:NOTICE> Starting reaction Morning Lighting Off<SET> (rule-knjifbn1:S) [...]2025-11-25T12:45:00.078Z <Engine:INFO> Enqueueing "Outdoor All Off" (re-kl73syb6) . . [...]2025-11-25T12:45:00.088Z <Engine:NOTICE> Starting reaction Outdoor All Off (re-kl73syb6) [...]2025-11-25T12:45:00.089Z <Engine:INFO> Enqueueing "Parking Area Light Off" (re-lk5lrx5a) . . [...]2025-11-25T12:45:00.100Z <Engine:NOTICE> Starting reaction Parking Area Light Off (re-lk5lrx5a) . . [...]2025-11-25T12:45:00.118Z <Engine:INFO> Resuming reaction Parking Area Light Off (re-lk5lrx5a) from step 2 [...]2025-11-25T12:45:00.119Z <Engine:NOTICE> Parking Area Light Off delaying until 1764074708119<11/25/2025, 7:45:08 AM> . . [...]2025-11-25T12:45:08.121Z <Engine:INFO> Resuming reaction Parking Area Light Off (re-lk5lrx5a) from step 3 Working backwards from the last line, which is the Resuming line that we found earlier (step 3), we find a Resuming line for the previous step (2) of that same reaction at 12:45:00.118. Notice also that reaction had a delay in it that was logged immediately after, which accounts for the time gap between steps 2 and 3. Keep going backwards to 12:45:00.100 and we find the Starting line for that Parking Area Light Off reaction. And continuing to look backwards for that same reaction ID, we eventually find the Enqueueing line for it (12:45:00.089). Usually these two lines are pretty close together, but it's not usual to have other things logged between. Now just looking backward line by line (not searching for any ID here), we soon find a Starting reaction Outdoor All Off line (12:45:00.088) very close to our Enqueueing line, indicating that Outdoor All Off launched the Parking Area Light Off reaction. Now we just repeat this process with Outdoor All Off — find it enqueued at 12:45:00.078 by Morning Light Off<SET> also at 12:45:00.078. The <SET> on the name and :S on the ID means it's a rule reaction, so Morning Light Off is the rule that triggered and started the sequence of two other reactions that eventually turned off the light. So to recap: Find the perform line (search using entity ID) that occurs at about the right time. Look backwards a short distance and you will find either a Starting <reaction> or Resuming <reaction> line. If that's a rule's SET or RESET reaction, you've found the responsible rule. Otherwise, a global reaction manipulated the entity/device, so proceed to the next step. Find what launched the current reaction. Keep looking backward until you find the Enqueueing line for it. Then very shortly preceding it, you should find a Starting <reaction> or Resuming <reaction> line for a different reaction. That's what started the current reaction. If this new reaction is a rule's SET or RESET reaction, you've found the responsible rule. Otherwise, find what launched this new (global) reaction by repeating this step. NOTE: Almost all actions in Reactor are asynchronous, meaning the Engine launches them in a separate process and the Engine can move on to working on a different reaction if multiple are running concurrently. Some in particular can take a lot of time (like HTTP Request). Depending on how busy your system is in that moment, all of these lines can be separated by other lines for other things going on, and you have to be careful and patient sifting through them.
  • Midnight crossing not working in date/time condition (build 25325)

    3
    1
    0 Votes
    3 Posts
    35 Views
    tunnusT
    latest-amd64
  • Error: Command timeout

    6
    0 Votes
    6 Posts
    124 Views
    G
    @toggledbits I just put it live. The past few days I've had a situation wherein the dialogue blips past and then MSR is "greyed out" like it's in the background of a pop-up... but the pop-up isn't visible. We'll see if this resolves that all. Thank you, sir!
  • 0 Votes
    5 Posts
    207 Views
    CrilleC
    Super, it now behaves as expected. Once again thank you!
  • Home Assistant 2025.11.2 and latest-25315

    6
    1
    0 Votes
    6 Posts
    230 Views
    G
    @tamorgen it would appear my backups were overwritten already. I had it set for a high number, seems an update somewhere dropped it back to the defaults.
  • Notice to Docker + ARM Users (RPi 3/4/5 and others)

    1
    1 Votes
    1 Posts
    86 Views
    No one has replied
  • Requesting a proper ARM64/aarch64 Docker image (Pi 5 support)

    3
    1 Votes
    3 Posts
    185 Views
    M
    The latest-arm64 works perfectly now on my RPi5 - huge thanks for pushing the arm64 Bookworm build! This was the last showstopper for my RPi4 → RPi5 migration, so I can finally continue the move. Here’s the container coming up cleanly: mgvra@desktop:/development/knx-hal-mono$ docker --context production-rpi5 compose --env-file .env-prod up msr [+] Running 1/1 ✔ Container mosquitto Running 0.0s Attaching to msr msr | Reactor latest-25315-bc301993 app 25315 configuration from /var/reactor/config msr | NODE_PATH /opt/reactor:/opt/reactor/node_modules msr | [latest-25315]2025-11-15T03:42:09.308Z <app:null> Reactor build latest-25315-bc301993 starting on v24.11.1 /usr/local/bin/node msr | [latest-25315]2025-11-15T03:42:09.309Z <app:null> Process ID 1 user/group 0/0; docker; platform linux/arm64 #1 SMP PREEMPT Debian 1:6.12.47-1+rpt1 (2025-09-16); locale (undefined) msr | [latest-25315]2025-11-15T03:42:09.309Z <app:null> Basedir /opt/reactor; data in /var/reactor/storage msr | [latest-25315]2025-11-15T03:42:09.309Z <app:null> NODE_PATH=/opt/reactor:/opt/reactor/node_modules msr | [latest-25315]2025-11-15T03:42:09.332Z <app:null> Resolved timezone=Europe/Helsinki, environment TZ=Europe/Helsinki; offset minutes from UTC=120 . . . Thanks again — I dropped a few drams for such a fast support. br, mgvra
  • Script action and custom timers

    4
    0 Votes
    4 Posts
    198 Views
    toggledbitsT
    Depends on what you mean by "fire". If you look at the logs (not in pulse output mode, but in the default "follow"), you will probably see it being re-evaluated every 10 seconds, but because your result is a constant true, the rule SETs and never RESETs. Changing it to pulse output, of course, changes that. The thing to notice, though, is that the expression IS being evaluated every 10 seconds, regardless of the output mode of the condition.
  • Help resolve change in behaviour post update

    12
    1
    0 Votes
    12 Posts
    513 Views
    CatmanV2C
    I shall have a play! C
  • Reactor w/HA 2025.11 error on set_datetime service call setting only time

    6
    0 Votes
    6 Posts
    230 Views
    CrilleC
    Sounds good, thank you for your work!
  • 0 Votes
    17 Posts
    662 Views
    toggledbitsT
    @gwp1 yes!
  • [Solved] alarm() in global expression throws error in log.

    26
    1
    0 Votes
    26 Posts
    1k Views
    toggledbitsT
    Whew! If that was anything, it was the work of an aging magician. Thanks for sticking with it and supplying good info.
  • [Solved] Define function issue in latest-25304

    12
    1
    0 Votes
    12 Posts
    598 Views
    CrilleC
    Super, thank you very much. You're the real MVP!
  • No Upgrade Notification for Build 25308?

    2
    0 Votes
    2 Posts
    166 Views
    toggledbitsT
    It's a silent/optional build. I actually do this often, when I roll a build that has a very limited number of fixes to address an issue or issues affecting a very limited audience (i.e. most people would not get any value/changes in the upgrade from the previous build).
  • Strange behavior in MSR latest-25304 with disabled groups in Reaction

    2
    1
    0 Votes
    2 Posts
    171 Views
    toggledbitsT
    @therealdb said in Strange behavior in MSR latest-25304 with disabled groups in Reaction: When pressing the button, Can you explain what this means? And please show the entire rule. Edit 2: Never mind. I was focused on the variable and the interpretation of the value, but I see now, that's not what you're looking at... one moment please... Edit 3: OK. That's not a 25304-specific issue... goes back to forever. Will be fixed in next build (soon/today).
  • [Reactor] Variables not updating correctly in latest-25201-2aa18550

    95
    2
    0 Votes
    95 Posts
    11k Views
    toggledbitsT
    @tunnus OK. We got that one, too! Thanks for sticking with that process and getting me a lot of good information. Build 25304 is now fully released for all platforms and architectures. Please see the release announcement for a full list of change.
  • The reaction stopped working (Google Nest max playing a video)

    Locked Solved
    9
    1
    0 Votes
    9 Posts
    899 Views
    toggledbitsT
    @Fanan Build 25304 has the necessary changes to support what has changed in Home Assistant. The following is an example action to play media in the new model: The first example in the screen shot below shows how to format the object field that Home Assistant needs as JSON. The second example shows how to use YAML for the field. [image: 1761918113553-eb87b70b-d5d1-4afc-afc3-2e468deb6fe3-image.png]
  • Handling Dead Entities and Renamed Entities

    Solved
    5
    0 Votes
    5 Posts
    403 Views
    PablaP
    @toggledbits interesting, I totally understand the rationale why the controllers act this way. However, I feel like there are times where you’d want to batch update entities. Could this be added into the UI, similar to the purge dead entities action? Maybe an “update entity metadata” action?

Recent Topics