Questa è una vecchia versione del documento!


Geekworm Power Pack Pro V1.1 UPS HAT


Questa guida è riferita esclusivamente alla versione Pro v1.1 di questa scheda. La versione 1.0 ha infatti diversi problemi che ne pregiudicano un possibile utilizzo come UPS


Si tratta di una scheda di espansione progettata appositamente per Raspberry Pi, che permette di utilizzare il Raspberry Pi alimentato tramite batteria al litio, svolgendo quindi una funzione di UPS per il Raspberry.

Per problemi a riguardo discutiamone qui: Script RPI Power Pack Hat Pro V1.1 with MeterN

Per approfondimenti sulla scheda: Power Pack Pro WIKI


La versione Pro V1.1 può essere utilizzata con successo come UPS. Rimane comunque un piccolo bugs della scheda:
In caso di spegnimento del raspberry, per riaccenderlo è necessario spegnere l'UPS tenendo premuto il suo pulsante e poi riaccenderlo ripremendolo.
E' direi l'unica pecca che è rimasta a questo dispositivo.


  • Supporta l'interfaccia I2C con la possibilità di lettura della capacità e della tensione della batteria
  • Supporta la ricarica durante la scarica (la corrente massima di uscita può arrivare a 1,8 A durante la ricarica, ma in tal caso sarà necessario applicare un dissipatore sul chip per via delle elevate temperature che può raggiungere)
  • 4 LED indicatori della capacità di carica
  • Dimensione standard di Raspberry Pi HAT
  • Due modalità di alimentazione: GPIO power output e USB power out
  • Batteria rimovibile: batteria al litio 3,7 V
  • Carica intelligente a 3 stadi (mantenimento, corrente costante, tensione costante), che può prolungare efficacemente la durata della batteria
  • Gestione automatica ed intelligente del sistema di carica
  • Corrente di scarica massima: 2 A
  • Corrente di carica massima: 1,8 A
  • Protezione uscita: sovracorrente, cortocircuito, sottovoltaggio
  • Protezione ingressi: sovravoltaggio, sovraccarico, sottovoltaggio



Nell'immagine Solarstretch 3.1 ho aggiunto un file /var/www/MyScripts/ups/upshat.py per gestire la scheda aggiuntiva per il Raspberry RPI Power Pack Hat Pro V1.1, che svolge la funzione di UPS.

Script for RPI Power Pack Hat Pro V1.1 with MeterN
upshat.py rev. 1.1

Il contenuto dello script è:

/var/www/MyScripts/ups/upshat.py
#!/usr/bin/python
#
# Script for RPI Power Pack Hat Pro V1.1 with MeterN
#
# upshat.py  rev. 1.1
#
# enable I2C via raspi-config
# sudo apt-get install i2c-tools
# sudo apt-get install python-smbus
# sudo apt-get install python-requests
# ln -s /var/www/MyScripts/ups/upshat.py /usr/bin/ups
# i2cset -y 1 0x62 0x0A 0x00      Wake-up the device I2C function; MODE register address 0x0A set to 0x00
# 
#
# History
#
# 29-04-2018: Rilascio versione v1.0
#
#  - Versione iniziale
#
# 29-05-2018: Rilascio vesrione v1.1
#
#  	- Aggiunto controllo per mancata lettura 
#     Modifica nome file temporaneo svincolato da n. di misuratore
#
#
#  	Lo script legge tramite bus i2C il valore di tensione e capacita della batteria
#  	della scheda RPI Power Pack Hat Pro V1.1 
#  	https://www.banggood.com/Geekworm-Power-Pack-Pro-V1_1-Lithium-Battery-Power-Source-UPS-HAT-Expansion-Board-For-Raspberry-Pi-p-1205973.html?rmmds=search&cur_warehouse=CN
#	Lo script effettua un controllo ogni 60s sulla capacita della batteria ed invia delle
# 	notifiche push sul cellulare tramite il servizio gratuito RPINotify (Telegram) 
#	nei seguenti casi:
#   1 capacita < 95% notifica il funzionamento a batteria
#	2 avviso per capacita residua < 20%
#	3 avviso per capacita residua < 5% e successivo spegnimento del Raspberry-Pi
#
#  	Le letture vengono salvate nel file temporaneo /dev/shm/ups.txt pronte per 
#  	essere poi lette e formattate tramite reqsdm e visualizzate in MeterN 
#
#	A seguire le righe da aggiungere a /var/www/comapps/reqsdm.php per leggere la tensione
#	(con il comando reqsdm bat_ten) e la capacita della batteria (con il comando reqsdm bat_cap)
#
#	} elseif ($argv[1] == 'bat_ten') {
#		$outstr =  exec('cat /dev/shm/ups.txt | grep "*V)"');
#	} elseif ($argv[1] == 'bat_cap') {
#		$outstr =  exec('cat /dev/shm/ups.txt | grep "*%)"');
#
 
import struct
import smbus
import sys
import os
import time
import requests
 
# 	Inserire il token per l'invio dei messaggi con RPInotify - Lasciare vuoto se non si utilizza il servizio di notifica
TOKEN = ""
 
#
# 	da qui in poi non sono necessarie modifiche
#
file = "/dev/shm/ups.txt"
control20 = 0
control95 = 0
controlNOK = 0
 
sys.stdout=open(file,"w")
print "ups_1(0*V)"  # Tensione
print "ups_2(0*%)" # Capacita
sys.stdout.close()
 
while True:
	def readVoltage(bus):
		"This function returns as float the voltage from the Raspi UPS Hat via the provided SMBus object"
		address = 0x62
		read = bus.read_word_data(address, 2)
		swapped = struct.unpack("<H", struct.pack(">H", read))[0]
		voltage = swapped * 305.0 /1000000
		return voltage
 
	def readCapacity(bus):
		"This function returns as a float the remaining capacity of the battery connected to the Raspi UPS Hat via the provided SMBus object"
		address = 0x62
		read = bus.read_word_data(address, 4)
		swapped = struct.unpack("<H", struct.pack(">H", read))[0]
		capacity = swapped/256
		return capacity
 
	bus = smbus.SMBus(1)  # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)
 
	sys.stdout=open(file,"w")
	print "ups_1({0:0.2f}*V)".format(readVoltage(bus))   # Tensione
	print "ups_2({0:0.0f}*%)".format(readCapacity(bus)) # Capacita %
	sys.stdout.close()
 
	# Controllo lettura NO OK
	if readVoltage(bus) == 0 and controlNOK == 0:
			MSG = "RPI UPS Hat - Lettura UPS Hat NON FUNZIONANTE - Necessario comando  i2cset  -y  1  0x62  0x0A  0x00"
			req = requests.post('https://api.rpinotify.it/message/' + TOKEN + '/', data={'text': MSG})
			controlNOK = 1
 
	# Notifiche con RPINotify
	if TOKEN != "" and readVoltage(bus) > 0:
		if readCapacity(bus) > 20:
			control20 = 0
			controlNOK = 0
 
		if readCapacity(bus) <= 20 and control20 == 0:
			MSG = "RPI UPS Hat - ATTENZIONE Batteria residua 20%"
			req = requests.post('https://api.rpinotify.it/message/' + TOKEN + '/', data={'text': MSG})
			control20 = 1
			#print(req.text)
 
		if readCapacity(bus) > 95:
			control95 = 0
 
		if readCapacity(bus) <= 95 and control95 == 0:
			MSG = "RPI UPS Hat - Funzionamento a batteria - Batteria residua 95%"
			req = requests.post('https://api.rpinotify.it/message/' + TOKEN + '/', data={'text': MSG})
			control95 = 1
 
	# Shutdown system
	if readCapacity(bus) < 5 and readVoltage(bus) > 0:
		#print "System will shutdown now,bye!"
		os.system("sudo poweroff")
		sys.exit(1)
	time.sleep(60)


QUI è possibile scaricare lo script v 1.1


Come riportato nello script stesso, lo script legge tramite bus i2C il valore di tensione e capacita della batteria della scheda RPI Power Pack Hat Pro V1.1

Lo script effettua un controllo ogni 60s (per non stressare troppo il Raspi) sulla capacita della batteria ed invia delle notifiche push sul cellulare tramite il servizio gratuito RPINotify (Telegram) nei seguenti casi:

  1. capacita < 95% notifica il funzionamento a batteria
  2. avviso per capacita residua < 20%
  3. con capacita residua < 5% esegue lo spegnimento del Raspberry-Pi per evitare possibili danneggiamenti della scheda SD in seguito ad un improvviso spegnimento per fine batteria.


Le letture vengono salvate nel file temporaneo /dev/shm/ups.txt pronte per essere poi lette tramite reqsdm e visualizzate in MeterN.
Il contenuto del file è formattato come di seguito:

ups_1(4.17*V)
ups_2(100*%)

Come prima cosa è necessario attivare la funzione i2c dell'hat con il comando:

i2cset -y 1 0x62 0x0A 0x00

Questo comando va eseguito solo la prima volta ed eventualmente successivamente solo nel caso che per qualche motivo scollegate la batteria dalla scheda.


Per abilitare l'avvio automatico al boot del servizio:

sudo systemctl enable upshat.service
sudo reboot


A riavvio avvenuto è possibile controllare lo stato del servizio:

sudo systemctl status upshat.service


Se il servizio è stato correttamente avviato si avrà una risposta del tipo:

root@raspberrypi:~# sudo systemctl status upshat.service
● upshat.service - RPI UPS Hat Service
   Loaded: loaded (/etc/systemd/system/upshat.service; enabled)
   Active: active (running) since sab 2017-10-07 11:54:23 CEST; 1min 19s ago
 Main PID: 674 (python)
   CGroup: /system.slice/upshat.service
           └─674 /usr/bin/python /home/pi/ups/UPS-HAT.py

ott 07 11:54:23 raspberrypi systemd[1]: Started RPI UPS Hat Service.


E' necessario editare il file /var/www/comapps/reqsdm.php per aggiungere i comandi per la lettura dei valori di capacità e tensione della batteria che potranno essere utilizzati da MeterN.

Per fare ciò sarà necessario editare il file reqsdm.php:

sudo nano /var/www/comapps/reqsdm.php

ed aggiungere opportunamente le seguenti righe:

/var/www/comapps/reqsdm.php
      } elseif ($argv[1] == 'bat_ten') {
         $outstr =  exec('cat /dev/shm/ups.txt | grep "*V)"');
      } elseif ($argv[1] == 'bat_cap') {
         $outstr =  exec('cat /dev/shm/ups.txt | grep "*%)"');

Queste permetteranno di leggere la tensione (con il comando reqsdm bat_ten) e la capacita della batteria (con il comando reqsdm bat_cap)

Infine per avere in MeterN un indicatore con la tensione della batteria ed uno con la capacità della batteria:
Questo è il risultato a batteria completamente carica:

  • power_pack_pro.1561554866.txt.gz
  • Ultima modifica: 2019/06/26 15:14
  • da flane