Last Updated on 2026-04-11 by researcher
我が家はオムロンの太陽光発電(PCS)+蓄電池(10KW)を導入している。
太陽光発電量が少ないときの不足分は蓄電池からの放電で補ってくれるが普通に家電を使っているだけで一日も持たないし蓄電池を全て使い切るような使い方は停電時に困ることになるため蓄電池を増設したいところではあるものの費用/設置場所など何かと悩みどころが多すぎる。
ポタ電とスマートプラグとの組み合わせて時間帯により充放電を切り替えるような運用も試してみたが家全体を給電できる蓄電池の容量を増やしたほうが使い勝手がいいのは確かである。
そこで蓄電池とポタ電の充放電の連動を試してみた結果、ポタ電に振り分けた電力分だけ蓄電池の放電時間が延びることや蓄電池と同じように太陽光発電或いは深夜電力で充電できることなど蓄電池の容量を増やしたのと同じ効果が確認できた。
例えば一日に10時間使う200Wの家電(TVなど)があるなら 2KW必要であるが、それをポタ電経由にして蓄電池と充放電を連動させると10KWh(実質7-8KWh)の蓄電池の放電が25%以上長く使えることになる。ちなみにポタ電の充放電効率が以外に悪くて電気料金を安くするという効果は期待しないほうが良さそうだ。
パワコンはオムロンのみ対応。放電時間帯制御だけならパワコン連携なしでOK。
ポタ電はスマートプラグの電力計測機能を使いAC入出力電力の差からバッテリーの充放電をシュミレートするためUPS(EPS)機能があるものならなんでもOKだ。
ていうか、我が家で使ってるポタ電(DABBSSON)にバッテリー状態を取得する機能があるかないかサポートに問い合わせしてみたら、そんなものはないと無下に一蹴されてしまったのでシュミレート方式を考えてみたのであった...(-_-;)
【接続方法】
【コンセント】–>【TP-LINK P110M】–>【ポタ電】–>【TP-LINK P110M】–>【家電(TV/PC/冷蔵庫など)】
【スマートプラグ】
TP-LINK Tapo P105/P110M のKlapプロトコル対応版 (Windows/Linux)
【動作の概要】
1)ポタ電のAC入力をONしバッテリー満充電になるまで待機。
2)放電時間帯&&(蓄電池放電中||買電中)であればポタ電のAC入力をOFFし放電開始。それ以外はポタ電のAC入力をONし充電開始。
3)ポタ電放電中にバッテリーが最低容量(BATLOW)を下回ったら1)に戻る。
【設定ファイル】
BATxxx/DxTIME設定はポタ電や契約に合わせて変更する。BATLOSはポタ電の消費電力でバッテリー満充電時のAC入出力電力の差から判断できるがわからない時は0でもよい。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
MODE=omron # on|off|omron DEBUG=0 # debug mode MONINT=60 # monitor interval time (seconds) LOGINT=600 # logging interval time (seconds) CTLDLY=300 # charging control delay (seconds) BATCAP=5330 # Battery Capacity (Wh) BATCEP=87 # Charging efficiency Percent (%) BATDEP=66 # Discharging efficiency Percent (%) BATLOW=30 # Battery Discharging Stop Level (%) BATLOS=30 # DC-AC Converter Power Consumption (W) DSTIME=0800 # discharge start time (HHMM) DETIME=2200 # discharge end time (HHMM) |
【シェルスクリプト】
オムロンのカラー表示ユニットが計測ユニットから取得する表示用のデータからパワコンの状態を判断している。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 |
#!/bin/bash # # Portable Battery Charge Controller with PCS # CWD=$(cd "$(dirname "$0")" && pwd) NAME=$(basename "$0" .sh) # # User Settings # USER=***** PSWD=***** ACIN="$CWD/../tapo2/tapo2 192.168.***.*** $USER $PSWD" ACOUT="$CWD/../tapo2/tapo2 192,168.***.*** $USER $PSWD" OMRON="http://192.168.***.***/asyncquery.cgi?type=Navi" LOGFILE="$CWD/$NAME.log" CONFFILE="$CWD/$NAME.conf" # # Working Variables # FULLCHG=0 CHARGE=1 STATE=$CHARGE BATTERY=0 # Current Battery Power (mWh) LASTIN=-1 LASTOUT=-1 LOGPER=-1 LOGCHG=-1 # # for OMRON PCS # omron() { local CHG local PCS local PWR CHG=1 PCS=$(wget "$OMRON" -q -O -) if [ $? -eq 0 ]; then PWR=$(echo "$PCS" | jq -e ".chargePowerTotal") if [ $PWR -lt 0 ]; then CHG=0 else PWR=$(echo "$PCS" | jq -e ".instantPower.tradedPower") if [ $PWR -gt 0 ]; then CHG=0 fi fi fi echo $CHG } # # discharge time control # discharge() { local CHG local NOW CHG=1 NOW=$(date '+%H%M') if [ $NOW -ge $DSTIME ] && [ $NOW -lt $DETIME ]; then CHG=0 fi echo $CHG } # # PCS Status # status() { local CHG case "$MODE" in off) CHG=0 ;; on) CHG=1 ;; *) CHG=$(discharge) if [ $CHG -eq 0 ]; then if [ "$MODE" == "omron" ]; then CHG=$(omron) fi fi ;; esac echo $CHG } # # get Property # property() { sed -E -n "s/^$1=([^[:space:]]*).*$/\1/p" < "$CONFFILE" } # # Load Config # config() { MODE=$(property "MODE") DEBUG=$(property "DEBUG") CTLDLY=$(property "CTLDLY") MONINT=$(property "MONINT") LOGINT=$(property "LOGINT") BATCAP=$(property "BATCAP") BATCEP=$(property "BATCEP") BATDEP=$(property "BATDEP") BATLOW=$(property "BATLOW") BATLOS=$(property "BATLOS") DSTIME=$(property "DSTIME") DETIME=$(property "DETIME") BATCAP=$((BATCAP * 1000)) # Convert Wh to mWh BATLOW=$((BATCAP * BATLOW / 100)) # Convert % to mWh BATLOS=$((BATLOS * 1000 * MONINT / 3600)) # Convert W to mWm } # # Logging # logging() { local CHG local REM local PER if [ "$CHARGE" -eq 0 ]; then CHG="off" else CHG="on" fi REM=$((BATTERY / 1000)) PER="$((BATTERY * 100 / BATCAP)).$((BATTERY * 1000 / BATCAP % 10))" if [ "$PER" != "$LOGPER" ] || [ $CHARGE -ne $LOGCHG ]; then echo "$(date "+%Y-%m-%d %H:%M"), $PER% ($REM), $CHG" >> "$LOGFILE" LOGPER=$PER LOGCHG=$CHARGE fi } # # Smart Plug Control # control() { local CHG if [ "$CHARGE" -eq 0 ]; then CHG="off" else CHG="on" fi $ACIN "$CHG" > /dev/null 2>&1 } # # Simulate Battery Power # energy() { local PWR local PI local PO local PER # # battery input # PWR=$($ACIN energy | jq -e ".month_energy") if [ $LASTIN -lt 0 ]; then PI=0 elif [ $PWR -ge $LASTIN ]; then PI=$((PWR - LASTIN)) else PI=$PWR fi LASTIN=$PWR # # battery output # PWR=$($ACOUT energy | jq -e ".month_energy") if [ $LASTOUT -lt 0 ]; then PO=0 elif [ $PWR -ge $LASTOUT ]; then PO=$((PWR - LASTOUT)) else PO=$PWR fi LASTOUT=$PWR # # battry charge/Discharge # PWR=$(((PI - PO) * 1000)) if [ $PWR -gt 1000 ]; then PWR=$((PWR * BATCEP / 100 - BATLOS)) elif [ $PWR -lt -1000 ]; then PWR=$((PWR * 100 / BATDEP - BATLOS)) else PWR=0 fi BATTERY=$((BATTERY + PWR)) if [[ ( $PI -gt 0 && $PWR -eq 0 ) || ( $BATTERY -gt $BATCAP ) ]]; then if [ $FULLCHG -eq 0 ]; then FULLCHG=1 START2=$SECONDS START3=$START2 fi BATTERY=$BATCAP logging elif [ $BATTERY -lt 0 ]; then BATTERY=0 fi if [ $DEBUG -ne 0 ]; then PER="$((BATTERY * 100 / BATCAP)).$((BATTERY * 1000 / BATCAP % 10))" echo "$(date "+%Y-%m-%d %H:%M:%S"), $PER% ($BATTERY), CHG=$PWR, PI=$PI, PO=$PO, STATUS=$1" fi } # # Main Routine # config if ! $ACIN info > /dev/null 2>&1; then echo "smartplug $ACIN not found." fi if ! $ACOUT info > /dev/null 2>&1; then echo "smartplug $ACOUT not found." fi SECONDS=$(date "+%S") START1=$SECONDS START2=-1 START3=$((START1 - LOGINT)) while :; do config VAL=$(status) energy $VAL if [ $STATE -ne $VAL ]; then STATE=$VAL START2=$SECONDS fi if [ $START2 -ge 0 ] && [ $((SECONDS - START2)) -ge $CTLDLY ]; then START2=-1 if [[ $CHARGE -ne $STATE && ( $STATE -ne 0 || ( $BATTERY -ge $BATLOW && $FULLCHG -ne 0 ) ) ]]; then START3=$SECONDS CHARGE=$STATE logging fi fi if [ $CHARGE -eq 0 ] && [ $BATTERY -lt $BATLOW ]; then FULLCHG=0 START3=$SECONDS CHARGE=1 logging fi control if [ $((SECONDS - START3)) -ge $LOGINT ]; then START3=$((START3 + LOGINT)) logging fi DLY=$((MONINT + (MONINT / 2) - (START1 % MONINT))) VAL=$((DLY - (SECONDS - START1) - 1)) if [ $VAL -gt 0 ]; then sleep $VAL fi while [ $((SECONDS - START1)) -lt $DLY ]; do sleep 0.1 done START1=$((START1 + DLY)) done |
