Tips: Drifttidsmätare

Moderators: hekj, Telldus

Post Reply
hekj
Posts: 988
Joined: Thu Jan 18, 2018 11:08 am
Location: Stockholm
Contact:

Tips: Drifttidsmätare

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

Den som vill veta hur länge en viss device har varit påslagen kan fixa detta genom att först skapa en fil som innehåller de enheters deviceid som man vill hålla koll på, därefter skapar man tre scripts.

C:/apps/nexahome/minute_meter.txt

Code: Select all

3=0
5=0
start.bsh

Code: Select all

startTimer(minute_meter, 60);
minute_meter.bsh

Code: Select all

import java.text.SimpleDateFormat;

scriptName = getScriptName();
timeout = 60;
sumFile = "C:/apps/nexahome/minute_meter.txt";
comment = "Devices has been turned on for x minutes.";

day_script = "minute_meter_today.bsh";
day_file_prefix = "C:/apps/nexahome/minute_meter.";
day_file_date_format = "yyyy-MM-dd";
day_file_suffix = ".txt";

Properties prop = new Properties();
InputStream is = null;
OutputStream os = null;

updated = false;

try {

  is = new FileInputStream(sumFile);
  prop.load(is);

  keys = prop.keys();
  while (keys.hasMoreElements()) {
    String id = (String)keys.nextElement();
    String value = prop.getProperty(id);
    long minutes = Long.parseLong(value);
    if (deviceIsOn(id)) {
      updated = true;
      minutes = minutes + 1;
      SimpleDateFormat sdf = new SimpleDateFormat(day_file_date_format);
      date = sdf.format(Calendar.getInstance().getTime());
      execFile(day_script);
      execParam(day_file_prefix + date + day_file_suffix);
      execParam(id);
    }
    prop.setProperty(id, Long.toString(minutes));
  }

  if (updated) {
    os = new FileOutputStream(sumFile);
    prop.store(os, comment);
  }

  startTimer(scriptName, timeout);
  hideOutput();

} catch (IOException ioe) {
  echo(ioe.getMessage());
} finally {
  if (is != null) {
    try {
      is.close();
    } catch (IOException ioe) {
      echo(ioe.getMessage());
    }
  }
  if (os != null) {
    try {
      os.close();
    } catch (IOException ioe) {
      echo(ioe.getMessage());
    }
  }
}
minute_meter_today.bsh

Code: Select all

dayFile = "";
id = "";

comment = "Devices has been turned on for x minutes today.";
scriptName = getScriptName();

params = getParams(scriptName);
if (params != null) {
  var len = Integer.parseInt(params);
  if (len >= 2) {
    dayFile = getParam(scriptName, 1);  // first
    id = getParam(scriptName, 2); // second
  }
}

if (dayFile != null && dayFile.length() != 0 && id != null && id.length() != 0) {
  InputStream is = null;
  OutputStream os = null;

  try {

    updated = false;
    Properties prop = new Properties();

    File f = new File(dayFile);
    if (f.exists()) {
      is = new FileInputStream(f);
      prop.load(is);
    }

    String value = prop.getProperty(id);
    if (value == null) {
      value = "0";
    }
    long minutes = Long.parseLong(value);
    if (deviceIsOn(id)) {
        updated = true;
        minutes = minutes + 1;
    }
    prop.setProperty(id, Long.toString(minutes));

    if (updated) {
      os = new FileOutputStream(f);
      prop.store(os, comment);
    }
  
    hideOutput();

  } catch (IOException ioe) {
    echo(ioe.getMessage());
  } finally {
    if (is != null) {
      try {
        is.close();
      } catch (IOException ioe) {
        echo(ioe.getMessage());
      }
    }
    if (os != null) {
      try {
        os.close();
      } catch (IOException ioe) {
        echo(ioe.getMessage());
      }
    }
  }
}
Ovanstående script använder sig av metoderna getScriptName(), getParams() samt getParam() som finns i version 4.1.10 och senare.

Updaterad: 2017-02-21

Leffe
Posts: 80
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Drifttidsmätare

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

Ja det är ju helt strålande !!!
Klockren funktion , som jag länge önskat
Tack igen för ett strålande program :D :D

Silversurfaren
Posts: 9
Joined: Thu Jan 18, 2018 11:08 am
Location: Linköping

Re: Tips: Drifttidsmätare

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

Trevlig funktion men lite synd att att en återstart av timern varje minut resulterar i ett entry i Console-loggen vilket gör att den snabbt känns 'översvämmad'. Jag upplever att i, åtminstone, detta fallet skulle det vara trevligt att kunna utesluta drifttidsmätningen...

Finns det något sätt att kanske kunna filtrera vad man vill ska gå in i Console-loggen?

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

Re: Tips: Drifttidsmätare

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

Silversurfaren wrote:Trevlig funktion men lite synd att att en återstart av timern varje minut resulterar i ett entry i Console-loggen vilket gör att den snabbt känns 'översvämmad'. Jag upplever att i, åtminstone, detta fallet skulle det vara trevligt att kunna utesluta drifttidsmätningen...

Finns det något sätt att kanske kunna filtrera vad man vill ska gå in i Console-loggen?
Lägg in följande rad.

Code: Select all

hideOutput();

Silversurfaren
Posts: 9
Joined: Thu Jan 18, 2018 11:08 am
Location: Linköping

Re: Tips: Drifttidsmätare

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

Precis vad jag sökte, det var ju nästan för enkelt... :)

Tack!

Leffe
Posts: 80
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Drifttidsmätare

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

Hej Igen
som jag sagt tidigare en fantastisk funktion , men skulle det på något sätt gå att få en fil för varje dygn ?? . det vore ju pricken över I :D :D

Silversurfaren
Posts: 9
Joined: Thu Jan 18, 2018 11:08 am
Location: Linköping

Re: Tips: Drifttidsmätare

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

Leffe wrote:Hej Igen
som jag sagt tidigare en fantastisk funktion , men skulle det på något sätt gå att få en fil för varje dygn ?? . det vore ju pricken över I :D :D
Går att lösa, jag ville också ha en fil/dygn och lät ett shell-script och crontab hantera det hela.

Leffe
Posts: 80
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Drifttidsmätare

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

Silversurfaren wrote:
Leffe wrote:Hej Igen
som jag sagt tidigare en fantastisk funktion , men skulle det på något sätt gå att få en fil för varje dygn ?? . det vore ju pricken över I :D :D
Går att lösa, jag ville också ha en fil/dygn och lät ett shell-script och crontab hantera det hela.
Hej låter ju bra,är det något du vill dela med oss som inte är så kunniga att skapa script mm :D

Silversurfaren
Posts: 9
Joined: Thu Jan 18, 2018 11:08 am
Location: Linköping

Re: Tips: Drifttidsmätare

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

Det finns många sätt att göra de på och min lösning är enkel och byter bara namn på min minuteMeter.txt och lägger datum (DATE) till filnamnet och kopierar sedan en tom fil där enheterna finns angivna (minuteMeter.base) till den fil som funktionen sedan forsatt skriver till (minuteMeter.txt).

scriptet ser ut så här:
#!/bin/bash

DATE=$(date +"%Y-%m-%d_%H:%M:%S")

# Move latest minuteMeter.txt and rename
sudo mv /home/pi/minuteMeter.txt /home/pi/minuteMeter-$DATE.txt

# New empty file
cp /home/pi/minuteMeter.base /home/pi/minuteMeter.txt

-----------------------------
Sedan anropar jag det här scriptet kl.12 varje dag med hjälp av crontab:

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
00 12 * * * /home/pi/minuteMeterLog.sh

Leffe
Posts: 80
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Drifttidsmätare

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

Silversurfaren wrote:Det finns många sätt att göra de på och min lösning är enkel och byter bara namn på min minuteMeter.txt och lägger datum (DATE) till filnamnet och kopierar sedan en tom fil där enheterna finns angivna (minuteMeter.base) till den fil som funktionen sedan forsatt skriver till (minuteMeter.txt).

scriptet ser ut så här:
#!/bin/bash

DATE=$(date +"%Y-%m-%d_%H:%M:%S")

# Move latest minuteMeter.txt and rename
sudo mv /home/pi/minuteMeter.txt /home/pi/minuteMeter-$DATE.txt

# New empty file
cp /home/pi/minuteMeter.base /home/pi/minuteMeter.txt
k
Hej och tack men jag ser nu att du kör på en RPI , så jag får fortsätta att hoppas på att "hekj " vill och orkar förbarma sej över en lösning :D :D :D :D
-----------------------------
Sedan anropar jag det här scriptet kl.12 varje dag med hjälp av crontab:

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
00 12 * * * /home/pi/minuteMeterLog.sh

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

Re: Tips: Drifttidsmätare

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

Har uppdaterat första inlägget!

Observera att en ny version av NexaHome måste användas.

Pee
Posts: 32
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Drifttidsmätare

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

Jag har provat den första 'utgåvan' utan problem men när jag provar den uppdaterade versionen men får felmeddelande i konsolen.

Code: Select all

2017-02-26 10:37:02 There was an error in evaluating the script (minute_meter.bsh): Parse error at line 41, column 3.  Encountered: if
2017-02-26 10:37:02   if (updated) {
Jag kör på en pi och har ändrat C:/apps/ till /home/pi/ på 2 ställen i minute_meter.bsh samt uppdaterat NexaHome till ver. 4.10.

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

Re: Tips: Drifttidsmätare

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

Pee wrote:Jag har provat den första 'utgåvan' utan problem men när jag provar den uppdaterade versionen men får felmeddelande i konsolen.

Code: Select all

2017-02-26 10:37:02 There was an error in evaluating the script (minute_meter.bsh): Parse error at line 41, column 3.  Encountered: if
2017-02-26 10:37:02   if (updated) {
Jag kör på en pi och har ändrat C:/apps/ till /home/pi/ på 2 ställen i minute_meter.bsh samt uppdaterat NexaHome till ver. 4.10.
Konstigt... jag har nu gjort som du skriver, dvs kopierat scriptet till min pi samt ändrat på två ställen och det funkar där!

Pee
Posts: 32
Joined: Thu Jan 18, 2018 11:08 am

Re: Tips: Drifttidsmätare

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

Jag gjorde om kopieringen och nu funkar det. :oops: Det var säkert nåt skräp som följde med. :?
Hur som helst, tack för svaret! :wave:

Hur kan man läsa ut värdena i filerna så att man kan t.ex. visa dem på en webbsida, eller lägga in dem i en sträng?

Post Reply