Publish PiJuice UPS information to MQTT for consumption by, for example, Node-RED and Home Assistant
The PiJuice UPS hats by PiSupply make very nice battery backups for Raspberry Pi's. I use mine so that Home Assistant (HA) continues to run during Loadshedding in South Africa, and to correctly shut down the Pi when the battery runs low.
Existing Node-RED and HA integrations assume Node-RED and HA are running on the same Pi that has the PiJuice. This doesn't work when running in Docker Swarm mode (as I do). I wanted a service that runs on each Pi and publishes PiJuice stats to MQTT. From there I can monitor battery level, and start automations when the Pi loses or regains wall power.
This installation assumes that you already have the pijuice_cli working. To test this, on your command line type pijuice_cli and you should be presented with the PiJuice CLI. If not, follow the Installation Guide.
- Either clone or download this repo into a folder on your Pi
git clone [email protected]:dalehumby/PiJuice-MQTT.git - Open the folder
cd PiJuice-MQTT - Rename the config file
mv config.yaml.example config.yaml - Open the
config.yamlfile and change the MQTT broker IP/hostname and the broker username/password. If no username/password is required to use your broker then delete theusernameandpasswordlines - Add the required libraries
pip3 install -r requirements.txt - To test the code is working, on the command line enter
python3 pijuicemqtt.py. You should not see any errors or stack traces
Every 30 seconds the script published to the topic pijuicemqtt/<yourpihostname>/status, typically pijuicemqtt/raspberrypi/status if you use the default hostname on your Pi.
Example payload:
{
"batteryCharge": 99,
"batteryVoltage": 4.161,
"batteryCurrent": -0.427,
"batteryTemperature": 47,
"batteryStatus": "NORMAL",
"powerInput": "NOT_PRESENT",
"powerInput5vIo": "PRESENT",
"ioVoltage": 5.123,
"ioCurrent": 0.21
}The titles and values come directly from the PiJuice Python library and are unaltered, except for changing mA and mV to A and V. For details see PiSupply's I2C Command API and their Python code.
Briefly:
batteryChargeis percent 0 to 100 %batteryVoltageis typically 3.2 V min and 4.2 V maxbatteryCurrentis the charging/discharge of the battery. Negative means in to the batterybatteryTemperaturein degrees CelsiusbatteryStatuswhereNORMALis fully charged, andCHARGING_FROM_INorCHARGING_FROM_5V_IOwhile charging from USB, depending on whether the source is the PiJuice USB (IN) or Pi's USB (5V_IO)powerInputwill bePRESENTif USB is plugged into the PiJuice hatpowerInput5vIowill bePRESENTif USB is plugged into the Raspberry Pi board (as it is here), and the PiJuice is getting power via the headers on the PiioVoltageis the Pi's 5 V rail. Should be 5.0 V to max 5.25 VioCurrentis current flowing to/from the Raspberry Pi. Negative means from the PiJuice to Pi; Positive from the Pi to PiJuice
The stats above show that the battery is fully charged, and the boards are powered via the USB connector on the Raspberry Pi. There are no errors and all voltages look good.
To automatically add the PiJuice device and entities to Home Assistant, in config.yaml set the homeassistant topic and sensor: true. (You will also need the MQTT Integration setup in Home Assistant.)
A device called <youpihostname> PiJuice will be added to the device registry, along with two entities:
<youpihostname> PiJuice Batterybattery charge percentage as asensor<youpihostname> PiJuice PowerInput5vIostatus of the 5 V IO power input as abinary_sensor, whereoffmeans no power, andonmeans wall power is present
All information from the MQTT payload is added as an attribute to the sensors so you can get more detailed info like voltages and currents, if you need them.
You can then show this information to your Lovelace dashboards, add badges and automations.
To run pijuicemqtt.py as a background service on the Pi:
- Create the service file
sudo cp pijuicemqtt.service /lib/systemd/system/pijuicemqtt.service - Open the service file
sudo nano /lib/systemd/system/pijuicemqtt.service - Change the paths in
WorkingDirectoryandExecStartto the location ofpijuicemqtt.py. Also check thepythonpath is correct. Save and exit
Then on the command line:
sudo systemctl daemon-reloadsudo systemctl enable pijuicemqtt.servicesudo systemctl start pijuicemqtt.servicesudo systemctl status pijuicemqtt.service
You should see something like:
● pijuicemqtt.service - PiJuice to MQTT
Loaded: loaded (/lib/systemd/system/pijuicemqtt.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2021-06-06 09:03:24 UTC; 4s ago
Main PID: 1548 (python3)
Tasks: 2 (limit: 4915)
CGroup: /system.slice/pijuicemqtt.service
└─1548 /usr/bin/python3 /media/cluster/config/PiJuice-MQTT/pijuicemqtt.py
Jun 06 09:03:24 homepi systemd[1]: Started PiJuice to MQTT.
The background service is now running and will continue to publish to MQTT every 30 seconds. The script will restart if it crashes, and after Pi restart.
You can stop the script by sudo systemctl stop pijuicemqtt.service