2024-01-12 18:25:14 +00:00
|
|
|
|
#################
|
|
|
|
|
# Author: PMF #
|
|
|
|
|
#################
|
|
|
|
|
|
2024-01-12 13:57:59 +00:00
|
|
|
|
require(shiny)
|
2024-01-12 20:18:29 +00:00
|
|
|
|
require(DT)
|
2024-01-12 13:57:59 +00:00
|
|
|
|
|
2024-01-12 18:25:14 +00:00
|
|
|
|
# preperation:
|
2024-01-12 13:57:59 +00:00
|
|
|
|
# Get the status if r shiny is running in docker or not
|
|
|
|
|
readRenviron("./.status-docker")
|
|
|
|
|
statusDocker <- Sys.getenv("statusDockerENV")
|
|
|
|
|
|
2024-01-12 20:18:29 +00:00
|
|
|
|
|
|
|
|
|
# loading data from csv files
|
|
|
|
|
brews <- (read.csv(file = "./data/brews.csv", header = TRUE, sep = ",", row.names = 1))
|
2024-01-12 21:03:44 +00:00
|
|
|
|
machines <- (read.csv(file = "./data/machines.csv", header = TRUE, sep = ",", row.names = 1))
|
|
|
|
|
grinders <- (read.csv(file = "./data/grinders.csv", header = TRUE, sep = ",", row.names = 1))
|
|
|
|
|
coffees <- (read.csv(file = "./data/coffees.csv", header = TRUE, sep = ",", row.names = 1))
|
|
|
|
|
|
2024-01-12 22:20:21 +00:00
|
|
|
|
# get last used coffee
|
|
|
|
|
lastUsedParameters <- tail(brews, n=1)
|
|
|
|
|
lastUsedParameters$Alias
|
2024-01-12 20:18:29 +00:00
|
|
|
|
|
2024-01-12 13:57:59 +00:00
|
|
|
|
ui <- navbarPage("EpriLog",
|
2024-01-12 20:18:29 +00:00
|
|
|
|
tabPanel("Brews",
|
2024-01-12 13:57:59 +00:00
|
|
|
|
sidebarLayout(
|
|
|
|
|
mainPanel(
|
|
|
|
|
h1('Brew History'),
|
|
|
|
|
DT::dataTableOutput('history')
|
|
|
|
|
),
|
|
|
|
|
sidebarPanel(
|
|
|
|
|
h1('New Entry'),
|
|
|
|
|
dateInput("date", "Date:"), #maybe better to automatically generate with time
|
2024-01-12 22:20:21 +00:00
|
|
|
|
selectInput("alias", "Whats the nick name of the coffee?", choices = coffees$alias, multiple = FALSE, selected = lastUsedParameters$Alias),
|
|
|
|
|
#selectInput("coffeeName", "Whats the name of the coffee?", coffees$coffeeName, multiple = FALSE),
|
2024-01-12 13:57:59 +00:00
|
|
|
|
# Taste Rating (sour = none, 10 = perfect, 20 = bitter)
|
|
|
|
|
sliderInput("taste", "Taste (0=Sour, 10=perfect, 20=bitter):", value = 10, min = 0, max = 20),
|
2024-01-12 22:43:11 +00:00
|
|
|
|
# Flow rate (0 = none, 10 = perfect, 20 = water)
|
|
|
|
|
sliderInput("flowResult", "Flow rate (10 is Perfect):", value = lastUsedParameters$FlowResult, min = 0, max = 20),
|
|
|
|
|
# Grind Time
|
|
|
|
|
sliderInput("grindTime", "Ginding Time", value = lastUsedParameters$GrindTime, min = 0, max = 30, step = 0.2),
|
|
|
|
|
# Grind Size (my Grinder can go up to 70 but thats no longer Espresso..)
|
|
|
|
|
sliderInput("grindSize", "Ginding Size", value = lastUsedParameters$GrindSize, min = 0, max = 30),
|
2024-01-12 13:57:59 +00:00
|
|
|
|
# WDT Tool
|
|
|
|
|
checkboxInput("wdt", "WDT Tool used?", value = TRUE),
|
|
|
|
|
# Brew Temp
|
|
|
|
|
numericInput("brewTemp", "Brew Temperature:", value = 94, min = 0, max = 110),
|
|
|
|
|
# Brew preinfusion time
|
|
|
|
|
numericInput("brewPreinfusion", "Brew Preinfusion Time", value =2, min = 0, max = 60),
|
|
|
|
|
# Brew wait Time after Preinfusion
|
|
|
|
|
numericInput("brewPreinfusionWait", "Brew Wait after Preinfusion Time", value = 5, min = 0, max = 60),
|
|
|
|
|
# Brew Time
|
|
|
|
|
numericInput("brewTime", "Brew Time after Preinfusion Time", value = 21, min = 0, max = 100),
|
|
|
|
|
# Grinder Device
|
|
|
|
|
selectInput("grinderDevice", "Which Grinder was used?", grinders$name, multiple = FALSE),
|
|
|
|
|
# Espresso Device
|
|
|
|
|
selectInput("machineDevice", "Which Espresso machine was used?", machines$name, multiple = FALSE),
|
|
|
|
|
# Siebeinsatz
|
|
|
|
|
numericInput("portaInsert", "Siever insert size", value = 12, min = 0, max = 100),
|
|
|
|
|
# Notes
|
2024-01-12 22:20:21 +00:00
|
|
|
|
textInput("notes", "Notes:", value = "I´m satisfied with my coffee."),
|
2024-01-12 13:57:59 +00:00
|
|
|
|
# submit
|
|
|
|
|
actionButton("createEntry", "Submit new entry!", icon("save")),
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
tabPanel("Configuration",
|
2024-01-12 20:18:29 +00:00
|
|
|
|
sidebarLayout(
|
|
|
|
|
mainPanel(
|
|
|
|
|
h1('Already available Coffees'),
|
|
|
|
|
DT::dataTableOutput('coffees')
|
|
|
|
|
),
|
|
|
|
|
sidebarPanel(
|
|
|
|
|
h2('Add New Coffees'),
|
|
|
|
|
textInput("brandName", "Brand Name", value = ""),
|
2024-01-12 21:56:11 +00:00
|
|
|
|
textInput("coffeeNameNew", "Coffee Name", value = ""),
|
|
|
|
|
textInput("aliasNew", "Nick Name", value = ""),
|
2024-01-12 20:18:29 +00:00
|
|
|
|
dateInput("expDate", "Expiration Date"),
|
|
|
|
|
numericInput("arabicaPercentage", "Arabica Percentage", value = "50"),
|
|
|
|
|
numericInput("robustaPercentage", "Robusta Percentage", value = "50"),
|
|
|
|
|
numericInput("sourPercentage", "Sourness Percentage", value = "50"),
|
|
|
|
|
numericInput("strongnessPercentage", "Strongness Percentage", value = "50"),
|
|
|
|
|
numericInput("roastDarknessPercentage", "Roast Darkness Percentage", value = 50),
|
|
|
|
|
textInput("originCountry", "Origin County of the Coffee", value = "Coffee World"),
|
2024-01-12 21:03:44 +00:00
|
|
|
|
actionButton("addCoffee", "Save new entry!", icon("save")),
|
2024-01-12 20:18:29 +00:00
|
|
|
|
)
|
2024-01-12 13:57:59 +00:00
|
|
|
|
)
|
2024-01-12 20:18:29 +00:00
|
|
|
|
))
|
|
|
|
|
|
2024-01-12 13:57:59 +00:00
|
|
|
|
|
2024-01-12 20:18:29 +00:00
|
|
|
|
server <- function(input, output, session){
|
2024-01-12 13:57:59 +00:00
|
|
|
|
|
|
|
|
|
# loading data from csv files
|
|
|
|
|
brews <- (read.csv(file = "./data/brews.csv", header = TRUE, sep = ",", row.names = 1))
|
2024-01-12 21:03:44 +00:00
|
|
|
|
machines <- (read.csv(file = "./data/machines.csv", header = TRUE, sep = ",", row.names = 1))
|
|
|
|
|
grinders <- (read.csv(file = "./data/grinders.csv", header = TRUE, sep = ",", row.names = 1))
|
|
|
|
|
coffees <- (read.csv(file = "./data/coffees.csv", header = TRUE, sep = ",", row.names = 1))
|
2024-01-12 13:57:59 +00:00
|
|
|
|
|
2024-01-12 22:43:11 +00:00
|
|
|
|
# get last used coffee
|
|
|
|
|
lastUsedParameters <- tail(brews, n=1)
|
|
|
|
|
lastUsedParameters$Alias
|
|
|
|
|
|
2024-01-12 21:03:44 +00:00
|
|
|
|
# Render Brew History Table
|
2024-01-12 20:18:29 +00:00
|
|
|
|
output$history = DT::renderDataTable(
|
2024-01-12 13:57:59 +00:00
|
|
|
|
brews, server = TRUE,
|
2024-01-12 18:25:14 +00:00
|
|
|
|
options = list(order = list(3, "desc"),
|
2024-01-12 20:18:29 +00:00
|
|
|
|
list(scrollX = TRUE),
|
2024-01-12 22:20:21 +00:00
|
|
|
|
columnDefs = list(list(visible = FALSE, targets = c(1,2,3,5,10,11,12,13,14,15,16)))
|
2024-01-12 14:43:27 +00:00
|
|
|
|
))
|
2024-01-12 13:57:59 +00:00
|
|
|
|
|
2024-01-12 21:03:44 +00:00
|
|
|
|
# Creating new brew record
|
|
|
|
|
#
|
2024-01-12 13:57:59 +00:00
|
|
|
|
observeEvent(input$createEntry, {
|
|
|
|
|
# get currentTime
|
|
|
|
|
currentTime <- Sys.time()
|
2024-01-12 14:43:27 +00:00
|
|
|
|
# count up for new brew id
|
2024-01-12 18:25:14 +00:00
|
|
|
|
newID <- (runif(1, 1, 10000000000))
|
2024-01-12 22:20:21 +00:00
|
|
|
|
coffeeName <- "SEE_COFFEES_CSV"
|
2024-01-12 18:25:14 +00:00
|
|
|
|
|
2024-01-12 13:57:59 +00:00
|
|
|
|
# add new line entry to history
|
2024-01-12 14:43:27 +00:00
|
|
|
|
brews[nrow(brews) + 1, 1] <- newID
|
|
|
|
|
brews[nrow(brews), 2] <- input$date
|
|
|
|
|
brews[nrow(brews), 3] <- currentTime
|
2024-01-12 18:25:14 +00:00
|
|
|
|
brews[nrow(brews), 4] <- input$alias
|
2024-01-12 22:20:21 +00:00
|
|
|
|
brews[nrow(brews), 5] <- coffeeName
|
2024-01-12 18:25:14 +00:00
|
|
|
|
brews[nrow(brews), 6] <- input$grindTime
|
|
|
|
|
brews[nrow(brews), 7] <- input$grindSize
|
|
|
|
|
brews[nrow(brews), 8] <- input$flowResult
|
|
|
|
|
brews[nrow(brews), 9] <- input$taste
|
|
|
|
|
brews[nrow(brews), 10] <- input$wdt
|
|
|
|
|
brews[nrow(brews), 11] <- input$brewTemp
|
|
|
|
|
brews[nrow(brews), 12] <- input$brewPreinfusion
|
|
|
|
|
brews[nrow(brews), 13] <- input$brewPreinfusionWait
|
|
|
|
|
brews[nrow(brews), 14] <- input$brewTime
|
|
|
|
|
brews[nrow(brews), 15] <- input$grinderDevice
|
|
|
|
|
brews[nrow(brews), 16] <- input$machineDevice
|
|
|
|
|
brews[nrow(brews), 17] <- input$portaInsert
|
|
|
|
|
brews[nrow(brews), 18] <- input$notes
|
2024-01-12 14:43:27 +00:00
|
|
|
|
|
2024-01-12 13:57:59 +00:00
|
|
|
|
# save changes to .csv file
|
|
|
|
|
write.csv(brews, file = "./data/brews.csv")
|
2024-01-12 21:56:11 +00:00
|
|
|
|
showNotification("New Record added.")
|
2024-01-12 20:18:29 +00:00
|
|
|
|
session$reload()
|
2024-01-12 13:57:59 +00:00
|
|
|
|
})
|
|
|
|
|
|
2024-01-12 21:03:44 +00:00
|
|
|
|
# Render Coffees Table for Configuration Page
|
|
|
|
|
#
|
|
|
|
|
output$coffees = DT::renderDataTable(
|
|
|
|
|
coffees, server = TRUE,
|
|
|
|
|
options = list(scrollX = TRUE)
|
|
|
|
|
#colnames = c("ID", "Brand Name", "Coffee Name", )
|
|
|
|
|
#options = list(order = list(3, "desc")
|
|
|
|
|
#columnDefs = list(list(visible = FALSE, targets = c(1,2,10,11,12,13,14,15,16)))
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Add new Coffee entry
|
|
|
|
|
#
|
|
|
|
|
observeEvent(input$addCoffee, {
|
|
|
|
|
# get currentTime
|
|
|
|
|
creationDate <- Sys.time()
|
|
|
|
|
# count up for new brew id
|
|
|
|
|
newID <- (runif(1, 1, 10000000000))
|
|
|
|
|
|
|
|
|
|
# inserting new row
|
|
|
|
|
coffees[nrow(coffees) + 1, 1] <- newID
|
|
|
|
|
coffees[nrow(coffees), 2] <- input$brandName
|
2024-01-12 21:56:11 +00:00
|
|
|
|
coffees[nrow(coffees), 3] <- input$coffeeNameNew
|
|
|
|
|
coffees[nrow(coffees), 4] <- input$aliasNew
|
2024-01-12 21:03:44 +00:00
|
|
|
|
coffees[nrow(coffees), 5] <- input$expDate
|
|
|
|
|
coffees[nrow(coffees), 6] <- input$arabicaPercentage
|
|
|
|
|
coffees[nrow(coffees), 7] <- input$robustaPercentage
|
|
|
|
|
coffees[nrow(coffees), 8] <- input$sourPercentage
|
|
|
|
|
coffees[nrow(coffees), 9] <- input$strongnessPercentage
|
|
|
|
|
coffees[nrow(coffees), 10] <- input$roastDarknessPercentage
|
|
|
|
|
coffees[nrow(coffees), 11] <- input$originCountry
|
|
|
|
|
coffees[nrow(coffees), 12] <- creationDate
|
|
|
|
|
|
|
|
|
|
# save changes to .csv file
|
|
|
|
|
write.csv(coffees, file = "./data/coffees.csv")
|
|
|
|
|
showNotification("New Coffee added.")
|
2024-01-12 21:56:11 +00:00
|
|
|
|
session$reload()
|
2024-01-12 21:03:44 +00:00
|
|
|
|
})
|
|
|
|
|
|
2024-01-12 13:57:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (statusDocker == "false") {
|
|
|
|
|
runApp(shinyApp(ui = ui, server = server, options = list(launch.browser = TRUE)))
|
|
|
|
|
} else {
|
|
|
|
|
shinyApp(ui = ui, server = server)
|
|
|
|
|
}
|