diff options
Diffstat (limited to 'sql/chart.r')
-rwxr-xr-x | sql/chart.r | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/sql/chart.r b/sql/chart.r new file mode 100755 index 0000000..5575293 --- /dev/null +++ b/sql/chart.r @@ -0,0 +1,148 @@ +#!/usr/bin/Rscript --vanilla +require(RPostgreSQL) +require(RSvgDevice) +nulltime <- strptime("01.01.1970", "%d.%m.%Y") + +drv <- dbDriver("PostgreSQL") +con <- dbConnect(drv, host="10.2.2.22", user="jack", password="jack", dbname="ebus") + + +## plot 1 +#png(file = "Rplots.png", width=1500, height=800) +devSVG(file="Rplots.svg",width=15,height=10) +par(cex=1.25) +cat("Starte Abfragen\n") +brenner <- dbGetQuery(con, + paste("SELECT timestamp as \"time\" + , value_string + FROM value + WHERE sensor_id IN (select id from sensor where name = 'heizkreisregler1.betriebsdatenFeuerungsautomat.betriebszustand') + AND timestamp > now() - interval '1 day'", + " AND value_string IS NOT NULL", + " ORDER BY timestamp asc", sep="")) + +## Brennerstatus auf Brennerstaotusänderungen reduzieren + +brennerBla <- table(NULL,NULL) +liste <- c() +old_value_string <- "bla" +for (i in seq(1,nrow(brenner))) { + if (brenner$value_string[i] != old_value_string) { + old_value_string <- brenner$value_string[i] + brennerBla <- rbind(brennerBla, data.frame(time=brenner$time[i], value_string=brenner$value_string[i])) + } +} +brenner <- brennerBla + +# Solar Pumpe +solarEngine <- dbGetQuery(con, + paste("SELECT timestamp as \"time\", + value_int + FROM value + WHERE sensor_id IN (select id from sensor where name = 'heizkreisregler9.solarDaten.solarPumpe') + AND timestamp > now() - interval '1 day' + AND value_int IS NOT NULL + ORDER BY timestamp asc", sep="")) +# reduzieren +solarEngineNew <- table(NULL,NULL) +emptyList <- c() +old_value_int <- "blub" +for (i in seq(1,nrow(solarEngine))) { + if (solarEngine$value_int[i] != old_value_int) { + old_value_int <- solarEngine$value_int[i] + solarEngineNew <- rbind(solarEngineNew, data.frame(time=solarEngine$time[i], value_int=solarEngine$value_int[i])) + } +} +solarEngine <- solarEngineNew + +# Numerische Sensoren Lesen +readNumericSensorDay <- function (sensorName) { + d <- dbGetQuery(con, + paste("SELECT timestamp", + " , COALESCE(value_int,value_float) \"value\"", + " FROM value", + " WHERE sensor_id IN (select id from sensor where name = '",sensorName,"')", + " AND timestamp > now() - interval '1 day'", + # ausreißer ausblenden + " AND COALESCE(value_int,value_float) < 200", + " AND COALESCE(value_int,value_float) > -50", + " ORDER BY timestamp desc", sep="")) + d$timestamp <- as.POSIXct(round(d$timestamp, "mins")) + #d <- supsmu(as.vector(d$timestamp), as.vector(d$value)) + names(d) <- c("time", "value") + + myMean <- function(values) { + if (mad(values) > 2) { + print(paste("Streiche ",length(values), + " Werte aus",sensorName, + "mad =", mad(values))) + values <- values * NA + } + mean(values) + } + +# dm <- aggregate(d$value, list(time=d$time), myMean) + dm <- d + dm$time <- as.POSIXct(dm$time,origin=nulltime) + names(dm) <- c("time", sensorName) + dm +} + +warmwasser <- readNumericSensorDay("heizkreisregler9.solarDaten.tempWarmwasserSolar") +kessel <- readNumericSensorDay("heizkreisregler10.betriebsdatenRegler1.kesselTemperatur") +kollektor <- readNumericSensorDay("heizkreisregler9.solarDaten.tempKollektor") +aussenTemperatur <- readNumericSensorDay("feuerungsautomat1.betriebsdatenRegler1.aussenTemperatur") + +# -- TODO ausreißer als punkte darstellen +data <- Reduce(function(x,y) { merge(x,y,all.x=TRUE) }, list(kollektor, kessel, warmwasser, aussenTemperatur)) + + + +cat("Plotte\n") +plot.new() +plot.window(xlim=c(min(data$time), max(data$time)), + ylim=c(min(data[2:length(data)],na.rm=TRUE)*0.9, max(data[2:length(data)],na.rm=TRUE)*1.1)) +par(lwd=2) + + +for (i in c(2:length(data))) { + lines(subset(data,select=c(1,i)), + col=rainbow(length(data)-1)[i-1]) +} +box() + +for (i in c(1:nrow(brenner))) { + text(as.numeric(brenner$time[i]), max(data[2:length(data)],na.rm=TRUE)/2, paste("ab hier", brenner$value_string[i]) ,srt=90) +} + +# quick and dirty add solarEngine to plot + +rect_start <- 0 +rect_color <- rgb(255, 255, 0, alpha=40, maxColorValue=255) + +for (i in c(1:nrow(solarEngine))) { + if (solarEngine$value_int[i] == 1) { + rect_start <- solarEngine$time[i]; + } else if (rect_start != 0) { + end <- solarEngine$time[i]; + # plot + rect(rect_start, 0, solarEngine$time[i], 100, col=rect_color,border=F) + beginn <- 0 + } + #text(as.numeric(solarEngine$time[i]), max(data[2:length(data)],na.rm=TRUE)/2, paste("Solar Pumpe", solarEngine$value_int[i]), srt=90) +} + +rangeX <- as.POSIXct(range(data$time)) +s <- round.POSIXt(seq(rangeX[1], rangeX[2], by=60*60),"hour") +axis.POSIXct(1, at=s, format="%H:%M") + +r <- range(data[2:length(data)], na.rm=TRUE) +s <- seq(r[1], r[2], by=(r[2]-r[1])/8) +axis(2, at=s, labels=paste(round(s,1),"°C")) +legend('topleft', + legend=names(data)[2:length(data)], + fill=rainbow(length(data)-1)) +title(paste("Temperaturen ", rangeX[1], " bis ", rangeX[2])) +dev.off() + +dbDisconnect(con) |