Tips: Att visa sensordata grafiskt

Moderators: hekj, Telldus

hekj
Posts: 992
Joined: Thu Jan 18, 2018 11:08 am
Location: Stockholm
Contact:

Re: Tips: Att visa sensordata grafiskt

Post by hekj » Thu Jan 18, 2018 11:08 am

liverpoolarn wrote:Jaha... skit!
Nu har jag tydligen lyckats krångla till det på något vis... det funkade fint tidigare när jag bara körde med en sensor. När jag sedan lade till de övriga id:na så slutade det att fungera. Och nu får jag inte ens det att fungera med en sensor igen. :-S

Nu får jag felet att param o params är null i mypage.bsh.

Skulle någon som har fått tre sensorer att fungera på kunna lägga upp både mypage.bsh o save_temp.bsh så jag kan se vad som är galet med mina script?
liverpoolarn wrote:Har upptäckt vart felet är och det uppkommer när jag försöker lägga till flera sensorer.

Min temp-fil ser ut så här:

Code: Select all

2012-11-28 20:26	21,2	  1,4
2012-11-28 20:29	21,2	  1,3
2012-11-28 20:30	21,2	  1,3
2012-11-28 20:35	21,2	  1,4
2012-11-28 20:36	21,3	  1,3
Det är tabbar mellan temp-värdena.

Det som blir fel verkar vara i toknizern och ger felmeddelande:
The script threw an exception (mypage.bsh): Sourced file: mypage.bsh : Typed variable declaration : Method Invocation st.nextToken : at Line: 72 : in file: mypage.bsh : st .nextToken ( )

Target exception: java.util.NoSuchElementException

Så med denna kod begriper jag inte hur någon annan kan ha fått igång detta, för det går ju definitivt inte använda samma mypage.bsh och save_temp.bsh som ligger i det här ärendet. Så snälla kan någon hjälpa en icke programmerings-kunnig nisse på traven här?
Jag blir lite osäker på vad du vill göra, har du två eller tre sensorer?

För att läsa in din temp fil som innehåller två sensorer ska du uppdatera mypage.bsh enligt anvisningarna i första inlägget:

Modifiera följande kodavsnitt om du har fler/färre sensorer som loggas till fil.
String[] labels = { "Värmepump", "Inne", "Ute" };
SensorChart.initGraph(labels.length, 1);
SensorChart.initSeries(0, labels[0], Color.red);
SensorChart.initSeries(1, labels[1], Color.black);
SensorChart.initSeries(2, labels[2], Color.blue);
String s1 = st.nextToken().replace(',', '.');
String s2 = st.nextToken().replace(',', '.');
String s3 = st.nextToken().replace(',', '.');
if (!s1.equals("?")) {
double d1 = Double.parseDouble(s1);
SensorChart.addValue(0, year, month, day, hour, minute, d1);
}
if (!s2.equals("?")) {
double d2 = Double.parseDouble(s2);
SensorChart.addValue(1, year, month, day, hour, minute, d2);
}
if (!s3.equals("?")) {
double d3 = Double.parseDouble(s3);
SensorChart.addValue(2, year, month, day, hour, minute, d3);
}
Eftersom att du har två sensorer ska du ta bort följande rader:
SensorChart.initSeries(2, labels[2], Color.blue);

String s3 = st.nextToken().replace(',', '.');

if (!s3.equals("?")) {
double d3 = Double.parseDouble(s3);
SensorChart.addValue(2, year, month, day, hour, minute, d3);
}
Du ska även modifiera följande rad:
String[] labels = { "Värmepump", "Inne", "Ute" };
-->
String[] labels = { "Inne", "Ute" };

liverpoolarn
Posts: 65
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Att visa sensordata grafiskt

Post by liverpoolarn » Thu Jan 18, 2018 11:08 am

Ajdå, det var dåligt av mig att skriva sådär då. Jag har såklart tre sensorer.
MEN, det kanske är så att vi lokaliserade felet till temp-filen ändå. För det är ju inte alltid temp-värden på alla tre sensorerna så att säga.

Är det kanske så att bara för att det inte finns någon temp-värde på första raden så går funktionen helt bananas?
När man kör igång NexaHome så tar det ju ett par minuter innan alla sensorerna reggat sina värden i txt-filen.

Får testa om det kan vara det som är problemet kanske. Det är nog väldigt vanligt när jag tänker efter att det bara står ett eller två tempvärden på första raden bara.

hekj
Posts: 992
Joined: Thu Jan 18, 2018 11:08 am
Location: Stockholm
Contact:

Re: Tips: Att visa sensordata grafiskt

Post by hekj » Thu Jan 18, 2018 11:08 am

liverpoolarn wrote:Ajdå, det var dåligt av mig att skriva sådär då. Jag har såklart tre sensorer.
MEN, det kanske är så att vi lokaliserade felet till temp-filen ändå. För det är ju inte alltid temp-värden på alla tre sensorerna så att säga.

Är det kanske så att bara för att det inte finns någon temp-värde på första raden så går funktionen helt bananas?
När man kör igång NexaHome så tar det ju ett par minuter innan alla sensorerna reggat sina värden i txt-filen.

Får testa om det kan vara det som är problemet kanske. Det är nog väldigt vanligt när jag tänker efter att det bara står ett eller två tempvärden på första raden bara.
Du skulle kunna prova en ny variant av mypage.bsh

Code: Select all

path = "C:/apps/nexahome/";
temp = false;
params = getData("mypage.params_");
if (params != null) {
//echo(params);
   var len = Integer.parseInt(params);
   for (int ndx = 1; ndx <= len; ndx++) {
      param = getData("mypage.param" + ndx + "_");
//echo(param);
      if (param.equals("mypage=temp")) {
         temp = true;
      }
   }
} else {
   echo("mypage.params_ == null");
}
if (temp) {
   import java.awt.Color;
   import java.io.BufferedReader;
   import java.io.File;
   import java.io.FileReader;
   import java.io.IOException;
   import java.text.ParsePosition;
   import java.text.SimpleDateFormat;
   import java.util.Calendar;
   import java.util.Date;
   import java.util.StringTokenizer;

   addClassPath("C:/apps/nexahome/jcommon-1.0.17.jar");
   addClassPath("C:/apps/nexahome/jfreechart-1.0.14.jar");
   addClassPath("C:/apps/nexahome/.");

	String[] labels = { "Inne", "Ute", "Sensor3" };
	SensorChart.initGraph(labels.length, 1);
	for (int gNdx = 0; gNdx < labels.length; gNdx++) {
		color = Color.white;
		switch (gNdx) {
		case 0:
			color = Color.red;
			break;
		case 1:
			color = Color.black;
			break;
		case 2:
			color = Color.blue;
			break;
		case 3:
			color = Color.yellow;
			break;
		 }
		SensorChart.initSeries(gNdx, labels[gNdx], color);
	}

	Calendar cal = Calendar.getInstance();
	int back = 1;
	cal.add(Calendar.DAY_OF_YEAR, -back);
	for (int dNdx = 0; dNdx <= back; dNdx++) {
		StringBuffer buf = new StringBuffer();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		File f = new File(path + "temp_" + sdf.format(cal.getTime()) + ".txt");
		if (f.exists()) {
			BufferedReader br = null;
			try {
				br = new BufferedReader(new FileReader(f));
				String line = null;
				do {
					line = br.readLine();
					if (line != null) {
						buf.append(line);
						buf.append("\n");
					}
				} while(line != null);
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					if (br != null) {
						br.close();
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
			StringTokenizer st1 = new StringTokenizer(buf.toString(), "\n");
			while (st1.hasMoreTokens()) {
				StringTokenizer st2 = new StringTokenizer(st1.nextToken().replaceAll("\t\t", "\t?\t"), "\t");
				if (st2.hasMoreTokens()) {
					String timestamp = st2.nextToken();
					Date date = sdf.parse(timestamp, new ParsePosition(0));
					if (date != null) {
						cal.setTime(date);
						int year = cal.get(Calendar.YEAR);
						int month = cal.get(Calendar.MONTH) + 1;
						int day = cal.get(Calendar.DAY_OF_MONTH);
						int hour = cal.get(Calendar.HOUR_OF_DAY);
						int minute = cal.get(Calendar.MINUTE);
						int gNdx = 0;
						while (st2.hasMoreTokens() && gNdx < labels.length) {
							String value = st2.nextToken().replace(',', '.');
							if (!value.equals("?")) {
								try {
									double d = Double.parseDouble(value);
									SensorChart.addValue(gNdx, year, month, day, hour, minute, d);
								} catch(NumberFormatException nfe) {
									// ignore
								}
							}
							gNdx = gNdx + 1;
						}
					}
				}
			}
		}
		cal.add(Calendar.DAY_OF_YEAR, 1);
	}

	SensorChart.process("", "Temperatur", 640, 480, "C:/apps/nexahome/mySensorChart.png");
}

liverpoolarn
Posts: 65
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Att visa sensordata grafiskt

Post by liverpoolarn » Thu Jan 18, 2018 11:08 am

KUNG! :)
Funkar ju prima!

Jag tror nog det var så att felet tidigare var att inte alla sensorerna hade något värde i txt-filen och att det då blev något fel i scriptet när tempen skulle plottas på grafen.

Nu funkar det prima som sagt. Får man önska ännu mer funktionalitet? :oops:
Jag skulle ju helst vilja separera inne och ute temperaturerna. Går det få till på samma sida, eller måste man göra separata sidor då?
Sen skulle det givetvis vara intressant att få en graf med fukt-värdena också men det bör ju inte vara några problem om man får svar på frågan ovan. ;-)

*EDIT: Fixade en "fukt-sida" så nu är det löst iallafall.

Misstänker att man måste ha olika "save-temp"-sidor för att kunna spara olika grafer. Men sen är ju det krångliga som jag inte fixar att göra om mypage-sidan för att skapa två grafer.

liverpoolarn
Posts: 65
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Att visa sensordata grafiskt

Post by liverpoolarn » Thu Jan 18, 2018 11:08 am

Har nu satt upp fyra sensor-sidor (temp, temp2, fukt, fukt2). Men själva grafgenereringen fungerar bara på en sida. Går jag in i NH och kör scriptet mypage3 (som är för fukt2) och sen refreshar den sidan så skapas en ny graf (sensor3.png, alla sidorna har egna grafnamn oxå såklart).

Hur kan jag få det att funka automatiskt hela tiden?

hekj
Posts: 992
Joined: Thu Jan 18, 2018 11:08 am
Location: Stockholm
Contact:

Re: Tips: Att visa sensordata grafiskt

Post by hekj » Thu Jan 18, 2018 11:08 am

liverpoolarn wrote:Har nu satt upp fyra sensor-sidor (temp, temp2, fukt, fukt2). Men själva grafgenereringen fungerar bara på en sida. Går jag in i NH och kör scriptet mypage3 (som är för fukt2) och sen refreshar den sidan så skapas en ny graf (sensor3.png, alla sidorna har egna grafnamn oxå såklart).

Hur kan jag få det att funka automatiskt hela tiden?
Har inte testat följande själv men om du modifierar den lite så kanske det fungerar.

mypage.bsh

Code: Select all

path = "C:/apps/nexahome/";

temp = false;
temp2 = false;
fukt = false;
fukt2 = false;

params = getData("mypage.params_");
if (params != null) {
//echo(params);
	var len = Integer.parseInt(params);
	for (int ndx = 1; ndx <= len; ndx++) {
		param = getData("mypage.param" + ndx + "_");
//echo(param);

		if (param.equals("mypage=temp")) {
			temp = true;
		} else if (param.equals("mypage=temp2")) {
			temp2 = true;
		} else if (param.equals("mypage=fukt")) {
			fukt = true;
		} else if (param.equals("mypage=fukt2")) {
			fukt2 = true;
		}

	}
} else {
	echo("mypage.params_ == null");
}

if (temp || temp2 || fukt || fukt2) {

	import java.awt.Color;
	import java.io.BufferedReader;
	import java.io.File;
	import java.io.FileReader;
	import java.io.IOException;
	import java.text.ParsePosition;
	import java.text.SimpleDateFormat;
	import java.util.Calendar;
	import java.util.Date;
	import java.util.StringTokenizer;

	addClassPath("C:/apps/nexahome/jcommon-1.0.17.jar");
	addClassPath("C:/apps/nexahome/jfreechart-1.0.14.jar");
	addClassPath("C:/apps/nexahome/.");

	String[] temp_labels = { "Inne", "Ute", "Sensor3" };
	String[] temp_colors = { "black", "blue", "yellow" };

	String[] temp2_labels = { "Inne", "Ute", "Sensor3" };
	String[] temp2_colors = { "black", "blue", "yellow" };

	String[] fukt_labels = { "Inne", "Ute", "Sensor3" };
	String[] fukt_colors = { "black", "blue", "yellow" };

	String[] fukt2_labels = { "Inne", "Ute", "Sensor3" };
	String[] fukt2_colors = { "black", "blue", "yellow" };

	int length = 640;
	int height = 480;
	String title = null;
	String output= null;
	String[] labels = null;
	String[] colors = null;
	special_name = null;

	if (temp) {
		title = "Temperatur";
		labels = temp_labels;
		colors = temp_colors;
		special_name = "temp";
	} else if (temp2) {
		title = "Temperatur 2";
		labels = temp2_labels;
		colors = temp2_colors;
		special_name = "temp2";
	} else if (fukt) {
		title = "Fukt";
		labels = fukt_labels;
		colors = fukt_colors;
		special_name = "fukt";
	} else {
		title = "Fukt 2";
		labels = fukt2_labels;
		colors = fukt2_colors;
		special_name = "fukt2";
	}

	output = path + "mySensorChart_" + special_name + ".png";

	SensorChart.initGraph(labels.length, 1);
	for (int gNdx = 0; gNdx < labels.length; gNdx++) {
		txt = colors[gNdx].toLowerCase();
		if ("white".equals(txt)) {
			color = Color.white;
		} else if ("lightgray".equals(txt)) {
			color = Color.lightGray;
		} else if ("gray".equals(txt)) {
			color = Color.gray;
		} else if ("darkgray".equals(txt)) {
			color = Color.darkGray;
		} else if ("black".equals(txt)) {
			color = Color.black;
		} else if ("red".equals(txt)) {
			color = Color.red;
		} else if ("pink".equals(txt)) {
			color = Color.pink;
		} else if ("orange".equals(txt)) {
			color = Color.orange;
		} else if ("yellow".equals(txt)) {
			color = Color.yellow;
		} else if ("green".equals(txt)) {
			color = Color.green;
		} else if ("magenta".equals(txt)) {
			color = Color.magenta;
		} else if ("cyan".equals(txt)) {
			color = Color.cyan;
		} else{
			color = Color.blue;
		}
		SensorChart.initSeries(gNdx, labels[gNdx], color);
	}

	Calendar cal = Calendar.getInstance();
	int back = 1;
	cal.add(Calendar.DAY_OF_YEAR, -back);
	for (int dNdx = 0; dNdx <= back; dNdx++) {
		StringBuffer buf = new StringBuffer();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		File f = new File(path + special_name + "_" + sdf.format(cal.getTime()) + ".txt");
		if (f.exists()) {
			BufferedReader br = null;
			try {
				br = new BufferedReader(new FileReader(f));
				String line = null;
				do {
					line = br.readLine();
					if (line != null) {
						buf.append(line);
						buf.append("\n");
					}
				} while(line != null);
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					if (br != null) {
						br.close();
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
			StringTokenizer st1 = new StringTokenizer(buf.toString(), "\n");
			while (st1.hasMoreTokens()) {
				StringTokenizer st2 = new StringTokenizer(st1.nextToken().replaceAll("\t\t", "\t?\t"), "\t");
				if (st2.hasMoreTokens()) {
					String timestamp = st2.nextToken();
					Date date = sdf.parse(timestamp, new ParsePosition(0));
					if (date != null) {
						cal.setTime(date);
						int year = cal.get(Calendar.YEAR);
						int month = cal.get(Calendar.MONTH) + 1;
						int day = cal.get(Calendar.DAY_OF_MONTH);
						int hour = cal.get(Calendar.HOUR_OF_DAY);
						int minute = cal.get(Calendar.MINUTE);
						int gNdx = 0;
						while (st2.hasMoreTokens() && gNdx < labels.length) {
							String value = st2.nextToken().replace(',', '.');
							if (!value.equals("?")) {
								try {
									double d = Double.parseDouble(value);
									SensorChart.addValue(gNdx, year, month, day, hour, minute, d);
									dataAdded = true;
								} catch(NumberFormatException nfe) {
									// ignore
								}
							}
							gNdx = gNdx + 1;
						}
					}
				}
			}
		}
		cal.add(Calendar.DAY_OF_YEAR, 1);
	}

	if (dataAdded) {
		SensorChart.process("", title, length, height, output);
	} else {
		echo("No data added to graph!");
	}
}
Edit: Uppdaterad 2012-12-08 08:35

liverpoolarn
Posts: 65
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Att visa sensordata grafiskt

Post by liverpoolarn » Thu Jan 18, 2018 11:08 am

Tack Henrik för att du tar dig tid att lösa var pissmyras små funderingar. Den där mypage-sidan funkar mycket bra och tempen loggas nu och graferna uppdateras fint. :-)

Nu har jag funktionaliteten i dagsgraferna jag vill ha. Nu ska man ge sig på att flytta över hela härligheten till raspberrypien och börja jiddra in tempvärdena i en databas för att kunna få ut lite mer avancerade grafer och historik och max o minvärden. :)

Tack än en gång för hjälpen!

magnusp
Posts: 5
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Att visa sensordata grafiskt

Post by magnusp » Thu Jan 18, 2018 11:08 am

Hej,
Jag har problem att få grafsidan att fungera...

Jag har lagt till följande i mypage.bsh:
String[] labels = { "Temp Krypgrund", "Fukt Krypgrund", "Temp inne", "Fukt inne" };
SensorChart.process("", "Temperatur", 640, 480, "/home/pi/nexahome/mySensorChart.png");

surfar jag till /nexahome?mypage=temp får jag upp en icon för att bild inte kan visas. Länken till bilden är:
http://192.168.1.21:8080/nexahome/dynamic.465234849.png

I temp.html har jag angivit:
<!-- dynamic="temp" url="file://home/pi/nexahome/mySensorChart.png" -->

Vad kan jag ha missat?

Tack!

patrikg
Posts: 120
Joined: Thu Jan 18, 2018 11:08 am
Location: Stockholm/Sweden

Re: Tips: Att visa sensordata grafiskt

Post by patrikg » Thu Jan 18, 2018 11:08 am

Man kan missa mycket, när det gäller datorer och annan elektronik. *ler*
Något som många missar som nybörjare i linux är rättigheter på filer/kataloger.

Att användaren som man är inloggad som kanske det funkar från, men när det i själva
verket inte är den som i verkligheten kör programmen eller skall komma åt filer och kataloger.

Många kör webserver och web applikationer(php/perl osv..).. och där är det oftast "www-data" som är användaren
som kör och skall komma åt filer och kataloger.

Kan juh vara raspberry pi och då kanske det är användaren root och pi och www-data som slåss om filer och kataloger.

magnusp
Posts: 5
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Att visa sensordata grafiskt

Post by magnusp » Thu Jan 18, 2018 11:08 am

Jag ha kontrollerat rättigheterna. Har t o m provat sätta 777 på alla filer och kataloer.
Jag har även problem med att jag i nexahome inte kan se / ändra / lägga till filer under fliken "Web", vet inte om det hänger ihop med mitt temperaturgrafsproblem.

hekj
Posts: 992
Joined: Thu Jan 18, 2018 11:08 am
Location: Stockholm
Contact:

Re: Tips: Att visa sensordata grafiskt

Post by hekj » Thu Jan 18, 2018 11:08 am

magnusp wrote:Jag ha kontrollerat rättigheterna. Har t o m provat sätta 777 på alla filer och kataloer.
Jag har även problem med att jag i nexahome inte kan se / ändra / lägga till filer under fliken "Web", vet inte om det hänger ihop med mitt temperaturgrafsproblem.
Har du definierat var html filerna finns, dvs uppdaterat fältet 'My Web Server Directory' under Config-fliken?

Mullemeck
Posts: 13
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Att visa sensordata grafiskt

Post by Mullemeck » Thu Jan 18, 2018 11:08 am

Hej!

Här kommer en ny mycket desperat hemmapulare som inte får någon graf-bild! Har försökt i en vecka så jag tänkte ge detta forumet en chans.
Problemet är att jag får felet i NexaHome:

The script threw an exception (mypage.bsh): Sourced file: mypage.bsh : Method Invocation SensorChart.process : at Line: 118 : in file: mypage.bsh : SensorChart .process ( "" , "Temperatur" , 640 , 480 , "/home/pi/Telldus/mySensorChart.png" )
Target exception: java.lang.IllegalArgumentException: Null 'chart' argument.


i mappen "/home/pi/Telldus/" finns min testfil "temp_2014-04-29.txt" som innehåller:

Code: Select all

2014-04-01 00:59	21,9	1	6
2014-04-02 01:02	22,9	2	5
2014-04-03 02:04	23,9	3	4
2014-04-04 04:06	24,9	4	3
2014-04-05 05:09	25,9	5	2
2014-04-06 06:10	26,9	6	1
..och således mypage.bsh:

Code: Select all

path = "/home/pi/Telldus/";
temp = false;
params = getData("mypage.params_");
if (params != null) {
//echo(params);
   var len = Integer.parseInt(params);
   for (int ndx = 1; ndx <= len; ndx++) {
      param = getData("mypage.param" + ndx + "_");
//echo(param);
      if (param.equals("mypage=temp")) {
         temp = true;
      }
   }
} else {
   echo("mypage.params_ == null");
}
if (temp) {
   import java.awt.Color;
   import java.io.BufferedReader;
   import java.io.File;
   import java.io.FileReader;
   import java.io.IOException;
   import java.text.ParsePosition;
   import java.text.SimpleDateFormat;
   import java.util.Calendar;
   import java.util.Date;
   import java.util.StringTokenizer;

   addClassPath("/home/pi/Telldus/jcommon-1.0.17.jar");
   addClassPath("/home/pi/Telldus/jfreechart-1.0.14.jar");
   addClassPath("/home/pi/Telldus/.");

   String[] labels = { "test1", "test2", "test3" };
   SensorChart.initGraph(labels.length, 1);
   for (int gNdx = 0; gNdx < labels.length; gNdx++) {
      color = Color.white;
      switch (gNdx) {
      case 0:
         color = Color.red;
         break;
      case 1:
         color = Color.black;
         break;
      case 2:
         color = Color.blue;
         break;
      case 3:
         color = Color.yellow;
         break;
       }
      SensorChart.initSeries(gNdx, labels[gNdx], color);
   }

   Calendar cal = Calendar.getInstance();
   int back = 1;
   cal.add(Calendar.DAY_OF_YEAR, -back);
   for (int dNdx = 0; dNdx <= back; dNdx++) {
      StringBuffer buf = new StringBuffer();
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      File f = new File(path + "temp_" + sdf.format(cal.getTime()) + ".txt");
      if (f.exists()) {
         BufferedReader br = null;
         try {
            br = new BufferedReader(new FileReader(f));
            String line = null;
            do {
               line = br.readLine();
               if (line != null) {
                  buf.append(line);
                  buf.append("\n");
               }
            } while(line != null);
         } catch (IOException e) {
            e.printStackTrace();
         } finally {
            try {
               if (br != null) {
                  br.close();
               }
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
         sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
         StringTokenizer st1 = new StringTokenizer(buf.toString(), "\n");
         while (st1.hasMoreTokens()) {
            StringTokenizer st2 = new StringTokenizer(st1.nextToken().replaceAll("\t\t", "\t?\t"), "\t");
            if (st2.hasMoreTokens()) {
               String timestamp = st2.nextToken();
               Date date = sdf.parse(timestamp, new ParsePosition(0));
               if (date != null) {
                  cal.setTime(date);
                  int year = cal.get(Calendar.YEAR);
                  int month = cal.get(Calendar.MONTH) + 1;
                  int day = cal.get(Calendar.DAY_OF_MONTH);
                  int hour = cal.get(Calendar.HOUR_OF_DAY);
                  int minute = cal.get(Calendar.MINUTE);
                  int gNdx = 0;
                  while (st2.hasMoreTokens() && gNdx < labels.length) {
                     String value = st2.nextToken().replace(',', '.');
                     if (!value.equals("?")) {
                        try {
                           double d = Double.parseDouble(value);
                           SensorChart.addValue(gNdx, year, month, day, hour, minute, d);
                        } catch(NumberFormatException nfe) {
                           // ignore
                        }
                     }
                     gNdx = gNdx + 1;
                  }
               }
            }
         }
      }
      cal.add(Calendar.DAY_OF_YEAR, 1);
   }

   SensorChart.process("", "Temperatur", 640, 480, "/home/pi/Telldus/mySensorChart.png");
}
Lite övrig fakta:
Kör java version "1.7.0_25"
"/home/pi/Telldus/jcommon-1.0.17.jar" - 309,9 KB
"/home/pi/Telldus/jfreechart-1.0.14.jar" - 1.5 MB
"/home/pi/Telldus/SensorChart.class" - 7.2 KB
"/home/pi/Telldus/SensorChart.java" - 5.8 KB

Är root-inloggad (inte mixtrat med några behörigheter el. lösen), allt uppdaterat enligt konstens regler, testat olika mypage.bsh med samma resultat oansett antaler "sensorer" i temp_xxx-filen. Web-anropet från annan dator funkar fint, som sagt blir mySensorChart.png 0 KB :x

Tacksam för hjälp!

hekj
Posts: 992
Joined: Thu Jan 18, 2018 11:08 am
Location: Stockholm
Contact:

Re: Tips: Att visa sensordata grafiskt

Post by hekj » Thu Jan 18, 2018 11:08 am

Mullemeck wrote:Problemet är att jag får felet i NexaHome:

The script threw an exception (mypage.bsh): Sourced file: mypage.bsh : Method Invocation SensorChart.process : at Line: 118 : in file: mypage.bsh : SensorChart .process ( "" , "Temperatur" , 640 , 480 , "/home/pi/Telldus/mySensorChart.png" )
Target exception: java.lang.IllegalArgumentException: Null 'chart' argument.


i mappen "/home/pi/Telldus/" finns min testfil "temp_2014-04-29.txt" som innehåller:

Code: Select all

2014-04-01 00:59	21,9	1	6
2014-04-02 01:02	22,9	2	5
2014-04-03 02:04	23,9	3	4
2014-04-04 04:06	24,9	4	3
2014-04-05 05:09	25,9	5	2
2014-04-06 06:10	26,9	6	1
Testa istället med följande mypage.bsh fil:

Code: Select all

car_check_device = "5";
car2_check_device = "52";
car = false;
car2 = false;
car_on = null;
car_minutes = null;
car_minutes = null;
path = "/home/pi/Telldus/";
temp = false;
temp2 = false;
fukt = false;
params = getData("mypage.params_");
//echo(params);
var len = Integer.parseInt(params);
for (int ndx = 1; ndx <= len; ndx++) {
   param = getData("mypage.param" + ndx + "_");
//   echo(param);
   if (param.equals("mypage=temp")) {
      temp = true;
   } else if (param.equals("mypage=temp2")) {
      temp2 = true;
   } else if (param.equals("mypage=fukt")) {
      fukt = true;
   } else if (param.equals("mypage=car")) {
      car = true;
   } else if (param.equals("mypage=car2")) {
      car2 = true;
   } else if (param.startsWith("on=")) {
      car_on = param.substring("on=".length());
   } else if (param.startsWith("minutes=")) {
      car_minutes = param.substring("minutes=".length());
   }
}
if (car && car_on != null) {
   setData("car_on", car_on);
   setData("car_minutes", (car_minutes != null ? car_minutes : ""));
   deviceOn(car_check_device);
}
if (car2 && car_on != null) {
   setData("car2_on", car_on);
   setData("car2_minutes", (car_minutes != null ? car_minutes : ""));
   deviceOn(car2_check_device);
}
if (temp || temp2 || fukt) {

   import java.awt.Color;
   import java.io.BufferedReader;
   import java.io.File;
   import java.io.FileReader;
   import java.io.IOException;
   import java.text.ParsePosition;
   import java.text.SimpleDateFormat;
   import java.util.Calendar;
   import java.util.Date;
   import java.util.StringTokenizer;

   addClassPath(path + "jcommon-1.0.17.jar");
   addClassPath(path + "jfreechart-1.0.14.jar");
   addClassPath(path + ".");

   String[] temp_labels = { "test1", "test2", "test3" };
   String[] temp_colors = { "red", "black", "blue" };

   String[] temp2_labels = { "Sensor1", "Sensor2", "Sensor3" };
   String[] temp2_colors = { "black", "blue", "yellow" };

   String[] fukt_labels = { "In", "Out" };
   String[] fukt_colors = { "black", "blue" };

   int length = 640;
   int height = 480;
   String title = null;
   String output= null;
   String[] labels = null;
   String[] colors = null;
   special_name = null;

   if (temp) {
      title = "Temperature";
      labels = temp_labels;
      colors = temp_colors;
      special_name = "temp";
   } else if (temp2) {
      title = "Temperature 2";
      labels = temp2_labels;
      colors = temp2_colors;
      special_name = "temp2";
   } else if (fukt) {
      title = "Moisture";
      labels = fukt_labels;
      colors = fukt_colors;
      special_name = "fukt";
   }

   output = path + "mySensorChart_" + special_name + ".png";

   SensorChart.initGraph(labels.length, 1);
   for (int gNdx = 0; gNdx < labels.length; gNdx++) {
      txt = colors[gNdx].toLowerCase();
      if ("white".equals(txt)) {
         color = Color.white;
      } else if ("lightgray".equals(txt)) {
         color = Color.lightGray;
      } else if ("gray".equals(txt)) {
         color = Color.gray;
      } else if ("darkgray".equals(txt)) {
         color = Color.darkGray;
      } else if ("black".equals(txt)) {
         color = Color.black;
      } else if ("red".equals(txt)) {
         color = Color.red;
      } else if ("pink".equals(txt)) {
         color = Color.pink;
      } else if ("orange".equals(txt)) {
         color = Color.orange;
      } else if ("yellow".equals(txt)) {
         color = Color.yellow;
      } else if ("green".equals(txt)) {
         color = Color.green;
      } else if ("magenta".equals(txt)) {
         color = Color.magenta;
      } else if ("cyan".equals(txt)) {
         color = Color.cyan;
      } else{
         color = Color.blue;
      }
      SensorChart.initSeries(gNdx, labels[gNdx], color);
   }

   Calendar cal = Calendar.getInstance();
   int back = 1;
   cal.add(Calendar.DAY_OF_YEAR, -back);
   for (int dNdx = 0; dNdx <= back; dNdx++) {
      StringBuffer buf = new StringBuffer();
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      File f = new File(path + special_name + "_" + sdf.format(cal.getTime()) + ".txt");
      if (f.exists()) {
         BufferedReader br = null;
         try {
            br = new BufferedReader(new FileReader(f));
            String line = null;
            do {
               line = br.readLine();
               if (line != null) {
                  buf.append(line);
                  buf.append("\n");
               }
            } while(line != null);
         } catch (IOException e) {
            e.printStackTrace();
         } finally {
            try {
               if (br != null) {
                  br.close();
               }
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
         sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
         StringTokenizer st1 = new StringTokenizer(buf.toString(), "\n");
         while (st1.hasMoreTokens()) {
            StringTokenizer st2 = new StringTokenizer(st1.nextToken().replaceAll("\t\t", "\t?\t"), "\t");
            if (st2.hasMoreTokens()) {
               String timestamp = st2.nextToken();
               Date date = sdf.parse(timestamp, new ParsePosition(0));
               if (date != null) {
                  cal.setTime(date);
                  int year = cal.get(Calendar.YEAR);
                  int month = cal.get(Calendar.MONTH) + 1;
                  int day = cal.get(Calendar.DAY_OF_MONTH);
                  int hour = cal.get(Calendar.HOUR_OF_DAY);
                  int minute = cal.get(Calendar.MINUTE);
                  int gNdx = 0;
                  while (st2.hasMoreTokens() && gNdx < labels.length) {
                     String value = st2.nextToken().replace(',', '.');
                     if (!value.equals("?")) {
                        try {
                           double d = Double.parseDouble(value);
                           SensorChart.addValue(gNdx, year, month, day, hour, minute, d);
                           dataAdded = true;
                        } catch(NumberFormatException nfe) {
                           // ignore
                        }
                     }
                     gNdx = gNdx + 1;
                  }
               }
            }
         }
      }
      cal.add(Calendar.DAY_OF_YEAR, 1);
   }

   if (dataAdded) {
      SensorChart.process("", title, length, height, output);
   } else {
      echo("No data added to graph!");
   }
}
Ovanstående ger följande output:
"/home/pi/Telldus/mySensorChart_temp.png"

Uppdatera din html fil så att den använder sig av det nya filnamnet.

Se också till att din testfil har dagens datum i filnamnet samt att den bara innehåller data från ett dygn "temp_2014-05-07.txt".

Code: Select all

2014-05-07 00:59   21,9   1   6
2014-05-07 01:02   22,9   2   5
2014-05-07 02:04   23,9   3   4
2014-05-07 04:06   24,9   4   3
2014-05-07 05:09   25,9   5   2
2014-05-07 06:10   26,9   6   1

Mullemeck
Posts: 13
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Att visa sensordata grafiskt

Post by Mullemeck » Thu Jan 18, 2018 11:08 am

Jasså det var så enkelt :D (känslig den där temp_.txt -filen...)
Fick deklarera dataAdded = false bara sen funkade den nya mypage-filen finemang!

Väldigt mycket tack för hjälpen hekj!! Nu kan jag fortsätta experimentera.

Väldigt snyggt jobbat med programmet och funktionerna därtill btw!!

Tack igen!

magnusp
Posts: 5
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Att visa sensordata grafiskt

Post by magnusp » Thu Jan 18, 2018 11:08 am

Nu har jag också fått rätt på temp-graf och fukt-graf.
Har dock en undran, nu får man bara upp gårdagen samt dagens datum, går det att få upp t ex för hela året eller kan man iaf ställa hur många dagar grafen skall gälla?

Tack på förhand.

Post Reply