Pivot controller (YBM-ITS) - public image for WAGO CC100 (arm/v7), Raspberry Pi (arm64/arm/v7) and PC (amd64), with Compose files and install guide. No login needed.
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-11-04 18:43:22 +11:00
.gitignore Pivot controller for the WAGO CC100: Compose file, env template and install guide 2026-11-04 18:11:27 +11:00
docker-compose.cc100.yml Compose: one complete file per machine (CC100, Pi, PC) instead of overrides; docker run for a CC100 without compose 2026-11-04 18:43:22 +11:00
docker-compose.pi.yml Compose: one complete file per machine (CC100, Pi, PC) instead of overrides; docker run for a CC100 without compose 2026-11-04 18:43:22 +11:00
docker-compose.yml Compose: one complete file per machine (CC100, Pi, PC) instead of overrides; docker run for a CC100 without compose 2026-11-04 18:43:22 +11:00
pivot.env.example 0.3.1: CC100 onboard IO with no CODESYS (docker-compose.cc100.yml); leaner README for every architecture 2026-11-04 18:40:48 +11:00
README.md Compose: one complete file per machine (CC100, Pi, PC) instead of overrides; docker run for a CC100 without compose 2026-11-04 18:43:22 +11:00

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/gpiomem to /dev/gpiomem0.
  • Serial port: sudo raspi-config → Interface Options → Serial Port: login shell off, hardware port on. Reboot.
  • IO: YBMITS_PIVOT_IO_DRIVER=t3 and YBMITS_PIVOT_T3_ADDR=<module address>.
  • Endspan node: YBMITS_PIVOT_ROLE=endspan; uncomment the GPS lines in docker-compose.pi.yml and YBMITS_PIVOT_GPS_PORT in pivot.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 (dialout 20, gpio 997). Check with getent group dialout gpio.

PC, server or VM

docker compose up -d
  • With a T3 module: YBMITS_PIVOT_IO_DRIVER=t3 and YBMITS_PIVOT_T3_ADDR.
  • Bench or demo, no hardware: YBMITS_PIVOT_IO_DRIVER=none, and add command: ["--standalone"] under pivot: in docker-compose.yml so 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, then docker compose -f <file> pull && docker compose -f <file> up -d. Settings, history and the applied-water map live in the pivot-data volume 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 stop switches every output off before the app exits.
  • A power cut or kill -9 leaves the outputs as they were last set. That needs an external interlock.