I've been working remotely from a home office with Mozilla since about 2010 (4 years so far) and although it has challenges I still enjoy it. It requires some discipline and most importantly a routine. Matt Gemmell's article on this has excellent pointers on routines and setting up an isolated work space at home. I wanted to add a few things to his post from the perspective of working as a software engineer (my profession).
If you're working in a similar role, you also collaborate with people on a daily basis. Optimize for this. I can't think of many engineering roles (besides maybe bootstrapping a startup) where you're not directly working with others towards a common goal. Collaboration is the key to success in any company that has more than one employee.
I keep all communication channels open constantly while working. I use IRC (a chat system) to communicate with my team and anyone else at Mozilla. I found that this worked best when I kept IRC constantly connected in the background (using a bouncer) which lets me see a replay of missed messages each time I sign back in. I use ZNC for this but IRC Cloud would work, too. This is very helpful for syncing up with folks in different time zones and it also gives you the freedom to disconnect and reconnect as you need to move physical locations, for example. However, I find that it's crucial to switch this and all other work communication off when not working unless on call for something ops-related. Ideally, there should be a fixed schedule for being on call just as you'd want a fixed work schedule.
I like to dip into all the things. This may not work for everyone but I like to have one window in my IRC chat client that shows all messages in all channels. I usually ignore it but sometimes I just dip in and see what conversations are going on. I've discovered tons of interesting things this way and I've heard of other companies have similar tactics, like cc'ing all employees on all emails. I use the LimeChat IRC client to get this all-channel window.
I speak to people over video whenever I need to speak to them. Face to face conversation is absolutely essential when working remotely. It's crucial to interact with people's body language and facial expressions in a conversation and it's just a more natural way to have a conversation (well, duh). My video client is always connected during work hours and anyone can cold call me during that time. So far, no one has abused this privilege! It has helped my team when folks were working on urgent projects and had quick questions. When remote, it's not bad to over communicate about when you won't be at your desk. You never know when someone might need to reach you. If a remote employee becomes unreachable this is really hard on a distributed team and I've seen it lead to termination.
Time zones. Time zones! Thanks to the ubiquitous Internet, time zones are perhaps the one hard blocker to working remotely. You have to be able to sync up in the same time zone otherwise your power to collaborate becomes a lot more difficult. Sadly this excludes some regions of the world for you to work with / from and it's something a company should consider when hiring or forming distributed teams. This site is pretty nice for visualizing time zone overlaps. Technology does offer a lot of tools for asynchronous collaboration so one might be able to make it work. It's just harder.
The Behind Closed Doors book on management insists that one on ones with a manager always happen at a regular interval like once a week at the same time. Even if you don't have anything on the agenda, meet anyway. It just helps the juices flow; this is essential when working remotely because you don't get as much "water cooler" or hallway time as you would in a real office. By meeting regularly you will be reminded of things to talk about that you forgot you wanted to talk about. It will also be easier to talk about hard things like conflicts you have with co-workers or whatever else happens in work life.
Catching up on email, bug reports, and administration stuff can zap productivity. I try to do this toward the end of the day rather than the beginning. Some days are better than others :) That's life.
I work at a standing desk for at least part of the day. It makes me feel more energized, helps with neck and back strain, and reminds me to move around a bit. Writing code requires long stretches at a keyboard and I've worked on getting the ergonomics of this correct. I feel like switching to a Kinesis Advantage really optimized my typing. It moves meta keys to the strongest fingers (thumb and fore finger) which I like a lot.
You may notice that some of this applies to working in a real office just as much as a remote office. That's because they really aren't too different. If someone isn't motivated while working remotely, chances are they won't be motivated while working in a real office either. As Matt's post mentioned: make sure you love what you do!
If you already work in a real office, you probably also interact with some remote co-workers (or you will do so soon). Consider some of these points to help you better interact with those co-workers.