minmax sensorvärde per dygn

Moderators: hekj, Telldus

Leffe
Posts: 96
Joined: Fri Mar 17, 2023 9:45 am

Re: minmax sensorvärde per dygn

Post 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:
hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Re: minmax sensorvärde per dygn

Post 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
Leffe
Posts: 96
Joined: Fri Mar 17, 2023 9:45 am

Re: minmax sensorvärde per dygn

Post 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
hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Re: minmax sensorvärde per dygn

Post 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#";
Leffe
Posts: 96
Joined: Fri Mar 17, 2023 9:45 am

Re: minmax sensorvärde per dygn

Post 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:
MALI
Posts: 3
Joined: Fri Mar 17, 2023 9:45 am

Re: minmax sensorvärde per dygn

Post 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>

Post Reply