#bin/bash #Required Unix tool bc & jq ###### SHELLY EM SECTION ####### #insert Shelly EM admin user readonly SHEM_USER="admin" #insert Shelly EM admin password readonly SHEM_PWD="password" #insert Shelly EM local IP readonly SHEM_IP="192.168.255.12" #insert Shelly EM ID of PhotoVoltaic Meter PRODUCTION POSITIVE VALUE readonly SHEM_PV_ID="0" #insert Shelly EM ID of Grid Meter GRID POSITIVE VALUE FOR CONSUMED, NEGATIVE FOR RETURNED readonly SHEM_GRID_ID="1" #insert Multiplayer in percent for Energy correction, 0 for no correction, positive for increment, negative to reduce readonly SHEM_MISUREMENT_ADJUST="0" ###### PV Output SECTION ####### #insert PV Output API Key (from https://pvoutput.org/account.jsp) readonly PVOUTPUT_APIKEY="70f5f3188593efcxxxxxxxxxxxxxxxxxxxx" #insert PV Output System ID (from https://pvoutput.org/account.jsp) readonly PVOUTPUT_SYSID="12345" #insert "yes" to upload also production data from Shelly EM, "no" to upload only consumption readonly UPLOAD_PROD="yes" ###### SOLAREDGE SECTION ####### #if you want to skip SolarEdge data upload uncomment the following line readonly SEUPDATE="no" #insert SolarEdge Site ID readonly SE_SITEID="1571234" #insert SolarEdge Inverter Serial Number readonly INVERTERSN="7111D11B-E7" #insert SolarEdge API Key readonly SE_APIKEY="FIDS42EINB4UXXXXXXXXXXXXXX" readonly VAR_FILE="$HOME/INITIALVALUES" readonly LOG_FILE="$HOME/Shelly2PVOutput.log" SEUPDATE="yes" echo "Start getting measurement from Shelly EM "$SHEM_IP" and upload to PVOutput "$PVOUTPUT_SYSID | tee -a $LOG_FILE echo "START TIME: "$(date +%R:%S) | tee -a $LOG_FILE [[ -f $VAR_FILE ]] && { [[ $(date -r $VAR_FILE +%F) == $(date +%F) ]] && source $VAR_FILE || rm -f $VAR_FILE; } if ! [[ -f $VAR_FILE ]]; then CONSUMED=$(curl --user $SHEM_USER:$SHEM_PWD -s http://$SHEM_IP/emeter/$SHEM_GRID_ID | jq '.total') echo "SHELLY ENERGY CONSUMED: "$CONSUMED" Wh" | tee -a $LOG_FILE RETURNED=$(curl --user $SHEM_USER:$SHEM_PWD -s http://$SHEM_IP/emeter/$SHEM_GRID_ID | jq '.total_returned') echo "SHELLY ENERGY RETURNED: "$RETURNED" Wh" | tee -a $LOG_FILE PV=$(curl --user $SHEM_USER:$SHEM_PWD -s http://$SHEM_IP/emeter/$SHEM_PV_ID | jq '.total') echo "SHELLY ENERGY PRODUCED: "$PV" Wh" | tee -a $LOG_FILE TOTAL=$(bc -l <<<"$CONSUMED-$RETURNED+$PV") echo "SHELLY ENERGY TOTAL BALANCE: "$TOTAL" Wh" | tee -a $LOG_FILE PVOutputSTART=$(curl -s -d "d="$(date +%Y%m%d) -d "stats=1" -H "X-Pvoutput-Apikey: "$PVOUTPUT_APIKEY -H "X-Pvoutput-SystemId: "$PVOUTPUT_SYSID https://pvoutput.org/service/r2/getstatus.jsp) IFS=';' read -ra TEMP <<< "$PVOutputSTART" IFS=',' read -ra TEMP0 <<< "${TEMP[0]}" IFS=',' read -ra TEMP1 <<< "${TEMP[1]}" re='^[0-9]+$' if ! [[ $TEMP0 =~ $re ]] ; then PVOutputENERGY=0 else PVOutputENERGY=${TEMP0} fi echo "PV Output ENERGY PRODUCED: "$PVOutputENERGY" Wh" | tee -a $LOG_FILE if ! [[ $TEMP1 =~ $re ]] ; then PVOutputENERGYUSED=0 else PVOutputENERGYUSED=${TEMP1} fi echo "PV Output ENERGY USED: "$PVOutputENERGYUSED" Wh" | tee -a $LOG_FILE echo -e "TOTAL=$TOTAL\nPVOutputENERGY=$PVOutputENERGY\nPVOutputENERGYUSED=$PVOutputENERGYUSED\nPV=$PV" > $VAR_FILE echo "First Time of the day. Exit" | tee -a $LOG_FILE exit 0 fi echo -e "LAST TOTAL ENERGY COUNTER: "$TOTAL" Wh\nPVOutput ENERGY Production: "$PVOutputENERGY" Wh\nPVOutput ENERGY Used: "$PVOutputENERGYUSED" Wh" | tee -a $LOG_FILE CONSUMED_now=$(curl --user $SHEM_USER:$SHEM_PWD -s http://$SHEM_IP/emeter/$SHEM_GRID_ID | jq '.total') RETURNED_now=$(curl --user $SHEM_USER:$SHEM_PWD -s http://$SHEM_IP/emeter/$SHEM_GRID_ID | jq '.total_returned') PV_now=$(curl --user $SHEM_USER:$SHEM_PWD -s http://$SHEM_IP/emeter/$SHEM_PV_ID | jq '.total') PV_POWER=$(curl --user $SHEM_USER:$SHEM_PWD -s http://$SHEM_IP/emeter/$SHEM_PV_ID | jq '.power') if [[ $PV_POWER =~ "-" ]]; then PV_POWER=0 fi GRID_POWER=$(curl --user $SHEM_USER:$SHEM_PWD -s http://$SHEM_IP/emeter/$SHEM_GRID_ID | jq '.power') VOLTAGE=$(curl --user $SHEM_USER:$SHEM_PWD -s http://$SHEM_IP/emeter/$SHEM_PV_ID | jq '.voltage') CONSUMPTION_POWER=$(bc -l <<<"$PV_POWER+$GRID_POWER") TOTAL_now=$(bc -l <<<"($CONSUMED_now-$RETURNED_now+$PV_now)") echo "TOTAL ENERGY COUNTER @"$(date +%R) $TOTAL_now" Wh" | tee -a $LOG_FILE ENERGY=$(bc -l <<<"(($TOTAL_now-$TOTAL)*(1+$SHEM_MISUREMENT_ADJUST/100)+$PVOutputENERGYUSED)") PV_ENERGY=$(bc -l <<<"($PV_now-$PV)*(1+$SHEM_MISUREMENT_ADJUST/100)+$PVOutputENERGY") printf "\e[1;34mData from Shelly @"$(date +%R:%S)"\n\e[0m" | tee -a $LOG_FILE echo "PV Power: "$PV_POWER" W" | tee -a $LOG_FILE echo "Cons Power: "$CONSUMPTION_POWER" W" | tee -a $LOG_FILE printf "PV Energy now: %.1f Wh\n" $PV_ENERGY | tee -a $LOG_FILE printf "Energy now: %.1f Wh\n" $ENERGY | tee -a $LOG_FILE if test "$UPLOAD_PROD" = "yes"; then curl -d "d="$(date +%Y%m%d) -d "t="$(date +%R) -d "v1="$PV_ENERGY -d "v2="$PV_POWER -d "v3="$ENERGY -d "v4="$CONSUMPTION_POWER -d "v6="$VOLTAGE -H "X-Pvoutput-Apikey: "$PVOUTPUT_APIKEY -H "X-Pvoutput-SystemId: "$PVOUTPUT_SYSID https://pvoutput.org/service/r2/addstatus.jsp | tee -a $LOG_FILE else curl -d "d="$(date +%Y%m%d) -d "t="$(date +%R) -d "v2="$PV_POWER -d "v3="$ENERGY -d "v4="$CONSUMPTION_POWER -d "v6="$VOLTAGE -H "X-Pvoutput-Apikey: "$PVOUTPUT_APIKEY -H "X-Pvoutput-SystemId: "$PVOUTPUT_SYSID https://pvoutput.org/service/r2/addstatus.jsp | tee -a $LOG_FILE fi printf "\n" | tee -a $LOG_FILE if test "$SEUPDATE" = "yes"; then SEUPDATE="no" TENMINSAGO=$(($(date +%s)-15*60)) SELIVEDATA=$(curl -s "https://monitoringapi.solaredge.com/equipment/"$SE_SITEID"/"$INVERTERSN"/data.json?startTime=$(date -d @$TENMINSAGO +%F)%20$(date -d @$TENMINSAGO +%T)&endTime=$(date +%F)%20$(date +%T)&api_key="$SE_APIKEY) count=$(echo $SELIVEDATA | jq '.data.count') for i in $(seq 0 $(($count-1))); do SELIVEDATAAR=$(echo $SELIVEDATA | jq '.data.telemetries['$i'].date,.data.telemetries['$i'].temperature,.data.telemetries['$i'].L1Data.acVoltage,.data.telemetries['$i'].L1Data.activePower') eval "array=($SELIVEDATAAR)" SELIVEDATA_date=${array[0]} SELIVEDATA_temp=${array[1]} SELIVEDATA_acV=${array[2]} SELIVEDATA_Power=${array[3]} printf "\e[1;31mData from SolarEdge\n\e[0m" | tee -a $LOG_FILE echo "SE data: "$SELIVEDATA_date | tee -a $LOG_FILE echo "SE Temp: "$SELIVEDATA_temp" °C" | tee -a $LOG_FILE echo "SE AC V: "$SELIVEDATA_acV" V" | tee -a $LOG_FILE echo "SE Power: "$SELIVEDATA_Power" W" | tee -a $LOG_FILE curl -d "d="$(date -d "$SELIVEDATA_date" +%Y%m%d) -d "t="$(date -d "$SELIVEDATA_date" +%R) -d "v2="$SELIVEDATA_Power -d "v5="$SELIVEDATA_temp -d "v6="$SELIVEDATA_acV -H "X-Pvoutput-Apikey: "$PVOUTPUT_APIKEY -H "X-Pvoutput-SystemId: "$PVOUTPUT_SYSID https://pvoutput.org/service/r2/addstatus.jsp | tee -a $LOG_FILE printf "\n" | tee -a $LOG_FILE done else SEUPDATE="yes" fi echo -e "TOTAL=$TOTAL\nPVOutputENERGY=$PVOutputENERGY\nPVOutputENERGYUSED=$PVOutputENERGYUSED\nPV=$PV\nSEUPDATE=$SEUPDATE" > $VAR_FILE