• Stars
    star
    129
  • Rank 279,262 (Top 6 %)
  • Language
    C
  • License
    GNU General Publi...
  • Created over 9 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Access library, command line tool and daemon for the LiFePO4wered/Pi module

LiFePO4wered-Pi

Access library, command line tool and daemon for the LiFePO4wered/Pi+ and legacy LiFePO4wered/Pi and LiFePO4wered/Pi3 modules

Installation

Starting from a fresh Raspbian image, first install the build-essential, git and the systemd support library packages:

sudo apt-get -y install build-essential git libsystemd-dev

In a directory where you keep source code, clone the LiFePO4wered-Pi repository from GitHub:

git clone https://github.com/xorbit/LiFePO4wered-Pi.git

Get in to the source code directory:

cd LiFePO4wered-Pi/

Build the code:

make all

And install it:

sudo make user-install

That's it! You may need to restart for some configuration changes (such as enabling the I2C device) to take effect.

Legacy build scripts

The build and install commands were changed from what they originally were. To prevent confusion for people not reading this but following installation instructions in older manuals, build.py and INSTALL.sh are provided that just call the make commands above for legacy compatibility.

Daemon

The installation command installs a background program (lifepo4wered-daemon), along with scripts to start it. You can also start the daemon manually, it will by default run in the background, but you can force it to run in the foreground by adding the -f argument.

The daemon supports startup via systemd, including its notification and keepalive features. See man systemd.service for details.

If you do not want to include systemd support in the daemon, you can build the code with:

make all USE_SYSTEMD=0

CLI

The lifepo4wered-cli tool provides convenient access to the LiFePO4wered device's I2C registers. Run it without parameters to get help information:

lifepo4wered-cli

To get a full dump of all register values, try:

lifepo4wered-cli get

To get the current battery voltage in millivolts, try:

lifepo4wered-cli get vbat

To set the wake up time to an hour, run:

lifepo4wered-cli set wake_time 60

To set the auto-boot flag to make the Pi run whenever there is power to do so, but still be able to turn the Pi off with the button or from software, run:

lifepo4wered-cli set auto_boot 2

To make this change permanent by saving it to flash, run:

lifepo4wered-cli set cfg_write 0x46

The 0x46 value is a magic key to allow config flash writes.

Adjusting some of the register values can cause problems such as not being able to turn on the system using the touch button. To prevent permanently bricking the LiFePO4wered device, always test your changes thoroughly before writing them to flash. If you made a change that makes your LiFePO4wered device not work correctly, and it is not written to flash, you can undo it by unplugging the LiFePO4wered device and removing the LiFePO4 cell from the battery holder for a couple of minutes. The LiFePO4wered device should revert to its previous last saved state when you put the battery back.

Check out the product brief for the LiFePO4wered/Pi+ or legacy LiFePO4wered/Pi or LiFePO4wered/Pi3 devices for a complete list of registers and valid values and options available in each product. Alternatively, running lifepo4wered-cli get returns a dump with all valid registers for the connected device.

Permissions

The user running the lifepo4wered-cli tool needs to have sufficient privileges to access the I2C bus. On Raspbian, the pi user by default can access the bus because it is in the i2c group. If you run as a different user, you either need to add this user to the i2c group or run the tool with sudo. On other distributions, a different group name may be used. You can check the owner and group of the I2C device with:

ls -l /dev/i2c-1

The command line tool returns the following negative values to indicate error conditions:

Return value Condition
-1 Could not access the LiFePO4wered device to perform the specified operation. Usually this condition is caused by insufficient privileges when trying to access the I2C bus. Trying to run the command as root or with sudo to fix the problem. When writing settings, this value is also returned if a register is not writable.
-2 The I2C bus could be accessed and the operation is valid, but communication with the LiFePO4wered device failed. After trying several times (20 by default), the I2C bus transaction could not be completed successfully. This happens if the LiFePO4wered device is not physically present or if something (possibly another HAT) is preventing the I2C bus from operating correctly.

Balena

The included Dockerfile can be used to compile the daemon as a Balena compatible service. Typically this would be used in a multicontainer setup where the LiFePO4wered service would be separate from your application container(s). The Dockerfile uses the USE_BALENA=1 make parameter to alter the shutdown command to send a shutdown request to the Balena supervisor container and runs the daemon code in foreground mode using the -f flag.

The included Dockerfile uses a 64-bit Raspberry Pi 4 base image, if you are using a different Pi or 32-bit Balena base OS, you need to alter the base image in both ("build" and "run") FROM lines.

A docker-compose.yml file such as the one below should be created to include the LiFePO4wered service in your application, make it privileged (to access the I2C bus and set system time), and give it access to the supervisor API:

version: '2'
services:
  your-own-application-service:
    build: ./balena-node-hello-world
    ports:
      - "80:80"
  lifepo4wered-pi:
    build: ./LiFePO4wered-Pi
    privileged: true
    labels:
      io.balena.features.supervisor-api: '1'

If your application needs access to the LiFePO4wered device, the easiest approach may be to include the lifepo4wered-cli or liblifepo4wered.so with language bindings in your application's container, building it using the multistage approach demonstrated in our Dockerfile. Make sure you then also give your own application access to the I2C bus.