# Intercepting Tag Reads for Historical Playback

**URL:** <https://forum.inductiveautomation.com/t/intercepting-tag-reads-for-historical-playback/110694>\
**Category:** Module Development\
**Tags:** perspective\
**Created:** [September 17, 2025, 8:35am UTC](https://forum.inductiveautomation.com/t/intercepting-tag-reads-for-historical-playback/110694 "2025-09-17T08:35:31Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![thimo\_van\_den\_broek](https://avatars.discourse-cdn.com/v4/letter/t/7ba0ec/32.png) [@thimo\_van\_den\_broek](https://forum.inductiveautomation.com/u/thimo_van_den_broek)\
**Post date:** [September 17, 2025, 8:35am UTC](https://forum.inductiveautomation.com/t/intercepting-tag-reads-for-historical-playback/110694/1 "2025-09-17T08:35:31Z")

</div>

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!

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [September 17, 2025, 2:24pm UTC](https://forum.inductiveautomation.com/t/intercepting-tag-reads-for-historical-playback/110694/2 "2025-09-17T14:24:23Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [September 17, 2025, 2:31pm UTC](https://forum.inductiveautomation.com/t/intercepting-tag-reads-for-historical-playback/110694/3 "2025-09-17T14:31:15Z")

</div>

There's an exchange resource that deals with historical playback for Perspective views: [Ignition Exchange | Inductive Automation](https://inductiveautomation.com/exchange/108/overview)

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?

---

<div class="post-metadata">

**Author:** ![Matrix\_Engineering](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/matrix_engineering/32/19781_2.png) [@Matrix\_Engineering](https://forum.inductiveautomation.com/u/Matrix_Engineering)\
**Post date:** [September 17, 2025, 2:31pm UTC](https://forum.inductiveautomation.com/t/intercepting-tag-reads-for-historical-playback/110694/4 "2025-09-17T14:31:47Z")

</div>

> [@Kevin.Herron](#):
>
> I think there's at least one company out there that developed their own extensive history playback system

Tamaki have one.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [September 17, 2025, 2:32pm UTC](https://forum.inductiveautomation.com/t/intercepting-tag-reads-for-historical-playback/110694/5 "2025-09-17T14:32:57Z")

</div>

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 🤪).

Tamaki is the integrator though.

---

<div class="post-metadata">

**Author:** ![Matrix\_Engineering](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/matrix_engineering/32/19781_2.png) [@Matrix\_Engineering](https://forum.inductiveautomation.com/u/Matrix_Engineering)\
**Post date:** [September 17, 2025, 2:33pm UTC](https://forum.inductiveautomation.com/t/intercepting-tag-reads-for-historical-playback/110694/6 "2025-09-17T14:33:52Z")

</div>

> **[PlantReplay](https://www.tamakicontrol.com/plantreplay)**
>
> Plant Replay, by Tamaki Control, is an award winning module developed to extend the functionality of Ignition, the software platform by Inductive Automation.

---

<div class="post-metadata">

**Author:** ![Tim](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/tim/32/3361_2.png) [@Tim](https://forum.inductiveautomation.com/u/Tim)\
**Post date:** [September 17, 2025, 7:23pm UTC](https://forum.inductiveautomation.com/t/intercepting-tag-reads-for-historical-playback/110694/7 "2025-09-17T19:23:08Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![thimo\_van\_den\_broek](https://avatars.discourse-cdn.com/v4/letter/t/7ba0ec/32.png) [@thimo\_van\_den\_broek](https://forum.inductiveautomation.com/u/thimo_van_den_broek)\
**Post date:** [September 18, 2025, 5:53am UTC](https://forum.inductiveautomation.com/t/intercepting-tag-reads-for-historical-playback/110694/8 "2025-09-18T05:53:57Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [September 18, 2025, 5:42pm UTC](https://forum.inductiveautomation.com/t/intercepting-tag-reads-for-historical-playback/110694/9 "2025-09-18T17:42:12Z")

</div>

> [@thimo\_van\_den\_broek](#):
>
> 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.
