Tips: Att logga sensordata

Moderators: hekj, Telldus

hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Tips: Att logga sensordata

Post by hekj »

Den som vill logga sensordata till en textfil kan göra det genom att utföra följande:

1) skapa filen save_temp.bsh med följande innehåll (skriv in din egen sensors device id på rad nummer två)

Code: Select all

import java.text.SimpleDateFormat;
String[] sensors = { "101" };  // device id
String[] values = new String[sensors.length];  // sensor values
String[] timestamps = new String[sensors.length];  // sensor timestamps
date = "";
error = false;
changed = false;
for (int ndx = 0; ndx < sensors.length; ndx++) {
    sensor = sensors[ndx];
    values[ndx] = getSensorValue(sensor);
    if (values[ndx] != null) {
        previous_value = getData("previous_value" + sensor);
        previous_date = getData("previous_date" + sensor);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        date = sdf.format(Calendar.getInstance().getTime());
        if (!values[ndx].equals(previous_value) || !date.equals(previous_date)) {
            changed = true;
            setData("previous_value" + sensor, values[ndx]);
            setData("previous_date" + sensor, date);
            timestamps[ndx] = getSensorTimestamp(sensor);
        }
    }
}
if (changed) {
    try {
        file = "temp_" + date + ".txt";
        FileWriter fw = new FileWriter(file, true);
        BufferedWriter out = new BufferedWriter(fw);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        date = sdf.format(Calendar.getInstance().getTime());
        out.write(date);
        for (int ndx = 0; ndx < sensors.length; ndx++) {
            out.write("\t" + (values[ndx] != null ? values[ndx] : "").replace('.', ','));
        }
        out.write("\r\n");
        out.close();
    } catch (Exception e) {
        error = true;
        echo("Error: " + e.getMessage());
    }
}
if (!error) {
    hideOutput();
}
startTimer("save_temp", 60);
För att få loggning av data att starta måste man utföra följande:

2) avsluta NexaHome
3) skapa filen start.bsh om du inte redan har en fil med detta namn
4) lägg till följande rad i filen start.bsh

Code: Select all

startTimer("save_temp", 60);
5) starta NexaHome

Samt presenterar datat i Excel genom att kopiera in allt som skrivs till textfilen:
Image

Använd gärna denna Excel-fil som mall:
http://nexahome.se/Temp_YYYY-MM-DD.xlsx

Jag har stoppat in temperaturgivarens känselkropp (clas ohlson 36-1797) i röret där värmepumpen skickar luften ut ur huset.
Image

Se även "Tips: Att visa sensordata grafiskt"
http://www.telldus.com/forum/viewtopic. ... 031#p15031

Edit (2012-09-14 / 2012-09-30): Beskrivning förtydligad, lade in den slutgiltiga versionen av save_temp.bsh här i denna tråds första inlägg.

För att logga fler sensorer så lägger man till dessa på rad nummer två i filen save_temp.bsh enligt följande exempel.
String[] sensors = { "101", "102", "103" }; // device id
Alvnas1500
Posts: 14
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att logga sensordata

Post by Alvnas1500 »

Kör Nexahome 2.7.0, lagt båda filena i samma mapp som NexaHome_2.7.0.jar. Startat om Nexahome, men jag kan inte hitta logfilen.
Kör win7
Några tips?
hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Re: Tips: Att logga sensordata

Post by hekj »

Alvnas1500 wrote:Kör Nexahome 2.7.0, lagt båda filena i samma mapp som NexaHome_2.7.0.jar. Startat om Nexahome, men jag kan inte hitta logfilen.
Kör win7
Några tips?
Ser att jag har glömt att tala om att man måste definiera sensorn på ett speciellt sätt, har du gjort som det är beskrivet i följande tråds första post?

Tips: NexaHome + Duo + 433.92 MHz temp sensor
http://www.telldus.com/forum/viewtopic.php?f=23&t=1327
Alvnas1500
Posts: 14
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att logga sensordata

Post by Alvnas1500 »

Gjorde enligt länken så nu har jag lagt in i Parameters
id:11;model:temperaturehumidity;value:temp

<device name="Ute temp" group="SENSOR" previous="" repeaterUrl="id:11;model:temperaturehumidity;value:temp" repeat="1" partOfAll="yes">51</device>

ifrån
(save_temp.bsh), result: [[timer, save_temp:60]]
2012-06-11 17:55:21 RawEvent: class:sensor;protocol:mandolyn;id:11;model:temperaturehumidity;temp:17.7;humidity:68;

Men inga logg filer skapas..


Nya tips?
Attachments
Namnlös.png
Namnlös.png (121.24 KiB) Viewed 20443 times
hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Re: Tips: Att logga sensordata

Post by hekj »

Alvnas1500 wrote:Gjorde enligt länken så nu har jag lagt in i Parameters
id:11;model:temperaturehumidity;value:temp

<device name="Ute temp" group="SENSOR" previous="" repeaterUrl="id:11;model:temperaturehumidity;value:temp" repeat="1" partOfAll="yes">51</device>
Du skriver att du har lagt in texten i Parameters fältet men device raden du har klistrat in här visar något annat!
Alvnas1500
Posts: 14
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att logga sensordata

Post by Alvnas1500 »

Jag är senil! Tack för hjälpen

Då min givare även ger luftfuktighet så skulle jag vilja spara dessa värden också. Går det?
RawEvent: class:sensor;protocol:mandolyn;id:11;model:temperaturehumidity;temp:17.6;humidity:69;
hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Re: Tips: Att logga sensordata

Post by hekj »

Alvnas1500 wrote:Jag är senil! Tack för hjälpen

Då min givare även ger luftfuktighet så skulle jag vilja spara dessa värden också. Går det?
RawEvent: class:sensor;protocol:mandolyn;id:11;model:temperaturehumidity;temp:17.6;humidity:69;
Jag kollade i programkoden för 2.7.1 och såg att endast ett värde hämtas från "RawEvent" raden, men detta ska nu vara åtgärdat och version 2.7.2 finns att hämta på nexahome.se

Lägg till ytterligare en SENSOR device samt skriv in nästan samma text i Parameters fältet (humidity istället för temp):
id:11;model:temperaturehumidity;value:humidity
Om även dess data ska loggas så kan du kopiera save_temp.bsh och döpa den till exempelvis save_humidity.bsh samt uppdatera innehållet plus lägga in en till rad i start.bsh
Alvnas1500
Posts: 14
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att logga sensordata

Post by Alvnas1500 »

Strålande :D Funkar perfekt!
Alvnas1500
Posts: 14
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att logga sensordata

Post by Alvnas1500 »

Borde jag kunna lägga alla i samma save_temp.bsh fil

import java.text.SimpleDateFormat;
sensor = "51"; // device id
value = getSensorValue(sensor);
if (value != null) {
previous_value = getData("previous_value" + sensor);
previous_date = getData("previous_date" + sensor);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
date = sdf.format(Calendar.getInstance().getTime());
if (!value.equals(previous_value) || !date.equals(previous_date)) {
setData("previous_value" + sensor, value);
setData("previous_date" + sensor, date);
timestamp = getSensorTimestamp(sensor);
echo(value);
echo(timestamp);
try{
file = "temp_" + date + "." + sensor + ".txt";
FileWriter fw = new FileWriter(file, true);
BufferedWriter out = new BufferedWriter(fw);
out.write(value + "\t" + timestamp + "\r\n");
out.close();
} catch (Exception e) {
echo("Error: " + e.getMessage());
}
} else {
hideOutput();
}
}
import java.text.SimpleDateFormat;
sensor = "52"; // device id
value = getSensorValue(sensor);
if (value != null) {
previous_value = getData("previous_value" + sensor);
previous_date = getData("previous_date" + sensor);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
date = sdf.format(Calendar.getInstance().getTime());
if (!value.equals(previous_value) || !date.equals(previous_date)) {
setData("previous_value" + sensor, value);
setData("previous_date" + sensor, date);
timestamp = getSensorTimestamp(sensor);
echo(value);
echo(timestamp);
try{
file = "temp_" + date + "." + sensor + ".txt";
FileWriter fw = new FileWriter(file, true);
BufferedWriter out = new BufferedWriter(fw);
out.write(value + "\t" + timestamp + "\r\n");
out.close();
} catch (Exception e) {
echo("Error: " + e.getMessage());
}
} else {
hideOutput();
}
}
import java.text.SimpleDateFormat;
sensor = "53"; // device id
value = getSensorValue(sensor);
if (value != null) {
previous_value = getData("previous_value" + sensor);
previous_date = getData("previous_date" + sensor);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
date = sdf.format(Calendar.getInstance().getTime());
if (!value.equals(previous_value) || !date.equals(previous_date)) {
setData("previous_value" + sensor, value);
setData("previous_date" + sensor, date);
timestamp = getSensorTimestamp(sensor);
echo(value);
echo(timestamp);
try{
file = "temp_" + date + "." + sensor + ".txt";
FileWriter fw = new FileWriter(file, true);
BufferedWriter out = new BufferedWriter(fw);
out.write(value + "\t" + timestamp + "\r\n");
out.close();
} catch (Exception e) {
echo("Error: " + e.getMessage());
}
} else {
hideOutput();
}
}
startTimer("save_temp", 30);

Jag fick det fungera en gång emn sedan loggas bara den första, ie 51
Alvnas1500
Posts: 14
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att logga sensordata

Post by Alvnas1500 »

Verkar vara givaren som funkar dåligt med att skicka data
hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Re: Tips: Att logga sensordata

Post by hekj »

Alvnas1500 wrote:Borde jag kunna lägga alla i samma save_temp.bsh fil

Code: Select all

    import java.text.SimpleDateFormat;
    sensor = "51";  // device id
    value = getSensorValue(sensor);
    if (value != null) {
       previous_value = getData("previous_value" + sensor);
       previous_date = getData("previous_date" + sensor);
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
       date = sdf.format(Calendar.getInstance().getTime());
       if (!value.equals(previous_value) || !date.equals(previous_date)) {
          setData("previous_value" + sensor, value);
          setData("previous_date" + sensor, date);
          timestamp = getSensorTimestamp(sensor);
          echo(value);
          echo(timestamp);
          try{
            file = "temp_" + date + "." + sensor + ".txt";
            FileWriter fw = new FileWriter(file, true);
            BufferedWriter out = new BufferedWriter(fw);
            out.write(value + "\t" + timestamp + "\r\n");
            out.close();
          } catch (Exception e) {
             echo("Error: " + e.getMessage());
          }
       } else {
          hideOutput();
       }
    }

Code: Select all

    import java.text.SimpleDateFormat;
    sensor = "52";  // device id
    value = getSensorValue(sensor);
    if (value != null) {
       previous_value = getData("previous_value" + sensor);
       previous_date = getData("previous_date" + sensor);
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
       date = sdf.format(Calendar.getInstance().getTime());
       if (!value.equals(previous_value) || !date.equals(previous_date)) {
          setData("previous_value" + sensor, value);
          setData("previous_date" + sensor, date);
          timestamp = getSensorTimestamp(sensor);
          echo(value);
          echo(timestamp);
          try{
            file = "temp_" + date + "." + sensor + ".txt";
            FileWriter fw = new FileWriter(file, true);
            BufferedWriter out = new BufferedWriter(fw);
            out.write(value + "\t" + timestamp + "\r\n");
            out.close();
          } catch (Exception e) {
             echo("Error: " + e.getMessage());
          }
       } else {
          hideOutput();
       }
    }

Code: Select all

    import java.text.SimpleDateFormat;
    sensor = "53";  // device id
    value = getSensorValue(sensor);
    if (value != null) {
       previous_value = getData("previous_value" + sensor);
       previous_date = getData("previous_date" + sensor);
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
       date = sdf.format(Calendar.getInstance().getTime());
       if (!value.equals(previous_value) || !date.equals(previous_date)) {
          setData("previous_value" + sensor, value);
          setData("previous_date" + sensor, date);
          timestamp = getSensorTimestamp(sensor);
          echo(value);
          echo(timestamp);
          try{
            file = "temp_" + date + "." + sensor + ".txt";
            FileWriter fw = new FileWriter(file, true);
            BufferedWriter out = new BufferedWriter(fw);
            out.write(value + "\t" + timestamp + "\r\n");
            out.close();
          } catch (Exception e) {
             echo("Error: " + e.getMessage());
          }
       } else {
          hideOutput();
       }
    }

Code: Select all

	 startTimer("save_temp", 30);
Jag fick det fungera en gång emn sedan loggas bara den första, ie 51
Har själv inte testat följande, men du kan väl prova om koden fungerar.

Code: Select all

import java.text.SimpleDateFormat;
String[] sensors = { "51", "52", "53" };  // device id
error = false;
for (int ndx = 0; ndx < sensors.length; ndx++) {
   sensor = sensors[ndx];
   value = getSensorValue(sensor);
   if (value != null) {
      previous_value = getData("previous_value" + sensor);
      previous_date = getData("previous_date" + sensor);
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      date = sdf.format(Calendar.getInstance().getTime());
      if (!value.equals(previous_value) || !date.equals(previous_date)) {
         setData("previous_value" + sensor, value);
         setData("previous_date" + sensor, date);
         timestamp = getSensorTimestamp(sensor);
         echo(value);
         echo(timestamp);
         try {
            file = "temp_" + date + "." + sensor + ".txt";
            FileWriter fw = new FileWriter(file, true);
            BufferedWriter out = new BufferedWriter(fw);
            out.write(value + "\t" + timestamp + "\r\n");
            out.close();
         } catch (Exception e) {
             error = true;
             echo("Error: " + e.getMessage());
         }
      }
   }
}
if (!error) {
   hideOutput();
}
startTimer("save_temp", 30);
hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Re: Tips: Att logga sensordata

Post by hekj »

Alvnas1500 wrote:Verkar vara givaren som funkar dåligt med att skicka data
Koden är skriven för att enbart logga vid förändring, aktivera "View - Raw Sensor Data (Console)" igen för att se hur ofta sensor data skickas.
tormm
Posts: 2
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att logga sensordata

Post by tormm »

Hei. Jeg kjører på Mac, men får ikke NexaHome til å kjøre disse scriptene (start.bsh og save_temp.bsh). Må jeg gjøre noe spesielt?
hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Re: Tips: Att logga sensordata

Post by hekj »

tormm wrote:Hei. Jeg kjører på Mac, men får ikke NexaHome til å kjøre disse scriptene (start.bsh og save_temp.bsh). Må jeg gjøre noe spesielt?
Det kan bero på var på disken du har valt att lägga NexaHome.jar, om du inte redan har NexaHome filerna i en katalog i ditt hembibliotek så kan du testa följande:

1) skapa biblioteket nexahome i din hemkatalog
2) flytta alla bsh filer samt NexaHome.* till nexahome biblioteket
3) skapa biblioteket nexahome/mywebserver samt flytta html och bildfiler dit.
4) hämta den senaste testversionen, http://nexahome.se/NexaHome_2.9.2.jar
5) starta NexaHome från ett terminalfönster, öppna programmet Terminal och skriv följande :

cd nexahome
java -jar NexaHome_2.9.2.jar -d

6) skriv in den nya sökvägen till websidorna under NexaHome Config (My Web Server Directory)

7) avsluta NexaHome och starta om programmet

Skrivs det ut något i terminalen?
tormm
Posts: 2
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att logga sensordata

Post by tormm »

Takk.

Skal forsøke dette. Men fant ut at scriptene ble kjørt. Grunne til at jeg ikke så noe var at det alltid endte ut i error " hideOutput();". Det fungerer fint nå.
Post Reply