As I said the implementation works, but I just discovered you need to be careful with it. Further testing with multiple indicators and watchers seemed to fail keeping indicators independent. So if you are reading this in the future looking for answers (and no one has posted the better way that there must be), keep on going.
The indicators all changing at once because I was using the init method from my team’s parent class instead of the param one. This made my objects use the global param namespace, instead of the instance one, which made it so the watchers couldn’t watch single instances. When deriving from existing classes this can be solved by inheriting first from param.Parameterized, so it’s the first parent (parent conflict solving is kind of complicated in python, unless you ask Raymond Hettinger). That is, if you can get away with it.
This way, your derived class will use param.Parameterized.init, and will have it’s own param namespace, where watchers can live happy, watching the instance level, instead of watching the whole class. I have yet to check how will it work with the changes in the paremeter coming from the other parent (the Sensor class I alluded to earlier). Also, this locks you in onto using keyword arguments when initializing, which is a bit of a hassle that you trade off for a ton more readability.
TLDR: inherit param.Parameterized first to get watcher independence if you want to scale.