Intercepting Tag Reads for Historical Playback

Hi ,

I’m currently working on a project for a customer where we want to implement a “SCADA replay” feature. The goal is to allow users to view historical data directly within the existing native screens—essentially replaying what the SCADA system was displaying at a specific point in time.

To achieve this, I’m developing a custom Ignition module. I’ve already prototyped a solution using a custom expression function, which works but has a major drawback: I need to manually apply this expression everywhere a tag is used in a view. This quickly becomes cumbersome and error-prone.

Ideally, I’d like to enhance the module so that tag values are automatically resolved to their historical values based on a selected timestamp—without needing to modify each view individually.

I’m currently a bit stuck on where exactly to hook into the Ignition architecture to achieve this. From what I understand, com.inductiveautomation.ignition.gateway.tags.subscriptions might be the right place to intercept tag reads on the client side, but I’m not entirely sure.

Has anyone implemented something similar or have suggestions on the best approach to intercept and override tag reads for historical data in a module?

Any guidance or pointers would be greatly appreciated!

No simple solution for Perspective. If I were to attempt this, I'd create a tag provider that mirrors another, and have the app point at the mirror provider. When replaying, supply the historical data instead of the live data.

There's an exchange resource that deals with historical playback for Perspective views: Ignition Exchange | Inductive Automation

I don't know much about it, but I've seen it mentioned here a few times.

I think there's at least one company out there that developed their own extensive history playback system... not sure what approach they took or how much it involved custom modules though.

I wonder if our sales engineers could help here?

Tamaki have one.

1 Like

Yeah, I think that's right. I had the end user / customer in mind and wasn't sure I could say who it was (because I'm not 100% sure and because I don't remember the context in which I learned all this :zany_face:).

Tamaki is the integrator though.

1 Like

I implemented the historical playback from the Ignition Exchange with success. If the data you want to playback is all tag-based then I would recommend checking it out. It’s based on the tag historian and includes some optimizations to make that work well.

I’m a bit concerned with performance with the modules i have seen so far (doing this at large scale), but maybe I should just give them i try.

Additionally I would to keep development cost down once our template, so engineers working with the template don’t really have to think about making sure it works with the historic playback.

@pturmel I have been thinking about this type of solution. Doing the switching in the tags would be fairly easy to do, but this would mean everyone will be looking at the historic playback.

No, they would always point at that provider, but you would make the provider pass through real time values when not in replay mode.