#!/usr/bin/Rscript --vanilla require(RPostgreSQL) 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) 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)