Page 2 of 2

Re: minmax sensorvärde per dygn

Posted: Fri Mar 17, 2023 9:45 am
by Leffe
hej igen

ja nu har jag editerat maklat och grejat men jag får inte ihop det.

jag får nu en datafil (txt) med värden ,men om jag använder visarinstrumentet utan att editera får jag dom statiska värderna som ligger i html sidan om jag editerar den med dom föreslagna ändringarna så visas bare en gråtonad ram

vad gör jag för fel? :roll:

Re: minmax sensorvärde per dygn

Posted: Fri Mar 17, 2023 9:45 am
by hekj
Leffe wrote:ja nu har jag editerat maklat och grejat men jag får inte ihop det.

jag får nu en datafil (txt) med värden ,men om jag använder visarinstrumentet utan att editera får jag dom statiska värderna som ligger i html sidan om jag editerar den med dom föreslagna ändringarna så visas bare en gråtonad ram

vad gör jag för fel? :roll:
Skicka ett mail till mig med filerna så kan jag kolla på dom.
NexaHome.xml
start.bsh
minmax_112_temp.bsh
samt html filen

Re: minmax sensorvärde per dygn

Posted: Fri Mar 17, 2023 9:45 am
by Leffe
hekj wrote:
Leffe wrote:ja nu har jag editerat maklat och grejat men jag får inte ihop det.

jag får nu en datafil (txt) med värden ,men om jag använder visarinstrumentet utan att editera får jag dom statiska värderna som ligger i html sidan om jag editerar den med dom föreslagna ändringarna så visas bare en gråtonad ram

vad gör jag för fel? :roll:
Skicka ett mail till mig med filerna så kan jag kolla på dom.
NexaHome.xml
start.bsh
minmax_112_temp.bsh
samt html filen

Tack
skickade skapandedata

Leffe :D

Re: minmax sensorvärde per dygn

Posted: Fri Mar 17, 2023 9:45 am
by hekj
Leffe wrote:
hekj wrote:
Leffe wrote:ja nu har jag editerat maklat och grejat men jag får inte ihop det.

jag får nu en datafil (txt) med värden ,men om jag använder visarinstrumentet utan att editera får jag dom statiska värderna som ligger i html sidan om jag editerar den med dom föreslagna ändringarna så visas bare en gråtonad ram

vad gör jag för fel? :roll:
Skicka ett mail till mig med filerna så kan jag kolla på dom.
NexaHome.xml
start.bsh
minmax_112_temp.bsh
samt html filen
Tack
skickade skapandedata

Leffe :D
Du har fått in ett extra tecken i html filen efter likamedtecknet, dvs ett / som ska bort.

Code: Select all

       sensorName             = /"#DATA#name55#";
-->

Code: Select all

       sensorName             = "#DATA#name55#";

Re: minmax sensorvärde per dygn

Posted: Fri Mar 17, 2023 9:45 am
by Leffe
Ja dom säger ju att det första man blir blind på är ögonen.

Lite pinsamt är det ju jag tycker jag har gått igenom det tecken för tecken men ändå

Mycket stort tack :D :D

Up and running :wave:

Re: minmax sensorvärde per dygn

Posted: Fri Mar 17, 2023 9:45 am
by MALI
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>