Hej.
Har modifierat minmax scriptet så att värdena skrivs i en tmp fil var gång min eller maxvärdena förändras.
Denna fil läser jag sedan in vid varje omstart och uppdaterar värdena i minmax till hur de så utt före omstart.
Den uppdateras inte om den startar om mellan 00:00 och 00:05 för då har jag satt en automatisk omstart av NexaHome.
Code: Select all
//logga min samt max per dygn till fil
//spara värden för att presentera termometer (.png)
import java.text.SimpleDateFormat;
sensor = "52";
name = "Ute";
path = "/home/pi/nexahome/tmp/";
setData("name" + sensor, name);
temp = getSensorValue(sensor); //sträng
temp_timestamp = getSensorTimestamp(sensor, true);
//echo(sensor + " = " + temp);
if (temp != null && temp_timestamp != null && temp_timestamp.length() != 0) {
temp_date = temp_timestamp.substring(0, 10);
temp_time = temp_timestamp.substring(11, 16);
//echo(sensor + " = " + temp_time);
setData("temp" + sensor, temp);
setData("temp_time" + sensor, temp_time);
temp_value = Float.parseFloat(temp); //decimaltal
min = getData("min" + sensor);
min_time = getData("min_time" + sensor);
max = getData("max" + sensor);
//echo("min = " + min + ", max = " + max);
max_time = getData("max_time" + sensor);
minmax_date = getData("minmax_date" + sensor);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
date = sdf.format(cal.getTime());
if (min != null && min.length() != 0) {
min_value = Float.parseFloat(min);
max_value = Float.parseFloat(max);
graf_offset = 59;
pixel_per_grad = ((float)620 - 59) / 80;
temp_graf_value = (float)409 - (temp_value * pixel_per_grad);
temp_graf_value = Math.round(temp_graf_value);
setData("temp_graf_value" + sensor, temp_graf_value);
temp_graf_text_pos = temp_graf_value - 12;
setData("temp_graf_text_pos" + sensor, temp_graf_text_pos);
graf_height_value = (float)409 - (-33 * pixel_per_grad) - temp_graf_value + 1;
graf_height_value = Math.round(graf_height_value);
setData("graf_height_value" + sensor, graf_height_value);
max_graf_value = (((float)50 - max_value) * pixel_per_grad) + graf_offset;
max_graf_value = Math.round(max_graf_value);
max_graf_value = max_graf_value - 19;
setData("max_graf_value" + sensor, max_graf_value);
max_graf_text_pos = max_graf_value - 17;
setData("max_graf_text_pos" + sensor, max_graf_text_pos);
min_graf_value = (((float)50 - min_value) * pixel_per_grad) + graf_offset;
min_graf_value = Math.round(min_graf_value);
min_graf_value = min_graf_value - 19;
setData("min_graf_value" + sensor, min_graf_value);
min_graf_text_pos = min_graf_value + 36;
setData("min_graf_text_pos" + sensor, min_graf_text_pos);
if (temp_value < min_value) {
//echo("nytt värde - mintemp = " + temp_value);
min = temp_value;
min_time = temp_time;
setData("min" + sensor, temp);
setData("min_time" + sensor, temp_time);
// Skriv förändrat värde till tmp fil
try{
file = path + date + "_temp_minmax" + "." + sensor + ".tmp";
FileWriter fw = new FileWriter(file, true);
BufferedWriter out = new BufferedWriter(fw);
out.write(minmax_date + "\t" + min + "\t" + min_time + "\t" + max + "\t" + max_time+ "\r\n");
out.close();
} catch (Exception e) {
//echo("Error: " + e.getMessage());
}
} else if (temp_value > max_value) {
//echo("nytt värde - maxtemp = " + temp_value);
max = temp_value;
max_time = temp_time;
setData("max" + sensor, temp);
setData("max_time" + sensor, temp_time);
// Skriv förändrat värde till tmp fil
try{
file = path + date + "_temp_minmax" + "." + sensor + ".tmp";
FileWriter fw = new FileWriter(file, true);
BufferedWriter out = new BufferedWriter(fw);
out.write(minmax_date + "\t" + min + "\t" + min_time + "\t" + max + "\t" + max_time+ "\r\n");
out.close();
} catch (Exception e) {
//echo("Error: " + e.getMessage());
}
} else {
hideOutput();
}
if (!date.equals(minmax_date)) {
////echo(date + " - " + minmax_date);
//sdf.format(cal.getTime())
if (temp_time.equals("23:59")) {temp_time="00:00";}
try{
file = "temp_minmax" + "." + sensor + ".txt";
FileWriter fw = new FileWriter(file, true);
BufferedWriter out = new BufferedWriter(fw);
out.write(minmax_date + "\t" + min + "\t" + min_time + "\t" + max + "\t" + max_time+ "\r\n");
out.close();
//echo("write to file");
setData("min" + sensor, temp);
setData("min_time" + sensor, temp_time);
setData("max" + sensor, temp);
setData("max_time" + sensor, temp_time);
setData("minmax_date" + sensor, date);
//echo(sensor + " min/max = " + temp + ", datum = " + date);
} catch (Exception e) {
//echo("Error: " + e.getMessage());
}
}
} else {
// ---
min = temp;
max = temp;
min_time = temp_time ;
max_time = temp_time ;
HH=temp_time.substring(0,2) ;
MM=temp_time.substring(3,5) ;
int hr=Integer.parseInt(HH);
int mi=Integer.parseInt(MM);
if ((hr == 00) && (mi > 05)|| (hr > 00) && (mi > 00)) {
import java.io.FileReader;
FileReader fileReader=new FileReader("/home/pi/nexahome/tmp/" + date + "_temp_minmax." + sensor + ".tmp");
BufferedReader bufferReader= new BufferedReader(fileReader);
String line=bufferReader.readLine();
min = 100.0 ;
max = 0.0 ;
min_time = "00:00" ;
max_time = "00:00" ;
while(line!=null)
{
//echo(line);
//---
String[] words = line.split("\t");
for (int i = 0; i < words.length; i++) {
//echo(words[i]);
if ((i == 1) || (i == 2)) {
min_test = Float.parseFloat(words[1]) ;
if (min > min_test) {
min = min_test ;
min_time = words[2] ;
}
}
if ((i == 3) || (i == 4)) {
max_test = Float.parseFloat(words[3]) ;
if (max < max_test) {
max = max_test ;
max_time = words[4] ;
}
}
}
//---
line=bufferReader.readLine();
}
echo(min) ;
echo(min_time) ;
echo(max) ;
echo(max_time);
fileReader.close();
bufferReader.close();
}
// ---
setData("temp" + sensor, temp);
setData("temp_time" + sensor, temp_time);
// setData("min" + sensor, temp);
setData("min" + sensor, min);
//setData("min_time" + sensor, temp_time);
setData("min_time" + sensor, min_time);
//setData("max" + sensor, temp);
setData("max" + sensor, max);
//setData("max_time" + sensor, temp_time);
setData("max_time" + sensor, max_time);
setData("minmax_date" + sensor, date);
setData("name" + sensor, name);
//echo(sensor + " min/max = " + temp + ", datum = " + date);
}
}
startTimer("minmax_" + sensor + "_temp", 60);
Det fina visarinstrumentet som finns i tråden har jag uppdaterat så att även den visar när den senast uppdaterades.
Min sensor heter 52 och instrumentet visar mellan -30 och + 30 grader där minussidan är blå och + sidan röd.
Allt för att förenkla för er som vill använda scriptet och anpassa det för eget bruk.
Code: Select all
<div style="position: absolute; top: 5px; left: 650px">
<canvas id="myCanvas" width="300" height="300" style="border:0px solid #d3d3d3;">
Your browser does not support the HTML5 canvas tag.</canvas>
<script>
var canvas = document.getElementById("myCanvas");
var context = canvas.getContext("2d");
var x = canvas.width / 2;
var y = canvas.height / 2;
var radius = 120;
grafMinAngle = 1.06;
grafMaxAngle = 1.94;
grafMinGrader = 180 + 10;
grafMaxGrader = 360 - 10;
grafMinTemp = -30;
grafMaxTemp = 30;
sensorName = "#DATA#name52#";
minTemp = #DATA#min52#;
minTempTime = "#DATA#min_time52#";
currentTemp = #DATA#temp52#;
currentTempTime = "#DATA#temp_time52#";
maxTemp = "#DATA#max52#";
maxTempTime = "#DATA#max_time52#";
range = grafMaxTemp - grafMinTemp;
anglePerEnhet = (grafMaxAngle - grafMinAngle) /(grafMaxTemp-grafMinTemp);
gradPerEnhet = (grafMaxGrader - grafMinGrader) /(grafMaxTemp-grafMinTemp);
zeroGrader = grafMinGrader + ((0 - grafMinTemp) * gradPerEnhet);
minTempGrader = grafMinGrader + ((minTemp - grafMinTemp) * gradPerEnhet)
currentTempGrader = grafMinGrader + ((currentTemp - grafMinTemp) * gradPerEnhet)
maxTempGrader = grafMinGrader + ((maxTemp - grafMinTemp) * gradPerEnhet)
//ska röd yta ritas?
if (grafMaxTemp > 0) {
if (grafMinTemp < 0) {
startAngle = (grafMinGrader + (0 - grafMinTemp) * gradPerEnhet) * Math.PI / 180;
} else {
startAngle = grafMinGrader * Math.PI / 180;
}
endAngle = grafMaxGrader * Math.PI / 180;
var counterClockwise = false;
context.beginPath();
context.arc(x, y, radius - 1, startAngle, endAngle, counterClockwise);
context.lineWidth = 7;
context.strokeStyle = 'red';
context.stroke();
}
//ska blå yta ritas?
if (grafMinTemp < 0) {
startAngle = grafMinGrader * Math.PI / 180;
if (grafMaxTemp > 0) {
endAngle = (grafMinGrader + (0 - grafMinTemp) * gradPerEnhet) * Math.PI / 180;
} else {
endAngle = grafMaxGrader * Math.PI / 180;
}
counterClockwise = false;
context.beginPath();
context.arc(x, y, radius - 1, startAngle, endAngle, counterClockwise);
context.lineWidth = 7;
context.strokeStyle = 'blue';
context.stroke();
}
// gradering 0.5
x_center = x;
y_center = y;
context.strokeStyle = 'black';
for (var i = grafMinGrader + 180; i <= grafMaxGrader + 180; i = i + gradPerEnhet*0.5) {
radianer = i * Math.PI/180;
x_cb1 = x_center - ((radius - 1) * Math.cos(radianer));
y_cb1 = y_center - ((radius - 1) * Math.sin(radianer));
x_cb2 = x_center - ((radius + 0) * Math.cos(radianer));
y_cb2 = y_center - ((radius + 0) * Math.sin(radianer));
if (i < zeroGrader + 180) {
context.strokeStyle = 'white';
} else {
context.strokeStyle = 'black';
}
context.beginPath();
context.moveTo(x_cb1, y_cb1);
context.lineTo(x_cb2, y_cb2);
context.lineWidth = 1;
context.lineCap = 'round';
context.stroke();
}
// gradering 1
for (var i = grafMinGrader + 180; i <= grafMaxGrader + 180; i = i + gradPerEnhet*1) {
radianer = i * Math.PI/180;
x_cb1 = x_center - ((radius - 6) * Math.cos(radianer));
y_cb1 = y_center - ((radius - 6) * Math.sin(radianer));
x_cb2 = x_center - ((radius + 5) * Math.cos(radianer));
y_cb2 = y_center - ((radius + 5) * Math.sin(radianer));
context.beginPath();
context.moveTo(x_cb1, y_cb1);
context.lineTo(x_cb2, y_cb2);
context.lineWidth = 1;
context.lineCap = 'round';
context.stroke();
}
// gradering 5
for (var i = grafMinGrader + 180; i <= grafMaxGrader + 180; i = i + gradPerEnhet*5) {
radianer = i * Math.PI/180;
x_cb1 = x_center - ((radius - 6) * Math.cos(radianer));
y_cb1 = y_center - ((radius - 6) * Math.sin(radianer));
x_cb2 = x_center - ((radius + 10) * Math.cos(radianer));
y_cb2 = y_center - ((radius + 10) * Math.sin(radianer));
context.beginPath();
context.moveTo(x_cb1, y_cb1);
context.lineTo(x_cb2, y_cb2);
context.lineWidth = 2;
context.lineCap = 'round';
context.stroke();
}
// gradering 10
text = grafMinTemp;
for (var i = grafMinGrader + 180; i <= grafMaxGrader + 180; i = i + gradPerEnhet*10) {
radianer = i * Math.PI/180;
x_cb1 = x_center - ((radius - 6) * Math.cos(radianer));
y_cb1 = y_center - ((radius - 6) * Math.sin(radianer));
x_cb2 = x_center - ((radius + 15) * Math.cos(radianer));
y_cb2 = y_center - ((radius + 15) * Math.sin(radianer));
context.beginPath();
context.moveTo(x_cb1, y_cb1);
context.lineTo(x_cb2, y_cb2);
context.lineWidth = 2;
context.lineCap = 'round';
context.stroke();
textPosX = x_cb2 + 0;
textPosY = y_cb2 + -4;
context.font = 'bold 13pt Calibri';
context.textAlign = 'center';
context.fillStyle = 'black';
context.fillText(text, textPosX, textPosY);
text = text + 10;
}
//minTemp visare
if (minTempGrader >= grafMinGrader && minTempGrader <= grafMaxGrader){
radianer = (minTempGrader + 180) * Math.PI/180;
x_cb1 = x_center - ((radius - 40) * Math.cos(radianer));
y_cb1 = y_center - ((radius - 40) * Math.sin(radianer));
x_cb2 = x_center - ((radius - 9) * Math.cos(radianer));
y_cb2 = y_center - ((radius - 9) * Math.sin(radianer));
context.beginPath();
context.moveTo(x_cb1, y_cb1);
context.lineTo(x_cb2, y_cb2);
context.lineWidth = 3;
context.strokeStyle = 'blue';
context.lineCap = 'round';
context.shadowColor = '#999';
context.shadowBlur = 10;
context.shadowOffsetX = 5;
context.shadowOffsetY = 5;
context.stroke();
if ((minTemp - grafMinTemp) / range <= 0.5) {
xMod = -1;
yMod = 9;
} else {
xMod = -4;
yMod = -9;
}
context.shadowColor = '#999';
context.shadowBlur = 0;
context.shadowOffsetX = 0;
context.shadowOffsetY = 0;
context.font = 'normal 10pt Calibri';
context.textAlign = 'right';
context.fillStyle = 'blue';
context.fillText("(" + minTempTime + ")", x_cb1 + xMod, y_cb1 + yMod);
}
//max visare
if (maxTempGrader >= grafMinGrader && maxTempGrader <= grafMaxGrader){
radianer = (maxTempGrader + 180) * Math.PI/180;
x_cb1 = x_center - ((radius - 40) * Math.cos(radianer));
y_cb1 = y_center - ((radius - 40) * Math.sin(radianer));
x_cb2 = x_center - ((radius - 9) * Math.cos(radianer));
y_cb2 = y_center - ((radius - 9) * Math.sin(radianer));
context.beginPath();
context.moveTo(x_cb1, y_cb1);
context.lineTo(x_cb2, y_cb2);
context.lineWidth = 3;
context.strokeStyle = 'red';
context.lineCap = 'round';
context.shadowColor = '#999';
context.shadowBlur = 10;
context.shadowOffsetX = 5;
context.shadowOffsetY = 5;
context.stroke();
if ((maxTemp - grafMinTemp) / range > 0.5) {
xMod = -1;
yMod = 10;
} else {
xMod = -4;
yMod = -10;
}
context.shadowColor = '#999';
context.shadowBlur = 0;
context.shadowOffsetX = 0;
context.shadowOffsetY = 0;
context.font = 'normal 10pt Calibri';
context.textAlign = 'left';
//context.textBaseline = 'center';
context.fillStyle = 'red';
context.fillText("(" + maxTempTime + ")", x_cb1 + xMod, y_cb1 + yMod);
}
//currentTemp visare
if (currentTempGrader >= grafMinGrader && currentTempGrader <= grafMaxGrader){
radianer = (currentTempGrader + 180) * Math.PI/180;
start = 9;
len = 67;
end = start + len;
x_cb2 = x_center - ((radius - start) * Math.cos(radianer));
y_cb2 = y_center - ((radius - start) * Math.sin(radianer));
x_cb1 = x_center - ((radius - end) * Math.cos(radianer));
y_cb1 = y_center - ((radius - end) * Math.sin(radianer));
context.beginPath();
context.moveTo(x_cb1, y_cb1);
context.lineTo(x_cb2, y_cb2);
context.lineWidth = 3;
context.strokeStyle = 'black';
context.lineCap = 'round';
context.shadowColor = '#999';
context.shadowBlur = 10;
context.shadowOffsetX = 5;
context.shadowOffsetY = 5;
context.stroke();
}
//minTemp "punkt"
if (minTempGrader >= grafMinGrader && minTempGrader <= grafMaxGrader){
radianer = (minTempGrader + 180) * Math.PI/180;
start = 24;
len = 1;
end = start - len;
x_cb2 = x_center - ((radius - start) * Math.cos(radianer));
y_cb2 = y_center - ((radius - start) * Math.sin(radianer));
x_cb1 = x_center - ((radius - end) * Math.cos(radianer));
y_cb1 = y_center - ((radius - end) * Math.sin(radianer));
context.beginPath();
context.moveTo(x_cb1, y_cb1);
context.lineTo(x_cb2, y_cb2);
context.lineWidth = 8;
context.strokeStyle = 'blue';
context.lineCap = 'round';
context.stroke();
}
//maxTemp "punkt"
if (maxTempGrader >= grafMinGrader && maxTempGrader <= grafMaxGrader){
radianer = (maxTempGrader + 180) * Math.PI/180;
start = 15;
len = 1;
end = start - len;
x_cb2 = x_center - ((radius - start) * Math.cos(radianer));
y_cb2 = y_center - ((radius - start) * Math.sin(radianer));
x_cb1 = x_center - ((radius - end) * Math.cos(radianer));
y_cb1 = y_center - ((radius - end) * Math.sin(radianer));
context.beginPath();
context.moveTo(x_cb1, y_cb1);
context.lineTo(x_cb2, y_cb2);
context.lineWidth = 8;
context.strokeStyle = 'red';
context.lineCap = 'round';
context.stroke();
}
//minTemp
context.font = 'normal 13pt Calibri';
context.textAlign = 'left';
context.fillStyle = 'blue';
DEGREE = "\u00B0" + "C";
context.shadowColor = '#999';
context.shadowBlur = 0;
context.shadowOffsetX = 0;
context.shadowOffsetY = 0;
context.fillText(minTemp + DEGREE, x - radius - 12, y - 5);
//currentTemp
context.beginPath();
context.arc(150, 150, 38, 0, Math.PI, true);
context.closePath();
context.lineWidth = 2;
if (currentTemp < 0) {
context.shadowColor = '#999';
context.shadowBlur = 10;
context.shadowOffsetX = 5;
context.shadowOffsetY = 5;
context.fillStyle = 'lightskyblue';
context.fill();
context.strokeStyle = 'blue';
context.stroke();
} else {
context.shadowColor = '#999';
context.shadowBlur = 10;
context.shadowOffsetX = 5;
context.shadowOffsetY = 5;
context.fillStyle = '#FFAD99';
context.fill();
context.strokeStyle = 'red';
context.stroke();
}
context.shadowColor = '#999';
context.shadowBlur = 0;
context.shadowOffsetX = 0;
context.shadowOffsetY = 0;
context.font = 'normal 15pt Calibri';
context.textAlign = 'center';
context.fillStyle = 'black';
DEGREE = "\u00B0" + "C";
context.fillText(currentTemp + DEGREE, x, y - 5);
//maxTemp
context.font = 'normal 13pt Calibri';
context.textAlign = 'right';
//context.textBaseline = 'left';
context.fillStyle = 'red';
DEGREE = "\u00B0" + "C";
context.fillText(maxTemp + DEGREE, x + radius + 12, y - 5);
//sensorName
context.beginPath();
context.rect(x - radius - 14, y, (radius + 14) * 2, 22);
context.shadowColor = '#999';
context.shadowBlur = 10;
context.shadowOffsetX = 5;
context.shadowOffsetY = 5;
context.fillStyle = 'lightgray';
context.fill();
context.lineWidth = 2;
context.strokeStyle = 'black';
context.stroke();
context.font = 'normal 14pt Calibri';
context.textAlign = 'center';
context.shadowColor = '#999';
context.shadowBlur = 0;
context.shadowOffsetX = 0;
context.shadowOffsetY = 0;
context.fillStyle = 'black';
DEGREE = "\u00B0" + "C";
context.fillText(sensorName + " (" + currentTempTime + ")", x, y + 18);
// context.fillText(sensorName, x, y + 18);
</script>
</div>