Eventually I've figured out how to drive it. Hovewer, I haven't done a complete reverse engineering of the protocol.
So here is the configuration of the bus:
CAN bit length 100uS so the frequency is 10kHz.
Phase segments are 1Tq+1Tq+3Tq+3Tq, Tq = 12,5uS
sync jump 1Tq
It has a standard 11bit identifier which is 0b00000000000.
Filter is configured to receive standart identifiers too, but the ID can vary. There is even a command which allows to change it. I actually lost some time before I understood it, because after decoding a MCP2510 setup sequence I was using a std I found there, but after a while the switcher stopped receiving messages, because it was waiting for a different ID and I had to find a new one. There are two ways to find it - you can either hook to a MCP interrupt pin or decode a startup sequence (SPI). My latest ID is 0x201, but it doesn't actually matter.
In all answers it will transmit 4 bytes. It looks like the first byte is a commant and it matches to the firest byte of the request it received.
In order to switch it you should send it 2 bytes. The first byte is always 0x1 and it seems to be a "switch" command. The second byte in my case is either 1 or 2 depending on in which position the switch is. So if it is in the first position - you should send it {1,2}, otherwise - {1,1}. It doesn't send anything back after these commands.
Apart from that it responded to commands starting from 0x3 and 0xa. One of them has to be a request of the position, but I can be wrong and I don't want to figure it out actually.
I hope it will save someone's time someday.