| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .gitignore | ||
| docker-compose.cc100.yml | ||
| docker-compose.pi.yml | ||
| docker-compose.yml | ||
| pivot.env.example | ||
| README.md | ||
Pivot controller
A centre-pivot irrigation controller in one container. It runs on a WAGO CC100, a Raspberry Pi or any Linux PC. The image is public: no login is needed to pull it.
git.ybmit.au/ybmit-public/pivot:0.3.1
| Machine | Docker platform | IO |
|---|---|---|
| WAGO CC100 | linux/arm/v7 |
the CC100's own inputs and outputs, directly (no CODESYS needed) |
| Raspberry Pi 3/4/5, 64-bit OS | linux/arm64 |
a T3 module; E22 LoRa radio, GPS and camera on the Pi |
| Raspberry Pi, 32-bit OS | linux/arm/v7 |
as above, no camera |
| PC, server or VM | linux/amd64 |
a T3 module, or none (bench/demo) |
Docker pulls the right variant by itself.
Quick start
git clone https://git.ybmit.au/ybmit-public/pivot.git && cd pivot
cp pivot.env.example pivot.env && nano pivot.env # PIN and control key
Then start it with your machine's file (below) and open http://<machine-ip>:1880. The
browser asks for the control key the first time you press a button; the System tab
asks for the PIN.
| Machine | Compose file |
|---|---|
| WAGO CC100 | docker-compose.cc100.yml |
| Raspberry Pi with the LoRa radio | docker-compose.pi.yml |
| PC, server, VM (or IO on the network) | docker-compose.yml |
Each file is complete on its own. Port 1880 already taken by another app? Change the
left number of ports: in the file, e.g. "8080:1880".
WAGO CC100
docker compose -f docker-compose.cc100.yml up -d
The pivot drives the CC100's inputs and outputs itself, through the controller's own Linux interface. Nothing else should drive them, so set the CC100's PLC runtime to none (no CODESYS program running).
Within a few seconds Diagnostics shows IO module: cc100-onboard …, and
docker exec pivot cat /cc100/dout_drv/DOUT_DATA shows the output word.
| Channel | Use |
|---|---|
| DO1-DO7 | forward, reverse, strobe, main valve, mids, end walk, align |
| DI4, DI5 | panel REV and FWD switches (System → Panel switches) |
| AI1 | centre pressure: YBMITS_PIVOT_PRESSURE_CH=9, with YBMITS_PIVOT_CC100_AI_SHUNT_OHMS for a 4-20 mA transmitter |
A CC100 that already runs a CODESYS program serving the IO over Modbus also works: use
docker-compose.yml and set YBMITS_PIVOT_IO_DRIVER=cc100-modbus.
No compose on the CC100? The same as one command:
docker run -d --name pivot --restart unless-stopped --user 0:0 -p 1880:1880 \
--env-file pivot.env -e YBMITS_PIVOT_DATA_DIR=/var/lib/ybmits \
-e YBMITS_PIVOT_HTTP_BIND=0.0.0.0:1880 -e YBMITS_PIVOT_IO_DRIVER=cc100-onboard \
-e YBMITS_PIVOT_CC100_DOUT=/cc100/dout_drv/DOUT_DATA -e YBMITS_PIVOT_CC100_CALIB=/cc100/calib \
-v /sys/kernel/dout_drv:/cc100/dout_drv -v /etc/calib:/cc100/calib:ro \
-v pivot-data:/var/lib/ybmits --stop-timeout 20 --log-opt max-size=5m --log-opt max-file=3 \
git.ybmit.au/ybmit-public/pivot:0.3.1
Raspberry Pi
docker compose -f docker-compose.pi.yml up -d
- Pi 5: in
docker-compose.pi.yml, change/dev/gpiomemto/dev/gpiomem0. - Serial port:
sudo raspi-config→ Interface Options → Serial Port: login shell off, hardware port on. Reboot. - IO:
YBMITS_PIVOT_IO_DRIVER=t3andYBMITS_PIVOT_T3_ADDR=<module address>. - Endspan node:
YBMITS_PIVOT_ROLE=endspan; uncomment the GPS lines indocker-compose.pi.ymlandYBMITS_PIVOT_GPS_PORTinpivot.env. Pair it on System → Link security: the same passkey on both nodes, Join on the span, Adopt on the centre. - Groups: the device groups are given by number (
dialout20,gpio997). Check withgetent group dialout gpio.
PC, server or VM
docker compose up -d
- With a T3 module:
YBMITS_PIVOT_IO_DRIVER=t3andYBMITS_PIVOT_T3_ADDR. - Bench or demo, no hardware:
YBMITS_PIVOT_IO_DRIVER=none, and addcommand: ["--standalone"]underpivot:indocker-compose.ymlso it runs without the span nodes.
Settings and updates
- Backup and restore: System → Backup & restore.
- Update: change the
image:tag in your machine's compose file, thendocker compose -f <file> pull && docker compose -f <file> up -d. Settings, history and the applied-water map live in thepivot-datavolume and survive updates.
Troubleshooting
| You see | Fix |
|---|---|
unauthorized when pulling |
An old login on this machine: docker logout git.ybmit.au. Public images need none. |
exec format error |
An image pulled for another CPU: docker image rm git.ybmit.au/ybmit-public/pivot:0.3.1, pull again. |
| Every button is refused | YBMITS_PIVOT_HTTP_TOKEN is not set, or the browser has the wrong key. |
IO module: none |
No module found: check YBMITS_PIVOT_IO_DRIVER, and that you started with your machine's compose file. |
port is already allocated |
Another app has 1880: change the left number of ports:. |
| CC100 outputs flicker or won't hold | Something else is driving them: set the PLC runtime to none. |
lora mode pins unavailable (Pi) |
Start with docker-compose.pi.yml (Pi 5: /dev/gpiomem0). |
cc100 onboard I/O: … Permission denied |
The CC100 file was not mounted writable, or the container is not root: use docker-compose.cc100.yml as is. |
Safety
- Outputs start off. If the IO stops responding, the run stops.
docker stopswitches every output off before the app exits.- A power cut or
kill -9leaves the outputs as they were last set. That needs an external interlock.