Coordinate transformation on crossing Meridian not applied

I have a G5500 rotator, which goes to 180° elevation. I’d like to apply coordinate transformation when it crosses 360-0 degrees in azimuth, so that the antenna flips and doesn’t have to go a full round during an observation. Unfortunately, the documentation about SATNOGS_ROT_FLIP (True) and SATNOGS_ROT_FLIP_ANGLE (90) is unclear to me. It specifies an elevation angle, but I don’t know why. Are these parameter related to my problem, or is there another parameter that can handle passes like this?

Here is my client dump:

Summary

INFO satnogsclient.observer.observer Begin observation 12520702 …
INFO satnogsclient.observer.worker Antenna flip: False
rot_init called
initrots4_dummy: _init called
rot_register (1)
rot_register (2)
rot_open called
rot_open: using network address 10.0.0.11:4533
network_open: hoststr=10.0.0.11, portstr=4533
network_open: client port=19616
netrotctl_open called
rig_flush: called for network device
network_flush called
write_block(): TX 12 bytes, method=2
0000 5c 64 75 6d 70 5f 73 74 61 74 65 0a \dump_state.
read_string_generic called, rxmax=64 direct=1, expected_len=1
read_string_generic(): RX 2 characters, direct=1
0000 31 0a 1.
read_string_generic called, rxmax=64 direct=1, expected_len=1
read_string_generic(): RX 4 characters, direct=1
0000 36 30 32 0a 602.
read_string_generic called, rxmax=64 direct=1, expected_len=1
read_string_generic(): RX 16 characters, direct=1
0000 6d 69 6e 5f 61 7a 3d 30 2e 30 30 30 30 30 30 0a min_az=0.000000.
read_string_generic called, rxmax=64 direct=1, expected_len=1
read_string_generic(): RX 18 characters, direct=1
0000 6d 61 78 5f 61 7a 3d 33 36 30 2e 30 30 30 30 30 max_az=360.00000
0010 30 0a 0.
read_string_generic called, rxmax=64 direct=1, expected_len=1
read_string_generic(): RX 16 characters, direct=1
0000 6d 69 6e 5f 65 6c 3d 30 2e 30 30 30 30 30 30 0a min_el=0.000000.
read_string_generic called, rxmax=64 direct=1, expected_len=1
read_string_generic(): RX 18 characters, direct=1
0000 6d 61 78 5f 65 6c 3d 31 38 30 2e 30 30 30 30 30 max_el=180.00000
0010 30 0a 0.
read_string_generic called, rxmax=64 direct=1, expected_len=1
read_string_generic(): RX 13 characters, direct=1
0000 73 6f 75 74 68 5f 7a 65 72 6f 3d 30 0a south_zero=0.
read_string_generic called, rxmax=64 direct=1, expected_len=1
read_string_generic(): RX 14 characters, direct=1
0000 72 6f 74 5f 74 79 70 65 3d 41 7a 45 6c 0a rot_type=AzEl.
read_string_generic called, rxmax=64 direct=1, expected_len=1
read_string_generic(): RX 5 characters, direct=1
0000 64 6f 6e 65 0a done.
rot_get_position called
netrotctl_get_position called
rig_flush: called for network device
network_flush called
write_block(): TX 2 bytes, method=2
0000 70 0a p.
read_string_generic called, rxmax=64 direct=1, expected_len=1
read_string_generic(): RX 7 characters, direct=1
0000 32 37 30 2e 30 30 0a 270.00.
read_string_generic called, rxmax=64 direct=1, expected_len=1
read_string_generic(): RX 5 characters, direct=1
0000 36 2e 30 30 0a 6.00.
rot_get_position: got az=270.00, el=6.00

IIRC the flip is implemented to get the az to have more time to perform the fast rotation during a high elevation pass.

The transformation that is done in for example gpredict with a 0-180el capable rotator has been implemented and tested in one of my branches

That’s great, thanks! I’m using docker, is this branch available there? Which version is it? For me 1.9.3 was the default, but it didn’t send rotator commands. However, 2.0.1 works fine now.
Please share which image I should use.

I pulled your docker image, but the rotctld never gets any set commands. Does this image have the same issue as the 1.9.3 of the original image which doesn’t move the rotator?
If yes, which version should I pull?

Client log:

Summary

INFO satnogsclient.observer.observer Begin observation 12520339 …
rot_init called
initrots4_dummy: _init called
rot_register (1)
rot_register (2)
rot_open called
rot_open: using network address 10.0.0.11:4533
network_open called
network_open version 1.0
network_open: hoststr=10.0.0.11, portstr=4533
netrotctl_open called
rig_flush: called for network device
network_flush called
write_block called
write_block(): TX 12 bytes
0000 5c 64 75 6d 70 5f 73 74 61 74 65 0a \dump_state.
read_string called, rxmax=64
read_string(): RX 2 characters
0000 31 0a 1.
read_string called, rxmax=64
read_string(): RX 4 characters
0000 36 30 32 0a 602.
read_string called, rxmax=64
read_string(): RX 16 characters
0000 6d 69 6e 5f 61 7a 3d 30 2e 30 30 30 30 30 30 0a min_az=0.000000.
read_string called, rxmax=64
read_string(): RX 18 characters
0000 6d 61 78 5f 61 7a 3d 33 36 30 2e 30 30 30 30 30 max_az=360.00000
0010 30 0a 0.
read_string called, rxmax=64
read_string(): RX 16 characters
0000 6d 69 6e 5f 65 6c 3d 30 2e 30 30 30 30 30 30 0a min_el=0.000000.
read_string called, rxmax=64
read_string(): RX 18 characters
0000 6d 61 78 5f 65 6c 3d 31 38 30 2e 30 30 30 30 30 max_el=180.00000
0010 30 0a 0.
rig_init: rig does not have rx_range!!
network_open: hoststr=10.0.0.11, portstr=4532
netrigctl_open: unknown setting=‘has_set_conf=1’
netrigctl_open: unknown setting=‘has_get_conf=1’
netrigctl_open: unknown setting=‘has_power2mW=1’
netrigctl_open: unknown setting=‘has_mW2power=1’
netrigctl_open: unknown setting=‘has_get_ant=1’
netrigctl_open: unknown setting=‘has_set_ant=1’
netrigctl_open: unknown setting=‘timeout=0’
netrigctl_open: unknown setting=‘rig_model=1’
netrigctl_open: unknown setting=‘rigctld_version=Hamlib 4.7~git 2025-09-27T16:16:32Z SHA=0d122f6b1 64-bit’
netrigctl_open: unknown setting=‘agc_levels=0=OFF 1=SUPERFAST 2=FAST 5=MEDIUM 3=SLOW 6=AUTO 4=USER’
netrigctl_open: unknown setting=‘ctcss_list= 67.0 69.3 71.9 74.4 77.0 79.7 82.5 85.4 88.5 91.5 94.8 97.4 100.0 103.5 107.2 110.9’
netrigctl_open: invalid dumpcaps line, expected ‘setting=value’, got ’ 114.8 118.8 123.0 127.3 131.8 136.5 141.3 146.2 151.4 156.7 159.8 162.2 165.5 167.9 171.3 173.’
netrigctl_open: invalid dumpcaps line, expected ‘setting=value’, got ‘8 177.3 179.9 183.5 186.2 189.9 192.8 196.6 199.5 203.5 206.5 210.7 218.1 225.7 229.1 233.6 241’
netrigctl_open: invalid dumpcaps line, expected ‘setting=value’, got ‘.8 250.3 254.1’
netrigctl_open: unknown setting=‘dcs_list= 17 23 25 26 31 32 36 43 47 50 51 53 54 65 71 72 73 74 114 115 116 122 125 131 132 134’
netrigctl_open: invalid dumpcaps line, expected ‘setting=value’, got ’ 143 145 152 155 156 162 165 172 174 205 212 223 225 226 243 244 245 246 251 252 255 261 263 26’
netrigctl_open: invalid dumpcaps line, expected ‘setting=value’, got ‘5 266 271 274 306 311 315 325 331 332 343 346 351 356 364 365 371 411 412 413 423 431 432 445 4’
netrigctl_open: invalid dumpcaps line, expected ‘setting=value’, got ‘46 452 454 455 462 464 465 466 503 506 516 523 526 532 546 565 606 612 624 627 631 632 654 662 ’
netrigctl_open: invalid dumpcaps line, expected ‘setting=value’, got ‘664 703 712 723 731 732 734 743 754’
netrigctl_open: unknown setting=‘level_gran=0=0,0,0;1=0,0,0;2=0,0,0;3=0,0,0;4=0,1,0.00392157;5=0,0,0;6=0,0,0;7=0,0,0;8=0,0,0;9=0’
netrigctl_open: unknown setting=’,0,0;10=0,0,0;11=0,0,10;12=0.05,1,0.00195695;13=0,0,0;14=0,0,0;15=0,0,0;16=0,0,0;17=0,0,0;18=0,’
netrigctl_open: unknown setting=‘0,0;19=0,0,0;20=0,0,0;21=0,0,0;22=0,0,0;23=0,0,0;24=0,0,0;25=0,0,0;26=0,0,0;27=0,0,0;28=0,0,0;2’
netrigctl_open: unknown setting=‘9=0,0,0;30=0,0,0;31=0,0,0;32=0,1,0.00392157;33=0,0,0;34=0,0,0;35=0,0,0;36=0,0,0;37=0,0,0;38=0,0’
netrigctl_open: unknown setting=‘,0;39=0,100,0.00392157;40=0,0,0;41=0,0,0;42=0,0,0;43=0,0,0;44=0,2,1;45=-30,10,0.5;46=0,3,1;47=0’
netrigctl_open: unknown setting=‘,0,0;48=0,0,0;49=0,0,0;50=0,0,0;51=0,0,0;52=0,0,0;53=0,0,0;54=0,0,0;55=0,0,0;56=0,0,0;57=0,0,0;’
netrigctl_open: unknown setting=‘58=0,0,0;59=0,0,0;60=0,0,0;61=0,0,0;62=0,0,0;63=0,0,0;’
netrigctl_open: unknown setting=‘parm_gran=0=0,0,0;1=0,0,0;2=0,1,0.00392157;3=0,0,0;4=0,1065353216,998277249;5=0,0,0;6=0,0,0;7=0’
netrigctl_open: unknown setting=‘,0,0;8=0,0,0;9=0,0,0;10=BANDUNUSED,BAND70CM,BAND33CM,BAND23CM;11=STRAIGHT,BUG,PADDLE;12=1028443’
netrigctl_open: unknown setting=‘341,1065353216,989872160;13=0,0,0;14=0,0,0;15=0,0,0;16=0,0,0;17=0,0,0;18=0,0,0;19=0,0,0;20=0,0,’
netrigctl_open: unknown setting=‘0;21=0,0,0;22=0,0,0;23=0,0,0;24=0,0,0;25=0,0,0;26=0,0,0;27=0,0,0;28=0,0,0;29=0,0,0;30=0,0,0;31=’
netrigctl_open: unknown setting=‘0,0,0;32=0,1065353216,998277249;33=0,0,0;34=0,0,0;35=0,0,0;36=0,0,0;37=0,0,0;38=0,0,0;39=0,1120’
netrigctl_open: unknown setting=‘403456,998277249;40=0,0,0;41=0,0,0;42=0,0,0;43=0,0,0;44=0,2,1;45=-1041235968,1092616192,1056964’
netrigctl_open: unknown setting=‘608;46=0,3,1;47=0,0,0;48=0,0,0;49=0,0,0;50=0,0,0;51=0,0,0;52=0,0,0;53=0,0,0;54=0,0,0;55=0,0,0;5’
netrigctl_open: unknown setting=‘6=0,0,0;57=0,0,0;58=0,0,0;59=0,0,0;60=0,0,0;61=0,0,0;62=0,0,0;63=0,0,0;’
netrigctl_open: unknown setting=‘rig_model=1’
netrigctl_open: unknown setting=‘hamlib_version=Hamlib 4.7~git 2025-09-27T16:16:32Z SHA=0d122f6b1 64-bit’
network_flush: network data clear d: ret=0, len=32, ‘’
network_flush: network data cleared: ret=0, len_read=32/0x20, 'south_zero=0
rot_type=AzEl
done

INFO satnogsclient.observer.observer Start gnuradio thread.
Found Rafael Micro R820T tuner
[INFO] Opening Generic RTL2832U OEM :: 00000001…
Found Rafael Micro R820T tuner
[R82XX] PLL not locked!
[INFO] Using format CF32.
Allocating 15 zero-copy buffers

client config:

Summary

ENABLE_IQ_DUMP=True
IQ_DUMP_FILENAME=/tmp/satnogs.cf32
SATNOGS_ANTENNA=RX
SATNOGS_API_TOKEN=***
SATNOGS_LOG_LEVEL=INFO
SATNOGS_RF_GAIN=30
SATNOGS_RIG_IP=10.0.0.11
SATNOGS_ROT_ENABLED=True
SATNOGS_ROT_FLIP=False
SATNOGS_ROT_FLIP_ANGLE=90
SATNOGS_ROT_MODEL=ROT_MODEL_NETROTCTL
SATNOGS_ROT_PORT=10.0.0.11:4533
SATNOGS_RX_SAMP_RATE=1024000
SATNOGS_SOAPY_RX_DEVICE=driver=rtlsdr
SATNOGS_STATION_ELEV=116
SATNOGS_STATION_ID=4386
SATNOGS_STATION_LAT=47.457
SATNOGS_STATION_LON=19.156
UDP_DUMP_HOST=10.0.0.15
UDP_DUMP_PORT=15556
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MPLCONFIGDIR=/tmp/matplotlib
SATNOGS_ROT_INVERT=True
SATNOGS_ROT_ENDSTOP=360

A lot of details here (:
Seems you got the rotator correctly configured as it reports the ranges ok.
Do note that you cannot mix the hamlib versions, in satnogs they are 4.0 and 4.5.4 due to the debian distribution used in the images.
If you use client version <2 it is hamlib 4.0 and for client >2 it is hamlib 4.5.4

Hi there,

I finally managed to put it all together. I matched the Hamlib version with satnogs-client and it sends position commands to my rotator. However, it still sends the uninverted values even when it would be necessary.
I think the problem might be that I use the docker image, but the wrong tag/version. Can you tell me which docker image:tag I need to use that includes the rotator invert function that you linked previously?

Thanks,
Tibor

I have some image tags that I have been building, the link to the gihub repo is there as well. Although I’m tired of maintaining these so they come without any support etc. There is compatibility issues between the bigger addons/sa2kng images and the official dockerized client due to home directory permissions.