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?
minmax sensorvärde per dygn
Re: minmax sensorvärde per dygn
Skicka ett mail till mig med filerna så kan jag kolla på dom.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?
NexaHome.xml
start.bsh
minmax_112_temp.bsh
samt html filen
Henrik | http://easyhomeauto.se
Re: minmax sensorvärde per dygn
hekj wrote:Skicka ett mail till mig med filerna så kan jag kolla på dom.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?
NexaHome.xml
start.bsh
minmax_112_temp.bsh
samt html filen
Tack
skickade skapandedata
Leffe
Re: minmax sensorvärde per dygn
Du har fått in ett extra tecken i html filen efter likamedtecknet, dvs ett / som ska bort.Leffe wrote:Tackhekj wrote:Skicka ett mail till mig med filerna så kan jag kolla på dom.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?
NexaHome.xml
start.bsh
minmax_112_temp.bsh
samt html filen
skickade skapandedata
Leffe
Code: Select all
sensorName = /"#DATA#name55#";
Code: Select all
sensorName = "#DATA#name55#";
Henrik | http://easyhomeauto.se
Re: minmax sensorvärde per dygn
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
Up and running
Lite pinsamt är det ju jag tycker jag har gått igenom det tecken för tecken men ändå
Mycket stort tack
Up and running
Re: minmax sensorvärde per dygn
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.
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.
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);
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>