From 64a1dbcb3e1bd61db97a36b18ae3f56e602fdc67 Mon Sep 17 00:00:00 2001 From: Ben Varick Date: Thu, 9 Nov 2023 09:58:53 -0600 Subject: [PATCH] made laundry_status.R executable --- .Rhistory | 852 +++++++++++++++++++++++------------------------ laundry_status.R | 0 2 files changed, 426 insertions(+), 426 deletions(-) mode change 100644 => 100755 laundry_status.R diff --git a/.Rhistory b/.Rhistory index e330195..88bdf45 100644 --- a/.Rhistory +++ b/.Rhistory @@ -1,342 +1,429 @@ -theme(axis.text.x = element_text(angle = 30, vjust = 0.5)) + -labs(title = "Last week") -View(values) -ggplot(data = values) + -geom_tile(aes(x = time, -y = entity_id, -fill = status)) -ggplot(data = values) + -geom_tile(aes(x = time, -y = entity_id, -width = 1, -height = 1 -fill = status)) + -ggplot(data = values) + -geom_tile(aes(x = time, -y = entity_id, -width = 1, -height = 1, -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") -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_power") |> filter(fn: (r) => r["_field"] == "value") |> filter(fn: (r) => r["_measurement"] == "W")', -POSIXctCol = NULL) +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 <- values %>% -rename(value = "_value", -time = "_time") -values <- values %>% -mutate( -time = as.POSIXct(time, tz = "America/Chicago"), -status = ifelse(value > 1, "on", "off")) %>% -mutate(end_time = values$time[-1]) -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_power") |> filter(fn: (r) => r["_field"] == "value") |> filter(fn: (r) => r["_measurement"] == "W")', -POSIXctCol = NULL) +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 <- values %>% -rename(value = "_value", -time = "_time") -values <- values %>% -mutate( -time = as.POSIXct(time, tz = "America/Chicago"), -status = ifelse(value > 1, "on", "off")) %>% -mutate(end_time = c(values$time[-1], NA)) -View(values) -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_power") |> filter(fn: (r) => r["_field"] == "value") |> filter(fn: (r) => r["_measurement"] == "W")', -POSIXctCol = NULL) +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 <- values %>% -rename(value = "_value", -time = "_time") -values <- values %>% -mutate( -time = as.POSIXct(time, tz = "America/Chicago"), -status = ifelse(value > 1, "on", "off")) %>% -mutate(end_time = c(values$time[-1], Sys.time())) -run_time <- Sys.time() -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_power") |> filter(fn: (r) => r["_field"] == "value") |> filter(fn: (r) => r["_measurement"] == "W")', -POSIXctCol = NULL) +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 <- values %>% -rename(value = "_value", -time = "_time") -values <- values %>% -mutate( -time = as.POSIXct(time, tz = "America/Chicago"), -status = ifelse(value > 1, "on", "off")) %>% -mutate(end_time = c(values$time[-1], run_time)) -run_time <- Sys.time() -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_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 > 1, "on", "off")) -c(values$time[-1], run_time) -run_time <- Sys.time() -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_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 > 1, "on", "off")) %>% -mutate(end_time = c(values$time[-1], run_time)) -run_time <- Sys.time() -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_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 > 1, "on", "off")) %>% -mutate(end_time = c(values$time[-1], as.POSIXct(run_time))) -run_time <- Sys.time() -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_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")) %>% -mutate(end_time = c(values$time[-1], c(run_time))) -power_threshhold <- 5 -run_time <- Sys.time() -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_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")) %>% -mutate(end_time = c(values$time[-1], c(run_time))) -run_time <- Sys.time() -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_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 <- values %>% -mutate(end_time = c(values$time[-1], run_time)) -ggplot(data = values) + -geom_tile(aes(x = time + minutes(as.numerica(difftime(time, endtime, unit = "mins")))/2, -y = entity_id, -width = minutes(as.numerica(difftime(time, endtime, unit = "mins"))), -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") -ggplot(data = values) + -geom_tile(aes(x = time + minutes(as.numeric(difftime(time, endtime, unit = "mins")))/2, -y = entity_id, -width = minutes(as.numeric(difftime(time, endtime, unit = "mins"))), -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") -ggplot(data = values) + -geom_tile(aes(x = time + minutes(as.numeric(difftime(time, end_time, unit = "mins")))/2, -y = entity_id, -width = minutes(as.numeric(difftime(time, end_time, unit = "mins"))), -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") -ggplot(data = values) + -geom_tile(aes(x = time + minutes(as.numeric(difftime(time, end_time, unit = "mins"))/2), -y = entity_id, -width = minutes(as.numeric(difftime(time, end_time, unit = "mins"))), -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") -values$time + minutes(as.numeric(difftime(values$time, values$end_time, unit = "mins"))/2) -difftime(values$time, values$end_time, unit = "mins") -as.numeric(difftime(values$time, values$end_time, unit = "mins")) -ggplot(data = values) + -geom_tile(aes(x = time + minutes(as.numeric(difftime(end_time, time, unit = "mins"))/2), -y = entity_id, -width = minutes(as.numeric(difftime(end_time, time, unit = "mins"))), -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") -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") -run_time <- Sys.time() -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_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 <- values %>% -group_by(entity_id) %>% -arrange(time) %>% -mutate(end_time = c(values$time[-1], run_time)) -run_time <- Sys.time() -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_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 <- values %>% -group_by(entity_id) %>% -mutate(end_time = c(values$time[-1], run_time)) -run_time <- Sys.time() -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_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")) -for(entity in entities$entity_id) { -values_by_entity[[entity]] <- values %>% -filter(entity_id %in% entity) %>% -mutate(end_time = c(values$time[-1], run_time)) -} -run_time <- Sys.time() -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_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")) -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_by_entity[[entity]] <- values %>% -filter(entity_id %in% entity) %>% -mutate(end_time = c(time[-1], run_time)) -run_time <- Sys.time() -values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_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) -View(values) -washer_last_on <- values %>% filter(entity_id == entities$entity_id[1], value > power_threshhold) %>% tail(1) %>% pull(time) -washer_last_off <- values %>% filter(entity_id == entities$entity_id[1], value < power_threshhold) %>% tail(1) %>% pull(time) -dryer_last_on <- values %>% filter(entity_id == entities$entity_id[2], value > power_threshhold) %>% tail(1) %>% pull(time) -dryer_last_off <- values %>% filter(entity_id == entities$entity_id[2], value < power_threshhold) %>% tail(1) %>% pull(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") -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") -ggplot(data = values %>% filter(time >= max(values$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_y_continuous() + -scale_x_datetime(breaks = seq(round_date(max(values$time), "4 hours") - hours(24), round_date(max(values$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") -ggplot(data = values %>% filter(time >= max(values$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$time), "4 hours") - hours(24), round_date(max(values$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") +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) @@ -379,97 +466,10 @@ 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(time) -washer_last_off <- values %>% filter(entity_id == entities$entity_id[1], value < power_threshhold) %>% tail(1) %>% pull(time) -dryer_last_on <- values %>% filter(entity_id == entities$entity_id[2], value > power_threshhold) %>% tail(1) %>% pull(time) -dryer_last_off <- values %>% filter(entity_id == entities$entity_id[2], value < power_threshhold) %>% tail(1) %>% pull(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$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$time), "4 hours") - hours(24), round_date(max(values$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) -} -round_date(max(values$time), "4 hours") -#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("lamp_a_power", "lamp_b_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"] == "lamp_b_power" or r["entity_id"] == "lamp_a_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(time) -washer_last_off <- values %>% filter(entity_id == entities$entity_id[1], value < power_threshhold) %>% tail(1) %>% pull(time) -dryer_last_on <- values %>% filter(entity_id == entities$entity_id[2], value > power_threshhold) %>% tail(1) %>% pull(time) -dryer_last_off <- values %>% filter(entity_id == entities$entity_id[2], value < power_threshhold) %>% tail(1) %>% pull(time) +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){ diff --git a/laundry_status.R b/laundry_status.R old mode 100644 new mode 100755