View(values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end)) values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = mean(value)) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% ggplot() + geom_point(aes(x = glencoe_air_monitor_temperature, y = living_room_temperature, color = entity_id)) + # calcs voltage loss per hour lm_calc$coefficients[2] * 60 * 60 values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = mean(value)) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = mean(value)) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% ggplot() + geom_point(aes(x = glencoe_air_monitor_temperature, y = living_room_temperature)) + # calcs voltage loss per hour lm_calc$coefficients[2] * 60 * 60 values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = mean(value)) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% ggplot() + geom_point(aes(x = glencoe_air_monitor_temperature, y = living_room_temperature)) ggplot() + geom_point(aes(x = glencoe_adjusted, y = living_room_temperature)) values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = mean(value)) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% mutate(glencoe_adjusted = glencoe_air_monitor_temperature + 2.6) %>% ggplot() + geom_point(aes(x = glencoe_adjusted, y = living_room_temperature)) values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = (mean(value)-32)/1.8) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% mutate(glencoe_adjusted = glencoe_air_monitor_temperature + 2.6) %>% ggplot() + geom_point(aes(x = glencoe_adjusted, y = living_room_temperature)) values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = (mean(value)-32)/1.8) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% mutate(glencoe_adjusted = glencoe_air_monitor_temperature + 2.6) %>% ggplot() + geom_point(aes(x = glencoe_adjusted, y = living_room_temperature)) + geom_smooth(aes(x = glencoe_adjusted, y = living_room_temperature), method = "lm") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = (mean(value)-32)/1.8) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% mutate(glencoe_adjusted = glencoe_air_monitor_temperature) %>% ggplot() + geom_point(aes(x = glencoe_adjusted, y = living_room_temperature)) + geom_smooth(aes(x = glencoe_adjusted, y = living_room_temperature), method = "lm") + 2.6 values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = (mean(value)-32)/1.8) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% mutate(glencoe_adjusted = glencoe_air_monitor_temperature + 2.6) %>% ggplot() + geom_point(aes(x = glencoe_adjusted, y = living_room_temperature)) + geom_smooth(aes(x = glencoe_adjusted, y = living_room_temperature), method = "lm") sensors <- c("living_room_humidity", "air_monitor_humidity") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = mean(value)) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% mutate(glencoe_adjusted = glencoe_air_monitor_humidity -13) %>% ggplot() + geom_point(aes(x = glencoe_adjusted, y = living_room_humidity)) + geom_smooth(aes(x = glencoe_adjusted, y = living_room_humidity), method = "lm") sensors <- c("living_room_humidity", "air_monitor_humidity") sensors <- c("living_room_humidity", "glencoe_air_monitor_humidity") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = mean(value)) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% mutate(glencoe_adjusted = glencoe_air_monitor_humidity -13) %>% ggplot() + geom_point(aes(x = glencoe_adjusted, y = living_room_humidity)) + geom_smooth(aes(x = glencoe_adjusted, y = living_room_humidity), method = "lm") values %>% filter(entity_id %in% sensors) %>% ggplot() + geom_point(aes(x = time, y = value, color = entity_id)) time_start <- ymd_hms("2023_07_14-13:00:00") time_end <- ymd_hms("2023_07_14-16:00:00") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = (mean(value)-32)/1.8) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% mutate(glencoe_adjusted = glencoe_air_monitor_temperature) %>% ggplot() + geom_point(aes(x = glencoe_adjusted, y = living_room_temperature)) + geom_smooth(aes(x = glencoe_adjusted, y = living_room_temperature), method = "lm") time_start <- ymd_hms("2023_07_14-12:00:00") time_end <- ymd_hms("2023_07_14-16:00:00") lm_calc <- lm(value ~ time, data = values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end)) values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = (mean(value)-32)/1.8) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% mutate(glencoe_adjusted = glencoe_air_monitor_temperature) %>% ggplot() + geom_point(aes(x = glencoe_adjusted, y = living_room_temperature)) + geom_smooth(aes(x = glencoe_adjusted, y = living_room_temperature), method = "lm") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = (mean(value)-32)/1.8) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% mutate(glencoe_adjusted = air_monitor_temperature) %>% ggplot() + geom_point(aes(x = glencoe_adjusted, y = living_room_temperature)) + geom_smooth(aes(x = glencoe_adjusted, y = living_room_temperature), method = "lm") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = (mean(value)-32)/1.8) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) sensors <- c("living_room_temperature", "air_monitor_temperature", "glencoe_air_monitor_temperature") values['time_rounded'] <- round_date(ymd_hms(values$`_time`), unit = "minute") values %>% filter(entity_id %in% sensors) %>% ggplot() + geom_point(aes(x = time, y = value, color = entity_id)) time_start <- ymd_hms("2023_07_14-12:00:00") time_end <- ymd_hms("2023_07_14-16:00:00") lm_calc <- lm(value ~ time, data = values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end)) values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = (mean(value)-32)/1.8) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% mutate(glencoe_adjusted = air_monitor_temperature) %>% ggplot() + geom_point(aes(x = glencoe_adjusted, y = living_room_temperature)) + geom_smooth(aes(x = glencoe_adjusted, y = living_room_temperature), method = "lm") time_start <- ymd_hms("2023_07_14-13:00:00") time_end <- ymd_hms("2023_07_14-16:00:00") lm_calc <- lm(value ~ time, data = values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end)) values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = (mean(value)-32)/1.8) %>% pivot_wider(id_cols = time_rounded, names_from = entity_id, values_from = value) %>% mutate(glencoe_adjusted = air_monitor_temperature) %>% ggplot() + geom_point(aes(x = glencoe_adjusted, y = living_room_temperature)) + geom_smooth(aes(x = glencoe_adjusted, y = living_room_temperature), method = "lm") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = (mean(value)-32)/1.8) %>% ggplot() + geom_point(aes(x = time_rounded, y = value)) + geom_smooth(aes(x = time_rounded, y = value), method = "lm") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = (mean(value)-32)/1.8) %>% ggplot() + geom_point(aes(x = time_rounded, y = value, color = entiry_id)) + geom_smooth(aes(x = time_rounded, y = value), method = "lm") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = (mean(value)-32)/1.8) %>% ggplot() + geom_point(aes(x = time_rounded, y = value, color = entity_id)) + geom_smooth(aes(x = time_rounded, y = value), method = "lm") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% ggplot() + geom_point(aes(x = time, y = value, color = entity_id)) values %>% filter(entity_id %in% sensors) %>% ggplot() + geom_point(aes(x = time, y = value, color = entity_id)) time_start <- ymd_hms("2023_07_14-13:00:00") time_end <- ymd_hms("2023_07_14-16:00:00") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% ggplot() + geom_point(aes(x = time, y = value, color = entity_id)) values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -24h) |> drop(columns: ["_start", "_stop"]) |> filter(fn: (r) => r._field =="value")') values <- bind_rows(values) values$value <- values$"_value" sensors <- c("living_room_temperature", "air_monitor_temperature", "glencoe_air_monitor_temperature") values['time_rounded'] <- round_date(ymd_hms(values$`_time`), unit = "minute") values %>% filter(entity_id %in% sensors) %>% ggplot() + geom_point(aes(x = time, y = value, color = entity_id)) time_start <- ymd_hms("2023_07_14-13:00:00") time_end <- ymd_hms("2023_07_14-16:00:00") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% ggplot() + geom_point(aes(x = time, y = value, color = entity_id)) values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -24h) |> drop(columns: ["_start", "_stop"]) |> filter(fn: (r) => r._field =="value")') values <- bind_rows(values) values$value <- values$"_value" sensors <- c("living_room_temperature", "air_monitor_temperature", "glencoe_air_monitor_temperature") #sensors <- c("living_room_humidity", "office_humidity", "living_room_co2_humidity", "office_co2_humidity", "bedroom_humidity") #sensors <- c("air_monitor_air_monitor_battery_voltage") values['time_rounded'] <- round_date(ymd_hms(values$`_time`), unit = "minute") values %>% filter(entity_id %in% sensors) %>% ggplot() + geom_point(aes(x = time, y = value, color = entity_id)) time_start <- ymd_hms("2023_07_14-13:00:00") time_end <- ymd_hms("2023_07_14-16:00:00") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% ggplot() + geom_point(aes(x = time, y = value, color = entity_id)) values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -24h) |> drop(columns: ["_start", "_stop"]) |> filter(fn: (r) => r._field =="value")') values <- bind_rows(values) values$value <- values$"_value" sensors <- c("living_room_temperature", "air_monitor_temperature", "glencoe_air_monitor_temperature") #sensors <- c("living_room_humidity", "office_humidity", "living_room_co2_humidity", "office_co2_humidity", "bedroom_humidity") #sensors <- c("air_monitor_air_monitor_battery_voltage") values['time_rounded'] <- round_date(ymd_hms(values$`_time`), unit = "minute") values %>% filter(entity_id %in% sensors) %>% ggplot() + geom_point(aes(x = time, y = value, color = entity_id)) time_start <- ymd_hms("2023_07_14-13:00:00") time_end <- ymd_hms("2023_07_14-16:00:00") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% ggplot() + geom_point(aes(x = time, y = value, color = entity_id)) values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -24h) |> drop(columns: ["_start", "_stop"]) |> filter(fn: (r) => r._field =="value")') values <- bind_rows(values) values$value <- values$"_value" sensors <- c("living_room_temperature", "air_monitor_temperature", "glencoe_air_monitor_temperature") #sensors <- c("living_room_humidity", "office_humidity", "living_room_co2_humidity", "office_co2_humidity", "bedroom_humidity") #sensors <- c("air_monitor_air_monitor_battery_voltage") values['time_rounded'] <- round_date(ymd_hms(values$`_time`), unit = "minute") values %>% filter(entity_id %in% sensors) %>% ggplot() + geom_point(aes(x = time, y = value, color = entity_id)) time_start <- ymd_hms("2023_07_14-13:00:00") time_end <- ymd_hms("2023_07_14-16:00:00") values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% ggplot() + geom_point(aes(x = time, y = value, color = entity_id)) values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end) %>% group_by(time_rounded, entity_id) %>% summarise(value = (mean(value)-32)/1.8) %>% ggplot() + geom_point(aes(x = time_rounded, y = value, color = entity_id)) + geom_smooth(aes(x = time_rounded, y = value), method = "lm") lm_calc <- lm(value ~ time, data = values %>% filter(entity_id %in% sensors) %>% filter(time > time_start, time < time_end)) View(lm_calc) #setup ---- library(tidyverse) library(influxdbclient) library(rmarkdown) if(Sys.info()[4] == "pseudotsuga") { setwd("~/Documents/dataProjects/laundry_status") } else { setwd("/laundry_status") } Sys.setenv(TZ='America/Chicago') # parameters needed to make connection to Database token <- substr(read_file("data/api_key"), 1, 88) org = "home_assistant" bucket = "home_assistant" ## make connection to the influxDB bucket home_assistant <- InfluxDBClient$new(url = "https://influxdb.dendroalsia.net", token = token, org = org) update_interval <- 5 cronjob_interval <- 60 power_threshhold <- 5 # ---- set variables entities <- data.frame(name = c("washing machine", "dryer"), entity_id = c("washing_machine_power", "dryer_power")) update_data <- function(){ run_time <- Sys.time() values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "washing_machine_power" or r["entity_id"] == "dryer_power") |> filter(fn: (r) => r["_field"] == "value") |> filter(fn: (r) => r["_measurement"] == "W")', POSIXctCol = NULL) values <- bind_rows(values) values <- values %>% rename(value = "_value", time = "_time") values <- values %>% mutate( time = as.POSIXct(time, tz = "America/Chicago"), status = ifelse(value > power_threshhold, "on", "off")) values_by_entity <- as.list(NULL) for(entity in entities$entity_id) { values_by_entity[[entity]] <- values %>% filter(entity_id %in% entity) %>% mutate(end_time = c(time[-1], run_time)) } values <- bind_rows(values_by_entity) washer_last_on <- values %>% filter(entity_id == entities$entity_id[1], value > power_threshhold) %>% tail(1) %>% pull(end_time) washer_last_off <- values %>% filter(entity_id == entities$entity_id[1], value < power_threshhold) %>% tail(1) %>% pull(end_time) dryer_last_on <- values %>% filter(entity_id == entities$entity_id[2], value > power_threshhold) %>% tail(1) %>% pull(end_time) dryer_last_off <- values %>% filter(entity_id == entities$entity_id[2], value < power_threshhold) %>% tail(1) %>% pull(end_time) # ---- generate html current_status <- as.list(NULL) for (entity in entities$entity_id){ current_status[[entity]] <- ifelse(values %>% filter(entity_id %in% entity) %>% tail(1) %>% pull(value) > power_threshhold, "on", "off") } plot_1week <- ggplot(data = values) + geom_tile(aes(x = time + seconds(round(as.numeric(difftime(end_time, time, unit = "secs")))/2), y = entity_id, width = seconds(round(as.numeric(difftime(end_time, time, unit = "secs")))), height = 0.5, fill = status)) + scale_y_discrete(breaks = entities$entity_id, labels = entities$name) + scale_x_datetime(date_breaks = "24 hours", date_labels = '%A', date_minor_breaks = "6 hours") + theme(axis.text.x = element_text(angle = 30, vjust = 0.5)) + labs(title = "The past week", x = NULL, y = NULL, fill = NULL) plot_1day <- ggplot(data = values %>% filter(time >= max(values$end_time) - hours(24))) + geom_tile(aes(x = time + seconds(round(as.numeric(difftime(end_time, time, unit = "secs")))/2), y = entity_id, width = seconds(round(as.numeric(difftime(end_time, time, unit = "secs")))), height = 0.5, fill = status)) + scale_y_discrete(breaks = entities$entity_id, labels = entities$name) + scale_x_datetime(breaks = seq(round_date(max(values$end_time), "4 hours") - hours(24), round_date(max(values$end_time), "4 hours"), by = "4 hours"), date_labels = '%I:%M %p', date_minor_breaks = "1 hours") + theme(axis.text.x = element_text(angle = 30, vjust = 0.5)) + labs(title = "Last 24 hours", x = NULL, y = NULL, fill = NULL) render("laundry_status.Rmd", output_dir = "html", output_file = "index.html") } for(i in 1:(cronjob_interval/update_interval)){ message(Sys.time()) update_data() Sys.sleep(60*update_interval) }