I wanted to be able to set up my rotor positions without having to revert to unplugging and re-plugging a standard sat receiver, and just do everything from the command line, so I resurrected an old
project of mine:
  http://www.alcrypto.co.uk/satmap/
This has a python command line utility called 'diseqctool.py' which allows you to not only steer your dish, but also to search for specific feeds and center the dish on the strongest signal. I use this
in conjunction with the GOTOX steering mode. Source code lives here:
  https://github.com/AdamLaurie/satmap
Running the command with no arguments gives you the help:
$ ./diseqctool.py 
Usage: ./diseqctool.py <COMMAND> [ARG(s)] ... [<COMMAND> [ARG(s)] ... ]
  Commands:
     ADAPTER <#>                                      Set DVB adapter no (Default is 0)
     DEMUX <DEVICE>                                   Set DVB Demux device (default is '/dev/dvb/adapter0/demux0')
     EAST <'STEP'|'TIME'> <#>                         Drive EAST for # steps or seconds (TIME 0 drives to end stop)
     FE <DEVICE>                                      Set DVB Front End device (default is '/dev/dvb/adapter0/frontend0')
     FIND <FREQ> <'H'|'V'> <RATE> <'EAST'|'WEST'>     Find and centre on active signal
     FREQ <FREQ>                                      Set Frequency in Hz (default is 10700000)
     GOTO <#>                                         Goto stored satellite position #
     INFO                                             Show Front End device info
     LIMIT <'EAST'|'WEST'>                            Set EAST or WEST motor drive end stops
     POLARITY <'H'|'V'>                               Set Horizonal or Vertical polarity (default is 'H')
     POWER <#>                                        Power up positioner motor for # seconds
     SCAN <TYPE> <'EAST'|'WEST'> <STEPS> <LOGFILE>    Perform frequency scan and log results
     SIGNAL                                           Show current status of receiver
     STATUS                                           Show current status of positioner motor
     STEER <DEGREES> <'EAST'|'WEST'>                  Steer to angle - e.g. 13.0 EAST for HotBird
     STOP                                             Stop positioner motor
     STORE <#>                                        Store current position as satellite #
     SYMBOL <RATE>                                    Set Symbol Rate (default is 22000000)
     TUNE                                             Tune DVB Receiver (default is 10700000 Hz, Horizontal, Symbolrate 22000000)
     WEST <'STEP'|'TIME'> <#>                         Drive WEST for # steps or seconds (TIME 0 drives to end stop)
  Commands will be executed sequentially and must be combined as appropriate.
  Note that not all cards provide power all the time, so you may need to bracket
  steering commands with POWER to enable motor - e.g.
    ./diseqctool.py power 5 west step 50 power 30
  Timings will vary with equipment, but as there is no way for Diseqc 1.x compliant
  hardware to tell when a positioning command has finished, you must ensure that
  power is made available for the maximum possible duration of any movement. EAST/WEST
  STEP command are self powering (# + 1 seconds).
and here is an example of setting up a satellite (Hotbird at 13.0 East):
First, go to your tvheadend control panel and disable your sat receiver card so that the python script can control it.
Now we can check that we can talk to the card (I have 4 TV tuners and a sat receiver, so my sat card is adapter number 4):
$ ./diseqctool.py adapter 4 info
  Setting adapter to 4 (/dev/dvb/adapter4) OK
                 Device: /dev/dvb/adapter4/frontend0
                   Name: STV090x Multistandard
                   Type: QPSK (DVB-S)
               Min Freq: 950.000 MHz (10700000)
               Max Freq: 2150.000 MHz (12750000)
              Freq Step: 0.0 MHz
         Freq Tolerance: 0.0 MHz
        Min Symbol Rate: 1 MSym/s (1000000)
        Max Symbol Rate: 45 MSym/s (45000000)
  Symbol Rate Tolerance: 0 ppm
         Notifier Delay: 0 ms
           Capabilities: Auto inversion
                         Auto FEC
                         QPSK
                         2G modulation
The first thing I'll do is steer to a known position - this could either be a satellite that's already configured, or as in this case, the specific location the satellite should be - 13.0 degrees east:
$ ./diseqctool.py adapter 4 power 5 steer 13.0 east power 30
  Setting adapter to 4 (/dev/dvb/adapter4) OK
  Powering motor for 5 seconds - OK       
  Steering to 13.00 EAST - OK
  Powering motor for 30 seconds - OK       
Note that I apply power before and after the STEER command to ensure the rotor is active throughout.
Now I can start looking for the new satellite... First I find it on SatBeams:
  http://www.satbeams.com/channels
and pick a frequency that is likely to be transmitting. It doesn't need to be FTA as we only want to lock onto the signal, not decrypt it.
In this case, there is a transponder on 11727000 with vertical polarity and a symbol rate of 27500000...
I know that my satellite dish is not correctly zeroed, and that I'm pointing about 28 steps East, so I will search Westward for my new bird:
$ ./diseqctool.py adapter 4 find 11727000 v 27500000 west
  Setting adapter to 4 (/dev/dvb/adapter4) OK
  Finding transponder with frequency 11727000 WESTwards
    Found after 23 steps
    signal strength: 33422
    signal strength: 33422
    signal strength: 33422
    signal strength: 34078
    signal strength: 34078
    signal strength: 34078
    signal strength: 34078
    signal strength: 34078
    signal strength: 34078
    signal strength: 34078
    signal strength: 34078
    signal strength: 34078
    signal strength: 34078
    signal strength: 33422
    signal strength: 33422
    signal strength: 33422
      strongest signal was 34078
      seeking back to that level...
          stepping another 5 steps to centre
 
I also know from previous tests that I have about 6 steps per degree, so if the number of steps is getting too high for the satellite's actual position, I can abort and try again on a different frequency.
Now we seem to have found the satellite, we can verify it by looking at some data:
$ ./diseqctool.py adapter 4 freq 11727000 polarity v symbol 27500000 tune signal
  Setting adapter to 4 (/dev/dvb/adapter4) OK
  Setting Frequency to 11727000 - OK
  Setting Polarity to Vertical - OK
  Setting Symbol Rate to 27500000 - OK
  Tuning receiver to 11727000 Hz, Vertical, Symbolrate 27500000 - OK
                 Status: Signal detected
                         Carrier detected
                         FEC is stable (VITERBI)
                         Found sync bytes
                         Signal locked
 BER: 0
 SNR: 20359
 STRENGTH: 33422
Frequency: 1127000
Spectral Inversion: Auto Inversion
Symbol Rate: 27500000
FEC: FEC Auto
$ dvbsnoop -adapter 4 0x0010|grep -i orbital
            Orbital_position: 304 (=  13.0)
and we can see that we have a good signal, and in the dvbsnoop data our orbital position is indeed 13.0, so we're definitely looking at the right satellite!
Finally, I store the new sat in position 13:
$ ./diseqctool.py adapter 4 store 13
  Setting adapter to 4 (/dev/dvb/adapter4) OK
  Storing position as satellite no. 13 - OK
and I can go back to my tvheadend config, set up a new network for Hotbird 13 and a GOTOX sat feed for it and we're done!
I hope this is useful, and please feel free to send me any feedback via the github page.
cheers,
Adam