#!/bin/sh # # For the CHIP Computer AXP09 Power mangement IC # # Original: # Jeff Brown http://photonicsguy.ca/projects/chip # https://github.com/Photonicsguy/CHIP # Version 1.0 (April 5th, 2016) # # # This version cloned from, with modifications: # https://github.com/ondsinet/chip/tree/master/Programs/chipmonk # if [ "$1" == "-d" ]; then DAEMON="1" else DAEMON="0" fi BATTERY_VALUE= #% BATTERY_STATE= #connected/CHARGING/DISCHARGING/charged BATTERY_VOLT= BATTERY_CURR= POWER_SOURCE= USB_VOLT= USB_CURR= CHG_VOLT= CHG_CURR= TEMPERATURE_VALUE= TEMPERATURE_PRINT= UPTIME_VALUE= SENSOR_READ_FREQUENCY=5 FREQ_DIV=2 REPORT_TXT= read_config(){ BATTERY_SHUT_VALUE= BATTERY_WARN_VALUE= BATTERY_WARN_GPIO_VALUE=0 TEMPERATURE_SHUT_VALUE= TEMPERATURE_WARN_VALUE=50 if [ -f /usr/local/etc/chipmonk.cfg ]; then : source /usr/local/etc/chipmonk.cfg else : #chipmonk_error "can't find /usr/local/etc/chipmonk.cfg" source ./chipmonk.cfg fi } check_i2c_installed(){ # Need to communicate with AXP209 via I2C commands if [ ! -x /usr/sbin/i2cget -o ! -x /usr/sbin/i2cset ]; then : chipmonk_error "need i2c-tools" "Use: sudo apt-get install i2c-tools" fi } chipmonk_cleanup(){ return 0 } chipmonk_stop(){ chipmonk_cleanup echo "chipmonk: stopped" exit } chipmonk_error(){ chipmonk_cleanup while [ -n "$1" ]; do : echo "chipmonk: $1" shift # get next error string into $1 done exit 1 } read_AXP(){ #reads values from the power ic # Enable ADC registers i2cset -y -f 0 0x34 0x82 0xff ## REGISTER 00 ## REG=$(i2cget -y -f 0 0x34 0x00) STATUS_VCHG=$(($(($REG&0x80))/128)) STATUS_VCHG_AVAIL=$(($(($REG&0x40))/64)) STATUS_VUSB=$(($(($REG&0x20))/32)) STATUS_VUSB_AVAIL=$(($(($REG&0x10))/16)) #STATUS_VHOLD=$(($(($REG&0x08))/8)) STATUS_BAT_DIR=$(($(($REG&0x04))/4)) #ACVB_SHORT=$(($(($REG&0x02))/2)) #STATUS_BOOT=$(($REG&0x01)) ##POWER_SOURCE= $((STATUS_VCHG_AVAIL+STATUS_VUSB_AVAIL)) POWER_SOURCE=0 [ $STATUS_VCHG_AVAIL == 1 ] || [ $STATUS_VUSB == 1 ] && POWER_SOURCE=1 ## REGISTER 01 ## REG=$(i2cget -y -f 0 0x34 0x01) #STATUS_OVRTEMP=$(($(($REG&0x80))/128)) STATUS_CHARGING=$(($(($REG&0x40))/64)) STATUS_BATCON=$(($(($REG&0x20))/32)) #STATUS_=$(($(($REG&0x10))/16)) #STATUS_ACT=$(($(($REG&0x08))/8)) #STATUS_CUREXPEC=$(($(($REG&0x04))/4)) #STATUS_=$(($(($REG&0x02))/2)) #STATUS_=$(($REG&0x01)) #if [ $STATUS_OVRTEMP == 1 ]; then # echo "Over Temperature" #fi #if [ $STATUS_CHARGING == 1 ]; then # echo "Battery charging" #fi #echo "Battery connected: $STATUS_BATCON" if [ $STATUS_VCHG==1 ]; then # VCHG voltage REG=`i2cget -y -f 0 0x34 0x56 w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'` REG=`printf "%d" "$REG"` CHG_VOLT=`echo "$REG*0.0017"|bc` # VCHG Current REG=`i2cget -y -f 0 0x34 0x58 w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'` REG=`printf "%d" "$REG"` CHG_CURR=`echo "$REG*0.375"|bc` else CHG_VOLT='-' CHG_CURR='-' fi if [ $STATUS_VUSB==1 ]; then # VUSB voltage REG=`i2cget -y -f 0 0x34 0x5A w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'` REG=`printf "%d" "$REG"` USB_VOLT=`echo "$REG*0.0017"|bc` # VUSB Current REG=`i2cget -y -f 0 0x34 0x5C w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'` REG=`printf "%d" "$REG"` USB_CURR=`echo "$REG*0.375"|bc` else USB_VOLT='-' USB_CURR='-' fi BATTERY_STATE= if [ $STATUS_BATCON == 1 ]; then # Battery Voltage REG=`i2cget -y -f 0 0x34 0x78 w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'` REG=`printf "%d" "$REG"` BATTERY_VOLT=`echo "$REG*0.0011"|bc` if [ $STATUS_BAT_DIR == 1 ] || [ $POWER_SOURCE == 1 ]; then # Battery Charging Current REG=`i2cget -y -f 0 0x34 0x7A w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'` REG_C=`printf "%d" "$REG"` BATTERY_CURR=`echo "scale=2;$REG_C*0.5"|bc` BATTERY_STATE="Charging" else # Battery Discharge Current REG=`i2cget -y -f 0 0x34 0x7C w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'` REG_D=`printf "%d" "$REG"` BATTERY_CURR=`echo "scale=2;$REG_D*0.5"|bc` BATTERY_STATE="Discharging" fi # Battery % REG=`i2cget -y -f 0 0x34 0xB9` BATTERY_VALUE=`printf "%d" "$REG"` else BATTERY_VOLT='-' BATTERY_CURR='-' BATT_PERCENT='-' BATTERY_STATE="NO " fi # System (IPSOUT) Voltage (IPS is Intelligent Power Select) #REG=`i2cget -y -f 0 0x34 0x7E w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'` #REG=`printf "%d" "$REG"` #IPSOUT=`echo "$REG*0.0014"|bc` # Temperature REG=`i2cget -y -f 0 0x34 0x5E w|awk '{print "0x"substr($0,5,2)substr($0,4,1)}'` REG=`printf "%d" "$REG"` TEMPERATURE_PRINT=`echo "($REG*0.1)-144.7"|bc` TEMPERATURE_VALUE=`echo "($REG)-1447"|bc` #echo "Temperature: "$THERM"°C (I've seen as high as 65°C)" } read_stats(){ #reads cpu stats CPU='-' UPTIME_VALUE=$(uptime -p |sed 's/\/&time:/') #CPU=$(cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}') #CPU= `cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'` #echo "${CPU}" } compile_report(){ txt_PWR="Not Connected" if [ $POWER_SOURCE != 0 ];then txt_PWR="Connected" fi txt_VCHG="VCHG: $CHG_VOLT""V" if [ $CHG_CURR != 0 ];then txt_VCHG+=" "$CHG_CURR"mA" fi txt_VUSB="VUSB: $USB_VOLT""V" if [ $USB_CURR != 0 ];then txt_VUSB+=" "$USB_CURR"mA" fi txt_VBAT="VBAT: $BATTERY_VOLT""V" if [ $STATUS_BAT_DIR == 1 ]; then txt_VBAT+=" +"$BATTERY_CURR"mA" else txt_VBAT+=" -"$BATTERY_CURR"mA" fi read -r -d '' REPORT_TXT << EOM $UPTIME_VALUE Temp: $TEMPERATURE_PRINT°C Batt: $BATTERY_VALUE% $BATTERY_STATE Power Supply: $txt_PWR $txt_VCHG $txt_VUSB $txt_VBAT EOM } WARN_TEMP=0 WARN_BATT=0 WARN_POWR=0 WARN_IP=0 WARN_TEMP_DONE=0 WARN_BATT_DONE=0 WARN_POWR_DONE=0 WARN_IP_DONE=0 compile_warnings(){ #battery low if [ $WARN_BATT == 0 ] && (( BATTERY_VALUE < BATTERY_WARN_VALUE )); then WARN_BATT=1 echo "warn batt" gotify_alert "Chip-DC Warning" "Battery at $BATTERY_VALUE!" elif [ $WARN_BATT == 1 ] && (( BATTERY_VALUE > BATTERY_WARN_VALUE + 2 )); then WARN_BATT=0 echo "ok batt" gotify_alert "Chip-DC" "Battery is ok: $BATTERY_VALUE" fi #power disconnected if [ $WARN_POWR == 0 ] && [ $POWER_SOURCE == 0 ];then WARN_POWR=1 echo "warn pwr" gotify_alert "Chip-DC Warning" "Power Disconnected!" elif [ $WARN_POWR == 1 ] && [ $POWER_SOURCE == 1 ];then WARN_POWR=0 echo "ok pwr" gotify_alert "Chip-DC" "Power Reconnected." fi # echo $WARN_POWR #too hot if [ $WARN_TEMP == 0 ] && (( TEMPERATURE_VALUE > TEMPERATURE_WARN_VALUE )); then WARN_TEMP=1 echo "warn TEMP" gotify_alert "Chip-DC Warning" "Temperature is $TEMPERATURE_PRINT°C!" elif [ $WARN_TEMP == 1 ] && (( TEMPERATURE_VALUE < TEMPERATURE_WARN_VALUE - 20 )); then WARN_TEMP=0 echo "ok TEMP" gotify_alert "Chip-DC" "Temperature ok. $TEMPERATURE_PRINT°C" fi # echo $TEMPERATURE_WARN_VALUE # echo $TEMPERATURE_VALUE # echo $WARN_TEMP } ### Entry Point #### check_i2c_installed ######################################### read_config read_AXP read_stats compile_report compile_warnings ######################################### if [ $DAEMON == "0" ]; then echo "$REPORT_TXT" exit 0 fi trap "chipmonk_stop" 1 2 3 15 ######################################### if [ $DAEMON == "1" ]; then gotify_alert "Chip-DC" "Started chipmonk service." while true; do read_AXP read_stats compile_warnings sleep "$SENSOR_READ_FREQUENCY" done fi