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>