Page 1 of 1

Visa temperaturvärde

Posted: Fri Mar 17, 2023 9:45 am
by matsb70
hej,
hur kan jag visa värden från en fil som temperatur ?

jag vill i första hand bara visa innetemperatur på nexahomes inbyggda sida , inte styra något.

min termometer skriver decimalt till en fil, värden är 0 - 127 för plusgrader (och noll) och 128 - 256 för minusgrader. och så har jag ett bashscript som översätter det till en humanläsbar form på STDOUT. ~/temp1.sh
kör linux.

Re: Visa temperaturvärde

Posted: Fri Mar 17, 2023 9:45 am
by matsb70
har börjat utforska möjligheten att skriva mina egna sensorevents på ipc socketen /tmp/TelldusEvents

det går lite sådär men hoppas få till det inom kort 8)

Re: Visa temperaturvärde

Posted: Fri Mar 17, 2023 9:45 am
by hekj
Börja med att:
1) lägga till en ny sensor (klicka på Device/Group/Sensor 'Add' knappen), skriv in ett namn och markera att det är en SENSOR
2) välj sedan "sensor" i 'Function' kolumnen
3) skriv "/home/pi/nexahome/1-wire.bsh" i 'Sensor Path' kolumnen
4) skriv in ett unikt id i 'Parameters' kolumnen, exempelvis "id:1-wire;model:temp"
5) starta om NexaHome
6) lägg till ett event kopplat till den nya sensorn, klicka på 'Add' (event) och se till att rätt device är vald samt HH=00, MM=0 och att 'Default' är markerad.
7) starta om NexaHome

Eventet läggs in för att starta exekvering av bsh filen och det kommer att repeteras var 5:e minut.

1-wire.bsh

Code: Select all

String csvFile = "/home/pi/nexahome/1-wire.csv";
String findRow = "510008014D026D10";
int findColumn = 2;
String delimiter = ",;\t ";

int currentColumn = 1;
boolean found = false;

try {

  BufferedReader in;
  in = new BufferedReader(new FileReader(csvFile));
  String line = null;
  do {
    line = in.readLine();
    if (line != null && line.indexOf(findRow) != -1) {
      StringTokenizer st = new StringTokenizer(line, delimiter);
      if (st.countTokens() >= findColumn) {
        while (currentColumn < findColumn) {
          st.nextToken();
          currentColumn++;
        }
        outAppend(st.nextToken());
        found = true;
      } else {
        line = null;
      }
    }
  } while(line != null && !found);
  if (line == null) {
    errAppend("Unable to find value!");
  }
  in.close();

} catch(Exception e) {
  errAppend(e.getMessage());
}
1-wire.csv

Code: Select all

"ROMId","Value","dd.mm.yyyy","hh:nn:ss",
"510008014D026D10",-8.82,26.01.2011,18:51:44,
"F60008014CF2B010",5.25,26.01.2011,18:51:41,
"FD0008014D2C1F10",2.75,26.01.2011,18:51:47,
"A000080192AAA610",15.75,26.01.2011,18:51:42,
"3C000801847A7710",-1.00,26.01.2011,18:51:46,
"5E00080192D3DD10",7.38,26.01.2011,18:51:45,
"8A000001112E6226-T",-2.47,26.01.2011,18:51:47,
"8A000001112E6226-DP",-4.76,26.01.2011,18:51:48,
"8A000001112E6226-H",85.01,26.01.2011,18:51:48,

Re: Visa temperaturvärde

Posted: Fri Mar 17, 2023 9:45 am
by matsb70
Tackar, mycket bra förklarat !

går det att ändra intervallet på när eventen körs ? Hos mig körs de varje minut, var 10:e minut skulle räcka. Vi ska inte stressa våra datorer.


t.v. går jag runt det exempelvis så?:

Code: Select all

import java.util.date;
Date datum = new Date();
if ( datum.getMinutes() % 10 = 0 ) {
   // gör mina relaterade saker här ...
}

Re: Visa temperaturvärde

Posted: Fri Mar 17, 2023 9:45 am
by hekj
Hämta den senaste versionen av EasyHome och testa därefter med följande filer.

start.bsh

Code: Select all

startTimer("1-wire-test", 2 * 60);  // 2 minutes
1-wire-test.bsh

Code: Select all

execFile("1-wire-sensor.bsh");
execParam("5E00080192D3DD10");
execParam("114");
startTimer("1-wire-test", 10 * 60);  // 10 minutes
1-wire-sensor.bsh

Code: Select all

String csvFile = "/home/pi/nexahome/1-wire.csv";
String findRow = "510008014D026D10";
String device = "114";

bsh_file = "1-wire-sensor";
params = getData(bsh_file + ".params_");
if (params != null) {
  var len = Integer.parseInt(params);
  if (len >= 2) {
     findRow = getData(bsh_file + ".param1_");
     device = getData(bsh_file + ".param2_");
     setData(bsh_file + ".params_", 0); // mark all params read
  }
}

int findColumn = 2;
String delimiter = ",;\t ";

int currentColumn = 1;
boolean found = false;

try {

  BufferedReader in;
  in = new BufferedReader(new FileReader(csvFile));
  String line = null;
  do {
    line = in.readLine();
    if (line != null && line.indexOf(findRow) != -1) {
      StringTokenizer st = new StringTokenizer(line, delimiter);
      if (st.countTokens() >= findColumn) {
        while (currentColumn < findColumn) {
          st.nextToken();
          currentColumn++;
        }
        setSensorValue(device, st.nextToken());
        found = true;
      } else {
        line = null;
      }
    }
  } while(line != null && !found);
  if (line == null) {
    echo("Unable to find value!");
  }
  in.close();

} catch(Exception e) {
  echo(e.getMessage());
}

Re: Visa temperaturvärde

Posted: Fri Mar 17, 2023 9:45 am
by matsb70
så då uppdateras filen i exemplet av 1-wire-test - timern , var 10:e minut och läses av sensor-eventet ( 1-wire.bsh) varje minut ?

jag provade lite smått med en weather_msn som skriver temperaturen till en fil och det funkar ju där i alla fall.