-
Notifications
You must be signed in to change notification settings - Fork 0
/
switching_algo_v2.R
103 lines (91 loc) · 3.6 KB
/
switching_algo_v2.R
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
### DISCHARGE / RECHARGE ALGO CODE Version 2
suppressWarnings(suppressMessages({
library(odbc)
library(dplyr)
library(dbplyr)
library(sqldf)
library(data.table)
library(reshape2) # for melt function
library(lubridate) # dates and times
library(ggplot2)
library(zoo) # for interpolation function
}))
con <- DBI::dbConnect(odbc::odbc(),
Driver = "SQL Server",
Server = "172.17.133.92",
Database = "aemosql",
UID = "aemosqluser",
PWD = "LVtsFxCup17Ckk7", #rstudioapi::askForPassword("aemosqluser"), #pw = LVtsFxCup17Ckk7
Port = 1433)
ch.schedule<-function(){
# set queries
tplus1<-as.character(Sys.time()+24*60*60) # add one day to current time
sqlcmd.dat <- paste("SELECT *
FROM dbo.PREDISPATCHPRICE
WHERE
DATETIME > '",Sys.time(),"' AND
DATETIME < '",tplus1,"' AND
REGIONID='NSW1'")
act <- dbGetQuery(con,sqlcmd.dat)
act <- as.data.table(act)
act[, DATETIME := ymd_hms(act[["DATETIME"]])]
# set params - single battery unit
cycles<-1.75
hr<-4
ch.dis<-hr*cycles # set @ 7 hours charge / discharge per unit
ramp<-0.416666667
maxDOD<-0.9999
startSOC<-29.605
DODlimit<-(1-maxDOD)*startSOC
lprice<-70
uprice<-130
# obtain P5Min dispatch data
tplus60<-as.character(Sys.time()+1*60*60) # add one day to current time
sqlcmd.dat <- paste("SELECT *
FROM dbo.P5MIN_REGIONSOLUTION
WHERE
RUN_DATETIME > '",Sys.time(),"' AND
RUN_DATETIME < '",tplus60,"' AND
REGIONID='NSW1'")
dat60 <- dbGetQuery(con,sqlcmd.dat)
dat60 <- as.data.table(dat60)
dat60 <- dat60[, DATETIME := INTERVAL_DATETIME]
dat.P5Min<-dat60[,c("DATETIME","RRP")]
# create vector of 5min times
sched<-seq(ceiling_date(Sys.time(), "5 mins"),Sys.time()+24*60*60,by =(5*60))
sched<-as.data.frame(sched)
sched$DATETIME<-sched$sched
sched$DATETIME<-ymd_hms(sched$sched)
# merge
sched.temp1<-merge(sched,act,all=TRUE)
sched.temp1$sched=NULL
sched.temp<-merge(sched.temp1,dat.P5Min,by="DATETIME",all=TRUE)
sched.temp<-as.data.table(sched.temp)
sched.temp<-sched.temp[, RRP:=ifelse((!is.na(RRP.y)),RRP.y,RRP.x)]
#sched.temp<-sched.temp[,c("DATETIME","RRP","rate")]
sched.temp<-sched.temp[,c("DATETIME","RRP")]
sched.temp$RRP <-
na.locf(sched.temp$RRP, fromLast = FALSE) # last observation carried forward for NAs
# forward assessment of prices
dat<-sched.temp
lowtohigh<-dat[order(dat$RRP),c("DATETIME","RRP")]
charge.pref<-lowtohigh[c(1:(ch.dis*12)),c("DATETIME","RRP")]
discharge.pref<-lowtohigh[c((nrow(lowtohigh)-((ch.dis-1)*12)):nrow(lowtohigh)),]
charge.pref[,rate:=-ramp]
discharge.pref[,rate:=ramp]
ch.times<-rbind(charge.pref,discharge.pref)
ch.times<-ch.times[order(ch.times$DATETIME),]
sched<-merge(sched.temp,ch.times,by="DATETIME",all=TRUE)
sched.final<-sched[,c("DATETIME","RRP.x","rate")]
colnames(sched.final) <- c("DATETIME", "RRP", "RATE")
sched.final<-sched.final[,RATE:=ifelse(is.na(RATE),0,RATE)]
sched.final<-sched.final[,SOC:=startSOC-cumsum(RATE)]
sched.final<-sched.final[,RATE:=ifelse(SOC>30,0,RATE)]
sched.final<-sched.final[,RATE:=ifelse(SOC<0.01,0,RATE)]
sched.final<-sched.final[,SOC:=startSOC-cumsum(RATE)]
return(sched.final)
}
p<-ch.schedule()
p
plot(p$DATETIME,p$RRP,type="l")
points(p$DATETIME,p$RATE*200, cex=2)