Nexahome / Raspberry PI

Moderators: hekj, Telldus

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

Re: Nexahome / Raspberry PI

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

Jag har gjort en NexaHome version enbart för Raspberry Pi:
1) Ladda hem http://nexahome.se/NexaHome_RPi_2.9.6.jar
2) Tag bort allt i Executable fältet i din nuvarande NexaHome och avsluta därefter programmet
3) Starta den nya versionen (2.9.6)

Själv har jag endast konstaterat att JNA kopplingen startar, har inte hunnit testa något mer så tala gärna om för mig om den fungerar och vad som står i Executable fältet.

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

Re: Telldus-Core, Telldus Center och Nexa Home på R-Pi

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

kornflakez wrote: NexaHome

Code: Select all

sudo apt-get install openjdk-6-jdk
wget http://nexahome.se/NexaHome_2.8.4.jar
(ersätt med senaste versionen om det finns en nyare)
Starta grafiska gränssnittet (startx) och dubbelklicka på .jar filen
Detta startar upp NexaHome. Jag har inte hunnit testa av detta så mycket än, men ett problem som jag verkar få är när jag går in under "web"-fliken.
Väljer jag en sida där så får jag upp ett 20-tal "loading" fönster som går att flytta men inte stänga ner. Men detta har jag inte hunnit felsöka på.
Om det är något ni har upplevt och hittat en lösning på så får ni gärna berätta hur.
Om du använder openjdk-7 instället för sexan så fungerar Web-fliken.

Code: Select all

sudo apt-get install openjdk-7-jdk
mkdir -p ~/nexahome
cd ~/nexahome
wget http://nexahome.se/NexaHome_RPi_2.9.6.jar

anderssan
Posts: 8
Joined: Thu Jan 18, 2018 11:08 am

Re: Nexahome / Raspberry PI

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

Hej,

Jag lyckas inte få igång JNA kopplingen med 2.9.6 heller.. Testar att ta bort allt i executable och sen med 2.9.6 står det /usr/bin/tdtool som vanligt?

//Anders

Micke-Falo
Posts: 112
Joined: Thu Jan 18, 2018 11:08 am
Location: Sweden
Contact:

Re: Nexahome / Raspberry PI

Post by Micke-Falo » Thu Jan 18, 2018 11:08 am

Hur funkar det med att lägga till enheter/mottagare? Kan man göra det direkt i Nexahome?

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

Re: Nexahome / Raspberry PI

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

Micke-Falo wrote:Hur funkar det med att lägga till enheter/mottagare? Kan man göra det direkt i Nexahome?
Nej, du ska använda TelldusCenter, hämta en bugfixad release.
http://nexahome.se/NexaHome_RPi_2.9.7.jar

Det är bara NexaHome device grupper du lägger till direkt i NexaHome.

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

Re: Nexahome / Raspberry PI

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

anderssan wrote:Jag lyckas inte få igång JNA kopplingen med 2.9.6 heller.. Testar att ta bort allt i executable och sen med 2.9.6 står det /usr/bin/tdtool som vanligt?
Konstigt... det funkar ju för mig, vad kan det vara för skillnad?

Testa först med den senaste NH versionen.

Code: Select all

mkdir -p ~/nexahome
cd ~/nexahome
wget http://nexahome.se/NexaHome_RPi_2.9.7.jar
Om inte ovanstående fungerar kan du testa följande (som jag inte tycker borde behövas).

Code: Select all

sudo apt-get install libjna-java

anderssan
Posts: 8
Joined: Thu Jan 18, 2018 11:08 am

Re: Nexahome / Raspberry PI

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

Med 2.9.7 så funkar det som det är tänkt!
Perfekt, tack för hjälpen!

//Anders

Mnemonic
Posts: 38
Joined: Thu Jan 18, 2018 11:08 am

Re: Nexahome / Raspberry PI

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

hekj wrote: Testa först med den senaste NH versionen.

Code: Select all

mkdir -p ~/nexahome
cd ~/nexahome
wget http://nexahome.se/NexaHome_RPi_2.9.7.jar
Om inte ovanstående fungerar kan du testa följande (som jag inte tycker borde behövas).

Code: Select all

sudo apt-get install libjna-java
Jag håller på med Raspberry PI och JNA också med egna projekt men kan inte få JNA att fungera varken med openjdk7 eller nya java8 beta med hard float stöd. Har även installerat libjna-java på PIn men det lirar iaf inte och har nog bankat huvudet tillräckligt i väggen :banghead: Såg att du i ditt projekt har byggt in JNA direkt i JARen. Kanske skulle prova det också..

Edit: Kan konstatera att jag bankat huvudet i väggen ännu mer men får verkligen inte JNA att fungera i överhuvudtaget... Notera att detta gäller JNA överlag MEN detta är den enda forum post jag hittat som påvisar att JNA på RPI fungerar och skulle hemskt gärna få lite hjälp :D

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

Re: Nexahome / Raspberry PI

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

Mnemonic wrote:Jag håller på med Raspberry PI och JNA också med egna projekt men kan inte få JNA att fungera varken med openjdk7 eller nya java8 beta med hard float stöd. Har även installerat libjna-java på PIn men det lirar iaf inte och har nog bankat huvudet tillräckligt i väggen :banghead: Såg att du i ditt projekt har byggt in JNA direkt i JARen. Kanske skulle prova det också..

Edit: Kan konstatera att jag bankat huvudet i väggen ännu mer men får verkligen inte JNA att fungera i överhuvudtaget... Notera att detta gäller JNA överlag MEN detta är den enda forum post jag hittat som påvisar att JNA på RPI fungerar och skulle hemskt gärna få lite hjälp :D
Vad är det för projekt och vad får du för slags felmeddelande?

erse
Posts: 8
Joined: Thu Jan 18, 2018 11:08 am

Re: Nexahome / Raspberry PI

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

Jag lyckas inte få växling mellan Home/Away att köra Mode.bsh. Det går utmärkt att köra scriptet från Action, men vid växling av Mode sker inget. Det fungerade utmärkt innan jag flytta över till Pi och uppgraderade till 3.0.2. Tacksam för tips.

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

Re: Nexahome / Raspberry PI

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

erse wrote:Jag lyckas inte få växling mellan Home/Away att köra Mode.bsh. Det går utmärkt att köra scriptet från Action, men vid växling av Mode sker inget. Det fungerade utmärkt innan jag flytta över till Pi och uppgraderade till 3.0.2. Tacksam för tips.
Testa att döpa om bsh filen så att namnet bara innehåller små bokstäver.

Mode.bsh --> mode.bsh

erse
Posts: 8
Joined: Thu Jan 18, 2018 11:08 am

Re: Nexahome / Raspberry PI

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

Visst, en lite men nog så betydelsefull detaj. Tackar!

erse
Posts: 8
Joined: Thu Jan 18, 2018 11:08 am

Re: Nexahome / Raspberry PI

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

Har problem med att få igång temp-grafen i Pi:n. Filen mySensorChart.png skapas inte/uppdateras inte vilket innebär att tempgrafen inte heller gör det.
I Consolen står det:
2013-03-17 21:06:08 The script threw an exception (mypage.bsh): Sourced file: mypage.bsh : Method Invocation SensorChart.addValue : at Line: 159 : in file: mypage.bsh : SensorChart .addValue ( gNdx , year , month , day , hour , minute , d )
Target exception: org.jfree.data.general.SeriesException: You are attempting to add an observation for the time period Sat Mar 16 15:33:00 CET 2013 but the series already contains an observation for that time period. Duplicates are not permitted. Try using the addOrUpdate() method.

Urdrag ur: temp_2013-03-17.txt

Code: Select all

2013-03-17 00:00	-9,625	19,875
2013-03-17 00:00	-9,625	19,875
2013-03-17 00:01	-9,625	20
2013-03-17 00:02	-9,625	19,9375
2013-03-17 00:08	-9,5625	20
2013-03-17 00:13	-9,3125	20
2013-03-17 00:14	-9,375	20,0625
mypage.bsh

Code: Select all

car_check_device = "30";
car = false;
car_on = null;
car_minutes = null;
path = "/home/pi/nexahome/";
temp = false;
temp2 = 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=car")) {
      car = 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 (temp || temp2) {

   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 = { "In", "Out" };
   String[] temp_colors = { "black", "blue" };

   String[] temp2_labels = { "Sensor1", "Sensor2", "Sensor3" };
   String[] temp2_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 = "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";
   }

   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!");
   }
}
Tar tacksamt emot hjälp.

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

Re: Nexahome / Raspberry PI

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

erse wrote:Har problem med att få igång temp-grafen i Pi:n. Filen mySensorChart.png skapas inte/uppdateras inte vilket innebär att tempgrafen inte heller gör det.
I Consolen står det:
2013-03-17 21:06:08 The script threw an exception (mypage.bsh): Sourced file: mypage.bsh : Method Invocation SensorChart.addValue : at Line: 159 : in file: mypage.bsh : SensorChart .addValue ( gNdx , year , month , day , hour , minute , d )
Target exception: org.jfree.data.general.SeriesException: You are attempting to add an observation for the time period Sat Mar 16 15:33:00 CET 2013 but the series already contains an observation for that time period. Duplicates are not permitted. Try using the addOrUpdate() method.

Urdrag ur: temp_2013-03-17.txt

Code: Select all

2013-03-17 00:00	-9,625	19,875
2013-03-17 00:00	-9,625	19,875
2013-03-17 00:01	-9,625	20
2013-03-17 00:02	-9,625	19,9375
2013-03-17 00:08	-9,5625	20
2013-03-17 00:13	-9,3125	20
2013-03-17 00:14	-9,375	20,0625
mypage.bsh

Code: Select all

car_check_device = "30";
car = false;
car_on = null;
car_minutes = null;
path = "/home/pi/nexahome/";
temp = false;
temp2 = 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=car")) {
      car = 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 (temp || temp2) {

   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 = { "In", "Out" };
   String[] temp_colors = { "black", "blue" };

   String[] temp2_labels = { "Sensor1", "Sensor2", "Sensor3" };
   String[] temp2_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 = "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";
   }

   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!");
   }
}
Tar tacksamt emot hjälp.
Det snabbaste sättet att få igång grafen är helt enkelt att radera dubletter, dvs tag bort en av följande rader:

Code: Select all

2013-03-17 00:00   -9,625   19,875
2013-03-17 00:00   -9,625   19,875
Jag kan kolla i programkoden om det går att ersätta befintlig add metod med den föreslagna addOrUpdate().

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

Re: Nexahome / Raspberry PI

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

Har ersatt befintlig add() metod med den föreslagna addOrUpdate() så att det inte gör något om man har dubletter i sina temp data filer.

Följande programkod är uppdaterad:
http://nexahome.se/SensorChart.class
http://nexahome.se/SensorChart.java

Post Reply