Home automation module that can be used as a stand-alone tracker, working autonomously.
Can also be controlled by a home automation system, like Domoticz (DomBusTracker version with DomBus protocol firmware), Home Assistant, Node-RED, OpenHAB, ... (DomBusTracker version with Modbus protocol firmware).
Dual axis solar tracker
Sun tracker is very good for photovoltaic systems because enhances the total production energy and, moreover, increases the power during the early morning and late afternoon, when energy is more expensive and less available.
The following chart shows the comparison of the energy produced in a sunny day, October 31 2024, in the Northern Italy, between a 2-axis solar tracker and a photovoltaic on the roof.
Comparing the two systems, we can say that in these conditions the 2-axis tracker performs almost 3 times over photovoltaic on the roof . Normally it performs almost twice a photovoltaic system on a roof oriented to South, with a normal tilt for italian houses (around 15 degrees).
This controller is based on the chinese XMYC-3 controller, using the same sun sensor, but adding some features like the automatic detection of the limit switches inside the motors (linear actuators have limit switches inside, that cut-off power), home automation system integration (you may choose between the DomBus proprietary protocol working with Domoticz, and Modbus standard protocol working with almost any domotic controller) and automatic return to night position.
Features
- Use a standard waterproof sun sensors made by 4 photodetectors, to determine the best tilt/azimuth even in case of clouds.
- 4x 10A relays permit to control 2 linear actuators with 800kg force (or similar), supplied by a 24V (preferred) or 12V power supply unit.
- Current sensing to automatically detect the linear actuator internal limit switches.
- Additional 6 analog/digital inputs, that can be connected to NTC, energy meters, wind speed meter, ...
- 2x 10A additional relays, to enable/disable the power supply unit (saving energy consumption during the night) and more.
- 1x AC optoisolated input to detect (and notify) power outages
- Internal RS485 bus terminating resistor (150 ohm) that can be enabled by a PCB jumper (with a solder iron)
- RS485 bus, that works with up to 500m of cable (using standard alarm cable: 2x0.50+2x0.22mm² + shield)
- DIN rail low-profile enclosure, 115x90x40mm
- Plugin terminal blocks for easy wiring
- Parameters configurable by RS485 bus, to work with almost any tracking system
- Available with 2 firmwares of your choice:
- DomBus firmware, working with Domoticz, implementing the DomBus proprietary protocol
- Modbus firmware, working with NodeRED, Home Assistant, OpenHAB and many other controllers supporting the standard Modbus protocol.
- Very low power usage: 15mW with relays OFF.
- Supplied with 2 power resistors 5W for current sensing (to detect motor internal limit switches), 2 varistors 33V to avoid overvoltages on motor coils and 27 Ohm resistor to supply the sun sensor
Sun sensor, actuators, 24V power supply unit and fuse protection have to be purchased apart.
Connection schematic
DomBusTracker ports capabilities (for the DomBus version)
Default address: 0xff38
Port# | Name | Capabilities | Default configuration | Description |
1 | MN | OUT_DIGITAL | OUT_DIGITAL | SPDT 10A relay that have to be connected to the tilt linear actuator (North/South): see schematic below. Read-only: tracker position may be changed by using the Pns and Pew control bars. |
2 | MS | OUT_DIGITAL | OUT_DIGITAL | SPDT 10A relay that have to be connected to the tilt linear actuator (North/South): see schematic below. Read-only: tracker position may be changed by using the Pns and Pew control bars. |
3 | ME | OUT_DIGITAL | OUT_DIGITAL | SPDT 10A relay that have to be connected to the tilt linear actuator (East/West): see schematic below. Read-only: tracker position may be changed by using the Pns and Pew control bars. |
4 | MW | OUT_DIGITAL | OUT_DIGITAL | SPDT 10A relay that have to be connected to the tilt linear actuator (East/West): see schematic below. Read-only: tracker position may be changed by using the Pns and Pew control bars. |
5 | RL5 | OUT_DIGITAL | OUT_DIGITAL | 10A SPST relay (only NO contact), 250Vac or 30Vdc capability, that can be used for other purposes |
6 | RL6 | OUT_DIGITAL | OUT_DIGITAL | 10A SPST relay (only NO contact), 250Vac or 30Vdc capability, that can be used for other purposes |
7 | INAC | IN_AC, IN_COUNTER | IN_AC | Optoisolated input, that can be connected to a circuit breaker (to notify power outages, expecially useful for fridges and heat pumps), PIRs with 230V output (to monitor presence), light and appliances (to monitor when light or devices are ON). |
8 | N | IN_ANALOG | IN_ANALOG | North light sensor. |
9 | S | IN_ANALOG | IN_ANALOG | South light sensor. |
10 | E | IN_ANALOG | IN_ANALOG | East light sensor. |
11 | W | IN_ANALOG | IN_ANALOG | West light sensor. |
12 | Ins | IN_ANALOG | IN_ANALOG | North-South (tilt) motor current sensing (used to detect internal limit switches). Domoticz devices should be configured as IN_ANALOG,A=0.00042,TypeName=Current (Single) |
13 | Iew | IN_ANALOG | IN_ANALOG | North-South (tilt) motor current sensing (used to detect internal limit switches). Domoticz devices should be configured as IN_ANALOG,A=0.00042,TypeName=Current (Single) |
14 | IN7 | IN_DIGITAL, IN_DIGITAL_PULLDOWN, IN_ANALOG, IN_TWINBUTTON, IN_COUNTER | IN_DIGITAL |
Analog or digital input, with optional 10k pullup (pcb jumper) and optional internal pulldown (activated when configured as IN_DIGITAL_PULLDOWN). |
15 | IN8 | IN_DIGITAL, IN_DIGITAL_PULLDOWN, IN_ANALOG, IN_TWINBUTTON, IN_COUNTER | IN_DIGITAL |
Analog or digital input, with optional 10k pullup (pcb jumper) and optional internal pulldown (activated when configured as IN_DIGITAL_PULLDOWN). |
16 | IN9 | IN_DIGITAL, IN_DIGITAL_PULLDOWN, IN_ANALOG, IN_TWINBUTTON, IN_COUNTER | IN_DIGITAL |
Analog or digital input, with optional 10k pullup (pcb jumper) and optional internal pulldown (activated when configured as IN_DIGITAL_PULLDOWN). |
17 | IN10 | IN_DIGITAL, IN_DIGITAL_PULLDOWN, IN_ANALOG, IN_TWINBUTTON, IN_COUNTER | IN_DIGITAL |
Analog or digital input, with optional 10k pullup (pcb jumper) and optional internal pulldown (activated when configured as IN_DIGITAL_PULLDOWN). |
18 | IN11 | IN_DIGITAL, IN_DIGITAL_PULLDOWN, IN_ANALOG, IN_COUNTER | IN_DIGITAL |
Analog or digital input, with optional 10k pullup (pcb jumper) and optional internal pulldown (activated when configured as IN_DIGITAL_PULLDOWN). |
19 | IN12 | IN_DIGITAL, IN_DIGITAL_PULLDOWN, IN_ANALOG, IN_COUNTER | IN_DIGITAL |
Analog or digital input, with optional 10k pullup (pcb jumper) and optional internal pulldown (activated when configured as IN_DIGITAL_PULLDOWN). |
20 | NS | CUSTOM | CUSTOM |
0-100% bar showing the deviation of the maximum NS radiation direction from the current tilt position |
21 | EW | CUSTOM | CUSTOM |
0-100% bar showing the deviation of the maximum EW radiation direction from the current azimuth position |
22 |
Pns |
CUSTOM | CUSTOM |
0-100% bar showing the current tilt position |
23 | Pew | CUSTOM | CUSTOM |
0-100% bar showing the current azimuth position |
24 | Man | OUT_DIGITAL | OUT_DIGITAL |
If Off, tracker is in automatic tracking mode. |
DomBusTracker Modbus RTU capabilities (for the Modbus version)
At power-on, the module shows on red LED the current Modbus slave address (register address=8192) in decimal format, on green LED the serial baudrate (reg. 8193), and finally on red LED the serial parity (reg. 8194).
If a value is zero, a long flash is emitted.
For example, if reg(8192)=56, reg(8193)=0, reg(8194)=0, at power the following led flashes will be shown:
5 red flashes, pause, 6 red flashes (slave address= 0x38 = 56 decimal), pause, 1 long green flash (reg(8193)=0 => baudrate=115200bps), pause, 1 long red flash (reg(8194)=0 => parity=None).
Device will be operative only when address/baudrate/parity parameters have been shown: then module will accept commands by Modbus RTU, and periodically shows output status for all ports, from 1 to max port: green flash means that port status is Off, red flash means that port is On.
Default slave address: 56 (0x38)
Addr | Name | Values | Description |
0 | MN | 0=OFF, 1=ON. Read only. Tracker position may be changed by using the Pns and Pew control bars. |
SPDT 10A relay that have to be connected to the tilt linear actuator (North/South): see schematic below. Read-only |
1 | MS |
0=OFF, 1=ON. Read only. |
SPDT 10A relay that have to be connected to the tilt linear actuator (North/South): see schematic below. Read-only |
2 | ME | 0=OFF, 1=ON. Read only. Tracker position may be changed by using the Pns and Pew control bars. |
SPDT 10A relay that have to be connected to the tilt linear actuator (East/West): see schematic below. Read-only |
3 | MW | 0=OFF, 1=ON. Read only. Tracker position may be changed by using the Pns and Pew control bars. |
SPDT 10A relay that have to be connected to the tilt linear actuator (East/West): see schematic below. Read-only |
4 | RL5 | 0=OFF, 1 or 65280=ON, 2-65279=ON for specified time. Logic can be inverted specifying the INVERTED option (on address 512+port) |
SPST 10A, that can be used for other purposes |
5 | RL6 | 0=OFF, 1 or 65280=ON, 2-65279=ON for specified time. Logic can be inverted specifying the INVERTED option (on address 512+port) |
SPST 10A, that can be used for other purposes |
6 | INAC | 0=OFF (floating), 1=ON (100-250V signal detected) | Optoisolated input, that can be connected to a circuit breaker (to notify power outages, expecially for fridges and heat pumps), PIRs with 230V output (to monitor presence), light and appliances (to monitor when light or devices are ON). |
7 | N | 0-65520 depending by the solar radiation received by this sensor. | North light sensor. |
8 | S | 0-65520 depending by the solar radiation received by this sensor. | South light sensor. |
9 | E | 0-65520 depending by the solar radiation received by this sensor. | East light sensor. |
10 | W | 0-65520 depending by the solar radiation received by this sensor. | West light sensor. |
11 | Ins | 0=OFF, >0 = 16-65520 if motor current is detected. Ins = value*0.00042 [A] in case that sensing resistor is 0.12Ohm |
North-South (tilt) motor current sensing (used to detect internal limit switches). Domoticz devices should be configured as IN_ANALOG,A=0.00042,TypeName=Current (Single) |
12 | Iew | 0=OFF, >0 = 16-65520 if motor current is detected. Ins = value*0.00042 [A] in case that sensing resistor is 0.12Ohm |
North-South (tilt) motor current sensing (used to detect internal limit switches). Domoticz devices should be configured as IN_ANALOG,A=0.00042,TypeName=Current (Single) |
13 | IN7 | 0=OFF, 1=ON, or 0-65535 if port is configured as analog. See below for more information. |
Digital input or analog input, with internal pullup enabled by hardware, or internal pulldown enabled by software (configuring as IN_DIGITAL_PULLDOWN). |
14 | IN8 | 0=OFF (input externally pulled/shorted to GND), 1=ON (input externally disconnected, with internal pullup to 3.3V). Logic can be inverted with the INVERTED option (to be set on address 512+port) |
Analog or digital input, with optional 10k pullup (pcb jumper) and optional internal pulldown (activated when configured as IN_DIGITAL_PULLDOWN). |
15 | IN9 | 0=OFF, 1 or 65280=ON, 2-65279=ON for specified time. Logic can be inverted specifying the INVERTED option (on address 512+port) |
Analog or digital input, with optional 10k pullup (pcb jumper) and optional internal pulldown (activated when configured as IN_DIGITAL_PULLDOWN). |
16 | IN10 |
0=OFF, 1 or 65280=ON, 2-65279=ON for specified time.Logic can be inverted specifying the INVERTED option (on address 512+port) |
Analog or digital input, with optional 10k pullup (pcb jumper) and optional internal pulldown (activated when configured as IN_DIGITAL_PULLDOWN). |
17 | IN11 | 0=OFF, 1 or 65280=ON, 2-65279=ON for specified time. Logic can be inverted specifying the INVERTED option (on address 512+port) |
Analog or digital input, with optional 10k pullup (pcb jumper) and optional internal pulldown (activated when configured as IN_DIGITAL_PULLDOWN). |
18 | IN12 | 0=OFF, 1=ON, or 0-65535 if port is configured as analog. See below for more information. |
Analog or digital input, with optional 10k pullup (pcb jumper) and optional internal pulldown (activated when configured as IN_DIGITAL_PULLDOWN). |
19 | NS | 0=max radiation from the "North" side (minimum tilt). 100=max radiation from the "South" side (maximum tilt). |
0-100% bar showing the deviation of the maximum NS radiation direction from the current tilt position |
20 | EW | 0=max radiation from East side. 100=max radiation from West side. |
0-100% bar showing the deviation of the maximum EW radiation direction from the current azimuth position |
21 |
Pns |
0=minimum tilt. 100=maximum tilt |
0-100% bar showing the current tilt position |
22 | Pew | 0=minimum azimuth (East). 100=maximum azimuth (West) |
0-100% bar showing the current azimuth position |
23 | Man | 0=Automatic mode. 1=Manual mode. |
If Off, tracker is in automatic tracking mode. |
255 | All input ports | bitmask: 1=> MN, 2=>MS, 4=>ME ... |
This address is used to check input state in one command |
256-273 | Port config | 1=OUT_DIGITAL, 2=OUT_RELAY_LP, ... |
Command used to configure port 1 (256), port 2 (257), ... as OUT_DIGITAL or OUT_RELAY_LP (low power consumption relay) or other value (see table below) |
512-529 | Port option | 0=NORMAL, 1=INVERTED (output normally ON, or input is ON when port voltage is 0V) | Set port option. If set to 1, output stays ON after boot until the port is asserted (then relays goes OFF). For inputs, setting INVERTED the port value is ON (1) when input voltage is 0V, OFF when input is left open with internal pullhigh enabled. |
8192 | Slave Address | 1-247 | Permits to change the slave address of the module, so it's possible to add other modules to the same bus |
8193 | Serial bitrate | 0=115200bps, 1=57600, 2=38400, 3=19200, 4=9600, 5=4800, 6=2400, 7=1200bps | Serial speed, default 115200 bps 8,n,1 |
8194 | Serial parity | 0=None, 1=Even, 2=Odd | Serial parity, default none (115200 bps 8,n,1) |
8198 | Revision, major | Read only | Get firmware version, major number. For example "02" means that revision is "02XX" where XX defined by parameter 8199 |
8199 | Revision, minor | Read only | Get firmware version, minor number. For example "h1" means that revision is "XXh1" where XX defined by parameter 8198 |
It's possible to activate one or more outputs for a certain amount of time (monostable/timer output) as indicated in the table. The parameter corresponding to the needed time can be computed using the following rules:
From 0 to 60s => 31.25ms resolution 2=62.5ms, 3=93.75ms, ... 1920=60s => value=time_in_milliseconds/31.5
From 1m to 1h with 1s resolution 1921=61s, 3540+1920=5460=1h => value=(time_in_seconds-60)+1920
From 1h to 1d with 1m resolution 5461=1h+1m, 1380+5460=6840=24h => value=(time_in_minutes-60)+5460
From 1d to 1500 days with 1h resolution 6841=25h, 6842=26h, and so on => value=(time_in_hours-24)+6840
The following tables show some Modbus commands examples.
Slave Addr | Func. Code | Reg.Addr | Reg.Value | Frame | Description |
56 | 06 | 8192 | 1 | [37][06][20][00][00][01][xx][xx] | Change slave address from 54 (0x36) to 1 |
01 | 06 | 8193 | 4 | [01][06][20][01][00][04][D2][09] | Set serial speed to 9600bps |
01 | 06 | 8194 | 1 | [01][06][20][02][00][01][E2][0A] | Set even parity |
49 | 10 | 8192 | 1,4,1 | [31][10][20][00][00][03][06][00][01][00][04][00][01][B1][71] | With a single command, set slave address to 1, serial speed to 9600bps, even parity. Original modules address was 49 (0x31) in this example. |
01 | 06 | 0 | 65280 | [01][06][00][00][FF][00][C8][3A] | Activate RL1 output forever (65280=0xff00) |
01 | 06 | 1 | 960 | [01][06][00][01][03][C0][D8][AA] | Activate RL2 for 960/32=30s |
01 | 06 | 255 | 0 | [01][06][00][FF][00][00][B9][FA] | Disable all outputs (Reg.Addr=255) |
01 | 10 | 0 | 32,0,0,65280 | [31][10][00][00][00][04][08][00][20][00][00][00][00][FF][00][E6][5C] | Set RL1 On for 1s (32), RL2 Off, RL3 Off, RL4 On - Max 10 registers can be set in one command |
01 | 03 | 255 | 1 | [01][03][00][FF][00][01][B4][3A] | Read a 16bit value with ports status. For example if returned value is 0xd1 (0b11010001), output status is: RL8=On, RL7=On, RL6=Off, RL5=On, RL4=Off, RL3=Off, RL2=Off, RL1=On |
01 | 03 | 8198 | 2 | [01][03][20][06][00][02][2F][CA] | Read 4 bytes within module version. For example, if returned value is <30><32><68><31> (in hex format), the corresponding ASCII value is "02h1" (Firmware 02h1) |
01 | 0F | 0 | 8,1,0xd1 | [01][0F][00][00][00][08][01][D1][3E][C9] | Set coil status to 0xd1 (0b11010001), activating RL8, RL7, RL5, RL1 and disabling other relays |
01 | 01 | 0 | 8 | [01][01][00][00][00][08][3D][CC] | Read coil status. If returned value is 0xd1 (0b11010001), it means that RL8, RL7, RL5 and RL1 are On |
Modbus protocol can be tested easily using a modbus program, like mbpoll for Linux:
mbpoll -v -m rtu -0 -1 -a1 -b115200 -Pnone -r 0 /dev/ttyUSB0 32 0 64 128 0 0 0 65280
to activate RL1 for 1s, R3 for 2s, RL4 for 4s and RL8 forever.
mbpoll -v -m rtu -0 -1 -a1 -b115200 -Pnone -r 255 -c 1 /dev/ttyUSB0
to read all port states.
Configurable parameters
The following parameters can be configured by the user to set motor working times and get the tracker working as preferred.
Parameter name | Description | Range | Default | DomBus | Modbus |
PeriodicTrackerCheck | Time to wait before moving the motors again, during tracking | 10-600 seconds | 60 | INIT=60 on port Man | |
TrackerSensorMin | Threshold for sensors N+S to distinguish between night and day | 16-16384 | 2048 | INIT=2048 on port S | |
TrackerNightTime | Time to wait from night detection before moving to the night position | 60-43200 seconds | 600 | INIT=600 on port W | |
TrackerNightPercNS | Night tilt position (0-100%) | 0-100 | 20 | INIT=20 on port MN | |
TrackerNightPercEW | Night azimuth position (0-100%) | 0-100 | 0 | INIT=0 on port ME | |
WorkingTimeNS | Tilt actuatator working time | 10-600 seconds | 100 | INIT=100 on port Pns | |
WorkingTimeEW | Azimuth actuatator working time | 10-600 seconds | 100 | INIT=100 on port Pew |