This tutorial shows you how to create a button that can toggle entities which have no toggle input. Note that this tutorial is for advanced users and I presume you understand Source's Input/Output system.
1. The Setup
Image you want to create a light switch. You set up a func_button, a light, a lamp prop model (func_dynamic) and an env_sprite. In the func_button's output you target the light and env_sprite to Toggle on pressed.
2. The Problem
The lamp prop you're using has a lit texture skin, which looks strange when the light is turned off. Luckily the lamp has a dark skin version, so you can simply toggle the skin when the button is pressed. Here is where the problem lies. The prop_dynamic has no "ToggleSkin" input. It can only set a skin by using the "Skin" input which then requires the number of the skin you want to use. To make it worse, the func_button has no "OnPressedOn" and "OnPressedOff" outputs which could help you determine which skin to show. You're going to need a work-around.
3. The Workaround
Change the func_button to a func_brush or func_detail, turning it into a dummy. Now create a small thin block (1 unit) in front of the button with the NODRAW texture on it and make it a func_door. Because of the NODRAW texture, it'll be invisible in game. Set the following properties for this func_door:
Delay before reset: 0.1
Check Flags: Toggle / Use Opens / Door Silent
Now you can use the "OnOpen" and "OnClose" outputs to set the skins of the lamp prop. If the light is on initially, make sure you use "OnOpen" to turn everything off and "OnClose" to turn everything back on. This could be the setup.
OnOpen - lamp - Skin 1 (if 1 is the dark skin)
OnOpen - light - TurnOff
OnOpen - sprite - HideSprite
OnClose - lamp - Skin 0 (if 0 is the lit skin)
OnClose - light - TurnOn
OnClose - sprite - ShowSprite
4. Final Notes
By using invisible func_doors you can pretty much toggle every entity input, which the func_button can't. Before I wrote this article, I used the "OnIn" and "OnOut" outputs of the func_button to make toggling work. "OnIn" and "OnOut" refer to the movement of the func_button, but when the button was set not to move, it worked as an On/Off output. It stopped worked out of a sudden, so I guess an update fixed the bug I was exploiting or another bug slipped in. This is another reason why I would advice you to use the func_door trick, so you can make sure your sequences won't break because of a future update.