Tips: Att logga sensordata

Moderators: hekj, Telldus

eijo
Posts: 26
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att logga sensordata

Post by eijo »

Hej,

Först av allt Nexahome är super, och hekj support är fantastisk! :clap:

Nåväl, nu nya utmaningar :)
Jag har haft tre Jenkinsbird tempsensorer och har loggat utan problem i många veckor nu. Funkar kanon!
Nu har jag köpt Clas Olssons sensor med temp och fuktmätning (med tanke att först övervaka sedan ev. styra luftavfuktaren i tvättstugan)

Mottagning och visning av värde funkar bra i TelldusCenter!

Jag har lagt till parameter rader i Nexahome:

model:temperaturehumidity;id:11;value:humidity
model:temperaturehumidity;id:11;value:temp

Temp och humidity kommer in riktigt och uppdateras i "sensor value kolumnen" i Nexahome

Min save_temp.bsh ser nu ut så här:

Code: Select all

import java.text.SimpleDateFormat;
String[] sensors = { "51","52","53","11","11" };  // 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());
        float dif = (previous_value != null ? Float.parseFloat(previous_value) - Float.parseFloat(values[ndx]) : 0);
        if (Math.abs(dif) > 3.0) {
			values[ndx] = previous_value;
        }	
		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);
Den fungerar, men jag får in luftfuktighet två gånger i logfilen, och temperaturen från Clas Ohlsson sensorn kommer inte in alls (kolumn 4,5):

2012-12-11 11:56 21,1 21,6 19,7 36 36
2012-12-11 12:03 21,1 21,6 19,8 36 36
2012-12-11 12:04 21,1 21,6 19,8 35 35
2012-12-11 12:16 21,1 21,6 19,8 36 36

Jag gissar att det har att göra med att sensor id är 11 i båda fallen.

Fråga 1:
Hur ska jag göra för att få in temperaturen i kolumn 4?

Fråga 2:
Jag har försökt fixa in fukt värdena i grafritningen också, men där finns någon rutin som gör om "," till "." och den gillar ju inte fuktvärden utan decimal... hur löser jag enklast det? Ska man lägga till decimal ",0" i save_temp?

TAck på förhand!
liverpoolarn
Posts: 65
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att logga sensordata

Post by liverpoolarn »

Id:t du anger (11) två gånger är väl id:t från sensorn... du ska ange id:t som du får (eller sätter) i NexaHome. Då kommer du säkert få rätt värden i din logfil oxå. Har du angett id 11 två gånger så funkar det inte.
hekj
Posts: 992
Joined: Fri Mar 17, 2023 9:45 am
Location: Stockholm
Contact:

Re: Tips: Att logga sensordata

Post by hekj »

liverpoolarn wrote:Id:t du anger (11) två gånger är väl id:t från sensorn... du ska ange id:t som du får (eller sätter) i NexaHome. Då kommer du säkert få rätt värden i din logfil oxå. Har du angett id 11 två gånger så funkar det inte.
Detta stämmer, eijo vad har du för device id på följande rader?
model:temperaturehumidity;id:11;value:humidity
model:temperaturehumidity;id:11;value:temp
eijo
Posts: 26
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att logga sensordata

Post by eijo »

Jag hade device Id 11 på båda raderna. Har ändrat det nu!
(Trodde Device ID skulle vara samma som id från TelldusCenter)

Nu funkar det!
Tack!
joneber
Posts: 3
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att logga sensordata

Post by joneber »

Hej,

Först och främst - tack för en riktigt smidig och bra applikation. Jag har installerat NexaHome tillsammans med ljussensorer och har all funktionalitet jag vill ha, förutom en sak som jag inte lyckas med...

I min gamla lösning hade jag temperaturvärdena i en MySQL databas och det vill jag ha även här - men har problemet att det inte skapas några loggar. Har följt anvisningarna i början av tråden och får in sensorerna (och värden) i NexaHome men det skapas aldrig några textfiler. Har ni möjlighet att se vad jag gjort för fel? Har skapat användaren 'nexahome' och applikationen ligger i hemmamappen där det skall vara fulla rättigheter. Hittar heller inget i loggar som skulle tyda på att det var skrivrättigheter som saknas så jag vet inte riktigt vad det kan vara. Har klistrat in lite data och skärmdumpar som jag tror kan vara av värde nedan.

Hjälp mottages tacksamt! :)

Edit: Jag testade att göra ett litet script för att se om det var problem med rättigheter men det verkar inte vara fallet, har aldrig pillat med Beanshell men hållt på lite mer Perl och motsvarande. Nedanstående genererar en fil med innehåll när jag exekverar skriptet genom NexaHome.

Code: Select all

nexahome@server:~$ cat testwrite.bsh
file = "temp_.txt";
FileWriter fw = new FileWriter(file, true);
BufferedWriter out = new BufferedWriter(fw);
out.write(file);
out.write("\r\n");
out.close();
/Jonas


nexahome@server:~$ ps aux | grep Nexa
nexahome 1708 0.5 18.0 1111164 185796 pts/0 Sl 07:06 0:32 /usr/bin/java -jar /home/nexahome/NexaHome_3.9.9.jar
nexahome@server:~$ ls -lsth
total 2.2M
12K -rw-r--r-- 1 nexahome nexahome 8.3K Jul 6 07:06 console.2015-07-06.log
4.0K -rw-r--r-- 1 nexahome nexahome 3.0K Jul 6 07:06 NexaHome.xml
...
4.0K -rw-r--r-- 1 nexahome nexahome 728 Jul 6 06:39 13.bsh
4.0K -rwxr-xr-x 1 nexahome nexahome 1.7K Jul 5 21:28 save_temp.bsh
4.0K -rwxr-xr-x 1 nexahome nexahome 29 Jul 5 21:22 start.bsh
2.2M -rw-r--r-- 1 nexahome nexahome 2.2M Feb 12 09:10 NexaHome_3.9.9.jar
Image

Code: Select all

nexahome@server:~$ cat start.bsh
startTimer("save_temp", 60);

Code: Select all

nexahome@server:~$ cat save_temp.bsh
import java.text.SimpleDateFormat;
String[] sensors = { "11", "12", "201" };  // 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);
rhis
Posts: 8
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att logga sensordata

Post by rhis »

en skillnad i min fil är att path anges

import java.text.SimpleDateFormat;
path = "/home/pi/nexahome/temp/";
och
file = path + "temp_" + date + ".txt";

rhis
joneber
Posts: 3
Joined: Fri Mar 17, 2023 9:45 am

Re: Tips: Att logga sensordata

Post by joneber »

Jag ändrade så att jag körde med sökvägen hårdkodad men verkar inte hjälpa det heller :(

Code: Select all

date = sdf.format(Calendar.getInstance().getTime())
...
file = "/home/nexahome/temp_" + date + ".txt";
Som jag nämnde ovan så testade jag att lägga upp ett eget script som bara skulle generera en fil när den kördes manuellt via NexaHome-GUI:t och det fungerade - så inga rättighetsproblem vad jag kan förstå...

Code: Select all

file = "temp_.txt";
FileWriter fw = new FileWriter(file, true);
BufferedWriter out = new BufferedWriter(fw);
out.write(file);
out.write("\r\n");
out.close();
Skulle vara guld värt att få det här att fungera för min del. Kan verkligen inte förstå vad det är som krånglar. Jag kör NexaHome_3.9.9.jar.


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

Re: Tips: Att logga sensordata

Post by hekj »

Testa att ta bort följande rader:
if (!error) {
hideOutput();
}
Samt ändra på följande:
String[] sensors = { "11", "12", "201" }; // device id
-->
String[] sensors = { "52", "53", "54" }; // device id
values[ndx] = getSensorValue(sensor);
-->
values[ndx] = getSensorValue(sensor);
echo("Sensor:" + sensor + ", Value:" + values[ndx]);
if (changed) {
-->
echo("Changed:" + changed);
if (changed) {
Post Reply