I have quite a few large pistons, but I try to limit each one to having only one trigger (or less). While it is possible to have multiple triggers in the same piston, it is important to keep in mind that each time any one of the devices changes (in either direction), the piston runs thru the entire code from top to bottom. (so you will have to code accordingly)
On a related note:
Things that I want to happen on a regular schedule (sunrise/sunset, morning/evening lights, etc) I usually keep inside it’s own piston. (one per event) It is not mandatory, but it streamlines, and makes troubleshooting a breeze.
There are many ways to approach this. I often keep each routine in it’s own piston with no triggers at all. So, for example, I program what I want to happen when I get home all in one piston. (basically, turning a routine into a piston) I have another piston for when I want to watch a movie, and another for when I am heading to bed. By keeping the triggers out completely, then that piston can be called by many other methods. (using my first example, I have another piston that tracks my location, and once that piston determines that I am arriving home, it executes the Welcome Home mentioned above) This also lets me tell Alexa I am going to bed, and she simply executes the Goodnight piston.
It is not always possible, but here’s a good habit to get in:
Try to keep each device trigger to only be subscribed to a single piston. Ideally, when the motion sensor by the front door changes to active, only one piston should be taking action.
(I am only referring to triggers in this paragraph. You can put conditions anywhere)
And lastly, try to not program 20 commands to be sent at the same instant, or you are bound to occasionally get unreliable results.
There are exceptions to every rule, but basically, I prefer many smaller pistons when compared to one mega piston. (unless that mega piston has 1 trigger or less) Reliability drops if too many things are trying to happen simultaneously.